Browse Source

Merge pull request #14944 from thingsboard/feature/lts-4.3-angular-20

Angular 20 migration (CE LTS 4.3)
pull/14972/head
Igor Kulikov 8 months ago
committed by GitHub
parent
commit
1ac78df19b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 17
      ui-ngx/.browserslistrc
  2. 31
      ui-ngx/angular.json
  3. 4
      ui-ngx/eslint.config.mjs
  4. 139
      ui-ngx/package.json
  5. 31
      ui-ngx/patches/@angular+build+20.3.15.patch
  6. 66
      ui-ngx/patches/@angular+common+18.2.13.patch
  7. 97
      ui-ngx/patches/@angular+compiler+18.2.13.patch
  8. 20
      ui-ngx/patches/@angular+core+18.2.13.patch
  9. 20
      ui-ngx/patches/@angular+core+20.3.16.patch
  10. 61
      ui-ngx/patches/@angular+material+18.2.14.patch
  11. 97
      ui-ngx/patches/@iplab+ngx-color-picker+18.0.1.patch
  12. 46
      ui-ngx/patches/@iplab+ngx-color-picker+20.0.0.patch
  13. 92
      ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch
  14. 44
      ui-ngx/patches/@mat-datetimepicker+core+16.0.1.patch
  15. 4
      ui-ngx/patches/angular-gridster2+20.2.4.patch
  16. 15
      ui-ngx/patches/echarts+5.5.1-TB.patch
  17. 27
      ui-ngx/patches/jquery.terminal+2.44.1.patch
  18. 9
      ui-ngx/src/app/app.component.ts
  19. 24
      ui-ngx/src/app/core/services/resources.service.ts
  20. 4
      ui-ngx/src/app/core/services/utils.service.ts
  21. 4
      ui-ngx/src/app/core/settings/settings.effects.ts
  22. 8
      ui-ngx/src/app/core/translate/missing-translate-handler.ts
  23. 6
      ui-ngx/src/app/core/translate/translate-default-loader.ts
  24. 10
      ui-ngx/src/app/core/translate/translate-default-parser.ts
  25. 56
      ui-ngx/src/app/modules/common/modules-map.ts
  26. 7
      ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts
  27. 7
      ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts
  28. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.ts
  29. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts
  30. 21
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts
  31. 7
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-table-header.component.ts
  32. 11
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts
  33. 7
      ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts
  34. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts
  35. 4
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html
  36. 2
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.scss
  37. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts
  38. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts
  39. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-schedule-dialog.component.ts
  40. 25
      ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-schedule.component.ts
  41. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts
  42. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts
  43. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts
  44. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-list.component.ts
  45. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-list.component.ts
  46. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-no-data-value.component.ts
  47. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-value.component.ts
  48. 2
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.html
  49. 31
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts
  50. 9
      ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-text.component.ts
  51. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts
  52. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts
  53. 21
      ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts
  54. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts
  55. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts
  56. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts
  57. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts
  58. 21
      ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts
  59. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts
  60. 7
      ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts
  61. 17
      ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts
  62. 7
      ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts
  63. 7
      ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts
  64. 9
      ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts
  65. 9
      ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts
  66. 7
      ui-ngx/src/app/modules/home/components/api-key/add-api-key-dialog.component.ts
  67. 7
      ui-ngx/src/app/modules/home/components/api-key/api-key-generated-dialog.component.ts
  68. 7
      ui-ngx/src/app/modules/home/components/api-key/api-keys-table-dialog.component.ts
  69. 9
      ui-ngx/src/app/modules/home/components/api-key/api-keys-table.component.ts
  70. 2
      ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss
  71. 9
      ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts
  72. 9
      ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts
  73. 9
      ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts
  74. 9
      ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts
  75. 7
      ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts
  76. 9
      ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts
  77. 7
      ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts
  78. 21
      ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts
  79. 7
      ui-ngx/src/app/modules/home/components/audit-log/audit-log-header.component.ts
  80. 7
      ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts
  81. 7
      ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts
  82. 11
      ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts
  83. 7
      ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts
  84. 35
      ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts
  85. 31
      ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/entity-aggregation-arguments-table.component.ts
  86. 31
      ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/propagate-arguments-table.component.ts
  87. 31
      ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/related-aggregation-arguments-table.component.ts
  88. 4
      ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.scss
  89. 9
      ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts
  90. 29
      ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts
  91. 7
      ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts
  92. 35
      ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts
  93. 29
      ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts
  94. 2
      ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html
  95. 7
      ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts
  96. 35
      ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts
  97. 2
      ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html
  98. 31
      ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts
  99. 4
      ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html
  100. 29
      ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts

17
ui-ngx/.browserslistrc

@ -2,18 +2,17 @@
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# For Angular's browser support policy, please see:
# https://angular.dev/reference/versions#browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
>0.5%
not dead
last 2 Chrome versions
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
last 2 Android major versions
Chrome >= 107
ChromeAndroid >= 107
Edge >= 107
Firefox >= 104
FirefoxAndroid >= 104
Safari >= 16
iOS >= 16
Firefox ESR

31
ui-ngx/angular.json

@ -114,7 +114,10 @@
"stylePreprocessorOptions": {
"includePaths": [
"src/scss"
]
],
"sass": {
"silenceDeprecations": ["mixed-decls", "color-functions", "global-builtin", "import"]
}
},
"scripts": [
"node_modules/tinycolor2/dist/tinycolor-min.js",
@ -217,5 +220,31 @@
"schematicCollections": [
"@angular-eslint/schematics"
]
},
"schematics": {
"@schematics/angular:component": {
"type": "component"
},
"@schematics/angular:directive": {
"type": "directive"
},
"@schematics/angular:service": {
"type": "service"
},
"@schematics/angular:guard": {
"typeSeparator": "."
},
"@schematics/angular:interceptor": {
"typeSeparator": "."
},
"@schematics/angular:module": {
"typeSeparator": "."
},
"@schematics/angular:pipe": {
"typeSeparator": "."
},
"@schematics/angular:resolver": {
"typeSeparator": "."
}
}
}

4
ui-ngx/eslint.config.mjs

@ -64,7 +64,9 @@ export default tsEslint.config(
"@typescript-eslint/ban-ts-comment": "off",
"no-case-declarations": "off",
"no-prototype-builtins": "off",
"@typescript-eslint/consistent-type-definitions": "off"
"@typescript-eslint/consistent-type-definitions": "off",
"@angular-eslint/prefer-standalone": "off",
"@angular-eslint/prefer-inject": "off"
},
},
{

139
ui-ngx/package.json

@ -13,47 +13,47 @@
},
"private": true,
"dependencies": {
"@angular/animations": "18.2.13",
"@angular/cdk": "18.2.14",
"@angular/common": "18.2.13",
"@angular/compiler": "18.2.13",
"@angular/core": "18.2.13",
"@angular/forms": "18.2.13",
"@angular/material": "18.2.14",
"@angular/platform-browser": "18.2.13",
"@angular/platform-browser-dynamic": "18.2.13",
"@angular/router": "18.2.13",
"@angular/animations": "20.3.16",
"@angular/cdk": "20.2.14",
"@angular/common": "20.3.16",
"@angular/compiler": "20.3.16",
"@angular/core": "20.3.16",
"@angular/forms": "20.3.16",
"@angular/material": "20.2.14",
"@angular/platform-browser": "20.3.16",
"@angular/platform-browser-dynamic": "20.3.16",
"@angular/router": "20.3.16",
"@auth0/angular-jwt": "^5.2.0",
"@flowjs/flow.js": "^2.14.1",
"@flowjs/ngx-flow": "18.0.1",
"@flowjs/ngx-flow": "20.0.2",
"@geoman-io/leaflet-geoman-free": "2.18.3",
"@iplab/ngx-color-picker": "^18.0.1",
"@mat-datetimepicker/core": "~14.0.0",
"@iplab/ngx-color-picker": "^20.0.0",
"@mat-datetimepicker/core": "~16.0.1",
"@mdi/svg": "^7.4.47",
"@messageformat/core": "^3.4.0",
"@ngrx/effects": "^18.1.1",
"@ngrx/store": "^18.1.1",
"@ngrx/store-devtools": "^18.1.1",
"@ngx-translate/core": "^15.0.0",
"@svgdotjs/svg.filter.js": "^3.0.8",
"@svgdotjs/svg.js": "^3.2.4",
"@ngrx/effects": "^20.1.0",
"@ngrx/store": "^20.1.0",
"@ngrx/store-devtools": "^20.1.0",
"@ngx-translate/core": "^17.0.0",
"@svgdotjs/svg.filter.js": "^3.0.9",
"@svgdotjs/svg.js": "3.2.4",
"@svgdotjs/svg.panzoom.js": "^2.1.2",
"@tinymce/tinymce-angular": "^8.0.1",
"ace-builds": "1.36.5",
"ace-diff": "^3.0.3",
"angular-gridster2": "~18.0.1",
"ace-builds": "1.43.6",
"ace-diff": "^3.3.0",
"angular-gridster2": "~20.2.4",
"angular2-hotkeys": "^16.0.1",
"canvas-gauges": "^2.1.7",
"core-js": "^3.39.0",
"dayjs": "1.11.13",
"core-js": "^3.48.0",
"dayjs": "1.11.19",
"echarts": "https://github.com/thingsboard/echarts/archive/5.5.1-TB.tar.gz",
"flot": "https://github.com/thingsboard/flot.git#0.9-work",
"flot.curvedlines": "https://github.com/MichaelZinsmaier/CurvedLines.git#master",
"font-awesome": "^4.7.0",
"html2canvas": "^1.4.1",
"jquery": "^3.7.1",
"jquery.terminal": "^2.44.1",
"js-beautify": "1.15.1",
"jquery.terminal": "^2.45.2",
"js-beautify": "1.15.4",
"json-schema-defaults": "^0.4.0",
"jstree": "^3.3.17",
"jstree-bootstrap-theme": "^1.0.1",
@ -63,87 +63,82 @@
"leaflet-providers": "2.0.0",
"leaflet.gridlayer.googlemutant": "0.15.0",
"leaflet.markercluster": "1.5.3",
"libphonenumber-js": "^1.11.15",
"maplibre-gl": "^5.2.0",
"marked": "~12.0.2",
"libphonenumber-js": "^1.12.35",
"maplibre-gl": "5.2.0",
"marked": "~16.4.2",
"moment": "^2.30.1",
"moment-timezone": "^0.5.45",
"moment-timezone": "^0.6.0",
"ngx-clipboard": "^16.0.0",
"ngx-daterangepicker-material": "^6.0.4",
"ngx-drag-drop": "^18.0.2",
"ngx-drag-drop": "^20.0.1",
"ngx-flowchart": "https://github.com/thingsboard/ngx-flowchart.git#release/3.0.0",
"ngx-hm-carousel": "^18.0.0",
"ngx-markdown": "^18.1.0",
"ngx-sharebuttons": "^15.0.6",
"ngx-translate-messageformat-compiler": "^7.0.0",
"ngx-hm-carousel": "^19.0.0",
"ngx-markdown": "^20.1.0",
"ngx-sharebuttons": "^17.0.0",
"ngx-translate-messageformat-compiler": "^7.2.0",
"objectpath": "^2.0.0",
"qrcode": "^1.5.4",
"raphael": "^2.3.0",
"rxjs": "~7.8.1",
"rxjs": "~7.8.2",
"schema-inspector": "^2.1.0",
"screenfull": "^6.0.2",
"sorted-btree": "^1.8.1",
"split.js": "^1.6.5",
"systemjs": "6.15.1",
"tinycolor2": "^1.6.0",
"tinymce": "~6.8.5",
"tinymce": "~6.8.6",
"tooltipster": "^4.2.8",
"tslib": "^2.7.0",
"tslib": "^2.8.1",
"typeface-roboto": "^1.1.13",
"zone.js": "~0.14.10"
"zone.js": "~0.15.1"
},
"devDependencies": {
"@angular-builders/custom-esbuild": "18.0.0",
"@angular-devkit/build-angular": "18.2.12",
"@angular-devkit/core": "18.2.12",
"@angular-devkit/schematics": "18.2.12",
"@angular/build": "18.2.12",
"@angular/cli": "18.2.12",
"@angular/compiler-cli": "18.2.13",
"@angular/language-service": "18.2.13",
"@angular-builders/custom-esbuild": "20.0.0",
"@angular-devkit/build-angular": "20.3.15",
"@angular-devkit/core": "20.3.15",
"@angular-devkit/schematics": "20.3.15",
"@angular/build": "20.3.15",
"@angular/cli": "20.3.15",
"@angular/compiler-cli": "20.3.16",
"@angular/language-service": "20.3.16",
"@types/ace-diff": "^2.1.4",
"@types/canvas-gauges": "^2.1.8",
"@types/flot": "^0.0.36",
"@types/flowjs": "^2.13.14",
"@types/jquery": "^3.5.32",
"@types/jquery": "^3.5.33",
"@types/js-beautify": "^1.14.3",
"@types/leaflet": "1.9.14",
"@types/leaflet-polylinedecorator": "1.6.4",
"@types/leaflet-providers": "1.2.4",
"@types/leaflet.gridlayer.googlemutant": "0.4.9",
"@types/leaflet.markercluster": "1.5.5",
"@types/lodash": "^4.17.13",
"@types/node": "~20.17.8",
"@types/lodash": "^4.17.22",
"@types/node": "~22.18.13",
"@types/raphael": "^2.3.9",
"@types/systemjs": "6.15.1",
"@types/systemjs": "6.15.3",
"@types/tinycolor2": "^1.4.6",
"@types/tooltipster": "^0.0.35",
"angular-eslint": "~18.4.3",
"autoprefixer": "^10.4.20",
"angular-eslint": "~20.7.0",
"autoprefixer": "^10.4.23",
"directory-tree": "^3.5.2",
"eslint": "~9.17.0",
"eslint-plugin-import": "latest",
"eslint-plugin-jsdoc": "^50.6.0",
"eslint-plugin-prefer-arrow": "latest",
"eslint-plugin-tailwindcss": "^3.17.5",
"eslint": "~9.39.2",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsdoc": "^62.4.1",
"eslint-plugin-prefer-arrow": "^1.2.3",
"eslint-plugin-tailwindcss": "^3.18.2",
"ngrx-store-freeze": "^0.2.4",
"patch-package": "^8.0.0",
"postcss": "^8.4.49",
"patch-package": "^8.0.1",
"postcss": "^8.5.6",
"postinstall-prepare": "^2.0.0",
"tailwindcss": "^3.4.15",
"tailwindcss": "^3.4.19",
"ts-node": "^10.9.2",
"typescript": "~5.5.4",
"typescript-eslint": "^8.18.1"
"typescript": "~5.9.3",
"typescript-eslint": "^8.54.0"
},
"resolutions": {
"ace-builds": "1.36.5",
"tinymce": "6.8.5",
"rollup": "4.22.4",
"@babel/core": "7.25.2",
"esbuild": "0.23.0",
"jquery.terminal/coveralls-next/form-data": "4.0.4",
"node-forge": "1.3.3",
"glob": "10.5.0",
"path-to-regexp": "0.1.12"
"ace-builds": "1.43.6",
"tinymce": "6.8.6",
"@babel/core": "7.28.3",
"esbuild": "0.25.9"
}
}

