diff --git a/BExIS++.lutconfig b/BExIS++.lutconfig new file mode 100644 index 0000000000..7d8c768bd0 --- /dev/null +++ b/BExIS++.lutconfig @@ -0,0 +1,6 @@ + + + true + true + 180000 + \ No newline at end of file diff --git a/BExIS++.sln b/BExIS++.sln index ec080ceb21..0e2a080257 100644 --- a/BExIS++.sln +++ b/BExIS++.sln @@ -234,6 +234,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SMM", "SMM", "{02EA681E-C7D EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BExIS.Modules.SMM.UI", "Console\BExIS.Web.Shell\Areas\SMM\BExIS.Modules.SMM.UI\BExIS.Modules.SMM.UI.csproj", "{37402CAB-EB81-4D08-8791-8653949C0FEB}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PUM", "PUM", "{96384857-88D4-4282-8EFD-FE8FCB0319B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BExIS.Modules.PUM.UI", "Console\BExIS.Web.Shell\Areas\PUM\BExIS.Modules.PUM.UI\BExIS.Modules.PUM.UI.csproj", "{C1AE3004-853A-4CCF-9099-AE919C6121C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1508,6 +1512,24 @@ Global {37402CAB-EB81-4D08-8791-8653949C0FEB}.TestServerRelease|Mixed Platforms.Build.0 = TestServerRelease|Any CPU {37402CAB-EB81-4D08-8791-8653949C0FEB}.TestServerRelease|x86.ActiveCfg = TestServerRelease|Any CPU {37402CAB-EB81-4D08-8791-8653949C0FEB}.TestServerRelease|x86.Build.0 = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Debug|x86.Build.0 = Debug|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|Any CPU.Build.0 = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|x86.ActiveCfg = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.Release|x86.Build.0 = Release|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|Any CPU.ActiveCfg = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|Any CPU.Build.0 = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|Mixed Platforms.ActiveCfg = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|Mixed Platforms.Build.0 = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|x86.ActiveCfg = TestServerRelease|Any CPU + {C1AE3004-853A-4CCF-9099-AE919C6121C8}.TestServerRelease|x86.Build.0 = TestServerRelease|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1604,10 +1626,12 @@ Global {9BFFFD11-03C6-47DF-9CC9-F458A9A49377} = {F3354AC7-CDA1-44E2-8E85-8DB532ED8C75} {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {692AFF14-3A57-47D8-912F-093EC8F561C4} {37402CAB-EB81-4D08-8791-8653949C0FEB} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {96384857-88D4-4282-8EFD-FE8FCB0319B7} = {692AFF14-3A57-47D8-912F-093EC8F561C4} + {C1AE3004-853A-4CCF-9099-AE919C6121C8} = {96384857-88D4-4282-8EFD-FE8FCB0319B7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35;packages\Unity.2.1.505.2\lib\NET35 SolutionGuid = {9B6E4921-8EBA-487D-A098-3E473A0EAC64} + EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35;packages\Unity.2.1.505.2\lib\NET35 EndGlobalSection GlobalSection(SubversionScc) = preSolution Svn-Managed = True diff --git a/Components/DLM/BExIS.Dlm.Entities/Data/VariableValue.cs b/Components/DLM/BExIS.Dlm.Entities/Data/VariableValue.cs index addadf9251..b24aa759fc 100644 --- a/Components/DLM/BExIS.Dlm.Entities/Data/VariableValue.cs +++ b/Components/DLM/BExIS.Dlm.Entities/Data/VariableValue.cs @@ -61,7 +61,7 @@ public VariableInstance Variable { get { - if (this.Tuple.DatasetVersion.Dataset.DataStructure.Self is StructuredDataStructure) + if (this.Tuple.DatasetVersion.Dataset.DataStructure != null) { VariableInstance u = (this.Tuple.DatasetVersion.Dataset.DataStructure.Self as StructuredDataStructure).Variables .Where(p => p.Id.Equals(this.VariableId)) diff --git a/Components/DLM/BExIS.Dlm.Services/Data/DatasetManager.cs b/Components/DLM/BExIS.Dlm.Services/Data/DatasetManager.cs index b6c97a60d3..a4335230b7 100644 --- a/Components/DLM/BExIS.Dlm.Services/Data/DatasetManager.cs +++ b/Components/DLM/BExIS.Dlm.Services/Data/DatasetManager.cs @@ -1254,7 +1254,7 @@ public DataTable GetLatestDatasetVersionTuples(long datasetId, int pageNumber, i // should use the fallback method, but DatasetConvertor class must be merged with OutputDataManager and SearchUIHelper claases first. var version = this.GetDatasetLatestVersion(datasetId); var tuples = getDatasetVersionEffectiveTuples(version, pageNumber, pageSize, false); // the false, causes the method to use a scoped sesssion and keep it alive further processings that aredone later on the tuples - if (version.Dataset.DataStructure.Self is StructuredDataStructure) + if (version.Dataset.DataStructure!=null) { DataTable table = convertDataTuplesToDataTable(tuples, version, (StructuredDataStructure)version.Dataset.DataStructure.Self); return table; @@ -1268,7 +1268,7 @@ public DataTable GetDatasetVersionTuples(long versionId, int pageNumber, int pag // should use the fallback method, but DatasetConvertor class must be merged with OutputDataManager and SearchUIHelper claases first. var version = this.GetDatasetVersion(versionId); var tuples = getDatasetVersionEffectiveTuples(version, pageNumber, pageSize, false); // the false, causes the method to use a scoped sesssion and keep it alive further processings that aredone later on the tuples - if (version.Dataset.DataStructure.Self is StructuredDataStructure) + if (version.Dataset.DataStructure != null) { DataTable table = convertDataTuplesToDataTable(tuples, version, (StructuredDataStructure)version.Dataset.DataStructure.Self); return table; @@ -3361,7 +3361,7 @@ private void createMaterializedView(long datasetId) { var datasetRepo = uow.GetReadOnlyRepository(); Dataset ds = datasetRepo.Get(datasetId); - if (ds.DataStructure != null && ds.DataStructure.Self is StructuredDataStructure) + if (ds.DataStructure != null && ds.DataStructure!= null) { StructuredDataStructure sds = (StructuredDataStructure)ds.DataStructure.Self; if (sds.Variables != null && sds.Variables.Count() > 0) diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package-lock.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package-lock.json index f27357edfd..0e1aca7615 100644 --- a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package-lock.json +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package-lock.json @@ -16,11 +16,13 @@ "@fortawesome/free-solid-svg-icons": "6.6.0", "@sveltejs/adapter-static": "3.0.2", "@sveltejs/package": "2.3.2", + "@xyflow/svelte": "^0.1.36", "patch-package": "8.0.0", "svelte-adapter-github": "1.0.0-next.0", "svelte-fa": "4.0.2", "svelte-headless-table": "0.18.2", "svelte-select": "5.8.3", + "svelty-picker": "^5.2.11", "vest": "5.4.0" }, "devDependencies": { @@ -1273,6 +1275,15 @@ "tailwindcss": ">=3.0.0" } }, + "node_modules/@svelte-put/shortcut": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-3.1.1.tgz", + "integrity": "sha512-2L5EYTZXiaKvbEelVkg5znxqvfZGZai3m97+cAiUBhLZwXnGtviTDpHxOoZBsqz41szlfRMcamW/8o0+fbW3ZQ==", + "license": "MIT", + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/@sveltejs/adapter-auto": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.2.tgz", @@ -1439,6 +1450,55 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -1747,6 +1807,35 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@xyflow/svelte": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-0.1.39.tgz", + "integrity": "sha512-QZ5mzNysvJeJW7DxmqI4Urhhef9tclqtPr7WAS5zQF5Gk6k9INwzey4CYNtEZo8XMj9H8lzgoJRmgMPnJEc1kw==", + "license": "MIT", + "dependencies": { + "@svelte-put/shortcut": "3.1.1", + "@xyflow/system": "0.0.59", + "classcat": "^5.0.4" + }, + "peerDependencies": { + "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.59.tgz", + "integrity": "sha512-+xgqYhoBv5F10TQx0SiKZR/DcWtuxFYR+e/LluHb7DMtX4SsMDutZWEJ4da4fDco25jZxw5G9fOlmk7MWvYd5Q==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -2165,6 +2254,12 @@ "node": ">=8" } }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, "node_modules/code-red": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", @@ -2295,6 +2390,111 @@ "node": ">=4" } }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dateformat": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", @@ -4926,6 +5126,17 @@ "typescript": "^4.9.4 || ^5.0.0" } }, + "node_modules/svelty-picker": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/svelty-picker/-/svelty-picker-5.2.12.tgz", + "integrity": "sha512-w9mxlWEwMtypiDUZDp04HxmfOb9ujmJLQnyjBh8CQL+p6KiE1O7Kctffzo8BsbjR8TdwZGe4uDk/pXn1fe8jXQ==", + "dependencies": { + "@floating-ui/dom": "^1.4" + }, + "peerDependencies": { + "svelte": "^3.53.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/tailwindcss": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", @@ -6237,6 +6448,12 @@ "dev": true, "requires": {} }, + "@svelte-put/shortcut": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-3.1.1.tgz", + "integrity": "sha512-2L5EYTZXiaKvbEelVkg5znxqvfZGZai3m97+cAiUBhLZwXnGtviTDpHxOoZBsqz41szlfRMcamW/8o0+fbW3ZQ==", + "requires": {} + }, "@sveltejs/adapter-auto": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.2.tgz", @@ -6352,6 +6569,49 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, + "@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" + }, + "@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -6551,6 +6811,30 @@ "tinyrainbow": "^1.2.0" } }, + "@xyflow/svelte": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-0.1.39.tgz", + "integrity": "sha512-QZ5mzNysvJeJW7DxmqI4Urhhef9tclqtPr7WAS5zQF5Gk6k9INwzey4CYNtEZo8XMj9H8lzgoJRmgMPnJEc1kw==", + "requires": { + "@svelte-put/shortcut": "3.1.1", + "@xyflow/system": "0.0.59", + "classcat": "^5.0.4" + } + }, + "@xyflow/system": { + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.59.tgz", + "integrity": "sha512-+xgqYhoBv5F10TQx0SiKZR/DcWtuxFYR+e/LluHb7DMtX4SsMDutZWEJ4da4fDco25jZxw5G9fOlmk7MWvYd5Q==", + "requires": { + "@types/d3-drag": "^3.0.7", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -6822,6 +7106,11 @@ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==" }, + "classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" + }, "code-red": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", @@ -6923,6 +7212,72 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "dateformat": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-5.0.3.tgz", @@ -8742,6 +9097,14 @@ "pascal-case": "^3.1.1" } }, + "svelty-picker": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/svelty-picker/-/svelty-picker-5.2.12.tgz", + "integrity": "sha512-w9mxlWEwMtypiDUZDp04HxmfOb9ujmJLQnyjBh8CQL+p6KiE1O7Kctffzo8BsbjR8TdwZGe4uDk/pXn1fe8jXQ==", + "requires": { + "@floating-ui/dom": "^1.4" + } + }, "tailwindcss": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package.json index 7b69b1cec1..0fc8b844a9 100644 --- a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package.json +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/package.json @@ -56,11 +56,13 @@ "@fortawesome/free-solid-svg-icons": "6.6.0", "@sveltejs/adapter-static": "3.0.2", "@sveltejs/package": "2.3.2", + "@xyflow/svelte": "^0.1.36", "patch-package": "8.0.0", "svelte-adapter-github": "1.0.0-next.0", "svelte-fa": "4.0.2", "svelte-headless-table": "0.18.2", "svelte-select": "5.8.3", + "svelty-picker": "^5.2.11", "vest": "5.4.0" }, "author": "David Schöne", diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/DateRangePicker_0.1/component.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/DateRangePicker_0.1/component.svelte new file mode 100644 index 0000000000..81094a53a8 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/DateRangePicker_0.1/component.svelte @@ -0,0 +1,36 @@ + + + {label} + + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/componentCatalog.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/componentCatalog.ts new file mode 100644 index 0000000000..7f870a7a29 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/customComponents/componentCatalog.ts @@ -0,0 +1,6 @@ +import dateRangepicker from './DateRangePicker_0.1/component.svelte'; + +export const customComponentsCatalog: any = { + 'DateRangePicker_0.1': { + component: dateRangepicker} +}; \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/metadataComponentUtils.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/metadataComponentUtils.ts new file mode 100644 index 0000000000..2f5ff2a81f --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/metadataComponentUtils.ts @@ -0,0 +1,240 @@ +import exp from 'constants'; +import type { SimpleComponentData, validationStoretype } from './models'; +import { metadataStore, hideStore, validationStore, configStore } from './stores'; +// Utility functions for metadata handling +// Get and set values in the metadata store based on a dot-separated path +export function setMetadataStore(metadata: any) { + metadataStore.set(metadata); +} +// Get value from an object based on a dot-separated path +export function getValueBySchemaPath(path: string) { + let obj: any; + metadataStore.subscribe((v) => { + obj = v; + }); + return path.split('.').reduce((acc, part) => acc && acc[part], obj); +} + +export function getValueByPath(path: string) { + path = path + '.#text'; + return getValueBySchemaPath(path); +} +// Set value in an object based on a dot-separated path +export function setValueByPath(obj: any, path: string, value: any) { + const parts = path.split('.'); + let current = obj; + for (let i = 0; i < parts.length - 1; i++) { + if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') { + current[parts[i]] = {}; + } + current = current[parts[i]]; + } + current[parts[parts.length - 1]] = value; + return obj; +} +// Update metadata store with a new value at the specified path +export function updateMetadataStore(path: string, value: any):any { + let obj: any = {}; + if (path !== undefined && path !== null && path !== '') { + metadataStore.subscribe((v) => { + obj = v; + }); + { + if (value !== undefined && value !== null && value !== getValueByPath(path)) { + obj = setValueByPath(obj, path + '.#text', value); + if ( + obj !== undefined && + obj !== null && + obj !== + metadataStore.subscribe((value) => { + obj = value; + }) + ) { + metadataStore.set(obj); + } + } + } + } + return obj; +} +// Config Store Functions +// Set configuration data in the config store +export function setConfigStore(config: any) { + configStore.set(config); +} + +// Get configuration data from the config store +export function getConfigStore(): any { + let config: any; + configStore.subscribe((v) => { + config = v; + }); + return config; +} + +// Get anchor point for a given component name from the config store +// export function getAnchorFromConfig(componentName: string): string { +// if(componentName != null && componentName != undefined && componentName != ''){ +// let config: any = getConfigStore(); +// for (const component of config.components) { +// if (component.meta.component_name.toLowerCase() === componentName.toLowerCase() && component.globalSettings.anchorpoint === anchor) { +// return component.globalSettings.anchorpoint; +// } +// } +// } +// return ''; +// } + +export function getVariablesFromConfig(componentName: string, anchor: string): any[] { + let variables: any[] = []; + if(componentName != null && componentName != undefined && componentName != ''){ + let config: any = getConfigStore(); + for (const component of config.components) { + if (component.meta.component_name.toLowerCase() === componentName.toLowerCase() && component.globalSettings.anchorpoint === anchor) { + variables = component.mode.variables.variable; + } + } + } + return variables; +} + +export function getVariableSoursePathFromConfig(componentName: string, anchor: string, targetVariableName: string): string { + if(componentName != null && componentName != undefined && componentName != ''){ + let variables = getVariablesFromConfig(componentName, anchor); + for (const variable of variables) { + if (variable.target_variable === targetVariableName) { + console.log('Found variable:', variable.JSONPath); + return variable.JSONPath; + } + } + } +return ''; +} + +// Convert a schema node to a JSON object with default values +export function schemaToJson(schema: any): any { + if (!schema) return null; + + if (schema.type === 'object' && schema.properties) { + const obj: any = {}; + for (const [key, value] of Object.entries(schema.properties)) { + obj[key] = schemaToJson(value); + } + return obj; + } + if (schema.type === 'array' && schema.items) { + return [schemaToJson(schema.items)]; + } + // Standardwerte für primitive Typen + switch (schema.type) { + case 'string': + return ''; + case 'boolean': + return false; + case 'number': + return 0; + case 'int': + return 0; + case 'date': + return new Date().toISOString().split('T')[0]; + default: + return null; + } +} +// Toggle visibility of a metadata component based on its path +export function toggleShow(path: string) { + let hideStoreValue: string[] = []; + hideStore.subscribe((v) => { + hideStoreValue = [...v]; + })(); + + if (hideStoreValue.includes(path)) { + let idx = hideStoreValue.findIndex((x) => x == path); + if (idx > -1) hideStoreValue.splice(idx, 1); + } else { + hideStoreValue.push(path); + } + hideStore.set(hideStoreValue); + } +// Validation Store Functions +// Get current values from the validation store +// If undefined, initialize with default values +// and return the validation store values +export function getValidationStore(): validationStoretype { + let validationStoreValues: validationStoretype = { allSimpleRequiredValid: false, simpleTypeValidationItems: [] }; + validationStore.subscribe(n => { + validationStoreValues = n; + }); + if(validationStoreValues == undefined) { + clearValidationStore(); + } + return validationStoreValues; + } + +export function clearValidationStore(): void { + validationStore.set({ allSimpleRequiredValid: false, simpleTypeValidationItems: [] }); +} +// Add a simple component's validation data to the validation store +// if it doesn't already exist +// and has relevant validation criteria +// Returns the updated validation store values +export function ValidationStoreAddSimpleComponent(item: SimpleComponentData): validationStoretype { + let validationStoreValues: validationStoretype = getValidationStore(); + if( validationStoreValues.simpleTypeValidationItems.find(i => i.path === item.path) === undefined && (item.required || item.regex !== undefined || item.lowerBound !== undefined || item.upperBound !== undefined || (item.domainList && item.domainList.length > 0)) ) { + validationStoreValues.simpleTypeValidationItems.push(item); + validationStore.set(validationStoreValues); + } + return validationStoreValues; + } +// Set overall validity for all simple required components in the validation store +// based on the validity of an individual component identified by its path +// Returns the updated validity of the specified component +export function ValidationStoreSetSimpleTypeValid(path:string, isValid: boolean): boolean { + let valid :boolean = false; + let validationStoreValues: validationStoretype = getValidationStore(); + if(isValid && isValid != null && isValid != undefined){ + validationStoreValues.simpleTypeValidationItems.find(item => item.path === path)!.isValid = isValid; + valid = validationStoreValues.simpleTypeValidationItems.find(item => item.path === path)!.isValid; + } + validationStoreValues.allSimpleRequiredValid = true; + for (const item of validationStoreValues.simpleTypeValidationItems) { + if (!item.isValid && item.required) { + validationStoreValues.allSimpleRequiredValid = false; + break; + } + } + validationStore.set(validationStoreValues); + return valid; + } +// Create a SimpleComponentData validation item +// based on the provided parameters and simple component properties +export function createSimpleComponentValidationItem(path: string,label: string, required: boolean, simpleComponent: any): SimpleComponentData { + let simpleComponentValidationItem: SimpleComponentData = {label: label,path: path, required: required , isValid: false}; + + // set regex if defined + if(simpleComponent.properties['#text'].pattern && simpleComponent.properties['#text'].pattern != undefined && simpleComponent.properties['#text'].pattern != null && simpleComponent.properties['#text'].pattern != '') { + simpleComponentValidationItem.regex = simpleComponent.properties['#text'].pattern; + } + // set minLength if defined + if(simpleComponent.properties['#text'].minLength && simpleComponent.properties['#text'].minLength != undefined && simpleComponent.properties['#text'].minLength != null && simpleComponent.properties['#text'].minLength != '') { + simpleComponentValidationItem.minLength = simpleComponent.properties['#text'].minLength; + } + // set maxLength if defined + if(simpleComponent.properties['#text'].maxLength && simpleComponent.properties['#text'].maxLength != undefined && simpleComponent.properties['#text'].maxLength != null && simpleComponent.properties['#text'].maxLength != '') { + simpleComponentValidationItem.maxLength = simpleComponent.properties['#text'].maxLength; + } + // set domainList if defined + if(simpleComponent.properties['#text'].domainList && simpleComponent.properties['#text'].domainList != undefined && simpleComponent.properties['#text'].domainList != null && simpleComponent.properties['#text'].domainList.length > 0) { + simpleComponentValidationItem.domainList = simpleComponent.properties['#text'].domainList; + } + // set lowerBound if defined + if(simpleComponent.properties['#text'].lowerBound && simpleComponent.properties['#text'].lowerBound != undefined && simpleComponent.properties['#text'].lowerBound != null && simpleComponent.properties['#text'].lowerBound.length != '') { + simpleComponentValidationItem.lowerBound = simpleComponent.properties['#text'].lowerBound; + } + // set upperBound if defined + if(simpleComponent.properties['#text'].upperBound && simpleComponent.properties['#text'].upperBound != undefined && simpleComponent.properties['#text'].upperBound != null && simpleComponent.properties['#text'].upperBound.length != '') { + simpleComponentValidationItem.upperBound = simpleComponent.properties['#text'].upperBound; + } + + return simpleComponentValidationItem; +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/models.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/models.ts new file mode 100644 index 0000000000..c97bc8035e --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/models.ts @@ -0,0 +1,29 @@ +export interface schemaNode { + title: string; + description: string; + type: string; + properties: scheemaNode[]; +} + +export interface validationStoretype { + allSimpleRequiredValid: boolean; + simpleTypeValidationItems: SimpleComponentData[]; +} + +export interface SimpleComponentData { + path: string; + label: string; + required: boolean; + regex?: string; + lowerBound?: number; + upperBound?: number; + domainList?: string[]; + minLength?: number; + maxLength?: number; + isValid: boolean; +} + +export interface ComplexComponentData { + complexComponent: any; + label: string; +} diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/stores.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/stores.ts new file mode 100644 index 0000000000..fc1bb469ed --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/lib/components/utils/metadata/stores.ts @@ -0,0 +1,10 @@ +import { writable } from 'svelte/store'; +import type { validationStoretype } from './models'; + +export const metadataStore = writable(); + +export const configStore = writable(); + +export const hideStore = writable([]); + +export const validationStore = writable(); diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+layout.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+layout.ts index 27bdc0a6ff..4fc7a6911d 100644 --- a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+layout.ts +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+layout.ts @@ -3,7 +3,8 @@ import { setApiConfig } from '@bexis2/bexis2-core-ui'; /** @type {import('./$types').PageLoad} */ export async function load({ fetch }) { if (import.meta.env.DEV) { - setApiConfig('http://localhost:44345', 'admin', '123456'); + // setApiConfig('http://mv-bexis.bioimbgle.uni-jena.de/', 'majoho', 'Mjh271181#'); + setApiConfig('https://rc.bexis2.uni-jena.de/', 'admin', '123456'); } return {}; diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+page.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+page.svelte index 1757c5d0b9..ffd9e9968b 100644 --- a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+page.svelte +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/+page.svelte @@ -18,5 +18,7 @@ create edit view + Component Configuration + metadata diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/+page.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/+page.svelte new file mode 100644 index 0000000000..1091371937 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/+page.svelte @@ -0,0 +1,2549 @@ + + + + +
+
+
+ Data Configuration Project +
+ +
+ + +
+
+ +
+
+ + + + + + + +
+ + +
+
+ +{#if showModeChangeWarning} + +{/if} + + +{#if showCancelWarning} + +{/if} + + +{#if showDeleteWarning} + +{/if} + + + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ButtonEdge.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ButtonEdge.svelte new file mode 100644 index 0000000000..9cb38dd427 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ButtonEdge.svelte @@ -0,0 +1,476 @@ + + + + + + + +{#if selected} + +
+ + + {#if showPopup} + + {/if} +
+
+{/if} + + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentLibrary.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentLibrary.svelte new file mode 100644 index 0000000000..ee4ae6344b --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentLibrary.svelte @@ -0,0 +1,303 @@ + + +
+

Component Library

+ +
+ {#if componentManifest?.meta} +
+
+
{componentManifest.meta.title || componentManifest.meta.component_name}
+
+ +
+ {componentManifest.meta.description || 'No description available'} +
+ + {#if availableModes.length > 0} +
+ +
+ {#each availableModes as mode} +
handleModeClick(mode)} + role="button" + tabindex="0" + on:keypress={(e) => e.key === 'Enter' && handleModeClick(mode)} + > +
+ {mode.mode_name} +
{mode.description || 'No description available'}
+
+
+ {/each} +
+
+ +
+ +
+ {:else} +
+
📦
+
+ No modes available for {currentInteractionMode.toUpperCase()} mode +
+
+ {#if currentInteractionMode === 'view'} + No view mode components defined in manifest + {:else} + No edit mode components defined in manifest + {/if} +
+
+ {/if} +
+ {:else} +
+
📦
+
+ No component manifest available +
+
+ {/if} +
+ +
+ +
+
+ + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentOverview.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentOverview.svelte new file mode 100644 index 0000000000..f05a3194a4 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ComponentOverview.svelte @@ -0,0 +1,166 @@ + + +
+

Overview

+ + {#if selectedNode} +
+
+
+ Component: + {selectedNode.data?.componentName || 'Unknown'} +
+ + {#if selectedNode.data?.modeName} +
+ Mode: + {selectedNode.data.modeName} +
+ {/if} + + {#if selectedNode.data?.componentId} +
+ ID: + {selectedNode.data.componentId} +
+ {/if} + +
+ Type: + {selectedNode.type} +
+
+ + +
+ {/if} + + +
+ + +
+
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ConfigTab.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ConfigTab.svelte new file mode 100644 index 0000000000..514e09fb14 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ConfigTab.svelte @@ -0,0 +1,1516 @@ + + +
+

Configuration

+ + + {#if connectedLeafNodes.length > 0} +
+
+ + +
+ The anchorpoint determines where the component will be rendered in the final form. + +
+
+
+ {/if} + + +
+
Validation Summary
+
0}> +
+ Connected: {nodeValidationStatus.connected}/{nodeValidationStatus.total} + 0}> + {nodeValidationStatus.connected === nodeValidationStatus.total && nodeValidationStatus.total > 0 ? 'All Connected' : 'Missing Connections'} + +
+
+
+ + +
+ +
+ + + {#if displayGlobalSettings.length > 0} +
+
Global Settings
+
+ {#each displayGlobalSettings as setting} +
+ {#if setting.type === 'boolean'} + handleGlobalBooleanChange(setting, e)} + /> + +
+ Default: {setting.default_value?.value ?? 'false'} +
+ {:else} + + handleGlobalInputChange(setting, e)} + placeholder={`Default: ${setting.default_value?.value || 'No default'}`} + /> +
+ Default: {setting.default_value?.value || 'No default'} +
+ {/if} +
+ {/each} +
+
+ {/if} + + + {#if displaySettings.length > 0} +
+
Settings {manifestMode ? `(${manifestMode.mode_name})` : ''}
+
+ {#each displaySettings as setting} +
+ {#if setting.type === 'boolean'} + handleBooleanChange(setting, e)} + /> + +
+ Default: {setting.default_value?.value ?? 'false'} +
+ {:else} + + handleInputChange(setting, e)} + placeholder={`Default: ${setting.default_value?.value || 'No default'}`} + /> +
+ Default: {setting.default_value?.value || 'No default'} +
+ {/if} +
+ {/each} +
+
+ {:else if manifestMode} +
+
Settings {manifestMode ? `(${manifestMode.mode_name})` : ''}
+
+ No settings defined for this mode. +
+
+ {/if} + + +
+
Variables Validation
+
+ {#each (selectedNode?.data?.componentVariables || []) as variable} + {@const isConnected = nodeValidationStatus.items[variable.target_variable] || false} +
+
+
{variable.target_variable}
+
+ Type: {variable.type} + + {variable.is_input && variable.is_output ? 'IN/OUT' : variable.is_input ? 'IN' : 'OUT'} + +
+
+
+
+ {isConnected ? '✓ Connected' : '✗ Not Connected'} +
+ {#if !$validationStatus.typeValid} +
Type mismatch!
+ {/if} +
+
+ {/each} + + {#if (selectedNode?.data?.componentVariables || []).length === 0} +
+ No variables defined for this mode. +
+ {/if} +
+
+ + +
+
+ {#if hasLoop} + + Error detected + {:else} + + No Error detected + {/if} +
+ + {#if hasLoop && loopDetails.length > 0} +
+
+ Detected Errors: +
+
+ {#each loopDetails as loop} +
+ {#each loop.path as node, i} + + {node} + + {#if i < loop.path.length - 1} + + {/if} + {/each} +
+ {/each} +
+
+ {/if} +
+ + +
+
Regex Validation
+ + {#if regexCapableVariables.length === 0} +
+ No variables with regex support available. +
+ {:else} +
+ +
+ + +
+ + {#if selectedParameter && selectedVariableDetails} + + {#if selectedVariableDetails.allowregex_input} +
+ + + +
+ {/if} + + + {#if selectedVariableDetails.allowregex_output} +
+ + + +
+ {/if} + + + + + + {#if currentComponent} + {@const currentVar = currentComponent.mode?.variables?.variable?.find(v => v.target_variable === selectedParameter)} + {#if currentVar && (currentVar.input_regex || currentVar.output_regex)} +
+ Currently Applied: + {#if currentVar.input_regex} +
+ + Input: {currentVar.input_regex} +
+ {/if} + {#if currentVar.output_regex} +
+ + Output: {currentVar.output_regex} +
+ {/if} +
+ {/if} + {/if} + {:else if selectedParameter} +
+ Selected variable does not support regex validation +
+ {/if} +
+ {/if} +
+
+ + +{#if showResetConfirm} + +{/if} + + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_edit.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_edit.json new file mode 100644 index 0000000000..4fed31fa4f --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_edit.json @@ -0,0 +1,137 @@ +{ + "components": [ + { + "meta": { + "component_name": "map_v1.17.6.25", + "component_ui_id": "map_v1.17.6.25-edit-coordinates_area-1765237545195" + }, + "globalSettings": { + "interaction_mode": "edit", + "anchorpoint": "associatedParty.phone", + "globalsetting": [ + { + "target_variable": "defaultSRS", + "value": "EPSG:4326" + }, + { + "target_variable": "mapProvider", + "value": "Google Maps" + } + ] + }, + "mode": { + "mode_name": "coordinates_area", + "settings": { + "setting": [ + { + "target_variable": "initViewExtent", + "value": "[10,10,35,40]" + } + ] + }, + "variables": { + "variable": [ + { + "target_variable": "xmin", + "is_input": true, + "is_output": true, + "type": "number", + "JSONPath": "associatedParty.phone", + "is_visible": false, + "input_regex": "$test", + "output_regex": "$test2" + }, + { + "target_variable": "xmin", + "is_input": false, + "is_output": true, + "type": "number", + "JSONPath": "associatedParty.electronicMailAddress", + "is_visible": false, + "input_regex": "$test", + "output_regex": "$test2" + }, + { + "target_variable": "xmin", + "is_input": false, + "is_output": true, + "type": "number", + "JSONPath": "associatedParty.onlineUrl", + "is_visible": true, + "input_regex": "$test", + "output_regex": "$test2" + }, + { + "target_variable": "ymax", + "is_input": true, + "is_output": true, + "type": "number", + "JSONPath": "associatedParty.role", + "is_visible": true, + "output_regex": "$test3" + } + ] + } + } + }, + { + "meta": { + "component_name": "map_v1.17.6.25", + "component_ui_id": "map_v1.17.6.25-edit-coordinates-1765237558848" + }, + "globalSettings": { + "interaction_mode": "edit", + "anchorpoint": "keywordSet.keywordThesaurus", + "globalsetting": [ + { + "target_variable": "defaultSRS", + "value": "EPSG:4326" + }, + { + "target_variable": "mapProvider", + "value": "OpenStreetMap" + } + ] + }, + "mode": { + "mode_name": "coordinates", + "settings": { + "setting": [ + { + "target_variable": "fitToData", + "value": "true" + } + ] + }, + "variables": { + "variable": [ + { + "target_variable": "xmax", + "is_input": true, + "is_output": false, + "type": "number", + "JSONPath": "intellectualRights.para", + "is_visible": false + }, + { + "target_variable": "ymax", + "is_input": true, + "is_output": true, + "type": "number", + "JSONPath": "keywordSet.keywordThesaurus", + "is_visible": true + }, + { + "target_variable": "ymax", + "is_input": false, + "is_output": true, + "type": "number", + "JSONPath": "additionalInfo.para", + "is_visible": false + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_view.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_view.json new file mode 100644 index 0000000000..8d0d1c5997 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentConfig_view.json @@ -0,0 +1,90 @@ +{ + "components": [ + { + "meta": { + "component_name": "map_v1.17.6.25", + "component_ui_id": "map_v1.17.6.25-view-display_area-1765237553767" + }, + "globalSettings": { + "interaction_mode": "view", + "anchorpoint": "associatedParty.onlineUrl", + "globalsetting": [ + { + "target_variable": "defaultSRS", + "value": "EPSG:4326" + }, + { + "target_variable": "mapProvider", + "value": "OpenStreetMap" + } + ] + }, + "mode": { + "mode_name": "display_area", + "settings": { + "setting": [ + { + "target_variable": "viewExtent", + "value": "[15,15,25,25]" + } + ] + }, + "variables": { + "variable": [ + { + "target_variable": "displayArea", + "is_input": true, + "is_output": false, + "type": "string", + "JSONPath": "associatedParty.onlineUrl", + "is_visible": false + } + ] + } + } + }, + { + "meta": { + "component_name": "map_v1.17.6.25", + "component_ui_id": "map_v1.17.6.25-view-display_area-1765589948124" + }, + "globalSettings": { + "interaction_mode": "view", + "anchorpoint": "intellectualRights.para", + "globalsetting": [ + { + "target_variable": "defaultSRS", + "value": "EPSG:4326" + }, + { + "target_variable": "mapProvider", + "value": "OpenStreetMap" + } + ] + }, + "mode": { + "mode_name": "display_area", + "settings": { + "setting": [ + { + "target_variable": "viewExtent", + "value": "[15,15,25,25]" + } + ] + }, + "variables": { + "variable": [ + { + "target_variable": "displayArea", + "is_input": true, + "is_output": false, + "type": "string", + "JSONPath": "intellectualRights.para", + "is_visible": true + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentPositions.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentPositions.json new file mode 100644 index 0000000000..206e0a632c --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Downloads/componentPositions.json @@ -0,0 +1,18 @@ +{ + "map_v1.17.6.25-edit-coordinates_area-1765237545195": { + "x": 755, + "y": 4340 + }, + "map_v1.17.6.25-edit-coordinates-1765237558848": { + "x": 422, + "y": 4829 + }, + "map_v1.17.6.25-view-display_area-1765237553767": { + "x": 630, + "y": 4467 + }, + "map_v1.17.6.25-view-display_area-1765589948124": { + "x": 449, + "y": 5233 + } +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ItemNode.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ItemNode.svelte new file mode 100644 index 0000000000..c674004a33 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ItemNode.svelte @@ -0,0 +1,80 @@ + + +
+ + +
+ {#if data?.type} +
{data.type}
+ {/if} +
{data?.label || 'Item'}
+
+
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/LeafNode.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/LeafNode.svelte new file mode 100644 index 0000000000..9cb875f3fb --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/LeafNode.svelte @@ -0,0 +1,335 @@ + + +
+ + +
+
+
{data?.label || 'Metadata Field'}
+ + {#if showControls} +
+ + + +
+ {/if} +
+ + {#if data?.type} +
{data.type}
+ {/if} + {#if data?.path} +
{data.path}
+ {/if} +
+
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ModesTab.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ModesTab.svelte new file mode 100644 index 0000000000..cdae6385ad --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ModesTab.svelte @@ -0,0 +1,360 @@ + + +
+
+
Available Modes
+
+ {#each availableModes as mode} + + {/each} + {#if availableModes.length === 0} +
+ No modes available for {currentInteractionMode.toUpperCase()} mode. +
+ {/if} +
+
+ +
+ + {#if hasChanges()} +
+ Warning: Applying mode changes will clear all existing connections for this component. +
+ {/if} +
+ + {#if showSubmodeWarning} + + {/if} +
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/NodeWithItems.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/NodeWithItems.svelte new file mode 100644 index 0000000000..1f3313b703 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/NodeWithItems.svelte @@ -0,0 +1,376 @@ + + +
+
+
+ {data?.label ?? 'Unnamed Node'} +
+ + {#if data?.modeName} +
+ Mode: {data.modeName} +
+ {/if} +
+ +
+ {#if childItems && childItems.length > 0} +
+ {#each childItems as item, i (item.id)} + {@const variable = data?.componentVariables?.find(v => v.target_variable === item.id)} +
+ + + +
+ + {#if item.isInput && item.isOutput} + IN + {:else if item.isInput} + IN + {/if} + + {item.label} + + + {#if item.isInput && item.isOutput} + OUT + {:else if item.isOutput} + OUT + {/if} +
+ + +
+ {/each} +
+ {:else} +
+

No child items available

+ Mode: {data?.modeName || 'Unknown'} + Data available: {JSON.stringify(Object.keys(data || {}))} + Expected childItems, got: {typeof childItems} ({childItems?.length || 0} items) +
+ {/if} +
+
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/PreviewTab.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/PreviewTab.svelte new file mode 100644 index 0000000000..e3a257447b --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/PreviewTab.svelte @@ -0,0 +1,157 @@ + + +
+

Default Values {selectedMode ? `(mode: ${selectedMode.mode_name})` : ''}

+ + {#if selectedMode && modeVariables.length > 0} +
+
Variables
+
+ {#each modeVariables as variable} +
+
+
{variable.target_variable}
+
+
{variable.description || variable.name}
+
+
Type: {variable.type}
+
+ {variable.is_input && variable.is_output ? 'IN/OUT' : variable.is_input ? 'Input' : 'Output'} +
+
+
+ Default Value: + {getVariableDefaultValue(variable)} +
+
+ {/each} +
+
+ {:else if selectedMode} +
+
Variables
+
+ No variables defined for mode "{selectedMode.mode_name}". +
+
+ {:else} +
+
+ Error. No submode detected. +
+
+ {/if} +
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/README.md b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/README.md new file mode 100644 index 0000000000..ffc80605f9 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/README.md @@ -0,0 +1,93 @@ +## Svelte Flow UI-Component Configuration Tool + +### Installation +Ensure a stable BEXIS2 Core environment with all packages installed correctly and verify all folders and files for component configuration exist. + +Navigate to the DCM Module: +```bash +cd .\Console\BExIS.Web.Shell\Areas\DCM\BExIS.Modules.Dcm.UI.Svelte\ +``` + +Install all dependencies (if not done already): +```bash +npm install +``` + +Install Svelte Flow (version 0.1.36 required for Svelte 4 compatibility): +```bash +npm install @xyflow/svelte@0.1.36 +``` +Run dev Server: +```bash +npm run dev +``` +Click the "Component Configuration" button in the main interface. + +### Core Concepts +- Choice between two interaction modes (toggleable via buttons): Edit Mode (configure component for data entry) and View Mode (configure component for data display) +- Base-Component definitions currently come from `componentManifest.json`. This file populates: + - Component Library (separate components, each a Manifest) + - Modes tab (submodes in each component, filtered by interaction mode) + - Config tab (default settings, validation rules) + - Preview tab (default variable values) + +### Saving & Loading +Configured Components (e.g. changed settings, submode, mappings...) must be saved manually via the Save button in the sidebar, which downloads 3 files: + +- `componentConfig_edit.json` (configured UI components for metadata input) +- `componentConfig_view.json` (configured UI components for metadata display) +- `componentPositions.json` (Svelte Flow component coordinates) + +To restore state, manually move downloaded files to `src/routes/componentconfiguration/Downloads/` (filename supports numbered duplicates like `(1)`) + +**Implementation:** + +in the `+page.svelte`: +- download: `handleSaveAll()` calls `downloadAllConfigs()` from `Services/fileHelpers.ts` +- load: `onMount()` calls `loadConfigsFromDownloads()` from `Services/fileHelpers.ts` + + +### Metadata Schema +Current local load from `src/routes/componentconfiguration/Schema/` (e.g. `metadataSchema_x.json`) + +To use API instead modify: `Services/apiCalls.ts` + +The current metadata schema ID is hardcoded in `TreeComponent.svelte`: +```typescript +let currentSchema: number = 2; +``` + +### File Structure + +**Schema Tree Generation** + +`TreeComponent.svelte` - main schema parser + +`arrayComponentWrapper.svelte`, `choiceComponentWrapper.svelte`, `complexComponentWrapper.svelte`, `simpleComponentWrapper.svelte` - recursive parsers, each for a corresponding Component (complex, simple, choice, array) + +**Flow Elements** + +- `NodeWithItems.svelte` - main UI component node containing variable items +- ( `ItemNode.svelte` - legacy node definition (currently unused) ) +- `LeafNode.svelte` - metadata tree nodes (represents metadata schema elements) +- `SectionNode.svelte` - metadata tree sections (used as separators) +- `ButtonEdge.svelte` - custom edges with button menu +- `ResetViewButton.svelte` - button to reset zoom and fit all nodes + +**Svelte Components (Sidebar)** + +- `ComponentLibrary.svelte` - library containing components and submodes defined through manifest +- `ModesTab.svelte` - submode selection with detailed descriptions +- `ConfigTab.svelte` - parameter configuration, error checking and progress display +- `PreviewTab.svelte` - intended to preview configured components, currently only displays default variable values + +**Services** + +`Services/fileHelpers.ts` - file operations + +`Services/apiCalls.ts` - schema fetching + +**Reference** +Config and Manifest schemas, as well as Bachelor's thesis, available on GitLab: +https://git.uni-jena.de/fusion/teaching/thesis/julius-halank-ba/fusion_bexis2_docs_thesis/-/tree/main/thesis/final_versions + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ResetViewButton.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ResetViewButton.svelte new file mode 100644 index 0000000000..ae6c15c385 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/ResetViewButton.svelte @@ -0,0 +1,52 @@ + + + + + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Schema/README.md b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Schema/README.md new file mode 100644 index 0000000000..a0e0479598 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Schema/README.md @@ -0,0 +1 @@ +This folder needs to contain a metadataschema JSON file for metadatatree creation. \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/SectionNode.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/SectionNode.svelte new file mode 100644 index 0000000000..3902bdb624 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/SectionNode.svelte @@ -0,0 +1,46 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/apiCalls.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/apiCalls.ts new file mode 100644 index 0000000000..7a2b9ef1a3 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/apiCalls.ts @@ -0,0 +1,19 @@ +import { Api } from '@bexis2/bexis2-core-ui'; + +export const GetMetadataSchema = async (id: number) => { + try { + // // API + // const response = await Api.get('/api/MetadataStructure/' + id); + // return response.data; + + // local load + const response = await fetch(`/src/routes/componentconfiguration/Schema/metadataSchema_${id}.json`); + if (!response.ok) { + throw new Error(`Schema file not found: metadataSchema_${id}.json`); + } + const data = await response.json(); + return data; + } catch (error) { + throw error; + } +}; \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/fileHelpers.ts b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/fileHelpers.ts new file mode 100644 index 0000000000..3bb9df7c67 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/Services/fileHelpers.ts @@ -0,0 +1,90 @@ +export interface ConfigFile { + components: any[]; +} + +export interface PositionFile { + [nodeId: string]: { + x: number; + y: number; + }; +} + +// download JSON data as file +export function downloadJsonFile(data: any, filename: string) { + const jsonString = JSON.stringify(data, null, 2); + const blob = new Blob([jsonString], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + + const link = document.createElement('a'); + link.href = url; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); +} + +// download all 3 config files at once +export function downloadAllConfigs( + editConfig: ConfigFile, + viewConfig: ConfigFile, + positions: PositionFile +) { + downloadJsonFile(editConfig, 'componentConfig_edit.json'); + setTimeout(() => { + downloadJsonFile(viewConfig, 'componentConfig_view.json'); + }, 100); + setTimeout(() => { + downloadJsonFile(positions, 'componentPositions.json'); + }, 200); +} + +export function createEmptyConfig(): ConfigFile { + return { components: [] }; +} + +export function createEmptyPositions(): PositionFile { + return {}; +} + +// load from config folder and autoselect latest versions +// looping over suffix from 100 to "version" +export async function loadConfigsFromDownloads(): Promise<{ + edit: ConfigFile; + view: ConfigFile; + positions: PositionFile; +} | null> { + try { + const basePath = '/src/routes/componentconfiguration/Downloads/'; + + // adjust bounds as needed + for (let version = 100; version >= 0; version--) { + const suffix = version === 1 ? '' : ` (${version})`; + + try { + const [editRes, viewRes, posRes] = await Promise.all([ + fetch(basePath + `componentConfig_edit${suffix}.json`), + fetch(basePath + `componentConfig_view${suffix}.json`), + fetch(basePath + `componentPositions${suffix}.json`) + ]); + + if (editRes.ok && viewRes.ok && posRes.ok) { + const [edit, view, positions] = await Promise.all([ + editRes.json(), + viewRes.json(), + posRes.json() + ]); + + return { edit, view, positions }; + } + } catch (error) { + continue; + } + } + + return null; + + } catch (error) { + return null; + } +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/TreeComponent.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/TreeComponent.svelte new file mode 100644 index 0000000000..39b618105e --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/TreeComponent.svelte @@ -0,0 +1,238 @@ + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/arrayComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/arrayComponentWrapper.svelte new file mode 100644 index 0000000000..0f051df90c --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/arrayComponentWrapper.svelte @@ -0,0 +1,167 @@ + + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/choiceComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/choiceComponentWrapper.svelte new file mode 100644 index 0000000000..b82d8ce1d1 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/choiceComponentWrapper.svelte @@ -0,0 +1,199 @@ + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/complexComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/complexComponentWrapper.svelte new file mode 100644 index 0000000000..115534d65f --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/complexComponentWrapper.svelte @@ -0,0 +1,255 @@ + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/componentManifest.json b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/componentManifest.json new file mode 100644 index 0000000000..ecc8e7d68a --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/componentManifest.json @@ -0,0 +1,254 @@ +{ + "meta": { + "title": "Map Component", + "component_name": "map_v1.17.6.25", + "author": "GeoTeam", + "version": "1.0.0", + "description": "Component for geographic data visualization" + }, + "globalSettings": { + "globalsetting": [ + { + "name": "Default SRS", + "description": "Default spatial reference system", + "type": "string", + "target_variable": "defaultSRS", + "default_value": { + "type": "string", + "value": "EPSG:4326" + } + }, + { + "name": "Map Provider", + "description": "Base map provider", + "type": "string", + "target_variable": "mapProvider", + "default_value": { + "type": "string", + "value": "OpenStreetMap" + } + } + ] + }, + "modes": { + "edit": [ + { + "mode_name": "coordinates_area", + "description": "Berechnet eine Area aus xmin, xmax, ymin, ymax und gibt area als Output.", + "settings": { + "setting": [ + { + "name": "Initial View Extent", + "description": "Initial map view extent", + "type": "string", + "target_variable": "initViewExtent", + "default_value": { + "type": "string", + "value": "[10,10,35,40]" + } + } + ] + }, + "variables": { + "variable": [ + { + "name": "X Minimum", + "description": "Minimum X coordinate (longitude)", + "type": "number", + "format": "decimal", + "target_variable": "xmin", + "allowregex_input": true, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "20.0" + } + }, + { + "name": "X Maximum", + "description": "Maximum X coordinate (longitude)", + "type": "number", + "format": "decimal", + "target_variable": "xmax", + "allowregex_input": false, + "allowregex_output": false, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "23.0" + } + }, + { + "name": "Y Minimum", + "description": "Minimum Y coordinate (latitude)", + "type": "number", + "format": "decimal", + "target_variable": "ymin", + "allowregex_input": true, + "allowregex_output": false, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "20.0" + } + }, + { + "name": "Y Maximum", + "description": "Maximum Y coordinate (latitude)", + "type": "number", + "format": "decimal", + "target_variable": "ymax", + "allowregex_input": false, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "25.0" + } + }, + { + "name": "Area", + "description": "Geographic area in square meters", + "type": "number", + "format": "m^2", + "target_variable": "area", + "allowregex_input": false, + "allowregex_output": true, + "is_input": false, + "is_output": true, + "default_value": { + "type": "number", + "value": "800000.0" + } + } + ] + } + }, + { + "mode_name": "coordinates", + "description": "Gibt xmin, xmax, ymin, ymax als Input und Output weiter.", + "settings": { + "setting": [ + { + "name": "Fit to Data", + "description": "Automatically fit map bounds to the data extent", + "type": "boolean", + "target_variable": "fitToData", + "default_value": { + "type": "boolean", + "value": "true" + } + } + ] + }, + "variables": { + "variable": [ + { + "name": "X Minimum", + "description": "Minimum X coordinate (longitude)", + "type": "number", + "format": "decimal", + "target_variable": "xmin", + "allowregex_input": true, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "8.0" + } + }, + { + "name": "X Maximum", + "description": "Maximum X coordinate (longitude)", + "type": "number", + "format": "decimal", + "target_variable": "xmax", + "allowregex_input": true, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "12.0" + } + }, + { + "name": "Y Minimum", + "description": "Minimum Y coordinate (latitude)", + "type": "number", + "format": "decimal", + "target_variable": "ymin", + "allowregex_input": true, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "8.0" + } + }, + { + "name": "Y Maximum", + "description": "Maximum Y coordinate (latitude)", + "type": "number", + "format": "decimal", + "target_variable": "ymax", + "allowregex_input": true, + "allowregex_output": true, + "is_input": true, + "is_output": true, + "default_value": { + "type": "number", + "value": "11.0" + } + } + ] + } + } + ], + "view": [ + { + "mode_name": "display_area", + "description": "Mode for area display", + "settings": { + "setting": [ + { + "name": "View Extent", + "description": "Map extent for view mode", + "type": "string", + "target_variable": "viewExtent", + "default_value": { + "type": "string", + "value": "[15,15,25,25]" + } + } + ] + }, + "variables": { + "variable": [ + { + "name": "Display Area", + "description": "Area to display", + "type": "string", + "target_variable": "displayArea", + "allowregex_input": true, + "allowregex_output": false, + "is_input": true, + "is_output": false, + "default_value": { + "type": "string", + "value": "" + } + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponent.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponent.svelte new file mode 100644 index 0000000000..0f97bad43b --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponent.svelte @@ -0,0 +1,46 @@ + diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponentWrapper.svelte new file mode 100644 index 0000000000..a5dfcf384c --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/componentconfiguration/simpleComponentWrapper.svelte @@ -0,0 +1,28 @@ + + +{#if path && simpleComponent.properties} + +{/if} \ No newline at end of file diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/+page.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/+page.svelte new file mode 100644 index 0000000000..294e530282 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/+page.svelte @@ -0,0 +1,42 @@ + + + +

Metadata

+ {#await load()} + + {:then} +
+ +
+ {/await} +
diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/arrayComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/arrayComponentWrapper.svelte new file mode 100644 index 0000000000..23fd9707dd --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/arrayComponentWrapper.svelte @@ -0,0 +1,212 @@ + + +{#if arrayComponent.items} +
+ {#key render} + {#if arrayComponent.items.type === 'object' && arrayComponent.items.properties && !arrayComponent.items.properties['#text']} +
+
+
+

{label}

+
+
+ {#if !$hideStore.includes(path)} + + {:else} + + {/if} +
+
+ {#if !$hideStore.includes(path)} +
+ {#if value && value.length > 0} + {#each value as item, index} +
+
+
+

{label} {index+1}

+
+
+ {#if value.length < maxItems} + + {:else} + + {/if} + {#if index > 0} + + {:else} + + {/if} + {#if index < value.length - 1} + + {:else} + + {/if} + {#if value.length > minItems} + + {:else} + + {/if} +
+
+
+ +
+
+ {/each} + {/if} +
+ {/if} +
+ {:else if arrayComponent.items.type === 'object' && arrayComponent.items.properties['#text']} + {#if value && value.length > 0} + {#each value as item, index} +
+
+ {#if value.length < maxItems} + + {:else} + + {/if} + {#if index > 0} + + {:else} + + {/if} + {#if index < value.length - 1} + + {:else} + + {/if} + {#if value.length > minItems} + + {:else} + + {/if} +
+
+ +
+
+ {/each} + {/if} + {/if} + {/key} +
+{/if} diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/choiceComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/choiceComponentWrapper.svelte new file mode 100644 index 0000000000..0733c139af --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/choiceComponentWrapper.svelte @@ -0,0 +1,192 @@ + + +
+
+
+

{label}

+
+
+ {#if !$hideStore.includes(path)} + + {:else} + + {/if} +
+
+ {#if !$hideStore.includes(path)} +
+ {#if choiceComponent.anyOf} + + {:else if choiceComponent.oneOf} + + {#each choices as item} + {item.key} + {/each} + + {:else if choiceComponent.allOf} + {#each choices as item} +
+ {item.key} +
+ {/each} + {/if} + + {#if target && target.length > 0} + {#if choiceComponent.anyOf || choiceComponent.allOf} + {#each target as item} + {#if choiceComponent.properties[item].type === 'object' && choiceComponent.properties[item].properties && !choiceComponent.properties[item].properties['#text']} +
+
+
+

{item}

+
+
+ {#if !$hideStore.includes(path + '.' + item)} + + {:else} + + {/if} +
+
+ {#if !$hideStore.includes(path + '.' + item)} +
+ +
+ {/if} +
+ {:else if choiceComponent.properties[item].type === 'object' && choiceComponent.properties[item].properties['#text']} +
+ +
+ {/if} + {/each} + {:else if choiceComponent.oneOf} + {#if choiceComponent.properties[target].type === 'object' && choiceComponent.properties[target].properties && !choiceComponent.properties[target].properties['#text']} +
+
+
+

{target}

+
+
+ {#if !$hideStore.includes(target)} + + {:else} + + {/if} +
+
+ {#if !$hideStore.includes(target)} +
+ +
+ {/if} +
+ {:else if choiceComponent.properties[target].type === 'object' && choiceComponent.properties[target].properties['#text']} +
+ +
+ {/if} + {/if} + {/if} +
+ {/if} +
diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/complexComponentWrapper.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/complexComponentWrapper.svelte new file mode 100644 index 0000000000..43d23e6219 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/complexComponentWrapper.svelte @@ -0,0 +1,85 @@ + + +{#if complexComponent && complexComponent.type === 'object' && complexComponent.properties} + {#each Object.entries(complexComponent.properties) as [key, value]} + {@const p = path = path ? path + '.' + key : key} + {@const l = label = key} + {#if value.type === 'object' && value.properties && !value.properties['#text']} + {#if value.oneOf || value.anyOf || value.allOf} + + {:else} +
+
+
+ {#if required} +

{label} *

+ {:else} +

{label}

+ {/if} +
+
+ {#if !$hideStore.includes(path)} + + {:else} + + {/if} +
+
+ {#if !$hideStore.includes(path)} +
+ +
+ {/if} +
+ {/if} + {:else if value.type === 'object' && value.properties['#text']} +
+ +
+ {:else if value.type === 'array' && value.items} + + {/if} + {/each} +{/if} diff --git a/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/simpleComponent.svelte b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/simpleComponent.svelte new file mode 100644 index 0000000000..b004ab3d63 --- /dev/null +++ b/Console/BExIS.Web.Shell/Areas/DCM/BExIS.Modules.Dcm.UI.Svelte/src/routes/metadata/components/edit/simpleComponent.svelte @@ -0,0 +1,182 @@ + + +{#if isVisible && !isAnchor} + {#if path && simpleComponent.properties} +
+ + {#if simpleComponent.properties['#text'].format !== undefined && simpleComponent.properties['#text'].format !== null} + + {#if simpleComponent.properties['#text'].format.toLowerCase() === 'date'} + + {label} + + + + {:else if simpleComponent.properties['#text'].format.toLowerCase() === 'datetime' || simpleComponent.properties['#text'].format.toLowerCase() === 'date and time'} + + {label} + + + + {:else if simpleComponent.properties['#text'].format.toLowerCase() === 'time'} + + {label} + + + + {:else if simpleComponent.properties['#text'].type === 'string' &&simpleComponent.properties['#text'].format.toLowerCase() === 'textarea' || simpleComponent.properties['#text'].format.toLowerCase() === 'text'} +