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 kindProvider; + + private Function messageProvider; + + private Function helpTextProvider; + + private TableDescription tableDescription; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public TableWidgetDescription.Builder idProvider(Function idProvider) { + this.idProvider = Objects.requireNonNull(idProvider); + return this; + } + + public TableWidgetDescription.Builder labelProvider(Function labelProvider) { + this.labelProvider = Objects.requireNonNull(labelProvider); + return this; + } + + public TableWidgetDescription.Builder targetObjectIdProvider(Function targetObjectIdProvider) { + this.targetObjectIdProvider = Objects.requireNonNull(targetObjectIdProvider); + return this; + } + + public TableWidgetDescription.Builder isReadOnlyProvider(Function isReadOnlyProvider) { + this.isReadOnlyProvider = Objects.requireNonNull(isReadOnlyProvider); + return this; + } + + public TableWidgetDescription.Builder diagnosticsProvider(Function> diagnosticsProvider) { + this.diagnosticsProvider = Objects.requireNonNull(diagnosticsProvider); + return this; + } + + public TableWidgetDescription.Builder iconURLProvider(Function> iconURLProvider) { + this.iconURLProvider = Objects.requireNonNull(iconURLProvider); + return this; + } + + public TableWidgetDescription.Builder kindProvider(Function kindProvider) { + this.kindProvider = Objects.requireNonNull(kindProvider); + return this; + } + + public TableWidgetDescription.Builder messageProvider(Function messageProvider) { + this.messageProvider = Objects.requireNonNull(messageProvider); + return this; + } + + public TableWidgetDescription.Builder helpTextProvider(Function helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public TableWidgetDescription.Builder tableDescription(TableDescription tableDescription) { + this.tableDescription = Objects.requireNonNull(tableDescription); + return this; + } + + public TableWidgetDescription build() { + TableWidgetDescription tableWidgetDescription = new TableWidgetDescription(); + tableWidgetDescription.id = Objects.requireNonNull(this.id); + tableWidgetDescription.targetObjectIdProvider = Objects.requireNonNull(this.targetObjectIdProvider); + tableWidgetDescription.idProvider = Objects.requireNonNull(this.idProvider); + tableWidgetDescription.labelProvider = Objects.requireNonNull(this.labelProvider); + tableWidgetDescription.iconURLProvider = Objects.requireNonNull(this.iconURLProvider); + tableWidgetDescription.isReadOnlyProvider = Objects.requireNonNull(this.isReadOnlyProvider); + tableWidgetDescription.diagnosticsProvider = Objects.requireNonNull(this.diagnosticsProvider); + tableWidgetDescription.kindProvider = Objects.requireNonNull(this.kindProvider); + tableWidgetDescription.messageProvider = Objects.requireNonNull(this.messageProvider); + tableWidgetDescription.helpTextProvider = this.helpTextProvider; // Optional on purpose + tableWidgetDescription.tableDescription = Objects.requireNonNull(this.tableDescription); + return tableWidgetDescription; + } + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java new file mode 100644 index 0000000000..3439a064b6 --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * 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.elements; + +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.representations.Element; +import org.eclipse.sirius.components.representations.IProps; + +/** + * Properties of the table element. + * + * @author lfasani + */ +@Immutable +public final class TableWidgetElementProps implements IProps { + + public static final String TYPE = "TableWidget"; + + private String id; + + private String label; + + private List iconURL; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private TableWidgetElementProps() { + // Prevent instantiation + } + + public String getId() { + return this.id; + } + + public String getLabel() { + return this.label; + } + + public List getIconURL() { + return this.iconURL; + } + + public Supplier getHelpTextProvider() { + return this.helpTextProvider; + } + + public boolean isReadOnly() { + return this.readOnly; + } + + @Override + public List getChildren() { + return this.children; + } + + public static Builder newTableWidgetElementProps(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; + return MessageFormat.format(pattern, this.getClass(), this.id); + } + + /** + * The builder of the table element props. + * + * @author arichard + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + private String id; + + private String label; + + private List iconURL; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public TableWidgetElementProps.Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public TableWidgetElementProps.Builder iconURL(List iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public TableWidgetElementProps.Builder readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } + + public TableWidgetElementProps.Builder helpTextProvider(Supplier helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public TableWidgetElementProps.Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public TableWidgetElementProps build() { + TableWidgetElementProps tableWidgetElementProps = new TableWidgetElementProps(); + tableWidgetElementProps.id = Objects.requireNonNull(this.id); + tableWidgetElementProps.label = Objects.requireNonNull(this.label); + tableWidgetElementProps.iconURL = this.iconURL; + tableWidgetElementProps.readOnly = this.readOnly; + tableWidgetElementProps.helpTextProvider = this.helpTextProvider; + tableWidgetElementProps.children = Objects.requireNonNull(this.children); + return tableWidgetElementProps; + } + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java index 25414bcaab..99269a1365 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java @@ -60,6 +60,8 @@ import org.eclipse.sirius.components.forms.components.SliderComponentProps; import org.eclipse.sirius.components.forms.components.SplitButtonComponent; import org.eclipse.sirius.components.forms.components.SplitButtonComponentProps; +import org.eclipse.sirius.components.forms.components.TableWidgetComponent; +import org.eclipse.sirius.components.forms.components.TableWidgetComponentProps; import org.eclipse.sirius.components.forms.components.TextareaComponent; import org.eclipse.sirius.components.forms.components.TextareaComponentProps; import org.eclipse.sirius.components.forms.components.TextfieldComponent; @@ -74,6 +76,7 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticComponentProps; import org.eclipse.sirius.components.representations.IComponentPropsValidator; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.renderer.TableComponentPropsValidator; /** * Used to validate the properties of a component. @@ -83,6 +86,8 @@ public class FormComponentPropsValidator implements IComponentPropsValidator { private final List widgetDescriptors; + private final TableComponentPropsValidator tableComponentPropsValidator = new TableComponentPropsValidator(); + public FormComponentPropsValidator(List widgetDescriptors) { this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); } @@ -148,13 +153,18 @@ public boolean validateComponentProps(Class componentType, IProps props) { checkValidProps = props instanceof SliderComponentProps; } else if (DateTimeComponent.class.equals(componentType)) { checkValidProps = props instanceof DateTimeComponentProps; + } else if (TableWidgetComponent.class.equals(componentType)) { + checkValidProps = props instanceof TableWidgetComponentProps; } else { - checkValidProps = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.validateComponentProps(componentType, props)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(false); + checkValidProps = tableComponentPropsValidator.validateComponentProps(componentType, props); + if (!checkValidProps) { + checkValidProps = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.validateComponentProps(componentType, props)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(false); + } } return checkValidProps; } diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java index 923c0af535..4638874f71 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java @@ -43,6 +43,7 @@ import org.eclipse.sirius.components.forms.Select; import org.eclipse.sirius.components.forms.Slider; import org.eclipse.sirius.components.forms.SplitButton; +import org.eclipse.sirius.components.forms.TableWidget; import org.eclipse.sirius.components.forms.Textarea; import org.eclipse.sirius.components.forms.Textfield; import org.eclipse.sirius.components.forms.ToolbarAction; @@ -65,6 +66,7 @@ import org.eclipse.sirius.components.forms.elements.SelectElementProps; import org.eclipse.sirius.components.forms.elements.SliderElementProps; import org.eclipse.sirius.components.forms.elements.SplitButtonElementProps; +import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps; import org.eclipse.sirius.components.forms.elements.TextareaElementProps; import org.eclipse.sirius.components.forms.elements.TextfieldElementProps; import org.eclipse.sirius.components.forms.elements.ToolbarActionElementProps; @@ -73,6 +75,8 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticElementProps; import org.eclipse.sirius.components.representations.IElementFactory; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.Table; +import org.eclipse.sirius.components.tables.renderer.TableElementFactory; /** * Used to instantiate the elements of the form. @@ -82,6 +86,8 @@ public class FormElementFactory implements IElementFactory { private final List widgetDescriptors; + private final TableElementFactory tableElementFactory = new TableElementFactory(); + public FormElementFactory(List widgetDescriptors) { this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); } @@ -140,13 +146,18 @@ public Object instantiateElement(String type, IProps props, List childre object = this.instantiateSlider((SliderElementProps) props, children); } else if (DateTimeElementProps.TYPE.equals(type) && props instanceof DateTimeElementProps) { object = this.instantiateDateTime((DateTimeElementProps) props, children); + } else if (TableWidgetElementProps.TYPE.equals(type) && props instanceof TableWidgetElementProps) { + object = this.instantiateTableWidget((TableWidgetElementProps) props, children); } else { - object = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.instanciate(type, props, children)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(null); + object = tableElementFactory.instantiateElement(type, props, children); + if (object == null) { + object = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.instanciate(type, props, children)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(null); + } } return object; @@ -693,4 +704,25 @@ private List getDiagnosticsFromChildren(List children) { .toList(); } + private TableWidget instantiateTableWidget(TableWidgetElementProps props, List children) { + Optional
table = children.stream() + .filter(Table.class::isInstance) + .map(Table.class::cast) + .findFirst(); + + List diagnostics = this.getDiagnosticsFromChildren(children); + + TableWidget.Builder tableBuilder = TableWidget.newTableWidget(props.getId()) + .label(props.getLabel()) + .iconURL(props.getIconURL()) + .diagnostics(diagnostics) + .readOnly(props.isReadOnly()) + .table(table.get()); + + if (props.getHelpTextProvider() != null) { + tableBuilder.helpTextProvider(props.getHelpTextProvider()); + } + + return tableBuilder.build(); + } } diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java index e6a4e4b1c2..aea3d7e24e 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java @@ -36,6 +36,7 @@ import org.eclipse.sirius.components.forms.elements.SelectElementProps; import org.eclipse.sirius.components.forms.elements.SliderElementProps; import org.eclipse.sirius.components.forms.elements.SplitButtonElementProps; +import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps; import org.eclipse.sirius.components.forms.elements.TextareaElementProps; import org.eclipse.sirius.components.forms.elements.TextfieldElementProps; import org.eclipse.sirius.components.forms.elements.ToolbarActionElementProps; @@ -43,6 +44,7 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticElementProps; import org.eclipse.sirius.components.representations.IInstancePropsValidator; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.renderer.TableInstancePropsValidator; /** * Used to validate the instance props. @@ -50,6 +52,7 @@ * @author sbegaudeau */ public class FormInstancePropsValidator implements IInstancePropsValidator { + private final TableInstancePropsValidator tableInstancePropsValidator = new TableInstancePropsValidator(); private final List widgetDescriptors; @@ -112,13 +115,18 @@ public boolean validateInstanceProps(String type, IProps props) { checkValidProps = props instanceof SliderElementProps; } else if (DateTimeElementProps.TYPE.equals(type)) { checkValidProps = props instanceof DateTimeElementProps; + } else if (TableWidgetElementProps.TYPE.equals(type)) { + checkValidProps = props instanceof TableWidgetElementProps; } else { - checkValidProps = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.validateInstanceProps(type, props)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(false); + checkValidProps = tableInstancePropsValidator.validateInstanceProps(type, props); + if (!checkValidProps) { + checkValidProps = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.validateInstanceProps(type, props)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(false); + } } return checkValidProps; diff --git a/packages/forms/frontend/sirius-components-forms/package.json b/packages/forms/frontend/sirius-components-forms/package.json index ce4a71348a..0216a84879 100644 --- a/packages/forms/frontend/sirius-components-forms/package.json +++ b/packages/forms/frontend/sirius-components-forms/package.json @@ -35,13 +35,16 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "lexical": "0.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 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", @@ -63,9 +67,11 @@ "@vitest/coverage-v8": "1.6.0", "jsdom": "16.7.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "prettier": "2.7.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "rollup-plugin-peer-deps-external": "2.2.4", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts index c9dac697ac..daeb0019d2 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts @@ -304,6 +304,52 @@ export const widgetFields = ` } } + fragment tableWidgetFields on TableWidget { + label + iconURL + table { + id + columns { + id + label + targetObjectId + targetObjectKind + } + lines { + id + targetObjectId + targetObjectKind + cells { + __typename + id + targetObjectId + targetObjectKind + columnId + ... on CheckboxCell { + booleanValue: value + } + ... on SelectCell { + value + options { + id + label + } + } + ... on MultiSelectCell { + values + options { + id + label + } + } + ... on TextfieldCell { + stringValue: value + } + } + } + } + } + fragment widgetFields on Widget { ...commonFields ... on Textfield { @@ -359,6 +405,9 @@ export const widgetFields = ` } ... on DateTime { ...dateTimeFields + } + ... on TableWidget { + ...tableWidgetFields } } `; diff --git a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts index 4ca6e5c861..09241afd18 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts @@ -11,6 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ +import { GQLTable } from '@eclipse-sirius/sirius-components-tables'; + export interface GQLFormEventSubscription { formEvent: GQLFormEventPayload; } @@ -392,3 +394,7 @@ export interface GQLDateTimeStyle { italic: boolean | null; bold: boolean | null; } + +export interface GQLTableWidget extends GQLWidget { + table: GQLTable; +} diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx index 9ab9f22634..e610513c34 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx @@ -161,21 +161,26 @@ export const DateTimeWidgetPropertySection: PropertySectionComponent { - const dateTime = new Date(dateTimeString); - - // Get the local date and time components - const year = String(dateTime.getFullYear()).padStart(4, '0'); - const month = String(dateTime.getMonth() + 1).padStart(2, '0'); - const day = String(dateTime.getDate()).padStart(2, '0'); - const hours = String(dateTime.getHours()).padStart(2, '0'); - const minutes = String(dateTime.getMinutes()).padStart(2, '0'); - - if (dateTimeType === 'DATE') { - return `${year}-${month}-${day}`; - } else if (dateTimeType === 'TIME') { - return `${hours}:${minutes}`; + let formattedDateTimeString = ''; + if (dateTimeString) { + const dateTime = new Date(dateTimeString); + + // Get the local date and time components + const year = String(dateTime.getFullYear()).padStart(4, '0'); + const month = String(dateTime.getMonth() + 1).padStart(2, '0'); + const day = String(dateTime.getDate()).padStart(2, '0'); + const hours = String(dateTime.getHours()).padStart(2, '0'); + const minutes = String(dateTime.getMinutes()).padStart(2, '0'); + + if (dateTimeType === 'DATE') { + formattedDateTimeString = `${year}-${month}-${day}`; + } else if (dateTimeType === 'TIME') { + formattedDateTimeString = `${hours}:${minutes}`; + } else { + formattedDateTimeString = `${year}-${month}-${day}T${hours}:${minutes}`; + } } - return `${year}-${month}-${day}T${hours}:${minutes}`; + return formattedDateTimeString; }; const convertToUTCDateTimeString = (dateTimeType: string, dateTimeString: string): string => { diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx index 2b608daf67..469ee53695 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx @@ -27,6 +27,7 @@ import { GQLSelect, GQLSlider, GQLSplitButton, + GQLTableWidget, GQLTextarea, GQLTextfield, GQLTree, @@ -49,6 +50,7 @@ import { RichTextPropertySection } from './RichTextPropertySection'; import { SelectPropertySection } from './SelectPropertySection'; import { SliderPropertySection } from './SliderPropertySection'; import { SplitButtonPropertySection } from './SplitButtonPropertySection'; +import { TableWidgetPropertySection } from './TableWidgetPropertySection'; import { TextfieldPropertySection } from './TextfieldPropertySection'; import { TreePropertySection } from './TreePropertySection'; @@ -71,6 +73,7 @@ const isFlexboxContainer = (widget: GQLWidget): widget is GQLFlexboxContainer => const isTree = (widget: GQLWidget): widget is GQLTree => widget.__typename === 'TreeWidget'; const isImage = (widget: GQLWidget): widget is GQLImage => widget.__typename === 'Image'; const isRichText = (widget: GQLWidget): widget is GQLRichText => widget.__typename === 'RichText'; +const isTableWidget = (widget: GQLWidget): widget is GQLTableWidget => widget.__typename === 'TableWidget'; export const PropertySection = ({ editingContextId, formId, widget, readOnly }: PropertySectionProps) => { const { data: widgetContributions } = useData(widgetContributionExtensionPoint); @@ -246,6 +249,16 @@ export const PropertySection = ({ editingContextId, formId, widget, readOnly }: readOnly={readOnly} /> ); + } else if (isTableWidget(widget)) { + propertySection = ( + + ); } else { const CustomWidgetComponent = widgetContributions .map((widgetContribution) => widgetContribution.component(widget)) diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx new file mode 100644 index 0000000000..4e5dda2457 --- /dev/null +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx @@ -0,0 +1,42 @@ +/******************************************************************************* + * 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 + *******************************************************************************/ +import { TableContent } from '@eclipse-sirius/sirius-components-tables'; +import { makeStyles } from 'tss-react/mui'; +import { PropertySectionComponent, PropertySectionComponentProps } from '../form/Form.types'; +import { GQLTableWidget } from '../form/FormEventFragments.types'; +import { PropertySectionLabel } from './PropertySectionLabel'; + +const useStyle = makeStyles()(() => ({ + main: { + display: 'grid', + }, +})); + +export const TableWidgetPropertySection: PropertySectionComponent = ({ + editingContextId, + formId, + widget, +}: PropertySectionComponentProps) => { + const { classes } = useStyle(); + + return ( +
+ + +
+ ); +}; diff --git a/packages/forms/frontend/sirius-components-widget-reference/package.json b/packages/forms/frontend/sirius-components-widget-reference/package.json index dbf4f31711..b3c2eba527 100644 --- a/packages/forms/frontend/sirius-components-widget-reference/package.json +++ b/packages/forms/frontend/sirius-components-widget-reference/package.json @@ -35,14 +35,17 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "react": "18.3.1", "react-dom": "18.3.1", "tss-react": "4.9.7", @@ -52,6 +55,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", @@ -65,9 +69,11 @@ "@vitest/coverage-v8": "1.6.0", "jsdom": "16.7.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "prettier": "2.7.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "rollup-plugin-peer-deps-external": "2.2.4", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/pom.xml b/packages/pom.xml index e519946cae..111a9761c8 100644 --- a/packages/pom.xml +++ b/packages/pom.xml @@ -50,6 +50,7 @@ deck/backend formdescriptioneditors/backend forms/backend + tables/backend selection/backend trees/backend validation/backend diff --git a/packages/releng/backend/sirius-components-test-coverage/pom.xml b/packages/releng/backend/sirius-components-test-coverage/pom.xml index 930a985624..c2260eb350 100644 --- a/packages/releng/backend/sirius-components-test-coverage/pom.xml +++ b/packages/releng/backend/sirius-components-test-coverage/pom.xml @@ -12,8 +12,8 @@ Obeo - initial API and implementation --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -145,6 +145,11 @@ sirius-components-representations 2024.9.8 + + org.eclipse.sirius + sirius-components-tables + 2024.9.8 + org.eclipse.sirius sirius-components-selection @@ -200,6 +205,11 @@ sirius-components-collaborative-selection 2024.9.8 + + org.eclipse.sirius + sirius-components-collaborative-tables + 2024.9.8 + org.eclipse.sirius sirius-components-collaborative-trees @@ -250,6 +260,11 @@ sirius-components-portals-graphql 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-graphql + 2024.9.8 + org.eclipse.sirius sirius-components-trees-graphql @@ -450,4 +465,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java index 192fd48bf9..c0e855834d 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java @@ -29,9 +29,11 @@ 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.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.eclipse.sirius.web.application.diagram.services.filter.api.IDiagramFilterDescriptionProvider; @@ -51,24 +53,30 @@ public class DiagramFilterEventProcessorFactory implements IRepresentationEventP private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; private final IFormPostProcessor formPostProcessor; - public DiagramFilterEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, IRepresentationSearchService representationSearchService, + public DiagramFilterEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, IDiagramFilterDescriptionProvider diagramFilterDescriptionProvider, List widgetDescriptors, FormEventProcessorFactoryConfiguration formConfiguration) { this.diagramFilterDescriptionProvider = Objects.requireNonNull(diagramFilterDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); - this.representationSearchService = Objects.requireNonNull(representationSearchService); + this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -100,8 +108,9 @@ public Optional createRepresentationEventProcesso .selection(objects) .build(); - var formEventProcessorConfiguration = new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers); - IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(formEventProcessorConfiguration, this.subscriptionManagerFactory.create(), this.representationSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); + var formEventProcessorConfiguration = new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers); + IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(formEventProcessorConfiguration, this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); return Optional.of(formEventProcessor); } diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java index cc10ec2a11..7a1e4d348f 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java @@ -32,9 +32,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IPropertiesDescriptionService; 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.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.description.PageDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; @@ -62,20 +64,26 @@ public class PropertiesEventProcessorFactory implements IRepresentationEventProc private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; private final IFormPostProcessor formPostProcessor; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + public PropertiesEventProcessorFactory(IPropertiesDescriptionService propertiesDescriptionService, IPropertiesDefaultDescriptionProvider propertiesDefaultDescriptionProvider, List widgetDescriptors, RepresentationEventProcessorFactoryConfiguration configuration, FormEventProcessorFactoryConfiguration formConfiguration) { this.propertiesDescriptionService = Objects.requireNonNull(propertiesDescriptionService); this.propertiesDefaultDescriptionProvider = Objects.requireNonNull(propertiesDefaultDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -114,9 +122,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/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java index 7b32ebcb4b..025695e5d4 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java @@ -30,9 +30,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IRelatedElementsDescriptionProvider; 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.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.springframework.stereotype.Service; @@ -51,10 +53,14 @@ public class RelatedElementsEventProcessorFactory implements IRepresentationEven private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; @@ -66,8 +72,10 @@ public RelatedElementsEventProcessorFactory(RepresentationEventProcessorFactoryC this.relatedElementsDescriptionProvider = Objects.requireNonNull(relatedElementsDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -99,9 +107,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/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java index 1d827555db..d19da4eb5a 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java @@ -30,9 +30,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IRepresentationsDescriptionProvider; 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.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.springframework.stereotype.Service; @@ -51,10 +53,14 @@ public class RepresentationsEventProcessorFactory implements IRepresentationEven private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; @@ -66,8 +72,10 @@ public RepresentationsEventProcessorFactory(IRepresentationsDescriptionProvider this.representationsDescriptionProvider = Objects.requireNonNull(representationsDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(subscriptionManagerFactory); this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -99,9 +107,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/sirius-web/backend/sirius-web-starter/pom.xml b/packages/sirius-web/backend/sirius-web-starter/pom.xml index 5ffbd4d152..16b21d0ac3 100644 --- a/packages/sirius-web/backend/sirius-web-starter/pom.xml +++ b/packages/sirius-web/backend/sirius-web-starter/pom.xml @@ -12,8 +12,8 @@ Obeo - initial API and implementation --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -99,6 +99,11 @@ sirius-components-selection-graphql 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-graphql + 2024.9.8 + org.eclipse.sirius sirius-components-trees-graphql @@ -213,7 +218,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 @@ -261,4 +267,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java b/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java index 4a5cb3ce01..b4541b1f1a 100644 --- a/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java +++ b/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java @@ -62,6 +62,7 @@ "org.eclipse.sirius.components.gantt", "org.eclipse.sirius.components.portals", "org.eclipse.sirius.components.selection", + "org.eclipse.sirius.components.tables", "org.eclipse.sirius.components.trees", "org.eclipse.sirius.components.validation", "org.eclipse.sirius.components.view.emf", diff --git a/packages/sirius-web/backend/sirius-web-tests/pom.xml b/packages/sirius-web/backend/sirius-web-tests/pom.xml index 208b89036d..602cb10a6a 100644 --- a/packages/sirius-web/backend/sirius-web-tests/pom.xml +++ b/packages/sirius-web/backend/sirius-web-tests/pom.xml @@ -65,6 +65,11 @@ sirius-components-forms-tests 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-tests + 2024.9.8 + org.eclipse.sirius sirius-components-collaborative-formdescriptioneditors @@ -89,7 +94,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 @@ -137,4 +143,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web/pom.xml b/packages/sirius-web/backend/sirius-web/pom.xml index c28f2727a4..24a0b0f143 100644 --- a/packages/sirius-web/backend/sirius-web/pom.xml +++ b/packages/sirius-web/backend/sirius-web/pom.xml @@ -145,6 +145,12 @@ 2024.9.8 test + + org.eclipse.sirius + sirius-components-tables-tests + 2024.9.8 + test + @@ -169,7 +175,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 @@ -217,4 +224,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java new file mode 100644 index 0000000000..f974c443f1 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java @@ -0,0 +1,296 @@ +/******************************************************************************* + * 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.web.application.controllers.forms; + +import static org.assertj.core.api.Assertions.fail; +import static org.eclipse.sirius.components.tables.tests.assertions.TablesAssertions.assertThat; + +import com.jayway.jsonpath.JsonPath; + +import java.time.Duration; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput; +import org.eclipse.sirius.components.collaborative.forms.dto.FormRefreshedEventPayload; +import org.eclipse.sirius.components.collaborative.tables.dto.EditCheckboxCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditMultiSelectCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditSelectCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditTextfieldCellInput; +import org.eclipse.sirius.components.core.api.SuccessPayload; +import org.eclipse.sirius.components.forms.Form; +import org.eclipse.sirius.components.forms.TableWidget; +import org.eclipse.sirius.components.forms.tests.navigation.FormNavigator; +import org.eclipse.sirius.components.tables.Line; +import org.eclipse.sirius.components.tables.Table; +import org.eclipse.sirius.components.tables.tests.graphql.EditCheckboxCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditMultiSelectCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditSelectCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditTextfieldCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.navigation.LineNavigator; +import org.eclipse.sirius.components.tables.tests.navigation.TableNavigator; +import org.eclipse.sirius.web.AbstractIntegrationTests; +import org.eclipse.sirius.web.data.PapayaIdentifiers; +import org.eclipse.sirius.web.services.forms.FormWithTableEditingContextDescriptionProvider; +import org.eclipse.sirius.web.tests.services.api.IGivenCreatedFormSubscription; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.transaction.annotation.Transactional; + +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +/** + * Integration tests of the table widget. + * + * @author lfasani + */ +@Transactional +@SuppressWarnings("checkstyle:MultipleStringLiterals") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "sirius.web.test.enabled=studio" }) +public class TableControllerTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenCreatedFormSubscription givenCreatedFormSubscription; + + @Autowired + private EditTextfieldCellMutationRunner editTextfieldCellMutationRunner; + + @Autowired + private EditSelectCellMutationRunner editSelectCellMutationRunner; + + @Autowired + private EditCheckboxCellMutationRunner editCheckboxCellMutationRunner; + + @Autowired + private EditMultiSelectCellMutationRunner editMultiSelectCellMutationRunner; + + @BeforeEach + public void beforeEach() { + this.givenInitialServerState.initialize(); + } + + private Flux givenSubscriptionToFormWithTableWidget() { + var input = new CreateRepresentationInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), FormWithTableEditingContextDescriptionProvider.TASK_FORM_ID, + PapayaIdentifiers.FIRST_ITERATION_OBJECT.toString(), "FormWithTable"); + return this.givenCreatedFormSubscription.createAndSubscribe(input); + } + + @Test + @DisplayName("Given a table widget, when it is displayed, then it is properly initialized") + @Sql(scripts = { "/scripts/papaya.sql" }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenTableWidgetWhenItIsDisplayedThenItIsProperlyInitialized() { + var flux = this.givenSubscriptionToFormWithTableWidget(); + + Consumer initialFormContentConsumer = payload -> Optional.of(payload).filter(FormRefreshedEventPayload.class::isInstance).map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form).ifPresentOrElse(form -> { + var tableWidget = new FormNavigator(form).page("Iteration Page").group("Iteration Group").findWidget("Tasks", TableWidget.class); + assertThat(tableWidget.getTable().getColumns()).hasSize(10); + assertThat(tableWidget.getTable().getLines()).hasSize(3); + assertThat(tableWidget.getTable()).hasFieldOrPropertyWithValue("label", "Iteration 2024.3.0"); + assertThat(tableWidget.getTable().getLines().stream().flatMap(line -> line.getCells().stream()).toList()).hasSize(10 * 3); + Line line = tableWidget.getTable().getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + TableNavigator tableNavigator = new TableNavigator(tableWidget.getTable()); + assertThat(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId())).hasValue("Improve some features of the deck"); + assertThat(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Is Done").getId())).hasValue(false); + assertThat(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId())).hasValue("P1"); + assertThat(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId())).hasValues(List.of()); + + }, () -> fail("Missing form")); + + StepVerifier.create(flux).consumeNextWith(initialFormContentConsumer).thenCancel().verify(Duration.ofSeconds(10)); + } + + @Test + @DisplayName("Given a table widget, when the cells are edited, then the values are updated") + @Sql(scripts = { "/scripts/papaya.sql" }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenTableWidgetWhenValuesAreEditedThenValuesAreUpdated() { + var flux = this.givenSubscriptionToFormWithTableWidget(); + + var formId = new AtomicReference(); + var tableId = new AtomicReference(); + var lineId = new AtomicReference(); + var textfieldCellId = new AtomicReference(); + var checkboxCellId = new AtomicReference(); + var selectCellId = new AtomicReference(); + var multiSelectCellId = new AtomicReference(); + + Consumer initialFormContentConsumer = payload -> Optional.of(payload).filter(FormRefreshedEventPayload.class::isInstance).map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form).ifPresentOrElse(form -> { + formId.set(form.getId()); + + var table = getTable(form); + tableId.set(table.getId()); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + lineId.set(line.getId()); + + TableNavigator tableNavigator = new TableNavigator(table); + textfieldCellId.set(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId()).getId()); + + }, () -> fail("Missing form")); + + Runnable editNameTextfieldCell = () -> { + var input = new EditTextfieldCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), textfieldCellId.get().toString(), "newName"); + var result = this.editTextfieldCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editTextfieldCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editNameConsumer = getEditNameConsumer(tableId, selectCellId); + + Runnable editPrioritySelectCell = () -> { + var input = new EditSelectCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), selectCellId.get().toString(), "P2"); + var result = this.editSelectCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editSelectCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editPriorityConsumer = getEditPriorityConsumer(tableId, multiSelectCellId); + + Runnable editDependenciesMultiSelectCell = () -> { + var input = new EditMultiSelectCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), multiSelectCellId.get().toString(), List.of("e6e8f081-27f5-40e3-a8ab-1e6f0f13df12", "e1c5bd66-54c2-45f1-ae3a-99d3f039affd")); + var result = this.editMultiSelectCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editMultiSelectCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editDependenciesConsumer = getEditDependenciesConsumer(tableId, checkboxCellId); + + Runnable editIsDoneCheckboxCell = () -> { + var input = new EditCheckboxCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), checkboxCellId.get().toString(), true); + var result = this.editCheckboxCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editCheckboxCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editIsDoneConsumer = getEditIsDoneConsumer(); + + StepVerifier.create(flux) + .consumeNextWith(initialFormContentConsumer) + .then(editNameTextfieldCell) + .consumeNextWith(editNameConsumer) + .then(editPrioritySelectCell) + .consumeNextWith(editPriorityConsumer) + .then(editDependenciesMultiSelectCell) + .consumeNextWith(editDependenciesConsumer) + .then(editIsDoneCheckboxCell) + .consumeNextWith(editIsDoneConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @NotNull + private Consumer getEditIsDoneConsumer() { + Consumer editIsDoneConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + assertThat(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Is Done").getId())).hasValue(true); + + }, () -> fail("Missing form")); + return editIsDoneConsumer; + } + + @NotNull + private Consumer getEditDependenciesConsumer(AtomicReference tableId, AtomicReference checkboxCellId) { + Consumer editDependenciesConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + checkboxCellId.set(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Is Done").getId()).getId()); + + assertThat(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId())).hasValues(List.of("e6e8f081-27f5-40e3-a8ab-1e6f0f13df12", "e1c5bd66-54c2-45f1-ae3a-99d3f039affd")); + + }, () -> fail("Missing form")); + return editDependenciesConsumer; + } + + @NotNull + private Consumer getEditPriorityConsumer(AtomicReference tableId, AtomicReference multiSelectCellId) { + Consumer editPriorityConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + multiSelectCellId.set(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId()).getId()); + + assertThat(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId())).hasValue("P2"); + + }, () -> fail("Missing form")); + return editPriorityConsumer; + } + + @NotNull + private Consumer getEditNameConsumer(AtomicReference tableId, AtomicReference selectCellId) { + Consumer editNameConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + selectCellId.set(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId()).getId()); + + assertThat(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId())).hasValue("newName"); + + }, () -> fail("Missing form")); + return editNameConsumer; + } + + private Table getTable(Form form) { + return new FormNavigator(form).page("Iteration Page").group("Iteration Group").findWidget("Tasks", TableWidget.class).getTable(); + } +} diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java new file mode 100644 index 0000000000..29e92f8e8e --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java @@ -0,0 +1,386 @@ +/******************************************************************************* + * 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.web.services.forms; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EDataType; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EEnumLiteral; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.EcorePackage; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; +import org.eclipse.emf.edit.provider.IItemPropertySource; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider; +import org.eclipse.sirius.components.core.api.IIdentityService; +import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.forms.WidgetIdProvider; +import org.eclipse.sirius.components.forms.description.FormDescription; +import org.eclipse.sirius.components.forms.description.GroupDescription; +import org.eclipse.sirius.components.forms.description.PageDescription; +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; +import org.eclipse.sirius.components.papaya.Iteration; +import org.eclipse.sirius.components.papaya.PapayaFactory; +import org.eclipse.sirius.components.papaya.PapayaPackage; +import org.eclipse.sirius.components.representations.Failure; +import org.eclipse.sirius.components.representations.GetOrCreateRandomIdProvider; +import org.eclipse.sirius.components.representations.IRepresentationDescription; +import org.eclipse.sirius.components.representations.IStatus; +import org.eclipse.sirius.components.representations.Success; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.tables.components.SelectCellComponent; +import org.eclipse.sirius.components.tables.descriptions.CellDescription; +import org.eclipse.sirius.components.tables.descriptions.ColumnDescription; +import org.eclipse.sirius.components.tables.descriptions.LineDescription; +import org.eclipse.sirius.components.tables.descriptions.TableDescription; +import org.eclipse.sirius.components.tables.elements.CheckboxCellElementProps; +import org.eclipse.sirius.components.tables.elements.MultiSelectCellElementProps; +import org.eclipse.sirius.components.tables.elements.SelectCellElementProps; +import org.eclipse.sirius.components.tables.elements.TextfieldCellElementProps; +import org.springframework.stereotype.Service; + +/** + * This class is used to provide the description for the project management concepts. + * + * @author lfasani + */ +@Service +public class FormWithTableEditingContextDescriptionProvider implements IEditingContextRepresentationDescriptionProvider { + + public static final String TASK_FORM_ID = "taskFormDescription"; + + private final ComposedAdapterFactory composedAdapterFactory; + + private final IIdentityService identityService; + + private final IObjectService objectService; + + public FormWithTableEditingContextDescriptionProvider(ComposedAdapterFactory composedAdapterFactory, IIdentityService identityService, IObjectService objectService) { + this.identityService = Objects.requireNonNull(identityService); + this.objectService = Objects.requireNonNull(objectService); + this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); + } + + @Override + public List getRepresentationDescriptions(IEditingContext editingContext) { + + TableWidgetDescription tableWidgetDescription = getTableWidgetDescription(); + + GroupDescription taskGroup = GroupDescription.newGroupDescription("iterationGroupId") + .idProvider(variableManager -> "iterationGroupId") + .labelProvider(variableManager -> "Iteration Group") + .semanticElementsProvider(variableManager -> Collections.singletonList(variableManager.getVariables().get(VariableManager.SELF))) + .controlDescriptions(List.of(tableWidgetDescription)) + .build(); + + PageDescription pageDescription = PageDescription.newPageDescription("iterationPageId") + .idProvider(variableManager -> "iterationPageId") + .labelProvider(variableManager -> "Iteration Page") + .semanticElementsProvider(variableManager -> Collections.singletonList(variableManager.getVariables().get(VariableManager.SELF))) + .groupDescriptions(List.of(taskGroup)) + .canCreatePredicate(variableManager -> true) + .build(); + + FormDescription formDescription = FormDescription.newFormDescription(TASK_FORM_ID) + .label("Iteration form description") + .idProvider(new GetOrCreateRandomIdProvider()) + .labelProvider(variableManager -> "Iteration Form") + .targetObjectIdProvider(this::getTargetObjectId) + .canCreatePredicate(this::canCreate) + .pageDescriptions(List.of(pageDescription)) + .build(); + return List.of(formDescription); + } + + private TableWidgetDescription getTableWidgetDescription() { + Function> semanticElementsProvider = variableManager -> variableManager.get(VariableManager.SELF, Iteration.class) + .map(eObject -> { + List objects = new ArrayList<>(); + objects.addAll(eObject.getTasks()); + return objects; + }) + .orElse(List.of()); + + Function labelProvider = variableManager -> variableManager.get(VariableManager.SELF, Object.class) + .map(this.objectService::getLabel) + .orElse(null); + + List lineDescriptions = new ArrayList<>(); + LineDescription lineDescription = LineDescription.newLineDescription(UUID.nameUUIDFromBytes("Table - Line".getBytes())) + .targetObjectIdProvider(this::getTargetObjectId) + .targetObjectKindProvider(this::getTargetObjectKind) + .semanticElementsProvider(semanticElementsProvider) + .build(); + lineDescriptions.add(lineDescription); + + TableDescription tableDescription = TableDescription.newTableDescription("tasksTableId") + .targetObjectIdProvider(this::getTargetObjectId) + .targetObjectKindProvider(this::getTargetObjectKind) + .labelProvider(labelProvider) + .lineDescriptions(lineDescriptions) + .columnDescriptions(getColumnDescriptions()) + .cellDescription(getCellDescription()) + .build(); + + return TableWidgetDescription.newTableWidgetDescription("tasksTableWidgetId") + .idProvider(new WidgetIdProvider()) + .labelProvider(variableManager -> "Tasks") + .targetObjectIdProvider(this::getTargetObjectId) + .diagnosticsProvider(variableManager -> List.of()) + .kindProvider(object -> "") + .messageProvider(object -> "") + .tableDescription(tableDescription) + .build(); + } + + private CellDescription getCellDescription() { + return CellDescription.newCellDescription("cells") + .targetObjectIdProvider(vm-> "") + .targetObjectKindProvider(vm-> "") + .cellTypeProvider(this.getCellTypeProvider()) + .cellValueProvider(this.getCellValueProvider()) + .cellOptionsIdProvider(this.getCellOptionsIdProvider()) + .cellOptionsLabelProvider(this.getCellOptionsLabelProvider()) + .cellOptionsProvider(this.getCellOptionsProvider()) + .newCellValueHandler(getNewCellValueHandler()) + .build(); + } + + private String getTargetObjectId(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, Object.class) + .map(this.identityService::getId) + .orElse(null); + } + + private String getTargetObjectKind(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, Object.class) + .map(this.identityService::getKind) + .orElse(null); + } + + private boolean canCreate(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, EObject.class) + .filter(Iteration.class::isInstance) + .isPresent(); + } + + private List getColumnDescriptions() { + Map featureToDisplayName = this.getColumnsStructuralFeaturesDisplayName(PapayaFactory.eINSTANCE.createTask(), PapayaPackage.eINSTANCE.getTask()); + + ColumnDescription columnDescription = ColumnDescription.newColumnDescription(UUID.nameUUIDFromBytes("features".getBytes())) + .semanticElementsProvider(vm -> featureToDisplayName.keySet().stream().map(Object.class::cast).toList()) + .labelProvider(vm -> vm.get(VariableManager.SELF, EStructuralFeature.class).map(featureToDisplayName::get).orElse("")) + .targetObjectIdProvider(vm -> vm.get(VariableManager.SELF, EStructuralFeature.class).map(EStructuralFeature::getName).orElse("")) + .targetObjectKindProvider(vm -> "") + .build(); + return List.of(columnDescription); + } + + private BiFunction getCellValueProvider() { + return (variableManager, columnTargetObject) -> { + Object value = ""; + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EObject eObject = optionalEObject.get(); + Object objectValue = eObject.eGet(eStructuralFeature); + if (eStructuralFeature instanceof EReference) { + EReference eReference = (EReference) eStructuralFeature; + if (eReference.isMany() && !eReference.isContainment() && objectValue instanceof EList) { + value = ((EList) objectValue).stream().map(this.objectService::getId).collect(Collectors.toList()); + } else if (!eReference.isMany() && !eReference.isContainment()) { + value = this.objectService.getId(objectValue); + } + } else if (objectValue != null) { + value = objectValue.toString(); + } + } + return value; + }; + } + + private BiFunction getCellTypeProvider() { + return (variableManager, columnTargetObject) -> { + String type = ""; + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EClassifier eType = eStructuralFeature.getEType(); + if (eStructuralFeature instanceof EAttribute) { + if (EcorePackage.Literals.EBOOLEAN.equals(eType) || EcorePackage.Literals.EBOOLEAN_OBJECT.equals(eType)) { + type = CheckboxCellElementProps.TYPE; + } else if (eType instanceof EEnum) { + type = SelectCellElementProps.TYPE; + } + } else { + EReference eReference = (EReference) eStructuralFeature; + if (eReference.isMany() && !eReference.isContainment()) { + type = MultiSelectCellElementProps.TYPE; + } + if (!eReference.isMany() && !eReference.isContainment()) { + type = SelectCellElementProps.TYPE; + } + } + if (type.isEmpty()) { + type = TextfieldCellElementProps.TYPE; + } + } + return type; + }; + } + + private Function getCellOptionsIdProvider() { + return variableManager -> { + Object candidate = variableManager.getVariables().get(SelectCellComponent.CANDIDATE_VARIABLE); + if (candidate instanceof EEnumLiteral) { + return this.objectService.getLabel(candidate); + } + return this.objectService.getId(candidate); + }; + } + + private Function getCellOptionsLabelProvider() { + return variableManager -> { + Object candidate = variableManager.getVariables().get(SelectCellComponent.CANDIDATE_VARIABLE); + if (candidate instanceof EEnumLiteral) { + return this.objectService.getLabel(candidate); + } + return this.objectService.getFullLabel(candidate); + }; + } + + private BiFunction> getCellOptionsProvider() { + return (variableManager, columnTargetObject) -> { + List options = new ArrayList<>(); + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EObject eObject = optionalEObject.get(); + EClassifier eType = eStructuralFeature.getEType(); + if (eType instanceof EEnum) { + options.addAll(((EEnum) eType).getELiterals()); + } else { + Object adapter = this.composedAdapterFactory.adapt(eObject, IItemPropertySource.class); + if (adapter instanceof IItemPropertySource) { + IItemPropertySource itemPropertySource = (IItemPropertySource) adapter; + IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(eObject, eStructuralFeature); + if (descriptor != null) { + List choiceOfValues = descriptor.getChoiceOfValues(eObject).stream() + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return choiceOfValues; + } + } + } + } + return options; + }; + } + + private Map getColumnsStructuralFeaturesDisplayName(EObject eObject, EClass eClass) { + Map featureToDisplayName = new LinkedHashMap<>(); + EList eAllStructuralFeatures = eClass.getEAllStructuralFeatures(); + for (EStructuralFeature eSF : eAllStructuralFeatures) { + if (eSF instanceof EAttribute && !eSF.isMany() && !eSF.isDerived()) { + featureToDisplayName.put(eSF, this.getDisplayName(eObject, eSF)); + } else if (eSF instanceof EReference ref && !eSF.isDerived() && !ref.isContainment()) { + featureToDisplayName.put(eSF, this.getDisplayName(eObject, eSF)); + } + } + return featureToDisplayName; + } + + private String getDisplayName(EObject eObject, EStructuralFeature eStructuralFeature) { + Adapter adapter = this.composedAdapterFactory.adapt(eObject, IItemPropertySource.class); + if (adapter instanceof IItemPropertySource) { + IItemPropertySource itemPropertySource = (IItemPropertySource) adapter; + IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(eObject, eStructuralFeature); + if (descriptor != null) { + String displayName = descriptor.getDisplayName(eStructuralFeature); + return displayName; + } + } + return eStructuralFeature.getName(); + } + + private BiFunction getNewCellValueHandler() { + BiFunction newCellValueHandler = (variableManager, newValue) -> { + IStatus status = new Failure(""); + var optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); + var optionalFeatureName = variableManager.get(ColumnDescription.COLUMN_TARGET_OBJECT_ID, String.class); + if (optionalEObject.isPresent() && optionalFeatureName.isPresent()) { + EObject eObject = optionalEObject.get(); + String featureName = optionalFeatureName.get(); + EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName); + if (eStructuralFeature != null) { + EClassifier eType = eStructuralFeature.getEType(); + if (eStructuralFeature.isMany() && eType instanceof EClass && newValue instanceof Collection) { + EList refElements = (EList) eObject.eGet(eStructuralFeature); + List newValuesToSet = new ArrayList<>(); + List newValues = ((Collection) newValue).stream().map(elt -> elt.toString()).collect(Collectors.toList()); + for (String newStringValue : newValues) { + var optionalNewValueToSet = this.objectService.getObject(optionalEditingContext.get(), newStringValue); + if (optionalNewValueToSet.isEmpty()) { + continue; + } + EObject newValueToSet = (EObject) optionalNewValueToSet.get(); + newValuesToSet.add(newValueToSet); + try { + if (!refElements.contains(newValueToSet)) { + refElements.add(newValueToSet); + } + } catch (IllegalArgumentException | ClassCastException | ArrayStoreException exception) { + return new Failure(""); + } + } + refElements.removeIf(refElt -> !newValuesToSet.contains(refElt)); + } else if (!eStructuralFeature.isMany() && eType instanceof EClass && newValue instanceof String newStringValue) { + var optionalNewValueToSet = this.objectService.getObject(optionalEditingContext.get(), newStringValue); + if (optionalNewValueToSet.isPresent()) { + eObject.eSet(eStructuralFeature, optionalNewValueToSet.get()); + } + } else if (eType instanceof EEnum && newValue instanceof String) { + EEnumLiteral eEnumLiteral = ((EEnum) eType).getEEnumLiteral((String) newValue); + eObject.eSet(eStructuralFeature, eEnumLiteral.getInstance()); + } else if (eType instanceof EDataType) { + String newValueAsString = EcoreUtil.convertToString((EDataType) eStructuralFeature.getEType(), newValue); + Object value = EcoreUtil.createFromString((EDataType) eStructuralFeature.getEType(), newValueAsString); + eObject.eSet(eStructuralFeature, value); + } + status = new Success(); + } + } + return status; + }; + return newCellValueHandler; + } +} diff --git a/packages/sirius-web/frontend/sirius-web-application/package.json b/packages/sirius-web/frontend/sirius-web-application/package.json index 019d11dd8c..f8c9c7152c 100644 --- a/packages/sirius-web/frontend/sirius-web-application/package.json +++ b/packages/sirius-web/frontend/sirius-web-application/package.json @@ -39,13 +39,16 @@ "@eclipse-sirius/sirius-components-selection": "*", "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-components-validation": "*", "@mui/icons-material": "5.15.19", "@mui/material": "5.15.19", "@xstate/react": "3.0.0", + "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", @@ -63,6 +66,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": "*", @@ -70,8 +74,10 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "jest-junit-reporter": "1.1.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "prettier": "2.7.1", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/sirius-web/frontend/sirius-web-papaya/package.json b/packages/sirius-web/frontend/sirius-web-papaya/package.json index a6043f2d66..48f66f40f7 100644 --- a/packages/sirius-web/frontend/sirius-web-papaya/package.json +++ b/packages/sirius-web/frontend/sirius-web-papaya/package.json @@ -38,13 +38,16 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-deck": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-web-application": "*", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", + "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", @@ -63,6 +66,7 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-deck": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@eclipse-sirius/sirius-web-application": "*", @@ -70,8 +74,10 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "jest-junit-reporter": "1.1.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "prettier": "2.7.1", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/sirius-web/frontend/sirius-web/package.json b/packages/sirius-web/frontend/sirius-web/package.json index 4c419bc76b..b2489e3ec0 100644 --- a/packages/sirius-web/frontend/sirius-web/package.json +++ b/packages/sirius-web/frontend/sirius-web/package.json @@ -23,6 +23,7 @@ "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-components-selection": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-validation": "*", "@eclipse-sirius/sirius-web-application": "*", @@ -34,10 +35,12 @@ "@xstate/react": "3.0.0", "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", "notistack": "3.0.1", + "material-react-table": "2.13.3", "pathfinding": "0.4.18", "prop-types": "15.8.1", "react": "18.3.1", diff --git a/packages/tables/backend/pom.xml b/packages/tables/backend/pom.xml new file mode 100644 index 0000000000..ee0889e8ea --- /dev/null +++ b/packages/tables/backend/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + org.eclipse.sirius + sirius-components-tables-parent + 2024.9.8 + + sirius-components-tables-parent + Sirius Components Tables Parent + pom + + + + github + Apache Maven Packages + https://maven.pkg.github.com/eclipse-sirius/sirius-web + + + + + sirius-components-tables + sirius-components-collaborative-tables + sirius-components-tables-graphql + sirius-components-tables-tests + + \ No newline at end of file diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle b/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle new file mode 100644 index 0000000000..f62c550f18 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.classpath b/packages/tables/backend/sirius-components-collaborative-tables/.classpath new file mode 100644 index 0000000000..f9e5560b99 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.classpath @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.project b/packages/tables/backend/sirius-components-collaborative-tables/.project new file mode 100644 index 0000000000..cde1aa9764 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.project @@ -0,0 +1,34 @@ + + + sirius-components-collaborative-tables + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + net.sf.eclipsecs.core.CheckstyleNature + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..839d647eef --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000..a287fefdba --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +#Mon Sep 24 15:04:19 CEST 2007 +eclipse.preferences.version=1 +line.separator=\n diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000000..d4313d4b25 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..2ab93cd0a5 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,505 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=0 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assertion_message=0 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_record_components=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=1 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=200 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.text_block_indentation=0 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000000..f789e687ad --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,210 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=false +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=true +cleanup.always_use_this_for_non_static_method_access=true +cleanup.convert_functional_interfaces=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.insert_inferred_type_arguments=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=true +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=false +cleanup.qualify_static_method_accesses_with_declaring_class=true +cleanup.remove_private_constructors=true +cleanup.remove_redundant_modifiers=false +cleanup.remove_redundant_semicolons=false +cleanup.remove_redundant_type_arguments=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_anonymous_class_creation=false +cleanup.use_blocks=false +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_lambda=true +cleanup.use_parentheses_in_expressions=false +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=false +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=false +cleanup_profile=_Sirius +cleanup_settings_version=2 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Sirius +formatter_settings_version=21 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com;fr;java;javax;org; +org.eclipse.jdt.ui.javadoc=true +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=