31
ui-ngx/patches/@angular+build+18.2.12.patch → ui-ngx/patches/@angular+build+20.3.15.patch

@ -1,30 +1,30 @@
diff --git a/node_modules/@angular/build/src/tools/angular/compilation/angular-compilation.js b/node_modules/@angular/build/src/tools/angular/compilation/angular-compilation.js
index 625c621..4fc8bd8 100755
index 53168ea..f07c80a 100755
--- a/node_modules/@angular/build/src/tools/angular/compilation/angular-compilation.js
+++ b/node_modules/@angular/build/src/tools/angular/compilation/angular-compilation.js
@@ -68,8 +68,6 @@ class AngularCompilation {
@@ -78,8 +78,6 @@ class AngularCompilation {
allowEmptyCodegenFiles: false,
annotationsAs: 'decorators',
enableResourceInlining: false,
- supportTestBed: false,
- supportJitMode: false,
}));
}
async diagnoseFiles(modes = DiagnosticModes.All) {
// Disable removing of comments as TS is quite aggressive with these and can
// remove important annotations, such as /* @__PURE__ */ and comments like /* vite-ignore */.
removeComments: false,
diff --git a/node_modules/@angular/build/src/tools/esbuild/angular/compiler-plugin.js b/node_modules/@angular/build/src/tools/esbuild/angular/compiler-plugin.js
index b03875c..8c48101 100755
index ee68408..ac15cbf 100755
--- a/node_modules/@angular/build/src/tools/esbuild/angular/compiler-plugin.js
+++ b/node_modules/@angular/build/src/tools/esbuild/angular/compiler-plugin.js
@@ -79,7 +79,7 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
@@ -90,7 +90,7 @@ function createCompilerPlugin(pluginOptions, compilationOrFactory, stylesheetBun
sourcemap: !!pluginOptions.sourcemap,
thirdPartySourcemaps: pluginOptions.thirdPartySourcemaps,
advancedOptimizations: pluginOptions.advancedOptimizations,
- jit: pluginOptions.jit,
+ jit: true, // pluginOptions.jit,
- jit: pluginOptions.jit || pluginOptions.includeTestMetadata,
+ jit: true, //pluginOptions.jit || pluginOptions.includeTestMetadata,
}, environment_options_1.maxWorkers, cacheStore?.createCache('jstransformer'));
// Setup defines based on the values used by the Angular compiler-cli
build.initialOptions.define ??= {};
@@ -385,12 +385,14 @@ function createCompilerPlugin(pluginOptions, styleOptions) {
@@ -448,12 +448,14 @@ function createCompilerPlugin(pluginOptions, compilationOrFactory, stylesheetBun
async function hasSideEffects(path) {
if (!pluginOptions.advancedOptimizations) {
return undefined;
@ -41,3 +41,14 @@ index b03875c..8c48101 100755
}
},
};
@@ -554,9 +556,7 @@ function createCompilerOptionsTransformer(setupWarnings, pluginOptions, preserve
sourceRoot: undefined,
preserveSymlinks,
externalRuntimeStyles: pluginOptions.externalRuntimeStyles,
- _enableHmr: !!pluginOptions.templateUpdates,
- supportTestBed: !!pluginOptions.includeTestMetadata,
- supportJitMode: !!pluginOptions.includeTestMetadata,
+ _enableHmr: !!pluginOptions.templateUpdates
};
};
}

66
ui-ngx/patches/@angular+common+18.2.13.patch

@ -1,66 +0,0 @@
diff --git a/node_modules/@angular/common/esm2022/http/src/xsrf.mjs b/node_modules/@angular/common/esm2022/http/src/xsrf.mjs
index da69c17..d17f6ad 100755
--- a/node_modules/@angular/common/esm2022/http/src/xsrf.mjs
+++ b/node_modules/@angular/common/esm2022/http/src/xsrf.mjs
@@ -19,6 +19,10 @@ export const XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME
providedIn: 'root',
factory: () => XSRF_DEFAULT_HEADER_NAME,
});
+/**
+ * Regex to match absolute URLs, including protocol-relative URLs.
+ */
+const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i;
/**
* Retrieves the current XSRF token to use with the next outgoing request.
*
@@ -69,7 +73,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
args: [XSRF_COOKIE_NAME]
}] }] });
export function xsrfInterceptorFn(req, next) {
- const lcUrl = req.url.toLowerCase();
// Skip both non-mutating requests and absolute URLs.
// Non-mutating requests don't require a token, and absolute URLs require special handling
// anyway as the cookie set
@@ -77,8 +80,7 @@ export function xsrfInterceptorFn(req, next) {
if (!inject(XSRF_ENABLED) ||
req.method === 'GET' ||
req.method === 'HEAD' ||
- lcUrl.startsWith('http://') ||
- lcUrl.startsWith('https://')) {
+ ABSOLUTE_URL_REGEX.test(req.url)) {
return next(req);
}
const token = inject(HttpXsrfTokenExtractor).getToken();
diff --git a/node_modules/@angular/common/fesm2022/http.mjs b/node_modules/@angular/common/fesm2022/http.mjs
index 1655480..d1dbb38 100755
--- a/node_modules/@angular/common/fesm2022/http.mjs
+++ b/node_modules/@angular/common/fesm2022/http.mjs
@@ -2352,6 +2352,10 @@ const XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? 'XSRF_HEADER_NAME' : '',
providedIn: 'root',
factory: () => XSRF_DEFAULT_HEADER_NAME,
});
+/**
+ * Regex to match absolute URLs, including protocol-relative URLs.
+ */
+const ABSOLUTE_URL_REGEX = /^(?:https?:)?\/\//i;
/**
* Retrieves the current XSRF token to use with the next outgoing request.
*
@@ -2402,7 +2406,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
args: [XSRF_COOKIE_NAME]
}] }] });
function xsrfInterceptorFn(req, next) {
- const lcUrl = req.url.toLowerCase();
// Skip both non-mutating requests and absolute URLs.
// Non-mutating requests don't require a token, and absolute URLs require special handling
// anyway as the cookie set
@@ -2410,8 +2413,7 @@ function xsrfInterceptorFn(req, next) {
if (!inject(XSRF_ENABLED) ||
req.method === 'GET' ||
req.method === 'HEAD' ||
- lcUrl.startsWith('http://') ||
- lcUrl.startsWith('https://')) {
+ ABSOLUTE_URL_REGEX.test(req.url)) {
return next(req);
}
const token = inject(HttpXsrfTokenExtractor).getToken();

97
ui-ngx/patches/@angular+compiler+18.2.13.patch

@ -1,97 +0,0 @@
diff --git a/node_modules/@angular/compiler/fesm2022/compiler.mjs b/node_modules/@angular/compiler/fesm2022/compiler.mjs
index a00b189..58896de 100755
--- a/node_modules/@angular/compiler/fesm2022/compiler.mjs
+++ b/node_modules/@angular/compiler/fesm2022/compiler.mjs
@@ -18631,6 +18631,7 @@ function SECURITY_SCHEMA() {
'area|ping',
'audio|src',
'a|href',
+ 'a|xlink:href',
'a|ping',
'blockquote|cite',
'body|background',
@@ -18644,6 +18645,75 @@ function SECURITY_SCHEMA() {
'track|src',
'video|poster',
'video|src',
+
+ // MathML namespace
+ // https://crsrc.org/c/third_party/blink/renderer/core/sanitizer/sanitizer.cc;l=753-768;drc=b3eb16372dcd3317d65e9e0265015e322494edcd;bpv=1;bpt=1
+ 'annotation|href',
+ 'annotation|xlink:href',
+ 'annotation-xml|href',
+ 'annotation-xml|xlink:href',
+ 'maction|href',
+ 'maction|xlink:href',
+ 'malignmark|href',
+ 'malignmark|xlink:href',
+ 'math|href',
+ 'math|xlink:href',
+ 'mroot|href',
+ 'mroot|xlink:href',
+ 'msqrt|href',
+ 'msqrt|xlink:href',
+ 'merror|href',
+ 'merror|xlink:href',
+ 'mfrac|href',
+ 'mfrac|xlink:href',
+ 'mglyph|href',
+ 'mglyph|xlink:href',
+ 'msub|href',
+ 'msub|xlink:href',
+ 'msup|href',
+ 'msup|xlink:href',
+ 'msubsup|href',
+ 'msubsup|xlink:href',
+ 'mmultiscripts|href',
+ 'mmultiscripts|xlink:href',
+ 'mprescripts|href',
+ 'mprescripts|xlink:href',
+ 'mi|href',
+ 'mi|xlink:href',
+ 'mn|href',
+ 'mn|xlink:href',
+ 'mo|href',
+ 'mo|xlink:href',
+ 'mpadded|href',
+ 'mpadded|xlink:href',
+ 'mphantom|href',
+ 'mphantom|xlink:href',
+ 'mrow|href',
+ 'mrow|xlink:href',
+ 'ms|href',
+ 'ms|xlink:href',
+ 'mspace|href',
+ 'mspace|xlink:href',
+ 'mstyle|href',
+ 'mstyle|xlink:href',
+ 'mtable|href',
+ 'mtable|xlink:href',
+ 'mtd|href',
+ 'mtd|xlink:href',
+ 'mtr|href',
+ 'mtr|xlink:href',
+ 'mtext|href',
+ 'mtext|xlink:href',
+ 'mover|href',
+ 'mover|xlink:href',
+ 'munder|href',
+ 'munder|xlink:href',
+ 'munderover|href',
+ 'munderover|xlink:href',
+ 'semantics|href',
+ 'semantics|xlink:href',
+ 'none|href',
+ 'none|xlink:href',
]);
registerContext(SecurityContext.RESOURCE_URL, [
'applet|code',
@@ -18659,6 +18729,8 @@ function SECURITY_SCHEMA() {
'object|codebase',
'object|data',
'script|src',
+ 'script|href',
+ 'script|xlink:href',
]);
}
return _SECURITY_SCHEMA;

20
ui-ngx/patches/@angular+core+18.2.13.patch

@ -1,20 +0,0 @@
diff --git a/node_modules/@angular/core/fesm2022/core.mjs b/node_modules/@angular/core/fesm2022/core.mjs
index 7d9d345..b4d21c6 100755
--- a/node_modules/@angular/core/fesm2022/core.mjs
+++ b/node_modules/@angular/core/fesm2022/core.mjs
@@ -12859,13 +12859,13 @@ function findDirectiveDefMatches(tView, tNode) {
if (isNodeMatchingSelectorList(tNode, def.selectors, /* isProjectionMode */ false)) {
matches || (matches = []);
if (isComponentDef(def)) {
- if (ngDevMode) {
+ // if (ngDevMode) {
assertTNodeType(tNode, 2 /* TNodeType.Element */, `"${tNode.value}" tags cannot be used as component hosts. ` +
`Please use a different tag to activate the ${stringify(def.type)} component.`);
if (isComponentHost(tNode)) {
throwMultipleComponentError(tNode, matches.find(isComponentDef).type, def.type);
}
- }
+ // }
// Components are inserted at the front of the matches array so that their lifecycle
// hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
// compatibility. This logic doesn't make sense with host directives, because it

20
ui-ngx/patches/@angular+core+20.3.16.patch

@ -0,0 +1,20 @@
diff --git a/node_modules/@angular/core/fesm2022/debug_node.mjs b/node_modules/@angular/core/fesm2022/debug_node.mjs
index cdeef4b..2c8101f 100755
--- a/node_modules/@angular/core/fesm2022/debug_node.mjs
+++ b/node_modules/@angular/core/fesm2022/debug_node.mjs
@@ -9421,13 +9421,13 @@ function findDirectiveDefMatches(tView, tNode) {
if (isNodeMatchingSelectorList(tNode, def.selectors, /* isProjectionMode */ false)) {
matches ??= [];
if (isComponentDef(def)) {
- if (ngDevMode) {
+ //if (ngDevMode) {
assertTNodeType(tNode, 2 /* TNodeType.Element */, `"${tNode.value}" tags cannot be used as component hosts. ` +
`Please use a different tag to activate the ${stringify(def.type)} component.`);
if (matches.length && isComponentDef(matches[0])) {
throwMultipleComponentError(tNode, matches.find(isComponentDef).type, def.type);
}
- }
+ //}
matches.unshift(def);
}
else {

61
ui-ngx/patches/@angular+material+18.2.14.patch

@ -1,61 +0,0 @@
diff --git a/node_modules/@angular/material/autocomplete/index.d.ts b/node_modules/@angular/material/autocomplete/index.d.ts
index 1ebc198..f572ea2 100755
--- a/node_modules/@angular/material/autocomplete/index.d.ts
+++ b/node_modules/@angular/material/autocomplete/index.d.ts
@@ -220,6 +220,10 @@ export declare interface MatAutocompleteDefaultOptions {
requireSelection?: boolean;
/** Class or list of classes to be applied to the autocomplete's overlay panel. */
overlayPanelClass?: string | string[];
+
+ backdropClass?: string;
+
+ hasBackdrop?: boolean;
/** Wheter icon indicators should be hidden for single-selection. */
hideSingleSelectionIndicator?: boolean;
}
diff --git a/node_modules/@angular/material/esm2022/autocomplete/autocomplete-trigger.mjs b/node_modules/@angular/material/esm2022/autocomplete/autocomplete-trigger.mjs
index 193f5e4..833446a 100755
--- a/node_modules/@angular/material/esm2022/autocomplete/autocomplete-trigger.mjs
+++ b/node_modules/@angular/material/esm2022/autocomplete/autocomplete-trigger.mjs
@@ -670,6 +670,8 @@ export class MatAutocompleteTrigger {
scrollStrategy: this._scrollStrategy(),
width: this._getPanelWidth(),
direction: this._dir ?? undefined,
+ hasBackdrop: this._defaults?.hasBackdrop,
+ backdropClass: this._defaults?.backdropClass,
panelClass: this._defaults?.overlayPanelClass,
});
}
diff --git a/node_modules/@angular/material/esm2022/autocomplete/autocomplete.mjs b/node_modules/@angular/material/esm2022/autocomplete/autocomplete.mjs
index 3d919a4..5fd6b4d 100755
--- a/node_modules/@angular/material/esm2022/autocomplete/autocomplete.mjs
+++ b/node_modules/@angular/material/esm2022/autocomplete/autocomplete.mjs
@@ -41,6 +41,7 @@ export function MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY() {
autoSelectActiveOption: false,
hideSingleSelectionIndicator: false,
requireSelection: false,
+ hasBackdrop: false,
};
}
/** Autocomplete component. */
diff --git a/node_modules/@angular/material/fesm2022/autocomplete.mjs b/node_modules/@angular/material/fesm2022/autocomplete.mjs
index e3d0253..36cd6d7 100755
--- a/node_modules/@angular/material/fesm2022/autocomplete.mjs
+++ b/node_modules/@angular/material/fesm2022/autocomplete.mjs
@@ -65,6 +65,7 @@ function MAT_AUTOCOMPLETE_DEFAULT_OPTIONS_FACTORY() {
autoSelectActiveOption: false,
hideSingleSelectionIndicator: false,
requireSelection: false,
+ hasBackdrop: false,
};
}
/** Autocomplete component. */
@@ -926,6 +927,8 @@ class MatAutocompleteTrigger {
scrollStrategy: this._scrollStrategy(),
width: this._getPanelWidth(),
direction: this._dir ?? undefined,
+ hasBackdrop: this._defaults?.hasBackdrop,
+ backdropClass: this._defaults?.backdropClass,
panelClass: this._defaults?.overlayPanelClass,
});
}

