diff --git a/.vscode/settings.json b/.vscode/settings.json
index 2097d67919d..fbf56ae5502 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,9 @@
{
"git.ignoreLimitWarning": true,
"javascript.preferences.quoteStyle": "single",
- "typescript.preferences.quoteStyle": "single"
+ "typescript.preferences.quoteStyle": "single",
+ "cSpell.words": [
+ "ghostclass",
+ "ungroup"
+ ]
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b02a8488ae..cafd6fa1621 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,42 @@ All notable changes for each version of this project will be documented in this
- Introduced a new `expanded` input property, enabling dynamic control over the banner's state. The banner can now be programmatically set to expanded (visible) or collapsed (hidden) both initially and at runtime. Animations will trigger during runtime updates — the **open animation** plays when `expanded` is set to `true`, and the **close animation** plays when set to `false`. However, no animations will trigger when the property is set initially.
- The banner's event lifecycle (`opening`, `opened`, `closing`, `closed`) only triggers through **user interactions** (e.g., clicking to open/close). Programmatic updates using the `expanded` property will not fire any events.
- If the `expanded` property changes during an ongoing animation, the current animation will **stop** and the opposite animation will begin from the **point where the previous animation left off**. For instance, if the open animation (10 seconds) is interrupted at 6 seconds and `expanded` is set to `false`, the close animation (5 seconds) will start from its 3rd second.
+- `IgxQueryBuilder` has new design that comes with updated appearance and new functionality
+ - `IgxQueryBuilderComponent`
+ - Introduced the ability to create nested queries by specifying IN/NOT IN operators.
+ - Introduced the ability to reposition condition chips by dragging or using `Arrow Up/Down`.
+ - Added the `entities` property that accepts an array of `EntityType` objects describing an entity with its name and an array of fields. The `fields` input property has been deprecated and will be removed in a future version. Automatic migrations are available and will be applied on `ng update`.
+ - Added `disableEntityChange` property that can be used to disable the entity select on root level after the initial selection. Defaults to `false`.
+ - Added `disableReturnFieldsChange` property that can be used to disable the fields combo on root level. Defaults to `false`.
+ - Added the `canCommit`, `commit` and `discard` public methods that allows the user to save/discard the current state of the expression tree.
+ - Added option to template the search value input:
+ ```
+
+ @if (selectedField?.field === 'Id' && selectedCondition === 'equals'){
+
+ } @else {
+ ng-container>
+ }
+
+ ```
+ - **Behavioral Changes**
+ - Expression enters edit mode on single click, `Enter` or `Space`.
+ - Selecting conditions inside the `IgxQueryBuilderComponent` is no longer supported. Grouping/ungrouping expressions is now achieved via the newly exposed Drag & Drop functionality.
+ - Deleting multiple expressions through the context menu is no longer supported.
+ - `IgxQueryBuilderHeaderComponent`
+ - **Behavioral Change**
+ - Legend is no longer shown.
+ - If the `title` input property is not set, by default it would be empty string.
+ - **Deprecation**
+ - The `showLegend` and `resourceStrings` input properties have been deprecated and will be removed in a future version. Automatic migrations are available and will be applied on `ng update`.
+- `IFilteringExpression`
+ - A new optional property called `conditionName` has been introduced. This would generally be equal to the existing `condition.name`.
+- `IFilteringOperation`
+ - A new optional property called `isNestedQuery` has been introduced. It's used to indicate whether the condition leads to a nested query creation.
## 19.0.0
### General
diff --git a/package-lock.json b/package-lock.json
index 158e800c4cf..4b3ad44fd3e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,23 +9,23 @@
"version": "0.0.0",
"hasInstallScript": true,
"dependencies": {
- "@angular/animations": "^19.1.2",
- "@angular/common": "^19.1.2",
- "@angular/compiler": "^19.1.2",
- "@angular/core": "^19.1.2",
- "@angular/elements": "^19.1.2",
- "@angular/forms": "^19.1.2",
- "@angular/platform-browser": "^19.1.2",
- "@angular/platform-browser-dynamic": "^19.1.2",
- "@angular/platform-server": "^19.1.2",
- "@angular/router": "^19.1.2",
- "@angular/ssr": "^19.1.3",
+ "@angular/animations": "^19.1.6",
+ "@angular/common": "^19.1.6",
+ "@angular/compiler": "^19.1.6",
+ "@angular/core": "^19.1.6",
+ "@angular/elements": "^19.1.6",
+ "@angular/forms": "^19.1.6",
+ "@angular/platform-browser": "^19.1.6",
+ "@angular/platform-browser-dynamic": "^19.1.6",
+ "@angular/platform-server": "^19.1.6",
+ "@angular/router": "^19.1.6",
+ "@angular/ssr": "^19.1.7",
"@igniteui/material-icons-extended": "^3.1.0",
"@lit-labs/ssr-dom-shim": "^1.2.1",
"@types/source-map": "0.5.2",
"express": "^4.21.1",
"fflate": "^0.8.1",
- "igniteui-theming": "^14.3.1",
+ "igniteui-theming": "^15.0.0",
"igniteui-trial-watermark": "^3.0.2",
"lodash-es": "^4.17.21",
"rxjs": "^7.8.0",
@@ -33,22 +33,22 @@
"zone.js": "~0.15.0"
},
"devDependencies": {
- "@angular-devkit/build-angular": "^19.1.3",
- "@angular-devkit/schematics": "^19.1.3",
- "@angular-eslint/builder": "^19.0.2",
- "@angular-eslint/eslint-plugin": "^19.0.2",
- "@angular-eslint/eslint-plugin-template": "^19.0.2",
- "@angular-eslint/schematics": "^19.0.2",
- "@angular-eslint/template-parser": "^19.0.2",
- "@angular/cli": "^19.1.3",
- "@angular/compiler-cli": "^19.1.2",
- "@angular/language-service": "^19.1.2",
+ "@angular-devkit/build-angular": "^19.1.7",
+ "@angular-devkit/schematics": "^19.1.7",
+ "@angular-eslint/builder": "^19.1.0",
+ "@angular-eslint/eslint-plugin": "^19.1.0",
+ "@angular-eslint/eslint-plugin-template": "^19.1.0",
+ "@angular-eslint/schematics": "^19.1.0",
+ "@angular-eslint/template-parser": "^19.1.0",
+ "@angular/cli": "^19.1.7",
+ "@angular/compiler-cli": "^19.1.6",
+ "@angular/language-service": "^19.1.6",
"@angularclass/hmr": "^3.0.0",
"@microsoft/signalr": "^7.0.12",
"@types/estree": "^1.0.0",
"@types/express": "^5.0.0",
"@types/hammerjs": "^2.0.46",
- "@types/jasmine": "^5.1.1",
+ "@types/jasmine": "^5.1.6",
"@types/jasminewd2": "^2.0.10",
"@types/node": "^20.17.6",
"@types/sass-true": "^6.0.2",
@@ -69,11 +69,11 @@
"hammer-simulator": "0.0.1",
"hammerjs": "^2.0.8",
"ig-typedoc-theme": "^6.0.0",
- "igniteui-dockmanager": "^1.15.2",
+ "igniteui-dockmanager": "^1.16.0",
"igniteui-sassdoc-theme": "^1.2.3",
"igniteui-webcomponents": "5.2.0",
- "jasmine": "^5.5.0",
- "jasmine-core": "~5.5.0",
+ "jasmine": "^5.6.0",
+ "jasmine-core": "^5.6.0",
"karma": "^6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "^2.0.3",
@@ -82,11 +82,11 @@
"karma-parallel": "^0.3.1",
"karma-spec-reporter": "^0.0.36",
"lit-html": "^3.2.1",
- "ng-packagr": "^19.1.0",
+ "ng-packagr": "^19.1.2",
"postcss": "^8.5.1",
"postcss-scss": "^4.0.6",
"prettier": "^3.3.3",
- "puppeteer": "^23.11.1",
+ "puppeteer": "^24.2.1",
"sass-embedded": "^1.83.4",
"sass-true": "^8.1.0",
"sassdoc": "^2.7.4",
@@ -122,13 +122,13 @@
}
},
"node_modules/@angular-devkit/architect": {
- "version": "0.1901.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.3.tgz",
- "integrity": "sha512-bXhcSP23MKGRuKjI0j+JEDssuFwyprVS0czIeNswj2VTuWyx9y8GjnH2kJXeDETbX0pNbUjThkMsk8cZ5b2YTg==",
+ "version": "0.1901.7",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1901.7.tgz",
+ "integrity": "sha512-qltyebfbej7joIKZVH8EFfrVDrkw0p9N9ja3A0XeU1sl2vlepHNAQdVm0Os8Vy2XjjyHvT5bXWE3G3/221qEKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.1.3",
+ "@angular-devkit/core": "19.1.7",
"rxjs": "7.8.1"
},
"engines": {
@@ -138,17 +138,17 @@
}
},
"node_modules/@angular-devkit/build-angular": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.3.tgz",
- "integrity": "sha512-k9ZLXmtWFDxj/RN4RPKJ+tKDz1rUds7TZeqTvtfvOobgNzT5gSj0ZGlAlnMxcW3HJF7MuCTnAYua51tlJ5aTXw==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.1.7.tgz",
+ "integrity": "sha512-CMl3D5cpXoY0WuvdYtuOU2TetCwqxNsYM2jpuGG/kuuTEASAOI1cs9OhGwny1A/63bB8eyL33eLe82ON2Oemow==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.1901.3",
- "@angular-devkit/build-webpack": "0.1901.3",
- "@angular-devkit/core": "19.1.3",
- "@angular/build": "19.1.3",
+ "@angular-devkit/architect": "0.1901.7",
+ "@angular-devkit/build-webpack": "0.1901.7",
+ "@angular-devkit/core": "19.1.7",
+ "@angular/build": "19.1.7",
"@babel/core": "7.26.0",
"@babel/generator": "7.26.3",
"@babel/helper-annotate-as-pure": "7.25.9",
@@ -159,7 +159,7 @@
"@babel/preset-env": "7.26.0",
"@babel/runtime": "7.26.0",
"@discoveryjs/json-ext": "0.6.3",
- "@ngtools/webpack": "19.1.3",
+ "@ngtools/webpack": "19.1.7",
"@vitejs/plugin-basic-ssl": "1.2.0",
"ansi-colors": "4.1.3",
"autoprefixer": "10.4.20",
@@ -213,7 +213,7 @@
"@angular/localize": "^19.0.0",
"@angular/platform-server": "^19.0.0",
"@angular/service-worker": "^19.0.0",
- "@angular/ssr": "^19.1.3",
+ "@angular/ssr": "^19.1.7",
"@web/test-runner": "^0.19.0",
"browser-sync": "^3.0.2",
"jest": "^29.5.0",
@@ -221,7 +221,7 @@
"karma": "^6.3.0",
"ng-packagr": "^19.0.0",
"protractor": "^7.0.0",
- "tailwindcss": "^2.0.0 || ^3.0.0",
+ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
"typescript": ">=5.5 <5.8"
},
"peerDependenciesMeta": {
@@ -293,13 +293,13 @@
}
},
"node_modules/@angular-devkit/build-webpack": {
- "version": "0.1901.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.3.tgz",
- "integrity": "sha512-sv5rL1/xdMuPxJskG+5FVyVpDH8/NMfvHn/bKUvdrYMcTowwepP5EVQ5MZDSfwWrksuCyqrIOxd0K2zIRohNSQ==",
+ "version": "0.1901.7",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1901.7.tgz",
+ "integrity": "sha512-g7xPN7unBnqP9HsgFvEV1DIhNYmVwmWR9ZiSP0xJq+EjpjWlz2vmgru4a5WKwGeuLsP8vg7RKV0kCH3bunOmFA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.1901.3",
+ "@angular-devkit/architect": "0.1901.7",
"rxjs": "7.8.1"
},
"engines": {
@@ -313,9 +313,9 @@
}
},
"node_modules/@angular-devkit/core": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz",
- "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.7.tgz",
+ "integrity": "sha512-q0I6L9KTqyQ7D5M8H+fWLT+yjapvMNb7SRdfU6GzmexO66Dpo83q4HDzuDKIPDF29Yl0ELs9ICJqe9yUXh6yDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -341,13 +341,13 @@
}
},
"node_modules/@angular-devkit/schematics": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz",
- "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.7.tgz",
+ "integrity": "sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.1.3",
+ "@angular-devkit/core": "19.1.7",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.17",
"ora": "5.4.1",
@@ -360,9 +360,9 @@
}
},
"node_modules/@angular-eslint/builder": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.0.2.tgz",
- "integrity": "sha512-BdmMSndQt2fSBiTVniskUcUpQaeweUapbsL0IDfQ7a13vL0NVXpc3K89YXuVE/xsb08uHtqphuwxPAAj6kX3OA==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.1.0.tgz",
+ "integrity": "sha512-LWdQMTES/7GySlpTNFJn3k33ZGmjjWlHI/+IHV7B3xHQ9hj4MPK4ACmE/PNOAIQ9LwQm7sKS+3cTMxOZQ/cvSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -375,21 +375,21 @@
}
},
"node_modules/@angular-eslint/bundled-angular-compiler": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.0.2.tgz",
- "integrity": "sha512-HPmp92r70SNO/0NdIaIhxrgVSpomqryuUk7jszvNRtu+OzYCJGcbLhQD38T3dbBWT/AV0QXzyzExn6/2ai9fEw==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.1.0.tgz",
+ "integrity": "sha512-HUJyukRvnh8Z9lIdxdblBRuBaPYEVv4iAYZMw3d+dn4rrM27Nt5oh3/zkwYrrPkt36tZdeXdDWrOuz9jgjVN5w==",
"dev": true,
"license": "MIT"
},
"node_modules/@angular-eslint/eslint-plugin": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.0.2.tgz",
- "integrity": "sha512-DLuNVVGGFicSThOcMSJyNje+FZSPdG0B3lCBRiqcgKH/16kfM4pV8MobPM7RGK2NhaOmmZ4zzJNwpwWPSgi+Lw==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.1.0.tgz",
+ "integrity": "sha512-TDO0+Ry+oNkxnaLHogKp1k2aey6IkJef5d7hathE4UFT6owjRizltWaRoX6bGw7Qu1yagVLL8L2Se8SddxSPAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "19.0.2",
- "@angular-eslint/utils": "19.0.2"
+ "@angular-eslint/bundled-angular-compiler": "19.1.0",
+ "@angular-eslint/utils": "19.1.0"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -398,14 +398,14 @@
}
},
"node_modules/@angular-eslint/eslint-plugin-template": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.0.2.tgz",
- "integrity": "sha512-f/OCF9ThnxQ8m0eNYPwnCrySQPhYfCOF6STL7F9LnS8Bs3ZeW3/oT1yLaMIZ1Eg0ogIkgxksMAJZjrJPUPBD1Q==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.1.0.tgz",
+ "integrity": "sha512-bIUizkCY40mnU8oAO1tLV7uN2H/cHf1evLlhpqlb9JYwc5dT2moiEhNDo61OtOgkJmDGNuThAeO9Xk9hGQc7nA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "19.0.2",
- "@angular-eslint/utils": "19.0.2",
+ "@angular-eslint/bundled-angular-compiler": "19.1.0",
+ "@angular-eslint/utils": "19.1.0",
"aria-query": "5.3.2",
"axobject-query": "4.1.0"
},
@@ -417,38 +417,52 @@
}
},
"node_modules/@angular-eslint/schematics": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.0.2.tgz",
- "integrity": "sha512-wI4SyiAnUCrpigtK6PHRlVWMC9vWljqmlLhbsJV5O5yDajlmRdvgXvSHDefhJm0hSfvZYRXuiAARYv2+QVfnGA==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.1.0.tgz",
+ "integrity": "sha512-6S1FjmM7rZxc0u0W0KjqWYOkFQ0q89IGyjPkdUt1a8NwRnWg3VoXp4WYfeuZOjda/FEYuBS/E6rckLAMp0h6Aw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@angular-devkit/core": ">= 19.0.0 < 20.0.0",
"@angular-devkit/schematics": ">= 19.0.0 < 20.0.0",
- "@angular-eslint/eslint-plugin": "19.0.2",
- "@angular-eslint/eslint-plugin-template": "19.0.2",
- "ignore": "6.0.2",
- "semver": "7.6.3",
+ "@angular-eslint/eslint-plugin": "19.1.0",
+ "@angular-eslint/eslint-plugin-template": "19.1.0",
+ "ignore": "7.0.3",
+ "semver": "7.7.1",
"strip-json-comments": "3.1.1"
}
},
"node_modules/@angular-eslint/schematics/node_modules/ignore": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
- "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
},
+ "node_modules/@angular-eslint/schematics/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@angular-eslint/template-parser": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.0.2.tgz",
- "integrity": "sha512-z3rZd2sBfuYcFf9rGDsB2zz2fbGX8kkF+0ftg9eocyQmzWrlZHFmuw9ha7oP/Mz8gpblyCS/aa1U/Srs6gz0UQ==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.1.0.tgz",
+ "integrity": "sha512-wbMi7adlC+uYqZo7NHNBShpNhFJRZsXLqihqvFpAUt1Ei6uDX8HR6MyMEDZ9tUnlqtPVW5nmbedPyLVG7HkjAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "19.0.2",
+ "@angular-eslint/bundled-angular-compiler": "19.1.0",
"eslint-scope": "^8.0.2"
},
"peerDependencies": {
@@ -457,13 +471,13 @@
}
},
"node_modules/@angular-eslint/utils": {
- "version": "19.0.2",
- "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.0.2.tgz",
- "integrity": "sha512-HotBT8OKr7zCaX1S9k27JuhRiTVIbbYVl6whlb3uwdMIPIWY8iOcEh1tjI4qDPUafpLfR72Dhwi5bO1E17F3/Q==",
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.1.0.tgz",
+ "integrity": "sha512-mcb7hPMH/u6wwUwvsewrmgb9y9NWN6ZacvpUvKlTOxF/jOtTdsu0XfV4YB43sp2A8NWzYzX0Str4c8K1xSmuBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-eslint/bundled-angular-compiler": "19.0.2"
+ "@angular-eslint/bundled-angular-compiler": "19.1.0"
},
"peerDependencies": {
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
@@ -472,9 +486,9 @@
}
},
"node_modules/@angular/animations": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.2.tgz",
- "integrity": "sha512-usf/TMBpQKRnVpEK/UzrcxtHrUgWvryMG1UDWOTsTxmfAKsYoLqy+gdcGOkSf9yEiNn8xBxFXeGqPbFPeA1fWQ==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.1.6.tgz",
+ "integrity": "sha512-iacosz3fygp0AyT57+suVpLChl10xS5RBje09TfQIKHTUY0LWkMspgaK9gwtlflpIhjedPV0UmgRIKhhFcQM1A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -483,18 +497,19 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.1.2"
+ "@angular/core": "19.1.6"
}
},
"node_modules/@angular/build": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.3.tgz",
- "integrity": "sha512-NRYBNAyCCn+6XEHv/guVZ+Y/Fan7klW6CL938G2aDzbVipSt5xCCRxYgXwACBv5BzieV16SFnQYldAzyNs0uUg==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.1.7.tgz",
+ "integrity": "sha512-22SjHZDTk91JHU5aFVDU2n+xkPolDosRVfsK4zs+RRXQs30LYPH9KCLiUWCYjFbRj7oYvw7sbrs94szo7dWYvw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.1901.3",
+ "@angular-devkit/architect": "0.1901.7",
+ "@angular-devkit/core": "19.1.7",
"@babel/core": "7.26.0",
"@babel/helper-annotate-as-pure": "7.25.9",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -516,7 +531,7 @@
"rollup": "4.30.1",
"sass": "1.83.1",
"semver": "7.6.3",
- "vite": "6.0.7",
+ "vite": "6.0.11",
"watchpack": "2.4.2"
},
"engines": {
@@ -533,11 +548,11 @@
"@angular/localize": "^19.0.0",
"@angular/platform-server": "^19.0.0",
"@angular/service-worker": "^19.0.0",
- "@angular/ssr": "^19.1.3",
+ "@angular/ssr": "^19.1.7",
"less": "^4.2.0",
"ng-packagr": "^19.0.0",
"postcss": "^8.4.0",
- "tailwindcss": "^2.0.0 || ^3.0.0",
+ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
"typescript": ">=5.5 <5.8"
},
"peerDependenciesMeta": {
@@ -568,9 +583,9 @@
}
},
"node_modules/@angular/build/node_modules/vite": {
- "version": "6.0.7",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz",
- "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==",
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
+ "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -640,18 +655,18 @@
}
},
"node_modules/@angular/cli": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.3.tgz",
- "integrity": "sha512-GJGH3Xw7/zm12myA2R4Dg8+ny3p9tW00tx33YIK8vFjOUKycqgWaKfpYCe2s9egrm2Pew/DclHCD+IUwEAz1GQ==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.1.7.tgz",
+ "integrity": "sha512-qVEy0R4QKQ2QAGfpj2mPVxRxgOVst+rIgZBtLwf/mrbN9YyzJUaBKvaVslUpOqkvoW9mX5myf0iZkT5NykrIoA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/architect": "0.1901.3",
- "@angular-devkit/core": "19.1.3",
- "@angular-devkit/schematics": "19.1.3",
+ "@angular-devkit/architect": "0.1901.7",
+ "@angular-devkit/core": "19.1.7",
+ "@angular-devkit/schematics": "19.1.7",
"@inquirer/prompts": "7.2.1",
"@listr2/prompt-adapter-inquirer": "2.0.18",
- "@schematics/angular": "19.1.3",
+ "@schematics/angular": "19.1.7",
"@yarnpkg/lockfile": "1.1.0",
"ini": "5.0.0",
"jsonc-parser": "3.3.1",
@@ -674,9 +689,9 @@
}
},
"node_modules/@angular/common": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.2.tgz",
- "integrity": "sha512-6IhBXwz97pbXA+3vHw1hQlv4M0gc5NrDZSCQeffcraE6wpFMzo8vLcYAiNxpSyTFS7YLzCALdS6kYXVP2FBy1g==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.1.6.tgz",
+ "integrity": "sha512-FkuejwbxsOLhcyOgDM/7YEYvMG3tuyOvr+831VzPwMwYp5QO9AUYtn4ffGf698JccbA+Ocw3BAdhPU6i+YZC1A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -685,14 +700,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.1.2",
+ "@angular/core": "19.1.6",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.2.tgz",
- "integrity": "sha512-CThpvyims1aoPtqUA5UCB0lEI8lDnWBuY6VpMST4YCxhYuPmDWrwKcYXOJU1w/5yEeR8bAOvWIkKdA83MAEyHw==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.1.6.tgz",
+ "integrity": "sha512-Tl2PFEtnU8UgSqtEKG827xDUGZrErhR6S1JICeV1kbRCYmwQA4hhG25tzi+ifSAOPW7eJiyzP2LWIvOuZkq3Vw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -701,7 +716,7 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.1.2"
+ "@angular/core": "19.1.6"
},
"peerDependenciesMeta": {
"@angular/core": {
@@ -710,9 +725,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.2.tgz",
- "integrity": "sha512-CaZTG9arDVc9mGl/abqWsg79VbHAvo6ABtJa/Z6CJ6m2Y0HQPTJR6psiFqjnTSBUK43LRx8dDV3T8wIZa7DNpg==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.1.6.tgz",
+ "integrity": "sha512-rTpHC/tfLBj+5a3X+BA/4s2w5T/cHT6x3RgO8CYy7003Musn0/BiqjfE6VCIllQgLaOQRhCcf51T6Kerkzv8Dw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -734,14 +749,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/compiler": "19.1.2",
+ "@angular/compiler": "19.1.6",
"typescript": ">=5.5 <5.8"
}
},
"node_modules/@angular/core": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.2.tgz",
- "integrity": "sha512-WrOzn9X2LsXxS27fB1WNjYsFVUKvuDuZ0ERfesWb/t1prz09q7fi/YK0TXx7XOby9CfNe4aXjzRPQL2zgFuMWQ==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.1.6.tgz",
+ "integrity": "sha512-FD167URT+apxjzj9sG/MzffW5G6YyQiPQ6nrrIoYi9jeY3LYurybuOgvcXrU8PT4Z3+CKMq9k/ZnmrlHU72BpA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -755,9 +770,9 @@
}
},
"node_modules/@angular/elements": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-19.1.2.tgz",
- "integrity": "sha512-Xgh/k4jBKavMRYvNnfZbK5CzXloGNzowSSVyFGrHxFkYVOcCd1SsaHzjgF2W0ekfBOjjbeJm47T0lbiPe5FFMQ==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-19.1.6.tgz",
+ "integrity": "sha512-w91zaktvx/5AWPVUrbVJ29brX2O+4otnnlHZimahd2S1f6VVDv5K5pTRte1Mij+MDqjw8GBX/ok0+tc5B3yqKA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -766,14 +781,14 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/core": "19.1.2",
+ "@angular/core": "19.1.6",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/forms": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.2.tgz",
- "integrity": "sha512-PmHoF4JkGbYK0pdBH2FwAKU9VBydAIjJQlol3anjUQF2zfkITeTqfVNmys1mFhojGR+ZppV0zZ+8MhI/501P7A==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.1.6.tgz",
+ "integrity": "sha512-uu/76KAwCAcDuhD67Vv78UvOC/tiprtFXOgqNCj0LK8vyFcvPsunb3nF/PtfF9rSHyslXAqxZhME+Ha2tU6Lpw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -782,16 +797,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.1.2",
- "@angular/core": "19.1.2",
- "@angular/platform-browser": "19.1.2",
+ "@angular/common": "19.1.6",
+ "@angular/core": "19.1.6",
+ "@angular/platform-browser": "19.1.6",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.1.2.tgz",
- "integrity": "sha512-rU4Zf4RKabuv5d153umedNCZZReKLqHD+LgUaWjizvSHeI6dwyngJivEF0UgpFoDrm5q5UiyhMX8p1O4Bthtdw==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-19.1.6.tgz",
+ "integrity": "sha512-YIvCQRt+EFUKmms8M9K0ULDxAkCQSJqmnx4lGDJDHNK13U/C6r0d3/WMrrSDuSjax4zGSJf5xiRPpQlzPPsphA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -799,9 +814,9 @@
}
},
"node_modules/@angular/platform-browser": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.2.tgz",
- "integrity": "sha512-fk/OrL4r5jUjAi1WTv9LGTm+DXWrPtDBpoX4z5Ze6Se+x3/6pTn1Rty1C4MNZvHiTjIQGQNRnq447GdiOjhg9w==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.1.6.tgz",
+ "integrity": "sha512-sfWU+gMpqQ6GYtE3tAfDktftC01NgtqAOKfeCQ/KY2rxRTIxYahenW0Licuzgmd+8AZtmncoZaYX0Fd/5XMqzQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -810,9 +825,9 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/animations": "19.1.2",
- "@angular/common": "19.1.2",
- "@angular/core": "19.1.2"
+ "@angular/animations": "19.1.6",
+ "@angular/common": "19.1.6",
+ "@angular/core": "19.1.6"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -821,9 +836,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.2.tgz",
- "integrity": "sha512-QPHMWU6DJ+jMtodo12pvGf1VA6xhFUD8vh2+uCtcYMsCslcD+HjUZJ2+BVCjwhFSew/6RdgobTiFgiiIATvRIQ==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.1.6.tgz",
+ "integrity": "sha512-QedjG7/ctPtzgJ3LcWv4yMcSivKlwcZ8ge8zPe7eu9Ft6mDZZat65gJEjDuvevJoeNbo2dQODFDiyPJNmnNA9A==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -832,16 +847,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.1.2",
- "@angular/compiler": "19.1.2",
- "@angular/core": "19.1.2",
- "@angular/platform-browser": "19.1.2"
+ "@angular/common": "19.1.6",
+ "@angular/compiler": "19.1.6",
+ "@angular/core": "19.1.6",
+ "@angular/platform-browser": "19.1.6"
}
},
"node_modules/@angular/platform-server": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-19.1.2.tgz",
- "integrity": "sha512-h8Cz4UEWq3gvBOMuKynVWlC3oDmdkifj5e1Em9QsA9jmea+ZqSqyZcXtCc1sclxNTZHX6gpGLD4UIfOWpvAzog==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-19.1.6.tgz",
+ "integrity": "sha512-yCFkByyHDtxXZaaaRV+268WN8s45ie+R5bcJ9oPKYE3Td0f/7iTRUatDfTI8h7/xbYK4nRgGZmxuiREpjt6y6Q==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0",
@@ -851,17 +866,17 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/animations": "19.1.2",
- "@angular/common": "19.1.2",
- "@angular/compiler": "19.1.2",
- "@angular/core": "19.1.2",
- "@angular/platform-browser": "19.1.2"
+ "@angular/animations": "19.1.6",
+ "@angular/common": "19.1.6",
+ "@angular/compiler": "19.1.6",
+ "@angular/core": "19.1.6",
+ "@angular/platform-browser": "19.1.6"
}
},
"node_modules/@angular/router": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.2.tgz",
- "integrity": "sha512-yIz86uSTKFttwgWGnzHeFUvoHP+QNk+2w2OAR9UCbRoXpfx5oDhZj/zZQLmuqqpSAQyJ6qicqucEBUahA938pg==",
+ "version": "19.1.6",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.1.6.tgz",
+ "integrity": "sha512-TEfw3W5jVodVDMD4krhXGog1THZN3x1yoh2oZmCv3lXg22+pVC6Cp+x3vVExq0mS+g3/6uZwy/3qAYdlzqYjTg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -870,16 +885,16 @@
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
},
"peerDependencies": {
- "@angular/common": "19.1.2",
- "@angular/core": "19.1.2",
- "@angular/platform-browser": "19.1.2",
+ "@angular/common": "19.1.6",
+ "@angular/core": "19.1.6",
+ "@angular/platform-browser": "19.1.6",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/ssr": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-19.1.3.tgz",
- "integrity": "sha512-1cxxbirXKbbW3/7D8RyBcs23nvXG2rBArR7qCI8jaHxprxDFSrjoKeSUM/8V13PMNan73XZZoL6rpH9KtmMpqw==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-19.1.7.tgz",
+ "integrity": "sha512-MNjjSWNv1K0E1K/U/pRgFo54n/1qyaFcYGYKSbnpwAGjtiCiHLudL3Dycke3mHTmcPFX61DniX1MdJtLhhFsVA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.3.0"
@@ -4416,9 +4431,9 @@
}
},
"node_modules/@ngtools/webpack": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.3.tgz",
- "integrity": "sha512-O6bKP8J8w8U5NfFCA4ukO82rpmvii5JtXQCo2FCwafZBfYuV5GHw97ezbdUIaTbPML+EC7gq9Y85EuFAyUHtAg==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.1.7.tgz",
+ "integrity": "sha512-U39LVqHWj+GtKzBA3+AseHZgLPlL5YE/iRkZJ4PHQVrgW9LtyMzPuUmnW+e0XQwPFHq9xQxaoj3w8gApj4/MIg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5027,9 +5042,9 @@
}
},
"node_modules/@puppeteer/browsers": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz",
- "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.7.1.tgz",
+ "integrity": "sha512-MK7rtm8JjaxPN7Mf1JdZIZKPD2Z+W7osvrC1vjpvfOX1K0awDIHYbNi89f7eotp7eMUn2shWnt03HwVbriXtKQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -5037,9 +5052,8 @@
"extract-zip": "^2.0.1",
"progress": "^2.0.3",
"proxy-agent": "^6.5.0",
- "semver": "^7.6.3",
- "tar-fs": "^3.0.6",
- "unbzip2-stream": "^1.4.3",
+ "semver": "^7.7.0",
+ "tar-fs": "^3.0.8",
"yargs": "^17.7.2"
},
"bin": {
@@ -5067,6 +5081,19 @@
}
}
},
+ "node_modules/@puppeteer/browsers/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@rollup/plugin-json": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
@@ -5395,14 +5422,14 @@
}
},
"node_modules/@schematics/angular": {
- "version": "19.1.3",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.3.tgz",
- "integrity": "sha512-LG3OKZG1Dl1lxNIc81jr82WSUaDCYlg/SEJ6A78p8AaZtTFKf14WenJTeG0XZPX45l26BdZSjn9MUTCggxQvGQ==",
+ "version": "19.1.7",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.1.7.tgz",
+ "integrity": "sha512-BB8yMGmYDZzSb8Nu+Ln0TKyeoS3++f9STCYw30NwM3IViHxJJYxu/zowzwSa9TjftIzdCpbOaPxGS0vU9UOUDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@angular-devkit/core": "19.1.3",
- "@angular-devkit/schematics": "19.1.3",
+ "@angular-devkit/core": "19.1.7",
+ "@angular-devkit/schematics": "19.1.7",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -5965,10 +5992,11 @@
}
},
"node_modules/@types/jasmine": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz",
- "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==",
- "dev": true
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.6.tgz",
+ "integrity": "sha512-JDwKwipGFDwf021BtRTuluYe1aMDNimtO72ygPrVXnZSC8Df2V22AHeIgGa84tbF4SLkRvN+dJnlV8aMwQjkVw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/jasminewd2": {
"version": "2.0.13",
@@ -6105,9 +6133,9 @@
"dev": true
},
"node_modules/@types/ws": {
- "version": "8.5.13",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
- "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
+ "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7235,9 +7263,9 @@
}
},
"node_modules/bare-stream": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.4.tgz",
- "integrity": "sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==",
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
+ "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
@@ -7998,14 +8026,14 @@
}
},
"node_modules/chromium-bidi": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz",
- "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-1.3.0.tgz",
+ "integrity": "sha512-G3x1bkST13kmbL7+dT/oRkNH/7C4UqG+0YQpmySrzXspyOhYgDNc6lhSGpj3cuexvH25WTENhTYq2Tt9JRXtbw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "mitt": "3.0.1",
- "zod": "3.23.8"
+ "mitt": "^3.0.1",
+ "zod": "^3.24.1"
},
"peerDependencies": {
"devtools-protocol": "*"
@@ -8437,9 +8465,9 @@
}
},
"node_modules/compression": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
- "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -9350,9 +9378,9 @@
"license": "MIT"
},
"node_modules/devtools-protocol": {
- "version": "0.0.1367902",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
- "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==",
+ "version": "0.0.1402036",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1402036.tgz",
+ "integrity": "sha512-JwAYQgEvm3yD45CHB+RmF5kMbWtXBaOGwuxa87sZogHcLCv8c/IqnThaoQ1y60d7pXWjSKWQphPEc+1rAScVdg==",
"dev": true,
"license": "BSD-3-Clause"
},
@@ -12458,9 +12486,9 @@
}
},
"node_modules/igniteui-dockmanager": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/igniteui-dockmanager/-/igniteui-dockmanager-1.15.2.tgz",
- "integrity": "sha512-FtcWCbHhWfTuVZ1ltaiZstu88/O6NYny6BzkgVNELoLa/oqHCktjL6JoMTOC4a/QwDpoP3AMi+UmbvkQrE0fRQ==",
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/igniteui-dockmanager/-/igniteui-dockmanager-1.16.0.tgz",
+ "integrity": "sha512-MJj9UvqVUu6wx5mSr4xUnfFbZU9z0isUjIx5MJJt6XEQY+d7KYHyGCq4X7ahUBWAWd8KM3++KnDEA7/qJ4qNIg==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"dependencies": {
@@ -12490,9 +12518,10 @@
}
},
"node_modules/igniteui-theming": {
- "version": "14.3.1",
- "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-14.3.1.tgz",
- "integrity": "sha512-bh7a9b+VlNOE1tAk6yDbmS5I7VGch3mYtOU1jUvCXrUf6/vPDJYy4AjCRlwR5i/PHYraEj59Cmk0D7N4phxorQ==",
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-15.0.0.tgz",
+ "integrity": "sha512-4ANFe6t3t9fEDexmB8/H7hEO1eBBWohu1tbEUFdfQPBMgUT/qqXbSlxW3FGCmZV7Oxr5rn9ZdXyScPxzwRx1lg==",
+ "license": "MIT",
"peerDependencies": {
"sass": "^1.69.5"
}
@@ -13371,23 +13400,23 @@
}
},
"node_modules/jasmine": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.5.0.tgz",
- "integrity": "sha512-JKlEVCVD5QBPYLsg/VE+IUtjyseDCrW8rMBu8la+9ysYashDgavMLM9Kotls1FhI6dCJLJ40dBCIfQjGLPZI1Q==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.6.0.tgz",
+ "integrity": "sha512-6frlW22jhgRjtlp68QY/DDVCUfrYqmSxDBWM13mrBzYQGx1XITfVcJltnY15bk8B5cRfN5IpKvemkDiDTSRCsA==",
"dev": true,
"license": "MIT",
"dependencies": {
"glob": "^10.2.2",
- "jasmine-core": "~5.5.0"
+ "jasmine-core": "~5.6.0"
},
"bin": {
"jasmine": "bin/jasmine.js"
}
},
"node_modules/jasmine-core": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.5.0.tgz",
- "integrity": "sha512-NHOvoPO6o9gVR6pwqEACTEpbgcH+JJ6QDypyymGbSUIFIFsMMbBJ/xsFNud8MSClfnWclXd7RQlAZBz7yVo5TQ==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz",
+ "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==",
"dev": true,
"license": "MIT"
},
@@ -14092,9 +14121,9 @@
}
},
"node_modules/launch-editor": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
- "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz",
+ "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15894,9 +15923,9 @@
}
},
"node_modules/ng-packagr": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.1.0.tgz",
- "integrity": "sha512-i2S0tj2sQNOQGW+0bYViEftrnvzGSxW+/kDELVwEjnRh6KgAL0p6wH2w+aslCcELhruuGGCk96AaOfYwGPVsgQ==",
+ "version": "19.1.2",
+ "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.1.2.tgz",
+ "integrity": "sha512-h8YDp6YdPwAwbl7rs0lJE7vVugobY6m+JogS0hQ7P+52RmslPT8kRCgdvGLIS1JySwPrDFQkPh2PLBaSjwcRqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15932,7 +15961,7 @@
},
"peerDependencies": {
"@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0",
- "tailwindcss": "^2.0.0 || ^3.0.0",
+ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
"tslib": "^2.3.0",
"typescript": ">=5.5 <5.8"
},
@@ -17843,18 +17872,18 @@
}
},
"node_modules/puppeteer": {
- "version": "23.11.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.11.1.tgz",
- "integrity": "sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==",
+ "version": "24.2.1",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.2.1.tgz",
+ "integrity": "sha512-Euno62ou0cd0dTkOYTNioSOsFF4VpSnz4ldD38hi9ov9xCNtr8DbhmoJRUx+V9OuPgecueZbKOohRrnrhkbg3Q==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.6.1",
- "chromium-bidi": "0.11.0",
+ "@puppeteer/browsers": "2.7.1",
+ "chromium-bidi": "1.3.0",
"cosmiconfig": "^9.0.0",
- "devtools-protocol": "0.0.1367902",
- "puppeteer-core": "23.11.1",
+ "devtools-protocol": "0.0.1402036",
+ "puppeteer-core": "24.2.1",
"typed-query-selector": "^2.12.0"
},
"bin": {
@@ -17865,16 +17894,16 @@
}
},
"node_modules/puppeteer-core": {
- "version": "23.11.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz",
- "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==",
+ "version": "24.2.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.2.1.tgz",
+ "integrity": "sha512-bCypUh3WXzETafv1TCFAjIUnI8BiQ/d+XvEfEXDLcIMm9CAvROqnBmbt79yBjwasoDZsgfXnUmIJU7Y27AalVQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@puppeteer/browsers": "2.6.1",
- "chromium-bidi": "0.11.0",
+ "@puppeteer/browsers": "2.7.1",
+ "chromium-bidi": "1.3.0",
"debug": "^4.4.0",
- "devtools-protocol": "0.0.1367902",
+ "devtools-protocol": "0.0.1402036",
"typed-query-selector": "^2.12.0",
"ws": "^8.18.0"
},
@@ -20212,16 +20241,6 @@
"websocket-driver": "^0.7.4"
}
},
- "node_modules/sockjs/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/socks": {
"version": "2.8.3",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
@@ -21346,13 +21365,6 @@
"tslib": "^2"
}
},
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@@ -21863,17 +21875,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/unbzip2-stream": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
- "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.2.1",
- "through": "^2.3.8"
- }
- },
"node_modules/unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
@@ -22224,6 +22225,16 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -22547,16 +22558,16 @@
}
},
"node_modules/vite": {
- "version": "6.0.10",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.10.tgz",
- "integrity": "sha512-MEszunEcMo6pFsfXN1GhCFQqnE25tWRH0MA4f0Q7uanACi4y1Us+ZGpTMnITwCTnYzB2b9cpmnelTlxgTBmaBA==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
+ "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"esbuild": "^0.24.2",
- "postcss": "^8.4.49",
- "rollup": "^4.23.0"
+ "postcss": "^8.5.1",
+ "rollup": "^4.30.1"
},
"bin": {
"vite": "bin/vite.js"
@@ -23441,9 +23452,9 @@
}
},
"node_modules/zod": {
- "version": "3.23.8",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
- "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "version": "3.24.2",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz",
+ "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==",
"dev": true,
"license": "MIT",
"funding": {
diff --git a/package.json b/package.json
index 6dc029aec23..2b77eeb5aad 100644
--- a/package.json
+++ b/package.json
@@ -58,23 +58,23 @@
},
"private": true,
"dependencies": {
- "@angular/animations": "^19.1.2",
- "@angular/common": "^19.1.2",
- "@angular/compiler": "^19.1.2",
- "@angular/core": "^19.1.2",
- "@angular/elements": "^19.1.2",
- "@angular/forms": "^19.1.2",
- "@angular/platform-browser": "^19.1.2",
- "@angular/platform-browser-dynamic": "^19.1.2",
- "@angular/platform-server": "^19.1.2",
- "@angular/router": "^19.1.2",
- "@angular/ssr": "^19.1.3",
+ "@angular/animations": "^19.1.6",
+ "@angular/common": "^19.1.6",
+ "@angular/compiler": "^19.1.6",
+ "@angular/core": "^19.1.6",
+ "@angular/elements": "^19.1.6",
+ "@angular/forms": "^19.1.6",
+ "@angular/platform-browser": "^19.1.6",
+ "@angular/platform-browser-dynamic": "^19.1.6",
+ "@angular/platform-server": "^19.1.6",
+ "@angular/router": "^19.1.6",
+ "@angular/ssr": "^19.1.7",
"@igniteui/material-icons-extended": "^3.1.0",
"@lit-labs/ssr-dom-shim": "^1.2.1",
"@types/source-map": "0.5.2",
"express": "^4.21.1",
"fflate": "^0.8.1",
- "igniteui-theming": "^14.3.1",
+ "igniteui-theming": "^15.0.0",
"igniteui-trial-watermark": "^3.0.2",
"lodash-es": "^4.17.21",
"rxjs": "^7.8.0",
@@ -82,22 +82,22 @@
"zone.js": "~0.15.0"
},
"devDependencies": {
- "@angular-devkit/build-angular": "^19.1.3",
- "@angular-devkit/schematics": "^19.1.3",
- "@angular-eslint/builder": "^19.0.2",
- "@angular-eslint/eslint-plugin": "^19.0.2",
- "@angular-eslint/eslint-plugin-template": "^19.0.2",
- "@angular-eslint/schematics": "^19.0.2",
- "@angular-eslint/template-parser": "^19.0.2",
- "@angular/cli": "^19.1.3",
- "@angular/compiler-cli": "^19.1.2",
- "@angular/language-service": "^19.1.2",
+ "@angular-devkit/build-angular": "^19.1.7",
+ "@angular-devkit/schematics": "^19.1.7",
+ "@angular-eslint/builder": "^19.1.0",
+ "@angular-eslint/eslint-plugin": "^19.1.0",
+ "@angular-eslint/eslint-plugin-template": "^19.1.0",
+ "@angular-eslint/schematics": "^19.1.0",
+ "@angular-eslint/template-parser": "^19.1.0",
+ "@angular/cli": "^19.1.7",
+ "@angular/compiler-cli": "^19.1.6",
+ "@angular/language-service": "^19.1.6",
"@angularclass/hmr": "^3.0.0",
"@microsoft/signalr": "^7.0.12",
"@types/estree": "^1.0.0",
"@types/express": "^5.0.0",
"@types/hammerjs": "^2.0.46",
- "@types/jasmine": "^5.1.1",
+ "@types/jasmine": "^5.1.6",
"@types/jasminewd2": "^2.0.10",
"@types/node": "^20.17.6",
"@types/sass-true": "^6.0.2",
@@ -118,11 +118,11 @@
"hammer-simulator": "0.0.1",
"hammerjs": "^2.0.8",
"ig-typedoc-theme": "^6.0.0",
- "igniteui-dockmanager": "^1.15.2",
+ "igniteui-dockmanager": "^1.16.0",
"igniteui-sassdoc-theme": "^1.2.3",
"igniteui-webcomponents": "5.2.0",
- "jasmine": "^5.5.0",
- "jasmine-core": "~5.5.0",
+ "jasmine": "^5.6.0",
+ "jasmine-core": "^5.6.0",
"karma": "^6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "^2.0.3",
@@ -131,11 +131,11 @@
"karma-parallel": "^0.3.1",
"karma-spec-reporter": "^0.0.36",
"lit-html": "^3.2.1",
- "ng-packagr": "^19.1.0",
+ "ng-packagr": "^19.1.2",
"postcss": "^8.5.1",
"postcss-scss": "^4.0.6",
"prettier": "^3.3.3",
- "puppeteer": "^23.11.1",
+ "puppeteer": "^24.2.1",
"sass-embedded": "^1.83.4",
"sass-true": "^8.1.0",
"sassdoc": "^2.7.4",
diff --git a/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.html b/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.html
index 4a018a09576..8a1718cf1d2 100644
--- a/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.html
+++ b/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.html
@@ -1,4 +1,6 @@
-
-
- {{ litRender(container, templateFunc, context) }}
-
+@for (templateFunc of templateFunctions; track templateFunc) {
+
+
+ {{ litRender(container, templateFunc, context) }}
+
+}
diff --git a/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.ts b/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.ts
index 4faa7636907..35ba746cd94 100644
--- a/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.ts
+++ b/projects/igniteui-angular-elements/src/app/wrapper/wrapper.component.ts
@@ -1,4 +1,3 @@
-import { NgFor } from '@angular/common';
import { ChangeDetectorRef, Component, QueryList, TemplateRef, ViewChildren } from '@angular/core';
import { TemplateRefWrapper } from './template-ref-wrapper';
@@ -10,7 +9,7 @@ type TemplateFunction = (arg: any) => TemplateResult;
selector: 'igx-template-wrapper',
templateUrl: './wrapper.component.html',
styleUrls: ['./wrapper.component.scss'],
- imports: [NgFor]
+ imports: []
})
export class TemplateWrapperComponent {
@@ -18,7 +17,8 @@ export class TemplateWrapperComponent {
/**
* All template refs
- * Warning: the first is always the root `ngFor` template. TODO(D.P.): filter it out?
+ * Warning: the first is always the root `@for` template
+ * (internally creates one like the old `>;
diff --git a/projects/igniteui-angular-i18n/src/i18n/BG/grid-resources.ts b/projects/igniteui-angular-i18n/src/i18n/BG/grid-resources.ts
index f373135ebae..7ec521a1efb 100644
--- a/projects/igniteui-angular-i18n/src/i18n/BG/grid-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/BG/grid-resources.ts
@@ -106,7 +106,7 @@ export const GridResourceStringsBG = {
igx_grid_advanced_filter_ungroup: 'Разгрупирай',
igx_grid_advanced_filter_delete: 'Изтрий',
igx_grid_advanced_filter_delete_filters: 'Изтрий филтрите',
- igx_grid_advanced_filter_initial_text: 'Започнете със създаване не група от условия свързани с "And" или "Or".',
+ igx_grid_advanced_filter_initial_text: 'Започнете със създаване на група от условия свързани с "And" или "Or".',
igx_grid_advanced_filter_column_placeholder: 'Избери колона',
igx_grid_advanced_filter_value_placeholder: 'Стойност',
igx_grid_pinned_row_indicator: 'Закачени',
diff --git a/projects/igniteui-angular-i18n/src/i18n/BG/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/BG/query-builder-resources.ts
index dbd9873fb4d..c131b0619d1 100644
--- a/projects/igniteui-angular-i18n/src/i18n/BG/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/BG/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsBG = {
igx_query_builder_date_placeholder: 'Избери дата',
igx_query_builder_time_placeholder: 'Избери време',
+ igx_query_builder_datetime_placeholder: 'Избери дата и час',
igx_query_builder_filter_operator_and: 'And',
igx_query_builder_filter_operator_or: 'Or',
igx_query_builder_filter_contains: 'Съдържа',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsBG = {
igx_query_builder_filter_notEmpty: 'Не е празно',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Не е Null',
+ igx_query_builder_filter_in: 'В/във',
+ igx_query_builder_filter_notIn: 'Не е в/във',
igx_query_builder_filter_before: 'Преди',
igx_query_builder_filter_after: 'След',
igx_query_builder_filter_at: 'На',
@@ -39,20 +42,38 @@ export const QueryBuilderResourceStringsBG = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Всички',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'От',
+ igx_query_builder_select_label: 'Избери',
+ igx_query_builder_where_label: 'Където',
igx_query_builder_and_group: '"And" група',
igx_query_builder_or_group: '"Or" група',
igx_query_builder_end_group: 'Край на групирането',
igx_query_builder_and_label: 'and',
igx_query_builder_or_label: 'or',
- igx_query_builder_add_condition: 'Условие',
- igx_query_builder_create_and_group: 'Създай "And" група',
- igx_query_builder_create_or_group: 'Създай "Or" група',
+ igx_query_builder_switch_group: 'Премини към {0}',
+ igx_query_builder_add_condition: 'Добави условие',
+ igx_query_builder_add_group: 'Добави група',
+ igx_query_builder_add_condition_root: 'Условие',
+ igx_query_builder_add_group_root: 'Група',
igx_query_builder_ungroup: 'Разгрупирай',
igx_query_builder_delete: 'Изтрий',
igx_query_builder_delete_filters: 'Изтрий филтрите',
- igx_query_builder_initial_text: 'Започнете със създаване не група от условия свързани с "And" или "Or".',
+ igx_query_builder_initial_text: 'Започнете със създаване на група от условия свързани с "And" или "Or".',
igx_query_builder_column_placeholder: 'Избери колона',
- igx_query_builder_condition_placeholder: 'Изберете филтър',
+ igx_query_builder_condition_placeholder: 'Избери филтър',
igx_query_builder_value_placeholder: 'Стойност',
+ igx_query_builder_query_value_placeholder: 'Резултати от подзаявка',
+ igx_query_builder_all_fields: 'Всички полета',
+ igx_query_builder_details: 'Детайли',
+ igx_query_builder_search: 'Търсене',
+ igx_query_builder_select_all: 'Избери всички',
+ igx_query_builder_select_entity: 'Избери обект',
+ igx_query_builder_select_return_field_single: 'Избери поле за връщане',
+ igx_query_builder_select_return_fields: 'Избери полета за връщане',
+ igx_query_builder_dialog_title: 'Потвърждение',
+ igx_query_builder_dialog_message: 'С промяната на обекта ще загубите текущите си настройки. Сигурни ли сте, че искате да продължите?',
+ igx_query_builder_dialog_checkbox_text: 'Не показвай този диалогов прозорец отново',
+ igx_query_builder_dialog_cancel: 'Отказ',
+ igx_query_builder_dialog_confirm: 'Потвърди',
+ igx_query_builder_drop_ghost_text: 'Пусни тук за вмъкване'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/CS/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/CS/query-builder-resources.ts
index ed641423d60..c12f031c1bb 100644
--- a/projects/igniteui-angular-i18n/src/i18n/CS/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/CS/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsCS = {
igx_query_builder_date_placeholder: 'Datum výdeje',
igx_query_builder_time_placeholder: 'Čas vyzvednutí',
+ igx_query_builder_datetime_placeholder: 'Vyberte datum a čas',
igx_query_builder_filter_operator_and: 'A',
igx_query_builder_filter_operator_or: 'Nebo',
igx_query_builder_filter_contains: 'Obsahuje',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsCS = {
igx_query_builder_filter_notEmpty: 'Není prázdný',
igx_query_builder_filter_null: 'Nula',
igx_query_builder_filter_notNull: 'Nenulový',
+ igx_query_builder_filter_in: 'V',
+ igx_query_builder_filter_notIn: 'Není v',
igx_query_builder_filter_before: 'Před',
igx_query_builder_filter_after: 'Po',
igx_query_builder_filter_at: 'V',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsCS = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Všechno',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Z',
+ igx_query_builder_select_label: 'Vybrat',
+ igx_query_builder_where_label: 'Kde',
igx_query_builder_and_group: '"A" skupina',
igx_query_builder_or_group: '"Nebo" skupina',
igx_query_builder_end_group: 'Ukončit skupina',
igx_query_builder_and_label: 'a',
igx_query_builder_or_label: 'nebo',
- igx_query_builder_add_condition: 'Stav',
- igx_query_builder_create_and_group: 'Vytvořte skupinu "A"',
- igx_query_builder_create_or_group: 'Vytvořte skupinu "Nebo"',
+ igx_query_builder_switch_group: 'Přepnout na {0}',
+ igx_query_builder_add_condition: 'Vytvořte stav',
+ igx_query_builder_add_group: 'Vytvořte skupina',
+ igx_query_builder_add_condition_root: 'Stav',
+ igx_query_builder_add_group_root: 'Skupina',
igx_query_builder_ungroup: 'Oddělit',
igx_query_builder_delete: 'Vymazat',
igx_query_builder_delete_filters: 'Smazat filtry',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsCS = {
igx_query_builder_column_placeholder: 'Vyberte sloupec',
igx_query_builder_condition_placeholder: 'Vyberte filtr',
igx_query_builder_value_placeholder: 'Hodnota',
+ igx_query_builder_query_value_placeholder: 'Výsledky dílčího dotazu',
+ igx_query_builder_all_fields: 'Všechna pole',
+ igx_query_builder_details: 'Podrobnosti',
+ igx_query_builder_search: 'Vyhledávání',
+ igx_query_builder_select_all: 'Vybrat vše',
+ igx_query_builder_select_entity: 'Vyberte entitu',
+ igx_query_builder_select_return_field_single: 'Vyberte návratové pole',
+ igx_query_builder_select_return_fields: 'Vyberte pole pro vrácení',
+ igx_query_builder_dialog_title: 'Potvrzení',
+ igx_query_builder_dialog_message: 'Změnou entity ztratíte svá aktuální nastavení. Opravdu to chcete udělat?',
+ igx_query_builder_dialog_checkbox_text: 'Tento dialog již příště nezobrazovat',
+ igx_query_builder_dialog_cancel: 'Zrušení',
+ igx_query_builder_dialog_confirm: 'Potvrdit',
+ igx_query_builder_drop_ghost_text: 'Přetažením sem vložíte'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/DA/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/DA/query-builder-resources.ts
index 27fda75423b..0ef3bf3ec28 100644
--- a/projects/igniteui-angular-i18n/src/i18n/DA/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/DA/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsDA = {
igx_query_builder_date_placeholder: 'Afhentningsdato',
igx_query_builder_time_placeholder: 'Afhentningstidspunkt',
+ igx_query_builder_datetime_placeholder: 'Vælg dato og tid',
igx_query_builder_filter_operator_and: 'Og',
igx_query_builder_filter_operator_or: 'Eller',
igx_query_builder_filter_contains: 'Indeholder',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsDA = {
igx_query_builder_filter_notEmpty: 'Ikke tom',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Ikke Null',
+ igx_query_builder_filter_in: 'I',
+ igx_query_builder_filter_notIn: 'Ikke i',
igx_query_builder_filter_before: 'Før',
igx_query_builder_filter_after: 'Efter',
igx_query_builder_filter_at: 'På',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsDA = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Alle',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Fra',
+ igx_query_builder_select_label: 'Vælg',
+ igx_query_builder_where_label: 'Hvor',
igx_query_builder_and_group: '"Og" gruppe',
igx_query_builder_or_group: '"Eller" gruppe',
igx_query_builder_end_group: 'Afslut gruppe',
igx_query_builder_and_label: 'og',
igx_query_builder_or_label: 'eller',
- igx_query_builder_add_condition: 'Tilstand',
- igx_query_builder_create_and_group: 'Opret "Og" gruppe',
- igx_query_builder_create_or_group: 'Opret "Eller" gruppe',
+ igx_query_builder_switch_group: 'Skift til {0}',
+ igx_query_builder_add_condition: 'Opret tilstand',
+ igx_query_builder_add_group: 'Opret gruppe',
+ igx_query_builder_add_condition_root: 'Tilstand',
+ igx_query_builder_add_group_root: 'Gruppe',
igx_query_builder_ungroup: 'Fjern gruppe',
igx_query_builder_delete: 'Slet',
igx_query_builder_delete_filters: 'Slet filtre',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsDA = {
igx_query_builder_column_placeholder: 'Vælg kolonne',
igx_query_builder_condition_placeholder: 'Vælg filter',
igx_query_builder_value_placeholder: 'Værdi',
+ igx_query_builder_query_value_placeholder: 'Underforespørgselsresultater',
+ igx_query_builder_all_fields: 'Alle felter',
+ igx_query_builder_details: 'Detaljer',
+ igx_query_builder_search: 'Søg',
+ igx_query_builder_select_all: 'Vælg alle',
+ igx_query_builder_select_entity: 'Vælg objekt',
+ igx_query_builder_select_return_field_single: 'Vælg returfelt',
+ igx_query_builder_select_return_fields: 'Vælg returfelter',
+ igx_query_builder_dialog_title: 'Bekræftelse',
+ igx_query_builder_dialog_message: 'Ved at ændre objektet mister du dine nuværende indstillinger. Er du sikker på, at du vil fortsætte?',
+ igx_query_builder_dialog_checkbox_text: 'Vis ikke denne dialogboks igen',
+ igx_query_builder_dialog_cancel: 'Annuller',
+ igx_query_builder_dialog_confirm: 'Bekræft',
+ igx_query_builder_drop_ghost_text: 'Slip her for at indsætte'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/DE/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/DE/query-builder-resources.ts
index 040c5aab30a..9d65e4cc872 100644
--- a/projects/igniteui-angular-i18n/src/i18n/DE/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/DE/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsDE = {
igx_query_builder_date_placeholder: 'Wähle Datum',
igx_query_builder_time_placeholder: 'Abholungszeit',
+ igx_query_builder_datetime_placeholder: 'Datum und Uhrzeit auswählen',
igx_query_builder_filter_operator_and: 'Und',
igx_query_builder_filter_operator_or: 'Oder',
igx_query_builder_filter_contains: 'Enthält',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsDE = {
igx_query_builder_filter_notEmpty: 'Nicht leer',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Nicht Null',
+ igx_query_builder_filter_in: 'In',
+ igx_query_builder_filter_notIn: 'Nicht in',
igx_query_builder_filter_before: 'Vor',
igx_query_builder_filter_after: 'Nach',
igx_query_builder_filter_at: 'Um',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsDE = {
igx_query_builder_filter_true: 'Wahr',
igx_query_builder_filter_false: 'Falsch',
igx_query_builder_filter_all: 'Alle',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Von',
+ igx_query_builder_select_label: 'Auswählen',
+ igx_query_builder_where_label: 'Wo',
igx_query_builder_and_group: '"Und" Gruppe',
igx_query_builder_or_group: '"Oder" Gruppe',
igx_query_builder_end_group: 'Beende Gruppe',
igx_query_builder_and_label: 'und',
igx_query_builder_or_label: 'oder',
- igx_query_builder_add_condition: 'Bedingung',
- igx_query_builder_create_and_group: 'Erstelle "Und" Gruppe',
- igx_query_builder_create_or_group: 'Erstelle "Oder" Gruppe',
+ igx_query_builder_switch_group: 'Wechseln zu {0}',
+ igx_query_builder_add_condition: 'Erstelle bedingung',
+ igx_query_builder_add_group: 'Erstelle gruppe',
+ igx_query_builder_add_condition_root: 'Bedingung',
+ igx_query_builder_add_group_root: 'Gruppe',
igx_query_builder_ungroup: 'Lösche Gruppierung',
igx_query_builder_delete: 'Lösche',
igx_query_builder_delete_filters: 'Lösche Filter',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsDE = {
igx_query_builder_column_placeholder: 'Wähle Spalte',
igx_query_builder_condition_placeholder: 'Wähle Filter',
igx_query_builder_value_placeholder: 'Wert',
+ igx_query_builder_query_value_placeholder: 'Unterabfrageergebnisse',
+ igx_query_builder_all_fields: 'Alle Felder',
+ igx_query_builder_details: 'Details',
+ igx_query_builder_search: 'Suchen',
+ igx_query_builder_select_all: 'Alle auswählen',
+ igx_query_builder_select_entity: 'Entität auswählen',
+ igx_query_builder_select_return_field_single: 'Rückgabefeld auswählen',
+ igx_query_builder_select_return_fields: 'Rückgabefelder auswählen',
+ igx_query_builder_dialog_title: 'Bestätigung',
+ igx_query_builder_dialog_message: 'Durch das Ändern der Entität gehen Ihre aktuellen Einstellungen verloren. Möchten Sie wirklich fortfahren?',
+ igx_query_builder_dialog_checkbox_text: 'Dieses Dialogfeld nicht mehr anzeigen',
+ igx_query_builder_dialog_cancel: 'Abbrechen',
+ igx_query_builder_dialog_confirm: 'Bestätigen',
+ igx_query_builder_drop_ghost_text: 'Hier ablegen, um einzufügen'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/ES/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/ES/query-builder-resources.ts
index 8e33e074d5a..d4073ae3142 100644
--- a/projects/igniteui-angular-i18n/src/i18n/ES/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/ES/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsES = {
igx_query_builder_date_placeholder: 'Elegir Fecha',
igx_query_builder_time_placeholder: 'Hora de recogida',
+ igx_query_builder_datetime_placeholder: 'Seleccionar fecha y hora',
igx_query_builder_filter_operator_and: 'Y',
igx_query_builder_filter_operator_or: 'O',
igx_query_builder_filter_contains: 'Contiene',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsES = {
igx_query_builder_filter_notEmpty: 'No Vacío',
igx_query_builder_filter_null: 'Nulo',
igx_query_builder_filter_notNull: 'No Nulo',
+ igx_query_builder_filter_in: 'En',
+ igx_query_builder_filter_notIn: 'No en',
igx_query_builder_filter_before: 'Antes',
igx_query_builder_filter_after: 'Después',
igx_query_builder_filter_at: 'A la(s)',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsES = {
igx_query_builder_filter_true: 'Verdadero',
igx_query_builder_filter_false: 'Falso',
igx_query_builder_filter_all: 'Todo',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Desde',
+ igx_query_builder_select_label: 'Seleccionar',
+ igx_query_builder_where_label: 'Donde',
igx_query_builder_and_group: 'Grupo "Y"',
igx_query_builder_or_group: '"Grupo "O"',
igx_query_builder_end_group: 'Grupo Fin',
igx_query_builder_and_label: 'y',
igx_query_builder_or_label: 'o',
- igx_query_builder_add_condition: 'Condición',
- igx_query_builder_create_and_group: 'Crear grupo "Y"',
- igx_query_builder_create_or_group: 'Crear grupo "O"',
+ igx_query_builder_switch_group: 'Cambiar a {0}',
+ igx_query_builder_add_condition: 'Crear condición',
+ igx_query_builder_add_group: 'Crear grupo',
+ igx_query_builder_add_condition_root: 'Condición',
+ igx_query_builder_add_group_root: 'Grupo',
igx_query_builder_ungroup: 'Desagrupar',
igx_query_builder_delete: 'Eliminar',
igx_query_builder_delete_filters: 'Eliminar filtros',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsES = {
igx_query_builder_column_placeholder: 'Seleccionar columna',
igx_query_builder_condition_placeholder: 'Seleccionar filtro',
igx_query_builder_value_placeholder: 'Valor',
+ igx_query_builder_query_value_placeholder: 'Resultados de la subconsulta',
+ igx_query_builder_all_fields: 'Todos los campos',
+ igx_query_builder_details: 'Detalles',
+ igx_query_builder_search: 'Buscar',
+ igx_query_builder_select_all: 'Seleccionar todo',
+ igx_query_builder_select_entity: 'Seleccionar entidad',
+ igx_query_builder_select_return_field_single: 'Seleccionar campo de devolución',
+ igx_query_builder_select_return_fields: 'Seleccionar campos de retorno',
+ igx_query_builder_dialog_title: 'Confirmación',
+ igx_query_builder_dialog_message: 'Al cambiar la entidad, se perderán las configuraciones actuales. ¿Está seguro de que desea continuar?',
+ igx_query_builder_dialog_checkbox_text: 'No volver a mostrar este cuadro de diálogo',
+ igx_query_builder_dialog_cancel: 'Cancelar',
+ igx_query_builder_dialog_confirm: 'Confirmar',
+ igx_query_builder_drop_ghost_text: 'Soltar aquí para insertar'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/FR/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/FR/query-builder-resources.ts
index 70b28a6a99a..5c582d27c80 100644
--- a/projects/igniteui-angular-i18n/src/i18n/FR/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/FR/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsFR = {
igx_query_builder_date_placeholder: 'Choisir la date',
igx_query_builder_time_placeholder: 'Heure de récupération',
+ igx_query_builder_datetime_placeholder: 'Sélectionner la date et l\'heure',
igx_query_builder_filter_operator_and: 'Et',
igx_query_builder_filter_operator_or: 'Ou',
igx_query_builder_filter_contains: 'Contient',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsFR = {
igx_query_builder_filter_notEmpty: 'Pas vide',
igx_query_builder_filter_null: 'Nul',
igx_query_builder_filter_notNull: 'Pas nul',
+ igx_query_builder_filter_in: 'Dans',
+ igx_query_builder_filter_notIn: 'Pas dans',
igx_query_builder_filter_before: 'Avant',
igx_query_builder_filter_after: 'Après',
igx_query_builder_filter_at: 'À',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsFR = {
igx_query_builder_filter_true: 'Vrai',
igx_query_builder_filter_false: 'Faux',
igx_query_builder_filter_all: 'Tout',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'De',
+ igx_query_builder_select_label: 'Sélectionner',
+ igx_query_builder_where_label: 'Où',
igx_query_builder_and_group: 'Groupe "Et"',
igx_query_builder_or_group: 'Groupe "Ou"',
igx_query_builder_end_group: 'Quitter le groupe',
igx_query_builder_and_label: 'et',
igx_query_builder_or_label: 'ou',
- igx_query_builder_add_condition: 'Condition',
- igx_query_builder_create_and_group: 'Créer un groupe "Et"',
- igx_query_builder_create_or_group: 'Créer un groupe "Ou"',
+ igx_query_builder_switch_group: 'Passer à {0}',
+ igx_query_builder_add_condition: 'Créer un condition',
+ igx_query_builder_add_group: 'Créer un groupe',
+ igx_query_builder_add_condition_root: 'Condition',
+ igx_query_builder_add_group_root: 'Groupe',
igx_query_builder_ungroup: 'Supprimer le regroupement',
igx_query_builder_delete: 'Supprimer',
igx_query_builder_delete_filters: 'Supprimer les filtres',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsFR = {
igx_query_builder_column_placeholder: 'Sélectionner la colonne',
igx_query_builder_condition_placeholder: 'Sélectionner le filtre',
igx_query_builder_value_placeholder: 'Valeur',
+ igx_query_builder_query_value_placeholder: 'Résultats de la sous-requête',
+ igx_query_builder_all_fields: 'Tous les domaines',
+ igx_query_builder_details: 'Détails',
+ igx_query_builder_search: 'Chercher',
+ igx_query_builder_select_all: 'Sélectionner tout',
+ igx_query_builder_select_entity: 'Sélectionner une entité',
+ igx_query_builder_select_return_field_single: 'Sélectionnez le champ de retour',
+ igx_query_builder_select_return_fields: 'Sélectionner les champs de retour',
+ igx_query_builder_dialog_title: 'Confirmation',
+ igx_query_builder_dialog_message: 'En changeant l\'entité, vous perdrez vos paramètres actuels. Êtes-vous sûr de vouloir faire cela ?',
+ igx_query_builder_dialog_checkbox_text: 'Ne plus afficher cette boîte de dialogue',
+ igx_query_builder_dialog_cancel: 'Annuler',
+ igx_query_builder_dialog_confirm: 'Confirmer',
+ igx_query_builder_drop_ghost_text: 'Déposez ici pour insérer'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/HU/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/HU/query-builder-resources.ts
index 49353558148..650b8c7200d 100644
--- a/projects/igniteui-angular-i18n/src/i18n/HU/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/HU/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsHU = {
igx_query_builder_date_placeholder: 'Felvétel dátuma',
igx_query_builder_time_placeholder: 'Felvétel időpontja',
+ igx_query_builder_datetime_placeholder: 'Dátum és idő kiválasztása',
igx_query_builder_filter_operator_and: 'És',
igx_query_builder_filter_operator_or: 'Vagy',
igx_query_builder_filter_contains: 'Tartalmazza',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsHU = {
igx_query_builder_filter_notEmpty: 'Nem üres',
igx_query_builder_filter_null: 'Nullértékű',
igx_query_builder_filter_notNull: 'Nem nullértékű',
+ igx_query_builder_filter_in: 'Itt',
+ igx_query_builder_filter_notIn: 'Nem itt',
igx_query_builder_filter_before: 'Előtte',
igx_query_builder_filter_after: 'Utána',
igx_query_builder_filter_at: 'Ekkor',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsHU = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Összes',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Kezdete',
+ igx_query_builder_select_label: 'Kiválasztás',
+ igx_query_builder_where_label: 'Ahol',
igx_query_builder_and_group: '"És" csoport',
igx_query_builder_or_group: '"Vagy" Csoport',
igx_query_builder_end_group: 'Vége csoport',
igx_query_builder_and_label: 'és',
igx_query_builder_or_label: 'vagy',
- igx_query_builder_add_condition: 'Feltétel',
- igx_query_builder_create_and_group: '"És" csoport létrehozása',
- igx_query_builder_create_or_group: '"Vagy" csoport létrehozása',
+ igx_query_builder_switch_group: 'Váltás a(z) {0}',
+ igx_query_builder_add_condition: 'Feltétel létrehozása',
+ igx_query_builder_add_group: 'Csoport létrehozása',
+ igx_query_builder_add_condition_root: 'Feltétel',
+ igx_query_builder_add_group_root: 'Csoport',
igx_query_builder_ungroup: 'Csoportbontás',
igx_query_builder_delete: 'Törlés',
igx_query_builder_delete_filters: 'Szűrők törlése',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsHU = {
igx_query_builder_column_placeholder: 'Oszlop kiválasztása',
igx_query_builder_condition_placeholder: 'Szűrő kiválasztása',
igx_query_builder_value_placeholder: 'Érték',
-} satisfies MakeRequired;
+ igx_query_builder_query_value_placeholder: 'Allekérdezés eredményei',
+ igx_query_builder_all_fields: 'Minden mező',
+ igx_query_builder_details: 'Részletek',
+ igx_query_builder_search: 'Keresés',
+ igx_query_builder_select_all: 'Mindet kijelöli',
+ igx_query_builder_select_entity: 'Entitás kiválasztása',
+ igx_query_builder_select_return_field_single: 'Válassza ki a visszatérési mezőt',
+ igx_query_builder_select_return_fields: 'Visszatérő mezők kiválasztása',
+ igx_query_builder_dialog_title: 'Megerősítés',
+ igx_query_builder_dialog_message: 'Az entitás megváltoztatásával elveszíti jelenlegi beállításait. Biztos, hogy folytatni kívánja?',
+ igx_query_builder_dialog_checkbox_text: 'Ne jelenjen meg többet ez a párbeszédpanel',
+ igx_query_builder_dialog_cancel: 'Mégse',
+ igx_query_builder_dialog_confirm: 'Megerősítés',
+ igx_query_builder_drop_ghost_text: 'Húzza ide a beszúráshoz'
+} satisfies MakeRequired;
\ No newline at end of file
diff --git a/projects/igniteui-angular-i18n/src/i18n/IT/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/IT/query-builder-resources.ts
index 02b308fcf64..bdde42dae39 100644
--- a/projects/igniteui-angular-i18n/src/i18n/IT/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/IT/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsIT = {
igx_query_builder_date_placeholder: 'Data di prelievo',
igx_query_builder_time_placeholder: 'Ora ritiro',
+ igx_query_builder_datetime_placeholder: 'Seleziona data e ora',
igx_query_builder_filter_operator_and: 'E',
igx_query_builder_filter_operator_or: 'O',
igx_query_builder_filter_contains: 'Contiene',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsIT = {
igx_query_builder_filter_notEmpty: 'Non vuoto',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Non null',
+ igx_query_builder_filter_in: 'In',
+ igx_query_builder_filter_notIn: 'Non in',
igx_query_builder_filter_before: 'Prima',
igx_query_builder_filter_after: 'Dopo',
igx_query_builder_filter_at: 'A',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsIT = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Tutto',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Da',
+ igx_query_builder_select_label: 'Seleziona',
+ igx_query_builder_where_label: 'Dove',
igx_query_builder_and_group: 'Gruppo "And"',
igx_query_builder_or_group: 'Gruppo "Or"',
igx_query_builder_end_group: 'Gruppo finale',
igx_query_builder_and_label: 'e',
igx_query_builder_or_label: 'oppure',
- igx_query_builder_add_condition: 'Condizione',
- igx_query_builder_create_and_group: 'Crea gruppo "And"',
- igx_query_builder_create_or_group: 'Crea gruppo "Or"',
+ igx_query_builder_switch_group: 'Passa a {0}',
+ igx_query_builder_add_condition: 'Crea condizione',
+ igx_query_builder_add_group: 'Crea gruppo',
+ igx_query_builder_add_condition_root: 'Condizione',
+ igx_query_builder_add_group_root: 'Gruppo',
igx_query_builder_ungroup: 'Togli dal gruppo',
igx_query_builder_delete: 'Elimina',
igx_query_builder_delete_filters: 'Elimina filtri',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsIT = {
igx_query_builder_column_placeholder: 'Seleziona colonna',
igx_query_builder_condition_placeholder: 'Seleziona filtro',
igx_query_builder_value_placeholder: 'Valore',
+ igx_query_builder_query_value_placeholder: 'Risultati della sottoquery',
+ igx_query_builder_all_fields: 'Tutti i campi',
+ igx_query_builder_details: 'Dettagli',
+ igx_query_builder_search: 'Cerca',
+ igx_query_builder_select_all: 'Seleziona tutto',
+ igx_query_builder_select_entity: 'Seleziona entità',
+ igx_query_builder_select_return_field_single: 'Seleziona il campo di ritorno',
+ igx_query_builder_select_return_fields: 'Seleziona campi di ritorno',
+ igx_query_builder_dialog_title: 'Conferma',
+ igx_query_builder_dialog_message: 'Modificando l\'entità, perderai le impostazioni correnti. Procedere?',
+ igx_query_builder_dialog_checkbox_text: 'Non visualizzare più questo messaggio',
+ igx_query_builder_dialog_cancel: 'Annulla',
+ igx_query_builder_dialog_confirm: 'Conferma',
+ igx_query_builder_drop_ghost_text: 'Trascinare qui per inserire'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/JA/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/JA/query-builder-resources.ts
index af954e9fe6b..89b29821a01 100644
--- a/projects/igniteui-angular-i18n/src/i18n/JA/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/JA/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsJA = {
igx_query_builder_date_placeholder: '日付の選択',
igx_query_builder_time_placeholder: 'ピックアップ時間',
+ igx_query_builder_datetime_placeholder: '日付と時間の選択',
igx_query_builder_filter_operator_and: 'And',
igx_query_builder_filter_operator_or: 'Or',
igx_query_builder_filter_contains: 'を含む',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsJA = {
igx_query_builder_filter_notEmpty: '空以外',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Null 以外',
+ igx_query_builder_filter_in: '~に含まれる',
+ igx_query_builder_filter_notIn: '~に含まれない',
igx_query_builder_filter_before: '前',
igx_query_builder_filter_after: '後',
igx_query_builder_filter_at: '特定の時間',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsJA = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'すべて',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'から',
+ igx_query_builder_select_label: '選択',
+ igx_query_builder_where_label: '条件',
igx_query_builder_and_group: '"And" グループ',
igx_query_builder_or_group: '"Or" グループ',
igx_query_builder_end_group: 'End グループ',
igx_query_builder_and_label: 'and',
igx_query_builder_or_label: 'or',
- igx_query_builder_add_condition: '条件',
- igx_query_builder_create_and_group: '"And" グループの作成',
- igx_query_builder_create_or_group: '"Or" グループの作成',
+ igx_query_builder_switch_group: '{0} に切り替える',
+ igx_query_builder_add_condition: '条件の作成',
+ igx_query_builder_add_group: 'グループの作成',
+ igx_query_builder_add_condition_root: '条件',
+ igx_query_builder_add_group_root: 'グループ',
igx_query_builder_ungroup: 'グループ解除',
igx_query_builder_delete: '削除',
igx_query_builder_delete_filters: 'フィルターの削除',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsJA = {
igx_query_builder_column_placeholder: '列の選択',
igx_query_builder_condition_placeholder: 'フィルターの選択',
igx_query_builder_value_placeholder: '値',
+ igx_query_builder_query_value_placeholder: 'サブクエリの結果',
+ igx_query_builder_all_fields: 'すべてのフィールド',
+ igx_query_builder_details: '詳細',
+ igx_query_builder_search: '検索',
+ igx_query_builder_select_all: 'すべて選択',
+ igx_query_builder_select_entity: 'エンティティの選択',
+ igx_query_builder_select_return_field_single: '返却フィールドの選択',
+ igx_query_builder_select_return_fields: '返却フィールドの選択',
+ igx_query_builder_dialog_title: '確認',
+ igx_query_builder_dialog_message: 'エンティティを変更すると、現在の設定は失われます。続行しますか?',
+ igx_query_builder_dialog_checkbox_text: '今後このダイアログを表示しない',
+ igx_query_builder_dialog_cancel: 'キャンセル',
+ igx_query_builder_dialog_confirm: '確認',
+ igx_query_builder_drop_ghost_text: 'ここにドロップして挿入'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/KO/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/KO/query-builder-resources.ts
index 3f1bee4ca3d..fe2e383f9bc 100644
--- a/projects/igniteui-angular-i18n/src/i18n/KO/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/KO/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsKO = {
igx_query_builder_date_placeholder: '픽업 날짜',
igx_query_builder_time_placeholder: '인도 시간',
+ igx_query_builder_datetime_placeholder: '날짜 및 시간 선택',
igx_query_builder_filter_operator_and: '그리고',
igx_query_builder_filter_operator_or: '또는',
igx_query_builder_filter_contains: '포함',
@@ -17,13 +18,15 @@ export const QueryBuilderResourceStringsKO = {
igx_query_builder_filter_empty: '비우기',
igx_query_builder_filter_notEmpty: '비우지 않음',
igx_query_builder_filter_null: 'Null',
- igx_query_builder_filter_notNull: 'Not Null',
+ igx_query_builder_filter_notNull: 'Null 아님',
+ igx_query_builder_filter_in: '포함',
+ igx_query_builder_filter_notIn: '포함 안 함',
igx_query_builder_filter_before: '전에',
igx_query_builder_filter_after: '후에',
- igx_query_builder_filter_at: 'At',
- igx_query_builder_filter_not_at: 'Not At',
- igx_query_builder_filter_at_before: 'At or Before',
- igx_query_builder_filter_at_after: 'At or After',
+ igx_query_builder_filter_at: '해당',
+ igx_query_builder_filter_not_at: '해당 아님',
+ igx_query_builder_filter_at_before: '해당 또는 이전',
+ igx_query_builder_filter_at_after: '해당 또는 이후',
igx_query_builder_filter_today: '오늘',
igx_query_builder_filter_yesterday: '어제',
igx_query_builder_filter_thisMonth: '이번 달',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsKO = {
igx_query_builder_filter_true: '참',
igx_query_builder_filter_false: '거짓',
igx_query_builder_filter_all: '모두',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: '부터',
+ igx_query_builder_select_label: '선택',
+ igx_query_builder_where_label: '선택',
igx_query_builder_and_group: '그룹 "그리고"',
igx_query_builder_or_group: '그룹 "또는"',
igx_query_builder_end_group: '그룹 종료',
igx_query_builder_and_label: '그리고',
igx_query_builder_or_label: '또는',
- igx_query_builder_add_condition: '조건',
- igx_query_builder_create_and_group: '그룹 "그리고" 생성',
- igx_query_builder_create_or_group: '그룹 "또는" 생성',
+ igx_query_builder_switch_group: '{0} 으로 전환',
+ igx_query_builder_add_condition: '생성 조건',
+ igx_query_builder_add_group: '그룹 생성',
+ igx_query_builder_add_condition_root: '조건',
+ igx_query_builder_add_group_root: '그룹',
igx_query_builder_ungroup: '그룹 해제',
igx_query_builder_delete: '삭제',
igx_query_builder_delete_filters: '필터 삭제',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsKO = {
igx_query_builder_column_placeholder: '열 선택',
igx_query_builder_condition_placeholder: '필터 선택',
igx_query_builder_value_placeholder: '값',
+ igx_query_builder_query_value_placeholder: '하위 쿼리 결과',
+ igx_query_builder_all_fields: '모든 분야',
+ igx_query_builder_details: '세부',
+ igx_query_builder_search: '검색',
+ igx_query_builder_select_all: '모두 선택',
+ igx_query_builder_select_entity: '엔터티 선택',
+ igx_query_builder_select_return_field_single: '반환 필드를 선택',
+ igx_query_builder_select_return_fields: '반환 필드 선택',
+ igx_query_builder_dialog_title: '반환 필드 선택',
+ igx_query_builder_dialog_message: '엔터티를 변경하면 현재 설정이 손실됩니다. 계속하시겠습니까?',
+ igx_query_builder_dialog_checkbox_text: '이 대화 상자를 다시 표시하지 않기',
+ igx_query_builder_dialog_cancel: '취소',
+ igx_query_builder_dialog_confirm: '확인',
+ igx_query_builder_drop_ghost_text: '삽입하려면 여기에 드롭'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/NB/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/NB/query-builder-resources.ts
index 4882eef2fa7..42872b424f2 100644
--- a/projects/igniteui-angular-i18n/src/i18n/NB/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/NB/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsNB = {
igx_query_builder_date_placeholder: 'Hentedato',
igx_query_builder_time_placeholder: 'Hentetid',
+ igx_query_builder_datetime_placeholder: 'Velg dato og tid',
igx_query_builder_filter_operator_and: 'Og',
igx_query_builder_filter_operator_or: 'Eller',
igx_query_builder_filter_contains: 'Inneholder',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsNB = {
igx_query_builder_filter_notEmpty: 'Ikke tom',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Ikke null',
+ igx_query_builder_filter_in: 'I',
+ igx_query_builder_filter_notIn: 'Ikke i',
igx_query_builder_filter_before: 'Før',
igx_query_builder_filter_after: 'Etter',
igx_query_builder_filter_at: 'På',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsNB = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Alle',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Fra',
+ igx_query_builder_select_label: 'Velg',
+ igx_query_builder_where_label: 'Hvor',
igx_query_builder_and_group: '"Og"-gruppe',
igx_query_builder_or_group: '"Eller"-gruppe',
igx_query_builder_end_group: 'Sluttgruppe',
igx_query_builder_and_label: 'og',
igx_query_builder_or_label: 'eller',
- igx_query_builder_add_condition: 'Tilstand',
- igx_query_builder_create_and_group: 'Opprett "Og"-gruppe',
- igx_query_builder_create_or_group: 'Opprett "Eller"-gruppe',
+ igx_query_builder_switch_group: 'Bytt til {0}',
+ igx_query_builder_add_condition: 'Opprett tilstand',
+ igx_query_builder_add_group: 'Opprett gruppe',
+ igx_query_builder_add_condition_root: 'Tilstand',
+ igx_query_builder_add_group_root: 'Gruppe',
igx_query_builder_ungroup: 'Opphev gruppering',
igx_query_builder_delete: 'Slett',
igx_query_builder_delete_filters: 'Slett filtre',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsNB = {
igx_query_builder_column_placeholder: 'Velg kolonne',
igx_query_builder_condition_placeholder: 'Velg filter',
igx_query_builder_value_placeholder: 'Verdi',
+ igx_query_builder_query_value_placeholder: 'Delspørringsresultater',
+ igx_query_builder_all_fields: 'Alle felt',
+ igx_query_builder_details: 'Detaljer',
+ igx_query_builder_search: 'Søk',
+ igx_query_builder_select_all: 'Velg alle',
+ igx_query_builder_select_entity: 'Velg enhet',
+ igx_query_builder_select_return_field_single: 'Velg returfelt',
+ igx_query_builder_select_return_fields: 'Velg returfelter',
+ igx_query_builder_dialog_title: 'Bekreftelse',
+ igx_query_builder_dialog_message: 'Ved å endre enheten vil du miste de nåværende innstillingene dine. Er du sikker på at du vil fortsette?',
+ igx_query_builder_dialog_checkbox_text: 'Ikke vis denne dialogboksen igjen',
+ igx_query_builder_dialog_cancel: 'Avbryt',
+ igx_query_builder_dialog_confirm: 'Bekreft',
+ igx_query_builder_drop_ghost_text: 'Slipp her for å sette inn'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/NL/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/NL/query-builder-resources.ts
index 964aee7cba1..502e95e9396 100644
--- a/projects/igniteui-angular-i18n/src/i18n/NL/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/NL/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsNL = {
igx_query_builder_date_placeholder: 'Ophaaldatum',
igx_query_builder_time_placeholder: 'Ophaaltijd',
+ igx_query_builder_datetime_placeholder: 'Datum en tijd selecteren',
igx_query_builder_filter_operator_and: 'En',
igx_query_builder_filter_operator_or: 'Of',
igx_query_builder_filter_contains: 'Bevat',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsNL = {
igx_query_builder_filter_notEmpty: 'Niet leeg',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Niet null',
+ igx_query_builder_filter_in: 'In',
+ igx_query_builder_filter_notIn: 'Niet In',
igx_query_builder_filter_before: 'Voor',
igx_query_builder_filter_after: 'Na',
igx_query_builder_filter_at: 'Op',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsNL = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Alles',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Van',
+ igx_query_builder_select_label: 'Selecteer',
+ igx_query_builder_where_label: 'Waar',
igx_query_builder_and_group: 'En-groep',
igx_query_builder_or_group: 'Of-groep',
igx_query_builder_end_group: 'Groep beëindigen',
igx_query_builder_and_label: 'en',
igx_query_builder_or_label: 'of',
- igx_query_builder_add_condition: 'Voorwaarde',
- igx_query_builder_create_and_group: 'En-groep maken',
- igx_query_builder_create_or_group: 'Of-groep maken',
+ igx_query_builder_switch_group: 'Overschakelen naar {0}',
+ igx_query_builder_add_condition: 'Voorwaarde maken',
+ igx_query_builder_add_group: 'Groep maken',
+ igx_query_builder_add_condition_root: 'Voorwaarde',
+ igx_query_builder_add_group_root: 'Groep',
igx_query_builder_ungroup: 'Groep opheffen',
igx_query_builder_delete: 'Verwijderen',
igx_query_builder_delete_filters: 'Filters verwijderen',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsNL = {
igx_query_builder_column_placeholder: 'Selecteer kolom',
igx_query_builder_condition_placeholder: 'Selecteer filter',
igx_query_builder_value_placeholder: 'Waarde',
+ igx_query_builder_query_value_placeholder: 'Subquery-resultaten',
+ igx_query_builder_all_fields: 'Alle velden',
+ igx_query_builder_details: 'Details',
+ igx_query_builder_search: 'Zoeken',
+ igx_query_builder_select_all: 'Alles selecteren',
+ igx_query_builder_select_entity: 'Entiteit selecteren',
+ igx_query_builder_select_return_field_single: 'Selecteer retourveld',
+ igx_query_builder_select_return_fields: 'Retourvelden selecteren',
+ igx_query_builder_dialog_title: 'Bevestiging',
+ igx_query_builder_dialog_message: 'Door de entiteit te wijzigen, verliest u uw huidige instellingen. Weet u zeker dat u wilt doorgaan?',
+ igx_query_builder_dialog_checkbox_text: 'Deze dialoog niet meer weergeven',
+ igx_query_builder_dialog_cancel: 'Annuleren',
+ igx_query_builder_dialog_confirm: 'Bevestigen',
+ igx_query_builder_drop_ghost_text: 'Zet hier neer om in te voegen'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/PL/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/PL/query-builder-resources.ts
index 8fb19457f41..f516972b4a0 100644
--- a/projects/igniteui-angular-i18n/src/i18n/PL/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/PL/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsPL = {
igx_query_builder_date_placeholder: 'Data odbioru',
igx_query_builder_time_placeholder: 'Godzina odbioru',
+ igx_query_builder_datetime_placeholder: 'Wybierz datę i godzinę',
igx_query_builder_filter_operator_and: 'I',
igx_query_builder_filter_operator_or: 'Lub',
igx_query_builder_filter_contains: 'Zawiera',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsPL = {
igx_query_builder_filter_notEmpty: 'Niepuste',
igx_query_builder_filter_null: 'Zero',
igx_query_builder_filter_notNull: 'Niezerowe',
+ igx_query_builder_filter_in: 'W',
+ igx_query_builder_filter_notIn: 'Nie w',
igx_query_builder_filter_before: 'Przed',
igx_query_builder_filter_after: 'Po',
igx_query_builder_filter_at: 'W',
@@ -39,20 +42,38 @@ export const QueryBuilderResourceStringsPL = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Wszystko',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Od',
+ igx_query_builder_select_label: 'Wybierz',
+ igx_query_builder_where_label: 'Gdzie',
igx_query_builder_and_group: '"I" grupuj',
igx_query_builder_or_group: '"Lub" grupuj',
igx_query_builder_end_group: 'Koniec grupy',
igx_query_builder_and_label: 'i',
igx_query_builder_or_label: 'lub',
- igx_query_builder_add_condition: 'Warunek',
- igx_query_builder_create_and_group: 'Utwórz "I" grupuj',
- igx_query_builder_create_or_group: 'Utwórz "Lub" grupuj',
+ igx_query_builder_switch_group: 'Przełącz na {0}',
+ igx_query_builder_add_condition: 'Utwórz Warunek',
+ igx_query_builder_add_group: 'Utwórz grupuj',
+ igx_query_builder_add_condition_root: 'Warunek',
+ igx_query_builder_add_group_root: 'Grupuj',
igx_query_builder_ungroup: 'Rozgrupuj',
igx_query_builder_delete: 'Usuń',
igx_query_builder_delete_filters: 'Usuń filtry',
igx_query_builder_initial_text: 'Zacznij od utworzenia grupy warunków połączonych z "I" lub "Lub"',
- igx_query_builder_column_placeholder: 'Zaznacz kolumnę',
+ igx_query_builder_column_placeholder: 'Wybierz kolumnę',
igx_query_builder_condition_placeholder: 'Wybierz filtr',
igx_query_builder_value_placeholder: 'Wartość',
+ igx_query_builder_query_value_placeholder: 'Wyniki podzapytania',
+ igx_query_builder_all_fields: 'Wszystkie pola',
+ igx_query_builder_details: 'Szczegóły',
+ igx_query_builder_search: 'Szukaj',
+ igx_query_builder_select_all: 'Wybierz wszystko',
+ igx_query_builder_select_entity: 'Wybierz encję',
+ igx_query_builder_select_return_field_single: 'Wybierz pole zwrotne',
+ igx_query_builder_select_return_fields: 'Wybierz pola zwrotne',
+ igx_query_builder_dialog_title: 'Potwierdzenie',
+ igx_query_builder_dialog_message: 'Zmieniając encję, stracisz swoje aktualne ustawienia. Czy na pewno chcesz to zrobić?',
+ igx_query_builder_dialog_checkbox_text: 'Nie pokazuj tego okna dialogowego ponownie',
+ igx_query_builder_dialog_cancel: 'Anuluj',
+ igx_query_builder_dialog_confirm: 'Potwierdź',
+ igx_query_builder_drop_ghost_text: 'Upuść tutaj, aby wstawić'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/PT/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/PT/query-builder-resources.ts
index 3a2ab2d8f0d..f9abdc41157 100644
--- a/projects/igniteui-angular-i18n/src/i18n/PT/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/PT/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsPT = {
igx_query_builder_date_placeholder: 'Data de recolha',
igx_query_builder_time_placeholder: 'Hora do levantamento',
+ igx_query_builder_datetime_placeholder: 'Selecionar data e hora',
igx_query_builder_filter_operator_and: 'E',
igx_query_builder_filter_operator_or: 'Ou',
igx_query_builder_filter_contains: 'Contém',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsPT = {
igx_query_builder_filter_notEmpty: 'Não vazio',
igx_query_builder_filter_null: 'Nulo',
igx_query_builder_filter_notNull: 'Não nulo',
+ igx_query_builder_filter_in: 'Em',
+ igx_query_builder_filter_notIn: 'Não em',
igx_query_builder_filter_before: 'Antes',
igx_query_builder_filter_after: 'Após',
igx_query_builder_filter_at: 'Em',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsPT = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Todos',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'De',
+ igx_query_builder_select_label: 'Selecionar',
+ igx_query_builder_where_label: 'Onde',
igx_query_builder_and_group: '"E" grupo',
igx_query_builder_or_group: '"Ou" grupo',
igx_query_builder_end_group: 'Terminar grupo',
igx_query_builder_and_label: 'e',
igx_query_builder_or_label: 'ou',
- igx_query_builder_add_condition: 'Condição',
- igx_query_builder_create_and_group: 'Criar grupo "E"',
- igx_query_builder_create_or_group: 'Criar grupo "Ou"',
+ igx_query_builder_switch_group: 'Mudar para {0}',
+ igx_query_builder_add_condition: 'Add condição',
+ igx_query_builder_add_group: 'Criar grupo',
+ igx_query_builder_add_condition_root: 'Condição',
+ igx_query_builder_add_group_root: 'Grupo',
igx_query_builder_ungroup: 'Desagrupar',
igx_query_builder_delete: 'Eliminar',
igx_query_builder_delete_filters: 'Eliminar filtros',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsPT = {
igx_query_builder_column_placeholder: 'Selecionar coluna',
igx_query_builder_condition_placeholder: 'Selecionar filtro',
igx_query_builder_value_placeholder: 'Valor',
+ igx_query_builder_query_value_placeholder: 'Resultados da subconsulta',
+ igx_query_builder_all_fields: 'Todos os campos',
+ igx_query_builder_details: 'Detalhes',
+ igx_query_builder_search: 'Pesquisar',
+ igx_query_builder_select_all: 'Selecionar tudo',
+ igx_query_builder_select_entity: 'Selecionar entidade',
+ igx_query_builder_select_return_field_single: 'Selecione o campo de retorno',
+ igx_query_builder_select_return_fields: 'Selecionar campos de retorno',
+ igx_query_builder_dialog_title: 'Confirmação',
+ igx_query_builder_dialog_message: 'Ao alterar a entidade, você perderá suas configurações atuais. Tem a certeza que pretende continuar?',
+ igx_query_builder_dialog_checkbox_text: 'Não voltar a mostrar esta caixa de diálogo',
+ igx_query_builder_dialog_cancel: 'Cancelar',
+ igx_query_builder_dialog_confirm: 'Confirmar',
+ igx_query_builder_drop_ghost_text: 'Largar aqui para inserir'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/RO/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/RO/query-builder-resources.ts
index fee9a9a6abd..2cd80af352b 100644
--- a/projects/igniteui-angular-i18n/src/i18n/RO/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/RO/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsRO = {
igx_query_builder_date_placeholder: 'Data ridicării',
igx_query_builder_time_placeholder: 'Ora preluării',
+ igx_query_builder_datetime_placeholder: 'Selectează data și ora',
igx_query_builder_filter_operator_and: 'Și',
igx_query_builder_filter_operator_or: 'Sau',
igx_query_builder_filter_contains: 'Conține',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsRO = {
igx_query_builder_filter_notEmpty: 'Nu gol',
igx_query_builder_filter_null: 'Nul',
igx_query_builder_filter_notNull: 'Nu nul',
+ igx_query_builder_filter_in: 'În',
+ igx_query_builder_filter_notIn: 'Nu în',
igx_query_builder_filter_before: 'Înainte de',
igx_query_builder_filter_after: 'După',
igx_query_builder_filter_at: 'La',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsRO = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Toate',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Din',
+ igx_query_builder_select_label: 'Selectează',
+ igx_query_builder_where_label: 'Unde',
igx_query_builder_and_group: '"Și" Grup',
igx_query_builder_or_group: '"Sau" grup',
igx_query_builder_end_group: 'Sfârșitul grupului',
igx_query_builder_and_label: 'și',
igx_query_builder_or_label: 'sau',
- igx_query_builder_add_condition: 'Condiție',
- igx_query_builder_create_and_group: 'Creați grupul "Și"',
- igx_query_builder_create_or_group: 'Creați un grup "Sau"',
+ igx_query_builder_switch_group: 'Comută la {0}',
+ igx_query_builder_add_condition: 'Creați condiție',
+ igx_query_builder_add_group: 'Creați grupul',
+ igx_query_builder_add_condition_root: 'Condiție',
+ igx_query_builder_add_group_root: 'Grupul',
igx_query_builder_ungroup: 'Anulează grupare',
igx_query_builder_delete: 'Șterge',
igx_query_builder_delete_filters: 'Ștergeți filtrele',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsRO = {
igx_query_builder_column_placeholder: 'Selectați coloana',
igx_query_builder_condition_placeholder: 'Selectați filtrul',
igx_query_builder_value_placeholder: 'Valoare',
+ igx_query_builder_query_value_placeholder: 'Rezultatele subinterogării',
+ igx_query_builder_all_fields: 'Toate câmpurile',
+ igx_query_builder_details: 'Detalii',
+ igx_query_builder_search: 'Căutare',
+ igx_query_builder_select_all: 'Selectează tot',
+ igx_query_builder_select_entity: 'Selectează entitate',
+ igx_query_builder_select_return_field_single: 'Selectați câmpul de returnare',
+ igx_query_builder_select_return_fields: 'Selectează câmpuri de returnare',
+ igx_query_builder_dialog_title: 'Confirmare',
+ igx_query_builder_dialog_message: 'Prin modificarea entității, veți pierde setările curente. Ești sigur că vrei să faci asta?',
+ igx_query_builder_dialog_checkbox_text: 'Nu se mai afișează această casetă de dialog',
+ igx_query_builder_dialog_cancel: 'Anulare',
+ igx_query_builder_dialog_confirm: 'Confirmare',
+ igx_query_builder_drop_ghost_text: 'Aruncaţi aici pentru a introduce'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/SV/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/SV/query-builder-resources.ts
index 055f491c3a2..e9e32f57f25 100644
--- a/projects/igniteui-angular-i18n/src/i18n/SV/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/SV/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsSV = {
igx_query_builder_date_placeholder: 'Upphämtningsdatum',
igx_query_builder_time_placeholder: 'Upphämtningstid',
+ igx_query_builder_datetime_placeholder: 'Välj datum och tid',
igx_query_builder_filter_operator_and: 'Och',
igx_query_builder_filter_operator_or: 'Eller',
igx_query_builder_filter_contains: 'Innehåller',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsSV = {
igx_query_builder_filter_notEmpty: 'Inte tom',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Inte null',
+ igx_query_builder_filter_in: 'I',
+ igx_query_builder_filter_notIn: 'Inte i',
igx_query_builder_filter_before: 'Innan',
igx_query_builder_filter_after: 'Efter',
igx_query_builder_filter_at: 'Vid',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsSV = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: 'Allt',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Från',
+ igx_query_builder_select_label: 'Välj',
+ igx_query_builder_where_label: 'Där',
igx_query_builder_and_group: '"Och" -grupp',
igx_query_builder_or_group: '"Eller" -grupp',
igx_query_builder_end_group: 'Slutgrupp',
igx_query_builder_and_label: 'och',
igx_query_builder_or_label: 'eller',
- igx_query_builder_add_condition: 'Villkor',
- igx_query_builder_create_and_group: 'Skapa "Och" -grupp',
- igx_query_builder_create_or_group: 'Skapa "Eller" -grupp',
+ igx_query_builder_switch_group: 'Byt till {0}',
+ igx_query_builder_add_condition: 'Skapa villkor',
+ igx_query_builder_add_group: 'Skapa grupp',
+ igx_query_builder_add_condition_root: 'Villkor',
+ igx_query_builder_add_group_root: 'Group',
igx_query_builder_ungroup: 'Avgruppera',
igx_query_builder_delete: 'Radera',
igx_query_builder_delete_filters: 'Ta bort filter',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsSV = {
igx_query_builder_column_placeholder: 'Välj kolumn',
igx_query_builder_condition_placeholder: 'Välj filter',
igx_query_builder_value_placeholder: 'Värde',
+ igx_query_builder_query_value_placeholder: 'Underfrågeresultat',
+ igx_query_builder_all_fields: 'Alla fält',
+ igx_query_builder_details: 'Detaljer',
+ igx_query_builder_search: 'Sök',
+ igx_query_builder_select_all: 'Välj alla',
+ igx_query_builder_select_entity: 'Välj enhet',
+ igx_query_builder_select_return_field_single: 'Välj returfält',
+ igx_query_builder_select_return_fields: 'Välj returfält',
+ igx_query_builder_dialog_title: 'Bekräftelse',
+ igx_query_builder_dialog_message: 'Genom att ändra entitet förlorar du dina nuvarande inställningar. Vill du fortsätta?',
+ igx_query_builder_dialog_checkbox_text: 'Visa inte den här dialogrutan igen',
+ igx_query_builder_dialog_cancel: 'Avbryt',
+ igx_query_builder_dialog_confirm: 'Bekräfta',
+ igx_query_builder_drop_ghost_text: 'Släpp här för att infoga'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/TR/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/TR/query-builder-resources.ts
index b948b1e525f..055476f0707 100644
--- a/projects/igniteui-angular-i18n/src/i18n/TR/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/TR/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsTR = {
igx_query_builder_date_placeholder: 'Alma tarihi',
igx_query_builder_time_placeholder: 'Alma saati',
+ igx_query_builder_datetime_placeholder: 'Tarih ve saat seç',
igx_query_builder_filter_operator_and: 'Ve',
igx_query_builder_filter_operator_or: 'Veya',
igx_query_builder_filter_contains: 'İçerir',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsTR = {
igx_query_builder_filter_notEmpty: 'Boş değil',
igx_query_builder_filter_null: 'Geçersiz',
igx_query_builder_filter_notNull: 'Geçersiz değil',
+ igx_query_builder_filter_in: 'İçinde',
+ igx_query_builder_filter_notIn: 'İçinde değil',
igx_query_builder_filter_before: 'Önce',
igx_query_builder_filter_after: 'Sonra',
igx_query_builder_filter_at: 'Şu zaman',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsTR = {
igx_query_builder_filter_true: 'Doğru',
igx_query_builder_filter_false: 'Yanlış',
igx_query_builder_filter_all: 'Tümü',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: 'Başlangıç',
+ igx_query_builder_select_label: 'Seç',
+ igx_query_builder_where_label: 'Nerede',
igx_query_builder_and_group: '"Ve" Grubu',
igx_query_builder_or_group: '"Veya" Grubu',
igx_query_builder_end_group: 'Bitiş Grubu',
igx_query_builder_and_label: 've',
igx_query_builder_or_label: 'veya',
- igx_query_builder_add_condition: 'Koşul',
- igx_query_builder_create_and_group: '"Ve" Grubu Oluştur',
- igx_query_builder_create_or_group: '"Veya" Grubu Oluştur',
+ igx_query_builder_switch_group: 'Şura geç: {0}',
+ igx_query_builder_add_condition: 'Koşul oluştur',
+ igx_query_builder_add_group: 'Grubu oluştur',
+ igx_query_builder_add_condition_root: 'Koşul',
+ igx_query_builder_add_group_root: 'Grubu',
igx_query_builder_ungroup: 'Grubu çöz',
igx_query_builder_delete: 'Sil',
igx_query_builder_delete_filters: 'Filtreleri sil',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsTR = {
igx_query_builder_column_placeholder: 'Sütun seç',
igx_query_builder_condition_placeholder: 'Filtre seç',
igx_query_builder_value_placeholder: 'Değer',
+ igx_query_builder_query_value_placeholder: 'Alt sorgu sonuçları',
+ igx_query_builder_all_fields: 'Tüm alanlar',
+ igx_query_builder_details: 'Detaylar',
+ igx_query_builder_search: 'Arama',
+ igx_query_builder_select_all: 'Tümünü seç',
+ igx_query_builder_select_entity: 'Varlık seç',
+ igx_query_builder_select_return_field_single: 'Dönüş alanını seçin',
+ igx_query_builder_select_return_fields: 'Dönüş alanlarını seç',
+ igx_query_builder_dialog_title: 'Onay',
+ igx_query_builder_dialog_message: 'Varlığı değiştirdiğinizde mevcut ayarlarınızı kaybedersiniz. Devam etmek istiyor musunuz?',
+ igx_query_builder_dialog_checkbox_text: 'Bu iletişim kutusunu bir daha gösterme',
+ igx_query_builder_dialog_cancel: 'İptal',
+ igx_query_builder_dialog_confirm: 'Onayla',
+ igx_query_builder_drop_ghost_text: 'Eklemek için buraya bırakın'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/ZH-HANS/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/ZH-HANS/query-builder-resources.ts
index 56351ad6ee0..38a6fac41ea 100644
--- a/projects/igniteui-angular-i18n/src/i18n/ZH-HANS/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/ZH-HANS/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsZHHANS = {
igx_query_builder_date_placeholder: '选择日期',
igx_query_builder_time_placeholder: '取车时间',
+ igx_query_builder_datetime_placeholder: '选择日期和时间',
igx_query_builder_filter_operator_and: '和',
igx_query_builder_filter_operator_or: '或',
igx_query_builder_filter_contains: '包含',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsZHHANS = {
igx_query_builder_filter_notEmpty: '非空',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: '非 Null',
+ igx_query_builder_filter_in: '在',
+ igx_query_builder_filter_notIn: '不在',
igx_query_builder_filter_before: '之前',
igx_query_builder_filter_after: '之后',
igx_query_builder_filter_at: '在',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsZHHANS = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: '全部',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: '从',
+ igx_query_builder_select_label: '选择',
+ igx_query_builder_where_label: '在哪里',
igx_query_builder_and_group: '"And" 组',
igx_query_builder_or_group: '"Or" 组',
igx_query_builder_end_group: '结束组',
igx_query_builder_and_label: '和',
igx_query_builder_or_label: '或',
- igx_query_builder_add_condition: '条件',
- igx_query_builder_create_and_group: '创建 "And" 组',
- igx_query_builder_create_or_group: '创建 "Or" 组',
+ igx_query_builder_switch_group: '切换至 {0}',
+ igx_query_builder_add_condition: '创建 条件',
+ igx_query_builder_add_group: '创建 组',
+ igx_query_builder_add_condition_root: '条件',
+ igx_query_builder_add_group_root: '组',
igx_query_builder_ungroup: '取消分组',
igx_query_builder_delete: '删除',
igx_query_builder_delete_filters: '删除筛选器',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsZHHANS = {
igx_query_builder_column_placeholder: '选择列',
igx_query_builder_condition_placeholder: '选择筛选器',
igx_query_builder_value_placeholder: '数值',
+ igx_query_builder_query_value_placeholder: '子查询结果',
+ igx_query_builder_all_fields: '所有字段',
+ igx_query_builder_details: '详细信息',
+ igx_query_builder_search: '搜索',
+ igx_query_builder_select_all: '全选',
+ igx_query_builder_select_entity: '选择实体',
+ igx_query_builder_select_return_field_single: '选择返回字段',
+ igx_query_builder_select_return_fields: '选择返回字段',
+ igx_query_builder_dialog_title: '确认',
+ igx_query_builder_dialog_message: '通过更改实体,您将丢失当前设置。确定要继续?',
+ igx_query_builder_dialog_checkbox_text: '不再显示此对话框',
+ igx_query_builder_dialog_cancel: '取消',
+ igx_query_builder_dialog_confirm: '确认',
+ igx_query_builder_drop_ghost_text: '拖放此处以插入'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular-i18n/src/i18n/ZH-HANT/query-builder-resources.ts b/projects/igniteui-angular-i18n/src/i18n/ZH-HANT/query-builder-resources.ts
index 9cc1924bfff..0c5c5d0d080 100644
--- a/projects/igniteui-angular-i18n/src/i18n/ZH-HANT/query-builder-resources.ts
+++ b/projects/igniteui-angular-i18n/src/i18n/ZH-HANT/query-builder-resources.ts
@@ -6,6 +6,7 @@ import { IQueryBuilderResourceStrings } from 'igniteui-angular';
export const QueryBuilderResourceStringsZHHANT = {
igx_query_builder_date_placeholder: '領取日期',
igx_query_builder_time_placeholder: '取車時間',
+ igx_query_builder_datetime_placeholder: '選取日期和時間',
igx_query_builder_filter_operator_and: '和',
igx_query_builder_filter_operator_or: '或',
igx_query_builder_filter_contains: '包含',
@@ -18,6 +19,8 @@ export const QueryBuilderResourceStringsZHHANT = {
igx_query_builder_filter_notEmpty: '不是空的',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: '非 Null',
+ igx_query_builder_filter_in: '在',
+ igx_query_builder_filter_notIn: '不在',
igx_query_builder_filter_before: '之前',
igx_query_builder_filter_after: '之後',
igx_query_builder_filter_at: '在',
@@ -39,15 +42,19 @@ export const QueryBuilderResourceStringsZHHANT = {
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
igx_query_builder_filter_all: '全部',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_from_label: '從',
+ igx_query_builder_select_label: '選擇',
+ igx_query_builder_where_label: '在哪裡',
igx_query_builder_and_group: '“And” 群組',
igx_query_builder_or_group: '“Or” 群組',
igx_query_builder_end_group: '結束群組',
igx_query_builder_and_label: '和',
igx_query_builder_or_label: '或',
- igx_query_builder_add_condition: '條件',
- igx_query_builder_create_and_group: '建立 "And" 群組',
- igx_query_builder_create_or_group: '建立 "Or" 群組',
+ igx_query_builder_switch_group: '切換到 {0}',
+ igx_query_builder_add_condition: '建立 條件',
+ igx_query_builder_add_group: '建立 群組',
+ igx_query_builder_add_condition_root: '條件',
+ igx_query_builder_add_group_root: '群組',
igx_query_builder_ungroup: '取消分組',
igx_query_builder_delete: '刪除',
igx_query_builder_delete_filters: '刪除篩選條件',
@@ -55,4 +62,18 @@ export const QueryBuilderResourceStringsZHHANT = {
igx_query_builder_column_placeholder: '選擇列',
igx_query_builder_condition_placeholder: '選擇篩選條件',
igx_query_builder_value_placeholder: '數值',
+ igx_query_builder_query_value_placeholder: '子查詢結果',
+ igx_query_builder_all_fields: '所有領域',
+ igx_query_builder_details: '詳細資訊',
+ igx_query_builder_search: '搜尋',
+ igx_query_builder_select_all: '全選',
+ igx_query_builder_select_entity: '選取實體',
+ igx_query_builder_select_return_field_single: '選擇返回欄位',
+ igx_query_builder_select_return_fields: '選取返回欄位',
+ igx_query_builder_dialog_title: '確認',
+ igx_query_builder_dialog_message: '透過變更實體,您將遺失目前設定。確定要繼續?',
+ igx_query_builder_dialog_checkbox_text: '不要再顯示這個對話方塊',
+ igx_query_builder_dialog_cancel: '取消',
+ igx_query_builder_dialog_confirm: '確認',
+ igx_query_builder_drop_ghost_text: '拖放至此處插入'
} satisfies MakeRequired;
diff --git a/projects/igniteui-angular/migrations/update-19_1_0/changes/inputs.json b/projects/igniteui-angular/migrations/update-19_1_0/changes/inputs.json
new file mode 100644
index 00000000000..04f936ea617
--- /dev/null
+++ b/projects/igniteui-angular/migrations/update-19_1_0/changes/inputs.json
@@ -0,0 +1,30 @@
+{
+ "$schema": "../../common/schema/binding.schema.json",
+ "changes": [
+ {
+ "name": "fields",
+ "replaceWith": "entities",
+ "valueTransform": "fields_to_entities",
+ "owner": {
+ "selector": "igx-query-builder",
+ "type": "component"
+ }
+ },
+ {
+ "name": "showLegend",
+ "remove": true,
+ "owner": {
+ "selector": "igx-query-builder-header",
+ "type": "component"
+ }
+ },
+ {
+ "name": "resourceStrings",
+ "remove": true,
+ "owner": {
+ "selector": "igx-query-builder-header",
+ "type": "component"
+ }
+ }
+ ]
+}
diff --git a/projects/igniteui-angular/migrations/update-19_1_0/index.spec.ts b/projects/igniteui-angular/migrations/update-19_1_0/index.spec.ts
index ff1c4c6cb06..2c205d02c54 100644
--- a/projects/igniteui-angular/migrations/update-19_1_0/index.spec.ts
+++ b/projects/igniteui-angular/migrations/update-19_1_0/index.spec.ts
@@ -58,4 +58,65 @@ describe(`Update to ${version}`, () => {
);`
);
});
+
+ it('should replace Query Builder deprecated property `fields` with `entities`', async () => {
+ appTree.create(`/testSrc/appPrefix/component/test.component.html`,
+ `
+
+ `
+ );
+
+ const tree = await schematicRunner.runSchematic(migrationName, { shouldInvokeLS: false }, appTree);
+
+ expect(tree.readContent('/testSrc/appPrefix/component/test.component.html')).toEqual(
+ `
+
+ `
+ );
+ });
+
+ it('should remove Query Builder Header deprecated `showLegend` and `resourceStrings` properties', async () => {
+ appTree.create(`/testSrc/appPrefix/component/test.component.html`,
+ `
+
+ `
+ );
+
+ const tree = await schematicRunner.runSchematic(migrationName, { shouldInvokeLS: false }, appTree);
+
+ expect(tree.readContent('/testSrc/appPrefix/component/test.component.html')).toEqual(
+ `
+
+ `
+ );
+ });
+
+ it('should remove igx_query_builder_title from resources ', async () => {
+ appTree.create(`/testSrc/appPrefix/component/test.component.ts`,
+ `
+ export class TestComponent {
+ public resourceStrings = {
+ igx_query_builder_add_condition: '+ Add Condition',
+ igx_query_builder_title: 'Query Builder Title',
+ igx_query_builder_add_group: '+ Add Group',
+ igx_query_builder_create_and_group: 'My create and group',
+ igx_query_builder_create_or_group: 'My create or group'
+ };
+ }
+ `
+ );
+
+ const tree = await schematicRunner.runSchematic(migrationName, { shouldInvokeLS: false }, appTree);
+
+ expect(tree.readContent('/testSrc/appPrefix/component/test.component.ts')).toEqual(
+ `
+ export class TestComponent {
+ public resourceStrings = {
+ igx_query_builder_add_condition: '+ Add Condition',
+ igx_query_builder_add_group: '+ Add Group'
+ };
+ }
+ `
+ );
+ });
});
diff --git a/projects/igniteui-angular/migrations/update-19_1_0/index.ts b/projects/igniteui-angular/migrations/update-19_1_0/index.ts
index a68173f3b55..0449798742c 100644
--- a/projects/igniteui-angular/migrations/update-19_1_0/index.ts
+++ b/projects/igniteui-angular/migrations/update-19_1_0/index.ts
@@ -3,12 +3,32 @@ import type {
SchematicContext,
Tree
} from '@angular-devkit/schematics';
-import { UpdateChanges } from '../common/UpdateChanges';
+import { BoundPropertyObject, InputPropertyType, UpdateChanges } from '../common/UpdateChanges';
const version = '19.1.0';
export default (): Rule => async (host: Tree, context: SchematicContext) => {
context.logger.info(`Applying migration for Ignite UI for Angular to version ${version}`);
const update = new UpdateChanges(__dirname, host, context);
+
+ update.addValueTransform('fields_to_entities', (args: BoundPropertyObject): void => {
+ args.bindingType = InputPropertyType.EVAL;
+ args.value = `[{ name: '', fields: ${args.value}}]`;
+ });
+
+ // remove igx_query_builder_title, igx_query_builder_create_and_group, igx_query_builder_create_or_group from resources
+ const removedRS = ['igx_query_builder_title', 'igx_query_builder_create_and_group', 'igx_query_builder_create_or_group'];
+ for (const entryPath of update.tsFiles) {
+ let content = host.read(entryPath).toString();
+ for (const rs of removedRS) {
+ const regex = new RegExp(String.raw`,?\s*${rs}\s*:\s*'[^']*'`, 'g');
+
+ if (regex.test(content)) {
+ content = content.replace(regex, '');
+ host.overwrite(entryPath, content);
+ }
+ }
+ }
+
update.applyChanges();
};
diff --git a/projects/igniteui-angular/package.json b/projects/igniteui-angular/package.json
index 4c334e37943..fc8fd3df4f0 100644
--- a/projects/igniteui-angular/package.json
+++ b/projects/igniteui-angular/package.json
@@ -73,7 +73,7 @@
"tslib": "^2.3.0",
"igniteui-trial-watermark": "^3.0.2",
"lodash-es": "^4.17.21",
- "igniteui-theming": "^14.3.1",
+ "igniteui-theming": "^15.0.0",
"@igniteui/material-icons-extended": "^3.1.0"
},
"peerDependencies": {
diff --git a/projects/igniteui-angular/src/lib/accordion/accordion.component.spec.ts b/projects/igniteui-angular/src/lib/accordion/accordion.component.spec.ts
index 9589affe459..0e3a5a85b6b 100644
--- a/projects/igniteui-angular/src/lib/accordion/accordion.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/accordion/accordion.component.spec.ts
@@ -1,5 +1,4 @@
import { useAnimation } from '@angular/animations';
-import { NgIf } from '@angular/common';
import { Component, ViewChild } from '@angular/core';
import { waitForAsync, TestBed, fakeAsync, ComponentFixture, tick } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
@@ -401,10 +400,12 @@ describe('Rendering Tests', () => {
-
+ @if (divChild) {
+
+ }
`,
- imports: [IgxAccordionComponent, IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelBodyComponent, IgxExpansionPanelTitleDirective, NgIf]
+ imports: [IgxAccordionComponent, IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelBodyComponent, IgxExpansionPanelTitleDirective]
})
export class IgxAccordionSampleTestComponent {
@ViewChild(IgxAccordionComponent) public accordion: IgxAccordionComponent;
diff --git a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.html b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.html
index 6369fb0bcb1..65566b3f7aa 100644
--- a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.html
+++ b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.html
@@ -1,6 +1,6 @@
- 0">
+ @if (menuItems.length > 0) {
-
+ }
-
+ @for (item of menuItems; track trackMenuItem(item)) {
+
+ }
diff --git a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts
index d4a2a56f4eb..56bfdf2c6f4 100644
--- a/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/action-strip.component.ts
@@ -24,10 +24,11 @@ import { IgxIconComponent } from '../icon/icon.component';
import { IgxDropDownItemNavigationDirective } from '../drop-down/drop-down-navigation.directive';
import { IgxToggleActionDirective } from '../directives/toggle/toggle.directive';
import { IgxRippleDirective } from '../directives/ripple/ripple.directive';
-import { NgIf, NgFor, NgTemplateOutlet } from '@angular/common';
+import { NgTemplateOutlet } from '@angular/common';
import { getCurrentResourceStrings } from '../core/i18n/resources';
import { IgxIconButtonDirective } from '../directives/button/icon-button.directive';
import { IgxActionStripToken } from './token';
+import { trackByIdentity } from '../core/utils';
@Directive({
selector: '[igxActionStripMenuItem]',
@@ -73,8 +74,6 @@ export class IgxActionStripMenuItemDirective {
selector: 'igx-action-strip',
templateUrl: 'action-strip.component.html',
imports: [
- NgIf,
- NgFor,
NgTemplateOutlet,
IgxIconButtonDirective,
IgxRippleDirective,
@@ -314,6 +313,9 @@ export class IgxActionStripComponent implements IgxActionStripToken, AfterConten
}
}
+ /** pin swapping w/ unpin resets the menuItems collection */
+ protected trackMenuItem = trackByIdentity;
+
/**
* Close the menu if opened
*
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.html b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.html
index 6cd2a12345e..6eafb5e80b0 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.html
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.html
@@ -1,16 +1,24 @@
-
+@if (!asMenuItem) {
-
+}
-
+ @if (asMenuItem) {
- {{iconName}}
- {{iconName}}
+ @if (iconSet) {
+ {{iconName}}
+ }
+ @if (!iconSet) {
+ {{iconName}}
+ }
-
+ }
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.ts b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.ts
index 545b9065410..64771bd15f4 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-action-button.component.ts
@@ -1,7 +1,6 @@
import { Component, Input, TemplateRef, ViewChild, Output, EventEmitter, ElementRef, booleanAttribute } from '@angular/core';
import { IgxIconComponent } from '../../icon/icon.component';
import { IgxRippleDirective } from '../../directives/ripple/ripple.directive';
-import { NgIf } from '@angular/common';
import { IgxIconButtonDirective } from '../../directives/button/icon-button.directive';
/* blazorElement */
@@ -10,7 +9,7 @@ import { IgxIconButtonDirective } from '../../directives/button/icon-button.dire
@Component({
selector: 'igx-grid-action-button',
templateUrl: 'grid-action-button.component.html',
- imports: [NgIf, IgxRippleDirective, IgxIconComponent, IgxIconButtonDirective]
+ imports: [IgxRippleDirective, IgxIconComponent, IgxIconButtonDirective]
})
export class IgxGridActionButtonComponent {
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.html b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.html
index 0448b22086f..b68cf39486d 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.html
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.html
@@ -1,8 +1,16 @@
-
-
-
-
-
-
+@if (isRowContext) {
+ @if (!disabled && editRow) {
+
+ }
+ @if (addRow && isRootRow) {
+
+ }
+ @if (addChild && hasChildren) {
+
+ }
+ @if (!disabled && deleteRow) {
+
+ }
+}
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.spec.ts b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.spec.ts
index d763d414e6e..1abfd40b3b6 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.spec.ts
@@ -1,7 +1,6 @@
import { Component, ViewChild, OnInit } from '@angular/core';
import { TestBed, waitForAsync } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
-import { NgFor } from '@angular/common';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { configureTestSuite } from '../../test-utils/configure-suite';
@@ -391,16 +390,18 @@ describe('igxGridEditingActions #grid ', () => {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
`,
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent]
})
class IgxActionStripTestingComponent implements OnInit {
@ViewChild('actionStrip', { read: IgxActionStripComponent, static: true })
@@ -468,9 +469,11 @@ class IgxActionStripTestingComponent implements OnInit {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
@@ -479,7 +482,7 @@ class IgxActionStripTestingComponent implements OnInit {
`,
selector: 'igx-action-strip-pin-edit-component',
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent, IgxGridEditingActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent, IgxGridEditingActionsComponent]
})
class IgxActionStripPinEditComponent extends IgxActionStripTestingComponent {
}
@@ -488,9 +491,11 @@ class IgxActionStripPinEditComponent extends IgxActionStripTestingComponent {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
@@ -498,7 +503,7 @@ class IgxActionStripPinEditComponent extends IgxActionStripTestingComponent {
`,
selector: 'igx-action-strip-edit-menu-component',
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent]
})
class IgxActionStripEditMenuComponent extends IgxActionStripTestingComponent {
}
@@ -507,9 +512,11 @@ class IgxActionStripEditMenuComponent extends IgxActionStripTestingComponent {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
@@ -518,7 +525,7 @@ class IgxActionStripEditMenuComponent extends IgxActionStripTestingComponent {
`,
selector: 'igx-action-strip-one-row-component',
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent, IgxGridPinningActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent, IgxGridPinningActionsComponent]
})
class IgxActionStripOneRowComponent extends IgxActionStripTestingComponent {
}
@@ -527,9 +534,11 @@ class IgxActionStripOneRowComponent extends IgxActionStripTestingComponent {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
@@ -537,7 +546,7 @@ class IgxActionStripOneRowComponent extends IgxActionStripTestingComponent {
`,
selector: 'igx-action-strip-menu-one-row-component',
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridEditingActionsComponent]
})
class IgxActionStripMenuOneRowComponent extends IgxActionStripTestingComponent {
}
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.ts b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.ts
index 61f5fa39544..e48ec8745f2 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-editing-actions.component.ts
@@ -3,7 +3,6 @@ import { IgxGridActionsBaseDirective } from './grid-actions-base.directive';
import { showMessage } from '../../core/utils';
import { addRow, addChild } from '@igniteui/material-icons-extended';
import { IgxGridActionButtonComponent } from './grid-action-button.component';
-import { NgIf } from '@angular/common';
/* blazorElement */
@@ -19,7 +18,7 @@ import { NgIf } from '@angular/common';
selector: 'igx-grid-editing-actions',
templateUrl: 'grid-editing-actions.component.html',
providers: [{ provide: IgxGridActionsBaseDirective, useExisting: IgxGridEditingActionsComponent }],
- imports: [NgIf, IgxGridActionButtonComponent]
+ imports: [IgxGridActionButtonComponent]
})
export class IgxGridEditingActionsComponent extends IgxGridActionsBaseDirective {
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.html b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.html
index 139553d1444..bdfde5466cb 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.html
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.html
@@ -1,6 +1,14 @@
-
-
-
-
-
-
+@if (isRowContext) {
+ @if (inPinnedArea && pinnedTop) {
+
+ }
+ @if (inPinnedArea && !pinnedTop) {
+
+ }
+ @if (!pinned) {
+
+ }
+ @if (pinned) {
+
+ }
+}
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.spec.ts b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.spec.ts
index f33e55996e9..2d9efab5b96 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.spec.ts
@@ -7,7 +7,6 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { By } from '@angular/platform-browser';
import { wait } from '../../test-utils/ui-interactions.spec';
import { IgxGridPinningActionsComponent } from './grid-pinning-actions.component';
-import { NgFor } from '@angular/common';
import { IgxColumnComponent } from '../../grids/public_api';
@@ -103,16 +102,18 @@ describe('igxGridPinningActions #grid ', () => {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
`,
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent]
})
class IgxActionStripTestingComponent implements OnInit {
@ViewChild('actionStrip', { read: IgxActionStripComponent, static: true })
@@ -175,16 +176,18 @@ class IgxActionStripTestingComponent implements OnInit {
template: `
-
-
+ @for (c of columns; track c) {
+
+
+ }
`,
- imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent, NgFor]
+ imports: [IgxGridComponent, IgxColumnComponent, IgxActionStripComponent, IgxGridPinningActionsComponent]
})
class IgxActionStripPinMenuComponent extends IgxActionStripTestingComponent {
}
diff --git a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.ts b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.ts
index 6bee97ae647..86c19ba569d 100644
--- a/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.ts
+++ b/projects/igniteui-angular/src/lib/action-strip/grid-actions/grid-pinning-actions.component.ts
@@ -2,7 +2,6 @@ import { Component, HostBinding } from '@angular/core';
import { IgxGridActionsBaseDirective } from './grid-actions-base.directive';
import { pinLeft, unpinLeft, jumpDown, jumpUp } from '@igniteui/material-icons-extended';
import { IgxGridActionButtonComponent } from './grid-action-button.component';
-import { NgIf } from '@angular/common';
/* blazorElement */
/* wcElementTag: igc-grid-pinning-actions */
@@ -17,7 +16,7 @@ import { NgIf } from '@angular/common';
selector: 'igx-grid-pinning-actions',
templateUrl: 'grid-pinning-actions.component.html',
providers: [{ provide: IgxGridActionsBaseDirective, useExisting: IgxGridPinningActionsComponent }],
- imports: [NgIf, IgxGridActionButtonComponent]
+ imports: [IgxGridActionButtonComponent]
})
export class IgxGridPinningActionsComponent extends IgxGridActionsBaseDirective {
diff --git a/projects/igniteui-angular/src/lib/badge/badge.component.html b/projects/igniteui-angular/src/lib/badge/badge.component.html
index 57461614232..14451e6100d 100644
--- a/projects/igniteui-angular/src/lib/badge/badge.component.html
+++ b/projects/igniteui-angular/src/lib/badge/badge.component.html
@@ -1,4 +1,10 @@
-{{value}}
-{{icon}}
-{{icon}}
+@if (value || value === 0 && !icon) {
+ {{value}}
+}
+@if (icon && !iconSet) {
+ {{icon}}
+}
+@if (icon && iconSet) {
+ {{icon}}
+}
diff --git a/projects/igniteui-angular/src/lib/badge/badge.component.ts b/projects/igniteui-angular/src/lib/badge/badge.component.ts
index 5275adb98f9..a891c1fcc85 100644
--- a/projects/igniteui-angular/src/lib/badge/badge.component.ts
+++ b/projects/igniteui-angular/src/lib/badge/badge.component.ts
@@ -1,4 +1,3 @@
-import { NgIf } from '@angular/common';
import { booleanAttribute, Component, HostBinding, Input } from '@angular/core';
import { mkenum } from '../core/utils';
import { IgxIconComponent } from '../icon/icon.component';
@@ -41,7 +40,7 @@ export type IgxBadgeType = (typeof IgxBadgeType)[keyof typeof IgxBadgeType];
@Component({
selector: 'igx-badge',
templateUrl: 'badge.component.html',
- imports: [NgIf, IgxIconComponent]
+ imports: [IgxIconComponent]
})
export class IgxBadgeComponent {
diff --git a/projects/igniteui-angular/src/lib/banner/banner.component.html b/projects/igniteui-angular/src/lib/banner/banner.component.html
index c49ac46f2da..d8cf0bb0adf 100644
--- a/projects/igniteui-angular/src/lib/banner/banner.component.html
+++ b/projects/igniteui-angular/src/lib/banner/banner.component.html
@@ -3,22 +3,23 @@
-
-
-
+ @if (bannerIcon) {
+
+
+
+ }
-
+ @if (useDefaultTemplate) {
-
-
+ } @else {
-
+ }
diff --git a/projects/igniteui-angular/src/lib/banner/banner.component.ts b/projects/igniteui-angular/src/lib/banner/banner.component.ts
index 08fc743b568..b6055d350a1 100644
--- a/projects/igniteui-angular/src/lib/banner/banner.component.ts
+++ b/projects/igniteui-angular/src/lib/banner/banner.component.ts
@@ -14,7 +14,6 @@ import { IToggleView } from '../core/navigation';
import { IgxButtonDirective } from '../directives/button/button.directive';
import { IgxRippleDirective } from '../directives/ripple/ripple.directive';
import { IgxBannerActionsDirective } from './banner.directives';
-import { NgIf } from '@angular/common';
import { CancelableEventArgs, IBaseEventArgs } from '../core/utils';
import { ToggleAnimationSettings } from '../expansion-panel/toggle-animation-component';
import { IgxExpansionPanelBodyComponent } from '../expansion-panel/expansion-panel-body.component';
@@ -49,7 +48,7 @@ export interface BannerCancelEventArgs extends BannerEventArgs, CancelableEventA
@Component({
selector: 'igx-banner',
templateUrl: 'banner.component.html',
- imports: [IgxExpansionPanelComponent, IgxExpansionPanelBodyComponent, NgIf, IgxButtonDirective, IgxRippleDirective]
+ imports: [IgxExpansionPanelComponent, IgxExpansionPanelBodyComponent, IgxButtonDirective, IgxRippleDirective]
})
export class IgxBannerComponent implements IToggleView {
/**
diff --git a/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts b/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts
index 5b2af8ee886..8b768bcb5b8 100644
--- a/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts
+++ b/projects/igniteui-angular/src/lib/buttonGroup/buttonGroup.component.ts
@@ -1,4 +1,3 @@
-import { NgFor, NgIf } from '@angular/common';
import {
AfterViewInit,
Component,
@@ -58,7 +57,7 @@ let NEXT_ID = 0;
@Component({
selector: 'igx-buttongroup',
templateUrl: 'buttongroup-content.component.html',
- imports: [NgFor, IgxButtonDirective, IgxRippleDirective, NgIf, IgxIconComponent]
+ imports: [IgxButtonDirective, IgxRippleDirective, IgxIconComponent]
})
export class IgxButtonGroupComponent implements AfterViewInit, OnDestroy {
/**
diff --git a/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html
index e86c985d859..58f674c856a 100644
--- a/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html
+++ b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup-content.component.html
@@ -1,17 +1,23 @@
-
+ @for (button of values; track button) {
+
+ }
diff --git a/projects/igniteui-angular/src/lib/buttonGroup/buttongroup.component.spec.ts b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup.component.spec.ts
index 2e1b9157c24..e73de82221c 100644
--- a/projects/igniteui-angular/src/lib/buttonGroup/buttongroup.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/buttonGroup/buttongroup.component.spec.ts
@@ -5,7 +5,6 @@ import { configureTestSuite } from '../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { UIInteractions, wait } from '../test-utils/ui-interactions.spec';
import { IgxButtonDirective } from '../directives/button/button.directive';
-import { NgFor } from '@angular/common';
import { IgxRadioGroupDirective } from '../directives/radio/radio-group.directive';
import { IgxRadioComponent } from '../radio/radio.component';
@@ -585,10 +584,12 @@ class ButtonGroupWithSelectedButtonComponent {
@Component({
template: `
-
+ @for (item of items; track item) {
+
+ }
`,
- imports: [IgxButtonGroupComponent, IgxButtonDirective, NgFor]
+ imports: [IgxButtonGroupComponent, IgxButtonDirective]
})
class ButtonGroupButtonWithBoundSelectedOutputComponent {
@ViewChild(IgxButtonGroupComponent, { static: true }) public buttonGroup: IgxButtonGroupComponent;
@@ -605,9 +606,11 @@ class ButtonGroupButtonWithBoundSelectedOutputComponent {
@Component({
template: `
-
- {{ item }}
-
+ @for (item of ['Foo', 'Bar']; track item) {
+
+ {{ item }}
+
+ }
@@ -623,7 +626,7 @@ class ButtonGroupButtonWithBoundSelectedOutputComponent {
`,
- imports: [IgxButtonGroupComponent, IgxButtonDirective, NgFor, IgxRadioGroupDirective, IgxRadioComponent]
+ imports: [IgxButtonGroupComponent, IgxButtonDirective, IgxRadioGroupDirective, IgxRadioComponent]
})
class ButtonGroupSelectionBoundToAnotherComponent {
@ViewChild('radioGroup', { read: IgxRadioGroupDirective, static: true }) public radioGroup: IgxRadioGroupDirective;
diff --git a/projects/igniteui-angular/src/lib/calendar/calendar.component.html b/projects/igniteui-angular/src/lib/calendar/calendar.component.html
index ff3575059ab..96410be5472 100644
--- a/projects/igniteui-angular/src/lib/calendar/calendar.component.html
+++ b/projects/igniteui-angular/src/lib/calendar/calendar.component.html
@@ -1,22 +1,22 @@
-
+ @if (selection === 'single') {
{{ resourceStrings.igx_calendar_select_date }}
-
-
+ }
+ @if (selection === 'range') {
{{ resourceStrings.igx_calendar_range_placeholder }}
-
+ }
-
+ @if (selection === 'single') {
{{ getFormattedDate().weekday }},
{{ getFormattedDate().monthday }}
-
-
+ }
+ @if (selection === 'range') {
{{ selectedDates.length === 0 ? 'Start' : getFormattedRange().start}}
-
{{ selectedDates.length <= 1 ? 'End' : getFormattedRange().end}}
-
+ }
@@ -35,7 +35,9 @@
- {{ formattedYear(obj.date) }}
+ @if (activeView === 'year') {
+ {{ formattedYear(obj.date) }}
+ }
-
+ @if (monthsViewNumber < 2 || obj.index < 1) {
+
{{ monthsViewNumber > 1 ?
- (resourceStrings.igx_calendar_first_picker_of.replace('{0}', monthsViewNumber.toString()) + ' ' +
+ (resourceStrings.igx_calendar_first_picker_of.replace('{0}', monthsViewNumber.toString()) + ' ' +
(obj.date | date: 'LLLL yyyy')) :
- resourceStrings.igx_calendar_selected_month_is + (obj.date | date: 'LLLL yyyy')}}
-
+ resourceStrings.igx_calendar_selected_month_is + (obj.date | date: 'LLLL yyyy')}}
+
+ }
@@ -116,16 +120,15 @@
+ *ngTemplateOutlet="subheaderTemplate ? subheaderTemplate : defaultMonthYear; context: getContext(i)">
-
-
-
-
+ @if (this.orientation === 'horizontal' ? i === monthsViewNumber - 1 : i === 0) {
+
+
+
+
+ }
@@ -149,7 +152,7 @@
+ *ngTemplateOutlet="subheaderTemplate ? subheaderTemplate : defaultDecade;">
@@ -160,18 +163,20 @@
-
+@if (selection === 'single' && hasHeader || selection === 'range' && hasHeader) {
+
+}
diff --git a/projects/igniteui-angular/src/lib/calendar/calendar.component.ts b/projects/igniteui-angular/src/lib/calendar/calendar.component.ts
index b7f21eaa3dc..528bc28db3a 100644
--- a/projects/igniteui-angular/src/lib/calendar/calendar.component.ts
+++ b/projects/igniteui-angular/src/lib/calendar/calendar.component.ts
@@ -13,7 +13,7 @@ import {
booleanAttribute,
HostListener,
} from '@angular/core';
-import { NgIf, NgTemplateOutlet, NgFor, DatePipe } from '@angular/common';
+import { NgTemplateOutlet, DatePipe } from '@angular/common';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import {
@@ -71,7 +71,7 @@ let NEXT_ID = 0;
],
selector: 'igx-calendar',
templateUrl: 'calendar.component.html',
- imports: [NgIf, NgTemplateOutlet, IgxCalendarScrollPageDirective, IgxIconComponent, NgFor, IgxDaysViewComponent, IgxMonthsViewComponent, IgxYearsViewComponent, DatePipe, IgxMonthViewSlotsCalendar, IgxGetViewDateCalendar]
+ imports: [NgTemplateOutlet, IgxCalendarScrollPageDirective, IgxIconComponent, IgxDaysViewComponent, IgxMonthsViewComponent, IgxYearsViewComponent, DatePipe, IgxMonthViewSlotsCalendar, IgxGetViewDateCalendar]
})
export class IgxCalendarComponent extends IgxCalendarBaseDirective implements AfterViewInit, OnDestroy {
/**
diff --git a/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.html b/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.html
index e613c31623d..96a403d93b3 100644
--- a/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.html
+++ b/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.html
@@ -3,86 +3,86 @@
class="igx-days-view__row"
[title]="weekNumberHeader.long | titlecase"
>
-
-
- {{ weekNumberHeader.short | titlecase }}
-
-
-
-
- {{ dayName.formatted | titlecase }}
+ @if (showWeekNumbers) {
+
+
+ {{ weekNumberHeader.short | titlecase }}
+
+
+ }
+ @for (dayName of weekHeaderLabels; track dayName.long) {
+
+
+ {{ dayName.formatted | titlecase }}
+
-
+ }
-
+@for (
+ week of monthWeeks; track rowTracker(i, week);
+ let isLast = $last; let i = $index
+) {
-
- {{ getWeekNumber(week[0]) }}
-
+ @if (showWeekNumbers) {
+
+
+ {{ getWeekNumber(week[0]) }}
+
+
+ }
+ @for (day of week; track dateTracker($index, day)) {
+
+ {{ formattedDate(day.native) }}
+
+ }
-
-
- {{ formattedDate(day.native) }}
-
-
+}
diff --git a/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.ts b/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.ts
index 35151a58f37..cba03ba1379 100644
--- a/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.ts
+++ b/projects/igniteui-angular/src/lib/calendar/days-view/days-view.component.ts
@@ -15,7 +15,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
-import { NgIf, NgFor, TitleCasePipe } from '@angular/common';
+import { TitleCasePipe } from '@angular/common';
import { CalendarSelection, ScrollDirection } from '../../calendar/calendar';
import { IgxDayItemComponent } from './day-item.component';
import { DateRangeType } from '../../core/dates';
@@ -45,7 +45,7 @@ let NEXT_ID = 0;
selector: 'igx-days-view',
templateUrl: 'days-view.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
- imports: [NgIf, NgFor, IgxDayItemComponent, TitleCasePipe]
+ imports: [IgxDayItemComponent, TitleCasePipe]
})
export class IgxDaysViewComponent extends IgxCalendarBaseDirective {
#standalone = true;
@@ -430,8 +430,8 @@ export class IgxDaysViewComponent extends IgxCalendarBaseDirective {
/**
* @hidden
*/
- public rowTracker(index: number, item: CalendarDay[]): string {
- return `${item[index].month}${item[index].date}`;
+ public rowTracker(_: number, item: CalendarDay[]): string {
+ return `${item[0].month}${item[0].date}`;
}
/**
diff --git a/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.html b/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.html
index 60928d5fa04..e13738c8de4 100644
--- a/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.html
+++ b/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.html
@@ -44,7 +44,9 @@
- {{ formattedYear(obj.date) }}
+ @if (activeView === 'year') {
+ {{ formattedYear(obj.date) }}
+ }
-
+ @if (isDefaultView) {
-
+ }
-
+ @if (isDecadeView) {
-
+ }
-
+ @if (isDefaultView) {
>
-
+ }
-
+ @if (isDecadeView) {
-
+ }
diff --git a/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.ts b/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.ts
index 6c3e4691c49..6bda0564ec4 100644
--- a/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.ts
+++ b/projects/igniteui-angular/src/lib/calendar/month-picker/month-picker.component.ts
@@ -9,7 +9,7 @@ import {
OnDestroy,
OnInit,
} from "@angular/core";
-import { NgIf, NgTemplateOutlet, DatePipe } from "@angular/common";
+import { NgTemplateOutlet, DatePipe } from "@angular/common";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { IgxMonthsViewComponent } from "../months-view/months-view.component";
@@ -38,7 +38,6 @@ let NEXT_ID = 0;
selector: "igx-month-picker",
templateUrl: "month-picker.component.html",
imports: [
- NgIf,
NgTemplateOutlet,
DatePipe,
IgxIconComponent,
diff --git a/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.html b/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.html
index aeca84c201d..8fcda69dff5 100644
--- a/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.html
+++ b/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.html
@@ -1,21 +1,22 @@
-
-
- {{ formattedMonth(month).formatted | titlecase }}
+ @for (month of range; track monthTracker($index, month)) {
+
+
+ {{ formattedMonth(month).formatted | titlecase }}
+
-
+ }
diff --git a/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.ts b/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.ts
index f41f532facf..956e7acc000 100644
--- a/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.ts
+++ b/projects/igniteui-angular/src/lib/calendar/months-view/months-view.component.ts
@@ -7,7 +7,7 @@ import {
Inject,
} from "@angular/core";
import { IgxCalendarMonthDirective } from "../calendar.directives";
-import { NgFor, TitleCasePipe } from "@angular/common";
+import { TitleCasePipe } from "@angular/common";
import {
IgxCalendarViewDirective,
DAY_INTERVAL_TOKEN,
@@ -33,7 +33,7 @@ let NEXT_ID = 0;
],
selector: "igx-months-view",
templateUrl: "months-view.component.html",
- imports: [NgFor, IgxCalendarMonthDirective, TitleCasePipe]
+ imports: [IgxCalendarMonthDirective, TitleCasePipe]
})
export class IgxMonthsViewComponent extends IgxCalendarViewDirective implements ControlValueAccessor {
#standalone = true;
diff --git a/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.html b/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.html
index 28082a19ab9..2f83bea48d9 100644
--- a/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.html
+++ b/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.html
@@ -1,22 +1,23 @@
-
-
- {{ formattedYear(year).formatted }}
+ @for (year of range; track yearTracker($index, year)) {
+
+
+ {{ formattedYear(year).formatted }}
+
-
+ }
diff --git a/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.ts b/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.ts
index ccdc538e67c..07fd46a8de5 100644
--- a/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.ts
+++ b/projects/igniteui-angular/src/lib/calendar/years-view/years-view.component.ts
@@ -6,7 +6,6 @@ import {
Inject,
} from "@angular/core";
import { IgxCalendarYearDirective } from "../calendar.directives";
-import { NgFor } from "@angular/common";
import {
IgxCalendarViewDirective,
DAY_INTERVAL_TOKEN,
@@ -30,7 +29,7 @@ import { calendarRange } from "../common/helpers";
],
selector: "igx-years-view",
templateUrl: "years-view.component.html",
- imports: [NgFor, IgxCalendarYearDirective]
+ imports: [IgxCalendarYearDirective]
})
export class IgxYearsViewComponent extends IgxCalendarViewDirective implements ControlValueAccessor {
#standalone = true;
diff --git a/projects/igniteui-angular/src/lib/carousel/carousel.component.html b/projects/igniteui-angular/src/lib/carousel/carousel.component.html
index b6e038359da..d79dc110577 100644
--- a/projects/igniteui-angular/src/lib/carousel/carousel.component.html
+++ b/projects/igniteui-angular/src/lib/carousel/carousel.component.html
@@ -16,43 +16,53 @@
-
+@if (navigation && slides.length) {
+
+}
-
+@if (navigation && slides.length) {
+
+}
-
-
-
+@if (showIndicators) {
+
+ @for (slide of slides; track slide) {
+
+
+
+ }
-
+}
-
- {{getCarouselLabel}}
-
+@if (showIndicatorsLabel) {
+
+ {{getCarouselLabel}}
+
+}
diff --git a/projects/igniteui-angular/src/lib/carousel/carousel.component.spec.ts b/projects/igniteui-angular/src/lib/carousel/carousel.component.spec.ts
index f0fa7cca10a..30b1a13437a 100644
--- a/projects/igniteui-angular/src/lib/carousel/carousel.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/carousel/carousel.component.spec.ts
@@ -10,7 +10,6 @@ import { configureTestSuite } from '../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { IgxSlideComponent } from './slide.component';
import { IgxCarouselIndicatorDirective, IgxCarouselNextButtonDirective, IgxCarouselPrevButtonDirective } from './carousel.directives';
-import { NgFor, NgIf } from '@angular/common';
import { CarouselIndicatorsOrientation, CarouselAnimationType } from './enums';
describe('Carousel', () => {
@@ -108,22 +107,22 @@ describe('Carousel', () => {
});
it('add/remove slides tests', () => {
- let currentSlide = carousel.get(carousel.current);
- carousel.remove(currentSlide);
+ const slide1 = carousel.get(carousel.current);
+ carousel.remove(slide1);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(3);
expect(carousel.total).toEqual(3);
- currentSlide = carousel.get(carousel.current);
- carousel.remove(currentSlide);
+ const slide2 = carousel.get(carousel.current);
+ carousel.remove(slide2);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(2);
expect(carousel.total).toEqual(2);
- carousel.add(currentSlide);
- carousel.add(currentSlide);
+ carousel.add(slide1);
+ carousel.add(slide2);
fixture.detectChanges();
expect(carousel.slides.length).toEqual(4);
@@ -187,11 +186,12 @@ describe('Carousel', () => {
expect(carousel.slideChanged.emit).toHaveBeenCalledTimes(3);
spyOn(carousel.slideAdded, 'emit');
- carousel.add(carousel.get(carousel.current));
+ const newSlide = new IgxSlideComponent(null, null);
+ carousel.add(newSlide);
fixture.detectChanges();
args = {
carousel,
- slide: carousel.get(carousel.current)
+ slide: newSlide
};
expect(carousel.slideAdded.emit).toHaveBeenCalledWith(args);
@@ -1213,8 +1213,12 @@ class CarouselTemplateSetInMarkupTestComponent {
- {{slide.index}}
- {{slide.index}}: Active
+ @if (!slide.active) {
+ {{slide.index}}
+ }
+ @if (slide.active) {
+ {{slide.index}}: Active
+ }
@@ -1232,7 +1236,7 @@ class CarouselTemplateSetInMarkupTestComponent {
Slide4
`,
- imports: [IgxCarouselComponent, IgxSlideComponent, NgIf]
+ imports: [IgxCarouselComponent, IgxSlideComponent]
})
class CarouselTemplateSetInTypescriptTestComponent {
@ViewChild('carousel', { static: true }) public carousel: IgxCarouselComponent;
@@ -1249,12 +1253,14 @@ class CarouselTemplateSetInTypescriptTestComponent {
@Component({
template: `
-
- {{slide.text}}
-
+ @for (slide of slides; track slide) {
+
+ {{slide.text}}
+
+ }
`,
- imports: [IgxCarouselComponent, IgxSlideComponent, NgFor]
+ imports: [IgxCarouselComponent, IgxSlideComponent]
})
class CarouselDynamicSlidesComponent {
@ViewChild('carousel', { static: true }) public carousel: IgxCarouselComponent;
diff --git a/projects/igniteui-angular/src/lib/carousel/carousel.component.ts b/projects/igniteui-angular/src/lib/carousel/carousel.component.ts
index 50f472a4a00..fe2adf1d118 100644
--- a/projects/igniteui-angular/src/lib/carousel/carousel.component.ts
+++ b/projects/igniteui-angular/src/lib/carousel/carousel.component.ts
@@ -1,4 +1,4 @@
-import { NgIf, NgClass, NgFor, NgTemplateOutlet, DOCUMENT } from '@angular/common';
+import { NgClass, NgTemplateOutlet, DOCUMENT } from '@angular/common';
import {
AfterContentInit,
ChangeDetectorRef,
@@ -85,7 +85,7 @@ export class CarouselHammerConfig extends HammerGestureConfig {
display: block;
outline-style: none;
}`],
- imports: [IgxButtonDirective, IgxIconComponent, NgIf, NgClass, NgFor, NgTemplateOutlet]
+ imports: [IgxButtonDirective, IgxIconComponent, NgClass, NgTemplateOutlet]
})
export class IgxCarouselComponent extends IgxCarouselComponentBase implements ICarouselComponentBase, OnDestroy, AfterContentInit {
diff --git a/projects/igniteui-angular/src/lib/checkbox/checkbox-base.directive.ts b/projects/igniteui-angular/src/lib/checkbox/checkbox-base.directive.ts
index df52a1ccc52..fb9cf5e07f6 100644
--- a/projects/igniteui-angular/src/lib/checkbox/checkbox-base.directive.ts
+++ b/projects/igniteui-angular/src/lib/checkbox/checkbox-base.directive.ts
@@ -261,14 +261,14 @@ export class CheckboxBaseDirective implements AfterViewInit {
this.theme = this.themeToken.theme;
- const { unsubscribe } = this.themeToken.onChange((theme) => {
+ const themeChange = this.themeToken.onChange((theme) => {
if (this.theme !== theme) {
this.theme = theme;
this.cdr.detectChanges();
}
});
- this.destroyRef.onDestroy(() => unsubscribe);
+ this.destroyRef.onDestroy(() => themeChange.unsubscribe());
}
/**
diff --git a/projects/igniteui-angular/src/lib/chips/chip.component.html b/projects/igniteui-angular/src/lib/chips/chip.component.html
index 1a2f23622dc..27958ceca06 100644
--- a/projects/igniteui-angular/src/lib/chips/chip.component.html
+++ b/projects/igniteui-angular/src/lib/chips/chip.component.html
@@ -16,9 +16,11 @@
(dropped)="onChipDrop($event)">
-
-
-
+ @if (selected) {
+
+
+
+ }
@@ -30,16 +32,18 @@
-
-
-
+ @if (removable) {
+
+
+
+ }
diff --git a/projects/igniteui-angular/src/lib/chips/chip.component.ts b/projects/igniteui-angular/src/lib/chips/chip.component.ts
index 8cdcdae3cb3..06690bdc2b6 100644
--- a/projects/igniteui-angular/src/lib/chips/chip.component.ts
+++ b/projects/igniteui-angular/src/lib/chips/chip.component.ts
@@ -20,7 +20,7 @@ import { IBaseEventArgs, mkenum } from '../core/utils';
import { ChipResourceStringsEN, IChipResourceStrings } from '../core/i18n/chip-resources';
import { Subject } from 'rxjs';
import { IgxIconComponent } from '../icon/icon.component';
-import { NgClass, NgTemplateOutlet, NgIf, DOCUMENT } from '@angular/common';
+import { NgClass, NgTemplateOutlet, DOCUMENT } from '@angular/common';
import { getCurrentResourceStrings } from '../core/i18n/resources';
import { Size } from '../grids/common/enums';
@@ -83,7 +83,7 @@ let CHIP_ID = 0;
@Component({
selector: 'igx-chip',
templateUrl: 'chip.component.html',
- imports: [IgxDropDirective, IgxDragDirective, NgClass, NgTemplateOutlet, NgIf, IgxIconComponent]
+ imports: [IgxDropDirective, IgxDragDirective, NgClass, NgTemplateOutlet, IgxIconComponent]
})
export class IgxChipComponent implements OnInit, OnDestroy {
diff --git a/projects/igniteui-angular/src/lib/chips/chip.spec.ts b/projects/igniteui-angular/src/lib/chips/chip.spec.ts
index ce2820051f4..e518735693d 100644
--- a/projects/igniteui-angular/src/lib/chips/chip.spec.ts
+++ b/projects/igniteui-angular/src/lib/chips/chip.spec.ts
@@ -10,19 +10,20 @@ import { UIInteractions, wait } from '../test-utils/ui-interactions.spec';
import { configureTestSuite } from '../test-utils/configure-suite';
import { ControlsFunction } from '../test-utils/controls-functions.spec';
import { IgxIconComponent } from '../icon/icon.component';
-import { NgFor } from '@angular/common';
import { getComponentSize } from '../core/utils';
@Component({
template: `
-
- {{chip.text}}
- drag_indicator
-
+ @for (chip of chipList; track chip) {
+
+ {{chip.text}}
+ drag_indicator
+
+ }
Tab Chip
@@ -40,7 +41,7 @@ import { getComponentSize } from '../core/utils';
`,
- imports: [IgxChipComponent, IgxChipsAreaComponent, IgxIconComponent, IgxPrefixDirective, NgFor]
+ imports: [IgxChipComponent, IgxChipsAreaComponent, IgxIconComponent, IgxPrefixDirective]
})
class TestChipComponent {
@@ -68,13 +69,15 @@ class TestChipComponent {
@Component({
template: `
-
- label
- suf
-
+ @for (chip of chipList; track chip) {
+
+ label
+ suf
+
+ }
`,
- imports: [IgxChipsAreaComponent, IgxChipComponent, IgxLabelDirective, IgxSuffixDirective, NgFor]
+ imports: [IgxChipsAreaComponent, IgxChipComponent, IgxLabelDirective, IgxSuffixDirective]
})
class TestChipsLabelAndSuffixComponent {
diff --git a/projects/igniteui-angular/src/lib/chips/chips-area.spec.ts b/projects/igniteui-angular/src/lib/chips/chips-area.spec.ts
index a3ce7260c12..54e5916d107 100644
--- a/projects/igniteui-angular/src/lib/chips/chips-area.spec.ts
+++ b/projects/igniteui-angular/src/lib/chips/chips-area.spec.ts
@@ -7,19 +7,20 @@ import { configureTestSuite } from '../test-utils/configure-suite';
import { wait, UIInteractions } from '../test-utils/ui-interactions.spec';
import { IgxIconComponent } from '../icon/icon.component';
import { IgxPrefixDirective } from './public_api';
-import { NgFor } from '@angular/common';
@Component({
template: `
-
- drag_indicator
- {{chip.text}}
-
+ @for (chip of chipList; track chip) {
+
+ drag_indicator
+ {{chip.text}}
+
+ }
`,
- imports: [IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxPrefixDirective, NgFor]
+ imports: [IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxPrefixDirective]
})
class TestChipComponent {
@ViewChild('chipsArea', { read: IgxChipsAreaComponent, static: true })
@@ -58,14 +59,16 @@ class TestChipSelectComponent extends TestChipComponent {
@Component({
template: `
-
- drag_indicator
- {{chip.text}}
-
+ @for (chip of chipList; track chip) {
+
+ drag_indicator
+ {{chip.text}}
+
+ }
`,
- imports: [IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxPrefixDirective, NgFor]
+ imports: [IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxPrefixDirective]
})
class TestChipReorderComponent {
@ViewChild('chipsArea', { read: IgxChipsAreaComponent, static: true })
diff --git a/projects/igniteui-angular/src/lib/combo/combo-dropdown.component.ts b/projects/igniteui-angular/src/lib/combo/combo-dropdown.component.ts
index bb2452ce6da..733995846f3 100644
--- a/projects/igniteui-angular/src/lib/combo/combo-dropdown.component.ts
+++ b/projects/igniteui-angular/src/lib/combo/combo-dropdown.component.ts
@@ -10,7 +10,7 @@ import { IgxComboAPIService } from './combo.api';
import { IgxDropDownItemBaseDirective } from '../drop-down/drop-down-item.base';
import { IgxSelectionAPIService } from '../core/selection';
import { IgxComboItemComponent } from './combo-item.component';
-import { DOCUMENT, NgIf } from '@angular/common';
+import { DOCUMENT } from '@angular/common';
import { IgxToggleDirective } from '../directives/toggle/toggle.directive';
/** @hidden */
@@ -18,7 +18,7 @@ import { IgxToggleDirective } from '../directives/toggle/toggle.directive';
selector: 'igx-combo-drop-down',
templateUrl: '../drop-down/drop-down.component.html',
providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxComboDropDownComponent }],
- imports: [IgxToggleDirective, NgIf]
+ imports: [IgxToggleDirective]
})
export class IgxComboDropDownComponent extends IgxDropDownComponent implements IDropDownBase, OnDestroy, AfterViewInit {
/** @hidden @internal */
diff --git a/projects/igniteui-angular/src/lib/combo/combo-item.component.html b/projects/igniteui-angular/src/lib/combo/combo-item.component.html
index 3849092698e..b467360ae0d 100644
--- a/projects/igniteui-angular/src/lib/combo/combo-item.component.html
+++ b/projects/igniteui-angular/src/lib/combo/combo-item.component.html
@@ -1,5 +1,5 @@
-
+@if (!isHeader && !singleMode) {
-
+}
diff --git a/projects/igniteui-angular/src/lib/combo/combo-item.component.ts b/projects/igniteui-angular/src/lib/combo/combo-item.component.ts
index 1c9b4dd39de..ff74a3ebf3f 100644
--- a/projects/igniteui-angular/src/lib/combo/combo-item.component.ts
+++ b/projects/igniteui-angular/src/lib/combo/combo-item.component.ts
@@ -12,13 +12,12 @@ import { IgxComboAPIService } from './combo.api';
import { IgxSelectionAPIService } from '../core/selection';
import { rem } from '../core/utils';
import { IgxCheckboxComponent } from '../checkbox/checkbox.component';
-import { NgIf } from '@angular/common';
/** @hidden */
@Component({
selector: 'igx-combo-item',
templateUrl: 'combo-item.component.html',
- imports: [NgIf, IgxCheckboxComponent]
+ imports: [IgxCheckboxComponent]
})
export class IgxComboItemComponent extends IgxDropDownItemComponent {
diff --git a/projects/igniteui-angular/src/lib/combo/combo.component.html b/projects/igniteui-angular/src/lib/combo/combo.component.html
index cde01b8b3ce..03fd08b909f 100644
--- a/projects/igniteui-angular/src/lib/combo/combo.component.html
+++ b/projects/igniteui-angular/src/lib/combo/combo.component.html
@@ -9,49 +9,59 @@
+ [attr.placeholder]="placeholder" [disabled]="disabled"
+ role="combobox" aria-haspopup="listbox"
+ [attr.aria-expanded]="!dropdown.collapsed" [attr.aria-controls]="dropdown.listId"
+ [attr.aria-labelledby]="ariaLabelledBy || label?.id || placeholder"
+ (blur)="onBlur()" />
-
-
-
-
-
-
+ @if (displayValue) {
+
+ @if (clearIconTemplate) {
+
+ }
+ @if (!clearIconTemplate) {
+
+ }
+
+ }
-
+ @if (toggleIconTemplate) {
-
-
+ }
+ @if (!toggleIconTemplate) {
+
+ }
-
-
-
-
-
-
-
-
-
-
-
+ @if (displaySearchInput) {
+
+
+
+ @if (showSearchCaseIcon) {
+
+
+
+
+
+
+ }
+
+
+ }
-
+ @if (item?.isHeader) {
-
+ }
-
+ @if (!item?.isHeader) {
-
+ }
-
-
-
-
+ @if (filteredData.length === 0 || isAddButtonVisible()) {
+
+ @if (filteredData.length === 0) {
+
+
+
+
+ }
+ @if (isAddButtonVisible()) {
+
+
+
+
+ }
-
-
-
-
-
+ }
diff --git a/projects/igniteui-angular/src/lib/combo/combo.component.ts b/projects/igniteui-angular/src/lib/combo/combo.component.ts
index 76543666a22..92756f24369 100644
--- a/projects/igniteui-angular/src/lib/combo/combo.component.ts
+++ b/projects/igniteui-angular/src/lib/combo/combo.component.ts
@@ -1,4 +1,4 @@
-import { DOCUMENT, NgClass, NgIf, NgTemplateOutlet } from '@angular/common';
+import { DOCUMENT, NgClass, NgTemplateOutlet } from '@angular/common';
import {
AfterViewInit, ChangeDetectorRef, Component, ElementRef, OnInit, OnDestroy,
Optional, Inject, Injector, ViewChild, Input, Output, EventEmitter, HostListener, DoCheck, booleanAttribute
@@ -101,7 +101,6 @@ const diffInSets = (set1: Set
, set2: Set): any[] => {
{ provide: NG_VALUE_ACCESSOR, useExisting: IgxComboComponent, multi: true }
],
imports: [
- NgIf,
NgTemplateOutlet,
NgClass,
FormsModule,
diff --git a/projects/igniteui-angular/src/lib/core/i18n/query-builder-resources.ts b/projects/igniteui-angular/src/lib/core/i18n/query-builder-resources.ts
index f51f52336a3..e486e6ba242 100644
--- a/projects/igniteui-angular/src/lib/core/i18n/query-builder-resources.ts
+++ b/projects/igniteui-angular/src/lib/core/i18n/query-builder-resources.ts
@@ -1,6 +1,7 @@
export interface IQueryBuilderResourceStrings {
igx_query_builder_date_placeholder?: string;
igx_query_builder_time_placeholder?: string;
+ igx_query_builder_datetime_placeholder?: string;
igx_query_builder_filter_operator_and?: string;
igx_query_builder_filter_operator_or?: string;
igx_query_builder_filter_contains?: string;
@@ -13,6 +14,8 @@ export interface IQueryBuilderResourceStrings {
igx_query_builder_filter_notEmpty?: string;
igx_query_builder_filter_null?: string;
igx_query_builder_filter_notNull?: string;
+ igx_query_builder_filter_in?: string;
+ igx_query_builder_filter_notIn?: string;
igx_query_builder_filter_before?: string;
igx_query_builder_filter_after?: string;
igx_query_builder_filter_at?: string;
@@ -33,16 +36,20 @@ export interface IQueryBuilderResourceStrings {
igx_query_builder_filter_lessThanOrEqualTo?: string;
igx_query_builder_filter_true?: string;
igx_query_builder_filter_false?: string;
- igx_query_builder_filter_all?: string;
- igx_query_builder_title?: string;
+ igx_query_builder_filter_all?: string;
+ igx_query_builder_from_label?: string;
+ igx_query_builder_select_label?: string;
+ igx_query_builder_where_label?: string;
igx_query_builder_and_group?: string;
igx_query_builder_or_group?: string;
igx_query_builder_end_group?: string;
igx_query_builder_and_label?: string;
igx_query_builder_or_label?: string;
+ igx_query_builder_switch_group?: string;
igx_query_builder_add_condition?: string;
- igx_query_builder_create_and_group?: string;
- igx_query_builder_create_or_group?: string;
+ igx_query_builder_add_group?: string;
+ igx_query_builder_add_condition_root?: string;
+ igx_query_builder_add_group_root?: string;
igx_query_builder_ungroup?: string;
igx_query_builder_delete?: string;
igx_query_builder_delete_filters?: string;
@@ -50,11 +57,26 @@ export interface IQueryBuilderResourceStrings {
igx_query_builder_column_placeholder?: string;
igx_query_builder_condition_placeholder?: string;
igx_query_builder_value_placeholder?: string;
+ igx_query_builder_query_value_placeholder?: string;
+ igx_query_builder_all_fields?: string;
+ igx_query_builder_details?: string;
+ igx_query_builder_search?: string;
+ igx_query_builder_select_all?: string;
+ igx_query_builder_select_entity?: string;
+ igx_query_builder_select_return_field_single?: string;
+ igx_query_builder_select_return_fields?: string;
+ igx_query_builder_dialog_title?: string;
+ igx_query_builder_dialog_message?: string;
+ igx_query_builder_dialog_checkbox_text?: string;
+ igx_query_builder_dialog_cancel?: string;
+ igx_query_builder_dialog_confirm?: string;
+ igx_query_builder_drop_ghost_text?: string;
}
export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
- igx_query_builder_date_placeholder: 'Pick up date',
- igx_query_builder_time_placeholder: 'Pick up time',
+ igx_query_builder_date_placeholder: 'Select date',
+ igx_query_builder_time_placeholder: 'Select time',
+ igx_query_builder_datetime_placeholder: 'Select date & time',
igx_query_builder_filter_operator_and: 'And',
igx_query_builder_filter_operator_or: 'Or',
igx_query_builder_filter_contains: 'Contains',
@@ -67,6 +89,8 @@ export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
igx_query_builder_filter_notEmpty: 'Not Empty',
igx_query_builder_filter_null: 'Null',
igx_query_builder_filter_notNull: 'Not Null',
+ igx_query_builder_filter_in: 'In',
+ igx_query_builder_filter_notIn: 'Not In',
igx_query_builder_filter_before: 'Before',
igx_query_builder_filter_after: 'After',
igx_query_builder_filter_at: 'At',
@@ -87,16 +111,20 @@ export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
igx_query_builder_filter_lessThanOrEqualTo: 'Less Than Or Equal To',
igx_query_builder_filter_true: 'True',
igx_query_builder_filter_false: 'False',
- igx_query_builder_filter_all: 'All',
- igx_query_builder_title: 'Query Builder',
+ igx_query_builder_filter_all: 'All',
+ igx_query_builder_from_label: 'From',
+ igx_query_builder_select_label: 'Select',
+ igx_query_builder_where_label: 'Where',
igx_query_builder_and_group: '"And" Group',
igx_query_builder_or_group: '"Or" Group',
igx_query_builder_end_group: 'End Group',
igx_query_builder_and_label: 'and',
igx_query_builder_or_label: 'or',
- igx_query_builder_add_condition: 'Condition',
- igx_query_builder_create_and_group: 'Create "And" Group',
- igx_query_builder_create_or_group: 'Create "Or" Group',
+ igx_query_builder_switch_group: 'Switch to {0}',
+ igx_query_builder_add_condition: 'Add condition',
+ igx_query_builder_add_group: 'Add group',
+ igx_query_builder_add_condition_root: 'Condition',
+ igx_query_builder_add_group_root: 'Group',
igx_query_builder_ungroup: 'Ungroup',
igx_query_builder_delete: 'Delete',
igx_query_builder_delete_filters: 'Delete filters',
@@ -104,4 +132,18 @@ export const QueryBuilderResourceStringsEN: IQueryBuilderResourceStrings = {
igx_query_builder_column_placeholder: 'Select column',
igx_query_builder_condition_placeholder: 'Select filter',
igx_query_builder_value_placeholder: 'Value',
+ igx_query_builder_query_value_placeholder: 'Sub-query results',
+ igx_query_builder_all_fields: 'All fields',
+ igx_query_builder_details: 'Details',
+ igx_query_builder_search: 'Search',
+ igx_query_builder_select_all: 'Select All',
+ igx_query_builder_select_entity: 'Select entity',
+ igx_query_builder_select_return_field_single: 'Select return field',
+ igx_query_builder_select_return_fields: 'Select return fields',
+ igx_query_builder_dialog_title: 'Confirmation',
+ igx_query_builder_dialog_message: 'By changing the entity, you will lose your current settings. Are you sure you want to do that?',
+ igx_query_builder_dialog_checkbox_text: 'Do not show this dialog again',
+ igx_query_builder_dialog_cancel: 'Cancel',
+ igx_query_builder_dialog_confirm: 'Confirm',
+ igx_query_builder_drop_ghost_text: 'Drop here to insert'
};
\ No newline at end of file
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/_index.scss b/projects/igniteui-angular/src/lib/core/styles/components/_index.scss
index d5bbef81f3f..f197f6628a9 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/_index.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/_index.scss
@@ -25,7 +25,7 @@
@forward 'grid/pivot-data-selector-theme';
@forward 'grid-summary/grid-summary-theme';
@forward 'grid-toolbar/grid-toolbar-theme';
-@forward 'highlight/highlight-theme.scss';
+@forward 'highlight/highlight-theme';
@forward 'icon/icon-theme';
@forward 'icon-button/icon-button-theme';
@forward 'input/input-group-theme';
@@ -50,5 +50,5 @@
@forward 'time-picker/time-picker-theme';
@forward 'toast/toast-theme';
@forward 'tooltip/tooltip-theme';
-@forward 'tree/tree-theme.scss';
+@forward 'tree/tree-theme';
@forward 'watermark/watermark-theme';
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/chip/_chip-theme.scss b/projects/igniteui-angular/src/lib/core/styles/components/chip/_chip-theme.scss
index 0f5ebc26cf2..752f35b2d48 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/chip/_chip-theme.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/chip/_chip-theme.scss
@@ -698,7 +698,9 @@
%igx-chip__prefix,
%igx-chip__suffix {
- display: inline-flex;
+ @include ellipsis();
+
+ display: inline-block;
vertical-align: middle;
max-width: $chip-max-width;
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-theme.scss b/projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-theme.scss
index 343bd37fd5b..60e1489cfb5 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-theme.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-theme.scss
@@ -175,7 +175,7 @@
@if $theme-variant == 'light' {
background: contrast-color($color: 'gray', $variant: 900);
} @else {
- background: color($color: 'gray', $variant: 50);
+ background: color($color: 'surface', $variant: 500);
}
%igx-group-display {
@@ -720,20 +720,14 @@
}
%grid-excel-menu__secondary-footer {
- padding: rem(8px) rem(16px);
+ --ig-size: 2;
- @if $bootstrap-theme {
- border-top: rem(1px) dashed color($color: 'gray', $variant: 100);
- } @else {
- border-top: rem(1px) dashed color($color: 'gray', $variant: 300);
- }
+ padding-inline: if($variant != 'bootstrap', rem(24px), rem(16px));
+ padding-block-end: if($variant != 'bootstrap', rem(24px), rem(16px));
- @if $variant == 'indigo' and $theme-variant == 'dark' {
- border-top: rem(1px) dashed color($color: 'gray', $variant: 100);
- }
-
- @if $variant == 'indigo' {
- padding: rem(16px);
+ @if $bootstrap-theme {
+ padding-block-start: rem(16px);
+ border-top: rem(1px) solid color($color: 'gray', $variant: 300);
}
%grid-excel-filter__apply,
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-theme.scss b/projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-theme.scss
index 90ce37cda12..d8d15e81f77 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-theme.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-theme.scss
@@ -3192,24 +3192,32 @@
@include excel-filtering($theme);
%advanced-filtering-dialog {
- background: var-get($theme, 'filtering-row-background');
- box-shadow: elevation(if($variant == 'indigo', if($theme-variant == 'light', 24, 23), 12));
+ @if $variant == 'indigo' {
+ $light-variant: contrast-color($color: 'gray', $variant: 900);
+ $dark-variant: color($color: 'gray', $variant: 50);
+ background: if($theme-variant == 'light', $light-variant, $dark-variant);
+ } @else {
+ background: color($color: 'surface', $variant: 500);
+ }
+
+ box-shadow: elevation(if($variant == 'indigo', if($theme-variant == 'light', 24, 23), 24));
+
+ @if $variant == 'material' or $variant == 'bootstrap' {
+ border-radius: rem(4px);
+ }
+
+ @if $variant == 'fluent' {
+ border-radius: rem(2px);
+ }
@if $variant == 'indigo' {
border-radius: rem(10px);
}
igx-query-builder {
- --igx-query-builder-background: #{var-get($theme, 'filtering-row-background')};
- --igx-query-builder-background-and: #{var-get($theme, 'filtering-background-and')};
- --igx-query-builder-background-and--focus: #{var-get($theme, 'filtering-background-and--focus')};
- --igx-query-builder-background-or: #{var-get($theme, 'filtering-background-or')};
- --igx-query-builder-background-or--focus: #{var-get($theme, 'filtering-background-or--focus')};
box-shadow: none;
-
- @if $variant == 'indigo' {
- border-radius: rem(10px);
- }
+ border: none;
+ border-radius: inherit;
}
igx-query-builder-header {
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-component.scss b/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-component.scss
index dddad37c496..62c964d2daa 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-component.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-component.scss
@@ -4,10 +4,9 @@
/// @access private
/// @author Simeon Simeonoff
@mixin component {
- @include _builder-legend();
@include _advanced-filtering-tree();
- @include _advanced-filtering-con-menu();
- @include _advanced-filtering-empty();
+ @include _query-builder-tree();
+ @include _query-builder-dialog();
@include b(igx-query-builder) {
$this: bem--selector-to-string(&);
@@ -30,36 +29,32 @@
@extend %advanced-filter__header !optional;
}
- @include e(main) {
- @extend %advanced-filter__main !optional;
+ @include e(title) {
+ @extend %advanced-filter__title !optional;
}
- @include e(outlet) {
- @extend %advanced-filter__outlet !optional;
+ @include e(label) {
+ @extend %advanced-filter__label !optional;
}
- @include m('inline') {
- @extend %advanced-filter--inline !optional;
+ @include e(main) {
+ @extend %advanced-filter__main !optional;
}
- }
-}
-@mixin _builder-legend {
- @include b(igx-builder-legend) {
- @extend %filter-legend !optional;
+ @include e(root) {
+ @extend %advanced-filter__root !optional;
+ }
- @include e(item) {
- @extend %filter-legend__item !optional;
+ @include e(root-actions) {
+ @extend %advanced-filter__root-actions !optional;
}
- @include e(item, $m: 'and') {
- @extend %filter-legend__item !optional;
- @extend %filter-legend__item--and !optional;
+ @include e(outlet) {
+ @extend %advanced-filter__outlet !optional;
}
- @include e(item, $m: 'or') {
- @extend %filter-legend__item !optional;
- @extend %filter-legend__item--or !optional;
+ @include m('inline') {
+ @extend %advanced-filter--inline !optional;
}
}
}
@@ -68,6 +63,14 @@
@include b(igx-filter-tree) {
@extend %filter-tree !optional;
+ @include e(subquery) {
+ @extend %filter-tree__subquery !optional;
+ }
+
+ @include e(section) {
+ @extend %filter-tree__section !optional;
+ }
+
@include e(line) {
@extend %filter-tree__line !optional;
}
@@ -80,22 +83,38 @@
@extend %filter-tree__line--or !optional;
}
- @include e(line, $mods: ('selected', 'and')) {
- @extend %filter-tree__line--and-selected !optional;
+ @include e(button, $m: 'and') {
+ @extend %filter-tree__button--and !optional;
}
- @include e(line, $mods: ('selected', 'or')) {
- @extend %filter-tree__line--or-selected !optional;
+ @include e(button, $m: 'or') {
+ @extend %filter-tree__button--or !optional;
}
- @include e(expression) {
- @extend %filter-tree__expression !optional;
+ @include e(expressions) {
+ @extend %filter-tree__expressions !optional;
+ }
+
+ @include e(expression-context-menu) {
+ @extend %filter-tree__expression-context-menu !optional;
+ }
+
+ @include e(expression-section) {
+ @extend %filter-tree__expression-section !optional;
}
@include e(expression-item) {
@extend %filter-tree__expression-item !optional;
}
+ @include e(expression-item-ghost) {
+ @extend %filter-tree__expression-item-ghost !optional;
+ }
+
+ @include e(expression-item-drop-ghost) {
+ @extend %filter-tree__expression-drop-item-ghost !optional;
+ }
+
@include e(expression-column) {
@extend %filter-tree__expression-column !optional;
}
@@ -116,32 +135,32 @@
@extend %filter-tree__inputs !optional;
}
+ @include e(inputs-field) {
+ @extend %filter-tree__inputs-field !optional;
+ }
+
@include e(inputs-actions) {
@extend %filter-tree__inputs-actions !optional;
}
+
+ @include e(details-button) {
+ @extend %filter-tree-details-button !optional;;
+ }
}
}
-@mixin _advanced-filtering-con-menu {
- @include b(igx-filter-contextual-menu) {
- @extend %filter-con-menu !optional;
-
- @include e(close-btn) {
- @extend %filter-con-menu__close-btn !optional;
- }
+@mixin _query-builder-tree {
+ @include b(igx-query-builder-tree) {
+ @extend %query-builder-tree !optional;
- @include e(delete-btn) {
- @extend %filter-con-menu__delete-btn !optional;
+ @include m(level-0) {
+ @extend %query-level-0 !optional;
}
}
}
-@mixin _advanced-filtering-empty {
- @include b(igx-filter-empty) {
- @extend %filter-empty !optional;
-
- @include e(title) {
- @extend %filter-empty__title !optional;
- }
+@mixin _query-builder-dialog {
+ @include b(igx-query-builder-dialog) {
+ @extend %query-builder-dialog !optional;;
}
}
diff --git a/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-theme.scss b/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-theme.scss
index 67872257471..ca2358f1abb 100644
--- a/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-theme.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/components/query-builder/_query-builder-theme.scss
@@ -9,25 +9,37 @@
/// @param {Color} header-background [null] - The background color of the query builder header.
/// @param {Color} header-foreground [null] - The foreground color of the query builder header.
/// @param {Color} header-border [null] - The border color of the query builder header.
-/// @param {Map} background-and [null] - The background color of advanced filtering "AND" condition.
-/// @param {Map} background-and--focus [null] - The background color on focus/selected of advanced filtering "AND" condition.
-/// @param {Map} background-or [null] - The background color of advanced filtering "OR" condition.
-/// @param {Map} background-or--focus [null] - The background color on focus/selected of advanced filtering "OR" condition.
+///
+/// @param {Map} subquery-header-background [null] - The background color of the subquery header.
+/// @param {Map} subquery-border-color [null] - The border color of the query block.
+/// @param {Map} separator-color [null] - The separator color of the query block.
+/// @param {Number} subquery-border-radius [null] - The border radius of the subquery block.
+///
+/// @param {Map} label-foreground [null] - The color for query builder labels "from" & "select".
+/// @param {Map} separator-color [null] - The separator color of the query builder tree block.
+/// @param {Number} border-radius [null] - The border radius of the query builder.
+///
+/// @param {Color} color-expression-group-and [null] - The color of advanced filtering "AND" condition group.
+/// @param {Color} color-expression-group-or [null] - The color of advanced filtering "OR" condition group.
+///
/// @example scss Set custom query-builder colors
-/// $my-query-builder-theme: query-builder-theme($$background: red);
+/// $my-query-builder-theme: query-builder-theme($background: red);
/// // Pass the theme to the css-vars() mixin
/// @include css-vars($my-query-builder-theme);
@function query-builder-theme(
$schema: $light-material-schema,
-
$background: null,
$header-background: null,
$header-foreground: null,
$header-border: null,
- $background-and: null,
- $background-and--focus: null,
- $background-or: null,
- $background-or--focus: null,
+ $color-expression-group-and: null,
+ $color-expression-group-or: null,
+ $border-radius: null,
+ $subquery-header-background: null,
+ $subquery-border-color: null,
+ $subquery-border-radius: null,
+ $separator-color: null,
+ $label-foreground: null,
) {
$name: 'igx-query-builder';
$selector: 'igx-query-builder';
@@ -46,21 +58,29 @@
$header-foreground: text-contrast($header-background);
}
+ @if not($header-background) and $background {
+ $header-background: $background;
+ }
+
@return extend($theme, (
name: $name,
selector: $selector,
-
background: $background,
header-background: $header-background,
header-foreground: $header-foreground,
header-border: $header-border,
- background-and: $background-and,
- background-and--focus: $background-and--focus,
- background-or: $background-or,
- background-or--focus: $background-or--focus,
+ color-expression-group-and: $color-expression-group-and,
+ color-expression-group-or: $color-expression-group-or,
+ subquery-header-background: $subquery-header-background,
+ subquery-border-color: $subquery-border-color,
+ subquery-border-radius: $subquery-border-radius,
+ separator-color: $separator-color,
+ border-radius: $border-radius,
+ label-foreground: $label-foreground,
theme: map.get($schema, '_meta', 'theme'),
_meta: map.merge(if($meta, $meta, ()), (
- variant: map.get($schema, '_meta', 'theme')
+ variant: map.get($schema, '_meta', 'theme'),
+ theme-variant: map.get($schema, '_meta', 'variant')
)),
));
}
@@ -83,18 +103,12 @@
$bootstrap-theme: $variant == 'bootstrap';
$not-bootstrap-theme: not($bootstrap-theme);
- $filter-empty: (
- comfortable: rem(144px),
- cosy: rem(107px),
- compact: rem(92px)
- );
-
- $vertical-space: (
- comfortable: rem(16px),
- cosy: rem(12px),
- compact: rem(8px)
- );
+ // Custom colors alpha
+ $alpha-hover: .08;
+ $alpha-focus: .16;
+ $alpha-focus-hover: .24;
+ $border-radius: var-get($theme, 'border-radius');
$icon-size: rem(18px);
%advanced-filter {
@@ -103,48 +117,148 @@
width: auto;
min-width: rem(660px);
background-color: var-get($theme, 'background');
- border-radius: border-radius(rem(4px));
- box-shadow: elevation(12);
+ border-radius: $border-radius;
+ box-shadow: var-get($theme, 'elevation');
+ overflow: hidden;
+
+ &:has(:not(igx-query-builder-header)) {
+ padding-block-start: if($variant != 'bootstrap', rem(24px), rem(16px))
+ }
+
+ &:has(igx-query-builder-header) {
+ padding-block-start: 0;
+ }
+
+ .igx-chip__ghost {
+ position: relative;
+ }
}
- %advanced-filter__header {
- @if $variant != 'indigo' {
- @include type-style('h6');
- } @else {
- @include type-style('h5');
+ %query-builder-tree {
+ background: var-get($theme, 'background');
+
+ %query-builder-tree {
+ border-radius: var-get($theme, 'subquery-border-radius');
+ }
+ }
+
+ %query-level-0 {
+ display: block;
+ width: 100%;
+ padding-inline: if($variant != 'bootstrap', rem(24px), rem(16px));
+ padding-block:
+ if($variant != 'bootstrap', 0, rem(16px))
+ if($variant != 'bootstrap', rem(24px), rem(16px));
+
+ > %advanced-filter__main {
+ gap: rem(16px);
+
+ > %filter-tree__section {
+ --sb-size: #{rem(10px)};
+
+ max-height: rem(570px);
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding-inline-end: rem(16px);
+ }
+ }
+ }
+
+ %filter-tree__subquery {
+ max-width: rem(960px);
+
+ // Add styles to the subquery itself only if there is a direct .igx-filter-tree__inputs inside it
+ &:has( > %filter-tree__inputs) {
+ background: var-get($theme, 'subquery-header-background');
+ border: rem(1px) solid var-get($theme, 'subquery-border-color');
+ border-radius: var-get($theme, 'subquery-border-radius');
+ }
+
+ // Hide the subquery itself if there is a tree with display none inside
+ &:has( > %query-builder-tree[style='display: none;']) {
+ display: none;
+ }
+
+ > %filter-tree__inputs {
+ padding: rem(12px);
+ border-radius: inherit;
+
+ > igx-input-group,
+ > igx-date-picker,
+ > igx-time-picker {
+ flex-grow: 1;
+ }
+ }
+
+ %filter-tree__buttons {
+ margin-block-start: rem(8px);
+ }
+
+ %query-builder-tree {
+ border-block-start: rem(1px) dashed var-get($theme, 'separator-color');
+ padding: rem(12px);
+ }
+
+ &:empty {
+ display: none;
+ }
+
+ }
+
+ %filter-tree-details-button {
+ margin-inline-start: auto;
+ }
+
+ %query-builder-dialog {
+ display: flex;
+ flex-direction: column;
+ gap: rem(16px);
+ max-width: rem(310px);
- border-top-left-radius: border-radius(rem(10px));
- border-top-right-radius: border-radius(rem(10px));
+ > * {
+ margin: 0 !important;
}
+ }
+ %advanced-filter__header {
display: flex;
align-items: center;
background-color: var-get($theme, 'header-background');
color: var-get($theme, 'header-foreground');
user-select: none;
+ border-radius: $border-radius $border-radius 0 0;
margin-bottom: 0;
border-block-end: rem(1px) solid var-get($theme, 'header-border');
+
+ padding-inline: if($variant != 'bootstrap', rem(24px), rem(16px));
+ padding-block: if($variant != 'bootstrap', rem(24px), rem(16px)) rem(16px);
+ }
+
+ %advanced-filter__title {
+ &:empty {
+ display: none;
+ }
}
%advanced-filter__main {
- display: block;
- overflow: auto;
- min-height: pad(rem(138px), rem(164px), rem(214px));
- max-height: pad(rem(305px), rem(394px), rem(468px));
+ display: grid;
+ gap: rem(16px);
+ }
+
+ %advanced-filter__root {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
- [igxButton] + [igxButton] {
- margin-inline-start: rem(8px);
+ > * {
+ flex-grow: 1;
}
}
- %advanced-filter__header,
- %advanced-filter__main {
- padding-inline: pad-inline(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
- padding-block: rem(16px);
+ %advanced-filter__root-actions {
+ display: flex;
+ gap: rem(8px);
+ padding-bottom: rem(16px);
}
%advanced-filter__outlet {
@@ -158,87 +272,202 @@
%filter-tree {
display: flex;
+ width: 100%;
- + %filter-tree,
- + %filter-tree__expression-item,
- + %filter-tree__inputs {
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
+ %filter-tree {
+ margin-block: rem(8px);
+ }
+ }
+
+ %filter-tree__section {
+ display: flex;
+ flex-direction: column;
+ gap: rem(8px);
+
+ > %filter-tree {
+ margin-block: 0;
+ }
+ }
+
+ %filter-tree__expression-context-menu {
+ display: flex;
+ width: 100%;
+
+ [igxbutton='flat'] {
+ --ig-size: 1;
+
+ @if $variant == 'bootstrap' {
+ --ig-button-text-transform: capitalize;
+ }
+
+ border: none;
+ min-width: auto;
}
}
%filter-tree__line {
- width: rem(8px);
- min-width: rem(8px);
+ $size: rem(2px);
+ width: $size;
background-color: white;
- margin-inline-end: pad(rem(8px), rem(12px), rem(16px));
+ margin-inline-end: calc(rem(8px) - $size);
outline-style: none;
- border-radius: border-radius(rem(4px));
- cursor: pointer;
}
%filter-tree__line--and {
- background: var-get($theme, 'background-and');
-
- &-selected {
- background: var-get($theme, 'background-and--focus');
- }
-
- &:focus {
- box-shadow: inset 0 0 0 rem(2px) var-get($theme, 'background-and--focus');
- }
+ background: var-get($theme, 'color-expression-group-and');
}
%filter-tree__line--or {
- background: var-get($theme, 'background-or');
+ background: var-get($theme, 'color-expression-group-or');
+ }
- &-selected {
- background-color: var-get($theme, 'background-or--focus');
- }
+ %filter-tree__button--and {
+ &[igxButton='flat'] {
+ @if $variant == 'material' or $variant == 'indigo' {
+ --focus-hover-background: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / #{$alpha-focus-hover});
+ --focus-visible-background: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / #{$alpha-focus});
+ --focus-background: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / #{$alpha-focus});
+ --active-background: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / #{$alpha-focus});
+ --hover-background: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / #{$alpha-hover});
+ --background: transparent;
+ }
+
+ @if $variant == 'fluent' {
+ --background: transparent;
+ --focus-hover-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ --focus-visible-background: transparent;
+ --focus-background: transparent;
+ --active-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ --hover-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ }
+
+ --foreground: #{var-get($theme, 'color-expression-group-and')};
+ --focus-visible-foreground: #{var-get($theme, 'color-expression-group-and')};
+ --icon-color: #{var-get($theme, 'color-expression-group-and')};
+
+ @if $variant != 'bootstrap' {
+ --focus-foreground: #{var-get($theme, 'color-expression-group-and')};
+ --hover-foreground: #{var-get($theme, 'color-expression-group-and')};
+ --icon-color-hover: #{var-get($theme, 'color-expression-group-and')};
+ --focus-hover-foreground: #{var-get($theme, 'color-expression-group-and')};
+ --active-foreground: #{var-get($theme, 'color-expression-group-and')};
+ } @else {
+ $bootstrap-foreground-lightness: if($theme-variant == 'light', 34%, 78% );
+
+ --focus-hover-background: transparent;
+ --focus-visible-background: transparent;
+ --focus-background: transparent;
+ --active-background: transparent;
+ --hover-background: transparent;
+ --background: transparent;
+ --shadow-color: hsl(from #{var-get($theme, 'color-expression-group-and')} h s l / .5);
+
+ --icon-color-hover: hsl(from #{var-get($theme, 'color-expression-group-and')} h s #{$bootstrap-foreground-lightness} / 1);
+ --focus-foreground: hsl(from #{var-get($theme, 'color-expression-group-and')} h s #{$bootstrap-foreground-lightness} / 1);
+ --hover-foreground: hsl(from #{var-get($theme, 'color-expression-group-and')} h s #{$bootstrap-foreground-lightness} / 1);
+ --focus-hover-foreground: hsl(from #{var-get($theme, 'color-expression-group-and')} h s #{$bootstrap-foreground-lightness} / 1);
+ --active-foreground: hsl(from #{var-get($theme, 'color-expression-group-and')} h s #{$bootstrap-foreground-lightness} / 1);
+ }
+ }
+ }
- &:focus {
- box-shadow: inset 0 0 0 rem(2px) var-get($theme, 'background-or--focus');
- }
+ %filter-tree__button--or {
+ &[igxButton='flat'] {
+ @if $variant == 'material' or $variant == 'indigo' {
+ --focus-hover-background: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / #{$alpha-focus-hover});
+ --focus-visible-background: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / #{$alpha-focus});
+ --focus-background: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / #{$alpha-focus});
+ --active-background: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / #{$alpha-focus});
+ --hover-background: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / #{$alpha-hover});
+ --background: transparent;
+ }
+
+ @if $variant == 'fluent' {
+ --background: transparent;
+ --focus-hover-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ --focus-visible-background: transparent;
+ --focus-background: transparent;
+ --active-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ --hover-background: #{color($color: 'gray', $variant: if($theme-variant == 'light', 200, 50))};
+ }
+
+ --foreground: #{var-get($theme, 'color-expression-group-or')};
+ --focus-visible-foreground: #{var-get($theme, 'color-expression-group-or')};
+ --icon-color: #{var-get($theme, 'color-expression-group-or')};
+
+ @if $variant != 'bootstrap' {
+ --focus-foreground: #{var-get($theme, 'color-expression-group-or')};
+ --hover-foreground: #{var-get($theme, 'color-expression-group-or')};
+ --icon-color-hover: #{var-get($theme, 'color-expression-group-or')};
+ --focus-hover-foreground: #{var-get($theme, 'color-expression-group-or')};
+ --active-foreground: #{var-get($theme, 'color-expression-group-or')};
+ } @else {
+ $bootstrap-foreground-lightness: if($theme-variant == 'light', 14%, 47%);
+
+ --focus-hover-background: transparent;
+ --focus-visible-background: transparent;
+ --focus-background: transparent;
+ --active-background: transparent;
+ --hover-background: transparent;
+ --background: transparent;
+ --shadow-color: hsl(from #{var-get($theme, 'color-expression-group-or')} h s l / .5);
+
+ --icon-color-hover: hsl(from #{var-get($theme, 'color-expression-group-or')} h s #{$bootstrap-foreground-lightness} / 1);
+ --focus-foreground: hsl(from #{var-get($theme, 'color-expression-group-or')} h s #{$bootstrap-foreground-lightness} / 1);
+ --hover-foreground: hsl(from #{var-get($theme, 'color-expression-group-or')} h s #{$bootstrap-foreground-lightness} / 1);
+ --focus-hover-foreground: hsl(from #{var-get($theme, 'color-expression-group-or')} h s #{$bootstrap-foreground-lightness} / 1);
+ --active-foreground: hsl(from #{var-get($theme, 'color-expression-group-or')} h s #{$bootstrap-foreground-lightness} / 1);
+ }
+ }
}
- %filter-tree__expression {
+ %filter-tree__expressions {
display: flex;
flex-direction: column;
align-items: flex-start;
+ flex-grow: 1;
+ gap: rem(8px);
}
- %filter-tree__expression-item {
+ %filter-tree__expression-section {
+ $spacing: rem(16px);
display: flex;
- align-items: center;
+ flex-direction: column;
+ width: calc(100% - #{$spacing});
+ gap: rem(8px);
+ margin-inline-start: $spacing;
- + %filter-tree,
- + %filter-tree__inputs,
- + %filter-tree__expression-item {
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
+ &:empty {
+ display: none;
}
+ }
- > igx-chip {
- @container style(--ig-size: 1) {
- --ig-size: 2;
- }
+ %filter-tree__expression-item {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ gap: rem(8px);
+ position: relative;
+
+ igx-chip {
+ --ig-size: 3;
@if $variant != 'indigo' {
- .igx-chip__item {
- border-block: none;
+ igx-icon {
+ --component-size: 1;
}
}
+ }
- .igx-filter-tree__expression-column {
+ > igx-chip {
+ %filter-tree__expression-column {
padding-inline: pad-inline(rem(3px), rem(6px), rem(8px));
}
+ %filter-tree__expression-condition {
+ padding-inline-start: pad-inline(rem(3px), rem(6px), rem(8px));
+ }
+
igx-prefix {
display: flex;
}
@@ -249,156 +478,94 @@
}
}
+
+ %filter-tree__expression-item-ghost {
+ &.igx-chip__item {
+ @include type-style('body-2');
+
+ --ig-body-2-text-transform: unset;
+
+ padding-inline: rem(32px);
+ }
+
+ color: color($color: 'gray', $variant: if($theme-variant == 'light', 600, 900));
+ border: rem(1px) dashed color($color: 'gray', $variant: if($theme-variant == 'light', 600, 300));
+ background: transparent;
+ }
+
%filter-tree__expression-column {
padding: 0 rem(8px);
}
%filter-tree__expression-actions {
display: inline-flex;
- margin: 0 rem(8px);
- gap: rem(8px);
+ gap: if($variant != 'indigo', rem(16px), rem(8px));
- %igx-icon-button-display {
- --size: #{sizable(rem(20px), rem(24px), if($variant != 'indigo', rem(32px), rem(28px)))};
+ span {
+ display: inline-flex;
}
+
+ %igx-icon-button-display {
+ --ig-size: #{if($variant != 'bootstrap', 2, 1)};
+ };
}
%filter-tree__expression-condition {
- opacity: .7;
+ opacity: if($variant != 'indigo', .6, .8);
}
%filter-tree__buttons {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
-
- + %filter-tree,
- + %filter-tree__expression-item,
- + %filter-tree__inputs {
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
- }
- }
+ --ig-size: 1;
- %filter-tree__inputs {
display: flex;
- justify-content: space-between;
align-items: center;
+ gap: rem(8px);
- igx-input-group {
- --ig-size: 1;
- }
-
- igx-select + igx-select,
- igx-select + igx-input-group,
- igx-select + igx-date-picker,
- igx-select + igx-time-picker,
- igx-input-group + igx-select {
- margin-inline-start: rem(8px);
- }
-
- + %filter-tree,
- + %filter-tree__expression-item {
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
+ [igxbutton='flat'] {
+ padding-block: 0;
+ border: none
}
}
- %filter-tree__inputs-actions {
- display: flex;
- margin: 0 rem(8px);
- align-items: center;
+ %filter-tree__inputs {
+ --ig-size: #{if($variant == 'indigo' or $variant == 'bootstrap', 2, 1)};
- [igxIconButton] {
- transition: none;
- }
+ display: flex;
+ align-items: flex-end;
+ gap: rem(16px);
+ width: 100%;
+ border-radius: inherit;
- [igxIconButton] + [igxIconButton] {
- margin-inline-start: rem(8px);
+ &:empty {
+ display: none;
}
}
- %filter-legend {
+ %filter-tree__inputs-field {
display: flex;
- margin-inline-start: auto;
- pointer-events: none;
+ flex-direction: column;
+ gap: rem(4px);
+ max-width: rem(250px);
+ width: 100%;
}
- %filter-legend__item {
- position: relative;
- display: inline-flex;
- align-items: center;
- font-size: rem(12px);
-
- @if $variant == 'indigo' {
- font-weight: 400;
- }
+ %advanced-filter__label {
+ @include type-style('body-2');
- &::before {
- content: '';
- width: rem(24px);
- height: rem(24px);
- background: white;
- border-radius: border-radius(rem(4px));
- margin-inline-end: rem(8px);
- }
-
- + %filter-legend__item {
- margin-inline-start: rem(24px);
- }
- }
-
- %filter-legend__item--and::before {
- background: var-get($theme, 'background-and');
+ color: var-get($theme, 'label-foreground');
}
- %filter-legend__item--or::before {
- background: var-get($theme, 'background-or');
- }
+ %filter-tree__inputs-actions {
+ --ig-size: 2;
- %filter-con-menu {
- position: relative;
display: flex;
- flex-flow: column;
- width: rem(196px);
- background-color: var-get($theme, 'background');
- padding: rem(16px);
- margin-inline-start: rem(16px);
- border-radius: border-radius(rem(4px));
- border: rem(1px) solid color(null, 'gray', 200);
-
- > [igxButton] + [igxButton],
- igx-buttongroup + [igxButton],
- [igxButton] + igx-buttongroup {
- margin-top: pad(
- map.get($vertical-space, 'compact'),
- map.get($vertical-space, 'cosy'),
- map.get($vertical-space, 'comfortable')
- );
- }
-
- > [igxButton]%filter-con-menu__close-btn + [igxButton],
- [igxButton]%filter-con-menu__close-btn + igx-buttongroup {
- margin-top: 0;
- }
-
- [igxButton] > igx-icon + * {
- margin-inline-start: rem(8px);
- }
+ gap: rem(8px);
+ align-items: center;
+ width: auto;
+ align-self: center;
- igx-buttongroup > * {
- box-shadow: none;
+ [igxIconButton] {
+ transition: none;
}
}
@@ -422,8 +589,9 @@
%filter-con-menu__close-btn {
position: absolute;
- top: rem(-18px);
- inset-inline-end: rem(-18px);
+ top: 0;
+ inset-inline-start: 100%;
+ transform: translate(-50%, -50%);
background-color: var-get($theme, 'background');
border: rem(1px) solid color(null, 'gray', 200);
@@ -435,29 +603,6 @@
}
}
- %filter-empty {
- display: flex;
- align-items: center;
- justify-content: center;
- height: pad(
- map.get($filter-empty, 'compact'),
- map.get($filter-empty, 'cosy'),
- map.get($filter-empty, 'comfortable')
- );
- }
-
- %filter-empty__title {
- @if $variant == 'indigo' {
- @if $theme-variant == 'light' {
- color: color(null, 'gray', 600);
- } @else {
- color: contrast-color(null, 'gray', 50, .6);
- }
- } @else {
- color: color(null, 'gray', 600);
- }
- }
-
%advanced-filter--inline {
display: flex;
flex-direction: column;
@@ -475,3 +620,19 @@
}
}
}
+
+/// Adds typography styles for the igx-query-builder component.
+/// Uses the 'h6' category from the typographic scale.
+/// @group typography
+/// @param {Map} $categories [(title: 'h6')] - The categories from the typographic scale used for type styles.
+@mixin query-builder-typography(
+ $categories: (title: 'h6')
+) {
+ $title: map.get($categories, 'title');
+
+ %advanced-filter__title {
+ @include type-style($title) {
+ margin: 0;
+ }
+ }
+}
diff --git a/projects/igniteui-angular/src/lib/core/styles/typography/_bootstrap.scss b/projects/igniteui-angular/src/lib/core/styles/typography/_bootstrap.scss
index 3358a8d1d64..97c8a89c9a4 100644
--- a/projects/igniteui-angular/src/lib/core/styles/typography/_bootstrap.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/typography/_bootstrap.scss
@@ -32,6 +32,7 @@
@use '../components/tooltip/tooltip-theme' as *;
@use '../components/tree/tree-theme' as *;
@use '../components/label/label-theme' as *;
+@use '../components/query-builder/query-builder-theme' as *;
@mixin typography($type-scale) {
@include badge-typography();
@@ -113,4 +114,7 @@
@include label-typography($categories: (
label: 'body-1'
));
+ @include query-builder-typography($categories: (
+ title: 'h5'
+ ));
}
diff --git a/projects/igniteui-angular/src/lib/core/styles/typography/_fluent.scss b/projects/igniteui-angular/src/lib/core/styles/typography/_fluent.scss
index d203af9fbf1..03987eca9c2 100644
--- a/projects/igniteui-angular/src/lib/core/styles/typography/_fluent.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/typography/_fluent.scss
@@ -31,6 +31,7 @@
@use '../components/tooltip/tooltip-theme' as *;
@use '../components/tree/tree-theme' as *;
@use '../components/label/label-theme' as *;
+@use '../components/query-builder/query-builder-theme' as *;
@mixin typography() {
@include badge-typography();
@@ -119,4 +120,5 @@
@include label-typography($categories: (
label: 'subtitle-2'
));
+ @include query-builder-typography();
}
diff --git a/projects/igniteui-angular/src/lib/core/styles/typography/_indigo.scss b/projects/igniteui-angular/src/lib/core/styles/typography/_indigo.scss
index d9a0e32013e..ee8596057e2 100644
--- a/projects/igniteui-angular/src/lib/core/styles/typography/_indigo.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/typography/_indigo.scss
@@ -31,6 +31,7 @@
@use '../components/tooltip/tooltip-theme' as *;
@use '../components/tree/tree-theme' as *;
@use '../components/label/label-theme' as *;
+@use '../components/query-builder/query-builder-theme' as *;
@mixin typography($type-scale) {
@include badge-typography($categories: (
@@ -125,4 +126,7 @@
@include label-typography($categories: (
label: 'caption'
));
+ @include query-builder-typography($categories: (
+ title: 'h5'
+ ));
}
diff --git a/projects/igniteui-angular/src/lib/core/styles/typography/_material.scss b/projects/igniteui-angular/src/lib/core/styles/typography/_material.scss
index d48041d30ed..8920a178e02 100644
--- a/projects/igniteui-angular/src/lib/core/styles/typography/_material.scss
+++ b/projects/igniteui-angular/src/lib/core/styles/typography/_material.scss
@@ -31,6 +31,7 @@
@use '../components/tooltip/tooltip-theme' as *;
@use '../components/tree/tree-theme' as *;
@use '../components/label/label-theme' as *;
+@use '../components/query-builder/query-builder-theme' as *;
@mixin typography() {
@include badge-typography();
@@ -66,4 +67,5 @@
@include tooltip-typography();
@include tree-typography();
@include label-typography();
+ @include query-builder-typography();
}
diff --git a/projects/igniteui-angular/src/lib/core/utils.ts b/projects/igniteui-angular/src/lib/core/utils.ts
index 487dce78d8d..55404e32fe2 100644
--- a/projects/igniteui-angular/src/lib/core/utils.ts
+++ b/projects/igniteui-angular/src/lib/core/utils.ts
@@ -656,9 +656,9 @@ export function getComponentCssSizeVar(size: string) {
* @param path - The URI path to be normalized.
* @returns string encoded using the encodeURI function.
*/
- export function normalizeURI(path: string) {
+export function normalizeURI(path: string) {
return path?.split('/').map(encodeURI).join('/');
- }
+}
export function getComponentTheme(el: Element) {
return globalThis.window
@@ -666,3 +666,16 @@ export function getComponentTheme(el: Element) {
.getPropertyValue('--theme')
.trim() as IgxTheme;
}
+
+/**
+ * Collection re-created w/ the built in track by identity will always log
+ * warning even for valid cases of recalculating all collection items.
+ * See https://github.com/angular/angular/blob/55581b4181639568fb496e91055142a1b489e988/packages/core/src/render3/instructions/control_flow.ts#L393-L409
+ * Current solution explicit track function doing the same as suggested in:
+ * https://github.com/angular/angular/issues/56471#issuecomment-2180315803
+ * This should be used with moderation and when necessary.
+ * @internal
+ */
+export function trackByIdentity(item: T): T {
+ return item;
+}
diff --git a/projects/igniteui-angular/src/lib/data-operations/data-util.spec.ts b/projects/igniteui-angular/src/lib/data-operations/data-util.spec.ts
index e28623afcc9..f6adde08f78 100644
--- a/projects/igniteui-angular/src/lib/data-operations/data-util.spec.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/data-util.spec.ts
@@ -352,6 +352,7 @@ const testFilter = () => {
{
fieldName: 'number',
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
+ conditionName: 'greaterThan',
searchVal: 3
}
];
@@ -367,6 +368,7 @@ const testFilter = () => {
state.expressionsTree.filteringOperands = [
{
condition: IgxStringFilteringOperand.instance().condition('contains'),
+ conditionName: 'contains',
fieldName: 'string',
searchVal: 'row'
}
@@ -378,6 +380,7 @@ const testFilter = () => {
stateIgnoreCase.expressionsTree.filteringOperands = [
{
condition: IgxStringFilteringOperand.instance().condition('contains'),
+ conditionName: 'contains',
fieldName: 'string',
ignoreCase: false,
searchVal: 'ROW'
@@ -401,6 +404,7 @@ const testFilter = () => {
state.expressionsTree.filteringOperands = [
{
condition: IgxDateFilteringOperand.instance().condition('after'),
+ conditionName: 'after',
fieldName: 'date',
searchVal: new Date()
}
@@ -416,6 +420,7 @@ const testFilter = () => {
state.expressionsTree.filteringOperands = [
{
condition: IgxBooleanFilteringOperand.instance().condition('false'),
+ conditionName: 'false',
fieldName: 'boolean'
}
];
@@ -431,6 +436,7 @@ const testFilter = () => {
state.expressionsTree.filteringOperands = [
{
condition: IgxBooleanFilteringOperand.instance().condition('false'),
+ conditionName: 'false',
fieldName: 'boolean'
}
];
diff --git a/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.spec.ts b/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.spec.ts
new file mode 100644
index 00000000000..752915ab9dd
--- /dev/null
+++ b/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.spec.ts
@@ -0,0 +1,480 @@
+import { FilteringLogic, IFilteringExpression } from './filtering-expression.interface';
+import { FilteringExpressionsTree, IFilteringExpressionsTree } from './filtering-expressions-tree';
+import { recreateTree, recreateTreeFromFields } from './expressions-tree-util';
+import { EntityType, FieldType } from '../grids/common/grid.interface';
+import { IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand } from './filtering-condition';
+
+function serialize(value: unknown, pretty = false) {
+ return pretty ? JSON.stringify(value, undefined, ' ') : JSON.stringify(value)
+}
+
+function checkOp(op: IFilteringExpression, reconstructedOp: IFilteringExpression) {
+ expect(reconstructedOp.condition.logic).not.toBeNull();
+ expect(reconstructedOp.condition.name).toBe(op.conditionName);
+ expect(reconstructedOp.conditionName).toBe(op.conditionName);
+
+ if (op.searchTree) {
+ for (let index = 0; index < op.searchTree.filteringOperands.length; index++) {
+ const innerOp = op.searchTree.filteringOperands[index] as IFilteringExpression;
+ const reconstructedInnerOp = reconstructedOp.searchTree.filteringOperands[index] as IFilteringExpression;
+ checkOp(innerOp, reconstructedInnerOp);
+ }
+ }
+}
+
+describe('Unit testing FilteringUtil', () => {
+ it('Expressions should resolve correctly when rehydrating with fields', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const currDate = new Date();
+
+ const fields = [
+ { field: 'Id', dataType: 'number' },
+ { field: 'Name', dataType: 'string' },
+ { field: 'Validated', dataType: 'boolean' },
+ { field: 'Date created', dataType: 'date' },
+ { field: 'Time created', dataType: 'time' },
+ { field: 'DateTime created', dataType: 'dateTime' }
+ ] as FieldType[];
+
+ // number
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: 100
+ });
+
+ // boolean
+ tree.filteringOperands.push({
+ fieldName: 'Validated',
+ conditionName: 'false'
+ });
+
+ // string
+ tree.filteringOperands.push({
+ fieldName: 'Name',
+ conditionName: 'equals',
+ searchVal: 'test'
+ });
+
+ // DateTime
+ tree.filteringOperands.push({
+ fieldName: 'DateTime created',
+ conditionName: 'equals',
+ searchVal: currDate
+ });
+
+ // Date
+ tree.filteringOperands.push({
+ fieldName: 'Date created',
+ conditionName: 'equals',
+ searchVal: currDate
+ });
+
+ // Time
+ tree.filteringOperands.push({
+ fieldName: 'Time created',
+ conditionName: 'at',
+ searchVal: currDate
+ });
+
+ // misc
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'inQuery'
+ });
+
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'notInQuery'
+ });
+
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'null'
+ });
+
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'notNull'
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTreeFromFields(JSON.parse(serializedTree), fields);
+
+ for (let index = 0; index < tree.filteringOperands.length; index++) {
+ checkOp(tree.filteringOperands[index] as IFilteringExpression, deserializedTree.filteringOperands[index] as IFilteringExpression);
+ }
+ });
+
+ it('Should rehydrate correctly from direct object', () => {
+ const fields = [
+ { field: 'Id', dataType: 'number' },
+ { field: 'Name', dataType: 'string' },
+ { field: 'Validated', dataType: 'boolean' },
+ { field: 'DateTime created', dataType: 'dateTime' },
+ { field: 'In', dataType: null }
+ ] as FieldType[];
+
+ const innerFields = [
+ { field: 'Id', dataType: 'number' }
+ ] as FieldType[];
+
+ const entities: EntityType[] = [
+ {
+ name: 'myEntity',
+ fields: fields
+ },
+ {
+ name: 'otherEntity',
+ fields: innerFields
+ }
+ ];
+
+ const tree = {
+ filteringOperands: [
+ {
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: 100
+ },
+ {
+ fieldName: 'Name',
+ conditionName: 'equals',
+ searchVal: 'test'
+ },
+ {
+ fieldName: 'Validated',
+ conditionName: 'false'
+ },
+ {
+ fieldName: 'DateTime created',
+ conditionName: 'equals',
+ searchVal: new Date().toISOString()
+ }
+ ],
+ operator: FilteringLogic.And,
+ entity: 'myEntity',
+ returnFields: ['*']
+ };
+
+ const deserializedTree = recreateTree(tree, entities);
+
+ for (let index = 0; index < tree.filteringOperands.length; index++) {
+ checkOp(tree.filteringOperands[index], deserializedTree.filteringOperands[index] as IFilteringExpression);
+ }
+ });
+
+ it('Should not modify a fully constructed tree with no entities given', () => {
+ const tree = {
+ filteringOperands: [
+ {
+ fieldName: 'Id',
+ conditionName: 'equals',
+ condition: IgxNumberFilteringOperand.instance().condition('equals'),
+ searchVal: 100
+ },
+ {
+ fieldName: 'Name',
+ conditionName: 'equals',
+ condition: IgxStringFilteringOperand.instance().condition('equals'),
+ searchVal: 'test'
+ },
+ {
+ fieldName: 'Validated',
+ conditionName: 'false',
+ condition: IgxBooleanFilteringOperand.instance().condition('false')
+ },
+ {
+ fieldName: 'DateTime created',
+ conditionName: 'equals',
+ condition: IgxDateTimeFilteringOperand.instance().condition('equals'),
+ searchVal: new Date().toISOString()
+ }
+ ],
+ operator: FilteringLogic.And,
+ entity: 'myEntity',
+ returnFields: ['*']
+ };
+
+ const deserializedTree = recreateTree(tree, []);
+
+ expect(deserializedTree).toEqual(tree);
+
+ for (let index = 0; index < tree.filteringOperands.length; index++) {
+ checkOp(tree.filteringOperands[index], deserializedTree.filteringOperands[index] as IFilteringExpression);
+ const reconstructedOp = deserializedTree.filteringOperands[index] as IFilteringExpression;
+ // Explicitly check the logic function
+ expect(tree.filteringOperands[index].condition.logic.toString()).toBe(reconstructedOp.condition.logic.toString());
+ }
+ });
+
+ it('Should not modify a fully constructed tree with fields given', () => {
+
+ const fields = [
+ { field: 'Id', dataType: 'number' },
+ { field: 'Name', dataType: 'string' },
+ { field: 'Validated', dataType: 'boolean' },
+ { field: 'DateTime created', dataType: 'dateTime' },
+ ] as FieldType[];
+
+ const tree = {
+ filteringOperands: [
+ {
+ fieldName: 'Id',
+ conditionName: 'equals',
+ condition: IgxNumberFilteringOperand.instance().condition('equals'),
+ searchVal: 100
+ },
+ {
+ fieldName: 'Name',
+ conditionName: 'equals',
+ condition: IgxStringFilteringOperand.instance().condition('equals'),
+ searchVal: 'test'
+ },
+ {
+ fieldName: 'Validated',
+ conditionName: 'false',
+ condition: IgxBooleanFilteringOperand.instance().condition('false')
+ },
+ {
+ fieldName: 'DateTime created',
+ conditionName: 'equals',
+ condition: IgxDateTimeFilteringOperand.instance().condition('equals'),
+ searchVal: new Date().toISOString()
+ }
+ ],
+ operator: FilteringLogic.And,
+ entity: 'myEntity',
+ returnFields: ['*']
+ };
+
+ const deserializedTree = recreateTreeFromFields(tree, fields);
+
+ expect(deserializedTree).toEqual(tree);
+
+ for (let index = 0; index < tree.filteringOperands.length; index++) {
+ checkOp(tree.filteringOperands[index], deserializedTree.filteringOperands[index] as IFilteringExpression);
+ const reconstructedOp = deserializedTree.filteringOperands[index] as IFilteringExpression;
+ // Explicitly check the logic function
+ expect(tree.filteringOperands[index].condition.logic.toString()).toBe(reconstructedOp.condition.logic.toString());
+ }
+ });
+
+ it('Sub-queries should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, undefined, 'myEntity', ['*']);
+ const innerTree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'otherEntity', ['*']);
+ const entities: EntityType[] = [
+ {
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: null }
+ ] as any[],
+ },
+ {
+ name: 'otherEntity',
+ fields: [
+ { field: 'Bool', dataType: 'boolean' }
+ ] as any[],
+ }
+ ];
+
+ innerTree.filteringOperands.push({
+ fieldName: 'Bool',
+ conditionName: 'true',
+ searchVal: true
+ });
+
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'inQuery',
+ searchTree: innerTree
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+ const nestedOperand = firstOperand.searchTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.conditionName).toBe('inQuery');
+ expect(firstOperand.condition.name).toBe('inQuery');
+ expect(nestedOperand.condition.logic(true, nestedOperand.searchVal)).toBe(true);
+ expect(nestedOperand.conditionName).toBe('true');
+ expect(nestedOperand.condition.name).toBe('true');
+ });
+
+ it('Number search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'number' }
+ ] as any,
+ }];
+
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: 100
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic(100, firstOperand.searchVal)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxNumberFilteringOperand.instance().condition('equals'));
+ });
+
+ it('Boolean search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'boolean' }
+ ] as any,
+ }];
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'false'
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic(false)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxBooleanFilteringOperand.instance().condition('false'));
+ });
+
+ it('String search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'string' }
+ ] as any,
+ }];
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: 'potato'
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic('potato', firstOperand.searchVal)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxStringFilteringOperand.instance().condition('equals'));
+ });
+
+ it('Date search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'date' }
+ ] as any,
+ }];
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: new Date(2022, 2, 3).toISOString()
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic(new Date(2022, 2, 3), firstOperand.searchVal)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxDateFilteringOperand.instance().condition('equals'));
+ });
+
+ it('DateTime search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'dateTime' }
+ ] as any,
+ }];
+ const currDate = new Date();
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'equals',
+ searchVal: currDate.toISOString()
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic(currDate, firstOperand.searchVal)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxDateTimeFilteringOperand.instance().condition('equals'));
+ });
+
+ it('Time search values should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const entities: EntityType[] = [{
+ name: 'myEntity',
+ fields: [
+ { field: 'Id', dataType: 'time' }
+ ] as any,
+ }];
+ tree.filteringOperands.push({
+ fieldName: 'Id',
+ conditionName: 'at',
+ searchVal: '18:30:00'
+ });
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.logic(new Date(2020, 9, 2, 18, 30, 0, 0), firstOperand.searchVal)).toBe(true);
+ expect(firstOperand.condition).toBe(IgxTimeFilteringOperand.instance().condition('at'));
+ });
+
+ it('Nested tree should deserialize correctly', () => {
+ const tree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField', 'myEntity', ['*']);
+ const subTree = new FilteringExpressionsTree(FilteringLogic.Or, 'myField2', 'myEntity2', ['*']);
+ const currDate = new Date();
+ const entities: EntityType[] = [
+ {
+ name: 'myEntity',
+ fields: [
+ { field: 'date', dataType: 'date' }
+ ] as any[],
+ },
+ {
+ name: 'myEntity2',
+ fields: [
+ { field: 'id', dataType: 'number' }
+ ] as any[],
+ }
+ ];
+
+ tree.filteringOperands.push({
+ fieldName: 'date',
+ conditionName: 'equals',
+ searchVal: currDate.toISOString()
+ });
+ subTree.filteringOperands.push({
+ fieldName: 'id',
+ conditionName: 'greaterThan',
+ searchVal: 123
+ });
+ tree.filteringOperands.push(subTree);
+
+ const serializedTree = serialize(tree, true);
+ const deserializedTree = recreateTree(JSON.parse(serializedTree), entities);
+ const firstOperand = deserializedTree.filteringOperands[0] as IFilteringExpression;
+ const nestedCondition = (deserializedTree.filteringOperands[1] as IFilteringExpressionsTree).filteringOperands[0] as IFilteringExpression;
+
+ expect(firstOperand.condition.name).toBe('equals');
+ expect(firstOperand.condition.logic(currDate, firstOperand.searchVal)).toBe(true);
+
+ expect(nestedCondition.condition.name).toBe('greaterThan');
+ expect(nestedCondition.condition.logic(200, nestedCondition.searchVal)).toBe(true);
+ });
+});
diff --git a/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.ts b/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.ts
index 47ef83d3470..02a8c260a46 100644
--- a/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/expressions-tree-util.ts
@@ -1,5 +1,9 @@
+import { DateTimeUtil } from '../date-common/util/date-time.util';
+import { EntityType, FieldType } from '../grids/common/grid.interface';
+import { GridColumnDataType } from './data-util';
+import { IFilteringOperation, IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand } from './filtering-condition';
import { IFilteringExpression } from './filtering-expression.interface';
-import { IFilteringExpressionsTree } from './filtering-expressions-tree';
+import { IExpressionTree, IFilteringExpressionsTree } from './filtering-expressions-tree';
export class ExpressionsTreeUtil {
/**
@@ -54,3 +58,163 @@ export class ExpressionsTreeUtil {
return false;
}
}
+
+/**
+ * Recreates the search value for a given expression.
+ * @param searchValue The search value to recreate.
+ * @param dataType The data type of the field.
+ * @returns The recreated search value.
+ */
+function recreateSearchValue(searchValue: any, dataType: string): any {
+ if (!dataType && !Array.isArray(searchValue)) {
+ return searchValue;
+ }
+ // In ESF, values are stored as a Set.
+ // Those values are converted to an array before returning string in the stringifyCallback
+ // now we need to convert those back to Set
+ if (Array.isArray(searchValue)) {
+ return new Set(searchValue);
+ } else if ((dataType.toLowerCase().includes('date') || dataType.toLowerCase().includes('time')) && !(searchValue instanceof Date)) {
+ return DateTimeUtil.parseIsoDate(searchValue) ?? searchValue;
+ }
+
+ return searchValue;
+}
+
+/**
+ * Returns the filtering logic function for a given dataType and condition (contains, greaterThan, etc.)
+ * @param dataType The data type of the field.
+ * @param name The name of the filtering condition.
+ * @returns The filtering logic function.
+ */
+function getFilteringCondition(dataType: string, name: string): IFilteringOperation {
+ let filters: IgxFilteringOperand;
+ switch (dataType) {
+ case GridColumnDataType.Boolean:
+ filters = IgxBooleanFilteringOperand.instance();
+ break;
+ case GridColumnDataType.Number:
+ case GridColumnDataType.Currency:
+ case GridColumnDataType.Percent:
+ filters = IgxNumberFilteringOperand.instance();
+ break;
+ case GridColumnDataType.Date:
+ filters = IgxDateFilteringOperand.instance();
+ break;
+ case GridColumnDataType.Time:
+ filters = IgxTimeFilteringOperand.instance();
+ break;
+ case GridColumnDataType.DateTime:
+ filters = IgxDateTimeFilteringOperand.instance();
+ break;
+ case GridColumnDataType.String:
+ default:
+ filters = IgxStringFilteringOperand.instance();
+ break;
+ }
+ return filters.condition(name);
+}
+
+/**
+ * Recreates the IFilteringOperation for a given expression.
+ * If the `logic` is already populated - it will return the original IFilteringOperation
+ * of the expression.
+ * @param expression The expression for which to resolve the IFilteringOperation.
+ * @param dataType The data type of the field.
+ * @returns The IFilteringOperation for the given expression.
+ */
+function recreateOperatorFromDataType(expression: IFilteringExpression, dataType: string): IFilteringOperation {
+ if (!expression.condition?.logic) {
+ return getFilteringCondition(dataType, expression.conditionName || expression.condition?.name);
+ }
+
+ return expression.condition;
+}
+
+/**
+ * Recreates an expression from the given fields by applying the correct operands
+ * and adjusting the search value to be the correct type.
+ * @param expression The expression to recreate.
+ * @param fields An array of fields to use for recreating the expression.
+ * @returns The recreated expression.
+ */
+function recreateExpression(expression: IFilteringExpression, fields: FieldType[]): IFilteringExpression {
+ const field = fields?.find(f => f.field === expression.fieldName);
+
+ if (field && !expression.condition?.logic) {
+ if (!field.filters) {
+ expression.condition = recreateOperatorFromDataType(expression, field.dataType);
+ } else {
+ expression.condition = field.filters.condition(expression.conditionName || expression.condition?.name);
+ }
+ }
+
+ if (!expression.condition && expression.conditionName) {
+ throw Error('Wrong `conditionName`, `condition` or `field` provided!');
+ }
+
+ if (!expression.conditionName) {
+ expression.conditionName = expression.condition?.name;
+ }
+
+ expression.searchVal = recreateSearchValue(expression.searchVal, field?.dataType);
+
+ return expression;
+}
+
+/**
+ * Checks if the given entry is an IExpressionTree.
+ * @param entry The entry to check.
+ * @returns True if the entry is an IExpressionTree, false otherwise.
+ */
+export function isTree(entry: IExpressionTree | IFilteringExpression): entry is IExpressionTree {
+ return 'operator' in entry;
+}
+
+/**
+ * Recreates the tree from a given array of entities by applying the correct operands
+ * for each expression and adjusting the search values to be the correct type.
+ * @param tree The expression tree to recreate.
+ * @param entities An array of entities to use for recreating the tree.
+ * @returns The recreated expression tree.
+ */
+export function recreateTree(tree: IExpressionTree, entities: EntityType[]): IExpressionTree {
+ const entity = entities.find(e => e.name === tree.entity);
+
+ for (let i = 0; i < tree.filteringOperands.length; i++) {
+ const operand = tree.filteringOperands[i];
+ if (isTree(operand)) {
+ tree.filteringOperands[i] = recreateTree(operand, entities);
+ } else {
+ if (operand.searchTree) {
+ operand.searchTree = recreateTree(operand.searchTree, entities);
+ }
+ tree.filteringOperands[i] = recreateExpression(operand, entity?.fields);
+ }
+ }
+
+ return tree;
+}
+
+/**
+ * Recreates the tree from a given array of fields by applying the correct operands.
+ * It is recommended to use `recreateTree` if there will be multiple entities in the tree
+ * with potentially colliding field names.
+ * @param tree The expression tree to recreate.
+ * @param fields An array of fields to use for recreating the tree.
+ */
+export function recreateTreeFromFields(tree: IExpressionTree, fields: FieldType[]): IExpressionTree {
+ for (let i = 0; i < tree.filteringOperands.length; i++) {
+ const operand = tree.filteringOperands[i];
+ if (isTree(operand)) {
+ tree.filteringOperands[i] = recreateTreeFromFields(operand, fields);
+ } else {
+ if (operand.searchTree) {
+ operand.searchTree = recreateTreeFromFields(operand.searchTree, fields);
+ }
+ tree.filteringOperands[i] = recreateExpression(operand, fields);
+ }
+ }
+
+ return tree;
+}
diff --git a/projects/igniteui-angular/src/lib/data-operations/filtering-condition.ts b/projects/igniteui-angular/src/lib/data-operations/filtering-condition.ts
index 0ed4e613279..9cb01167241 100644
--- a/projects/igniteui-angular/src/lib/data-operations/filtering-condition.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/filtering-condition.ts
@@ -25,6 +25,18 @@ export class IgxFilteringOperand {
iconName: 'filter_in',
hidden: true,
logic: (target: any, searchVal: Set) => this.findValueInSet(target, searchVal)
+ }, {
+ name: 'inQuery',
+ isUnary: false,
+ isNestedQuery: true,
+ iconName: 'in',
+ logic: (target: any, searchVal: Set) => this.findValueInSet(target, searchVal)
+ }, {
+ name: 'notInQuery',
+ isUnary: false,
+ isNestedQuery: true,
+ iconName: 'not-in',
+ logic: (target: any, searchVal: Set) => !this.findValueInSet(target, searchVal)
}];
}
@@ -33,9 +45,16 @@ export class IgxFilteringOperand {
}
/**
- * Returns an array of names of the conditions which are visible in the UI
+ * Returns an array of names of the conditions which are visible in the filtering UI
*/
public conditionList(): string[] {
+ return this.operations.filter(f => !f.hidden && !f.isNestedQuery).map((element) => element.name);
+ }
+
+ /**
+ * Returns an array of names of the conditions which are visible in the UI, including "In" and "Not In", allowing the creation of sub-queries.
+ */
+ public extendedConditionList(): string[] {
return this.operations.filter(f => !f.hidden).map((element) => element.name);
}
@@ -60,7 +79,7 @@ export class IgxFilteringOperand {
/**
* @hidden
*/
- protected findValueInSet(target: any, searchVal: Set) {
+ public findValueInSet(target: any, searchVal: Set) {
return searchVal.has(target);
}
}
@@ -74,7 +93,7 @@ export class IgxFilteringOperand {
export class IgxBooleanFilteringOperand extends IgxFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'all',
isUnary: true,
iconName: 'filter_all',
@@ -99,7 +118,9 @@ export class IgxBooleanFilteringOperand extends IgxFilteringOperand {
isUnary: true,
iconName: 'filter_not_empty',
logic: (target: boolean) => target !== null && target !== undefined
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
}
@@ -111,7 +132,7 @@ export class IgxBooleanFilteringOperand extends IgxFilteringOperand {
class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'empty',
isUnary: true,
iconName: 'filter_empty',
@@ -121,7 +142,9 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
isUnary: true,
iconName: 'filter_not_empty',
logic: (target: Date) => target !== null && target !== undefined
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
/**
@@ -166,7 +189,10 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
return res;
}
- protected override findValueInSet(target: any, searchVal: Set) {
+ /**
+ * @hidden
+ */
+ public override findValueInSet(target: any, searchVal: Set) {
if (!target) {
return false;
}
@@ -189,7 +215,7 @@ class IgxBaseDateTimeFilteringOperand extends IgxFilteringOperand {
export class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'equals',
isUnary: false,
iconName: 'filter_equal',
@@ -389,10 +415,12 @@ export class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
const now = IgxDateFilteringOperand.getDateParts(new Date(), 'y');
return d.year === now.year + 1;
}
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
- protected override findValueInSet(target: any, searchVal: Set) {
+ public override findValueInSet(target: any, searchVal: Set) {
if (!target) {
return false;
}
@@ -406,7 +434,7 @@ export class IgxDateFilteringOperand extends IgxBaseDateTimeFilteringOperand {
export class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'equals',
isUnary: false,
iconName: 'filter_equal',
@@ -608,7 +636,9 @@ export class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand
const now = IgxDateTimeFilteringOperand.getDateParts(new Date(), 'y');
return d.year === now.year + 1;
}
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
}
@@ -616,7 +646,7 @@ export class IgxDateTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand
export class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'at',
isUnary: false,
iconName: 'filter_equal',
@@ -710,10 +740,15 @@ export class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
targetn.hours > search.hours ? true : targetn.hours === search.hours && targetn.minutes > search.minutes ?
true : targetn.hours === search.hours && targetn.minutes === search.minutes && targetn.seconds > search.seconds;
}
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
- protected override findValueInSet(target: any, searchVal: Set) {
+ /**
+ * @hidden
+ */
+ public override findValueInSet(target: any, searchVal: Set) {
if (!target) {
return false;
}
@@ -730,7 +765,7 @@ export class IgxTimeFilteringOperand extends IgxBaseDateTimeFilteringOperand {
export class IgxNumberFilteringOperand extends IgxFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'equals',
isUnary: false,
iconName: 'filter_equal',
@@ -770,7 +805,9 @@ export class IgxNumberFilteringOperand extends IgxFilteringOperand {
isUnary: true,
iconName: 'filter_not_empty',
logic: (target: number) => target !== null && target !== undefined && !isNaN(target)
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
}
@@ -783,7 +820,7 @@ export class IgxNumberFilteringOperand extends IgxFilteringOperand {
export class IgxStringFilteringOperand extends IgxFilteringOperand {
protected constructor() {
super();
- this.operations = [{
+ const newOperations: IFilteringOperation[] = [{
name: 'contains',
isUnary: false,
iconName: 'filter_contains',
@@ -847,7 +884,9 @@ export class IgxStringFilteringOperand extends IgxFilteringOperand {
isUnary: true,
iconName: 'filter_not_empty',
logic: (target: string) => target !== null && target !== undefined && target.length > 0
- }].concat(this.operations);
+ }];
+
+ this.operations = newOperations.concat(this.operations);
}
/**
@@ -872,6 +911,7 @@ export class IgxStringFilteringOperand extends IgxFilteringOperand {
export interface IFilteringOperation {
name: string;
isUnary: boolean;
+ isNestedQuery?: boolean;
iconName: string;
hidden?: boolean;
/* blazorCSSuppress */
diff --git a/projects/igniteui-angular/src/lib/data-operations/filtering-expression.interface.ts b/projects/igniteui-angular/src/lib/data-operations/filtering-expression.interface.ts
index 482ee7ea77e..3e308e0fe1c 100644
--- a/projects/igniteui-angular/src/lib/data-operations/filtering-expression.interface.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/filtering-expression.interface.ts
@@ -1,4 +1,5 @@
import { IFilteringOperation } from './filtering-condition';
+import { IExpressionTree } from './filtering-expressions-tree';
/* mustCoerceToInt */
export enum FilteringLogic {
@@ -13,7 +14,9 @@ export enum FilteringLogic {
*/
export declare interface IFilteringExpression {
fieldName: string;
- condition: IFilteringOperation;
- searchVal?: any;
+ condition?: IFilteringOperation;
+ conditionName?: string;
+ searchVal?: any;
+ searchTree?: IExpressionTree;
ignoreCase?: boolean;
}
diff --git a/projects/igniteui-angular/src/lib/data-operations/filtering-expressions-tree.ts b/projects/igniteui-angular/src/lib/data-operations/filtering-expressions-tree.ts
index 438f2b7be7f..1381263f5bf 100644
--- a/projects/igniteui-angular/src/lib/data-operations/filtering-expressions-tree.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/filtering-expressions-tree.ts
@@ -12,6 +12,8 @@ export declare interface IExpressionTree {
filteringOperands: (IExpressionTree | IFilteringExpression)[];
operator: FilteringLogic;
fieldName?: string;
+ entity?: string;
+ returnFields?: string[];
}
/* marshalByValue */
@@ -75,7 +77,7 @@ export class FilteringExpressionsTree implements IFilteringExpressionsTree {
/**
* Sets/gets the field name of the column where the filtering expression is placed.
* ```typescript
- * gridExpressionTree.fieldName = 'Column Field';
+ * gridExpressionTree.fieldName = 'Column Field';
* ```
* ```typescript
* let columnField = expressionTree.fieldName;
@@ -89,7 +91,7 @@ export class FilteringExpressionsTree implements IFilteringExpressionsTree {
/**
* Sets/gets the type of the filtering expressions tree.
* ```typescript
- * gridExpressionTree.type = FilteringExpressionsTree.Advanced;
+ * gridExpressionTree.type = FilteringExpressionsTree.Advanced;
* ```
* ```typescript
* let type = expressionTree.type;
@@ -99,12 +101,39 @@ export class FilteringExpressionsTree implements IFilteringExpressionsTree {
*/
public type?: FilteringExpressionsTreeType;
- constructor(operator: FilteringLogic, fieldName?: string) {
+ /**
+ * Sets/gets the entity.
+ * ```typescript
+ * gridExpressionsTree.entity = 'Entity A';
+ * ```
+ * ```typescript
+ * let entity = gridExpressionsTree.entity;
+ * ```
+ *
+ * @memberof FilteringExpressionsTree
+ */
+ public entity?: string;
+
+ /**
+ * Sets/gets the return fields.
+ * ```typescript
+ * gridExpressionsTree.returnFields = ['Column Field 1', 'Column Field 2'];
+ * ```
+ * ```typescript
+ * let returnFields = gridExpressionsTree.returnFields;
+ * ```
+ *
+ * @memberof FilteringExpressionsTree
+ */
+ public returnFields?: string[];
+
+ constructor(operator: FilteringLogic, fieldName?: string, entity?: string, returnFields?: string[]) {
this.operator = operator;
+ this.entity = entity;
+ this.returnFields = returnFields;
this.fieldName = fieldName;
}
-
/**
* Checks if filtering expressions tree is empty.
*
diff --git a/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.spec.ts b/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.spec.ts
index 22cf2f0b03e..2ad1908e022 100644
--- a/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.spec.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.spec.ts
@@ -19,6 +19,7 @@ describe('Unit testing FilteringStrategy', () => {
expressionTree.filteringOperands = [
{
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
+ conditionName: 'greaterThan',
fieldName: 'number',
searchVal: 1
}
@@ -33,12 +34,14 @@ describe('Unit testing FilteringStrategy', () => {
expressionTree.filteringOperands = [
{
condition: IgxStringFilteringOperand.instance().condition('contains'),
+ conditionName: 'contains',
fieldName: 'string',
ignoreCase: false,
searchVal: 'ROW'
},
{
condition: IgxNumberFilteringOperand.instance().condition('lessThan'),
+ conditionName: 'lessThan',
fieldName: 'number',
searchVal: 1
}
@@ -50,6 +53,7 @@ describe('Unit testing FilteringStrategy', () => {
const rec = data[0];
const res = fs.findMatchByExpression(rec, {
condition: IgxBooleanFilteringOperand.instance().condition('false'),
+ conditionName: 'false',
fieldName: 'boolean'
});
expect(res).toBeTruthy();
@@ -61,6 +65,7 @@ describe('Unit testing FilteringStrategy', () => {
expressionTree.filteringOperands = [
{
condition: IgxStringFilteringOperand.instance().condition('contains'),
+ conditionName: 'contains',
fieldName: 'string',
searchVal: 'ROW'
}
diff --git a/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.ts b/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.ts
index 9674032ee56..ffecead98e2 100644
--- a/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.ts
+++ b/projects/igniteui-angular/src/lib/data-operations/filtering-strategy.ts
@@ -6,6 +6,7 @@ import { GridColumnDataType } from './data-util';
import { SortingDirection } from './sorting-strategy';
import { formatNumber, formatPercent, getLocaleCurrencyCode } from '@angular/common';
import { IFilteringState } from './filtering-state.interface';
+import { isTree } from './expressions-tree-util';
const DateType = 'date';
const DateTimeType = 'dateTime';
@@ -46,8 +47,8 @@ export abstract class BaseFilteringStrategy implements IFilteringStrategy {
// protected
public matchRecord(rec: any, expressions: IFilteringExpressionsTree | IFilteringExpression, grid?: GridType): boolean {
if (expressions) {
- if (expressions instanceof FilteringExpressionsTree) {
- const expressionsTree = expressions as IFilteringExpressionsTree;
+ if (isTree(expressions)) {
+ const expressionsTree = expressions;
const operator = expressionsTree.operator as FilteringLogic;
let matchOperand;
@@ -71,7 +72,7 @@ export abstract class BaseFilteringStrategy implements IFilteringStrategy {
return true;
} else {
- const expression = expressions as IFilteringExpression;
+ const expression = expressions;
const column = grid && grid.getColumnByName(expression.fieldName);
const isDate = column ? column.dataType === DateType || column.dataType === DateTimeType : false;
const isTime = column ? column.dataType === TimeType : false;
diff --git a/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.html b/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.html
index f9929eab2da..0d54b8105b3 100644
--- a/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.html
+++ b/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.html
@@ -1,39 +1,44 @@
-
-
-
-
+ @if (closeButtonLabel || todayButtonLabel) {
+
+ @if (closeButtonLabel) {
+
+ }
+ @if (todayButtonLabel) {
+
+ }
+
+ }
-
-
-
-
-
+@if (pickerActions?.template || (closeButtonLabel || todayButtonLabel)) {
+
+}
+@if (pickerActions?.template || (closeButtonLabel || todayButtonLabel)) {
+
+
+
+
+}
diff --git a/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.ts b/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.ts
index 3f8cd15202a..510be7214f1 100644
--- a/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.ts
+++ b/projects/igniteui-angular/src/lib/date-common/calendar-container/calendar-container.component.ts
@@ -1,4 +1,4 @@
-import { NgIf, NgTemplateOutlet } from '@angular/common';
+import { NgTemplateOutlet } from '@angular/common';
import {
Component,
ViewChild,
@@ -20,7 +20,6 @@ import { IgxDividerDirective } from "../../directives/divider/divider.directive"
styles: [':host {display: block;}'],
templateUrl: 'calendar-container.component.html',
imports: [
- NgIf,
IgxButtonDirective,
IgxRippleDirective,
IgxCalendarComponent,
diff --git a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.html b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.html
index ebcfec861f4..81159a032bd 100644
--- a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.html
+++ b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.html
@@ -1,16 +1,18 @@
-
-
+
-
-
+
+
+ }
-
-
-
+ @if (!clearComponents.length && value) {
+
+
+
+ }
diff --git a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.spec.ts b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.spec.ts
index 6638292d7cc..a85061000d8 100644
--- a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.spec.ts
@@ -21,7 +21,7 @@ import { DateRangeDescriptor, DateRangeType } from '../core/dates';
import { IgxOverlayOutletDirective } from '../directives/toggle/toggle.directive';
import { IgxPickerClearComponent, IgxPickerToggleComponent } from '../date-common/public_api';
import { DateTimeUtil } from '../date-common/util/date-time.util';
-import { NgIf, registerLocaleData } from "@angular/common";
+import { registerLocaleData } from "@angular/common";
import localeES from "@angular/common/locales/es";
import localeBg from "@angular/common/locales/bg";
import { IgxDateTimeEditorDirective } from '../directives/date-time-editor/public_api';
@@ -1552,13 +1552,17 @@ export class IgxDatePickerTestKbrdComponent {
template: `
- CustomToggle
+ @if (showCustomToggle) {
+ CustomToggle
+ }
Prefix
- CustomClear
+ @if (showCustomClear) {
+ CustomClear
+ }
Suffix
Hint
`,
- imports: [IgxDatePickerComponent, IgxPickerToggleComponent, IgxPrefixDirective, IgxPickerClearComponent, IgxLabelDirective, IgxSuffixDirective, IgxHintDirective, NgIf]
+ imports: [IgxDatePickerComponent, IgxPickerToggleComponent, IgxPrefixDirective, IgxPickerClearComponent, IgxLabelDirective, IgxSuffixDirective, IgxHintDirective]
})
export class IgxDatePickerWithProjectionsComponent {
@ViewChild(IgxDatePickerComponent) public datePicker: IgxDatePickerComponent;
diff --git a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.ts b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.ts
index d1348e1afbd..a3a6935af7d 100644
--- a/projects/igniteui-angular/src/lib/date-picker/date-picker.component.ts
+++ b/projects/igniteui-angular/src/lib/date-picker/date-picker.component.ts
@@ -25,7 +25,6 @@ import {
ViewContainerRef,
booleanAttribute
} from '@angular/core';
-import { NgIf } from '@angular/common';
import {
AbstractControl,
ControlValueAccessor,
@@ -93,7 +92,6 @@ let NEXT_ID = 0;
templateUrl: 'date-picker.component.html',
styles: [':host { display: block; }'],
imports: [
- NgIf,
IgxInputGroupComponent,
IgxPrefixDirective,
IgxIconComponent,
diff --git a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker-inputs.common.ts b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker-inputs.common.ts
index e08cf779ed5..8cccd6a2275 100644
--- a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker-inputs.common.ts
+++ b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker-inputs.common.ts
@@ -10,7 +10,7 @@ import { IgxIconComponent } from '../icon/icon.component';
import { IgxSuffixDirective } from '../directives/suffix/suffix.directive';
import { IgxButtonDirective } from '../directives/button/button.directive';
import { IgxPrefixDirective } from '../directives/prefix/prefix.directive';
-import { NgIf, NgTemplateOutlet, NgClass, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';
+import { NgTemplateOutlet, NgClass } from '@angular/common';
/** Represents a range between two dates. */
export interface DateRange {
@@ -126,7 +126,7 @@ export class IgxDateRangeInputsBaseComponent extends IgxInputGroupComponent {
{ provide: IgxInputGroupBase, useExisting: IgxDateRangeStartComponent },
{ provide: IgxDateRangeInputsBaseComponent, useExisting: IgxDateRangeStartComponent }
],
- imports: [NgIf, NgTemplateOutlet, IgxPrefixDirective, IgxButtonDirective, NgClass, IgxSuffixDirective, IgxIconComponent, NgSwitch, NgSwitchCase, NgSwitchDefault]
+ imports: [NgTemplateOutlet, IgxPrefixDirective, IgxButtonDirective, NgClass, IgxSuffixDirective, IgxIconComponent]
})
export class IgxDateRangeStartComponent extends IgxDateRangeInputsBaseComponent { }
@@ -161,7 +161,7 @@ export class IgxDateRangeStartComponent extends IgxDateRangeInputsBaseComponent
{ provide: IgxInputGroupBase, useExisting: IgxDateRangeEndComponent },
{ provide: IgxDateRangeInputsBaseComponent, useExisting: IgxDateRangeEndComponent }
],
- imports: [NgIf, NgTemplateOutlet, IgxPrefixDirective, IgxButtonDirective, NgClass, IgxSuffixDirective, IgxIconComponent, NgSwitch, NgSwitchCase, NgSwitchDefault]
+ imports: [NgTemplateOutlet, IgxPrefixDirective, IgxButtonDirective, NgClass, IgxSuffixDirective, IgxIconComponent]
})
export class IgxDateRangeEndComponent extends IgxDateRangeInputsBaseComponent { }
diff --git a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.html b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.html
index 79359e0cd14..6ea322900a2 100644
--- a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.html
+++ b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.html
@@ -28,9 +28,11 @@
role="combobox" aria-haspopup="grid" [attr.aria-expanded]="!collapsed" [attr.aria-labelledby]="label?.id"
[value]="value | dateRange: appliedFormat : locale : formatter" />
-
-
-
+ @if (!toggleComponents.length) {
+
+
+
+ }
diff --git a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.ts b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.ts
index 4a5ec190653..e6b5edca0ba 100644
--- a/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.ts
+++ b/projects/igniteui-angular/src/lib/date-range-picker/date-range-picker.component.ts
@@ -4,7 +4,7 @@ import {
OnChanges, OnDestroy, OnInit, Optional, Output, QueryList,
SimpleChanges, TemplateRef, ViewChild, ViewContainerRef
} from '@angular/core';
-import { NgTemplateOutlet, NgIf, getLocaleFirstDayOfWeek } from '@angular/common';
+import { NgTemplateOutlet, getLocaleFirstDayOfWeek } from '@angular/common';
import {
AbstractControl, ControlValueAccessor, NgControl,
NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator
@@ -68,7 +68,6 @@ const SingleInputDatesConcatenationString = ' - ';
{ provide: NG_VALIDATORS, useExisting: IgxDateRangePickerComponent, multi: true }
],
imports: [
- NgIf,
NgTemplateOutlet,
IgxIconComponent,
IgxInputGroupComponent,
diff --git a/projects/igniteui-angular/src/lib/dialog/dialog-content.component.html b/projects/igniteui-angular/src/lib/dialog/dialog-content.component.html
index f92bfab185e..efe481f28d9 100644
--- a/projects/igniteui-angular/src/lib/dialog/dialog-content.component.html
+++ b/projects/igniteui-angular/src/lib/dialog/dialog-content.component.html
@@ -12,49 +12,54 @@
[attr.role]="role"
[attr.aria-labelledby]="titleId"
>
-
- {{ title }}
-
-
+ @if (title) {
+
+ {{ title }}
+
+ }
+ @if (!title) {
+
+ }
- {{
- message
- }}
-
+ @if (message) {
+
+ {{ message }}
+
+ }
+ @if (!message) {
+
+ }
-
-
-
-
-
+ @if (leftButtonLabel || rightButtonLabel) {
+
+ @if (leftButtonLabel) {
+
+ }
+ @if (rightButtonLabel) {
+
+ }
+
+ }
+ @if (!leftButtonLabel && !rightButtonLabel) {
+
+ }
diff --git a/projects/igniteui-angular/src/lib/dialog/dialog.component.ts b/projects/igniteui-angular/src/lib/dialog/dialog.component.ts
index cb6fc430cc9..09c76ecfdd5 100644
--- a/projects/igniteui-angular/src/lib/dialog/dialog.component.ts
+++ b/projects/igniteui-angular/src/lib/dialog/dialog.component.ts
@@ -1,4 +1,3 @@
-import { NgIf } from '@angular/common';
import {
Component,
ElementRef,
@@ -56,7 +55,7 @@ let DIALOG_ID = 0;
@Component({
selector: 'igx-dialog',
templateUrl: 'dialog-content.component.html',
- imports: [IgxToggleDirective, IgxFocusTrapDirective, NgIf, IgxFocusDirective, IgxButtonDirective, IgxRippleDirective]
+ imports: [IgxToggleDirective, IgxFocusTrapDirective, IgxFocusDirective, IgxButtonDirective, IgxRippleDirective]
})
export class IgxDialogComponent implements IToggleView, OnInit, OnDestroy, AfterContentInit {
private static NEXT_ID = 1;
diff --git a/projects/igniteui-angular/src/lib/directives/autocomplete/autocomplete.directive.spec.ts b/projects/igniteui-angular/src/lib/directives/autocomplete/autocomplete.directive.spec.ts
index 2d71a3871aa..5d4fac049d4 100644
--- a/projects/igniteui-angular/src/lib/directives/autocomplete/autocomplete.directive.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/autocomplete/autocomplete.directive.spec.ts
@@ -10,7 +10,6 @@ import { IgxInputGroupComponent, IgxLabelDirective, IgxPrefixDirective, IgxSuffi
import { IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective } from '../../drop-down/public_api';
import { FormsModule, ReactiveFormsModule, UntypedFormGroup, UntypedFormBuilder, Validators } from '@angular/forms';
import { ConnectedPositioningStrategy, VerticalAlignment, HorizontalAlignment } from '../../services/public_api';
-import { NgFor } from '@angular/common';
import { IgxRippleDirective } from '../ripple/ripple.directive';
import { IgxIconComponent } from '../../icon/icon.component';
@@ -949,9 +948,11 @@ export class IgxAutocompletePipeStartsWith implements PipeTransform {
clear
-
- {{town}}
-
+ @for (town of towns | startsWith:townSelected; track town+$index) {
+
+ {{town}}
+
+ }
`,
imports: [
FormsModule,
@@ -964,7 +965,6 @@ export class IgxAutocompletePipeStartsWith implements PipeTransform {
IgxIconComponent,
IgxAutocompleteDirective,
IgxAutocompletePipeStartsWith,
- NgFor
]
})
class AutocompleteComponent {
@@ -979,7 +979,7 @@ class AutocompleteComponent {
constructor() {
this.towns = [
- 'Sofia', 'Plovdiv', 'Varna', 'Burgas', 'Ruse', 'Stara Zagora', 'Pleven', 'Dobrich', 'Sliven', 'Shumen', 'Pernik', 'Haskovo', 'Yambol', 'Pazardzhik', 'Blagoevgrad', 'Veliko Tarnovo', 'Vratsa', 'Gabrovo', 'Asenovgrad', 'Vidin', 'Kazanlak', 'Kyustendil', 'Kardzhali', 'Montana', 'Dimitrovgrad', 'Targovishte', 'Lovech', 'Silistra', 'Dupnitsa', 'Svishtov', 'Razgrad', 'Gorna Oryahovitsa', 'Smolyan', 'Petrich', 'Sandanski', 'Samokov', 'Sevlievo', 'Lom', 'Karlovo', 'Velingrad', 'Nova Zagora', 'Troyan', 'Aytos', 'Botevgrad', 'Gotse Delchev', 'Peshtera', 'Harmanli', 'Karnobat', 'Svilengrad', 'Panagyurishte', 'Chirpan', 'Popovo', 'Rakovski', 'Radomir', 'Novi Iskar', 'Kozloduy', 'Parvomay', 'Berkovitsa', 'Cherven Bryag', 'Pomorie', 'Ihtiman', 'Radnevo', 'Provadiya', 'Novi Pazar', 'Razlog', 'Byala Slatina', 'Nesebar', 'Balchik', 'Kostinbrod', 'Stamboliyski', 'Kavarna', 'Knezha', 'Pavlikeni', 'Mezdra', 'Etropole', 'Levski', 'Teteven', 'Elhovo', 'Bankya', 'Tryavna', 'Lukovit', 'Tutrakan', 'Sredets', 'Sopot', 'Byala', 'Veliki Preslav', 'Isperih', 'Belene', 'Omurtag', 'Bansko', 'Krichim', 'Galabovo', 'Devnya', 'Septemvri', 'Rakitovo', 'Lyaskovets', 'Svoge', 'Aksakovo', 'Kubrat', 'Dryanovo', 'Beloslav', 'Pirdop', 'Lyubimets', 'Momchilgrad', 'Slivnitsa', 'Hisarya', 'Zlatograd', 'Kostenets', 'Devin', 'General Toshevo', 'Simeonovgrad', 'Simitli', 'Elin Pelin', 'Dolni Chiflik', 'Tervel', 'Dulovo', 'Varshets', 'Kotel', 'Madan', 'Straldzha', 'Saedinenie', 'Bobov Dol', 'Tsarevo', 'Kuklen', 'Tvarditsa', 'Yakoruda', 'Elena', 'Topolovgrad', 'Bozhurishte', 'Chepelare', 'Oryahovo', 'Sozopol', 'Belogradchik', 'Perushtitsa', 'Zlatitsa', 'Strazhitsa', 'Krumovgrad', 'Kameno', 'Dalgopol', 'Vetovo', 'Suvorovo', 'Dolni Dabnik', 'Dolna Banya', 'Pravets', 'Nedelino', 'Polski Trambesh', 'Trastenik', 'Bratsigovo', 'Koynare', 'Godech', 'Slavyanovo', 'Dve Mogili', 'Kostandovo', 'Debelets', 'Strelcha', 'Sapareva Banya', 'Ignatievo', 'Smyadovo', 'Breznik', 'Sveti Vlas', 'Nikopol', 'Shivachevo', 'Belovo', 'Tsar Kaloyan', 'Ivaylovgrad', 'Valchedram', 'Marten', 'Glodzhevo', 'Sarnitsa', 'Letnitsa', 'Varbitsa', 'Iskar', 'Ardino', 'Shabla', 'Rudozem', 'Vetren', 'Kresna', 'Banya', 'Batak', 'Maglizh', 'Valchi Dol', 'Gulyantsi', 'Dragoman', 'Zavet', 'Kran', 'Miziya', 'Primorsko', 'Sungurlare', 'Dolna Mitropoliya', 'Krivodol', 'Kula', 'Kalofer', 'Slivo Pole', 'Kaspichan', 'Apriltsi', 'Belitsa', 'Roman', 'Dzhebel', 'Dolna Oryahovitsa', 'Buhovo', 'Gurkovo', 'Pavel Banya', 'Nikolaevo', 'Yablanitsa', 'Kableshkovo', 'Opaka', 'Rila', 'Ugarchin', 'Dunavtsi', 'Dobrinishte', 'Hadzhidimovo', 'Bregovo', 'Byala Cherkva', 'Zlataritsa', 'Kocherinovo', 'Dospat', 'Tran', 'Sadovo', 'Laki', 'Koprivshtitsa', 'Malko Tarnovo', 'Loznitsa', 'Obzor', 'Kilifarevo', 'Borovo', 'Batanovtsi', 'Chernomorets', 'Aheloy', 'Byala', 'Pordim', 'Suhindol', 'Merichleri', 'Glavinitsa', 'Chiprovtsi', 'Kermen', 'Brezovo', 'Plachkovtsi', 'Zemen', 'Balgarovo', 'Alfatar', 'Boychinovtsi', 'Gramada', 'Senovo', 'Momin Prohod', 'Kaolinovo', 'Shipka', 'Antonovo', 'Ahtopol', 'Boboshevo', 'Bolyarovo', 'Brusartsi', 'Klisura', 'Dimovo', 'Kiten', 'Pliska', 'Madzharovo', 'Melnik'
+ 'Sofia', 'Plovdiv', 'Varna', 'Burgas', 'Ruse', 'Stara Zagora', 'Pleven', 'Dobrich', 'Sliven', 'Shumen', 'Pernik', 'Haskovo', 'Yambol', 'Pazardzhik', 'Blagoevgrad', 'Veliko Tarnovo', 'Vratsa', 'Gabrovo', 'Asenovgrad', 'Vidin', 'Kazanlak', 'Kyustendil', 'Kardzhali', 'Montana', 'Dimitrovgrad', 'Targovishte', 'Lovech', 'Silistra', 'Dupnitsa', 'Svishtov', 'Razgrad', 'Gorna Oryahovitsa', 'Smolyan', 'Petrich', 'Sandanski', 'Samokov', 'Sevlievo', 'Lom', 'Karlovo', 'Velingrad', 'Nova Zagora', 'Troyan', 'Aytos', 'Botevgrad', 'Gotse Delchev', 'Peshtera', 'Harmanli', 'Karnobat', 'Svilengrad', 'Panagyurishte', 'Chirpan', 'Popovo', 'Rakovski', 'Radomir', 'Novi Iskar', 'Kozloduy', 'Parvomay', 'Berkovitsa', 'Cherven Bryag', 'Pomorie', 'Ihtiman', 'Radnevo', 'Provadiya', 'Novi Pazar', 'Razlog', 'Byala Slatina', 'Nesebar', 'Balchik', 'Kostinbrod', 'Stamboliyski', 'Kavarna', 'Knezha', 'Pavlikeni', 'Mezdra', 'Etropole', 'Levski', 'Teteven', 'Elhovo', 'Bankya', 'Tryavna', 'Lukovit', 'Tutrakan', 'Sredets', 'Sopot', 'Byala', 'Veliki Preslav', 'Isperih', 'Belene', 'Omurtag', 'Bansko', 'Krichim', 'Galabovo', 'Devnya', 'Septemvri', 'Rakitovo', 'Lyaskovets', 'Svoge', 'Aksakovo', 'Kubrat', 'Dryanovo', 'Beloslav', 'Pirdop', 'Lyubimets', 'Momchilgrad', 'Slivnitsa', 'Hisarya', 'Zlatograd', 'Kostenets', 'Devin', 'General Toshevo', 'Simeonovgrad', 'Simitli', 'Elin Pelin', 'Dolni Chiflik', 'Tervel', 'Dulovo', 'Varshets', 'Kotel', 'Madan', 'Straldzha', 'Saedinenie', 'Bobov Dol', 'Tsarevo', 'Kuklen', 'Tvarditsa', 'Yakoruda', 'Elena', 'Topolovgrad', 'Bozhurishte', 'Chepelare', 'Oryahovo', 'Sozopol', 'Belogradchik', 'Perushtitsa', 'Zlatitsa', 'Strazhitsa', 'Krumovgrad', 'Kameno', 'Dalgopol', 'Vetovo', 'Suvorovo', 'Dolni Dabnik', 'Dolna Banya', 'Pravets', 'Nedelino', 'Polski Trambesh', 'Trastenik', 'Bratsigovo', 'Koynare', 'Godech', 'Slavyanovo', 'Dve Mogili', 'Kostandovo', 'Debelets', 'Strelcha', 'Sapareva Banya', 'Ignatievo', 'Smyadovo', 'Breznik', 'Sveti Vlas', 'Nikopol', 'Shivachevo', 'Belovo', 'Tsar Kaloyan', 'Ivaylovgrad', 'Valchedram', 'Marten', 'Glodzhevo', 'Sarnitsa', 'Letnitsa', 'Varbitsa', 'Iskar', 'Ardino', 'Shabla', 'Rudozem', 'Vetren', 'Kresna', 'Banya', 'Batak', 'Maglizh', 'Valchi Dol', 'Gulyantsi', 'Dragoman', 'Zavet', 'Kran', 'Miziya', 'Primorsko', 'Sungurlare', 'Dolna Mitropoliya', 'Krivodol', 'Kula', 'Kalofer', 'Slivo Pole', 'Kaspichan', 'Apriltsi', 'Belitsa', 'Roman', 'Dzhebel', 'Dolna Oryahovitsa', 'Buhovo', 'Gurkovo', 'Pavel Banya', 'Nikolaevo', 'Yablanitsa', 'Kableshkovo', 'Opaka', 'Rila', 'Ugarchin', 'Dunavtsi', 'Dobrinishte', 'Hadzhidimovo', 'Bregovo', 'Byala Cherkva', 'Zlataritsa', 'Kocherinovo', 'Dospat', 'Tran', 'Sadovo', 'Laki', 'Koprivshtitsa', 'Malko Tarnovo', 'Loznitsa', 'Obzor', 'Kilifarevo', 'Borovo', 'Batanovtsi', 'Chernomorets', 'Aheloy', 'Pordim', 'Suhindol', 'Merichleri', 'Glavinitsa', 'Chiprovtsi', 'Kermen', 'Brezovo', 'Plachkovtsi', 'Zemen', 'Balgarovo', 'Alfatar', 'Boychinovtsi', 'Gramada', 'Senovo', 'Momin Prohod', 'Kaolinovo', 'Shipka', 'Antonovo', 'Ahtopol', 'Boboshevo', 'Bolyarovo', 'Brusartsi', 'Klisura', 'Dimovo', 'Kiten', 'Pliska', 'Madzharovo', 'Melnik'
];
}
public selectionChanging() { }
@@ -997,9 +997,11 @@ class AutocompleteComponent {
[igxAutocomplete]='townsPanel' #textarea>
-
- {{town}}
-
+ @for (town of towns | startsWith:townSelected; track town+$index) {
+
+ {{town}}
+
+ }
`,
imports: [
FormsModule,
@@ -1008,7 +1010,6 @@ class AutocompleteComponent {
IgxDropDownComponent,
IgxDropDownItemComponent,
IgxAutocompletePipeStartsWith,
- NgFor
]
})
class AutocompleteInputComponent extends AutocompleteComponent {
@@ -1028,9 +1029,11 @@ class AutocompleteInputComponent extends AutocompleteComponent {
clear
-
- {{town}}
-
+ @for (town of towns | startsWith:townSelected; track town+$index) {
+
+ {{town}}
+
+ }
@@ -1048,7 +1051,6 @@ class AutocompleteInputComponent extends AutocompleteComponent {
IgxIconComponent,
IgxAutocompleteDirective,
IgxAutocompletePipeStartsWith,
- NgFor
]
})
@@ -1065,7 +1067,7 @@ class AutocompleteFormComponent {
constructor(fb: UntypedFormBuilder) {
this.towns = [
- 'Sofia', 'Plovdiv', 'Varna', 'Burgas', 'Ruse', 'Stara Zagora', 'Pleven', 'Dobrich', 'Sliven', 'Shumen', 'Pernik', 'Haskovo', 'Yambol', 'Pazardzhik', 'Blagoevgrad', 'Veliko Tarnovo', 'Vratsa', 'Gabrovo', 'Asenovgrad', 'Vidin', 'Kazanlak', 'Kyustendil', 'Kardzhali', 'Montana', 'Dimitrovgrad', 'Targovishte', 'Lovech', 'Silistra', 'Dupnitsa', 'Svishtov', 'Razgrad', 'Gorna Oryahovitsa', 'Smolyan', 'Petrich', 'Sandanski', 'Samokov', 'Sevlievo', 'Lom', 'Karlovo', 'Velingrad', 'Nova Zagora', 'Troyan', 'Aytos', 'Botevgrad', 'Gotse Delchev', 'Peshtera', 'Harmanli', 'Karnobat', 'Svilengrad', 'Panagyurishte', 'Chirpan', 'Popovo', 'Rakovski', 'Radomir', 'Novi Iskar', 'Kozloduy', 'Parvomay', 'Berkovitsa', 'Cherven Bryag', 'Pomorie', 'Ihtiman', 'Radnevo', 'Provadiya', 'Novi Pazar', 'Razlog', 'Byala Slatina', 'Nesebar', 'Balchik', 'Kostinbrod', 'Stamboliyski', 'Kavarna', 'Knezha', 'Pavlikeni', 'Mezdra', 'Etropole', 'Levski', 'Teteven', 'Elhovo', 'Bankya', 'Tryavna', 'Lukovit', 'Tutrakan', 'Sredets', 'Sopot', 'Byala', 'Veliki Preslav', 'Isperih', 'Belene', 'Omurtag', 'Bansko', 'Krichim', 'Galabovo', 'Devnya', 'Septemvri', 'Rakitovo', 'Lyaskovets', 'Svoge', 'Aksakovo', 'Kubrat', 'Dryanovo', 'Beloslav', 'Pirdop', 'Lyubimets', 'Momchilgrad', 'Slivnitsa', 'Hisarya', 'Zlatograd', 'Kostenets', 'Devin', 'General Toshevo', 'Simeonovgrad', 'Simitli', 'Elin Pelin', 'Dolni Chiflik', 'Tervel', 'Dulovo', 'Varshets', 'Kotel', 'Madan', 'Straldzha', 'Saedinenie', 'Bobov Dol', 'Tsarevo', 'Kuklen', 'Tvarditsa', 'Yakoruda', 'Elena', 'Topolovgrad', 'Bozhurishte', 'Chepelare', 'Oryahovo', 'Sozopol', 'Belogradchik', 'Perushtitsa', 'Zlatitsa', 'Strazhitsa', 'Krumovgrad', 'Kameno', 'Dalgopol', 'Vetovo', 'Suvorovo', 'Dolni Dabnik', 'Dolna Banya', 'Pravets', 'Nedelino', 'Polski Trambesh', 'Trastenik', 'Bratsigovo', 'Koynare', 'Godech', 'Slavyanovo', 'Dve Mogili', 'Kostandovo', 'Debelets', 'Strelcha', 'Sapareva Banya', 'Ignatievo', 'Smyadovo', 'Breznik', 'Sveti Vlas', 'Nikopol', 'Shivachevo', 'Belovo', 'Tsar Kaloyan', 'Ivaylovgrad', 'Valchedram', 'Marten', 'Glodzhevo', 'Sarnitsa', 'Letnitsa', 'Varbitsa', 'Iskar', 'Ardino', 'Shabla', 'Rudozem', 'Vetren', 'Kresna', 'Banya', 'Batak', 'Maglizh', 'Valchi Dol', 'Gulyantsi', 'Dragoman', 'Zavet', 'Kran', 'Miziya', 'Primorsko', 'Sungurlare', 'Dolna Mitropoliya', 'Krivodol', 'Kula', 'Kalofer', 'Slivo Pole', 'Kaspichan', 'Apriltsi', 'Belitsa', 'Roman', 'Dzhebel', 'Dolna Oryahovitsa', 'Buhovo', 'Gurkovo', 'Pavel Banya', 'Nikolaevo', 'Yablanitsa', 'Kableshkovo', 'Opaka', 'Rila', 'Ugarchin', 'Dunavtsi', 'Dobrinishte', 'Hadzhidimovo', 'Bregovo', 'Byala Cherkva', 'Zlataritsa', 'Kocherinovo', 'Dospat', 'Tran', 'Sadovo', 'Laki', 'Koprivshtitsa', 'Malko Tarnovo', 'Loznitsa', 'Obzor', 'Kilifarevo', 'Borovo', 'Batanovtsi', 'Chernomorets', 'Aheloy', 'Byala', 'Pordim', 'Suhindol', 'Merichleri', 'Glavinitsa', 'Chiprovtsi', 'Kermen', 'Brezovo', 'Plachkovtsi', 'Zemen', 'Balgarovo', 'Alfatar', 'Boychinovtsi', 'Gramada', 'Senovo', 'Momin Prohod', 'Kaolinovo', 'Shipka', 'Antonovo', 'Ahtopol', 'Boboshevo', 'Bolyarovo', 'Brusartsi', 'Klisura', 'Dimovo', 'Kiten', 'Pliska', 'Madzharovo', 'Melnik'
+ 'Sofia', 'Plovdiv', 'Varna', 'Burgas', 'Ruse', 'Stara Zagora', 'Pleven', 'Dobrich', 'Sliven', 'Shumen', 'Pernik', 'Haskovo', 'Yambol', 'Pazardzhik', 'Blagoevgrad', 'Veliko Tarnovo', 'Vratsa', 'Gabrovo', 'Asenovgrad', 'Vidin', 'Kazanlak', 'Kyustendil', 'Kardzhali', 'Montana', 'Dimitrovgrad', 'Targovishte', 'Lovech', 'Silistra', 'Dupnitsa', 'Svishtov', 'Razgrad', 'Gorna Oryahovitsa', 'Smolyan', 'Petrich', 'Sandanski', 'Samokov', 'Sevlievo', 'Lom', 'Karlovo', 'Velingrad', 'Nova Zagora', 'Troyan', 'Aytos', 'Botevgrad', 'Gotse Delchev', 'Peshtera', 'Harmanli', 'Karnobat', 'Svilengrad', 'Panagyurishte', 'Chirpan', 'Popovo', 'Rakovski', 'Radomir', 'Novi Iskar', 'Kozloduy', 'Parvomay', 'Berkovitsa', 'Cherven Bryag', 'Pomorie', 'Ihtiman', 'Radnevo', 'Provadiya', 'Novi Pazar', 'Razlog', 'Byala Slatina', 'Nesebar', 'Balchik', 'Kostinbrod', 'Stamboliyski', 'Kavarna', 'Knezha', 'Pavlikeni', 'Mezdra', 'Etropole', 'Levski', 'Teteven', 'Elhovo', 'Bankya', 'Tryavna', 'Lukovit', 'Tutrakan', 'Sredets', 'Sopot', 'Byala', 'Veliki Preslav', 'Isperih', 'Belene', 'Omurtag', 'Bansko', 'Krichim', 'Galabovo', 'Devnya', 'Septemvri', 'Rakitovo', 'Lyaskovets', 'Svoge', 'Aksakovo', 'Kubrat', 'Dryanovo', 'Beloslav', 'Pirdop', 'Lyubimets', 'Momchilgrad', 'Slivnitsa', 'Hisarya', 'Zlatograd', 'Kostenets', 'Devin', 'General Toshevo', 'Simeonovgrad', 'Simitli', 'Elin Pelin', 'Dolni Chiflik', 'Tervel', 'Dulovo', 'Varshets', 'Kotel', 'Madan', 'Straldzha', 'Saedinenie', 'Bobov Dol', 'Tsarevo', 'Kuklen', 'Tvarditsa', 'Yakoruda', 'Elena', 'Topolovgrad', 'Bozhurishte', 'Chepelare', 'Oryahovo', 'Sozopol', 'Belogradchik', 'Perushtitsa', 'Zlatitsa', 'Strazhitsa', 'Krumovgrad', 'Kameno', 'Dalgopol', 'Vetovo', 'Suvorovo', 'Dolni Dabnik', 'Dolna Banya', 'Pravets', 'Nedelino', 'Polski Trambesh', 'Trastenik', 'Bratsigovo', 'Koynare', 'Godech', 'Slavyanovo', 'Dve Mogili', 'Kostandovo', 'Debelets', 'Strelcha', 'Sapareva Banya', 'Ignatievo', 'Smyadovo', 'Breznik', 'Sveti Vlas', 'Nikopol', 'Shivachevo', 'Belovo', 'Tsar Kaloyan', 'Ivaylovgrad', 'Valchedram', 'Marten', 'Glodzhevo', 'Sarnitsa', 'Letnitsa', 'Varbitsa', 'Iskar', 'Ardino', 'Shabla', 'Rudozem', 'Vetren', 'Kresna', 'Banya', 'Batak', 'Maglizh', 'Valchi Dol', 'Gulyantsi', 'Dragoman', 'Zavet', 'Kran', 'Miziya', 'Primorsko', 'Sungurlare', 'Dolna Mitropoliya', 'Krivodol', 'Kula', 'Kalofer', 'Slivo Pole', 'Kaspichan', 'Apriltsi', 'Belitsa', 'Roman', 'Dzhebel', 'Dolna Oryahovitsa', 'Buhovo', 'Gurkovo', 'Pavel Banya', 'Nikolaevo', 'Yablanitsa', 'Kableshkovo', 'Opaka', 'Rila', 'Ugarchin', 'Dunavtsi', 'Dobrinishte', 'Hadzhidimovo', 'Bregovo', 'Byala Cherkva', 'Zlataritsa', 'Kocherinovo', 'Dospat', 'Tran', 'Sadovo', 'Laki', 'Koprivshtitsa', 'Malko Tarnovo', 'Loznitsa', 'Obzor', 'Kilifarevo', 'Borovo', 'Batanovtsi', 'Chernomorets', 'Aheloy', 'Pordim', 'Suhindol', 'Merichleri', 'Glavinitsa', 'Chiprovtsi', 'Kermen', 'Brezovo', 'Plachkovtsi', 'Zemen', 'Balgarovo', 'Alfatar', 'Boychinovtsi', 'Gramada', 'Senovo', 'Momin Prohod', 'Kaolinovo', 'Shipka', 'Antonovo', 'Ahtopol', 'Boboshevo', 'Bolyarovo', 'Brusartsi', 'Klisura', 'Dimovo', 'Kiten', 'Pliska', 'Madzharovo', 'Melnik'
];
this.reactiveForm = fb.group({
towns: ['', Validators.required]
diff --git a/projects/igniteui-angular/src/lib/directives/drag-drop/drag-drop.spec.ts b/projects/igniteui-angular/src/lib/directives/drag-drop/drag-drop.spec.ts
index cb0001c7d44..de893b9bd94 100644
--- a/projects/igniteui-angular/src/lib/directives/drag-drop/drag-drop.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/drag-drop/drag-drop.spec.ts
@@ -15,7 +15,6 @@ import {
IgxDragIgnoreDirective
} from './drag-drop.directive';
import { IgxIconComponent } from '../../icon/icon.component';
-import { NgFor } from '@angular/common';
describe('General igxDrag/igxDrop', () => {
let fix: ComponentFixture;
@@ -2108,21 +2107,25 @@ class TestDragDropStrategiesComponent extends TestDragDropLinkedSingleComponent
drag_indicator
Movies list
-
-
- drag_indicator
- {{category.text}}
-
-
+ @for (category of categoriesNotes; track category) {
+
drag_indicator
- {{note.text}}
+ {{category.text}}
+ @for (note of getCategoryMovies(category.text); track note) {
+
+
+ drag_indicator
+ {{note.text}}
+
+
+ }
-
+ }
`,
- imports: [NgFor, IgxIconComponent, IgxDragDirective, IgxDragHandleDirective]
+ imports: [IgxIconComponent, IgxDragDirective, IgxDragHandleDirective]
})
class TestDragDropNestedComponent extends TestDragDropComponent {
public categoriesNotes = [
diff --git a/projects/igniteui-angular/src/lib/directives/filter/filter.directive.spec.ts b/projects/igniteui-angular/src/lib/directives/filter/filter.directive.spec.ts
index d8ea891bfa5..49ddf007b6f 100644
--- a/projects/igniteui-angular/src/lib/directives/filter/filter.directive.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/filter/filter.directive.spec.ts
@@ -5,7 +5,6 @@ import { IgxListComponent } from '../../list/list.component';
import { IgxFilterDirective, IgxFilterOptions, IgxFilterPipe } from './filter.directive';
import { configureTestSuite } from '../../test-utils/configure-suite';
-import { NgFor } from '@angular/common';
describe('Filter', () => {
configureTestSuite();
@@ -214,11 +213,11 @@ class DeclarativeListTestComponent {
@Component({
template: `
-
- {{item.text}}
-
+ @for (item of dataSourceItems | igxFilter: fo; track item) {
+ {{item.text}}
+ }
`,
- imports: [IgxListComponent, IgxListItemComponent, IgxFilterPipe, NgFor]
+ imports: [IgxListComponent, IgxListItemComponent, IgxFilterPipe]
})
class DynamicListTestComponent {
@ViewChild(IgxListComponent, { static: true }) public list: IgxListComponent;
diff --git a/projects/igniteui-angular/src/lib/directives/focus-trap/focus-trap.directive.spec.ts b/projects/igniteui-angular/src/lib/directives/focus-trap/focus-trap.directive.spec.ts
index bfd3f55b919..e960b7b34e6 100644
--- a/projects/igniteui-angular/src/lib/directives/focus-trap/focus-trap.directive.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/focus-trap/focus-trap.directive.spec.ts
@@ -6,7 +6,6 @@ import { IgxFocusTrapDirective } from './focus-trap.directive';
import { configureTestSuite } from '../../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { UIInteractions } from '../../test-utils/ui-interactions.spec';
-import { NgIf } from '@angular/common';
describe('igxFocusTrap', () => {
configureTestSuite();
@@ -171,12 +170,20 @@ describe('igxFocusTrap', () => {
template: `
-
+ @if (showInput) {
+
+ }
+
-
-
+ @if (showInput) {
+
+ }
+
+ @if (showButton) {
+
+ }
`,
- imports: [IgxFocusTrapDirective, NgIf]
+ imports: [IgxFocusTrapDirective]
})
class TrapFocusTestComponent {
public showInput = true;
diff --git a/projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.spec.ts b/projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.spec.ts
index abc46f747e0..cea8758dec5 100644
--- a/projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.spec.ts
@@ -1,4 +1,4 @@
-import { AsyncPipe, NgClass, NgFor, NgForOfContext, NgIf } from '@angular/common';
+import { AsyncPipe, NgClass, NgForOfContext } from '@angular/common';
import {
AfterViewInit,
ChangeDetectorRef,
@@ -1514,22 +1514,24 @@ export class VerticalVirtualComponent extends VirtualComponent {
@Component({
template: `
-
-
-
-
{{rowData['1']}}
-
{{rowData['2']}}
-
{{rowData['3']}}
-
{{rowData['4']}}
-
{{rowData['5']}}
-
-
-
+ @if (exists) {
+
+
+
+
{{rowData['1']}}
+
{{rowData['2']}}
+
{{rowData['3']}}
+
{{rowData['4']}}
+
{{rowData['5']}}
+
+
+
+ }
`,
- imports: [TestIgxForOfDirective, IgxForOfDirective, NgIf]
+ imports: [TestIgxForOfDirective, IgxForOfDirective]
})
export class VerticalVirtualDestroyComponent extends VerticalVirtualComponent {
public exists = true;
@@ -1551,7 +1553,8 @@ export class VerticalVirtualDestroyComponent extends VerticalVirtualComponent {
-
+ @if (exists) {
+
+ }
`,
- imports: [IgxForOfDirective, NgIf]
+ imports: [IgxForOfDirective]
})
export class VerticalVirtualCreateComponent extends VerticalVirtualComponent {
@ViewChild('scrollContainer2', { read: IgxForOfDirective, static: false })
@@ -1585,18 +1589,20 @@ export class VerticalVirtualCreateComponent extends VerticalVirtualComponent {
[style.overflow]='"hidden"'
[style.float]='"left"'
[style.position]='"relative"'>
-
-
+ @for (rowData of data; track rowData) {
+
+
{{rowData[col.field]}}
-
-
+
+
+ }
`,
- imports: [TestIgxForOfDirective, IgxForOfDirective, NgFor]
+ imports: [TestIgxForOfDirective, IgxForOfDirective]
})
export class HorizontalVirtualComponent extends VirtualComponent {
public override width = '800px';
diff --git a/projects/igniteui-angular/src/lib/directives/radio/radio-group.directive.spec.ts b/projects/igniteui-angular/src/lib/directives/radio/radio-group.directive.spec.ts
index 468cb51d5c9..b8c3c2391f6 100644
--- a/projects/igniteui-angular/src/lib/directives/radio/radio-group.directive.spec.ts
+++ b/projects/igniteui-angular/src/lib/directives/radio/radio-group.directive.spec.ts
@@ -7,7 +7,6 @@ import { configureTestSuite } from '../../test-utils/configure-suite';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { By } from '@angular/platform-browser';
import { IgxRadioComponent } from '../../radio/radio.component';
-import { NgFor } from '@angular/common';
describe('IgxRadioGroupDirective', () => {
configureTestSuite();
@@ -281,12 +280,14 @@ class RadioGroupSimpleComponent {
@Component({
template: `
-
- {{item}}
-
-
-`,
- imports: [IgxRadioComponent, IgxRadioGroupDirective, NgFor]
+ @for (item of ['Foo', 'Bar', 'Baz']; track item) {
+
+ {{item}}
+
+ }
+
+ `,
+ imports: [IgxRadioComponent, IgxRadioGroupDirective]
})
class RadioGroupComponent {
@ViewChild('radioGroup', { read: IgxRadioGroupDirective, static: true }) public radioGroup: IgxRadioGroupDirective;
@@ -294,12 +295,14 @@ class RadioGroupComponent {
@Component({
template: `
-
- {{item}}
-
-
-`,
- imports: [IgxRadioComponent, IgxRadioGroupDirective, NgFor]
+ @for (item of ['Foo', 'Bar', 'Baz']; track item) {
+
+ {{item}}
+
+ }
+
+ `,
+ imports: [IgxRadioComponent, IgxRadioGroupDirective]
})
class RadioGroupRequiredComponent {
@ViewChild('radioGroup', { read: IgxRadioGroupDirective, static: true }) public radioGroup: IgxRadioGroupDirective;
@@ -334,12 +337,14 @@ class RadioGroupOnPushComponent {
@Component({
template: `
-
- {{item}}
-
-
-`,
- imports: [IgxRadioComponent, IgxRadioGroupDirective, NgFor, FormsModule]
+ @for (item of seasons; track item) {
+
+ {{item}}
+
+ }
+
+ `,
+ imports: [IgxRadioComponent, IgxRadioGroupDirective, FormsModule]
})
class RadioGroupWithModelComponent {
@ViewChild('radioGroupSeasons', { read: IgxRadioGroupDirective, static: true }) public radioGroup: IgxRadioGroupDirective;
@@ -358,13 +363,15 @@ class RadioGroupWithModelComponent {
template: `
`,
- imports: [IgxRadioComponent, IgxRadioGroupDirective, NgFor, ReactiveFormsModule]
+ imports: [IgxRadioComponent, IgxRadioGroupDirective, ReactiveFormsModule]
})
class RadioGroupReactiveFormsComponent {
public seasons = [
@@ -410,13 +417,15 @@ class RadioGroupReactiveFormsComponent {
template: `
`,
- imports: [IgxRadioComponent, IgxRadioGroupDirective, NgFor, ReactiveFormsModule]
+ imports: [IgxRadioComponent, IgxRadioGroupDirective, ReactiveFormsModule]
})
class RadioGroupDeepProjectionComponent {
diff --git a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.html b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.html
index 5d582b8c918..ea1e07c9c46 100644
--- a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.html
+++ b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.html
@@ -4,10 +4,10 @@
(opening)="onToggleOpening($event)" (opened)="onToggleOpened()"
(closing)="onToggleClosing($event)" (closed)="onToggleClosed()">
-
+ [style.height]="height"
+ [style.maxHeight]="maxHeight">
+ @if (!collapsed) {
-
+ }
diff --git a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.spec.ts b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.spec.ts
index 62440af898b..6ce79bc3fc3 100644
--- a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.spec.ts
+++ b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.spec.ts
@@ -16,7 +16,6 @@ import { IgxForOfDirective } from '../directives/for-of/for_of.directive';
import { IgxDropDownItemBaseDirective } from './drop-down-item.base';
import { IgxSelectionAPIService } from '../core/selection';
import { IgxButtonDirective } from '../directives/button/button.directive';
-import { NgFor } from '@angular/common';
import { ConnectedPositioningStrategy, HorizontalAlignment, OverlaySettings, VerticalAlignment } from '../services/public_api';
const CSS_CLASS_DROP_DOWN_BASE = 'igx-drop-down';
@@ -1298,12 +1297,14 @@ describe('IgxDropDown ', () => {
template: `
-
- {{item.field}}
-
+ [allowItemsFocus]="true" style="--ig-size: var(--ig-size-medium);">
+ @for (item of items; track item) {
+
+ {{item.field}}
+
+ }
`,
- imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, NgFor]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective]
})
class IgxDropDownTestComponent {
@@ -1337,17 +1338,21 @@ class IgxDropDownTestComponent {
template: `
-
- {{ item.field }}
-
+ @for (item of items; track item) {
+
+ {{ item.field }}
+
+ }
-
- {{ item.field }}
-
+ @for (item of items; track item) {
+
+ {{ item.field }}
+
+ }
`,
- imports: [IgxDropDownComponent, IgxDropDownItemComponent, NgFor]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent]
})
class DoubleIgxDropDownComponent implements OnInit {
@@ -1396,13 +1401,15 @@ class DoubleIgxDropDownComponent implements OnInit {
-
- {{ item.field }}
-
+ (opening)="onToggleOpening()" (opened)="onToggleOpened()"
+ (closing)="onToggleClosing()" (closed)="onToggleClosed()" [width]="'400px'" [height]="'400px'">
+ @for (item of items; track item) {
+
+ {{ item.field }}
+
+ }
`,
- imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxTabsComponent, IgxTabItemComponent, IgxTabHeaderComponent, IgxTabContentComponent, NgFor]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, IgxTabsComponent, IgxTabItemComponent, IgxTabHeaderComponent, IgxTabContentComponent]
})
class IgxDropDownAnchorTestComponent {
@ViewChild(IgxTabsComponent, { static: true })
@@ -1434,11 +1441,13 @@ class IgxDropDownAnchorTestComponent {
@Component({
template: `
-
- {{ item.field }}
-
+ @for (item of items; track item) {
+
+ {{ item.field }}
+
+ }
`,
- imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective, NgFor]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownItemNavigationDirective]
})
class InputWithDropDownDirectiveComponent {
@ViewChild(IgxDropDownComponent, { read: IgxDropDownComponent, static: true })
@@ -1457,13 +1466,17 @@ class InputWithDropDownDirectiveComponent {
@Component({
template: `
-
-
- {{ child.name }}
-
-
+ @for (parent of data; track parent) {
+
+ @for (child of parent.children; track child) {
+
+ {{ child.name }}
+
+ }
+
+ }
`,
- imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownGroupComponent, NgFor]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxDropDownGroupComponent]
})
class GroupDropDownComponent {
@ViewChild(IgxDropDownComponent, { read: IgxDropDownComponent, static: true })
diff --git a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.ts b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.ts
index d40ae93e004..30d8ccab1eb 100644
--- a/projects/igniteui-angular/src/lib/drop-down/drop-down.component.ts
+++ b/projects/igniteui-angular/src/lib/drop-down/drop-down.component.ts
@@ -30,7 +30,7 @@ import { IgxDropDownItemBaseDirective } from './drop-down-item.base';
import { IgxForOfToken } from '../directives/for-of/for_of.directive';
import { take } from 'rxjs/operators';
import { OverlaySettings } from '../services/overlay/utilities';
-import { DOCUMENT, NgIf } from '@angular/common';
+import { DOCUMENT } from '@angular/common';
import { ConnectedPositioningStrategy } from '../services/public_api';
/**
@@ -54,7 +54,7 @@ import { ConnectedPositioningStrategy } from '../services/public_api';
selector: 'igx-drop-down',
templateUrl: './drop-down.component.html',
providers: [{ provide: IGX_DROPDOWN_BASE, useExisting: IgxDropDownComponent }],
- imports: [IgxToggleDirective, NgIf]
+ imports: [IgxToggleDirective]
})
export class IgxDropDownComponent extends IgxDropDownBaseDirective implements IDropDownBase, OnChanges, AfterViewInit, OnDestroy {
/**
diff --git a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.html b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.html
index abdf2d1d6bf..685d574bce9 100644
--- a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.html
+++ b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.html
@@ -6,12 +6,15 @@
-
-
-
+ @if (iconTemplate) {
+
+ }
+ @if (!iconTemplate) {
+
+
+ }
diff --git a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.ts b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.ts
index 9f6649582ad..a3702617f75 100644
--- a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.ts
+++ b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel-header.component.ts
@@ -17,7 +17,6 @@ import { IgxExpansionPanelIconDirective } from './expansion-panel.directives';
import { IGX_EXPANSION_PANEL_COMPONENT, IgxExpansionPanelBase, IExpansionPanelCancelableEventArgs } from './expansion-panel.common';
import { mkenum } from '../core/utils';
import { IgxIconComponent } from '../icon/icon.component';
-import { NgIf } from '@angular/common';
/**
* @hidden
@@ -33,7 +32,7 @@ export type ExpansionPanelHeaderIconPosition = (typeof ExpansionPanelHeaderIconP
@Component({
selector: 'igx-expansion-panel-header',
templateUrl: 'expansion-panel-header.component.html',
- imports: [NgIf, IgxIconComponent]
+ imports: [IgxIconComponent]
})
export class IgxExpansionPanelHeaderComponent {
/**
diff --git a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.html b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.html
index 78902268be3..da28c2f0e1e 100644
--- a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.html
+++ b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.html
@@ -1,2 +1,4 @@
-
+@if (!collapsed) {
+
+}
diff --git a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.ts b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.ts
index f2f643adb21..dbbf42b64ae 100644
--- a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.ts
+++ b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.component.ts
@@ -22,7 +22,6 @@ import {
IGX_EXPANSION_PANEL_COMPONENT
} from './expansion-panel.common';
import { ToggleAnimationPlayer, ToggleAnimationSettings } from './toggle-animation-component';
-import { NgIf } from '@angular/common';
let NEXT_ID = 0;
@@ -30,7 +29,7 @@ let NEXT_ID = 0;
selector: 'igx-expansion-panel',
templateUrl: 'expansion-panel.component.html',
providers: [{ provide: IGX_EXPANSION_PANEL_COMPONENT, useExisting: IgxExpansionPanelComponent }],
- imports: [NgIf]
+ imports: []
})
export class IgxExpansionPanelComponent extends ToggleAnimationPlayer implements IgxExpansionPanelBase, AfterContentInit {
/**
diff --git a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.spec.ts b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.spec.ts
index 5b8d1fb1c26..c743e019df5 100644
--- a/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.spec.ts
+++ b/projects/igniteui-angular/src/lib/expansion-panel/expansion-panel.spec.ts
@@ -11,7 +11,6 @@ import { By } from '@angular/platform-browser';
import { IgxExpansionPanelBodyComponent } from './expansion-panel-body.component';
import { IgxListComponent } from '../list/list.component';
import { IgxListItemComponent } from '../list/list-item.component';
-import { NgIf } from '@angular/common';
import { IGX_EXPANSION_PANEL_DIRECTIVES } from './public_api';
const CSS_CLASS_EXPANSION_PANEL = 'igx-expansion-panel';
@@ -1364,19 +1363,27 @@ export class IgxExpansionPanelListComponent {
-
- Example Title
- Example Description
-
- TEST_ICON
-
-
-
- Example body
-
+ @if (showHeader) {
+
+ @if (showTitle) {
+ Example Title
+ }
+ Example Description
+ @if (customIcon) {
+
+ TEST_ICON
+
+ }
+
+ }
+ @if (showBody) {
+
+ Example body
+
+ }
`,
- imports: [IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelBodyComponent, IgxExpansionPanelTitleDirective, IgxExpansionPanelDescriptionDirective, IgxExpansionPanelIconDirective, NgIf]
+ imports: [IgxExpansionPanelComponent, IgxExpansionPanelHeaderComponent, IgxExpansionPanelBodyComponent, IgxExpansionPanelTitleDirective, IgxExpansionPanelDescriptionDirective, IgxExpansionPanelIconDirective]
})
export class IgxExpansionPanelSampleComponent {
@ViewChild(IgxExpansionPanelHeaderComponent, { read: IgxExpansionPanelHeaderComponent })
diff --git a/projects/igniteui-angular/src/lib/grids/cell.component.html b/projects/igniteui-angular/src/lib/grids/cell.component.html
index 47531b44d61..b6f3f84656c 100644
--- a/projects/igniteui-angular/src/lib/grids/cell.component.html
+++ b/projects/igniteui-angular/src/lib/grids/cell.component.html
@@ -1,37 +1,38 @@
- {{ grid.resourceStrings.igx_grid_pinned_row_indicator }}
+ @if (displayPinnedChip) {
+ {{ grid.resourceStrings.igx_grid_pinned_row_indicator }}
+ }
-
-
+}
-
- {{grid.resourceStrings.igx_grid_required_validation_error}}
-
-
- {{grid.resourceStrings.igx_grid_min_length_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.minlength.requiredLength }}
-
-
- {{grid.resourceStrings.igx_grid_max_length_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.maxlength.requiredLength }}
-
-
- {{grid.resourceStrings.igx_grid_min_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.min.min }}
-
-
- {{grid.resourceStrings.igx_grid_max_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.max.max }}
-
-
- {{grid.resourceStrings.igx_grid_email_validation_error }}
-
-
- {{grid.resourceStrings.igx_grid_pattern_validation_error}}
-
+ @if (formGroup?.get(column?.field).errors?.['required']) {
+
+ {{grid.resourceStrings.igx_grid_required_validation_error}}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['minlength']) {
+
+ {{grid.resourceStrings.igx_grid_min_length_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.minlength.requiredLength }}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['maxlength']) {
+
+ {{grid.resourceStrings.igx_grid_max_length_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.maxlength.requiredLength }}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['min']) {
+
+ {{grid.resourceStrings.igx_grid_min_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.min.min }}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['max']) {
+
+ {{grid.resourceStrings.igx_grid_max_validation_error | igxStringReplace:'{0}':formGroup.get(column.field).errors.max.max }}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['email']) {
+
+ {{grid.resourceStrings.igx_grid_email_validation_error }}
+
+ }
+ @if (formGroup?.get(column?.field).errors?.['pattern']) {
+
+ {{grid.resourceStrings.igx_grid_pattern_validation_error}}
+
+ }
diff --git a/projects/igniteui-angular/src/lib/grids/cell.component.ts b/projects/igniteui-angular/src/lib/grids/cell.component.ts
index 53f64a97360..eaacd3064e5 100644
--- a/projects/igniteui-angular/src/lib/grids/cell.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/cell.component.ts
@@ -19,7 +19,7 @@
AfterViewInit,
booleanAttribute
} from '@angular/core';
-import { formatPercent, NgIf, NgClass, NgTemplateOutlet, DecimalPipe, PercentPipe, CurrencyPipe, DatePipe, getLocaleCurrencyCode, getCurrencySymbol } from '@angular/common';
+import { formatPercent, NgClass, NgTemplateOutlet, DecimalPipe, PercentPipe, CurrencyPipe, DatePipe, getLocaleCurrencyCode, getCurrencySymbol } from '@angular/common';
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import { first, takeUntil, takeWhile } from 'rxjs/operators';
@@ -72,7 +72,6 @@ import { IgxChipComponent } from '../chips/chip.component';
templateUrl: './cell.component.html',
providers: [HammerGesturesManager],
imports: [
- NgIf,
NgClass,
NgTemplateOutlet,
DecimalPipe,
diff --git a/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.html b/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.html
index 35455cf958d..071b64a2ac8 100644
--- a/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.html
+++ b/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.html
@@ -1,30 +1,37 @@
-
{{ title }}
+ @if (title) {
+ {{ title }}
+ }
-
-
-
+ @if (!hideFilter) {
+
+
+
+ }
-
- {{ column.header || column.field }}
-
+ @for (
+ column of $any(grid)?._columns
+ | columnActionEnabled:actionsDirective.actionEnabledColumnsFilter:pipeTrigger
+ | filterActionColumns:filterCriteria:pipeTrigger
+ | sortActionColumns:columnDisplayOrder:pipeTrigger; track column
+ ) {
+
+ {{ column.header || column.field }}
+
+ }
diff --git a/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.ts b/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.ts
index 2c2c6075c55..43c6c34b0dd 100644
--- a/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/column-actions/column-actions.component.ts
@@ -9,7 +9,6 @@ import { IgxButtonDirective } from '../../directives/button/button.directive';
import { IgxInputDirective } from '../../directives/input/input.directive';
import { FormsModule } from '@angular/forms';
import { IgxInputGroupComponent } from '../../input-group/input-group.component';
-import { NgIf, NgFor } from '@angular/common';
let NEXT_ID = 0;
/**
@@ -21,7 +20,7 @@ let NEXT_ID = 0;
@Component({
selector: 'igx-column-actions',
templateUrl: './column-actions.component.html',
- imports: [NgIf, IgxInputGroupComponent, FormsModule, IgxInputDirective, NgFor, IgxCheckboxComponent, IgxButtonDirective, IgxRippleDirective, forwardRef(() => IgxColumnActionEnabledPipe), forwardRef(() => IgxFilterActionColumnsPipe), forwardRef(() => IgxSortActionColumnsPipe)]
+ imports: [IgxInputGroupComponent, FormsModule, IgxInputDirective, IgxCheckboxComponent, IgxButtonDirective, IgxRippleDirective, forwardRef(() => IgxColumnActionEnabledPipe), forwardRef(() => IgxFilterActionColumnsPipe), forwardRef(() => IgxSortActionColumnsPipe)]
})
export class IgxColumnActionsComponent implements DoCheck {
diff --git a/projects/igniteui-angular/src/lib/grids/columns/column.component.ts b/projects/igniteui-angular/src/lib/grids/columns/column.component.ts
index 281b6ad7d93..9333d911c50 100644
--- a/projects/igniteui-angular/src/lib/grids/columns/column.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/columns/column.component.ts
@@ -2182,8 +2182,11 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
grid._pinnedColumns.splice(args.insertAtIndex, 0, this);
} else {
// insert based only on root collection
- rootPinnedCols.splice(args.insertAtIndex, 0, this);
+ if (this.level === 0) {
+ rootPinnedCols.splice(args.insertAtIndex, 0, this);
+ }
let allPinned = [];
+ // FIX: this is duplicated on every step in the hierarchy....
// re-create hierarchy
rootPinnedCols.forEach(group => {
allPinned.push(group);
diff --git a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts
index 782f5276ec1..f0ea80c2def 100644
--- a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts
+++ b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts
@@ -302,13 +302,13 @@ export interface FieldType {
header?: string;
/* alternateType: GridColumnDataType */
dataType: DataType;
- editorOptions: IFieldEditorOptions;
- filters: IgxFilteringOperand;
- pipeArgs: IFieldPipeArgs;
- defaultTimeFormat: string;
- defaultDateTimeFormat: string;
+ editorOptions?: IFieldEditorOptions;
+ filters?: IgxFilteringOperand;
+ pipeArgs?: IFieldPipeArgs;
+ defaultTimeFormat?: string;
+ defaultDateTimeFormat?: string;
- formatter(value: any, rowData?: any): any;
+ formatter?(value: any, rowData?: any): any;
}
/**
@@ -1490,3 +1490,11 @@ export interface IClipboardOptions {
*/
separator: string;
}
+
+/**
+ * An interface describing entity
+ */
+export interface EntityType {
+ name: string;
+ fields: FieldType[];
+}
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.html b/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.html
index 215cd1bc9fc..eb11d0aaa6c 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.html
@@ -1,35 +1,38 @@
-
-
-
-
-
+@if (grid) {
+
+
+
+
+
-
-
+
+
+}
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.ts b/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.ts
index ae4bb8e1b74..3a733ddd475 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.ts
@@ -12,7 +12,7 @@ import { GridResourceStringsEN } from '../../../core/i18n/grid-resources';
import { IFilteringExpressionsTree } from '../../../data-operations/filtering-expressions-tree';
import { IgxButtonDirective } from '../../../directives/button/button.directive';
import { IgxQueryBuilderHeaderComponent } from '../../../query-builder/query-builder-header.component';
-import { NgIf, NgClass } from '@angular/common';
+import { NgClass } from '@angular/common';
import { getCurrentResourceStrings } from '../../../core/i18n/resources';
import { QueryBuilderResourceStringsEN } from '../../../core/i18n/query-builder-resources';
@@ -30,7 +30,7 @@ import { QueryBuilderResourceStringsEN } from '../../../core/i18n/query-builder-
@Component({
selector: 'igx-advanced-filtering-dialog',
templateUrl: './advanced-filtering-dialog.component.html',
- imports: [NgIf, IgxDragDirective, NgClass, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxDragHandleDirective, IgxButtonDirective]
+ imports: [IgxDragDirective, NgClass, IgxQueryBuilderComponent, IgxQueryBuilderHeaderComponent, IgxDragHandleDirective, IgxButtonDirective]
})
export class IgxAdvancedFilteringDialogComponent implements AfterViewInit, OnDestroy {
/**
@@ -130,9 +130,7 @@ export class IgxAdvancedFilteringDialogComponent implements AfterViewInit, OnDes
public onKeyDown(eventArgs: KeyboardEvent) {
eventArgs.stopPropagation();
const key = eventArgs.key;
- if (this.queryBuilder.isContextMenuVisible && (key === this.platform.KEYMAP.ESCAPE)) {
- this.queryBuilder.clearSelection();
- } else if (key === this.platform.KEYMAP.ESCAPE) {
+ if (key === this.platform.KEYMAP.ESCAPE) {
this.closeDialog();
}
}
@@ -193,6 +191,20 @@ export class IgxAdvancedFilteringDialogComponent implements AfterViewInit, OnDes
this.closeDialog();
}
+
+ /**
+ * @hidden @internal
+ */
+ public generateEntity() {
+ const entities = [
+ {
+ name: null,
+ fields: this.filterableFields
+ }
+ ];
+ return entities;
+ }
+
private assignResourceStrings() {
// If grid has custom resource strings set for the advanced filtering,
// they are passed to the query builder resource strings.
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.html b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.html
index f3b49671574..3fb62f3b3b1 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.html
@@ -14,23 +14,28 @@
-
-
-
-
-
- {{filteringService.getChipLabel(item.expression)}}
-
-
- {{filteringService.getOperatorAsString(item.afterOperator)}}
-
+
+ @for (item of expressionsList; track item.expression; let last = $last; let index = $index) {
+ @if (isChipVisible(index)) {
+
+
+
+
+ {{filteringService.getChipLabel(item.expression)}}
+
+
+ }
+ @if (!last && isChipVisible(index + 1)) {
+ {{filteringService.getOperatorAsString(item.afterOperator)}}
+ }
+ }
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.ts b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.ts
index 620d99b1c5e..a2b08705437 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-cell.component.ts
@@ -18,7 +18,7 @@ import { IgxChipsAreaComponent } from '../../../chips/chips-area.component';
import { IBaseChipEventArgs, IgxChipComponent } from '../../../chips/chip.component';
import { ColumnType } from '../../common/grid.interface';
import { IgxBadgeComponent } from '../../../badge/badge.component';
-import { NgFor, NgIf, NgClass, NgTemplateOutlet } from '@angular/common';
+import { NgClass, NgTemplateOutlet } from '@angular/common';
import { IgxPrefixDirective } from '../../../directives/prefix/prefix.directive';
import { IgxIconComponent } from '../../../icon/icon.component';
import { Size } from '../../common/enums';
@@ -35,8 +35,6 @@ import { Size } from '../../common/enums';
IgxChipComponent,
IgxIconComponent,
IgxPrefixDirective,
- NgFor,
- NgIf,
NgClass,
IgxBadgeComponent,
NgTemplateOutlet
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.html b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.html
index 03728071432..48bf1c5c0a1 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.html
@@ -1,13 +1,15 @@
-
-
-
- {{ translateCondition(condition) }}
-
-
+ @for (condition of conditions; track condition) {
+
+
+
+ {{ translateCondition(condition) }}
+
+
+ }
@@ -34,22 +36,24 @@
(compositionend)="onCompositionEnd()"
(keydown)="onInputKeyDown($event)"
(keyup)="onInputKeyUp()"/>
-
-
-
-
-
-
+ @if (value || value === 0) {
+
+
+
+
+
+
+ }
@@ -75,22 +79,24 @@
[igxDropDownItemNavigation]="inputGroupConditions">
-
-
-
-
-
-
+ @if (value) {
+
+
+
+
+
+
+ }
@@ -120,22 +126,24 @@
[igxDropDownItemNavigation]="inputGroupConditions">
-
-
-
-
-
-
+ @if (value) {
+
+
+
+
+
+
+ }
@@ -166,7 +174,8 @@
(click)="onInputClick()"
(keydown)="onInputKeyDown($event)"
(keyup)="onInputKeyUp()"/>
-
+ @if (value || value === 0) {
+
+ }
-
+@if (showArrows) {
+
+}
-
-
-
-
-
- {{filteringService.getChipLabel(item.expression)}}
-
-
-
-
-
- {{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}
- {{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}
-
-
-
+
+
+ @for (item of expressionsList; track item.expression; let i = $index; let last = $last) {
+
+
+
+
+ {{filteringService.getChipLabel(item.expression)}}
+
+ @if (!last) {
+
+
+
+ {{filteringService.grid.resourceStrings.igx_grid_filter_operator_and}}
+ {{filteringService.grid.resourceStrings.igx_grid_filter_operator_or}}
+
+
+ }
+
+ }
-
+@if (showArrows) {
+
+}
-
+ @if (!isNarrowWidth) {
-
-
+ }
+ @if (isNarrowWidth) {
-
+ }
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.ts b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.ts
index c816e840053..ef7ab4f3b0a 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/base/grid-filtering-row.component.ts
@@ -43,7 +43,7 @@ import { IgxDropDownItemNavigationDirective } from '../../../drop-down/drop-down
import { IgxPrefixDirective } from '../../../directives/prefix/prefix.directive';
import { IgxInputGroupComponent } from '../../../input-group/input-group.component';
import { IgxIconComponent } from '../../../icon/icon.component';
-import { NgFor, NgIf, NgTemplateOutlet, NgClass } from '@angular/common';
+import { NgTemplateOutlet, NgClass } from '@angular/common';
import { IgxIconButtonDirective } from '../../../directives/button/icon-button.directive';
import { Size } from '../../common/enums';
@@ -54,7 +54,7 @@ import { Size } from '../../common/enums';
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'igx-grid-filtering-row',
templateUrl: './grid-filtering-row.component.html',
- imports: [NgFor, IgxDropDownComponent, IgxDropDownItemComponent, IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxInputGroupComponent, IgxPrefixDirective, IgxDropDownItemNavigationDirective, IgxInputDirective, NgIf, IgxSuffixDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, IgxButtonDirective, NgClass, IgxRippleDirective, IgxIconButtonDirective]
+ imports: [IgxDropDownComponent, IgxDropDownItemComponent, IgxChipsAreaComponent, IgxChipComponent, IgxIconComponent, IgxInputGroupComponent, IgxPrefixDirective, IgxDropDownItemNavigationDirective, IgxInputDirective, IgxSuffixDirective, IgxDatePickerComponent, IgxPickerToggleComponent, IgxPickerClearComponent, IgxTimePickerComponent, IgxDateTimeEditorDirective, NgTemplateOutlet, IgxButtonDirective, NgClass, IgxRippleDirective, IgxIconButtonDirective]
})
export class IgxGridFilteringRowComponent implements AfterViewInit, OnDestroy {
@Input()
@@ -87,14 +87,8 @@ export class IgxGridFilteringRowComponent implements AfterViewInit, OnDestroy {
this.expression.searchVal = null;
this._value = null;
const index = this.expressionsList.findIndex(item => item.expression === this.expression);
- if (index === 0 && this.expressionsList.length === 1) {
+ if (index === 0 && this.expressionsList.length === 1 && !this.expression.condition.isUnary) {
this.filteringService.clearFilter(this.column.field);
-
- if (this.expression.condition.isUnary) {
- this.resetExpression(this.expression.condition.name);
- }
-
- return;
}
} else {
if (val === '') {
@@ -789,6 +783,7 @@ export class IgxGridFilteringRowComponent implements AfterViewInit, OnDestroy {
this.expression = {
fieldName: this.column.field,
condition: null,
+ conditionName: null,
searchVal: null,
ignoreCase: this.column.filteringIgnoreCase
};
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/common.ts b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/common.ts
index eb7c55928e8..d48448c1f46 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/common.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/common.ts
@@ -1,5 +1,6 @@
+import { isTree } from '../../../data-operations/expressions-tree-util';
import { FilteringLogic, IFilteringExpression } from '../../../data-operations/filtering-expression.interface';
-import { FilteringExpressionsTree, IFilteringExpressionsTree } from '../../../data-operations/filtering-expressions-tree';
+import { IFilteringExpressionsTree } from '../../../data-operations/filtering-expressions-tree';
/**
* @hidden @internal
@@ -20,11 +21,17 @@ export class FilterListItem {
* @hidden
*/
export class ExpressionUI {
+ public expressionId: string;
public expression: IFilteringExpression;
public beforeOperator: FilteringLogic;
public afterOperator: FilteringLogic;
public isSelected = false;
public isVisible = true;
+
+ constructor() {
+ // Use IDs to identify expressions clearly and use to track them in template @for cycles.
+ this.expressionId = crypto.randomUUID();
+ }
}
/**
@@ -55,17 +62,16 @@ function generateExpressionsListRecursive(expressions: IFilteringExpressionsTree
return;
}
- if (expressions instanceof FilteringExpressionsTree) {
- const expressionsTree = expressions as FilteringExpressionsTree;
- for (const operand of expressionsTree.filteringOperands) {
- generateExpressionsListRecursive(operand, expressionsTree.operator, expressionsUIs);
+ if (isTree(expressions)) {
+ for (const operand of expressions.filteringOperands) {
+ generateExpressionsListRecursive(operand, expressions.operator, expressionsUIs);
}
if (expressionsUIs.length) {
expressionsUIs[expressionsUIs.length - 1].afterOperator = operator;
}
} else {
const exprUI = new ExpressionUI();
- exprUI.expression = expressions as IFilteringExpression;
+ exprUI.expression = expressions;
exprUI.afterOperator = operator;
const prevExprUI = expressionsUIs[expressionsUIs.length - 1];
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.html b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.html
index e4745fc79d4..a724862428e 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.html
@@ -1,10 +1,12 @@
-
- {{ esf.grid.resourceStrings.igx_grid_excel_filter_clear }}
-
-
+@if (esf.column) {
+
+ {{ esf.grid.resourceStrings.igx_grid_excel_filter_clear }}
+
+
+}
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.ts b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.ts
index 2a78c304f0e..65449e4ad25 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-clear-filters.component.ts
@@ -2,7 +2,7 @@ import { Component } from '@angular/core';
import { PlatformUtil } from '../../../core/utils';
import { BaseFilteringComponent } from './base-filtering.component';
import { IgxIconComponent } from '../../../icon/icon.component';
-import { NgIf, NgClass } from '@angular/common';
+import { NgClass } from '@angular/common';
/**
* A component used for presenting Excel style clear filters UI.
@@ -10,7 +10,7 @@ import { NgIf, NgClass } from '@angular/common';
@Component({
selector: 'igx-excel-style-clear-filters',
templateUrl: './excel-style-clear-filters.component.html',
- imports: [NgIf, NgClass, IgxIconComponent]
+ imports: [NgClass, IgxIconComponent]
})
export class IgxExcelStyleClearFiltersComponent {
constructor(
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.html b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.html
index 6aa4f2f8a8c..0e10c481086 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.html
@@ -1,4 +1,4 @@
-
+@if (esf.column) {
0 ? 'igx-excel-filter__actions-filter--active' : ''"
@@ -9,7 +9,10 @@
aria-haspopup="true"
[attr.aria-controls]="this.subMenu?.listId"
[attr.aria-activedescendant]="!this.subMenu?.collapsed ? this.subMenu?.focusedItem?.id : null">
- {{ subMenuText }} 0">({{filterNumber}})
+
+ {{ subMenuText }}
+ @if (filterNumber > 0) { ({{filterNumber}}) }
+
@@ -19,22 +22,25 @@
(selectionChanging)="onSubMenuSelection($event)"
(closed)="onSubMenuClosed()">
-
-
-
- {{ translateCondition(condition) }}
-
-
-
-
-
- {{ esf.grid.resourceStrings.igx_grid_excel_custom_filter }}
-
-
+ @for (condition of conditions; track condition) {
+
+
+
+ {{ translateCondition(condition) }}
+
+
+ }
+ @if (showCustomFilterItem()) {
+
+
+
+ {{ esf.grid.resourceStrings.igx_grid_excel_custom_filter }}
+
+
+ }
@@ -44,4 +50,4 @@
[filteringService]="esf.grid.filteringService"
[overlayComponentId]="esf.overlayComponentId">
-
+}
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.ts b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.ts
index 4cbd41d7e25..fa35a644bd1 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.ts
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.ts
@@ -14,7 +14,7 @@ import { IgxDropDownItemComponent } from '../../../drop-down/drop-down-item.comp
import { IgxDropDownComponent } from '../../../drop-down/drop-down.component';
import { IgxIconComponent } from '../../../icon/icon.component';
import { IgxDropDownItemNavigationDirective } from '../../../drop-down/drop-down-navigation.directive';
-import { NgIf, NgFor, NgClass } from '@angular/common';
+import { NgClass } from '@angular/common';
import { ISelectionEventArgs } from '../../../drop-down/drop-down.common';
@@ -24,7 +24,7 @@ import { ISelectionEventArgs } from '../../../drop-down/drop-down.common';
@Component({
selector: 'igx-excel-style-conditional-filter',
templateUrl: './excel-style-conditional-filter.component.html',
- imports: [NgIf, NgClass, IgxDropDownItemNavigationDirective, IgxIconComponent, IgxDropDownComponent, NgFor, IgxDropDownItemComponent, IgxExcelStyleCustomDialogComponent]
+ imports: [NgClass, IgxDropDownItemNavigationDirective, IgxIconComponent, IgxDropDownComponent, IgxDropDownItemComponent, IgxExcelStyleCustomDialogComponent]
})
export class IgxExcelStyleConditionalFilterComponent implements OnDestroy {
/**
diff --git a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.html b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.html
index 419d11d42cb..9998443fd1f 100644
--- a/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.html
+++ b/projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.html
@@ -14,29 +14,33 @@
-
-
-
-
+ @if (column.dataType === 'date' || column.dataType === 'dateTime' || column.dataType === 'time') {
+ @for (expression of expressionsList; track expression.expressionId) {
+
+
+ }
+ }
-
-
-
-
+ @if (column.dataType !== 'date' && column.dataType !== 'dateTime' && column.dataType !== 'time') {
+ @for (expression of expressionsList; track expression.expressionId) {
+
+
+ }
+ }