{filters.length === 0 ? (
No filters configured
@@ -143,4 +143,3 @@ export default connect(createStructuredSelector({
targetsWithDisabledFilter: interactionTargetsFilterDisabledSelector,
applyStyleOutOfSyncForWidget: (state, ownProps) => getApplyStyleOutOfSyncForFilterWidget(state, ownProps?.id)
}))(FilterWidget);
-
diff --git a/web/client/components/widgets/widget/filter-widget.less b/web/client/components/widgets/widget/filter-widget.less
index 1620ffbe042..419fee3600a 100644
--- a/web/client/components/widgets/widget/filter-widget.less
+++ b/web/client/components/widgets/widget/filter-widget.less
@@ -1,3 +1,7 @@
+.mapstore-widget-filter-content {
+ padding: 15px 15px 0;
+}
+
.ms-filter-selector-header {
display: flex;
flex-direction: row;
diff --git a/web/client/plugins/widgetbuilder/FilterBuilderContent.jsx b/web/client/plugins/widgetbuilder/FilterBuilderContent.jsx
index 3df58a72634..1880e56ca22 100644
--- a/web/client/plugins/widgetbuilder/FilterBuilderContent.jsx
+++ b/web/client/plugins/widgetbuilder/FilterBuilderContent.jsx
@@ -5,7 +5,7 @@
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
-import React, { useMemo, useCallback, useEffect } from 'react';
+import React, { useMemo, useCallback, useEffect, useRef, useState } from 'react';
import FilterWizard from '../../components/widgets/builder/wizard/FilterWizard';
import useBatchedUpdates from '../../hooks/useBatchedUpdates';
@@ -60,6 +60,7 @@ const FilterBuilderContent = ({
}, [enabled, widgetType, filters.length, layer, onChangeEditor]);
+ const [selectableItems, setSelectableItems] = useState([]);
const selectedFilter = useMemo(
() => filters.find(filter => filter.id === selectedFilterId) || null,
[filters, selectedFilterId]
@@ -70,6 +71,16 @@ const FilterBuilderContent = ({
}
return null;
}, [selectedFilter, filters]);
+ const selectableItemsSignatureRef = useRef('');
+ const handleSelectableItemsChange = useCallback((nextSelectableItems = []) => {
+ const nextSignature = nextSelectableItems
+ .map(item => `${item?.id ?? ''}|${item?.label ?? ''}`)
+ .join('||');
+ if (nextSignature !== selectableItemsSignatureRef.current) {
+ selectableItemsSignatureRef.current = nextSignature;
+ setSelectableItems(nextSelectableItems);
+ }
+ }, []);
const handleFilterSelect = useCallback((filterId) => {
onChangeEditor('selectedFilterId', filterId || null);
@@ -180,6 +191,7 @@ const FilterBuilderContent = ({
);
};
+FilterBuilderContent.defaultProps = {};
export default FilterBuilderContent;
-
diff --git a/web/client/plugins/widgetbuilder/FilterView.jsx b/web/client/plugins/widgetbuilder/FilterView.jsx
index 839c13f7cb7..6bc3c5d8e88 100644
--- a/web/client/plugins/widgetbuilder/FilterView.jsx
+++ b/web/client/plugins/widgetbuilder/FilterView.jsx
@@ -21,6 +21,7 @@ import FilterCheckboxList from '../../components/widgets/builder/wizard/filter/F
import FilterChipList from '../../components/widgets/builder/wizard/filter/FilterChipList';
import FilterDropdownList from '../../components/widgets/builder/wizard/filter/FilterDropdownList';
import FilterSwitchList from '../../components/widgets/builder/wizard/filter/FilterSwitchList';
+import FilterSlider from '../../components/widgets/builder/wizard/filter/FilterSlider';
import FilterNoSelectableItems from '../../components/widgets/builder/wizard/filter/FilterNoSelectableItems';
import { isFilterSelectionValid } from './utils/filterBuilder';
import InfoPopover from '../../components/widgets/widget/InfoPopover';
@@ -89,6 +90,29 @@ const DisabledFilterInfo = ({ interactions = [], activeTargets = {}, targetsWith
);
};
+const UnsupportedVariantInfo = ({ variant }) => (
+
+);
+
const ApplyStyleOutOfSyncInfo = connect()(
({ applyStyleOutOfSync = {}, dispatch }) => {
const [debouncedState, setDebouncedState] = useState(applyStyleOutOfSync);
@@ -157,7 +181,8 @@ const componentMap = {
checkbox: FilterCheckboxList,
button: FilterChipList,
dropdown: FilterDropdownList,
- 'switch': FilterSwitchList
+ 'switch': FilterSwitchList,
+ slider: FilterSlider
};
const FilterView = ({
className,
@@ -172,6 +197,7 @@ const FilterView = ({
loading = false,
missingParameters = false,
selectableItems = [],
+ onSelectableItemsChange = () => {},
fetchError = false
}) => {
if (!filterData) {
@@ -180,11 +206,16 @@ const FilterView = ({
const { layout = {} } = filterData;
const Component = componentMap[layout.variant ?? 'checkbox'];
- if (!Component) {
- throw new Error(`Unsupported filter variant: ${layout.variant}`);
- }
+ const showUnsupportedVariantWarning = !Component;
const forceSelection = layout.forceSelection === true;
const showForceSelectionError = !isFilterSelectionValid(filterData, selections || []);
+ const showSliderSingleItemError = layout.variant === 'slider' && selectableItems?.length === 1;
+
+ useEffect(() => {
+ if (typeof onSelectableItemsChange === 'function') {
+ onSelectableItemsChange(selectableItems);
+ }
+ }, [onSelectableItemsChange, selectableItems]);
// Show message when required parameters are missing
if (missingParameters) {
@@ -253,6 +284,16 @@ const FilterView = ({
layoutMaxHeight: layout.maxHeight
};
}
+ if (layout.variant === 'slider') {
+ return {
+ layoutMaxHeight: layout.maxHeight,
+ showSelectedValue: layout.showSelectedValue ?? layout.showValueLabel !== false,
+ showTicks: layout.showTicks !== false,
+ tickValues: layout.tickValues,
+ tickLabels: layout.tickLabels,
+ tickAngle: layout.tickAngle
+ };
+ }
return {};
};
@@ -358,7 +399,7 @@ const FilterView = ({
: null
}
- {showSelectAll && (
)
}
- {selectableItems?.length > 0 ? (
-
+ {showUnsupportedVariantWarning ? (
+
+ ) : selectableItems?.length > 0 ? (
+ showSliderSingleItemError ? (
+
+ ) : (
+
+ )
) : (
!loading ?
: null
)}
@@ -414,8 +466,10 @@ FilterView.propTypes = {
loading: PropTypes.bool,
missingParameters: PropTypes.bool,
selectableItems: PropTypes.array,
+ onSelectableItemsChange: PropTypes.func,
fetchError: PropTypes.bool
};
+FilterView.defaultProps = {};
// Export unwrapped component for testing
export { FilterView };
@@ -423,4 +477,3 @@ export { FilterView };
export default compose(
filterWidgetEnhancer
)(FilterView);
-
diff --git a/web/client/plugins/widgetbuilder/__tests__/FilterView-test.jsx b/web/client/plugins/widgetbuilder/__tests__/FilterView-test.jsx
index 474d990e97a..c69cb6a5684 100644
--- a/web/client/plugins/widgetbuilder/__tests__/FilterView-test.jsx
+++ b/web/client/plugins/widgetbuilder/__tests__/FilterView-test.jsx
@@ -59,20 +59,20 @@ describe('FilterView component', () => {
expect(container.innerHTML).toBe('');
});
- it('returns null when componentMap does not contain the variant', (done) => {
+ it('renders a warning when componentMap does not contain the variant', () => {
const container = document.getElementById("container");
const filterData = createMockFilterData('unknown-variant');
- try {
- renderWithProvider(
-
,
- container
- );
- } catch (e) {
- expect(e.message).toBe('Unsupported filter variant: unknown-variant');
- done();
- }
+ renderWithProvider(
+
,
+ container
+ );
+
+ expect(container.querySelector('.ms-filter-view-unsupported-variant')).toExist();
+ expect(container.textContent).toContain('widgets.filterWidget.unsupportedVariantMessage');
+ expect(container.querySelector('.ms-filter-button-list-item')).toNotExist();
});
it('renders button component when variant is button', () => {
@@ -162,6 +162,96 @@ describe('FilterView component', () => {
});
+ it('renders slider component when variant is slider', () => {
+ const container = document.getElementById("container");
+ const filterData = createMockFilterData('slider', 'single');
+
+ renderWithProvider(
+
,
+ container
+ );
+
+ expect(container.querySelector('.ms-filter-slider')).toExist();
+ });
+
+ it('shows an error message instead of slider when filter has only one selectable item', () => {
+ const container = document.getElementById("container");
+ const filterData = createMockFilterData('slider', 'single');
+
+ renderWithProvider(
+
,
+ container
+ );
+
+ expect(container.querySelector('.ms-filter-slider')).toNotExist();
+ expect(container.querySelector('.ms-filter-view-slider-error')).toExist();
+ });
+
+ it('shows selected value outside the slider', () => {
+ const container = document.getElementById("container");
+ const filterData = createMockFilterData('slider', 'single', {
+ showSelectedValue: true
+ });
+
+ renderWithProvider(
+
,
+ container
+ );
+
+ const selectedValue = container.querySelector('.ms-filter-slider-selected-value');
+ expect(selectedValue).toExist();
+ expect(selectedValue.textContent).toContain('2');
+ });
+
+ it('renders tick labels in the slider', () => {
+ const container = document.getElementById("container");
+ const filterData = createMockFilterData('slider', 'single', {
+ showTicks: true,
+ tickValues: '1693307400000',
+ tickLabels: 'Event',
+ tickAngle: 90
+ });
+
+ renderWithProvider(
+
,
+ container
+ );
+
+ expect(container.querySelector('.ms-filter-slider--with-ticks')).toExist();
+ expect(container.querySelector('.ms-filter-slider-control').style.getPropertyValue('--ms-filter-slider-tick-angle')).toBe('90deg');
+ const tickLabels = container.querySelectorAll('.noUi-value');
+ expect(tickLabels.length).toBeGreaterThan(0);
+ expect(container.textContent).toContain('Event');
+ });
+
it('shows missing parameters message when missingParameters is true', () => {
const container = document.getElementById("container");
const filterData = createMockFilterData('button');
@@ -292,4 +382,3 @@ describe('FilterView component', () => {
expect(onSelectionChangeSpy).toNotHaveBeenCalled();
});
});
-
diff --git a/web/client/plugins/widgetbuilder/utils/filterBuilder.js b/web/client/plugins/widgetbuilder/utils/filterBuilder.js
index fc744951019..c3d920cd77d 100644
--- a/web/client/plugins/widgetbuilder/utils/filterBuilder.js
+++ b/web/client/plugins/widgetbuilder/utils/filterBuilder.js
@@ -14,7 +14,9 @@ export const createEmptyFilterData = () => ({
dataSource: 'features',
valuesFrom: 'grouped',
valueAttribute: undefined,
+ valueAttributeType: undefined,
labelAttribute: undefined,
+ labelAttributeType: undefined,
sortByAttribute: undefined,
sortOrder: 'ASC',
maxFeatures: 20,
@@ -36,6 +38,11 @@ export const createNewFilter = (filtersCount = 0) => {
selectionMode: 'multiple',
direction: 'vertical',
maxHeight: undefined,
+ showSelectedValue: true,
+ showTicks: true,
+ tickValues: '',
+ tickLabels: '',
+ tickAngle: 270,
label: getFilterName(filtersCount),
titleStyle: {
fontSize: 14,
@@ -106,4 +113,3 @@ export const areAllCustomNoSelectionFiltersValid = (filters = [], isFilterValid)
return defaultFilter && isFilterValid(defaultFilter);
});
};
-
diff --git a/web/client/themes/default/less/sliders.less b/web/client/themes/default/less/sliders.less
index 390b3a669e9..5a05daad922 100644
--- a/web/client/themes/default/less/sliders.less
+++ b/web/client/themes/default/less/sliders.less
@@ -246,3 +246,50 @@
}
}
}
+
+// Filter widget slider: state and pip label layout only
+.ms-filter-slider-items {
+ padding-left: 25px;
+ padding-right: 25px;
+}
+.ms-filter-slider.ms-filter-slider--no-selection {
+ .mapstore-slider .noUi-target.noUi-horizontal .noUi-base .noUi-origin .noUi-handle {
+ opacity: 0;
+ pointer-events: none;
+ }
+}
+
+.ms-filter-slider.ms-filter-slider--with-ticks .ms-filter-slider-control {
+ height: var(--ms-filter-slider-control-height, 60px);
+}
+
+.ms-filter-slider .mapstore-slider .noUi-target.noUi-horizontal .noUi-pips.noUi-pips-horizontal {
+ cursor: default;
+ padding: 5px 0px;
+
+ .noUi-marker {
+ cursor: default;
+ height: 8px;
+ }
+
+ .noUi-value {
+ width: fit-content;
+ font-size: 10px;
+ cursor: default;
+ white-space: nowrap;
+ -webkit-transform-origin: var(--ms-filter-slider-tick-origin, center center);
+ transform-origin: var(--ms-filter-slider-tick-origin, center center);
+ -webkit-transform: translate3d(var(--ms-filter-slider-tick-translate-x, -50%), var(--ms-filter-slider-tick-translate-y, -50%), 0) rotate(var(--ms-filter-slider-tick-angle, -90deg));
+ transform: translate3d(var(--ms-filter-slider-tick-translate-x, -50%), var(--ms-filter-slider-tick-translate-y, -50%), 0) rotate(var(--ms-filter-slider-tick-angle, -90deg));
+
+ &.noUi-value-horizontal {
+ margin-left: 0;
+ margin-top: 8px;
+ }
+ }
+
+ .noUi-value-large {
+ margin-top: 0;
+ padding-top: 10px;
+ }
+}
diff --git a/web/client/themes/default/less/wizard.less b/web/client/themes/default/less/wizard.less
index be3a2441aa2..568142579cb 100644
--- a/web/client/themes/default/less/wizard.less
+++ b/web/client/themes/default/less/wizard.less
@@ -255,8 +255,22 @@
cursor: pointer;
font-size: 14px;
}
+ .ms-filter-slider-fill-tick-values-btn {
+ width: 34px;
+ min-width: 34px;
+ height: 30px;
+ padding: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .ms-filter-tick-angle-control {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex: 1;
+ }
}
-
}
.ms-filter-builder-content {
@@ -341,3 +355,20 @@
border: 1px dashed transparent;
border-radius: 4px;
}
+
+.ms-filter-view-slider-error {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+ text-align: center;
+ .ms-filter-view-slider-error-icon {
+ font-size: 32px;
+ margin-bottom: 12px;
+ }
+ .ms-filter-view-slider-error-message {
+ font-size: 14px;
+ max-width: 400px;
+ }
+}
\ No newline at end of file
diff --git a/web/client/translations/data.de-DE.json b/web/client/translations/data.de-DE.json
index 303d61e1ab4..04e4d532be8 100644
--- a/web/client/translations/data.de-DE.json
+++ b/web/client/translations/data.de-DE.json
@@ -2525,6 +2525,21 @@
"selectAll": "Alle auswählen",
"clear": "Löschen",
"showSelectAllClear": "Optionen 'Alle auswählen' und 'Löschen' anzeigen",
+ "showValueLabel": "Wertbeschriftung anzeigen",
+ "showSelectedValue": "Ausgewählten Wert anzeigen",
+ "showSelectedValueTooltip": "Zeigt den aktuell ausgewählten Wert oberhalb des Schiebereglers an.",
+ "sliderNotSelected": "Nicht ausgewählt",
+ "showTicks": "Markierungen anzeigen",
+ "showTicksTooltip": "Zeigt die Markierungen auf dem Schieberegler an oder blendet sie aus.",
+ "tickValues": "Werte für Markierungen",
+ "tickLabels": "Beschriftungen für Markierung",
+ "tickValuesPlaceholder": "Durch Kommas getrennte Werte",
+ "tickLabelsPlaceholder": "Durch Kommas getrennte Beschriftungen",
+ "tickValuesTooltip": "Geben Sie durch Kommas getrennte Werte ein, die für die Markierungen berücksichtigt werden sollen. Nur die Beschriftung passender Werte wird angezeigt.",
+ "tickLabelsTooltip": "Geben Sie Ersatzbeschriftungen für die aufgeführten Markierungswerte in derselben Reihenfolge wie die Markierungswerte ein.",
+ "tickAngle": "Markierungsbeschriftungswinkel",
+ "tickAngleTooltip": "Legt den Rotationswinkel der Markierungsbeschriftung in Grad fest.",
+ "fillTickValuesTooltip": "Mit verfügbaren Filterwerten füllen",
"defaultFilter": "Standardfilter",
"defaultFilterInfo": "Definieren Sie einen Filter, der angewendet wird, wenn nichts ausgewählt ist. Tipp: Wenn Sie nichts anzeigen möchten, wenn nichts ausgewählt ist, erstellen Sie einen Filter, der immer keine Elemente zurückgibt.",
@@ -2554,6 +2569,8 @@
"valueFromAttributeDescription": "Ruft alle vorhandenen Features ab, einschließlich möglicher doppelter Werte für das ausgewählte Attribut.",
"missingParametersMessage": "Bitte wählen Sie die erforderlichen Felder aus, um die Filterliste zu generieren",
"fetchError": "Fehler beim Abrufen der Daten",
+ "unsupportedVariantMessage": "Nicht unterstützte Filtervariante: {variant}.",
+ "sliderSingleItemError": "Der Schieberegler-Filter benötigt mindestens zwei auswählbare Werte.",
"noSelectableItems": "Keine auswählbaren Filterelemente.",
"filters": "Filter",
"styles": "Stile",
diff --git a/web/client/translations/data.en-US.json b/web/client/translations/data.en-US.json
index ba82ffe63ca..b815b2f44e2 100644
--- a/web/client/translations/data.en-US.json
+++ b/web/client/translations/data.en-US.json
@@ -2509,6 +2509,21 @@
"selectAll": "Select All",
"clear": "Clear",
"showSelectAllClear": "Show Select All / Clear",
+ "showValueLabel": "Show Value Label",
+ "showSelectedValue": "Show Selected Value",
+ "showSelectedValueTooltip": "Shows the currently selected value above the slider.",
+ "sliderNotSelected": "Not selected",
+ "showTicks": "Show Ticks",
+ "showTicksTooltip": "Shows or hides tick marks on the slider.",
+ "tickValues": "Values For Ticks",
+ "tickLabels": "Labels For Ticks",
+ "tickValuesPlaceholder": "Comma-separated values",
+ "tickLabelsPlaceholder": "Comma-separated labels",
+ "tickValuesTooltip": "Enter comma-separated values to consider for the ticks. Only matching value's label will be shown.",
+ "tickLabelsTooltip": "Enter comma-separated replacement labels in the same order as tick values.",
+ "tickAngle": "Tick Label Angle",
+ "tickAngleTooltip": "Sets the tick label rotation angle in degrees.",
+ "fillTickValuesTooltip": "Fill with available filter values",
"showNoTargetsInfoLabel": "No target message",
"showNoTargetsInfoDescription": "When no target is connected to the filter, or the layers/widgets connected are not visible, a message appears to notify the user that the filter will have no effect.",
"noInteractionsInfo": "No target connected. Use the connections panel to connect the filter to layers or widgets.",
@@ -2536,6 +2551,8 @@
"valueFromAttributeDescription": "Fetches all existing features including possible duplicated values for the selected attribute.",
"missingParametersMessage": "Please select required fields to generate the filter list",
"fetchError": "Failed to fetch data",
+ "unsupportedVariantMessage": "Unsupported filter variant: {variant}.",
+ "sliderSingleItemError": "Slider filter requires at least two selectable values.",
"noSelectableItems": "No selectable filter items.",
"filters": "Filters",
"styles": "Styles",
diff --git a/web/client/translations/data.es-ES.json b/web/client/translations/data.es-ES.json
index f0b04ded6a4..5dc1c61ad9a 100644
--- a/web/client/translations/data.es-ES.json
+++ b/web/client/translations/data.es-ES.json
@@ -2482,6 +2482,21 @@
"selectAll": "Seleccionar todo",
"clear": "Limpiar",
"showSelectAllClear": "Mostrar 'Seleccionar todo' y 'Limpiar'",
+ "showValueLabel": "Mostrar etiqueta del valor",
+ "showSelectedValue": "Mostrar valor seleccionado",
+ "showSelectedValueTooltip": "Muestra el valor actualmente seleccionado encima del deslizador.",
+ "sliderNotSelected": "No seleccionado",
+ "showTicks": "Mostrar marcas",
+ "showTicksTooltip": "Muestra u oculta las marcas del deslizador.",
+ "tickValues": "Valores para marcas",
+ "tickLabels": "Etiquetas para marca",
+ "tickValuesPlaceholder": "Valores separados por comas",
+ "tickLabelsPlaceholder": "Etiquetas separadas por comas",
+ "tickValuesTooltip": "Introduce valores separados por comas para considerarlos como marcas. Solo se mostrará la etiqueta del valor coincidente.",
+ "tickLabelsTooltip": "Introduce etiquetas de reemplazo para los valores de marca indicados, en el mismo orden que los valores de marca.",
+ "tickAngle": "Ángulo de etiqueta de marca",
+ "tickAngleTooltip": "Define el ángulo de rotación de la etiqueta de marca en grados.",
+ "fillTickValuesTooltip": "Rellenar con valores de filtro disponibles",
"defaultFilter": "Filtro predeterminado",
"defaultFilterInfo": "Define un filtro para aplicar cuando no hay nada seleccionado. Sugerencia: si desea no mostrar nada cuando no hay nada seleccionado, cree un filtro que no devuelva ninguna característica",
@@ -2511,6 +2526,8 @@
"valueFromAttributeDescription": "Recupera todas las entidades existentes incluyendo los posibles valores duplicados para el atributo seleccionado.",
"missingParametersMessage": "Por favor seleccione los campos requeridos para generar la lista de filtros",
"fetchError": "Error al obtener los datos",
+ "unsupportedVariantMessage": "Variante de filtro no admitida: {variant}.",
+ "sliderSingleItemError": "El filtro de deslizador requiere al menos dos valores seleccionables.",
"noSelectableItems": "No hay elementos de filtro seleccionables.",
"filters": "Filtros",
"styles": "Estilos",
diff --git a/web/client/translations/data.fr-FR.json b/web/client/translations/data.fr-FR.json
index b221b9ee20c..c30ddfe75c1 100644
--- a/web/client/translations/data.fr-FR.json
+++ b/web/client/translations/data.fr-FR.json
@@ -2486,6 +2486,21 @@
"selectAll": "Tout sélectionner",
"clear": "Effacer",
"showSelectAllClear": "Afficher Tout Sélectionner / Effacer",
+ "showValueLabel": "Afficher le libellé de la valeur",
+ "showSelectedValue": "Afficher la valeur sélectionnée",
+ "showSelectedValueTooltip": "Affiche la valeur actuellement sélectionnée au-dessus du curseur.",
+ "sliderNotSelected": "Non sélectionné",
+ "showTicks": "Afficher les repères",
+ "showTicksTooltip": "Affiche ou masque les repères sur le curseur.",
+ "tickValues": "Valeurs pour les repères",
+ "tickLabels": "Libellés pour le repère",
+ "tickValuesPlaceholder": "Valeurs séparées par des virgules",
+ "tickLabelsPlaceholder": "Libellés séparés par des virgules",
+ "tickValuesTooltip": "Saisissez des valeurs séparées par des virgules à prendre en compte pour les repères. Seul le libellé de la valeur correspondante sera affiché.",
+ "tickLabelsTooltip": "Saisissez des libellés de remplacement pour les valeurs de repère listées, dans le même ordre que les valeurs de repère.",
+ "tickAngle": "Angle du libellé du repère",
+ "tickAngleTooltip": "Définit l'angle de rotation du libellé du repère en degrés.",
+ "fillTickValuesTooltip": "Remplir avec les valeurs de filtre disponibles",
"defaultFilter": "Filtre par défaut",
"defaultFilterInfo": "Définir un filtre à appliquer lorsqu'aucun élément n'est sélectionné. Suggestion : si vous souhaitez n'afficher rien lorsqu'aucun élément n'est sélectionné, créez un filtre qui ne renvoie aucune entité",
@@ -2515,6 +2530,8 @@
"valueFromAttributeDescription": "Récupère toutes les entités existantes y compris les valeurs dupliquées possibles pour l'attribut sélectionné.",
"missingParametersMessage": "Veuillez sélectionner les champs requis pour générer la liste des filtres",
"fetchError": "Échec de la récupération des données",
+ "unsupportedVariantMessage": "Variante de filtre non prise en charge : {variant}.",
+ "sliderSingleItemError": "Le filtre avec curseur nécessite au moins deux valeurs sélectionnables.",
"noSelectableItems": "Aucun élément de filtre sélectionnable.",
"filters": "Filtres",
"styles": "Styles",
diff --git a/web/client/translations/data.it-IT.json b/web/client/translations/data.it-IT.json
index 9a4a0f724dc..a5a7032157c 100644
--- a/web/client/translations/data.it-IT.json
+++ b/web/client/translations/data.it-IT.json
@@ -2486,6 +2486,21 @@
"selectAll": "Seleziona tutto",
"clear": "Cancella",
"showSelectAllClear": "Mostra 'Seleziona tutto' e 'Cancella'",
+ "showValueLabel": "Mostra etichetta valore",
+ "showSelectedValue": "Mostra valore selezionato",
+ "showSelectedValueTooltip": "Mostra il valore attualmente selezionato sopra lo slider.",
+ "sliderNotSelected": "Non selezionato",
+ "showTicks": "Mostra tacche",
+ "showTicksTooltip": "Mostra o nasconde le tacche sullo slider.",
+ "tickValues": "Valori per tacche",
+ "tickLabels": "Etichette per tacca",
+ "tickValuesPlaceholder": "Valori separati da virgole",
+ "tickLabelsPlaceholder": "Etichette separate da virgole",
+ "tickValuesTooltip": "Inserisci valori separati da virgole da considerare per le tacche. Verrà mostrata solo l'etichetta del valore corrispondente.",
+ "tickLabelsTooltip": "Inserisci etichette sostitutive per i valori di tacca elencati, nello stesso ordine dei valori di tacca.",
+ "tickAngle": "Angolo etichetta tacca",
+ "tickAngleTooltip": "Imposta l'angolo di rotazione dell'etichetta della tacca in gradi.",
+ "fillTickValuesTooltip": "Compila con i valori filtro disponibili",
"defaultFilter": "Filtro predefinito",
"defaultFilterInfo": "Definisci un filtro da applicare quando non è selezionato nulla. Suggerimento: se vuoi non mostrare nulla quando non è selezionato nulla, crea un filtro che non restituisce mai feature",
@@ -2515,6 +2530,8 @@
"valueFromAttributeDescription": "Recupera tutte le feature esistenti inclusi i possibili valori duplicati per l'attributo selezionato.",
"missingParametersMessage": "Selezionare i campi richiesti per generare l'elenco dei filtri",
"fetchError": "Impossibile recuperare i dati",
+ "unsupportedVariantMessage": "Variante filtro non supportata: {variant}.",
+ "sliderSingleItemError": "Il filtro con slider richiede almeno due valori selezionabili.",
"noSelectableItems": "Nessun elemento filtro selezionabile.",
"filters": "Filtri",
"styles": "Stili",