97
ui-ngx/patches/@iplab+ngx-color-picker+18.0.1.patch

File diff suppressed because one or more lines are too long

46
ui-ngx/patches/@iplab+ngx-color-picker+20.0.0.patch

@ -0,0 +1,46 @@
diff --git a/node_modules/@iplab/ngx-color-picker/fesm2022/iplab-ngx-color-picker.mjs b/node_modules/@iplab/ngx-color-picker/fesm2022/iplab-ngx-color-picker.mjs
index a372799..a3d709a 100644
--- a/node_modules/@iplab/ngx-color-picker/fesm2022/iplab-ngx-color-picker.mjs
+++ b/node_modules/@iplab/ngx-color-picker/fesm2022/iplab-ngx-color-picker.mjs
@@ -1129,11 +1129,11 @@ class RgbaComponent {
this.color.set(newColor);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: RgbaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: RgbaComponent, isStandalone: true, selector: "rgba-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isAlphaVisible: { classPropertyName: "isAlphaVisible", publicName: "alpha", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getRed().toString()\" (inputChange)=\"onInputChange($event, 'R')\" />\r\n @if (labelVisible()) {\r\n <span>R</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getGreen().toString()\" (inputChange)=\"onInputChange($event, 'G')\" />\r\n @if (labelVisible()) {\r\n <span>G</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getBlue().toString()\" (inputChange)=\"onInputChange($event, 'B')\" />\r\n @if (labelVisible()) {\r\n <span>B</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], dependencies: [{ kind: "directive", type: ColorPickerInputDirective, selector: "[inputChange]", inputs: ["min", "max"], outputs: ["inputChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: RgbaComponent, isStandalone: true, selector: "rgba-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isAlphaVisible: { classPropertyName: "isAlphaVisible", publicName: "alpha", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getRed().toString()\" (inputChange)=\"onInputChange($event, 'R')\" />\r\n @if (labelVisible()) {\r\n <span>R</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getGreen().toString()\" (inputChange)=\"onInputChange($event, 'G')\" />\r\n @if (labelVisible()) {\r\n <span>G</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getBlue().toString()\" (inputChange)=\"onInputChange($event, 'B')\" />\r\n @if (labelVisible()) {\r\n <span>B</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], dependencies: [{ kind: "directive", type: ColorPickerInputDirective, selector: "[inputChange]", inputs: ["min", "max"], outputs: ["inputChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: RgbaComponent, decorators: [{
type: Component,
- args: [{ selector: `rgba-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ColorPickerInputDirective], template: "<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getRed().toString()\" (inputChange)=\"onInputChange($event, 'R')\" />\r\n @if (labelVisible()) {\r\n <span>R</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getGreen().toString()\" (inputChange)=\"onInputChange($event, 'G')\" />\r\n @if (labelVisible()) {\r\n <span>G</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getBlue().toString()\" (inputChange)=\"onInputChange($event, 'B')\" />\r\n @if (labelVisible()) {\r\n <span>B</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
+ args: [{ selector: `rgba-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ColorPickerInputDirective], template: "<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getRed().toString()\" (inputChange)=\"onInputChange($event, 'R')\" />\r\n @if (labelVisible()) {\r\n <span>R</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getGreen().toString()\" (inputChange)=\"onInputChange($event, 'G')\" />\r\n @if (labelVisible()) {\r\n <span>G</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"255\" [value]=\"value?.getBlue().toString()\" (inputChange)=\"onInputChange($event, 'B')\" />\r\n @if (labelVisible()) {\r\n <span>B</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
}] });
class HslaComponent {
@@ -1155,11 +1155,11 @@ class HslaComponent {
this.color.set(newColor);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: HslaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: HslaComponent, isStandalone: true, selector: "hsla-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isAlphaVisible: { classPropertyName: "isAlphaVisible", publicName: "alpha", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"360\" [value]=\"value?.getHue().toString()\" (inputChange)=\"onInputChange($event, 'H')\" />\r\n @if (labelVisible()) {\r\n <span>H</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getSaturation() + '%'\" (inputChange)=\"onInputChange($event, 'S')\" />\r\n @if (labelVisible()) {\r\n <span>S</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getLightness() + '%'\" (inputChange)=\"onInputChange($event, 'L')\" />\r\n @if (labelVisible()) {\r\n <span>L</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], dependencies: [{ kind: "directive", type: ColorPickerInputDirective, selector: "[inputChange]", inputs: ["min", "max"], outputs: ["inputChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: HslaComponent, isStandalone: true, selector: "hsla-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, isAlphaVisible: { classPropertyName: "isAlphaVisible", publicName: "alpha", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"360\" [value]=\"value?.getHue().toString()\" (inputChange)=\"onInputChange($event, 'H')\" />\r\n @if (labelVisible()) {\r\n <span>H</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getSaturation() + '%'\" (inputChange)=\"onInputChange($event, 'S')\" />\r\n @if (labelVisible()) {\r\n <span>S</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getLightness() + '%'\" (inputChange)=\"onInputChange($event, 'L')\" />\r\n @if (labelVisible()) {\r\n <span>L</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], dependencies: [{ kind: "directive", type: ColorPickerInputDirective, selector: "[inputChange]", inputs: ["min", "max"], outputs: ["inputChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: HslaComponent, decorators: [{
type: Component,
- args: [{ selector: `hsla-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ColorPickerInputDirective], template: "<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"360\" [value]=\"value?.getHue().toString()\" (inputChange)=\"onInputChange($event, 'H')\" />\r\n @if (labelVisible()) {\r\n <span>H</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getSaturation() + '%'\" (inputChange)=\"onInputChange($event, 'S')\" />\r\n @if (labelVisible()) {\r\n <span>S</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getLightness() + '%'\" (inputChange)=\"onInputChange($event, 'L')\" />\r\n @if (labelVisible()) {\r\n <span>L</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"text\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
+ args: [{ selector: `hsla-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ColorPickerInputDirective], template: "<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"360\" [value]=\"value?.getHue().toString()\" (inputChange)=\"onInputChange($event, 'H')\" />\r\n @if (labelVisible()) {\r\n <span>H</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getSaturation() + '%'\" (inputChange)=\"onInputChange($event, 'S')\" />\r\n @if (labelVisible()) {\r\n <span>S</span>\r\n }\r\n</div>\r\n<div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]*\" min=\"0\" max=\"100\" [value]=\"value?.getLightness() + '%'\" (inputChange)=\"onInputChange($event, 'L')\" />\r\n @if (labelVisible()) {\r\n <span>L</span>\r\n }\r\n</div>\r\n@if (isAlphaVisible()) {\r\n <div class=\"column\">\r\n <input type=\"number\" pattern=\"[0-9]+([\\.,][0-9]{1,2})?\" min=\"0\" max=\"1\" [value]=\"value?.getAlpha(true).toString()\" (inputChange)=\"onInputChange($event, 'A')\" />\r\n @if (labelVisible()) {\r\n <span>A</span>\r\n }\r\n </div>\r\n}", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
}] });
class HexComponent {
@@ -1190,11 +1190,11 @@ class HexComponent {
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: HexComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: HexComponent, isStandalone: true, selector: "hex-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, prefixValue: { classPropertyName: "prefixValue", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input #elRef type=\"text\" [value]=\"value\" (keyup)=\"onInputChange($event, elRef.value)\" />\r\n @if (labelVisible()) {\r\n <span>HEX</span>\r\n }\r\n</div>", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: HexComponent, isStandalone: true, selector: "hex-input-component", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: true, transformFunction: null }, labelVisible: { classPropertyName: "labelVisible", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, prefixValue: { classPropertyName: "prefixValue", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { color: "colorChange" }, ngImport: i0, template: "<div class=\"column\">\r\n <input #elRef type=\"number\" [value]=\"value\" (keyup)=\"onInputChange($event, elRef.value)\" />\r\n @if (labelVisible()) {\r\n <span>HEX</span>\r\n }\r\n</div>", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n", ""], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: HexComponent, decorators: [{
type: Component,
- args: [{ selector: `hex-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"column\">\r\n <input #elRef type=\"text\" [value]=\"value\" (keyup)=\"onInputChange($event, elRef.value)\" />\r\n @if (labelVisible()) {\r\n <span>HEX</span>\r\n }\r\n</div>", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
+ args: [{ selector: `hex-input-component`, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"column\">\r\n <input #elRef type=\"number\" [value]=\"value\" (keyup)=\"onInputChange($event, elRef.value)\" />\r\n @if (labelVisible()) {\r\n <span>HEX</span>\r\n }\r\n</div>", styles: [":host,:host ::ng-deep *{padding:0;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n", ":host{display:table;width:100%;text-align:center;color:#b4b4b4;font-size:11px}.column{display:table-cell;padding:0 2px}input{width:100%;border:1px solid rgb(218,218,218);color:#272727;text-align:center;font-size:12px;-webkit-appearance:none;border-radius:0;margin:0 0 6px;height:26px;outline:none}\n"] }]
}] });
const OpacityAnimation = trigger('opacityAnimation', [

92
ui-ngx/patches/@mat-datetimepicker+core+14.0.0.patch

@ -1,92 +0,0 @@
diff --git a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/clock.mjs b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/clock.mjs
index 7ecfae7..08363d3 100644
--- a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/clock.mjs
+++ b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/clock.mjs
@@ -259,9 +259,9 @@ export class MatDatetimepickerClockComponent {
value = 0;
}
// Don't close the minutes view if an invalid minute is clicked.
- if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
- return;
- }
+ // if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
+ // return;
+ // }
date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value);
}
this._timeChanged = true;
diff --git a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs
index 5b82377..30e35ce 100644
--- a/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs
+++ b/node_modules/@mat-datetimepicker/core/esm2022/datetimepicker/datetimepicker.mjs
@@ -48,7 +48,7 @@ export class MatDatetimepickerContentComponent {
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i2.MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i2.MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, decorators: [{
type: Component,
@@ -56,7 +56,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
class: 'mat-datetimepicker-content',
'[class.mat-datetimepicker-content-touch]': 'datetimepicker?.touchUi',
'(keydown)': '_handleKeydown($event)',
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
}], propDecorators: { _calendar: [{
type: ViewChild,
args: [MatDatetimepickerCalendarComponent, { static: true }]
@@ -301,7 +301,7 @@ export class MatDatetimepickerComponent {
const overlayConfig = new OverlayConfig({
positionStrategy: this._createPopupPositionStrategy(),
hasBackdrop: true,
- backdropClass: 'mat-overlay-transparent-backdrop',
+ backdropClass: 'cdk-overlay-transparent-backdrop',
direction: this._dir ? this._dir.value : 'ltr',
scrollStrategy: this._scrollStrategy(),
panelClass: 'mat-datetimepicker-popup',
diff --git a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
index 00f4a52..99c0ac1 100644
--- a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
+++ b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
@@ -946,9 +946,9 @@ class MatDatetimepickerClockComponent {
value = 0;
}
// Don't close the minutes view if an invalid minute is clicked.
- if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
- return;
- }
+ // if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
+ // return;
+ // }
date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value);
}
this._timeChanged = true;
@@ -1911,7 +1911,7 @@ class MatDatetimepickerContentComponent {
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.4", type: MatDatetimepickerContentComponent, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatDatetimepickerContentComponent, decorators: [{
type: Component,
@@ -1919,7 +1919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
class: 'mat-datetimepicker-content',
'[class.mat-datetimepicker-content-touch]': 'datetimepicker?.touchUi',
'(keydown)': '_handleKeydown($event)',
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
}], propDecorators: { _calendar: [{
type: ViewChild,
args: [MatDatetimepickerCalendarComponent, { static: true }]
@@ -2164,7 +2164,7 @@ class MatDatetimepickerComponent {
const overlayConfig = new OverlayConfig({
positionStrategy: this._createPopupPositionStrategy(),
hasBackdrop: true,
- backdropClass: 'mat-overlay-transparent-backdrop',
+ backdropClass: 'cdk-overlay-transparent-backdrop',
direction: this._dir ? this._dir.value : 'ltr',
scrollStrategy: this._scrollStrategy(),
panelClass: 'mat-datetimepicker-popup',

44
ui-ngx/patches/@mat-datetimepicker+core+16.0.1.patch

@ -0,0 +1,44 @@
diff --git a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
index 83a6413..6ebae81 100644
--- a/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
+++ b/node_modules/@mat-datetimepicker/core/fesm2022/mat-datetimepicker-core.mjs
@@ -935,9 +935,9 @@ class MatDatetimepickerClockComponent {
value = 0;
}
// Don't close the minutes view if an invalid minute is clicked.
- if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
- return;
- }
+ // if (!this._minutes.find((m) => m?.['value'] === value)?.['enabled']) {
+ // return;
+ // }
date = this._adapter.createDatetime(this._adapter.getYear(this.activeDate), this._adapter.getMonth(this.activeDate), this._adapter.getDate(this.activeDate), this._adapter.getHour(this.activeDate), value);
}
this._timeChanged = true;
@@ -1889,7 +1889,7 @@ class MatDatetimepickerContentComponent {
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: MatDatetimepickerContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.3", type: MatDatetimepickerContentComponent, isStandalone: false, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.3", type: MatDatetimepickerContentComponent, isStandalone: false, selector: "mat-datetimepicker-content", host: { listeners: { "keydown": "_handleKeydown($event)" }, properties: { "class.mat-datetimepicker-content-touch": "datetimepicker?.touchUi" }, classAttribute: "mat-datetimepicker-content" }, viewQueries: [{ propertyName: "_calendar", first: true, predicate: MatDatetimepickerCalendarComponent, descendants: true, static: true }], ngImport: i0, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"], dependencies: [{ kind: "directive", type: i1$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatDatetimepickerCalendarComponent, selector: "mat-datetimepicker-calendar", inputs: ["multiYearSelector", "startView", "twelvehour", "timeInterval", "dateFilter", "ariaLabel", "ariaNextMonthLabel", "ariaPrevMonthLabel", "ariaNextYearLabel", "ariaPrevYearLabel", "ariaNextMultiYearLabel", "ariaPrevMultiYearLabel", "preventSameDateTimeSelection", "type", "startAt", "selected", "minDate", "maxDate"], outputs: ["_userSelection", "selectedChange", "viewChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: MatDatetimepickerContentComponent, decorators: [{
type: Component,
@@ -1897,7 +1897,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImpor
class: 'mat-datetimepicker-content',
'[class.mat-datetimepicker-content-touch]': 'datetimepicker?.touchUi',
'(keydown)': '_handleKeydown($event)',
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:#0009}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<mat-datetimepicker-calendar\n (_userSelection)=\"datetimepicker.close()\"\n (selectedChange)=\"onSelectionChange($event)\"\n (viewChanged)=\"datetimepicker._viewChanged($event)\"\n [ariaNextMonthLabel]=\"datetimepicker.ariaNextMonthLabel\"\n [ariaNextYearLabel]=\"datetimepicker.ariaNextYearLabel\"\n [ariaPrevMonthLabel]=\"datetimepicker.ariaPrevMonthLabel\"\n [ariaPrevYearLabel]=\"datetimepicker.ariaPrevYearLabel\"\n [preventSameDateTimeSelection]=\"datetimepicker.preventSameDateTimeSelection\"\n [attr.mode]=\"datetimepicker.mode\"\n [dateFilter]=\"datetimepicker._dateFilter\"\n [id]=\"datetimepicker.id\"\n [maxDate]=\"datetimepicker._maxDate\"\n [minDate]=\"datetimepicker._minDate\"\n [multiYearSelector]=\"datetimepicker.multiYearSelector\"\n [selected]=\"datetimepicker._selected\"\n [startAt]=\"datetimepicker.startAt\"\n [startView]=\"datetimepicker.startView\"\n [timeInterval]=\"datetimepicker.timeInterval\"\n [twelvehour]=\"datetimepicker.twelvehour\"\n [type]=\"datetimepicker.type\"\n cdkTrapFocus\n class=\"mat-typography\"\n>\n</mat-datetimepicker-calendar>\n", styles: [".mat-datetimepicker-content{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;display:block;background-color:#fff;border-radius:2px;overflow:hidden}.mat-datetimepicker-calendar{width:296px;height:405px}.mat-datetimepicker-calendar[mode=landscape]{width:446px;height:328px}@media (min-width: 480px){.mat-datetimepicker-calendar[mode=auto]{width:446px;height:328px}}.mat-datetimepicker-content-touch{box-shadow:0 0 #0003,0 0 #00000024,0 0 #0000001f;display:block;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.mat-datetimepicker-dialog .mat-dialog-container{padding:0}\n"] }]
}], propDecorators: { _calendar: [{
type: ViewChild,
args: [MatDatetimepickerCalendarComponent, { static: true }]
@@ -2150,7 +2150,7 @@ class MatDatetimepickerComponent {
const overlayConfig = new OverlayConfig({
positionStrategy: this._createPopupPositionStrategy(),
hasBackdrop: true,
- backdropClass: 'mat-overlay-transparent-backdrop',
+ backdropClass: 'cdk-overlay-transparent-backdrop',
direction: this._dir ? this._dir.value : 'ltr',
scrollStrategy: this._scrollStrategy(),
panelClass: 'mat-datetimepicker-popup',

4
ui-ngx/patches/angular-gridster2+18.0.1.patch → ui-ngx/patches/angular-gridster2+20.2.4.patch

@ -1,8 +1,8 @@
diff --git a/node_modules/angular-gridster2/fesm2022/angular-gridster2.mjs b/node_modules/angular-gridster2/fesm2022/angular-gridster2.mjs
index 0dcd873..e99b602 100644
index 9fbf502..ee1b125 100644
--- a/node_modules/angular-gridster2/fesm2022/angular-gridster2.mjs
+++ b/node_modules/angular-gridster2/fesm2022/angular-gridster2.mjs
@@ -666,8 +666,8 @@ class GridsterRenderer {
@@ -777,8 +777,8 @@ class GridsterRenderer {
renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', '');
}
else {

15
ui-ngx/patches/echarts+5.5.1-TB.patch

@ -0,0 +1,15 @@
diff --git a/node_modules/echarts/index.d.ts b/node_modules/echarts/index.d.ts
index 811908a..5f77c60 100644
--- a/node_modules/echarts/index.d.ts
+++ b/node_modules/echarts/index.d.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import * as echarts from './types/dist/echarts';
+// import * as echarts from './types/dist/echarts';
// Export for UMD module.
export as namespace echarts;
-export = echarts;
\ No newline at end of file
+export * from './types/dist/echarts';

27
ui-ngx/patches/jquery.terminal+2.44.1.patch

File diff suppressed because one or more lines are too long

9
ui-ngx/src/app/app.component.ts

@ -35,9 +35,10 @@ import { SETTINGS_KEY } from '@core/settings/settings.effects';
import { initCustomJQueryEvents } from '@shared/models/jquery-event.models';
@Component({
selector: 'tb-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
selector: 'tb-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
standalone: false
})
export class AppComponent {
@ -87,7 +88,7 @@ export class AppComponent {
if (!env.production) {
console.log(`Default Lang: ${env.defaultLang}`);
}
this.translate.setDefaultLang(env.defaultLang);
this.translate.setFallbackLang(env.defaultLang);
}
setupAuth() {

24
ui-ngx/src/app/core/services/resources.service.ts

@ -24,14 +24,15 @@ import {
ɵCssSelectorList,
ɵNG_COMP_DEF,
ɵNG_MOD_DEF,
ɵNgModuleDef
ɵNgModuleDef,
DOCUMENT
} from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { forkJoin, from, Observable, ReplaySubject, throwError } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { IModulesMap } from '@modules/common/modules-map.models';
import { TbResourceId } from '@shared/models/id/tb-resource-id';
import { camelCase, isObject } from '@core/utils';
import { camelCase, isObject, isUndefined } from '@core/utils';
import { AuthService } from '@core/auth/auth.service';
import { select, Store } from '@ngrx/store';
import { selectIsAuthenticated } from '@core/auth/auth.selectors';
@ -286,6 +287,23 @@ export class ResourcesService {
module: moduleDef,
components: []
}
const declarationsDecl = moduleDef.declarations;
let declarations: Type<any>[];
if (Array.isArray(declarationsDecl)) {
declarations = declarationsDecl;
} else {
declarations = declarationsDecl();
}
if (declarations) {
for (const decl of declarations) {
if (ɵNG_COMP_DEF in decl) {
const component: ɵComponentDef<any> = decl[ɵNG_COMP_DEF];
if (isUndefined(component.standalone) || component.standalone) {
(component as any).standalone = false;
}
}
}
}
modulesWithComponents.modules.push(moduleInfo);
const exportsDecl = moduleDef.exports;
let exports: Type<any>[];

4
ui-ngx/src/app/core/services/utils.service.ts

@ -14,7 +14,7 @@
/// limitations under the License.
///
import { Inject, Injectable, NgZone, Renderer2 } from '@angular/core';
import { Inject, Injectable, NgZone, Renderer2, DOCUMENT } from '@angular/core';
import { WINDOW } from '@core/services/window.service';
import { ExceptionData, parseException } from '@app/shared/models/error.models';
import {
@ -45,7 +45,7 @@ import { publishReplay, refCount } from 'rxjs/operators';
import { WidgetContext } from '@app/modules/home/models/widget-component.models';
import { AttributeData, LatestTelemetry, TelemetryType } from '@shared/models/telemetry/telemetry.models';
import { EntityId } from '@shared/models/id/entity-id';
import { DatePipe, DOCUMENT } from '@angular/common';
import { DatePipe } from '@angular/common';
import { entityTypeTranslations } from '@shared/models/entity-type.models';
import cssjs from '@core/css/css';
import { isNotEmptyTbFunction } from '@shared/models/js-function.models';

4
ui-ngx/src/app/core/settings/settings.effects.ts

@ -15,7 +15,7 @@
///
import { ActivationEnd, Router } from '@angular/router';
import { Inject, Injectable } from '@angular/core';
import { Inject, Injectable, DOCUMENT } from '@angular/core';
import { select, Store } from '@ngrx/store';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { TranslateService } from '@ngx-translate/core';
@ -31,7 +31,7 @@ import { updateUserLang } from '@app/core/settings/settings.utils';
import { UtilsService } from '@core/services/utils.service';
import { getCurrentAuthUser } from '@core/auth/auth.selectors';
import { ActionAuthUpdateLastPublicDashboardId } from '../auth/auth.actions';
import { DOCUMENT } from '@angular/common';
export const SETTINGS_KEY = 'SETTINGS';

8
ui-ngx/src/app/core/translate/missing-translate-handler.ts

@ -14,11 +14,12 @@
/// limitations under the License.
///
import { MissingTranslationHandler, MissingTranslationHandlerParams } from '@ngx-translate/core';
import { MissingTranslationHandler, MissingTranslationHandlerParams, StrictTranslation } from '@ngx-translate/core';
import { customTranslationsPrefix } from '@app/shared/models/constants';
import { Observable } from 'rxjs';
export class TbMissingTranslationHandler implements MissingTranslationHandler {
handle(params: MissingTranslationHandlerParams) {
handle(params: MissingTranslationHandlerParams): StrictTranslation | Observable<StrictTranslation> {
if (params.key && !params.key.startsWith(customTranslationsPrefix)) {
console.warn('Translation for \'' + params.key + '\' doesn\'t exist');
let translations: any;
@ -32,7 +33,8 @@ export class TbMissingTranslationHandler implements MissingTranslationHandler {
}
translations = newTranslations;
}
params.translateService.setTranslation(params.translateService.currentLang, translations, true);
params.translateService.setTranslation(params.translateService.getCurrentLang(), translations, true);
}
return undefined;
}
}

6
ui-ngx/src/app/core/translate/translate-default-loader.ts

@ -14,7 +14,7 @@
/// limitations under the License.
///
import { TranslateLoader } from '@ngx-translate/core';
import { TranslateLoader, TranslationObject } from '@ngx-translate/core';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@ -26,7 +26,7 @@ export class TranslateDefaultLoader implements TranslateLoader {
}
getTranslation(lang: string): Observable<object> {
return this.http.get(`/assets/locale/locale.constant-${lang}.json`);
getTranslation(lang: string): Observable<TranslationObject> {
return this.http.get<TranslationObject>(`/assets/locale/locale.constant-${lang}.json`);
}
}

10
ui-ngx/src/app/core/translate/translate-default-parser.ts

@ -15,15 +15,14 @@
///
import { Injectable } from '@angular/core';
import { TranslateParser } from '@ngx-translate/core';
import { InterpolateFunction, InterpolationParameters, TranslateParser } from '@ngx-translate/core';
import { isDefinedAndNotNull } from '@core/utils';
@Injectable({ providedIn: 'root' })
export class TranslateDefaultParser extends TranslateParser {
templateMatcher: RegExp = /{{\s?([^{}\s]*)\s?}}/g;
// eslint-disable-next-line @typescript-eslint/ban-types
public interpolate(expr: string | Function, params?: any): string {
public interpolate(expr: string | InterpolateFunction, params?: InterpolationParameters): string {
let result: string;
if (typeof expr === 'string') {
@ -58,12 +57,11 @@ export class TranslateDefaultParser extends TranslateParser {
return target;
}
// eslint-disable-next-line @typescript-eslint/ban-types
private interpolateFunction(fn: Function, params?: any) {
private interpolateFunction(fn: InterpolateFunction, params?: InterpolationParameters) {
return fn(params);
}
private interpolateString(expr: string, params?: any) {
private interpolateString(expr: string, params?: InterpolationParameters) {
if (!params) {
return expr;
}

56
ui-ngx/src/app/modules/common/modules-map.ts

@ -14,8 +14,6 @@
/// limitations under the License.
///
/* eslint-disable max-len */
import * as AngularAnimations from '@angular/animations';
import * as AngularCore from '@angular/core';
import * as AngularCommon from '@angular/common';
@ -344,6 +342,7 @@ import * as AIModelDialogComponent from '@home/components/ai-model/ai-model-dial
import { IModulesMap } from '@modules/common/modules-map.models';
import { Observable, of } from 'rxjs';
import { isJSResourceUrl } from '@shared/public-api';
import { ɵɵinterpolate, ɵɵinterpolate2 } from '@angular/core';
class ModulesMap implements IModulesMap {
@ -351,7 +350,7 @@ class ModulesMap implements IModulesMap {
private modulesMap: {[key: string]: any} = {
'@angular/animations': AngularAnimations,
'@angular/core': AngularCore,
'@angular/core': this.angularCoreModule20to18Patch(AngularCore),
'@angular/common': AngularCommon,
'@angular/common/http': HttpClientModule,
'@angular/forms': AngularForms,
@ -405,7 +404,7 @@ class ModulesMap implements IModulesMap {
'@ngrx/store': NgrxStore,
rxjs: RxJs,
'rxjs/operators': RxJsOperators,
'@ngx-translate/core': TranslateCore,
'@ngx-translate/core': this.translateModule20to18Patch(TranslateCore),
'@mat-datetimepicker/core': MatDateTimePicker,
moment: _moment,
tslib,
@ -706,6 +705,55 @@ class ModulesMap implements IModulesMap {
}
return of(null);
}
private angularCoreModule20to18Patch(module: typeof AngularCore): typeof AngularCore {
const result = {...module};
(result as any).ɵɵStandaloneFeature = () => {};
(result as any).ɵɵInputTransformsFeature = () => {};
(result as any).ɵɵpropertyInterpolate = (propName: string, v0: any, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate(v0), sanitizer);
};
(result as any).ɵɵpropertyInterpolate1 = (propName: string, prefix: string, v0: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate1(prefix, v0, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate2 = (propName: string, prefix: string, v0: any, i0: string, v1: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate2(prefix, v0, i0, v1, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate3 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate3(prefix, v0, i0, v1, i1, v2, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate4 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate5 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate6 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate7 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolate8 = (propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string, sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix), sanitizer);
};
(result as any).ɵɵpropertyInterpolateV = (propName: string, values: any[], sanitizer?: any) => {
return result.ɵɵproperty(propName, result.ɵɵinterpolateV(values), sanitizer);
};
return result;
}
private translateModule20to18Patch(module: typeof TranslateCore): typeof TranslateCore {
const translateServiceCls = module.TranslateService;
Object.defineProperty(translateServiceCls.prototype, 'translations', {
get: function() {
return this.store.translations;
},
enumerable: true,
configurable: true
});
return module;
}
}
export const modulesMap = new ModulesMap();

7
ui-ngx/src/app/modules/home/components/ai-model/ai-model-dialog.component.ts

@ -47,9 +47,10 @@ export interface AIModelDialogData {
}
@Component({
selector: 'tb-ai-model-dialog',
templateUrl: './ai-model-dialog.component.html',
styleUrls: ['./ai-model-dialog.component.scss']
selector: 'tb-ai-model-dialog',
templateUrl: './ai-model-dialog.component.html',
styleUrls: ['./ai-model-dialog.component.scss'],
standalone: false
})
export class AIModelDialogComponent extends DialogComponent<AIModelDialogComponent, AiModel> {

7
ui-ngx/src/app/modules/home/components/ai-model/check-connectivity-dialog.component.ts

@ -28,9 +28,10 @@ export interface AIModelDialogData {
}
@Component({
selector: 'tb-check-connectivity-dialog',
templateUrl: './check-connectivity-dialog.component.html',
styleUrls: ['./check-connectivity-dialog.component.scss']
selector: 'tb-check-connectivity-dialog',
templateUrl: './check-connectivity-dialog.component.html',
styleUrls: ['./check-connectivity-dialog.component.scss'],
standalone: false
})
export class CheckConnectivityDialogComponent extends DialogComponent<CheckConnectivityDialogComponent> {

9
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-details-dialog.component.ts

@ -28,10 +28,11 @@ export interface AlarmRuleDetailsDialogData {
}
@Component({
selector: 'tb-edit-alarm-details-dialog',
templateUrl: './alarm-rule-details-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
selector: 'tb-edit-alarm-details-dialog',
templateUrl: './alarm-rule-details-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
standalone: false
})
export class AlarmRuleDetailsDialogComponent extends DialogComponent<AlarmRuleDetailsDialogComponent, string> {

9
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-dialog.component.ts

@ -61,10 +61,11 @@ export interface AlarmRuleDialogData {
}
@Component({
selector: 'tb-alarm-rule-dialog',
templateUrl: './alarm-rule-dialog.component.html',
styleUrls: ['./alarm-rule-dialog.component.scss'],
encapsulation: ViewEncapsulation.None
selector: 'tb-alarm-rule-dialog',
templateUrl: './alarm-rule-dialog.component.html',
styleUrls: ['./alarm-rule-dialog.component.scss'],
encapsulation: ViewEncapsulation.None,
standalone: false
})
export class AlarmRuleDialogComponent extends DialogComponent<AlarmRuleDialogComponent, CalculatedField> {

21
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-filter-config.component.ts

@ -51,16 +51,17 @@ export interface AlarmRuleFilterConfigData {
}
@Component({
selector: 'tb-alarm-rule-filter-config',
templateUrl: './alarm-rule-filter-config.component.html',
styleUrls: ['./alarm-rule-filter-config.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterConfigComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-config',
templateUrl: './alarm-rule-filter-config.component.html',
styleUrls: ['./alarm-rule-filter-config.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterConfigComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterConfigComponent implements OnInit, ControlValueAccessor {

7
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rule-table-header.component.ts

@ -22,9 +22,10 @@ import { CalculatedFieldAlarmRule, CalculatedFieldsQuery } from "@shared/models/
import { AlarmRulesTableConfig } from "@home/components/alarm-rules/alarm-rules-table-config";
@Component({
selector: 'tb-alarm-rule-table-header',
templateUrl: './alarm-rule-table-header.component.html',
styleUrls: ['./alarm-rule-table-header.component.scss']
selector: 'tb-alarm-rule-table-header',
templateUrl: './alarm-rule-table-header.component.html',
styleUrls: ['./alarm-rule-table-header.component.scss'],
standalone: false
})
export class AlarmRuleTableHeaderComponent extends EntityTableHeaderComponent<CalculatedFieldAlarmRule> {

11
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules-table.component.ts

@ -39,11 +39,12 @@ import { UtilsService } from "@core/services/utils.service";
import { ActivatedRoute, Router } from "@angular/router";
@Component({
selector: 'tb-alarm-rules-table',
templateUrl: './alarm-rules-table.component.html',
styleUrls: ['./alarm-rules-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [EntityDebugSettingsService]
selector: 'tb-alarm-rules-table',
templateUrl: './alarm-rules-table.component.html',
styleUrls: ['./alarm-rules-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [EntityDebugSettingsService],
standalone: false
})
export class AlarmRulesTableComponent {

7
ui-ngx/src/app/modules/home/components/alarm-rules/alarm-rules.component.ts

@ -51,9 +51,10 @@ import { NULL_UUID } from '@shared/models/id/has-uuid';
import { EntityService } from '@core/http/entity.service';
@Component({
selector: 'tb-alarm-rules',
templateUrl: './alarm-rules.component.html',
styleUrls: ['./alarm-rule-dialog.component.scss']
selector: 'tb-alarm-rules',
templateUrl: './alarm-rules.component.html',
styleUrls: ['./alarm-rule-dialog.component.scss'],
standalone: false
})
export class AlarmRulesComponent extends EntityComponent<CalculatedFieldsTableEntity> {

9
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition-dialog.component.ts

@ -53,10 +53,11 @@ export interface CfAlarmRuleConditionDialogData {
}
@Component({
selector: 'tb-cf-alarm-rule-condition-dialog',
templateUrl: './cf-alarm-rule-condition-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
selector: 'tb-cf-alarm-rule-condition-dialog',
templateUrl: './cf-alarm-rule-condition-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
standalone: false
})
export class CfAlarmRuleConditionDialogComponent extends DialogComponent<CfAlarmRuleConditionDialogComponent, AlarmRuleCondition> {

4
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.html

@ -20,7 +20,7 @@
<div class="min-w-40 xs:min-w-fit">{{ 'alarm-rule.condition' | translate }}</div>
<button type="button"
class="tb-alarm-rule-condition-button"
mat-stroked-button [color]="conditionSet() || this.filtersArgumentsValid ? 'primary' : 'warn'"
mat-stroked-button [color]="conditionSet() || filtersArgumentsValid ? 'primary' : 'warn'"
(click)="openFilterDialog($event)">
<div class="flex items-center justify-between gap-2">
<tb-alarm-rule-filter-text [alarmRuleExpression]="alarmRuleConditionFormGroup.get('expression').value"
@ -32,7 +32,7 @@
required
addFilterPrompt="{{ 'alarm-rule.enter-alarm-rule-condition-prompt' | translate }}">
</tb-alarm-rule-filter-text>
<mat-icon [color]="disabled ? '' : (conditionSet() && this.filtersArgumentsValid ? 'primary' : 'warn')"
<mat-icon [color]="disabled ? '' : (conditionSet() && filtersArgumentsValid ? 'primary' : 'warn')"
class="tb-mat-20 tb-alarm-rule-schedule-edit-icon">
{{ disabled ? 'visibility' : (conditionSet() ? 'edit' : 'add') }}
</mat-icon>

2
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.scss

@ -21,7 +21,7 @@
display: flex;
flex: 1;
&-button {
--mat-outlined-button-horizontal-padding: 3px 0px 12px;
--mat-button-outlined-horizontal-padding: 3px 0px 12px;
display: block;
width: 100%;
}

31
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule-condition.component.ts

@ -54,21 +54,22 @@ import { coerceBoolean } from "@shared/decorators/coercion";
import { Observable } from "rxjs";
@Component({
selector: 'tb-cf-alarm-rule-condition',
templateUrl: './cf-alarm-rule-condition.component.html',
styleUrls: ['./cf-alarm-rule-condition.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmRuleConditionComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmRuleConditionComponent),
multi: true,
}
]
selector: 'tb-cf-alarm-rule-condition',
templateUrl: './cf-alarm-rule-condition.component.html',
styleUrls: ['./cf-alarm-rule-condition.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmRuleConditionComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmRuleConditionComponent),
multi: true,
}
],
standalone: false
})
export class CfAlarmRuleConditionComponent implements ControlValueAccessor, Validator, OnChanges {

31
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-rule.component.ts

@ -38,21 +38,22 @@ import { coerceBoolean } from "@shared/decorators/coercion";
import { Observable } from "rxjs";
@Component({
selector: 'tb-cf-alarm-rule',
templateUrl: './cf-alarm-rule.component.html',
styleUrls: ['./cf-alarm-rule.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmRuleComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmRuleComponent),
multi: true,
}
]
selector: 'tb-cf-alarm-rule',
templateUrl: './cf-alarm-rule.component.html',
styleUrls: ['./cf-alarm-rule.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmRuleComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmRuleComponent),
multi: true,
}
],
standalone: false
})
export class CfAlarmRuleComponent implements ControlValueAccessor, OnInit, Validator {

9
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-schedule-dialog.component.ts

@ -31,10 +31,11 @@ export interface AlarmRuleScheduleDialogData {
}
@Component({
selector: 'tb-cf-alarm-schedule-dialog',
templateUrl: './cf-alarm-schedule-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
selector: 'tb-cf-alarm-schedule-dialog',
templateUrl: './cf-alarm-schedule-dialog.component.html',
providers: [],
styleUrls: ['./cf-alarm-rules-dialog.component.scss'],
standalone: false
})
export class CfAlarmScheduleDialogComponent extends DialogComponent<CfAlarmScheduleDialogComponent, AlarmRuleSchedule>{

25
ui-ngx/src/app/modules/home/components/alarm-rules/cf-alarm-schedule.component.ts

@ -47,18 +47,19 @@ import { MatChipSelectionChange } from "@angular/material/chips";
import { coerceBoolean } from "@shared/decorators/coercion";
@Component({
selector: 'tb-cf-alarm-schedule',
templateUrl: './cf-alarm-schedule.component.html',
styleUrls: [],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmScheduleComponent),
multi: true
}, {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmScheduleComponent),
multi: true
}]
selector: 'tb-cf-alarm-schedule',
templateUrl: './cf-alarm-schedule.component.html',
styleUrls: [],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CfAlarmScheduleComponent),
multi: true
}, {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CfAlarmScheduleComponent),
multi: true
}],
standalone: false
})
export class CfAlarmScheduleComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {

31
ui-ngx/src/app/modules/home/components/alarm-rules/create-cf-alarm-rules.component.ts

@ -35,21 +35,22 @@ import { coerceBoolean } from "@shared/decorators/coercion";
import { Observable } from "rxjs";
@Component({
selector: 'tb-create-cf-alarm-rules',
templateUrl: './create-cf-alarm-rules.component.html',
styleUrls: ['./create-cf-alarm-rules.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CreateCfAlarmRulesComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CreateCfAlarmRulesComponent),
multi: true,
}
]
selector: 'tb-create-cf-alarm-rules',
templateUrl: './create-cf-alarm-rules.component.html',
styleUrls: ['./create-cf-alarm-rules.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CreateCfAlarmRulesComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CreateCfAlarmRulesComponent),
multi: true,
}
],
standalone: false
})
export class CreateCfAlarmRulesComponent implements ControlValueAccessor, Validator {

9
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-complex-filter-predicate-dialog.component.ts

@ -40,10 +40,11 @@ export interface AlarmRuleComplexFilterPredicateDialogData {
}
@Component({
selector: 'tb-alarm-rule-complex-filter-predicate-dialog',
templateUrl: './alarm-rule-complex-filter-predicate-dialog.component.html',
providers: [],
styleUrls: []
selector: 'tb-alarm-rule-complex-filter-predicate-dialog',
templateUrl: './alarm-rule-complex-filter-predicate-dialog.component.html',
providers: [],
styleUrls: [],
standalone: false
})
export class AlarmRuleComplexFilterPredicateDialogComponent extends

9
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-dialog.component.ts

@ -43,10 +43,11 @@
}
@Component({
selector: 'tb-alarm-rule-filter-dialog',
templateUrl: './alarm-rule-filter-dialog.component.html',
providers: [],
styleUrls: ['./alarm-rule-filter-dialog.component.scss']
selector: 'tb-alarm-rule-filter-dialog',
templateUrl: './alarm-rule-filter-dialog.component.html',
providers: [],
styleUrls: ['./alarm-rule-filter-dialog.component.scss'],
standalone: false
})
export class AlarmRuleFilterDialogComponent extends DialogComponent<AlarmRuleFilterDialogComponent, AlarmRuleFilter> {

31
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-list.component.ts

@ -44,21 +44,22 @@ import { CalculatedFieldArgument } from "@shared/models/calculated-field.models"
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
@Component({
selector: 'tb-alarm-rule-filter-list',
templateUrl: './alarm-rule-filter-list.component.html',
styleUrls: ['./alarm-rule-filter-list.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterListComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterListComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-list',
templateUrl: './alarm-rule-filter-list.component.html',
styleUrls: ['./alarm-rule-filter-list.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterListComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterListComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterListComponent implements ControlValueAccessor, Validator {

31
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-list.component.ts

@ -52,21 +52,22 @@ import { CalculatedFieldArgument } from "@shared/models/calculated-field.models"
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
@Component({
selector: 'tb-alarm-rule-filter-predicate-list',
templateUrl: './alarm-rule-filter-predicate-list.component.html',
styleUrls: ['./alarm-rule-filter-predicate-list.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateListComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateListComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-predicate-list',
templateUrl: './alarm-rule-filter-predicate-list.component.html',
styleUrls: ['./alarm-rule-filter-predicate-list.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateListComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateListComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterPredicateListComponent implements ControlValueAccessor, Validator {

31
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-no-data-value.component.ts

@ -31,21 +31,22 @@ import { AlarmRuleFilterPredicateType, NoDataAlarmRuleFilterPredicate } from "@s
import { isDefinedAndNotNull } from "@core/utils";
@Component({
selector: 'tb-alarm-rule-filter-predicate-no-data-value',
templateUrl: './alarm-rule-filter-predicate-no-data-value.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateNoDataValueComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateNoDataValueComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-predicate-no-data-value',
templateUrl: './alarm-rule-filter-predicate-no-data-value.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateNoDataValueComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateNoDataValueComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterPredicateNoDataValueComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {

31
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate-value.component.ts

@ -34,21 +34,22 @@ import { FormControlsFrom } from "@shared/models/tenant.model";
import { isDefinedAndNotNull } from "@core/utils";
@Component({
selector: 'tb-alarm-rule-filter-predicate-value',
templateUrl: './alarm-rule-filter-predicate-value.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateValueComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateValueComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-predicate-value',
templateUrl: './alarm-rule-filter-predicate-value.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateValueComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateValueComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterPredicateValueComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {

2
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.html

@ -58,7 +58,7 @@
}
@case (filterPredicateType.COMPLEX) {
<div class="tb-form-row no-border no-padding flex-1">
<button type="button" style="--mat-outlined-button-horizontal-padding: 3px 0px 12px;"
<button type="button" style="--mat-button-outlined-horizontal-padding: 3px 0px 12px;"
class="block w-full"
mat-stroked-button [color]="predicateValid ? 'primary' : 'warn'"
(click)="openComplexFilterDialog()">

31
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-predicate.component.ts

@ -45,21 +45,22 @@ import {
import { CalculatedFieldArgument } from "@shared/models/calculated-field.models";
@Component({
selector: 'tb-alarm-rule-filter-predicate',
templateUrl: './alarm-rule-filter-predicate.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateComponent),
multi: true
}
]
selector: 'tb-alarm-rule-filter-predicate',
templateUrl: './alarm-rule-filter-predicate.component.html',
styleUrls: [],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmRuleFilterPredicateComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => AlarmRuleFilterPredicateComponent),
multi: true
}
],
standalone: false
})
export class AlarmRuleFilterPredicateComponent implements ControlValueAccessor, Validator {

9
ui-ngx/src/app/modules/home/components/alarm-rules/filter/alarm-rule-filter-text.component.ts

@ -39,10 +39,11 @@ import { coerceBoolean } from "@shared/decorators/coercion";
import { timeUnitTranslationMap } from "@shared/models/time/time.models";
@Component({
selector: 'tb-alarm-rule-filter-text',
templateUrl: './alarm-rule-filter-text.component.html',
styleUrls: ['./alarm-rule-filter-text.component.scss'],
providers: []
selector: 'tb-alarm-rule-filter-text',
templateUrl: './alarm-rule-filter-text.component.html',
styleUrls: ['./alarm-rule-filter-text.component.scss'],
providers: [],
standalone: false
})
export class AlarmRuleFilterTextComponent {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-panel.component.ts

@ -54,9 +54,10 @@ export interface AlarmAssigneePanelData {
}
@Component({
selector: 'tb-alarm-assignee-panel',
templateUrl: './alarm-assignee-panel.component.html',
styleUrls: ['./alarm-assignee-panel.component.scss']
selector: 'tb-alarm-assignee-panel',
templateUrl: './alarm-assignee-panel.component.html',
styleUrls: ['./alarm-assignee-panel.component.scss'],
standalone: false
})
export class AlarmAssigneePanelComponent implements OnInit, AfterViewInit, OnDestroy {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select-panel.component.ts

@ -47,9 +47,10 @@ export interface AlarmAssigneeSelectPanelData {
}
@Component({
selector: 'tb-alarm-assignee-select-panel',
templateUrl: './alarm-assignee-panel.component.html',
styleUrls: ['./alarm-assignee-panel.component.scss']
selector: 'tb-alarm-assignee-select-panel',
templateUrl: './alarm-assignee-panel.component.html',
styleUrls: ['./alarm-assignee-panel.component.scss'],
standalone: false
})
export class AlarmAssigneeSelectPanelComponent implements OnInit, AfterViewInit, OnDestroy {

21
ui-ngx/src/app/modules/home/components/alarm/alarm-assignee-select.component.ts

@ -34,16 +34,17 @@ import { coerceBoolean } from '@shared/decorators/coercion';
import { AlarmAssigneeOption } from '@shared/models/alarm.models';
@Component({
selector: 'tb-alarm-assignee-select',
templateUrl: './alarm-assignee-select.component.html',
styleUrls: ['./alarm-assignee.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmAssigneeSelectComponent),
multi: true
}
]
selector: 'tb-alarm-assignee-select',
templateUrl: './alarm-assignee-select.component.html',
styleUrls: ['./alarm-assignee.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmAssigneeSelectComponent),
multi: true
}
],
standalone: false
})
export class AlarmAssigneeSelectComponent implements OnInit, ControlValueAccessor {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-assignee.component.ts

@ -28,9 +28,10 @@ import { TranslateService } from '@ngx-translate/core';
import { isNotEmptyStr } from '@core/utils';
@Component({
selector: 'tb-alarm-assignee',
templateUrl: './alarm-assignee.component.html',
styleUrls: ['./alarm-assignee.component.scss']
selector: 'tb-alarm-assignee',
templateUrl: './alarm-assignee.component.html',
styleUrls: ['./alarm-assignee.component.scss'],
standalone: false
})
export class AlarmAssigneeComponent {
@Input()

7
ui-ngx/src/app/modules/home/components/alarm/alarm-comment-dialog.component.ts

@ -28,9 +28,10 @@ export interface AlarmCommentDialogData {
}
@Component({
selector: 'tb-alarm-comment-dialog',
templateUrl: './alarm-comment-dialog.component.html',
styleUrls: []
selector: 'tb-alarm-comment-dialog',
templateUrl: './alarm-comment-dialog.component.html',
styleUrls: [],
standalone: false
})
export class AlarmCommentDialogComponent extends DialogComponent<AlarmCommentDialogComponent, void> {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-comment.component.ts

@ -59,9 +59,10 @@ interface AlarmCommentsDisplayData {
}
@Component({
selector: 'tb-alarm-comment',
templateUrl: './alarm-comment.component.html',
styleUrls: ['./alarm-comment.component.scss']
selector: 'tb-alarm-comment',
templateUrl: './alarm-comment.component.html',
styleUrls: ['./alarm-comment.component.scss'],
standalone: false
})
export class AlarmCommentComponent implements OnInit {
@Input()

7
ui-ngx/src/app/modules/home/components/alarm/alarm-details-dialog.component.ts

@ -47,9 +47,10 @@ export interface AlarmDetailsDialogData {
}
@Component({
selector: 'tb-alarm-details-dialog',
templateUrl: './alarm-details-dialog.component.html',
styleUrls: ['./alarm-details-dialog.component.scss']
selector: 'tb-alarm-details-dialog',
templateUrl: './alarm-details-dialog.component.html',
styleUrls: ['./alarm-details-dialog.component.scss'],
standalone: false
})
export class AlarmDetailsDialogComponent extends DialogComponent<AlarmDetailsDialogComponent, boolean> {

21
ui-ngx/src/app/modules/home/components/alarm/alarm-filter-config.component.ts

@ -60,16 +60,17 @@ export interface AlarmFilterConfigData {
// @dynamic
@Component({
selector: 'tb-alarm-filter-config',
templateUrl: './alarm-filter-config.component.html',
styleUrls: ['./alarm-filter-config.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmFilterConfigComponent),
multi: true
}
]
selector: 'tb-alarm-filter-config',
templateUrl: './alarm-filter-config.component.html',
styleUrls: ['./alarm-filter-config.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AlarmFilterConfigComponent),
multi: true
}
],
standalone: false
})
export class AlarmFilterConfigComponent implements OnInit, OnDestroy, ControlValueAccessor {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-table-header.component.ts

@ -23,9 +23,10 @@ import { AlarmTableConfig } from './alarm-table-config';
import { AlarmFilterConfig } from '@shared/models/query/query.models';
@Component({
selector: 'tb-alarm-table-header',
templateUrl: './alarm-table-header.component.html',
styleUrls: ['./alarm-table-header.component.scss']
selector: 'tb-alarm-table-header',
templateUrl: './alarm-table-header.component.html',
styleUrls: ['./alarm-table-header.component.scss'],
standalone: false
})
export class AlarmTableHeaderComponent extends EntityTableHeaderComponent<AlarmInfo> {

7
ui-ngx/src/app/modules/home/components/alarm/alarm-table.component.ts

@ -42,9 +42,10 @@ interface AlarmPageQueryParams extends PageQueryParam {
}
@Component({
selector: 'tb-alarm-table',
templateUrl: './alarm-table.component.html',
styleUrls: ['./alarm-table.component.scss']
selector: 'tb-alarm-table',
templateUrl: './alarm-table.component.html',
styleUrls: ['./alarm-table.component.scss'],
standalone: false
})
export class AlarmTableComponent implements OnInit {

17
ui-ngx/src/app/modules/home/components/alias/aliases-entity-autocomplete.component.ts

@ -29,14 +29,15 @@ import { EntityService } from '@core/http/entity.service';
import { isDefinedAndNotNull } from '@core/utils';
@Component({
selector: 'tb-aliases-entity-autocomplete',
templateUrl: './aliases-entity-autocomplete.component.html',
styleUrls: [],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AliasesEntityAutocompleteComponent),
multi: true
}]
selector: 'tb-aliases-entity-autocomplete',
templateUrl: './aliases-entity-autocomplete.component.html',
styleUrls: [],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AliasesEntityAutocompleteComponent),
multi: true
}],
standalone: false
})
export class AliasesEntityAutocompleteComponent implements ControlValueAccessor, OnInit, AfterViewInit {

7
ui-ngx/src/app/modules/home/components/alias/aliases-entity-select-panel.component.ts

@ -26,9 +26,10 @@ export interface AliasesEntitySelectPanelData {
}
@Component({
selector: 'tb-aliases-entity-select-panel',
templateUrl: './aliases-entity-select-panel.component.html',
styleUrls: ['./aliases-entity-select-panel.component.scss']
selector: 'tb-aliases-entity-select-panel',
templateUrl: './aliases-entity-select-panel.component.html',
styleUrls: ['./aliases-entity-select-panel.component.scss'],
standalone: false
})
export class AliasesEntitySelectPanelComponent {

7
ui-ngx/src/app/modules/home/components/alias/aliases-entity-select.component.ts

@ -41,9 +41,10 @@ import { deepClone } from '@core/utils';
import { AliasFilterType } from '@shared/models/alias.models';
@Component({
selector: 'tb-aliases-entity-select',
templateUrl: './aliases-entity-select.component.html',
styleUrls: ['./aliases-entity-select.component.scss']
selector: 'tb-aliases-entity-select',
templateUrl: './aliases-entity-select.component.html',
styleUrls: ['./aliases-entity-select.component.scss'],
standalone: false
})
export class AliasesEntitySelectComponent implements OnInit, OnDestroy {

9
ui-ngx/src/app/modules/home/components/alias/entity-alias-dialog.component.ts

@ -46,10 +46,11 @@ export interface EntityAliasDialogData {
}
@Component({
selector: 'tb-entity-alias-dialog',
templateUrl: './entity-alias-dialog.component.html',
providers: [{provide: ErrorStateMatcher, useExisting: EntityAliasDialogComponent}],
styleUrls: ['./entity-alias-dialog.component.scss']
selector: 'tb-entity-alias-dialog',
templateUrl: './entity-alias-dialog.component.html',
providers: [{ provide: ErrorStateMatcher, useExisting: EntityAliasDialogComponent }],
styleUrls: ['./entity-alias-dialog.component.scss'],
standalone: false
})
export class EntityAliasDialogComponent extends DialogComponent<EntityAliasDialogComponent, EntityAlias>
implements OnInit, ErrorStateMatcher {

9
ui-ngx/src/app/modules/home/components/alias/entity-aliases-dialog.component.ts

@ -54,10 +54,11 @@ export interface EntityAliasesDialogData {
}
@Component({
selector: 'tb-entity-aliases-dialog',
templateUrl: './entity-aliases-dialog.component.html',
providers: [{provide: ErrorStateMatcher, useExisting: EntityAliasesDialogComponent}],
styleUrls: ['./entity-aliases-dialog.component.scss']
selector: 'tb-entity-aliases-dialog',
templateUrl: './entity-aliases-dialog.component.html',
providers: [{ provide: ErrorStateMatcher, useExisting: EntityAliasesDialogComponent }],
styleUrls: ['./entity-aliases-dialog.component.scss'],
standalone: false
})
export class EntityAliasesDialogComponent extends DialogComponent<EntityAliasesDialogComponent, EntityAliases>
implements ErrorStateMatcher {

7
ui-ngx/src/app/modules/home/components/api-key/add-api-key-dialog.component.ts

@ -29,9 +29,10 @@ import { ApiKeysTableDialogData } from '@home/components/api-key/api-keys-table-
import { DAY } from '@shared/models/time/time.models';
@Component({
selector: 'tb-add-api-key-dialog',
templateUrl: './add-api-key-dialog.component.html',
styleUrls: ['./add-api-key-dialog.component.scss']
selector: 'tb-add-api-key-dialog',
templateUrl: './add-api-key-dialog.component.html',
styleUrls: ['./add-api-key-dialog.component.scss'],
standalone: false
})
export class AddApiKeyDialogComponent extends DialogComponent<AddApiKeyDialogComponent, ApiKeyInfo | string> {

7
ui-ngx/src/app/modules/home/components/api-key/api-key-generated-dialog.component.ts

@ -28,9 +28,10 @@ export interface ApiKeyGeneratedDialogData {
}
@Component({
selector: 'tb-api-key-generated-dialog',
templateUrl: './api-key-generated-dialog.component.html',
styleUrls: ['api-key-generated-dialog.component.scss']
selector: 'tb-api-key-generated-dialog',
templateUrl: './api-key-generated-dialog.component.html',
styleUrls: ['api-key-generated-dialog.component.scss'],
standalone: false
})
export class ApiKeyGeneratedDialogComponent extends DialogComponent<ApiKeyGeneratedDialogComponent, void> {

7
ui-ngx/src/app/modules/home/components/api-key/api-keys-table-dialog.component.ts

@ -27,9 +27,10 @@ export interface ApiKeysTableDialogData {
}
@Component({
selector: 'tb-api-keys-table-dialog',
templateUrl: './api-keys-table-dialog.component.html',
styleUrls: ['api-keys-table-dialog.component.scss']
selector: 'tb-api-keys-table-dialog',
templateUrl: './api-keys-table-dialog.component.html',
styleUrls: ['api-keys-table-dialog.component.scss'],
standalone: false
})
export class ApiKeysTableDialogComponent {

9
ui-ngx/src/app/modules/home/components/api-key/api-keys-table.component.ts

@ -35,10 +35,11 @@ import { TbPopoverService } from '@shared/components/popover.service';
import { UserId } from '@shared/models/id/user-id';
@Component({
selector: 'tb-api-keys-table',
templateUrl: './api-keys-table.component.html',
styleUrls: ['./api-keys-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
selector: 'tb-api-keys-table',
templateUrl: './api-keys-table.component.html',
styleUrls: ['./api-keys-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
})
export class ApiKeysTableComponent {

2
ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.scss

@ -15,7 +15,7 @@
*/
.tb-edit-api-key-description-panel {
--mdc-outlined-text-field-outline-color: rgba(0,0,0,0.12);
--mat-form-field-outlined-outline-color: rgba(0,0,0,0.12);
width: 400px;
max-width: 90vw;

9
ui-ngx/src/app/modules/home/components/api-key/edit-api-key-description-panel.component.ts

@ -21,10 +21,11 @@ import { TbPopoverComponent } from '@shared/components/popover.component';
import { ApiKeyService } from '@core/http/api-key.service';
@Component({
selector: 'tb-edit-api-key-description-panel',
templateUrl: './edit-api-key-description-panel.component.html',
styleUrls: ['./edit-api-key-description-panel.component.scss'],
encapsulation: ViewEncapsulation.None
selector: 'tb-edit-api-key-description-panel',
templateUrl: './edit-api-key-description-panel.component.html',
styleUrls: ['./edit-api-key-description-panel.component.scss'],
encapsulation: ViewEncapsulation.None,
standalone: false
})
export class EditApiKeyDescriptionPanelComponent implements OnInit {

9
ui-ngx/src/app/modules/home/components/attribute/add-attribute-dialog.component.ts

@ -43,10 +43,11 @@ export interface AddAttributeDialogData {
}
@Component({
selector: 'tb-add-attribute-dialog',
templateUrl: './add-attribute-dialog.component.html',
providers: [{provide: ErrorStateMatcher, useExisting: AddAttributeDialogComponent}],
styleUrls: []
selector: 'tb-add-attribute-dialog',
templateUrl: './add-attribute-dialog.component.html',
providers: [{ provide: ErrorStateMatcher, useExisting: AddAttributeDialogComponent }],
styleUrls: [],
standalone: false
})
export class AddAttributeDialogComponent extends DialogComponent<AddAttributeDialogComponent, boolean>
implements OnInit, ErrorStateMatcher {

9
ui-ngx/src/app/modules/home/components/attribute/add-widget-to-dashboard-dialog.component.ts

@ -49,10 +49,11 @@ export interface AddWidgetToDashboardDialogData {
}
@Component({
selector: 'tb-add-widget-to-dashboard-dialog',
templateUrl: './add-widget-to-dashboard-dialog.component.html',
providers: [{provide: ErrorStateMatcher, useExisting: AddWidgetToDashboardDialogComponent}],
styleUrls: ['./add-widget-to-dashboard-dialog.component.scss']
selector: 'tb-add-widget-to-dashboard-dialog',
templateUrl: './add-widget-to-dashboard-dialog.component.html',
providers: [{ provide: ErrorStateMatcher, useExisting: AddWidgetToDashboardDialogComponent }],
styleUrls: ['./add-widget-to-dashboard-dialog.component.scss'],
standalone: false
})
export class AddWidgetToDashboardDialogComponent extends
DialogComponent<AddWidgetToDashboardDialogComponent, void>

9
ui-ngx/src/app/modules/home/components/attribute/attribute-table.component.ts

@ -93,10 +93,11 @@ import { TimeService } from '@core/services/time.service';
@Component({
selector: 'tb-attribute-table',
templateUrl: './attribute-table.component.html',
styleUrls: ['./attribute-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
selector: 'tb-attribute-table',
templateUrl: './attribute-table.component.html',
styleUrls: ['./attribute-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false
})
export class AttributeTableComponent extends PageComponent implements AfterViewInit, OnInit, OnDestroy {

7
ui-ngx/src/app/modules/home/components/attribute/delete-timeseries-panel.component.ts

@ -36,9 +36,10 @@ export interface DeleteTimeseriesPanelResult {
}
@Component({
selector: 'tb-delete-timeseries-panel',
templateUrl: './delete-timeseries-panel.component.html',
styleUrls: ['./delete-timeseries-panel.component.scss']
selector: 'tb-delete-timeseries-panel',
templateUrl: './delete-timeseries-panel.component.html',
styleUrls: ['./delete-timeseries-panel.component.scss'],
standalone: false
})
export class DeleteTimeseriesPanelComponent implements OnInit, OnDestroy {

9
ui-ngx/src/app/modules/home/components/attribute/edit-attribute-value-panel.component.ts

@ -29,10 +29,11 @@ export interface EditAttributeValuePanelData {
}
@Component({
selector: 'tb-edit-attribute-value-panel',
templateUrl: './edit-attribute-value-panel.component.html',
providers: [{provide: ErrorStateMatcher, useExisting: EditAttributeValuePanelComponent}],
styleUrls: ['./edit-attribute-value-panel.component.scss']
selector: 'tb-edit-attribute-value-panel',
templateUrl: './edit-attribute-value-panel.component.html',
providers: [{ provide: ErrorStateMatcher, useExisting: EditAttributeValuePanelComponent }],
styleUrls: ['./edit-attribute-value-panel.component.scss'],
standalone: false
})
export class EditAttributeValuePanelComponent extends PageComponent implements OnInit, ErrorStateMatcher {

7
ui-ngx/src/app/modules/home/components/audit-log/audit-log-details-dialog.component.ts

@ -33,9 +33,10 @@ export interface AuditLogDetailsDialogData {
}
@Component({
selector: 'tb-audit-log-details-dialog',
templateUrl: './audit-log-details-dialog.component.html',
styleUrls: ['./audit-log-details-dialog.component.scss']
selector: 'tb-audit-log-details-dialog',
templateUrl: './audit-log-details-dialog.component.html',
styleUrls: ['./audit-log-details-dialog.component.scss'],
standalone: false
})
export class AuditLogDetailsDialogComponent extends DialogComponent<AuditLogDetailsDialogComponent> implements OnInit, OnDestroy {

21
ui-ngx/src/app/modules/home/components/audit-log/audit-log-filter.component.ts

@ -43,16 +43,17 @@ import { TranslateService } from '@ngx-translate/core';
// @dynamic
@Component({
selector: 'tb-audit-log-filter',
templateUrl: './audit-log-filter.component.html',
styleUrls: ['./audit-log-filter.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AuditLogFilterComponent),
multi: true
}
]
selector: 'tb-audit-log-filter',
templateUrl: './audit-log-filter.component.html',
styleUrls: ['./audit-log-filter.component.scss'],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AuditLogFilterComponent),
multi: true
}
],
standalone: false
})
export class AuditLogFilterComponent implements OnInit, ControlValueAccessor {

7
ui-ngx/src/app/modules/home/components/audit-log/audit-log-header.component.ts

@ -21,9 +21,10 @@ import { EntityTableHeaderComponent } from '@home/components/entity/entity-table
import { Store } from '@ngrx/store';
@Component({
selector: 'tb-audit-log-header',
templateUrl: './audit-log-header.component.html',
styles: ``
selector: 'tb-audit-log-header',
templateUrl: './audit-log-header.component.html',
styles: ``,
standalone: false
})
export class AuditLogHeaderComponent extends EntityTableHeaderComponent<AuditLog, TimePageLink> {

7
ui-ngx/src/app/modules/home/components/audit-log/audit-log-table.component.ts

@ -32,9 +32,10 @@ import { getCurrentAuthUser } from '@core/auth/auth.selectors';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'tb-audit-log-table',
templateUrl: './audit-log-table.component.html',
styleUrls: ['./audit-log-table.component.scss']
selector: 'tb-audit-log-table',
templateUrl: './audit-log-table.component.html',
styleUrls: ['./audit-log-table.component.scss'],
standalone: false
})
export class AuditLogTableComponent implements OnInit {

7
ui-ngx/src/app/modules/home/components/calculated-fields/calculated-field.component.ts

@ -45,9 +45,10 @@ import { NULL_UUID } from '@shared/models/id/has-uuid';
import { EntityService } from '@core/http/entity.service';
@Component({
selector: 'tb-calculated-field',
templateUrl: './calculated-field.component.html',
styleUrls: ['./calculated-field.component.scss']
selector: 'tb-calculated-field',
templateUrl: './calculated-field.component.html',
styleUrls: ['./calculated-field.component.scss'],
standalone: false
})
export class CalculatedFieldComponent extends EntityComponent<CalculatedFieldsTableEntity> {

11
ui-ngx/src/app/modules/home/components/calculated-fields/calculated-fields-table.component.ts

@ -39,11 +39,12 @@ import { UtilsService } from "@core/services/utils.service";
import { ActivatedRoute, Router } from '@angular/router';
@Component({
selector: 'tb-calculated-fields-table',
templateUrl: './calculated-fields-table.component.html',
styleUrls: ['./calculated-fields-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [EntityDebugSettingsService]
selector: 'tb-calculated-fields-table',
templateUrl: './calculated-fields-table.component.html',
styleUrls: ['./calculated-fields-table.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [EntityDebugSettingsService],
standalone: false
})
export class CalculatedFieldsTableComponent {

7
ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component.ts

@ -57,9 +57,10 @@ import { NULL_UUID } from '@shared/models/id/has-uuid';
import { TenantId } from '@shared/models/id/tenant-id';
@Component({
selector: 'tb-calculated-field-argument-panel',
templateUrl: './calculated-field-argument-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', './calculated-field-argument-panel.component.scss']
selector: 'tb-calculated-field-argument-panel',
templateUrl: './calculated-field-argument-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', './calculated-field-argument-panel.component.scss'],
standalone: false
})
export class CalculatedFieldArgumentPanelComponent implements OnInit, AfterViewInit {

35
ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/calculated-field-arguments-table.component.ts

@ -47,7 +47,7 @@ import {
import {
CalculatedFieldArgumentPanelComponent
} from '@home/components/calculated-fields/components/calculated-field-arguments/calculated-field-argument-panel.component';
import { MatButton } from '@angular/material/button';
import { MatIconButton } from '@angular/material/button';
import { TbPopoverService } from '@shared/components/popover.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { EntityId } from '@shared/models/id/entity-id';
@ -65,21 +65,22 @@ import { NULL_UUID } from '@shared/models/id/has-uuid';
import { BaseData } from '@shared/models/base-data';
@Component({
selector: 'tb-calculated-field-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent),
multi: true
}
],
selector: 'tb-calculated-field-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldArgumentsTableComponent),
multi: true
}
],
standalone: false
})
export class CalculatedFieldArgumentsTableComponent implements ControlValueAccessor, Validator, OnChanges, AfterViewInit {
@ -169,7 +170,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces
this.argumentsFormArray.markAsDirty();
}
manageArgument($event: Event, matButton: MatButton, argument = {} as CalculatedFieldArgumentValue, readonly: boolean = false): void {
manageArgument($event: Event, matButton: MatIconButton, argument = {} as CalculatedFieldArgumentValue, readonly: boolean = false): void {
$event?.stopPropagation();
if (this.popoverComponent && !this.popoverComponent.tbHidden) {
this.popoverComponent.hide();

31
ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/entity-aggregation-arguments-table.component.ts

@ -26,21 +26,22 @@ import {
import { ArgumentEntityType } from '@shared/models/calculated-field.models';
@Component({
selector: 'tb-entity-aggregation-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => EntityAggregationArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EntityAggregationArgumentsTableComponent),
multi: true
}
],
selector: 'tb-entity-aggregation-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => EntityAggregationArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EntityAggregationArgumentsTableComponent),
multi: true
}
],
standalone: false
})
export class EntityAggregationArgumentsTableComponent extends CalculatedFieldArgumentsTableComponent {

31
ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/propagate-arguments-table.component.ts

@ -41,21 +41,22 @@ import { isDefined, isUndefinedOrNull } from '@core/utils';
import { NULL_UUID } from '@shared/models/id/has-uuid';
@Component({
selector: 'tb-propagate-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PropagateArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PropagateArgumentsTableComponent),
multi: true
}
],
selector: 'tb-propagate-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PropagateArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PropagateArgumentsTableComponent),
multi: true
}
],
standalone: false
})
export class PropagateArgumentsTableComponent extends CalculatedFieldArgumentsTableComponent implements OnInit {

31
ui-ngx/src/app/modules/home/components/calculated-fields/components/calculated-field-arguments/related-aggregation-arguments-table.component.ts

@ -36,21 +36,22 @@ import { AliasFilterType } from '@shared/models/alias.models';
import { EntityType } from '@shared/models/entity-type.models';
@Component({
selector: 'tb-related-aggregation-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RelatedAggregationArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => RelatedAggregationArgumentsTableComponent),
multi: true
}
],
selector: 'tb-related-aggregation-arguments-table',
templateUrl: './calculated-field-arguments-table.component.html',
styleUrls: [`calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RelatedAggregationArgumentsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => RelatedAggregationArgumentsTableComponent),
multi: true
}
],
standalone: false
})
export class RelatedAggregationArgumentsTableComponent extends CalculatedFieldArgumentsTableComponent {

4
ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.scss

@ -18,8 +18,8 @@
max-width: 100%;
display: grid;
grid-template-rows: min-content minmax(auto, 1fr) min-content;
--mdc-outlined-text-field-outline-color: rgba(0,0,0,0.12);
--mdc-outlined-text-field-container-shape: 6px;
--mat-form-field-outlined-outline-color: rgba(0,0,0,0.12);
--mat-form-field-outlined-container-shape: 6px;
--mat-form-field-trailing-icon-color: rgba(0, 0, 0, 0.56);
}

9
ui-ngx/src/app/modules/home/components/calculated-fields/components/dialog/calculated-field-dialog.component.ts

@ -57,10 +57,11 @@ export interface CalculatedFieldDialogData {
}
@Component({
selector: 'tb-calculated-field-dialog',
templateUrl: './calculated-field-dialog.component.html',
styleUrls: ['./calculated-field-dialog.component.scss'],
encapsulation: ViewEncapsulation.None
selector: 'tb-calculated-field-dialog',
templateUrl: './calculated-field-dialog.component.html',
styleUrls: ['./calculated-field-dialog.component.scss'],
encapsulation: ViewEncapsulation.None,
standalone: false
})
export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFieldDialogComponent, CalculatedField> {

29
ui-ngx/src/app/modules/home/components/calculated-fields/components/entity-aggregation-configuration/entity-aggregation-component.component.ts

@ -59,20 +59,21 @@ enum TimeCategory {
}
@Component({
selector: 'tb-entity-aggregation-component',
templateUrl: './entity-aggregation-component.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => EntityAggregationComponentComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EntityAggregationComponentComponent),
multi: true
}
],
selector: 'tb-entity-aggregation-component',
templateUrl: './entity-aggregation-component.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => EntityAggregationComponentComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EntityAggregationComponentComponent),
multi: true
}
],
standalone: false
})
export class EntityAggregationComponentComponent implements ControlValueAccessor, Validator {

7
ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component.ts

@ -58,9 +58,10 @@ import { EntitySearchDirection } from '@shared/models/relation.models';
import { CdkDragDrop } from "@angular/cdk/drag-drop";
@Component({
selector: 'tb-calculated-field-geofencing-zone-groups-panel',
templateUrl: './calculated-field-geofencing-zone-groups-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', './calculated-field-geofencing-zone-groups-panel.component.scss']
selector: 'tb-calculated-field-geofencing-zone-groups-panel',
templateUrl: './calculated-field-geofencing-zone-groups-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', './calculated-field-geofencing-zone-groups-panel.component.scss'],
standalone: false
})
export class CalculatedFieldGeofencingZoneGroupsPanelComponent implements OnInit, AfterViewInit {

35
ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-table.component.ts

@ -40,7 +40,7 @@ import {
CalculatedFieldGeofencingValue,
GeofencingReportStrategyTranslations,
} from '@shared/models/calculated-field.models';
import { MatButton } from '@angular/material/button';
import { MatIconButton } from '@angular/material/button';
import { TbPopoverService } from '@shared/components/popover.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { EntityId } from '@shared/models/id/entity-id';
@ -61,21 +61,22 @@ import {
} from '@home/components/calculated-fields/components/geofencing-configuration/calculated-field-geofencing-zone-groups-panel.component';
@Component({
selector: 'tb-calculated-field-geofencing-zone-groups-table',
templateUrl: './calculated-field-geofencing-zone-groups-table.component.html',
styleUrls: [`../calculated-field-arguments/calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldGeofencingZoneGroupsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldGeofencingZoneGroupsTableComponent),
multi: true
}
],
selector: 'tb-calculated-field-geofencing-zone-groups-table',
templateUrl: './calculated-field-geofencing-zone-groups-table.component.html',
styleUrls: [`../calculated-field-arguments/calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldGeofencingZoneGroupsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldGeofencingZoneGroupsTableComponent),
multi: true
}
],
standalone: false
})
export class CalculatedFieldGeofencingZoneGroupsTableComponent implements ControlValueAccessor, Validator, AfterViewInit {
@ -149,7 +150,7 @@ export class CalculatedFieldGeofencingZoneGroupsTableComponent implements Contro
this.zoneGroupsFormArray.markAsDirty();
}
manageZone($event: Event, matButton: MatButton, zone = {} as CalculatedFieldGeofencingValue, readonly: boolean = false): void {
manageZone($event: Event, matButton: MatIconButton, zone = {} as CalculatedFieldGeofencingValue, readonly: boolean = false): void {
$event?.stopPropagation();
if (this.popoverComponent && !this.popoverComponent.tbHidden) {
this.popoverComponent.hide();

29
ui-ngx/src/app/modules/home/components/calculated-fields/components/geofencing-configuration/geofencing-configuration.component.ts

@ -43,20 +43,21 @@ import { EntityFilter } from '@shared/models/query/query.models';
import { EntityId } from '@shared/models/id/entity-id';
@Component({
selector: 'tb-geofencing-configuration',
templateUrl: './geofencing-configuration.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => GeofencingConfigurationComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => GeofencingConfigurationComponent),
multi: true
}
],
selector: 'tb-geofencing-configuration',
templateUrl: './geofencing-configuration.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => GeofencingConfigurationComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => GeofencingConfigurationComponent),
multi: true
}
],
standalone: false
})
export class GeofencingConfigurationComponent implements ControlValueAccessor, Validator, OnChanges {

2
ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.html

@ -143,7 +143,7 @@
</mat-form-field>
</div>
}
@if (this.metricForm.get('input.type').value === AggInputType.key) {
@if (metricForm.get('input.type').value === AggInputType.key) {
<div class="tb-form-row">
<div class="fixed-title-width tb-required">{{ 'calculated-fields.argument-name' | translate }}</div>
<mat-form-field class="flex-1" appearance="outline" subscriptSizing="dynamic">

7
ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-panel.component.ts

@ -42,9 +42,10 @@ interface CalculatedFieldAggMetricValuePanel extends CalculatedFieldAggMetricVal
}
@Component({
selector: 'tb-calculated-field-metrics-panel',
templateUrl: './calculated-field-metrics-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', '../../calculated-field.component.scss'],
selector: 'tb-calculated-field-metrics-panel',
templateUrl: './calculated-field-metrics-panel.component.html',
styleUrls: ['../common/calculated-field-panel.scss', '../../calculated-field.component.scss'],
standalone: false
})
export class CalculatedFieldMetricsPanelComponent implements OnInit {

35
ui-ngx/src/app/modules/home/components/calculated-fields/components/metrics/calculated-field-metrics-table.component.ts

@ -41,7 +41,7 @@ import {
CalculatedFieldAggMetric,
CalculatedFieldAggMetricValue,
} from '@shared/models/calculated-field.models';
import { MatButton } from '@angular/material/button';
import { MatIconButton } from '@angular/material/button';
import { TbPopoverService } from '@shared/components/popover.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { isDefinedAndNotNull, isEqual } from '@core/utils';
@ -59,21 +59,22 @@ import { AceHighlightRules } from '@shared/models/ace/ace.models';
import { Observable } from "rxjs";
@Component({
selector: 'tb-calculated-field-metrics-table',
templateUrl: './calculated-field-metrics-table.component.html',
styleUrls: [`../calculated-field-arguments/calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldMetricsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldMetricsTableComponent),
multi: true
}
],
selector: 'tb-calculated-field-metrics-table',
templateUrl: './calculated-field-metrics-table.component.html',
styleUrls: [`../calculated-field-arguments/calculated-field-arguments-table.component.scss`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldMetricsTableComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldMetricsTableComponent),
multi: true
}
],
standalone: false
})
export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValueAccessor, Validator, AfterViewInit {
@ -153,7 +154,7 @@ export class CalculatedFieldMetricsTableComponent implements OnInit, ControlValu
this.metricsFormArray.markAsDirty();
}
manageMetrics($event: Event, matButton: MatButton, metric = {} as CalculatedFieldAggMetricValue, readonly: boolean = false): void {
manageMetrics($event: Event, matButton: MatIconButton, metric = {} as CalculatedFieldAggMetricValue, readonly: boolean = false): void {
$event?.stopPropagation();
if (this.popoverComponent && !this.popoverComponent.tbHidden) {
this.popoverComponent.hide();

2
ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.html

@ -80,7 +80,7 @@
<mat-expansion-panel-header class="flex flex-row flex-wrap">
<mat-panel-title>
<div class="flex flex-1 flex-row items-center justify-between xs:flex-col xs:items-start xs:gap-3">
<div class="tb-form-panel-title" [style.color]="disabled ? 'var(--mdc-outlined-text-field-disabled-input-text-color)' : 'var(--mat-expansion-header-text-color)'" tb-hint-tooltip-icon="{{ 'calculated-fields.output-strategy.hint.strategy' | translate }}">
<div class="tb-form-panel-title" [style.color]="disabled ? 'var(--mat-form-field-outlined-disabled-input-text-color)' : 'var(--mat-expansion-header-text-color)'" tb-hint-tooltip-icon="{{ 'calculated-fields.output-strategy.hint.strategy' | translate }}">
{{ 'calculated-fields.output-strategy.strategy' | translate }}
</div>
<tb-toggle-select formControlName="type" selectMediaBreakpoint="xs" disablePagination appearance="fill" (click)="$event.stopPropagation()">

31
ui-ngx/src/app/modules/home/components/calculated-fields/components/output/calculated-field-output.component.ts

@ -42,21 +42,22 @@ import { merge } from 'rxjs';
import { deepClone } from '@core/utils';
@Component({
selector: 'tb-calculate-field-output',
templateUrl: './calculated-field-output.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldOutputComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldOutputComponent),
multi: true
}
],
styleUrls: ['./calculated-field-output.component.scss'],
selector: 'tb-calculate-field-output',
templateUrl: './calculated-field-output.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalculatedFieldOutputComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CalculatedFieldOutputComponent),
multi: true
}
],
styleUrls: ['./calculated-field-output.component.scss'],
standalone: false
})
export class CalculatedFieldOutputComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {

4
ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.html

@ -57,9 +57,9 @@
[ownerId]="ownerId"
[watchKeyChange]="true"
[isEditValue]="isEditValue"
[isScript]="this.propagateConfiguration.get('applyExpressionToResolvedArguments').value"/>
[isScript]="propagateConfiguration.get('applyExpressionToResolvedArguments').value"/>
</div>
<div class="tb-form-panel no-gap" [class.!hidden]="!this.propagateConfiguration.get('applyExpressionToResolvedArguments').value">
<div class="tb-form-panel no-gap" [class.!hidden]="!propagateConfiguration.get('applyExpressionToResolvedArguments').value">
<div class="tb-form-panel-title tb-required">{{ 'calculated-fields.script' | translate }}</div>
<div>
<tb-js-func required

29
ui-ngx/src/app/modules/home/components/calculated-fields/components/propagation-configuration/propagation-configuration.component.ts

@ -48,20 +48,21 @@ import {AppState} from "@core/core.state";
import {getCurrentAuthState} from "@core/auth/auth.selectors";
@Component({
selector: 'tb-propagation-configuration',
templateUrl: './propagation-configuration.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PropagationConfigurationComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PropagationConfigurationComponent),
multi: true
}
],
selector: 'tb-propagation-configuration',
templateUrl: './propagation-configuration.component.html',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PropagationConfigurationComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => PropagationConfigurationComponent),
multi: true
}
],
standalone: false
})
export class PropagationConfigurationComponent implements ControlValueAccessor, Validator {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save