diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 98f48bee71..c2415793d4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -100,6 +100,7 @@ jobs:
npx yalc add @eclipse-sirius/sirius-components-portals
npx yalc add @eclipse-sirius/sirius-components-widget-reference
npx yalc add @eclipse-sirius/sirius-components-selection
+ npx yalc add @eclipse-sirius/sirius-components-tables
npx yalc add @eclipse-sirius/sirius-components-trees
npx yalc add @eclipse-sirius/sirius-components-validation
npx yalc add @eclipse-sirius/sirius-web-application
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 9246948191..e4c0b08f4a 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -46,6 +46,7 @@ This allows an error to be displayed when there is a problem during uploading
- https://github.com/eclipse-sirius/sirius-web/issues/3846[#3846] [core] Migrate the frontend to `react 18.3.1`, `react-dom 18.3.1`, `react-router-dom 6.26.0`, `@xstate/react: 3.0.0` and `@ObeoNetwork/gantt-task-react 0.6.0`
- https://github.com/eclipse-sirius/sirius-web/issues/3840[#3840] [diagram] Migrate to ReactFlow 12
- [releng] Switch to the final release version of AQL 8.0.2
+- https://github.com/eclipse-sirius/sirius-web/issues/3823[#3823] [table] Add a dependency to `material-react-table "2.13.3"` and `export-to-csv "1.3.0"`
=== Bug fixes
@@ -78,6 +79,7 @@ description (optional).
** updateProject (`PUT /projects/{projectId}`): Update the project with the given id (projectId).
- https://github.com/eclipse-sirius/sirius-web/issues/3873[#3873] [diagram] Make the Selection Dialog available for the EdgeTool
- https://github.com/eclipse-sirius/sirius-web/issues/3950[#3950] [diagram] Have the multiple selection on the Selection Dialog
+- https://github.com/eclipse-sirius/sirius-web/issues/3823[#3823] [form][table] Add table widget in form.
=== Improvements
@@ -113,7 +115,7 @@ This will allow specifier to create images that fir perfectly in the project tem
- https://github.com/eclipse-sirius/sirius-web/issues/3816[#3816] [form] Make EMF default form support Integer null value
- https://github.com/eclipse-sirius/sirius-web/issues/3826[#3826] [form] Make EMF default form support attributes with a date
- https://github.com/eclipse-sirius/sirius-web/issues/2163[#2163] [form] Make EMF default form support non changeable features
-- https://github.com/eclipse-sirius/sirius-web/issues/4086[#4086] [form] Wrap widget returned by property section in a div with a specific classname
+- https://github.com/eclipse-sirius/sirius-web/issues/4086[#4086] [form] Wrap widget returned by property section in a div with a specific classname
== v2024.9.0
diff --git a/package-lock.json b/package-lock.json
index 78f7968b61..eaabd14225 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -310,9 +310,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz",
- "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==",
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -422,6 +422,10 @@
"resolved": "packages/tools/frontend/sirius-components-specification-layout",
"link": true
},
+ "node_modules/@eclipse-sirius/sirius-components-tables": {
+ "resolved": "packages/tables/frontend/sirius-components-tables",
+ "link": true
+ },
"node_modules/@eclipse-sirius/sirius-components-trees": {
"resolved": "packages/trees/frontend/sirius-components-trees",
"link": true
@@ -490,7 +494,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz",
"integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==",
- "devOptional": true,
"peer": true,
"dependencies": {
"@emotion/memoize": "^0.9.0"
@@ -546,7 +549,6 @@
"version": "11.13.0",
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz",
"integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==",
- "devOptional": true,
"peer": true,
"dependencies": {
"@babel/runtime": "^7.18.3",
@@ -1679,6 +1681,92 @@
}
}
},
+ "node_modules/@mui/x-date-pickers": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz",
+ "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.25.6",
+ "@mui/utils": "^5.16.6",
+ "@mui/x-internals": "7.18.0",
+ "@types/react-transition-group": "^4.4.11",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.9.0",
+ "@emotion/styled": "^11.8.1",
+ "@mui/material": "^5.15.14 || ^6.0.0",
+ "@mui/system": "^5.15.14 || ^6.0.0",
+ "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0",
+ "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0",
+ "dayjs": "^1.10.7",
+ "luxon": "^3.0.2",
+ "moment": "^2.29.4",
+ "moment-hijri": "^2.1.2",
+ "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "date-fns": {
+ "optional": true
+ },
+ "date-fns-jalali": {
+ "optional": true
+ },
+ "dayjs": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ },
+ "moment": {
+ "optional": true
+ },
+ "moment-hijri": {
+ "optional": true
+ },
+ "moment-jalaali": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/x-internals": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz",
+ "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.25.6",
+ "@mui/utils": "^5.16.6"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0"
+ }
+ },
"node_modules/@mui/x-tree-view": {
"version": "7.6.1",
"resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.6.1.tgz",
@@ -1995,6 +2083,77 @@
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
+ "node_modules/@tanstack/match-sorter-utils": {
+ "version": "8.19.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz",
+ "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==",
+ "dependencies": {
+ "remove-accents": "0.5.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-table": {
+ "version": "8.20.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz",
+ "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==",
+ "dependencies": {
+ "@tanstack/table-core": "8.20.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/@tanstack/react-virtual": {
+ "version": "3.10.6",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz",
+ "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==",
+ "dependencies": {
+ "@tanstack/virtual-core": "3.10.6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@tanstack/table-core": {
+ "version": "8.20.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz",
+ "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/virtual-core": {
+ "version": "3.10.6",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz",
+ "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@testing-library/dom": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
@@ -4467,6 +4626,14 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
+ "node_modules/export-to-csv": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/export-to-csv/-/export-to-csv-1.3.0.tgz",
+ "integrity": "sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA==",
+ "engines": {
+ "node": "^v12.20.0 || >=v14.13.0"
+ }
+ },
"node_modules/fast-equals": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz",
@@ -4749,6 +4916,15 @@
"resolved": "https://registry.npmjs.org/heap/-/heap-0.2.5.tgz",
"integrity": "sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg=="
},
+ "node_modules/highlight-words": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz",
+ "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==",
+ "engines": {
+ "node": ">= 16",
+ "npm": ">= 8"
+ }
+ },
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -5614,6 +5790,33 @@
"node": ">=10"
}
},
+ "node_modules/material-react-table": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz",
+ "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==",
+ "dependencies": {
+ "@tanstack/match-sorter-utils": "8.19.4",
+ "@tanstack/react-table": "8.20.5",
+ "@tanstack/react-virtual": "3.10.6",
+ "highlight-words": "1.2.2"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kevinvandy"
+ },
+ "peerDependencies": {
+ "@emotion/react": ">=11.11",
+ "@emotion/styled": ">=11.11",
+ "@mui/icons-material": ">=5.11",
+ "@mui/material": ">=5.13",
+ "@mui/x-date-pickers": ">=6.15.0",
+ "react": ">=17.0",
+ "react-dom": ">=17.0"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -6444,6 +6647,11 @@
}
}
},
+ "node_modules/remove-accents": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+ "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
+ },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -7945,6 +8153,7 @@
"@apollo/client": "3.10.4",
"@eclipse-sirius/sirius-components-charts": "*",
"@eclipse-sirius/sirius-components-core": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-tsconfig": "*",
"@lexical/react": "0.8.1",
"@mui/icons-material": "5.15.19",
@@ -7973,6 +8182,7 @@
"@apollo/client": "3.10.4",
"@eclipse-sirius/sirius-components-charts": "*",
"@eclipse-sirius/sirius-components-core": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@lexical/react": "0.8.1",
"@mui/icons-material": "5.15.19",
"@mui/material": "5.15.19",
@@ -8176,6 +8386,7 @@
"@eclipse-sirius/sirius-components-gantt": "*",
"@eclipse-sirius/sirius-components-portals": "*",
"@eclipse-sirius/sirius-components-selection": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-trees": "*",
"@eclipse-sirius/sirius-components-validation": "*",
"@eclipse-sirius/sirius-components-widget-reference": "*",
@@ -8189,9 +8400,11 @@
"@xyflow/react": "12.2.1",
"d3": "7.0.0",
"elkjs": "0.8.2",
+ "export-to-csv": "1.3.0",
"fontsource-roboto": "4.0.0",
"graphql": "16.8.1",
"html-to-image": "1.11.11",
+ "material-react-table": "2.13.3",
"notistack": "3.0.1",
"pathfinding": "0.4.18",
"prop-types": "15.8.1",
@@ -8233,6 +8446,7 @@
"@eclipse-sirius/sirius-components-forms": "*",
"@eclipse-sirius/sirius-components-gantt": "*",
"@eclipse-sirius/sirius-components-portals": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-trees": "*",
"@eclipse-sirius/sirius-components-tsconfig": "*",
"@eclipse-sirius/sirius-components-validation": "*",
@@ -8240,6 +8454,7 @@
"@types/react": "18.3.3",
"@vitejs/plugin-react": "4.3.0",
"@xstate/react": "3.0.0",
+ "export-to-csv": "1.3.0",
"graphql": "16.8.1",
"jest-junit-reporter": "1.1.0",
"prettier": "2.7.1",
@@ -8262,6 +8477,7 @@
"@eclipse-sirius/sirius-components-gantt": "*",
"@eclipse-sirius/sirius-components-portals": "*",
"@eclipse-sirius/sirius-components-selection": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-trees": "*",
"@eclipse-sirius/sirius-components-validation": "*",
"@eclipse-sirius/sirius-components-widget-reference": "*",
@@ -8269,7 +8485,9 @@
"@mui/material": "5.15.19",
"@xstate/react": "3.0.0",
"@xyflow/react": "12.2.1",
+ "export-to-csv": "1.3.0",
"graphql": "16.8.1",
+ "material-react-table": "2.13.3",
"notistack": "3.0.1",
"react": "18.3.1",
"react-dom": "18.3.1",
@@ -8336,6 +8554,43 @@
"xstate": "4.32.1"
}
},
+ "packages/tables/frontend/sirius-components-tables": {
+ "version": "2024.9.8",
+ "license": "EPL-2.0",
+ "devDependencies": {
+ "@apollo/client": "3.10.4",
+ "@eclipse-sirius/sirius-components-core": "*",
+ "@eclipse-sirius/sirius-components-tsconfig": "*",
+ "@mui/icons-material": "5.15.19",
+ "@mui/material": "5.15.19",
+ "@types/react": "18.3.3",
+ "@vitejs/plugin-react": "4.3.0",
+ "@vitest/coverage-v8": "1.6.0",
+ "export-to-csv": "1.3.0",
+ "graphql": "16.8.1",
+ "jsdom": "16.7.0",
+ "material-react-table": "2.13.3",
+ "prettier": "2.7.1",
+ "react": "18.3.1",
+ "react-dom": "18.3.1",
+ "rollup-plugin-peer-deps-external": "2.2.4",
+ "tss-react": "4.9.7",
+ "typescript": "5.4.5",
+ "vite": "5.2.11"
+ },
+ "peerDependencies": {
+ "@apollo/client": "3.10.4",
+ "@eclipse-sirius/sirius-components-core": "*",
+ "@mui/icons-material": "5.15.19",
+ "@mui/material": "5.15.19",
+ "export-to-csv": "1.3.0",
+ "graphql": "16.8.1",
+ "material-react-table": "2.13.3",
+ "react": "18.3.1",
+ "react-dom": "18.3.1",
+ "tss-react": "4.9.7"
+ }
+ },
"packages/tools/frontend/sirius-components-specification-layout": {
"name": "@eclipse-sirius/sirius-components-specification-layout",
"version": "2024.9.8",
@@ -8634,9 +8889,9 @@
}
},
"@babel/runtime": {
- "version": "7.25.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz",
- "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==",
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"requires": {
"regenerator-runtime": "^0.14.0"
}
@@ -8862,6 +9117,7 @@
"@apollo/client": "3.10.4",
"@eclipse-sirius/sirius-components-charts": "*",
"@eclipse-sirius/sirius-components-core": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-tsconfig": "*",
"@lexical/react": "0.8.1",
"@mui/icons-material": "5.15.19",
@@ -8975,6 +9231,30 @@
"vite": "5.2.11"
}
},
+ "@eclipse-sirius/sirius-components-tables": {
+ "version": "file:packages/tables/frontend/sirius-components-tables",
+ "requires": {
+ "@apollo/client": "3.10.4",
+ "@eclipse-sirius/sirius-components-core": "*",
+ "@eclipse-sirius/sirius-components-tsconfig": "*",
+ "@mui/icons-material": "5.15.19",
+ "@mui/material": "5.15.19",
+ "@types/react": "18.3.3",
+ "@vitejs/plugin-react": "4.3.0",
+ "@vitest/coverage-v8": "1.6.0",
+ "export-to-csv": "1.3.0",
+ "graphql": "16.8.1",
+ "jsdom": "16.7.0",
+ "material-react-table": "2.13.3",
+ "prettier": "2.7.1",
+ "react": "18.3.1",
+ "react-dom": "18.3.1",
+ "rollup-plugin-peer-deps-external": "2.2.4",
+ "tss-react": "4.9.7",
+ "typescript": "5.4.5",
+ "vite": "5.2.11"
+ }
+ },
"@eclipse-sirius/sirius-components-trees": {
"version": "file:packages/trees/frontend/sirius-components-trees",
"requires": {
@@ -9068,6 +9348,7 @@
"@eclipse-sirius/sirius-components-gantt": "*",
"@eclipse-sirius/sirius-components-portals": "*",
"@eclipse-sirius/sirius-components-selection": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-trees": "*",
"@eclipse-sirius/sirius-components-validation": "*",
"@eclipse-sirius/sirius-components-widget-reference": "*",
@@ -9091,10 +9372,12 @@
"@xyflow/react": "12.2.1",
"d3": "7.0.0",
"elkjs": "0.8.2",
+ "export-to-csv": "1.3.0",
"fontsource-roboto": "4.0.0",
"graphql": "16.8.1",
"html-to-image": "1.11.11",
"jest-junit-reporter": "1.1.0",
+ "material-react-table": "2.13.3",
"notistack": "3.0.1",
"pathfinding": "0.4.18",
"prettier": "2.7.1",
@@ -9121,6 +9404,7 @@
"@eclipse-sirius/sirius-components-forms": "*",
"@eclipse-sirius/sirius-components-gantt": "*",
"@eclipse-sirius/sirius-components-portals": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-trees": "*",
"@eclipse-sirius/sirius-components-tsconfig": "*",
"@eclipse-sirius/sirius-components-validation": "*",
@@ -9128,6 +9412,7 @@
"@types/react": "18.3.3",
"@vitejs/plugin-react": "4.3.0",
"@xstate/react": "3.0.0",
+ "export-to-csv": "1.3.0",
"graphql": "16.8.1",
"jest-junit-reporter": "1.1.0",
"prettier": "2.7.1",
@@ -9213,7 +9498,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz",
"integrity": "sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==",
- "devOptional": true,
"peer": true,
"requires": {
"@emotion/memoize": "^0.9.0"
@@ -9261,7 +9545,6 @@
"version": "11.13.0",
"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz",
"integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==",
- "devOptional": true,
"peer": true,
"requires": {
"@babel/runtime": "^7.18.3",
@@ -9919,6 +10202,31 @@
"react-is": "^18.3.1"
}
},
+ "@mui/x-date-pickers": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz",
+ "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==",
+ "peer": true,
+ "requires": {
+ "@babel/runtime": "^7.25.6",
+ "@mui/utils": "^5.16.6",
+ "@mui/x-internals": "7.18.0",
+ "@types/react-transition-group": "^4.4.11",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ }
+ },
+ "@mui/x-internals": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz",
+ "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==",
+ "peer": true,
+ "requires": {
+ "@babel/runtime": "^7.25.6",
+ "@mui/utils": "^5.16.6"
+ }
+ },
"@mui/x-tree-view": {
"version": "7.6.1",
"resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.6.1.tgz",
@@ -10102,6 +10410,40 @@
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
+ "@tanstack/match-sorter-utils": {
+ "version": "8.19.4",
+ "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz",
+ "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==",
+ "requires": {
+ "remove-accents": "0.5.0"
+ }
+ },
+ "@tanstack/react-table": {
+ "version": "8.20.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz",
+ "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==",
+ "requires": {
+ "@tanstack/table-core": "8.20.5"
+ }
+ },
+ "@tanstack/react-virtual": {
+ "version": "3.10.6",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz",
+ "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==",
+ "requires": {
+ "@tanstack/virtual-core": "3.10.6"
+ }
+ },
+ "@tanstack/table-core": {
+ "version": "8.20.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz",
+ "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg=="
+ },
+ "@tanstack/virtual-core": {
+ "version": "3.10.6",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz",
+ "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw=="
+ },
"@testing-library/dom": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
@@ -12056,6 +12398,11 @@
"strip-final-newline": "^3.0.0"
}
},
+ "export-to-csv": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/export-to-csv/-/export-to-csv-1.3.0.tgz",
+ "integrity": "sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA=="
+ },
"fast-equals": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz",
@@ -12249,6 +12596,11 @@
"resolved": "https://registry.npmjs.org/heap/-/heap-0.2.5.tgz",
"integrity": "sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg=="
},
+ "highlight-words": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz",
+ "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ=="
+ },
"hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -12881,6 +13233,17 @@
}
}
},
+ "material-react-table": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz",
+ "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==",
+ "requires": {
+ "@tanstack/match-sorter-utils": "8.19.4",
+ "@tanstack/react-table": "8.20.5",
+ "@tanstack/react-virtual": "3.10.6",
+ "highlight-words": "1.2.2"
+ }
+ },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -13471,6 +13834,11 @@
"integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==",
"requires": {}
},
+ "remove-accents": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+ "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
+ },
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json
index 35e7df747d..5f2cd0ffdd 100644
--- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json
+++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json
@@ -36,11 +36,14 @@
"@eclipse-sirius/sirius-components-core": "*",
"@eclipse-sirius/sirius-components-charts": "*",
"@eclipse-sirius/sirius-components-forms": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@mui/icons-material": "5.15.19",
"@mui/material": "5.15.19",
"@mui/x-tree-view": "7.6.1",
"@xstate/react": "3.0.0",
+ "export-to-csv": "1.3.0",
"graphql": "16.8.1",
+ "material-react-table": "2.13.3",
"react": "18.3.1",
"react-dom": "18.3.1",
"tss-react": "4.9.7",
@@ -51,6 +54,7 @@
"@eclipse-sirius/sirius-components-core": "*",
"@eclipse-sirius/sirius-components-charts": "*",
"@eclipse-sirius/sirius-components-forms": "*",
+ "@eclipse-sirius/sirius-components-tables": "*",
"@eclipse-sirius/sirius-components-tsconfig": "*",
"@mui/icons-material": "5.15.19",
"@mui/material": "5.15.19",
@@ -61,7 +65,9 @@
"@vitejs/plugin-react": "4.3.0",
"@xstate/react": "3.0.0",
"@vitest/coverage-v8": "1.6.0",
+ "export-to-csv": "1.3.0",
"graphql": "16.8.1",
+ "material-react-table": "2.13.3",
"prettier": "2.7.1",
"rollup-plugin-peer-deps-external": "2.2.4",
"react": "18.3.1",
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/pom.xml b/packages/forms/backend/sirius-components-collaborative-forms/pom.xml
index 727039efaf..a9a4c9a5c5 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/pom.xml
+++ b/packages/forms/backend/sirius-components-collaborative-forms/pom.xml
@@ -63,6 +63,11 @@
sirius-components-collaborative-charts
2024.9.8
+
+ org.eclipse.sirius
+ sirius-components-collaborative-tables
+ 2024.9.8
+
org.eclipse.sirius
sirius-components-tests
@@ -94,7 +99,8 @@
maven-checkstyle-plugin
3.4.0
- ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml
+
+ ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml
true
true
true
@@ -142,4 +148,4 @@
-
+
\ No newline at end of file
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java
index c8c3768f79..f5ce861d18 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java
@@ -23,7 +23,6 @@
import org.eclipse.sirius.components.collaborative.api.IRepresentationRefreshPolicyRegistry;
import org.eclipse.sirius.components.collaborative.api.IRepresentationSearchService;
import org.eclipse.sirius.components.collaborative.api.ISubscriptionManager;
-import org.eclipse.sirius.components.collaborative.dto.RenameRepresentationInput;
import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor;
@@ -31,23 +30,29 @@
import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration;
import org.eclipse.sirius.components.collaborative.forms.dto.FormRefreshedEventPayload;
-import org.eclipse.sirius.components.collaborative.forms.dto.RenameFormInput;
import org.eclipse.sirius.components.collaborative.forms.variables.FormVariableProvider;
+import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler;
+import org.eclipse.sirius.components.collaborative.tables.api.ITableInput;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IInput;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
+import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
import org.eclipse.sirius.components.core.api.IRepresentationInput;
import org.eclipse.sirius.components.forms.Form;
+import org.eclipse.sirius.components.forms.TableWidget;
import org.eclipse.sirius.components.forms.components.FormComponent;
import org.eclipse.sirius.components.forms.components.FormComponentProps;
import org.eclipse.sirius.components.forms.description.FormDescription;
+import org.eclipse.sirius.components.forms.description.TableWidgetDescription;
import org.eclipse.sirius.components.forms.renderer.FormRenderer;
import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor;
import org.eclipse.sirius.components.representations.Element;
import org.eclipse.sirius.components.representations.GetOrCreateRandomIdProvider;
import org.eclipse.sirius.components.representations.IRepresentation;
import org.eclipse.sirius.components.representations.VariableManager;
+import org.eclipse.sirius.components.tables.Table;
+import org.eclipse.sirius.components.tables.descriptions.TableDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,10 +83,14 @@ public class FormEventProcessor implements IFormEventProcessor {
private final List formEventHandlers;
+ private final List tableEventHandlers;
+
private final ISubscriptionManager subscriptionManager;
private final IRepresentationSearchService representationSearchService;
+ private final IRepresentationDescriptionSearchService representationDescriptionSearchService;
+
private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry;
private final Many sink = Sinks.many().multicast().directBestEffort();
@@ -95,6 +104,7 @@ public class FormEventProcessor implements IFormEventProcessor {
public FormEventProcessor(FormEventProcessorConfiguration configuration,
ISubscriptionManager subscriptionManager,
IRepresentationSearchService representationSearchService,
+ IRepresentationDescriptionSearchService representationDescriptionSearchService,
IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry, IFormPostProcessor formPostProcessor) {
this.logger.trace("Creating the form event processor {}", configuration.formCreationParameters().getId());
this.editingContext = Objects.requireNonNull(configuration.editingContext());
@@ -103,9 +113,11 @@ public FormEventProcessor(FormEventProcessorConfiguration configuration,
this.widgetDescriptors = Objects.requireNonNull(configuration.widgetDescriptors());
this.formEventHandlers = Objects.requireNonNull(configuration.formEventHandlers());
this.representationSearchService = Objects.requireNonNull(representationSearchService);
+ this.representationDescriptionSearchService = Objects.requireNonNull(representationDescriptionSearchService);
this.subscriptionManager = Objects.requireNonNull(subscriptionManager);
this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry);
this.formPostProcessor = Objects.requireNonNull(formPostProcessor);
+ this.tableEventHandlers = Objects.requireNonNull(configuration.tableEventHandlers());
this.variableManager = this.initializeVariableManager(this.formCreationParameters);
@@ -145,12 +157,7 @@ public ISubscriptionManager getSubscriptionManager() {
@Override
public void handle(One payloadSink, Many changeDescriptionSink, IRepresentationInput representationInput) {
- IRepresentationInput effectiveInput = representationInput;
- if (representationInput instanceof RenameRepresentationInput renameRepresentationInput) {
- effectiveInput = new RenameFormInput(renameRepresentationInput.id(), renameRepresentationInput.editingContextId(), renameRepresentationInput.representationId(),
- renameRepresentationInput.newLabel());
- }
- if (effectiveInput instanceof IFormInput formInput) {
+ if (representationInput instanceof IFormInput formInput) {
Optional optionalFormEventHandler = this.formEventHandlers.stream().filter(handler -> handler.canHandle(formInput)).findFirst();
@@ -160,9 +167,63 @@ public void handle(One payloadSink, Many changeDesc
} else {
this.logger.warn("No handler found for event: {}", formInput);
}
+ } else if (representationInput instanceof ITableInput tableInput) {
+
+ Optional optionalTableEventHandler = this.tableEventHandlers.stream().filter(handler -> handler.canHandle(tableInput)).findFirst();
+
+ if (optionalTableEventHandler.isPresent()) {
+ ITableEventHandler tableEventHandler = optionalTableEventHandler.get();
+ Optional tableOptional = getTable(currentForm.get(), tableInput.getTableId());
+ if (tableOptional.isPresent()) {
+ Optional tableDescriptionOptional = getTableDescription(currentForm.get().getDescriptionId(), tableOptional.get().getDescriptionId());
+ if (tableDescriptionOptional.isPresent()) {
+ tableEventHandler.handle(payloadSink, changeDescriptionSink, this.editingContext, tableOptional.get(), tableDescriptionOptional.get(), tableInput);
+ } else {
+ this.logger.warn("No table description found for event: {}", tableInput);
+ }
+ } else {
+ this.logger.warn("No table found for event: {}", tableInput);
+ }
+ } else {
+ this.logger.warn("No handler found for event: {}", tableInput);
+ }
}
}
+ private Optional getTable(Form form, String tableId) {
+ return form.getPages().stream()
+ .flatMap(page -> page.getGroups().stream())
+ .flatMap(group -> group.getWidgets().stream())
+ .filter(TableWidget.class::isInstance)
+ .map(TableWidget.class::cast)
+ .map(TableWidget::getTable)
+ .filter(table -> tableId.equals(table.getId()))
+ .findFirst();
+ }
+
+ private Optional getTableDescription(String formDescriptionId, String tableDescriptionId) {
+ return this.representationDescriptionSearchService
+ .findById(editingContext, formDescriptionId)
+ .filter(FormDescription.class::isInstance)
+ .map(FormDescription.class::cast)
+ .stream()
+ .flatMap(form -> form.getPageDescriptions().stream())
+ .flatMap(page -> page.getGroupDescriptions().stream())
+ .flatMap(group -> group.getControlDescriptions().stream())
+ .filter(TableWidgetDescription.class::isInstance)
+ .map(TableWidgetDescription.class::cast)
+ .map(TableWidgetDescription::getTableDescription)
+ .filter(tableDescription -> tableDescriptionId.equals(tableDescription.getId()))
+ .findFirst();
+ }
+
+ private Optional findFormDescription(String formDescriptionId) {
+ return this.representationDescriptionSearchService
+ .findById(editingContext, formDescriptionId)
+ .filter(FormDescription.class::isInstance)
+ .map(FormDescription.class::cast);
+ }
+
@Override
public void refresh(ChangeDescription changeDescription) {
if (this.shouldReload(changeDescription)) {
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java
index 9006e0395c..7bbe6d2dcd 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java
@@ -27,6 +27,7 @@
import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration;
import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration;
+import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
@@ -54,6 +55,8 @@ public class FormEventProcessorFactory implements IRepresentationEventProcessorF
private final List formEventHandlers;
+ private final List tableEventHandlers;
+
private final ISubscriptionManagerFactory subscriptionManagerFactory;
private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry;
@@ -67,6 +70,7 @@ public FormEventProcessorFactory(RepresentationEventProcessorFactoryConfiguratio
this.objectService = Objects.requireNonNull(formConfiguration.getObjectService());
this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors);
this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers());
+ this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers());
this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry());
this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor());
}
@@ -98,9 +102,10 @@ public Optional createRepresentationEventProcesso
.build();
IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(
- new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers),
+ new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers),
this.subscriptionManagerFactory.create(),
this.representationSearchService,
+ this.representationDescriptionSearchService,
this.representationRefreshPolicyRegistry,
this.formPostProcessor);
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java
index 3d61d106cb..7279647bff 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java
@@ -17,17 +17,17 @@
import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor;
+import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor;
/**
- * Bundles the common dependencies that {@link IFormEventProcessor} implementations need
- * into a single object for convenience.
+ * Bundles the common dependencies that {@link IFormEventProcessor} implementations need into a single object for convenience.
*
* @author frouene
*/
-public record FormEventProcessorConfiguration(IEditingContext editingContext, IObjectService objectService, FormCreationParameters formCreationParameters,
- List widgetDescriptors, List formEventHandlers) {
+public record FormEventProcessorConfiguration(IEditingContext editingContext, IObjectService objectService, FormCreationParameters formCreationParameters, List widgetDescriptors,
+ List formEventHandlers, List tableEventHandlers) {
}
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java
index 0816f92578..13a05abbc9 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java
@@ -19,6 +19,7 @@
import org.eclipse.sirius.components.collaborative.api.IRepresentationEventProcessorFactory;
import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler;
import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor;
+import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.springframework.context.annotation.Configuration;
@@ -35,11 +36,14 @@ public class FormEventProcessorFactoryConfiguration {
private final List formEventHandlers;
+ private final List tableEventHandlers;
+
private final Optional optionalFormProcessor;
- public FormEventProcessorFactoryConfiguration(IObjectService objectService, List formEventHandlers, Optional optionalFormProcessor) {
+ public FormEventProcessorFactoryConfiguration(IObjectService objectService, List formEventHandlers, List tableEventHandlers, Optional optionalFormProcessor) {
this.objectService = Objects.requireNonNull(objectService);
this.formEventHandlers = Objects.requireNonNull(formEventHandlers);
+ this.tableEventHandlers = Objects.requireNonNull(tableEventHandlers);
this.optionalFormProcessor = Objects.requireNonNull(optionalFormProcessor);
}
@@ -54,4 +58,8 @@ public List getFormEventHandlers() {
public IFormPostProcessor getFormPostProcessor() {
return this.optionalFormProcessor.orElse(new IFormPostProcessor.NoOp());
}
+
+ public List getTableEventHandlers() {
+ return tableEventHandlers;
+ }
}
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls b/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls
index 2c68f4ebe4..de1cfd1a0b 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls
@@ -420,6 +420,16 @@ type DateTimeStyle {
bold: Boolean
}
+type TableWidget implements Widget {
+ id: ID!
+ label: String!
+ iconURL: [String!]!
+ diagnostics: [Diagnostic!]!
+ hasHelpText: Boolean!
+ readOnly: Boolean!
+ table: Table
+}
+
type FormDescription implements RepresentationDescription {
id: ID!
label: String!
diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java b/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java
index 7ca5baa06a..569befb33a 100644
--- a/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java
+++ b/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java
@@ -30,12 +30,12 @@
import org.eclipse.sirius.components.core.api.IInput;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
+import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
import org.eclipse.sirius.components.forms.description.FormDescription;
+import org.junit.jupiter.api.Test;
import reactor.test.StepVerifier;
-import org.junit.jupiter.api.Test;
-
/**
* Unit tests of the form event processor.
*
@@ -116,9 +116,10 @@ private FormEventProcessor createFormEventProcessor() {
.build();
FormEventProcessor formEventProcessor = new FormEventProcessor(
- new FormEventProcessorConfiguration(editingContext, new IObjectService.NoOp(), formCreationParameters, List.of(), List.of()),
+ new FormEventProcessorConfiguration(editingContext, new IObjectService.NoOp(), formCreationParameters, List.of(), List.of(), List.of()),
new SubscriptionManager(),
new IRepresentationSearchService.NoOp(),
+ new IRepresentationDescriptionSearchService.NoOp(),
new RepresentationRefreshPolicyRegistry(List.of()),
new IFormPostProcessor.NoOp());
return formEventProcessor;
diff --git a/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java b/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java
index 37516d6298..0af98fffc8 100644
--- a/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java
+++ b/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java
@@ -49,6 +49,7 @@ public class WidgetHasHelpTextDataFetcher implements IDataFetcherWithFieldCoord
"Select",
"Slider",
"SplitButton",
+ "TableWidget",
"Textarea",
"Textfield",
"ToolbarAction",
diff --git a/packages/forms/backend/sirius-components-forms/pom.xml b/packages/forms/backend/sirius-components-forms/pom.xml
index 6d2f6a924b..f6b94da3cd 100644
--- a/packages/forms/backend/sirius-components-forms/pom.xml
+++ b/packages/forms/backend/sirius-components-forms/pom.xml
@@ -54,6 +54,11 @@
sirius-components-charts
2024.9.8
+
+ org.eclipse.sirius
+ sirius-components-tables
+ 2024.9.8
+
org.springframework.boot
spring-boot-starter-test
@@ -78,7 +83,8 @@
maven-checkstyle-plugin
3.4.0
- ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml
+
+ ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml
true
true
true
@@ -126,4 +132,4 @@
-
+
\ No newline at end of file
diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java
new file mode 100644
index 0000000000..9582de8d96
--- /dev/null
+++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2024 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.components.forms;
+
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+import org.eclipse.sirius.components.annotations.Immutable;
+import org.eclipse.sirius.components.forms.validation.Diagnostic;
+import org.eclipse.sirius.components.representations.IRepresentation;
+import org.eclipse.sirius.components.tables.Table;
+
+/**
+ * Root concept of the table widget.
+ *
+ * @author lfasani
+ */
+@Immutable
+public final class TableWidget extends AbstractWidget {
+
+ public static final String KIND = IRepresentation.KIND_PREFIX + "?type=Table";
+
+ private Table table;
+
+ private TableWidget() {
+ // Prevent instantiation
+ }
+
+ public Table getTable() {
+ return this.table;
+ }
+
+ public static Builder newTableWidget(String id) {
+ return new Builder(id);
+ }
+
+ @Override
+ public String toString() {
+ String pattern = "{0} '{'id: {1}, label: {2}'}'";
+ return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId(), this.label);
+ }
+
+ /**
+ * The builder used to create the table widget.
+ *
+ * @author lfasani
+ */
+ @SuppressWarnings("checkstyle:HiddenField")
+ public static final class Builder {
+
+ private final String id;
+
+ private String label;
+
+ private List iconURL = List.of();
+
+ private List diagnostics;
+
+ private Supplier helpTextProvider;
+
+ private boolean readOnly;
+
+ private Table table;
+
+ private Builder(String id) {
+ this.id = Objects.requireNonNull(id);
+ }
+
+ public TableWidget.Builder iconURL(List iconURL) {
+ this.iconURL = Objects.requireNonNull(iconURL);
+ return this;
+ }
+
+ public TableWidget.Builder label(String label) {
+ this.label = Objects.requireNonNull(label);
+ return this;
+ }
+
+ public TableWidget.Builder diagnostics(List diagnostics) {
+ this.diagnostics = Objects.requireNonNull(diagnostics);
+ return this;
+ }
+
+ public TableWidget.Builder helpTextProvider(Supplier helpTextProvider) {
+ this.helpTextProvider = Objects.requireNonNull(helpTextProvider);
+ return this;
+ }
+
+ public TableWidget.Builder readOnly(boolean readOnly) {
+ this.readOnly = readOnly;
+ return this;
+ }
+
+ public Builder table(Table table) {
+ this.table = Objects.requireNonNull(table);
+ return this;
+ }
+
+ public TableWidget build() {
+ TableWidget table = new TableWidget();
+ table.id = Objects.requireNonNull(this.id);
+ table.label = Objects.requireNonNull(this.label);
+ table.iconURL = Objects.requireNonNull(this.iconURL);
+ table.diagnostics = Objects.requireNonNull(this.diagnostics);
+ table.table = Objects.requireNonNull(this.table);
+ table.helpTextProvider = this.helpTextProvider; // Optional on purpose
+ table.readOnly = this.readOnly;
+ return table;
+ }
+ }
+}
diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java
new file mode 100644
index 0000000000..3da6385d06
--- /dev/null
+++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2024 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.components.forms.components;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import org.eclipse.sirius.components.forms.description.TableWidgetDescription;
+import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps;
+import org.eclipse.sirius.components.representations.Element;
+import org.eclipse.sirius.components.representations.IComponent;
+import org.eclipse.sirius.components.representations.VariableManager;
+import org.eclipse.sirius.components.tables.components.TableComponent;
+import org.eclipse.sirius.components.tables.components.TableComponentProps;
+
+/**
+ * The component used to render the table widget.
+ *
+ * @author lfasani
+ */
+public class TableWidgetComponent implements IComponent {
+
+ private final TableWidgetComponentProps props;
+
+ public TableWidgetComponent(TableWidgetComponentProps props) {
+ this.props = Objects.requireNonNull(props);
+ }
+
+ @Override
+ public Element render() {
+ VariableManager variableManager = this.props.getVariableManager();
+ TableWidgetDescription tableWidgetDescription = this.props.getTableDescription();
+
+ String label = tableWidgetDescription.getLabelProvider().apply(variableManager);
+
+ VariableManager idVariableManager = variableManager.createChild();
+ idVariableManager.put(FormComponent.TARGET_OBJECT_ID, tableWidgetDescription.getTargetObjectIdProvider().apply(variableManager));
+ idVariableManager.put(FormComponent.CONTROL_DESCRIPTION_ID, tableWidgetDescription.getId());
+ idVariableManager.put(FormComponent.WIDGET_LABEL, label);
+ String id = tableWidgetDescription.getIdProvider().apply(idVariableManager);
+
+ List iconURL = tableWidgetDescription.getIconURLProvider().apply(variableManager);
+ Boolean readOnly = tableWidgetDescription.getIsReadOnlyProvider().apply(variableManager);
+
+ Element tableElement = new Element(TableComponent.class,
+ new TableComponentProps(variableManager, tableWidgetDescription.getTableDescription(), Optional.empty()));
+
+ List children = new ArrayList<>();
+ children.add(tableElement);
+
+ TableWidgetElementProps.Builder tableElementPropsBuilder = TableWidgetElementProps.newTableWidgetElementProps(id)
+ .label(label)
+ .children(children);
+
+ if (iconURL != null) {
+ tableElementPropsBuilder.iconURL(iconURL);
+ }
+ if (tableWidgetDescription.getHelpTextProvider() != null) {
+ tableElementPropsBuilder.helpTextProvider(() -> tableWidgetDescription.getHelpTextProvider().apply(variableManager));
+ }
+ if (readOnly != null) {
+ tableElementPropsBuilder.readOnly(readOnly);
+ }
+
+ TableWidgetElementProps tableWidgetElementProps = tableElementPropsBuilder.build();
+ return new Element(TableWidgetElementProps.TYPE, tableWidgetElementProps);
+ }
+
+}
diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java
new file mode 100644
index 0000000000..078b0e5a3b
--- /dev/null
+++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2024 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.components.forms.components;
+
+import java.util.Objects;
+
+import org.eclipse.sirius.components.forms.description.TableWidgetDescription;
+import org.eclipse.sirius.components.representations.IProps;
+import org.eclipse.sirius.components.representations.VariableManager;
+
+/**
+ * The props of the table component.
+ *
+ * @author lfasani
+ */
+public class TableWidgetComponentProps implements IProps {
+
+ private final VariableManager variableManager;
+
+ private final TableWidgetDescription tableWidgetDescription;
+
+ public TableWidgetComponentProps(VariableManager variableManager, TableWidgetDescription tableWidgetDescription) {
+ this.variableManager = Objects.requireNonNull(variableManager);
+ this.tableWidgetDescription = Objects.requireNonNull(tableWidgetDescription);
+ }
+
+ public VariableManager getVariableManager() {
+ return this.variableManager;
+ }
+
+ public TableWidgetDescription getTableDescription() {
+ return this.tableWidgetDescription;
+ }
+}
diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java
index 5aea42b11d..e71c89265d 100644
--- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java
+++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java
@@ -31,6 +31,7 @@
import org.eclipse.sirius.components.forms.description.SelectDescription;
import org.eclipse.sirius.components.forms.description.SliderDescription;
import org.eclipse.sirius.components.forms.description.SplitButtonDescription;
+import org.eclipse.sirius.components.forms.description.TableWidgetDescription;
import org.eclipse.sirius.components.forms.description.TextareaDescription;
import org.eclipse.sirius.components.forms.description.TextfieldDescription;
import org.eclipse.sirius.components.forms.description.TreeDescription;
@@ -116,6 +117,9 @@ public Element render() {
} else if (widgetDescription instanceof DateTimeDescription) {
DateTimeComponentProps dateTimeComponentProps = new DateTimeComponentProps(variableManager, (DateTimeDescription) widgetDescription);
element = new Element(DateTimeComponent.class, dateTimeComponentProps);
+ } else if (widgetDescription instanceof TableWidgetDescription) {
+ TableWidgetComponentProps tableWidgetComponentProps = new TableWidgetComponentProps(variableManager, (TableWidgetDescription) widgetDescription);
+ element = new Element(TableWidgetComponent.class, tableWidgetComponentProps);
} else {
element = this.props.getWidgetDescriptors().stream()
.map(widgetDescriptor -> widgetDescriptor.createElement(variableManager, widgetDescription))
diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java
new file mode 100644
index 0000000000..bd480af72d
--- /dev/null
+++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2024 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.components.forms.description;
+
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Function;
+
+import org.eclipse.sirius.components.annotations.Immutable;
+import org.eclipse.sirius.components.representations.VariableManager;
+import org.eclipse.sirius.components.tables.descriptions.TableDescription;
+
+/**
+ * The root concept of the description of a table representation.
+ *
+ * @author lfasani
+ */
+@Immutable
+public final class TableWidgetDescription extends AbstractWidgetDescription {
+ private Function idProvider;
+
+ private Function labelProvider;
+
+ private Function> iconURLProvider;
+
+ private TableDescription tableDescription;
+
+ private TableWidgetDescription() {
+ // Prevent instantiation
+ }
+
+ public Function getIdProvider() {
+ return this.idProvider;
+ }
+
+ public Function getLabelProvider() {
+ return this.labelProvider;
+ }
+
+ public Function> getIconURLProvider() {
+ return this.iconURLProvider;
+ }
+
+ public TableDescription getTableDescription() {
+ return this.tableDescription;
+ }
+
+ public static Builder newTableWidgetDescription(String id) {
+ return new Builder(id);
+ }
+
+ @Override
+ public String toString() {
+ String pattern = "{0} '{'id: {1}'}'";
+ return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId());
+ }
+
+
+ /**
+ * Builder used to create the table description.
+ *
+ * @author lfasani
+ */
+ @SuppressWarnings("checkstyle:HiddenField")
+ public static final class Builder {
+
+ private final String id;
+
+ private Function idProvider;
+
+ private Function labelProvider;
+
+ private Function> iconURLProvider = variableManager -> List.of();;
+
+ private Function targetObjectIdProvider;
+
+ private Function isReadOnlyProvider = variableManager -> false;
+
+ private Function> diagnosticsProvider;
+
+ private Function