diff --git a/.gitignore b/.gitignore
index e8a27ca74c..6bccead26a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,5 @@ cypress/screenshots
cypress/downloads/*
cypress/tests/__image_snapshots__
.cursorignore
+.cursorrules
+.venv/
diff --git a/angular.json b/angular.json
index 638b0508ba..d170ab9882 100644
--- a/angular.json
+++ b/angular.json
@@ -232,7 +232,8 @@
}
],
"styles": [
- "projects/hslayers/css/hslayers-ng.scss"
+ "projects/hslayers/css/hslayers-ng.scss",
+ "projects/test-app/custom-fa-icons.css"
],
"scripts": [],
"customWebpackConfig": {
diff --git a/cypress/tests/layer-editor.cy.ts b/cypress/tests/layer-editor.cy.ts
index 378fd50275..e355ec492f 100644
--- a/cypress/tests/layer-editor.cy.ts
+++ b/cypress/tests/layer-editor.cy.ts
@@ -7,7 +7,7 @@ describe('Hslayers application', () => {
});
it('Should not be possible to change base/thematic type for vector layer', () => {
- cy.get('[data-test="Points"] span.icon-settingsthree-gears ').click();
+ cy.get('[data-test="Points"] span.fa-gears ').click();
cy.get('hs-layer-editor form').within(() => {
cy.get('hs-layer-type-switcher-widget').should('exist');
cy.get('hs-layer-type-switcher-widget div').should('not.exist');
@@ -15,14 +15,14 @@ describe('Hslayers application', () => {
});
it('Should be possible to find base/thematic type toggle for WMS layer', () => {
- cy.get('[data-test="EVI"] span.icon-settingsthree-gears ').click();
+ cy.get('[data-test="EVI"] span.fa-gears ').click();
cy.get('hs-layer-editor form').within(() => {
cy.get('hs-layer-type-switcher-widget div').should('exist');
});
});
it.only('Should be possible to change type of WMS layer back and forth', () => {
- cy.get('[data-test="EVI"] span.icon-settingsthree-gears ').click();
+ cy.get('[data-test="EVI"] span.fa-gears ').click();
//Change to BASE
cy.get('hs-layer-editor form hs-layer-type-switcher-widget div')
diff --git a/cypress/tests/layermanager.cy.ts b/cypress/tests/layermanager.cy.ts
index 4e381aa287..6244d6989f 100644
--- a/cypress/tests/layermanager.cy.ts
+++ b/cypress/tests/layermanager.cy.ts
@@ -78,7 +78,7 @@ describe('Hslayers application', () => {
//Enable EVI layer and zoom to its extent
cy.get('[data-test="EVI"] button.hs-lm-item-visibility').click();
cy.wait(2000);
- cy.get('[data-test="EVI"] span.icon-settingsthree-gears ').click();
+ cy.get('[data-test="EVI"] span.fa-gears ').click();
cy.get('.card-footer button[title="Zoom to layer"]').click();
/**
@@ -92,7 +92,7 @@ describe('Hslayers application', () => {
//Zoom to different layer
cy.get(
- '[data-test="Latvian municipalities (1 sub-layer)"] span.icon-settingsthree-gears ',
+ '[data-test="Latvian municipalities (1 sub-layer)"] span.fa-gears ',
).click();
cy.get('.card-footer button[title="Zoom to layer"]').click();
@@ -102,7 +102,7 @@ describe('Hslayers application', () => {
throw new Error('UNexpected getMap request was intercepted.');
} else {
//Ignore extent eg. allow requests to be made no matter the extent
- cy.get('[data-test="EVI"] span.icon-settingsthree-gears ').click();
+ cy.get('[data-test="EVI"] span.fa-gears ').click();
cy.get(
'hs-layer-editor hs-extent-widget #hs-layer-extent-toggle',
).click();
diff --git a/cypress/tests/sidebar.cy.ts b/cypress/tests/sidebar.cy.ts
index f30736b442..133e089198 100644
--- a/cypress/tests/sidebar.cy.ts
+++ b/cypress/tests/sidebar.cy.ts
@@ -46,12 +46,12 @@ describe('Hslayers application', () => {
/**
* This changes based on current test-app config
*/
- it('Only 9 sidebar panels should be visible', () => {
+ it('Only 6 sidebar panels should be visible', () => {
cy.viewport(600, 1000);
// Wait for the layout to update
cy.wait(500);
cy.get('hs-sidebar span.hs-sidebar-item:not(.hs-panel-hidden)')
.its('length')
- .should('equal', 9);
+ .should('equal', 6);
});
});
diff --git a/package-lock.json b/package-lock.json
index 8fc924c1ba..9c5f21e9ab 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -67,6 +67,7 @@
"@compodoc/compodoc": "^1.1.26",
"@cypress/schematic": "^3.0.0",
"@eslint/compat": "^1.2.6",
+ "@fortawesome/fontawesome-free": "^6.7.2",
"@frsource/cypress-plugin-visual-regression-diff": "^3.2.14",
"@types/jasmine": "^5.1.5",
"@types/jasminewd2": "~2.0.12",
@@ -4139,6 +4140,16 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@fortawesome/fontawesome-free": {
+ "version": "6.7.2",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
+ "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==",
+ "dev": true,
+ "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@frsource/base64": {
"version": "1.0.17",
"resolved": "https://registry.npmjs.org/@frsource/base64/-/base64-1.0.17.tgz",
@@ -25417,4 +25428,4 @@
"license": "MIT AND BSD-3-Clause"
}
}
-}
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index a23094bc14..48acf0898e 100644
--- a/package.json
+++ b/package.json
@@ -41,7 +41,8 @@
"commit": "git-cz",
"deps-graph": "madge --exclude '.*(layer-extensions)\\.ts$' --dot projects/decoupling-test-app/src/hslayers-app/hslayers-app.module.ts > graph.gv",
"proxy": "cd ./projects/hslayers-server && node server.js -l",
- "prepare-release": "cd ./scripts && bump-version.sh"
+ "prepare-release": "cd ./scripts && bump-version.sh",
+ "subset-icons": "python projects/hslayers/css/icons/create-fa-icons.py"
},
"private": true,
"dependencies": {
@@ -104,6 +105,7 @@
"@compodoc/compodoc": "^1.1.26",
"@cypress/schematic": "^3.0.0",
"@eslint/compat": "^1.2.6",
+ "@fortawesome/fontawesome-free": "^6.7.2",
"@frsource/cypress-plugin-visual-regression-diff": "^3.2.14",
"@types/jasmine": "^5.1.5",
"@types/jasminewd2": "~2.0.12",
@@ -156,4 +158,4 @@
"path": false,
"fs": false
}
-}
+}
\ No newline at end of file
diff --git a/projects/hslayers-cesium/src/toggle-view/toggle-view.component.html b/projects/hslayers-cesium/src/toggle-view/toggle-view.component.html
index dde29c99b4..b4b684596d 100644
--- a/projects/hslayers-cesium/src/toggle-view/toggle-view.component.html
+++ b/projects/hslayers-cesium/src/toggle-view/toggle-view.component.html
@@ -2,6 +2,6 @@
-
+
-
\ No newline at end of file
+
diff --git a/projects/hslayers-sensors/src/components/sensors/partials/sensors.component.html b/projects/hslayers-sensors/src/components/sensors/partials/sensors.component.html
index e245cdb3b1..0f42a115fe 100644
--- a/projects/hslayers-sensors/src/components/sensors/partials/sensors.component.html
+++ b/projects/hslayers-sensors/src/components/sensors/partials/sensors.component.html
@@ -31,28 +31,28 @@
-
+
+
+
+
+
-
-
-@if (hsSensorsService.units.length > 0) {
-
- @for (unit of filterQuery(query); track unit) {
-
-
-
-
-
+ @if (hsSensorsService.units.length > 0) {
+
+ @for (unit of filterQuery(query); track unit) {
+
+
+
+
+
+ }
+
}
-
-}
-@else {
-
- {{'SENSORS.noUnitsFound' | translateHs}}
+ @else {
+
+ {{'SENSORS.noUnitsFound' | translateHs}}
+
+ }
+
}
-
-
-}
\ No newline at end of file
diff --git a/projects/hslayers-sensors/src/components/sensors/partials/unit-dialog.component.html b/projects/hslayers-sensors/src/components/sensors/partials/unit-dialog.component.html
index 94acc15290..49ea86b96c 100644
--- a/projects/hslayers-sensors/src/components/sensors/partials/unit-dialog.component.html
+++ b/projects/hslayers-sensors/src/components/sensors/partials/unit-dialog.component.html
@@ -70,7 +70,7 @@
[placeholder]="'COMMON.from' | translateHs" #d="ngbDatepicker"
[(ngModel)]="customInterval.fromTime" (dateSelect)="customIntervalChanged()" />
+ class="fa-solid fa-calendar">
@@ -79,7 +79,7 @@
[placeholder]="'COMMON.to' | translateHs" #d2="ngbDatepicker"
[(ngModel)]="customInterval.toTime" (dateSelect)="customIntervalChanged()" />
+ class="fa-solid fa-calendar">
@@ -87,4 +87,4 @@
-
\ No newline at end of file
+
diff --git a/projects/hslayers/common/add-to-map/add-to-map.component.ts b/projects/hslayers/common/add-to-map/add-to-map.component.ts
index c522121b03..695dba61da 100644
--- a/projects/hslayers/common/add-to-map/add-to-map.component.ts
+++ b/projects/hslayers/common/add-to-map/add-to-map.component.ts
@@ -15,7 +15,7 @@ import {TranslateCustomPipe} from 'hslayers-ng/services/language';
>
@if (!loading) {
- {{ 'COMMON.addToMap' | translateHs }}
+ {{ 'COMMON.addToMap' | translateHs }}
} @else {
diff --git a/projects/hslayers/common/clipboard-text/clipboard-text.component.ts b/projects/hslayers/common/clipboard-text/clipboard-text.component.ts
index 5d8bbd3860..edbcda6c1e 100644
--- a/projects/hslayers/common/clipboard-text/clipboard-text.component.ts
+++ b/projects/hslayers/common/clipboard-text/clipboard-text.component.ts
@@ -18,7 +18,11 @@ import {TranslateCustomPipe} from 'hslayers-ng/services/language';
[title]="'COMMON.copyToClipboard' | translateHs"
(click)="copyToClipBoard()"
>
-
+
`,
styles: `
@@ -42,7 +46,7 @@ export class HsClipboardTextComponent {
'COMMON.copyToClipboard',
'COMMON.copyToClipboardFailure',
{
- toastStyleClasses: 'bg-danger text-white',
+ type: 'danger',
},
);
return;
diff --git a/projects/hslayers/common/dialog-csw-layers/csw-layers-dialog.component.html b/projects/hslayers/common/dialog-csw-layers/csw-layers-dialog.component.html
index 55b1138561..ceac78d94b 100644
--- a/projects/hslayers/common/dialog-csw-layers/csw-layers-dialog.component.html
+++ b/projects/hslayers/common/dialog-csw-layers/csw-layers-dialog.component.html
@@ -21,7 +21,7 @@ {{'COMPOSITIONS.cswDialog.loadComposition' | translateHs
{{service.title}}
-
diff --git a/projects/hslayers/common/dialog-set-permissions/set-permissions.component.html b/projects/hslayers/common/dialog-set-permissions/set-permissions.component.html
index 2e8faae75a..ae27c816f4 100644
--- a/projects/hslayers/common/dialog-set-permissions/set-permissions.component.html
+++ b/projects/hslayers/common/dialog-set-permissions/set-permissions.component.html
@@ -24,7 +24,7 @@ {{'COMMON.selectAndSavePermissions' | translateHs}}: {{d
{{'COMMON.done' |
translateHs }}
-
+
}
@case ('error') {
@@ -39,4 +39,4 @@ {{'COMMON.selectAndSavePermissions' | translateHs}}: {{d
-
\ No newline at end of file
+
diff --git a/projects/hslayers/common/filters/add-filter-button/add-filter-button.component.html b/projects/hslayers/common/filters/add-filter-button/add-filter-button.component.html
index d27ecb1c68..dbbb81775e 100644
--- a/projects/hslayers/common/filters/add-filter-button/add-filter-button.component.html
+++ b/projects/hslayers/common/filters/add-filter-button/add-filter-button.component.html
@@ -2,7 +2,7 @@
-
+
@for (filter of filterOptions; track filter) {
diff --git a/projects/hslayers/common/filters/comparison-filter/comparison-filter.component.html b/projects/hslayers/common/filters/comparison-filter/comparison-filter.component.html
index e592ef0deb..f288310887 100644
--- a/projects/hslayers/common/filters/comparison-filter/comparison-filter.component.html
+++ b/projects/hslayers/common/filters/comparison-filter/comparison-filter.component.html
@@ -49,7 +49,7 @@
-
+
diff --git a/projects/hslayers/common/filters/filter.component.html b/projects/hslayers/common/filters/filter.component.html
index d4f61d6c16..686973ab1f 100644
--- a/projects/hslayers/common/filters/filter.component.html
+++ b/projects/hslayers/common/filters/filter.component.html
@@ -7,7 +7,7 @@
-
+
@for (item of filter; track item; let i = $index) {
@@ -22,4 +22,4 @@
@if (filter.length > 1 && !(hsFiltersService.isLogOp(filter))) {
}
-
\ No newline at end of file
+
diff --git a/projects/hslayers/common/filters/filters.component.html b/projects/hslayers/common/filters/filters.component.html
index ad0bcbc91f..ac69a73145 100644
--- a/projects/hslayers/common/filters/filters.component.html
+++ b/projects/hslayers/common/filters/filters.component.html
@@ -11,7 +11,7 @@
-
+
@for (item of rule.filter; track item; let i = $index) {
diff --git a/projects/hslayers/common/filters/filters.service.ts b/projects/hslayers/common/filters/filters.service.ts
index 77c963343a..059fea58e0 100644
--- a/projects/hslayers/common/filters/filters.service.ts
+++ b/projects/hslayers/common/filters/filters.service.ts
@@ -140,7 +140,7 @@ export class HsFiltersService {
'STYLER.removeFilter',
message,
{
- toastStyleClasses: 'text-bg-warning',
+ type: 'warning',
serviceCalledFrom: 'HsFiltersService',
},
);
diff --git a/projects/hslayers/common/layer-table/layer-table.component.html b/projects/hslayers/common/layer-table/layer-table.component.html
index 6a0acd562f..7fa24cb1d7 100644
--- a/projects/hslayers/common/layer-table/layer-table.component.html
+++ b/projects/hslayers/common/layer-table/layer-table.component.html
@@ -60,7 +60,7 @@
@if (type === "arcgis" && data.serviceExpanded) {
-
+
{{
"COMMON.back" | translateHs
}}
@@ -78,7 +78,7 @@
{{ service.name }}
-
+
@@ -144,4 +144,4 @@
}
-
\ No newline at end of file
+
diff --git a/projects/hslayers/common/layman/access-rights/layman-access-rights.component.html b/projects/hslayers/common/layman/access-rights/layman-access-rights.component.html
index f2b802c09e..f7ea90e03f 100644
--- a/projects/hslayers/common/layman/access-rights/layman-access-rights.component.html
+++ b/projects/hslayers/common/layman/access-rights/layman-access-rights.component.html
@@ -22,7 +22,7 @@
-
+
@for (option of grantingOptions; track $index) {
@@ -81,4 +81,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/common/pager/pager.component.html b/projects/hslayers/common/pager/pager.component.html
index bfa477cc64..0f230f2e15 100644
--- a/projects/hslayers/common/pager/pager.component.html
+++ b/projects/hslayers/common/pager/pager.component.html
@@ -31,7 +31,7 @@
-
+
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/common/panels/panel-header/panel-header.component.html b/projects/hslayers/common/panels/panel-header/panel-header.component.html
index 574b74b296..0f23c08483 100644
--- a/projects/hslayers/common/panels/panel-header/panel-header.component.html
+++ b/projects/hslayers/common/panels/panel-header/panel-header.component.html
@@ -15,11 +15,11 @@
+ class="fa-solid fa-bars">
-
\ No newline at end of file
+
diff --git a/projects/hslayers/common/query-popup/query-popup.component.html b/projects/hslayers/common/query-popup/query-popup.component.html
index 7067f3dd70..5824441ba9 100644
--- a/projects/hslayers/common/query-popup/query-popup.component.html
+++ b/projects/hslayers/common/query-popup/query-popup.component.html
@@ -2,7 +2,7 @@
-
+
@for (layerDesc of data.service.featureLayersUnderMouse; track $index) {
@@ -64,4 +64,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/common/remove-multiple/remove-layer-dialog.service.ts b/projects/hslayers/common/remove-multiple/remove-layer-dialog.service.ts
index 411f476bbd..a024c69047 100644
--- a/projects/hslayers/common/remove-multiple/remove-layer-dialog.service.ts
+++ b/projects/hslayers/common/remove-multiple/remove-layer-dialog.service.ts
@@ -121,7 +121,7 @@ export class HsRemoveLayerDialogService {
'LAYMAN.deleteLayersRequest',
'LAYMAN.deletionInProgress',
{
- toastStyleClasses: 'bg-info text-white',
+ type: 'info',
serviceCalledFrom: 'HsDrawService',
customDelay: 600000,
},
diff --git a/projects/hslayers/common/toast/public-api.ts b/projects/hslayers/common/toast/public-api.ts
index d88a171f1b..69662af10f 100644
--- a/projects/hslayers/common/toast/public-api.ts
+++ b/projects/hslayers/common/toast/public-api.ts
@@ -1,3 +1,2 @@
export * from './toast.component';
-export * from './toast.module';
export * from './toast.service';
diff --git a/projects/hslayers/common/toast/toast-item.component.scss b/projects/hslayers/common/toast/toast-item.component.scss
new file mode 100644
index 0000000000..8290e4db1d
--- /dev/null
+++ b/projects/hslayers/common/toast/toast-item.component.scss
@@ -0,0 +1,116 @@
+:host {
+ display: block;
+ margin: 0;
+ height: auto;
+ transition: all 0.3s ease;
+
+ &.toast-hidden {
+ margin: 0;
+ height: 0;
+ opacity: 0;
+ }
+}
+
+.toast {
+ max-width: 400px;
+ width: 100%;
+ backdrop-filter: blur(8px);
+ opacity: 1;
+ transform: translateX(0);
+ transition: all 0.3s ease;
+
+ &.toast-hidden {
+ opacity: 0;
+ transform: translateX(100%);
+ }
+
+ .toast-content {
+ strong {
+ font-size: 1.05rem;
+ }
+
+ .toast-content-body {
+ max-height: 12rem;
+ overflow-y: auto;
+
+ p {
+ overflow-wrap: anywhere;
+ }
+ }
+ }
+
+ .toast-body {
+ width: 100%;
+ min-width: 350px;
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ }
+}
+
+.toast-icon {
+ font-size: 1.3rem;
+}
+
+.btn-close {
+ opacity: 0.5;
+ transition: opacity 0.2s;
+ padding: 0.5rem;
+
+ &:hover {
+ opacity: 1;
+ }
+}
+
+.bg-success {
+ --bs-success-rgb: 212, 237, 218;
+ color: #155724;
+
+ .toast-icon {
+ color: #28a745;
+ }
+}
+
+.bg-danger {
+ --bs-danger-rgb: 248, 215, 218;
+ color: #721c24;
+
+
+ .toast-icon {
+ color: #dc3545;
+ }
+}
+
+.bg-warning {
+ --bs-warning-rgb: 255, 243, 205;
+ color: #856404;
+
+
+ .toast-icon {
+ color: #ffc107;
+ }
+}
+
+.bg-info {
+ --bs-info-rgb: 209, 236, 241;
+ color: #0c5460;
+
+
+ .toast-icon {
+ color: #17a2b8;
+ }
+}
+
+ul {
+ list-style-type: none;
+
+ li {
+ position: relative;
+
+ &:before {
+ content: '•';
+ position: absolute;
+ left: -1rem;
+ }
+ }
+}
diff --git a/projects/hslayers/common/toast/toast-item.component.ts b/projects/hslayers/common/toast/toast-item.component.ts
new file mode 100644
index 0000000000..5faeaef801
--- /dev/null
+++ b/projects/hslayers/common/toast/toast-item.component.ts
@@ -0,0 +1,142 @@
+import {
+ AfterContentInit,
+ Component,
+ EventEmitter,
+ Output,
+ computed,
+ input,
+ signal,
+} from '@angular/core';
+
+export type ToastType = 'success' | 'danger' | 'warning' | 'info';
+
+/**
+ * Represents an individual toast notification with customizable content,
+ * appearance, and behavior.
+ */
+@Component({
+ selector: 'hs-toast-item',
+ standalone: true,
+ template: `
+
+
+
+
+
+
+
{{ header() }}
+
+
{{ text() }}
+ @if (details()?.length) {
+
+ @for (detail of details(); track detail) {
+ {{ detail }}
+ }
+
+ }
+
+
+
+
+
+ `,
+ styleUrls: ['./toast-item.component.scss'],
+})
+export class HsToastItemComponent implements AfterContentInit {
+ /** Header text displayed at the top of the toast */
+ readonly header = input('');
+ /** Main message text of the toast */
+ readonly text = input('');
+ /** Optional array of detail messages shown as bullet points */
+ readonly details = input([]);
+ /** Visual style of the toast (success, danger, warning, info) */
+ readonly type = input('danger');
+ /** Duration in milliseconds before the toast auto-hides */
+ readonly delay = input(5000);
+ readonly autohide = input(true);
+
+ @Output() hidden = new EventEmitter();
+
+ private timeoutID: any;
+ readonly isHiding = signal(false);
+
+ maxHeight = computed(() =>
+ this.details()?.length > 0 ? `${this.details().length + 8}rem` : '18rem',
+ );
+
+ /** Computed CSS class based on toast type */
+ toastClass = computed(() => `bg-${this.type()}`);
+
+ /** Computed icon class based on toast type */
+ iconClass = computed(() => {
+ switch (this.type()) {
+ case 'success':
+ return 'fa-solid fa-square-check';
+ case 'danger':
+ return 'fa-solid fa-triangle-exclamation';
+ case 'warning':
+ return 'fa-solid fa-triangle-exclamation';
+ case 'info':
+ return 'fa-solid fa-circle-info';
+ default:
+ return '';
+ }
+ });
+
+ ngAfterContentInit() {
+ this.show();
+ }
+
+ /** Trigger the hiding animation */
+ hideToast(): void {
+ this.isHiding.set(true);
+ }
+
+ /** Handle transition end events for smooth hiding */
+ onTransitionEnd(event: TransitionEvent): void {
+ if (event.propertyName === 'opacity' && this.isHiding()) {
+ this.hide();
+ }
+ }
+
+ /** Complete the hiding process and emit event */
+ hide(): void {
+ this.clearTimeout();
+ this.hidden.emit();
+ }
+
+ /** Initialize the toast display state */
+ private show(): void {
+ this.isHiding.set(false);
+ if (this.autohide()) {
+ this.initTimeout();
+ }
+ }
+
+ /** Set up auto-hide timer if enabled */
+ private initTimeout() {
+ if (this.autohide() && !this.timeoutID) {
+ this.timeoutID = setTimeout(() => this.hideToast(), this.delay());
+ }
+ }
+
+ /** Clean up auto-hide timer */
+ private clearTimeout() {
+ if (this.timeoutID) {
+ clearTimeout(this.timeoutID);
+ this.timeoutID = null;
+ }
+ }
+}
diff --git a/projects/hslayers/common/toast/toast.component.html b/projects/hslayers/common/toast/toast.component.html
deleted file mode 100644
index 33fe4d8c1c..0000000000
--- a/projects/hslayers/common/toast/toast.component.html
+++ /dev/null
@@ -1,13 +0,0 @@
-@for (toast of hsToastService.toasts; track toast) {
- 0 ? 'toast.details.length + 8' + 'rem' : '8rem'}"
- [autohide]="toast.autohide" [delay]="toast.delay || 5000" (hidden)="hsToastService.remove(toast)">{{toast.textOrTpl}}
- @if (toast.details?.length > 0) {
- @for (detail of toast.details; track detail) {
-
- }
- }
-
-}
\ No newline at end of file
diff --git a/projects/hslayers/common/toast/toast.component.scss b/projects/hslayers/common/toast/toast.component.scss
new file mode 100644
index 0000000000..2e992872be
--- /dev/null
+++ b/projects/hslayers/common/toast/toast.component.scss
@@ -0,0 +1,79 @@
+:host {
+ z-index: 150;
+ display: flex;
+ flex-direction: column;
+ max-height: 90vh;
+ overflow-y: overlay;
+ gap: 0.75rem;
+ padding: 1rem;
+ pointer-events: none;
+ scrollbar-width: none;
+ /* Firefox */
+ -ms-overflow-style: none;
+
+ /* IE and Edge */
+ &::-webkit-scrollbar {
+ display: none;
+ /* Chrome, Safari, Opera */
+ }
+
+ >* {
+ pointer-events: auto;
+ }
+
+ &.position-fixed {
+ position: fixed;
+ }
+
+ &.position-absolute {
+ position: absolute;
+ }
+}
+
+:host.top-left {
+ top: 0;
+ left: 0;
+}
+
+:host.top-right {
+ top: 0;
+ right: 0;
+}
+
+:host.top-center {
+ top: 0;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:host.bottom-left {
+ bottom: 1rem;
+ left: 0;
+}
+
+:host.bottom-right {
+ bottom: 1rem;
+ right: 0;
+}
+
+:host.bottom-center {
+ bottom: 1rem;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:host-context(.hs-mobile-view) {
+
+ ::ng-deep {
+ top: 0;
+ right: 50%;
+ transform: translateX(50%);
+ left: auto;
+ bottom: auto;
+
+ hs-toast-item .toast {
+ max-width: 80vw;
+ width: 80vw;
+ }
+ }
+}
\ No newline at end of file
diff --git a/projects/hslayers/common/toast/toast.component.ts b/projects/hslayers/common/toast/toast.component.ts
index 985792c361..d10e073397 100644
--- a/projects/hslayers/common/toast/toast.component.ts
+++ b/projects/hslayers/common/toast/toast.component.ts
@@ -1,34 +1,67 @@
-import {Component} from '@angular/core';
+import {Component, Input, computed} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {toSignal} from '@angular/core/rxjs-interop';
import {HsToastService} from './toast.service';
+import {HsToastItemComponent} from './toast-item.component';
+import {HsConfig} from 'hslayers-ng/config';
+
+export type ToastPosition =
+ | 'top-left'
+ | 'top-right'
+ | 'top-center'
+ | 'bottom-left'
+ | 'bottom-right'
+ | 'bottom-center';
@Component({
selector: 'hs-toast',
- templateUrl: './toast.component.html',
- styles: [
- `
- :host {
- position: absolute;
- bottom: 0.1rem;
- z-index: 150;
- border-style: none;
- display: flex;
- max-height: 90%;
- flex-direction: column;
- max-width: 400px;
- padding: 1rem 0;
- gap: 0.5rem;
- }
-
- :host-context(.hs-mobile-view) {
- top: 0;
- right: 50%;
- transform: translateX(50%);
- }
- `,
- ],
- standalone: false,
+ standalone: true,
+ imports: [CommonModule, HsToastItemComponent],
+ template: `
+ @for (toast of hsToastService.toasts; track toast) {
+
+ }
+ `,
+ styleUrls: ['./toast.component.scss'],
+ host: {
+ '[class]': 'positionClasses()',
+ },
})
export class HsToastComponent {
- constructor(public hsToastService: HsToastService) {}
+ @Input() position: ToastPosition = 'bottom-center';
+
+ constructor(
+ public hsToastService: HsToastService,
+ private hsConfig: HsConfig,
+ ) {}
+
+ /**
+ * Signal that tracks config changes
+ */
+ private configChanges = toSignal(this.hsConfig.configChanges, {
+ initialValue: undefined,
+ });
+
+ /**
+ * Computes the CSS classes for positioning the toast container
+ * Combines position class with positioning based on anchor point
+ * Recomputes when config is updated through configChanges
+ */
+ positionClasses = computed(() => {
+ this.configChanges();
+ const positionType =
+ this.hsConfig.toastAnchor === 'screen'
+ ? 'position-fixed'
+ : 'position-absolute';
+ return `${this.position} ${positionType}`;
+ });
}
diff --git a/projects/hslayers/common/toast/toast.module.ts b/projects/hslayers/common/toast/toast.module.ts
deleted file mode 100644
index 0db9a336b9..0000000000
--- a/projects/hslayers/common/toast/toast.module.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {NgbToastModule} from '@ng-bootstrap/ng-bootstrap';
-
-import {HsToastComponent} from './toast.component';
-
-@NgModule({
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
- declarations: [HsToastComponent],
- imports: [CommonModule, NgbToastModule],
- exports: [HsToastComponent],
-})
-export class HsToastModule {}
diff --git a/projects/hslayers/common/toast/toast.service.ts b/projects/hslayers/common/toast/toast.service.ts
index 5cc48158eb..825375bfe7 100644
--- a/projects/hslayers/common/toast/toast.service.ts
+++ b/projects/hslayers/common/toast/toast.service.ts
@@ -1,16 +1,18 @@
-import {Injectable, TemplateRef} from '@angular/core';
+import {Injectable, TemplateRef, signal} from '@angular/core';
import {HsConfig} from 'hslayers-ng/config';
import {HsLanguageService} from 'hslayers-ng/services/language';
+import {ToastType} from './toast-item.component';
export interface Toast {
autohide?: boolean;
- classname?: string;
+ type?: ToastType;
delay?: number;
details?: string[];
header?: string;
serviceCalledFrom?: string;
textOrTpl?: string;
+ id?: string;
}
export type customToastOptions = {
@@ -19,10 +21,9 @@ export type customToastOptions = {
*/
disableLocalization?: boolean;
/**
- * Toast message background and text style classes, for example - background: (bg-primary, bg-secondary, bg-success, bg-danger, bg-warning, bg-info, bg-light, bg-dark, bg-white)
- * and text: (text-primary, text-secondary, text-success, text-danger, text-warning, text-info, text-light, text-dark, text-white, text-muted)
+ * Type of toast message (success, danger, warning, info)
*/
- toastStyleClasses?: string;
+ type?: ToastType;
/**
* Sets custom delay for the toast message
*/
@@ -35,33 +36,39 @@ export type customToastOptions = {
* Error details
*/
details?: string[];
+ /**
+ * Whether the toast should automatically hide after delay
+ */
+ autohide?: boolean;
};
@Injectable({
providedIn: 'root',
})
export class HsToastService {
- toasts: Toast[] = [];
+ private toastsSignal = signal([]);
+
constructor(
public HsLanguageService: HsLanguageService,
private hsConfig: HsConfig,
) {}
+ get toasts() {
+ return this.toastsSignal();
+ }
+
/**
* Callback method to remove Toast DOM element from view
* @param toast - Toast pop up
*/
remove(toast: Toast): void {
- this.toasts = this.toasts.filter((t) => t !== toast);
+ this.toastsSignal.update((toasts) => toasts.filter((t) => t !== toast));
}
removeByText(text: string): void {
- const found = this.toasts.filter((t) => t.textOrTpl === text);
- if (found?.length > 0) {
- for (const f of found) {
- this.remove(f);
- }
- }
+ this.toastsSignal.update((toasts) =>
+ toasts.filter((t) => t.textOrTpl !== text),
+ );
}
/**
@@ -71,8 +78,11 @@ export class HsToastService {
*/
show(textOrTpl: string | TemplateRef, options: any = {}): void {
if (this.toasts.length >= 5) {
- this.toasts = this.toasts.slice(-4);
+ this.toastsSignal.update((toasts) => toasts.slice(-4));
}
+
+ const newToast = {textOrTpl, ...options, id: crypto.randomUUID()};
+
if (
!this.toasts.some(
(toast) =>
@@ -80,7 +90,7 @@ export class HsToastService {
toast?.serviceCalledFrom === options.serviceCalledFrom,
)
) {
- this.toasts.push({textOrTpl, ...options});
+ this.toastsSignal.update((toasts) => [...toasts, newToast]);
}
}
@@ -106,7 +116,7 @@ export class HsToastService {
delay:
options.customDelay || (this.hsConfig.errorToastDuration ?? 7000),
autohide: true,
- classname: options.toastStyleClasses || `bg-danger text-light`,
+ type: options.type || 'danger',
serviceCalledFrom: options.serviceCalledFrom,
details: options.details || [],
},
diff --git a/projects/hslayers/common/upload/upload.component.html b/projects/hslayers/common/upload/upload.component.html
index 63f7a4acb5..dba6b09147 100644
--- a/projects/hslayers/common/upload/upload.component.html
+++ b/projects/hslayers/common/upload/upload.component.html
@@ -7,7 +7,7 @@
-
+
{{'ADDLAYERS.Vector.chooseFiles' | translateHs }}
diff --git a/projects/hslayers/components/add-data/add-data.component.html b/projects/hslayers/components/add-data/add-data.component.html
index f129a22622..8b90ec888b 100644
--- a/projects/hslayers/components/add-data/add-data.component.html
+++ b/projects/hslayers/components/add-data/add-data.component.html
@@ -6,10 +6,10 @@
@if ({enabled: layersAvailable | async}; as removal) {
- {{'DRAW.removeMultipleLayers' | translateHs }}
+ {{'DRAW.removeMultipleLayers' | translateHs }}
- {{'LAYERMANAGER.removeAllLayers' | translateHs }}
+ {{'LAYERMANAGER.removeAllLayers' | translateHs }}
}
@@ -31,4 +31,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/components/add-data/catalogue/catalogue-list-item/catalogue-list-item.component.html b/projects/hslayers/components/add-data/catalogue/catalogue-list-item/catalogue-list-item.component.html
index a2a65c6acc..3b4a5b3a07 100644
--- a/projects/hslayers/components/add-data/catalogue/catalogue-list-item/catalogue-list-item.component.html
+++ b/projects/hslayers/components/add-data/catalogue/catalogue-list-item/catalogue-list-item.component.html
@@ -19,7 +19,7 @@
-
+
@if (layerAvailable) {
{{'COMMON.addToMap' |
translateHs }}
@@ -34,13 +34,13 @@
}
- {{'COMMON.metadata' |
+ {{'COMMON.metadata' |
translateHs }}
- @if (layer.editable) {
{{'COMMON.setPermissions' | translateHs }}
}
@@ -48,7 +48,7 @@
- @if (layer.editable) {
{{'COMMON.removeLayer' | translateHs }}
}
@@ -61,7 +61,7 @@
+ [title]="'COMMON.download' | translateHs ">
@@ -87,12 +87,12 @@
-
+
-
+
@@ -105,4 +105,4 @@
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/add-data/catalogue/catalogue-metadata/catalogue-metadata.component.html b/projects/hslayers/components/add-data/catalogue/catalogue-metadata/catalogue-metadata.component.html
index d8580bebcf..213a885545 100644
--- a/projects/hslayers/components/add-data/catalogue/catalogue-metadata/catalogue-metadata.component.html
+++ b/projects/hslayers/components/add-data/catalogue/catalogue-metadata/catalogue-metadata.component.html
@@ -25,7 +25,7 @@
@for (type of selectedLayer.availableTypes; track type) {
- {{'DATASOURCE_SELECTOR.addToMapAs' | translateHs }}
+ {{'DATASOURCE_SELECTOR.addToMapAs' | translateHs }}
{{type}}
}
@@ -35,14 +35,14 @@
@if (selectedLayer?.metadata?.record_url) {
{{'DATASOURCE_SELECTOR.seeFullRecord' | translateHs}}
+ class="fa-solid fa-up-right-from-square">
}
- RDF
+ RDF
{{'LAYERMANAGER.layerEditor.zoomToLayer'
@@ -58,4 +58,4 @@
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/add-data/catalogue/catalogue.component.html b/projects/hslayers/components/add-data/catalogue/catalogue.component.html
index c0e659b91d..6d1de84e07 100644
--- a/projects/hslayers/components/add-data/catalogue/catalogue.component.html
+++ b/projects/hslayers/components/add-data/catalogue/catalogue.component.html
@@ -6,7 +6,7 @@
-
+
diff --git a/projects/hslayers/components/add-data/common/new-layer-form/new-layer-form.component.html b/projects/hslayers/components/add-data/common/new-layer-form/new-layer-form.component.html
index 251ffee4fa..4697bca117 100644
--- a/projects/hslayers/components/add-data/common/new-layer-form/new-layer-form.component.html
+++ b/projects/hslayers/components/add-data/common/new-layer-form/new-layer-form.component.html
@@ -40,7 +40,7 @@
(change)="read({fileList: $event.target.files, uploader: 'style', dropped: false})" id="style">
- {{data.serializedStyle?.name ?? allowedStyles.title |translateHs}}
+ {{data.serializedStyle?.name ?? allowedStyles.title |translateHs}}
}
diff --git a/projects/hslayers/components/add-data/common/save-to-layman/save-to-layman.component.html b/projects/hslayers/components/add-data/common/save-to-layman/save-to-layman.component.html
index 90bbe76097..6e600462cc 100644
--- a/projects/hslayers/components/add-data/common/save-to-layman/save-to-layman.component.html
+++ b/projects/hslayers/components/add-data/common/save-to-layman/save-to-layman.component.html
@@ -4,7 +4,7 @@
{{'ADDDATA.saveToCatalogue' | translateHs }}
-
+
@@ -27,4 +27,4 @@
}
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/add-data/common/url/url.component.html b/projects/hslayers/components/add-data/common/url/url.component.html
index cf15cc9776..f2d1a38c19 100644
--- a/projects/hslayers/components/add-data/common/url/url.component.html
+++ b/projects/hslayers/components/add-data/common/url/url.component.html
@@ -4,14 +4,11 @@
[placeholder]="'ADDLAYERS.externalDataSource' | translateHs " required #uri="ngModel" style="height: auto;" />
@if (uri.valid) {
-
+
}
-
-
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/add-data/file/raster/raster-timeseries/raster-timeseries.component.ts b/projects/hslayers/components/add-data/file/raster/raster-timeseries/raster-timeseries.component.ts
index c3443bacdf..47d8a1c753 100644
--- a/projects/hslayers/components/add-data/file/raster/raster-timeseries/raster-timeseries.component.ts
+++ b/projects/hslayers/components/add-data/file/raster/raster-timeseries/raster-timeseries.component.ts
@@ -129,7 +129,7 @@ export class RasterTimeseriesComponent implements OnInit {
'Selected string is invalid',
'Selected string is missing or is not supported.',
{
- toastStyleClasses: 'bg-danger text-light',
+ type: 'danger',
customDelay: 7000,
},
);
diff --git a/projects/hslayers/components/add-data/url/geosparql/geosparql.component.html b/projects/hslayers/components/add-data/url/geosparql/geosparql.component.html
index 8fdfd277fb..fd2e3137ba 100644
--- a/projects/hslayers/components/add-data/url/geosparql/geosparql.component.html
+++ b/projects/hslayers/components/add-data/url/geosparql/geosparql.component.html
@@ -57,7 +57,7 @@
diff --git a/projects/hslayers/components/compositions/compositions-list-item.component.html b/projects/hslayers/components/compositions/compositions-list-item.component.html
index c59329000e..3824a91f0b 100644
--- a/projects/hslayers/components/compositions/compositions-list-item.component.html
+++ b/projects/hslayers/components/compositions/compositions-list-item.component.html
@@ -3,22 +3,22 @@
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/compositions/compositions.component.html b/projects/hslayers/components/compositions/compositions.component.html
index 7b2384de54..fe086075fc 100644
--- a/projects/hslayers/components/compositions/compositions.component.html
+++ b/projects/hslayers/components/compositions/compositions.component.html
@@ -7,18 +7,18 @@
{{'PANEL_HEADER.SAVECOMPOSITION' | translateHs}}
-
+
- {{'COMMON.reload' | translateHs}}
+ {{'COMMON.reload' | translateHs}}
- {{'COMPOSITIONS.import' | translateHs}}
- {{'COMPOSITIONS.addByAddress'|translateHs}}
+ {{'COMPOSITIONS.addByAddress'|translateHs}}
@@ -27,7 +27,7 @@
+ class="fa-solid fa-link">
@@ -36,7 +36,7 @@
name="search" [(ngModel)]="hsCompositionsCatalogueService.data.query.title"
(ngModelChange)="loadFilteredCompositions()">
-
+
@@ -165,10 +165,10 @@
+
-
- }
+ }
diff --git a/projects/hslayers/components/compositions/dialogs/info-dialog.component.html b/projects/hslayers/components/compositions/dialogs/info-dialog.component.html
index c12af552ac..d415451ed1 100644
--- a/projects/hslayers/components/compositions/dialogs/info-dialog.component.html
+++ b/projects/hslayers/components/compositions/dialogs/info-dialog.component.html
@@ -128,7 +128,7 @@
{{data.info.title}}
-
\ No newline at end of file
+
diff --git a/projects/hslayers/components/compositions/endpoints/compositions-layman.service.ts b/projects/hslayers/components/compositions/endpoints/compositions-layman.service.ts
index d880afa852..7ac3a7e83d 100644
--- a/projects/hslayers/components/compositions/endpoints/compositions-layman.service.ts
+++ b/projects/hslayers/components/compositions/endpoints/compositions-layman.service.ts
@@ -251,7 +251,7 @@ export class HsCompositionsLaymanService {
endpoint.title + ': ' + this.hsLanguageService.getTranslation(message),
{
disableLocalization: true,
- toastStyleClasses: 'bg-warning text-light',
+ type: 'warning',
serviceCalledFrom: 'HsCompositionsLaymanService',
},
);
diff --git a/projects/hslayers/components/compositions/endpoints/compositions-micka.service.ts b/projects/hslayers/components/compositions/endpoints/compositions-micka.service.ts
index e7e795d69e..6460d720c5 100644
--- a/projects/hslayers/components/compositions/endpoints/compositions-micka.service.ts
+++ b/projects/hslayers/components/compositions/endpoints/compositions-micka.service.ts
@@ -108,7 +108,7 @@ export class HsCompositionsMickaService {
),
{
disableLocalization: true,
- toastStyleClasses: 'bg-warning text-light',
+ type: 'warning',
serviceCalledFrom: 'HsCompositionsMickaService',
},
);
diff --git a/projects/hslayers/components/draw/draw-edit/draw-edit.component.html b/projects/hslayers/components/draw/draw-edit/draw-edit.component.html
index f5827132fa..11b1d59c2e 100644
--- a/projects/hslayers/components/draw/draw-edit/draw-edit.component.html
+++ b/projects/hslayers/components/draw/draw-edit/draw-edit.component.html
@@ -24,21 +24,21 @@
-
+
}
@if (selectedType === 'split') {
-
+
}
{{'DRAW.featureEditor.orSelectOne' | translateHs }}
-
+
@if (selectedType) {
diff --git a/projects/hslayers/components/draw/draw-edit/draw-edit.component.ts b/projects/hslayers/components/draw/draw-edit/draw-edit.component.ts
index a8550508ab..49860fe03f 100644
--- a/projects/hslayers/components/draw/draw-edit/draw-edit.component.ts
+++ b/projects/hslayers/components/draw/draw-edit/draw-edit.component.ts
@@ -99,7 +99,7 @@ export class HsDrawEditComponent implements OnDestroy, OnInit {
undefined,
),
{
- toastStyleClasses: 'bg-info text-light',
+ type: 'info',
},
);
} else {
@@ -207,7 +207,7 @@ export class HsDrawEditComponent implements OnDestroy, OnInit {
undefined,
),
{
- toastStyleClasses: 'bg-info text-light',
+ type: 'info',
},
);
setTimeout(() => {
@@ -245,7 +245,7 @@ export class HsDrawEditComponent implements OnDestroy, OnInit {
undefined,
),
{
- toastStyleClasses: 'bg-info text-light',
+ type: 'info',
},
);
}
@@ -364,7 +364,7 @@ export class HsDrawEditComponent implements OnDestroy, OnInit {
undefined,
),
{
- toastStyleClasses: 'bg-warning text-light',
+ type: 'warning',
},
);
}
diff --git a/projects/hslayers/components/draw/draw-layer-metadata/draw-layer-metadata.component.html b/projects/hslayers/components/draw/draw-layer-metadata/draw-layer-metadata.component.html
index 3ea96666a5..06f8ec1af4 100644
--- a/projects/hslayers/components/draw/draw-layer-metadata/draw-layer-metadata.component.html
+++ b/projects/hslayers/components/draw/draw-layer-metadata/draw-layer-metadata.component.html
@@ -77,7 +77,7 @@ {{ layer.title | translateHs: "LAYERS" }}
-
+
}
diff --git a/projects/hslayers/components/layer-manager/widgets/extent-widget/extent-widget.component.html b/projects/hslayers/components/layer-manager/widgets/extent-widget/extent-widget.component.html
index 42a26c3436..bc53873067 100644
--- a/projects/hslayers/components/layer-manager/widgets/extent-widget/extent-widget.component.html
+++ b/projects/hslayers/components/layer-manager/widgets/extent-widget/extent-widget.component.html
@@ -6,9 +6,9 @@
{{
"LAYERMANAGER.layerEditor.ignoreExtent" | translateHs
}}
-
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/components/legend/legend.component.html b/projects/hslayers/components/legend/legend.component.html
index f79d71ba7d..e44b97e562 100644
--- a/projects/hslayers/components/legend/legend.component.html
+++ b/projects/hslayers/components/legend/legend.component.html
@@ -25,10 +25,10 @@
-
+
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/components/map-swipe/map-swipe.component.html b/projects/hslayers/components/map-swipe/map-swipe.component.html
index af402e3d5c..a319064ffd 100644
--- a/projects/hslayers/components/map-swipe/map-swipe.component.html
+++ b/projects/hslayers/components/map-swipe/map-swipe.component.html
@@ -36,7 +36,7 @@
-
+
diff --git a/projects/hslayers/components/measure/measure-toolbar.component.ts b/projects/hslayers/components/measure/measure-toolbar.component.ts
index e14d9495e7..3cd5bc6578 100644
--- a/projects/hslayers/components/measure/measure-toolbar.component.ts
+++ b/projects/hslayers/components/measure/measure-toolbar.component.ts
@@ -14,7 +14,7 @@ import {TranslateCustomPipe} from 'hslayers-ng/services/language';
[title]="'TOOLBAR.measureLinesAndPolygon' | translateHs"
(click)="measureButtonClicked()"
>
-
+
`,
diff --git a/projects/hslayers/components/print/print.component.html b/projects/hslayers/components/print/print.component.html
index 893f830c11..c513fe4f72 100644
--- a/projects/hslayers/components/print/print.component.html
+++ b/projects/hslayers/components/print/print.component.html
@@ -3,7 +3,7 @@
{{'COMMON.reset' | translateHs}}
-
+
@@ -81,7 +81,7 @@
{{'COMMON.preview' |
translateHs }}
+ [title]="'COMMON.downloadAsPng' | translateHs">
}
@if (isLoading()) {
@@ -95,4 +95,4 @@
- }
\ No newline at end of file
+ }
diff --git a/projects/hslayers/components/query/feature-common.service.ts b/projects/hslayers/components/query/feature-common.service.ts
index 2e3d9f62e5..7fc9af1980 100644
--- a/projects/hslayers/components/query/feature-common.service.ts
+++ b/projects/hslayers/components/query/feature-common.service.ts
@@ -114,7 +114,7 @@ export class HsFeatureCommonService {
undefined,
) + getTitle(toLayer),
{
- toastStyleClasses: 'bg-success text-light',
+ type: 'success',
serviceCalledFrom: 'HsFeatureCommonService',
},
);
diff --git a/projects/hslayers/components/query/feature-list/feature-list.component.html b/projects/hslayers/components/query/feature-list/feature-list.component.html
index 544227e50a..c1622e87db 100644
--- a/projects/hslayers/components/query/feature-list/feature-list.component.html
+++ b/projects/hslayers/components/query/feature-list/feature-list.component.html
@@ -15,7 +15,7 @@
+ (click)="toggleEditMenu()">
}
diff --git a/projects/hslayers/components/query/feature/feature.component.html b/projects/hslayers/components/query/feature/feature.component.html
index a3f7ebfa27..70abf4b6fd 100644
--- a/projects/hslayers/components/query/feature/feature.component.html
+++ b/projects/hslayers/components/query/feature/feature.component.html
@@ -31,7 +31,7 @@
{{'COMMON.save'
- | translateHs}}
+ | translateHs}}
}
@@ -52,7 +52,7 @@
}
+ class="fa-solid fa-floppy-disk">
@@ -61,11 +61,11 @@
-
+ (click)="newAttribVisible = !newAttribVisible">
+
+ class="fa-solid fa-gears">
- }
\ No newline at end of file
+ }
diff --git a/projects/hslayers/components/query/query.component.html b/projects/hslayers/components/query/query.component.html
index c100e98692..1c3d0abd60 100644
--- a/projects/hslayers/components/query/query.component.html
+++ b/projects/hslayers/components/query/query.component.html
@@ -4,7 +4,7 @@
@if (noFeatureSelected()) {
-
{{'QUERY.infoPanel.noFeaturesSelected' | translateHs }}
{{'QUERY.infoPanel.clickOnMap' | translateHs }}
@@ -25,7 +25,7 @@
@if (hsQueryBaseService?.coordinates.length>0) {
- @for (projection of hsQueryBaseService.coordinates[0].projections; track projection) {
+ @for (projection of hsQueryBaseService.coordinates[0].projections; track projection.value) {
{{projection.name}}
}
@@ -37,4 +37,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/projects/hslayers/components/search/search-input.component.html b/projects/hslayers/components/search/search-input.component.html
index 3608f15386..7eb36531d0 100644
--- a/projects/hslayers/components/search/search-input.component.html
+++ b/projects/hslayers/components/search/search-input.component.html
@@ -1,11 +1,11 @@
+ class="fa-solid fa-magnifying-glass" [title]="'COMMON.search' | translateHs ">
@if (clearVisible) {
+ class="fa-solid fa-xmark align-middle">
}
diff --git a/projects/hslayers/components/share/share.component.html b/projects/hslayers/components/share/share.component.html
index 74a1214867..07d653e909 100644
--- a/projects/hslayers/components/share/share.component.html
+++ b/projects/hslayers/components/share/share.component.html
@@ -71,7 +71,7 @@
{{'PERMALINK.shareOnSocialNetwork' | translateHs }}
- {{'COMMON.share' | translateHs }}
+ {{'COMMON.share' | translateHs }}
@@ -84,4 +84,4 @@
{{'PERMALINK.shareOnSocialNetwork' | translateHs }}
- }
\ No newline at end of file
+ }
diff --git a/projects/hslayers/components/sidebar/sidebar.component.html b/projects/hslayers/components/sidebar/sidebar.component.html
index 57578630fc..69304594e0 100644
--- a/projects/hslayers/components/sidebar/sidebar.component.html
+++ b/projects/hslayers/components/sidebar/sidebar.component.html
@@ -7,24 +7,24 @@
@if (HsLayoutService.sidebarToggleable && {position: HsLayoutService.sidebarPosition | async}; as sidebar) {
}
@for (button of buttons; track button) {
-