diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 94a0cb1c39..002b078c34 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,6 +14,7 @@ "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", "@tanstack/svelte-table": "^8.7.6", + "ag-grid-svelte": "^0.1.4", "async-mutex": "^0.4.0", "chart.js": "^3.9.1", "chartjs-adapter-date-fns": "^3.0.0", @@ -1357,6 +1358,23 @@ "node": ">=0.4.0" } }, + "node_modules/ag-grid-community": { + "version": "28.2.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-28.2.1.tgz", + "integrity": "sha512-DMZh/xD/FqYP17qJ1M92PolTYe+hrKuEaf+A4h13O6qn2x/xZQrTRGW5DgnQLR/uLMe1XXZQPKR3UKgAlKo69A==", + "peer": true + }, + "node_modules/ag-grid-svelte": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/ag-grid-svelte/-/ag-grid-svelte-0.1.4.tgz", + "integrity": "sha512-yKJKZ1o3aE9dgaK4WtmjG+vA9GKqErznvFisDnzi+PPGWXDCSNWuoDGCUpEFJtHKrfooLoUZZHYHi8I9sZ+BCA==", + "dependencies": { + "svelte": "^3.55.0" + }, + "peerDependencies": { + "ag-grid-community": "^28" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7980,6 +7998,20 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, + "ag-grid-community": { + "version": "28.2.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-28.2.1.tgz", + "integrity": "sha512-DMZh/xD/FqYP17qJ1M92PolTYe+hrKuEaf+A4h13O6qn2x/xZQrTRGW5DgnQLR/uLMe1XXZQPKR3UKgAlKo69A==", + "peer": true + }, + "ag-grid-svelte": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/ag-grid-svelte/-/ag-grid-svelte-0.1.4.tgz", + "integrity": "sha512-yKJKZ1o3aE9dgaK4WtmjG+vA9GKqErznvFisDnzi+PPGWXDCSNWuoDGCUpEFJtHKrfooLoUZZHYHi8I9sZ+BCA==", + "requires": { + "svelte": "^3.55.0" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", diff --git a/frontend/package.json b/frontend/package.json index a730c6c0a8..913b1159a6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,6 +66,7 @@ "@popperjs/core": "^2.11.6", "@redocly/json-to-json-schema": "^0.0.1", "@tanstack/svelte-table": "^8.7.6", + "ag-grid-svelte": "^0.1.4", "async-mutex": "^0.4.0", "chart.js": "^3.9.1", "chartjs-adapter-date-fns": "^3.0.0", diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte new file mode 100644 index 0000000000..11b6d0b201 --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridTable.svelte @@ -0,0 +1,110 @@ + + + + + + + {#if Array.isArray(result) && result.every(isObject)} +
+
{ + $selectedComponent = id + }} + style:height="{clientHeight}px" + style:width="{clientWidth}px" + class="ag-theme-alpine" + > + +
+
+ {:else if result != undefined} + + The result should be an array of objects + + {/if} +
diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index aa1df588a7..d3642b7213 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -35,6 +35,7 @@ AppContainer } from '../../components' import type { AppComponent } from './components' + import AppAggridTable from '../../components/display/table/AppAggridTable.svelte' export let component: AppComponent export let selected: boolean @@ -143,6 +144,13 @@ bind:componentInput={component.componentInput} bind:actionButtons={component.actionButtons} /> + {:else if component.type === 'aggridcomponent'} + {:else if component.type === 'textcomponent'} export type TableComponent = BaseComponent<'tablecomponent'> & { actionButtons: (BaseAppComponent & ButtonComponent)[] } +export type AggridComponent = BaseComponent<'aggridcomponent'> export type DisplayComponent = BaseComponent<'displaycomponent'> export type ImageComponent = BaseComponent<'imagecomponent'> export type InputComponent = BaseComponent<'inputcomponent'> @@ -110,6 +111,7 @@ export type AppComponent = BaseAppComponent & | VerticalDividerComponent | FileInputComponent | ImageComponent + | AggridComponent ) export type AppComponentDimensions = `${IntRange< @@ -694,6 +696,48 @@ Hello \${ctx.username} actionButtons: [] } }, + aggridcomponent: { + name: 'AgGrid Table', + icon: Table2, + dims: '3:10-6:10', + data: { + id: '', + type: 'aggridcomponent', + configuration: { + columnDefs: { + type: 'static', + fieldType: 'array', + subFieldType: 'object', + value: [{ field: 'id' }, { field: 'name', editable: true }, { field: 'age' }] + }, + allEditable: { + type: 'static', + fieldType: 'boolean', + value: false, + onlyStatic: true + } + }, + componentInput: { + type: 'static', + fieldType: 'array', + subFieldType: 'object', + value: [ + { + id: 1, + name: 'A cell with a long name', + age: 42 + }, + { + id: 2, + name: 'A briefer cell', + age: 84 + } + ] + }, + customCss: {}, + card: true, + } + }, checkboxcomponent: { name: 'Toggle', icon: ToggleLeft, diff --git a/frontend/src/lib/components/apps/editor/component/sets.ts b/frontend/src/lib/components/apps/editor/component/sets.ts index 638fc63cc9..6944eeb852 100644 --- a/frontend/src/lib/components/apps/editor/component/sets.ts +++ b/frontend/src/lib/components/apps/editor/component/sets.ts @@ -39,6 +39,7 @@ const display: ComponentSet = { 'imagecomponent', 'htmlcomponent', 'tablecomponent', + 'aggridcomponent', 'barchartcomponent', 'piechartcomponent', 'vegalitecomponent',