andoncloud-map-widget 1.1.14 → 1.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +11 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ declare const getDisplayName: (lang: string) => string;
|
|
|
25
25
|
declare const getTitle: (data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
|
|
26
26
|
//#endregion
|
|
27
27
|
//#region src/version.d.ts
|
|
28
|
-
declare const LIBRARY_VERSION = "1.1.
|
|
28
|
+
declare const LIBRARY_VERSION = "1.1.15";
|
|
29
29
|
//#endregion
|
|
30
30
|
//#region src/index.d.ts
|
|
31
31
|
declare const thumbnail: string | undefined;
|
package/dist/index.js
CHANGED
|
@@ -126,7 +126,7 @@ const resources = {
|
|
|
126
126
|
};
|
|
127
127
|
//#endregion
|
|
128
128
|
//#region src/version.ts
|
|
129
|
-
const LIBRARY_VERSION = "1.1.
|
|
129
|
+
const LIBRARY_VERSION = "1.1.15";
|
|
130
130
|
//#endregion
|
|
131
131
|
//#region src/components/SettingsFormContent/index.tsx
|
|
132
132
|
const SettingsFormContent = ({ data, formProps }) => {
|
|
@@ -627,7 +627,7 @@ const styles = { saveButton: {
|
|
|
627
627
|
} };
|
|
628
628
|
//#endregion
|
|
629
629
|
//#region src/components/Map/index.tsx
|
|
630
|
-
const Map
|
|
630
|
+
const Map = ({ settings, ...props }) => {
|
|
631
631
|
const { t } = useTranslation();
|
|
632
632
|
useEffect(() => {
|
|
633
633
|
setLeafletLocale(t);
|
|
@@ -712,7 +712,7 @@ const Map$1 = ({ settings, ...props }) => {
|
|
|
712
712
|
//#endregion
|
|
713
713
|
//#region src/components/WidgetView/index.tsx
|
|
714
714
|
const WidgetView = (props) => {
|
|
715
|
-
return /* @__PURE__ */ jsx(Map
|
|
715
|
+
return /* @__PURE__ */ jsx(Map, { ...props });
|
|
716
716
|
};
|
|
717
717
|
//#endregion
|
|
718
718
|
//#region src/components/Widget/utils.ts
|
|
@@ -813,19 +813,16 @@ const getTitle = (data, settings, _filters, lang) => {
|
|
|
813
813
|
if (!features?.length) return name;
|
|
814
814
|
const mapped = features.filter((f) => f.properties?.workplaceId).length;
|
|
815
815
|
if (mapped === 0) return name;
|
|
816
|
-
const
|
|
817
|
-
const
|
|
818
|
-
for (const sc of statusChanges) {
|
|
819
|
-
const existing = latestByWorkplace.get(sc.workplaceId);
|
|
820
|
-
if (!existing || sc.startedAt > existing.startedAt) latestByWorkplace.set(sc.workplaceId, {
|
|
821
|
-
startedAt: sc.startedAt,
|
|
822
|
-
color: sc.reason?.statusColor ?? ""
|
|
823
|
-
});
|
|
824
|
-
}
|
|
816
|
+
const mappedWorkplaceIds = new Set(features.filter((f) => f.properties?.workplaceId).map((f) => f.properties.workplaceId));
|
|
817
|
+
const workplaces = data?.workplaces ?? [];
|
|
825
818
|
let working = 0;
|
|
826
819
|
let down = 0;
|
|
827
|
-
for (const
|
|
828
|
-
|
|
820
|
+
for (const wp of workplaces) {
|
|
821
|
+
if (!mappedWorkplaceIds.has(wp.id)) continue;
|
|
822
|
+
const color = wp.currentStatusChange?.reason?.statusColor ?? "";
|
|
823
|
+
if (color === "green") working++;
|
|
824
|
+
else if (color === "red") down++;
|
|
825
|
+
}
|
|
829
826
|
return `${name} — ${[
|
|
830
827
|
t("titleWorkplaces", lang, { count: mapped }),
|
|
831
828
|
t("titleWorking", lang, { count: working }),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["en","pl","uuidv4","Map","Map","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/components/SettingsFormContent/index.tsx","../src/components/Map/Control/index.tsx","../src/components/Map/leafletLocale.ts","../src/components/Map/LayerSettings/index.tsx","../src/components/Map/utils.ts","../src/components/Map/useMap.tsx","../src/components/Map/styles.ts","../src/components/Map/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.1.14';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { FormControl, InputLabel, MenuItem, Select, Tab, TextField } from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\n\nimport { WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ data, formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('filters');\n\n // -- Translation --\n const { t } = useTranslation();\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('mapWidget.filters')} value=\"filters\" />\n <Tab label={t('mapWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"filters\">\n <FormControl sx={{ mt: 2 }} fullWidth>\n <InputLabel id=\"floor-plan-label\">{t('mapWidget.floorPlan')}</InputLabel>\n <Select\n name=\"floorPlanId\"\n labelId=\"floor-plan-label\"\n variant=\"outlined\"\n value={formProps.values.floorPlanId || ''}\n onChange={formProps.handleChange}\n fullWidth\n data-testid=\"settings.floor-plan-select\"\n >\n {data.floorPlans?.map((floorPlan) => (\n <MenuItem key={floorPlan.id} value={floorPlan.id}>\n {floorPlan.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('mapWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { JSX, createRef, useEffect, useState } from 'react';\n\nimport L from 'leaflet';\n\ninterface Props {\n mapRef: React.RefObject<L.Map | null>;\n position: L.ControlPosition;\n children?: React.ReactNode;\n container?: React.HTMLAttributes<HTMLDivElement>;\n prepend?: boolean;\n}\n\nconst POSITION_CLASSES = {\n bottomleft: 'leaflet-bottom leaflet-left',\n bottomright: 'leaflet-bottom leaflet-right',\n topleft: 'leaflet-top leaflet-left',\n topright: 'leaflet-top leaflet-right',\n};\n\nconst Control = (props: Props): JSX.Element => {\n const [portalRoot, setPortalRoot] = useState<any>(document.createElement('div'));\n const positionClass = (props.position && POSITION_CLASSES[props.position]) || POSITION_CLASSES.topright;\n const controlsContainer = props.mapRef.current?.getContainer().getElementsByClassName(positionClass);\n const controlContainerRef = createRef<HTMLDivElement>();\n\n useEffect(() => {\n if (controlsContainer) {\n setPortalRoot(controlsContainer[0]);\n }\n }, [controlsContainer]);\n\n useEffect(() => {\n if (portalRoot !== null) {\n if (props.prepend !== undefined && props.prepend === true) {\n portalRoot.prepend(controlContainerRef.current);\n } else {\n portalRoot.append(controlContainerRef.current);\n }\n }\n }, [portalRoot, props.prepend, controlContainerRef]);\n\n const className = (props.container?.className?.concat(' ') || '') + 'leaflet-control';\n return (\n <div {...props.container} ref={controlContainerRef} className={className}>\n {props.children}\n </div>\n );\n};\n\nexport default Control;\n","import L from 'leaflet';\n\nexport const setLeafletLocale = (t: (key: string) => string) => {\n // leaflet-draw extends L with drawLocal but has no @types package.\n // Must access inside the function — at module load time leaflet-draw may not be evaluated yet.\n const drawLocal = (L as any).drawLocal;\n if (!drawLocal) return;\n\n drawLocal.draw.toolbar.actions.text = t('mapWidget.leaflet.draw.toolbar.actions.text');\n drawLocal.draw.toolbar.finish.text = t('mapWidget.leaflet.draw.toolbar.finish.text');\n drawLocal.draw.toolbar.undo.text = t('mapWidget.leaflet.draw.toolbar.undo.text');\n\n drawLocal.draw.handlers.polygon.tooltip.start = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.start');\n drawLocal.draw.handlers.polygon.tooltip.cont = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.cont');\n drawLocal.draw.handlers.polygon.tooltip.end = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.end');\n\n drawLocal.edit.toolbar.actions.save.text = t('mapWidget.leaflet.edit.toolbar.actions.save.text');\n drawLocal.edit.toolbar.actions.cancel.text = t('mapWidget.leaflet.edit.toolbar.actions.cancel.text');\n drawLocal.edit.toolbar.actions.clearAll.text = t('mapWidget.leaflet.edit.toolbar.actions.clearAll.text');\n\n drawLocal.edit.toolbar.buttons.edit = t('mapWidget.leaflet.edit.toolbar.buttons.edit');\n drawLocal.edit.toolbar.buttons.editDisabled = t('mapWidget.leaflet.edit.toolbar.buttons.editDisabled');\n drawLocal.edit.toolbar.buttons.remove = t('mapWidget.leaflet.edit.toolbar.buttons.remove');\n drawLocal.edit.toolbar.buttons.removeDisabled = t('mapWidget.leaflet.edit.toolbar.buttons.removeDisabled');\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { FormControl, InputLabel, MenuItem, Select } from '@mui/material';\n\nimport { WidgetViewData } from '@/types';\n\nimport { ShapeLayer } from '../types';\n\ninterface LayerSettingsProps {\n data: WidgetViewData;\n layer: ShapeLayer;\n updateFeature: (feature: GeoJSON.Feature) => Promise<void>;\n}\n\nexport const LayerSettings: React.FC<LayerSettingsProps> = ({ data, layer, updateFeature }) => {\n const { t } = useTranslation();\n const assignWorkplace = async (workplaceId: string) => {\n const feature = layer?.feature;\n\n if (feature) {\n feature.properties.workplaceId = workplaceId;\n\n await updateFeature(feature);\n }\n };\n\n return (\n <FormControl fullWidth>\n <InputLabel id=\"workplace-label\">{t('mapWidget.workplace')}</InputLabel>\n <Select\n labelId=\"workplace-label\"\n variant=\"outlined\"\n value={layer.feature?.properties.workplaceId || ''}\n onChange={(e) => assignWorkplace(e.target.value)}\n data-testid=\"layer-settings.workplace-select\"\n >\n {data.workplaces?.map((workplace) => (\n <MenuItem key={workplace.id} value={workplace.id}>\n {workplace.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import { Dimensions } from 'react-image-size';\n\nimport { AndonLightColor } from 'andoncloud-dashboard-toolkit';\nimport L, { Content } from 'leaflet';\n\nimport { ShapeLayer } from './types';\n\nexport const DEFAULT_STYLE = { fillColor: '#cccccc', fillOpacity: 0.65, color: '#cccccc' };\n\nexport const mapStatusColorToHex = (color: AndonLightColor): string => {\n switch (color) {\n case 'green':\n return '#2ACB42';\n case 'red':\n return '#FF453A';\n case 'yellow':\n return '#FFC12F';\n default:\n return '#525860';\n }\n};\n\nexport const calcImageBounds = (map: L.Map, imageDimensions: Dimensions) => {\n const topLeftLatLng = map.unproject([0, 0], map.getMaxZoom());\n const bottomRightLatLng = map.unproject([imageDimensions.width, imageDimensions.height], map.getMaxZoom());\n\n return new L.LatLngBounds(topLeftLatLng, bottomRightLatLng);\n};\n\nexport const makeDraggable = (layer: ShapeLayer) => {\n // @ts-ignore no typings\n layer.makeDraggable();\n};\n\nexport const setInitialStyles = (layer: ShapeLayer) => {\n layer.setStyle(DEFAULT_STYLE);\n};\n\nexport const bindTooltip = (content: Content, layer: ShapeLayer) => {\n layer.bindTooltip(content, {\n permanent: true,\n direction: 'center',\n });\n};\n\nexport const centerTooltip = (layer: ShapeLayer) => {\n layer.getTooltip()?.setLatLng(layer.getCenter());\n};\n\nconst DUPLICATE_OFFSET = 30;\n\nexport const offsetLatLngs = (latLngs: L.LatLng[][] | L.LatLng[]): L.LatLng[][] | L.LatLng[] =>\n latLngs.map((item: L.LatLng | L.LatLng[]) => {\n if (Array.isArray(item)) {\n return item.map((ll) => L.latLng(ll.lat + DUPLICATE_OFFSET, ll.lng + DUPLICATE_OFFSET));\n }\n return L.latLng(item.lat + DUPLICATE_OFFSET, item.lng + DUPLICATE_OFFSET);\n }) as L.LatLng[][] | L.LatLng[];\n","import 'leaflet-contextmenu';\nimport 'leaflet-path-drag';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Dimensions, getImageSize } from 'react-image-size';\n\nimport L, { Content } from 'leaflet';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { MapProps } from '@/types';\n\nimport { LayerSettings } from './LayerSettings';\nimport { ShapeLayer } from './types';\nimport {\n bindTooltip,\n centerTooltip,\n makeDraggable,\n mapStatusColorToHex,\n offsetLatLngs,\n setInitialStyles,\n} from './utils';\n\nconst useMap = ({ data, settings, updateSettings, updateSidePanelProps, editMode }: MapProps) => {\n // Refs\n const containerRef = useRef(null);\n const mapRef = useRef<L.Map>(null);\n const prevActiveLayerRef = useRef<ShapeLayer | null>(null);\n const updateFeatureRef = useRef<typeof updateFeature>(null);\n const onDrawCreatedRef = useRef<typeof onDrawCreated>(null);\n const onDrawEditedRef = useRef<typeof onDrawEdited>(null);\n const onDrawDeletedRef = useRef<typeof onDrawDeleted>(null);\n const featureGroupRef = useRef<L.FeatureGroup | null>(null);\n const editModeRef = useRef<boolean>(!!editMode);\n\n // State\n const [imageUrl, setImageUrl] = useState<string>();\n const [imageDimensions, setImageDimensions] = useState<Dimensions | null>(null);\n const [featureGroup, setFeatureGroup] = useState<L.FeatureGroup | null>(null);\n const [activeLayer, setActiveLayer] = useState<ShapeLayer | null>(null);\n const [viewChanged, setViewChanged] = useState(false);\n\n const { t } = useTranslation();\n\n // --- Callbacks: tooltip/popup helpers (need mapRef) ---\n\n const openTooltip = useCallback((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (tooltip) {\n mapRef.current?.openTooltip(tooltip);\n }\n }, []);\n\n const closeTooltip = useCallback((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (tooltip) {\n mapRef.current?.closeTooltip(tooltip);\n }\n }, []);\n\n const bindPopup = useCallback((content: Content, layer: ShapeLayer) => {\n const currentPopup = layer.getPopup();\n\n if (currentPopup) {\n currentPopup.setContent(content);\n mapRef.current?.openPopup(currentPopup);\n } else {\n layer\n .bindPopup(content, {\n closeButton: false,\n closeOnClick: false,\n closeOnEscapeKey: false,\n autoClose: false,\n offset: L.point(0, -2),\n })\n .openPopup();\n\n // @ts-expect-error private method\n layer.off('click', layer._openPopup);\n }\n }, []);\n\n // --- Callbacks: settings mutations ---\n\n const createFeature = useCallback(\n async (feature: GeoJSON.Feature) => {\n if (updateSettings) {\n await updateSettings({\n features: [...(settings?.features || []), feature],\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const updateFeature = useCallback(\n async (updatedFeature: GeoJSON.Feature) => {\n if (updateSettings) {\n await updateSettings({\n features: settings?.features.map((feature) => {\n if (feature.properties?.id === updatedFeature.properties?.id) {\n return updatedFeature;\n }\n return feature;\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const updateFeatures = useCallback(\n async (updatedLayers: ShapeLayer[]) => {\n if (updateSettings) {\n const updatedMapping = updatedLayers.reduce((acc, layer) => {\n const feature = layer.toGeoJSON();\n\n return { ...acc, [feature.properties?.id]: feature };\n }, {});\n\n await updateSettings({\n features: settings?.features.map((feature) => {\n const featureId = feature.properties?.id;\n\n if (featureId in updatedMapping) {\n // @ts-expect-error no typings\n return updatedMapping[featureId];\n }\n return feature;\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const removeFeatures = useCallback(\n async (removedLayers: ShapeLayer[]) => {\n if (updateSettings) {\n const removedIds = removedLayers.map((layer) => (layer.feature as GeoJSON.Feature).properties?.id);\n\n await updateSettings({\n features: settings?.features.filter((feature) => {\n return !removedIds.includes(feature.properties?.id);\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const getWorkplaceName = useCallback(\n (workplaceId: string) => {\n return data.workplaces?.find((workplace) => workplace.id === workplaceId)?.name || '';\n },\n [data?.workplaces],\n );\n\n // --- Callbacks: layer event binding ---\n\n const bindEvents = useCallback(\n (layer: ShapeLayer) => {\n layer.on('click', () => {\n if (editModeRef.current) {\n setActiveLayer(layer);\n }\n });\n // @ts-ignore no typings\n if (layer?._events?.dragstart) {\n layer.off('dragstart');\n }\n // @ts-ignore no typings\n if (layer?._events?.dragend) {\n layer.off('dragend');\n }\n layer.on('dragstart', () => {\n closeTooltip(layer);\n });\n layer.on('dragend', () => {\n const _updateFeature = updateFeatureRef.current;\n\n if (_updateFeature) {\n _updateFeature(layer.toGeoJSON());\n }\n centerTooltip(layer);\n openTooltip(layer);\n\n const popup = layer.getPopup();\n\n if (popup) {\n popup.setLatLng(layer.getCenter());\n mapRef.current?.openPopup(popup);\n }\n });\n },\n [closeTooltip, openTooltip],\n );\n\n const bindContextMenu = useCallback(\n (layer: ShapeLayer) => {\n // @ts-ignore no typings\n layer.bindContextMenu({\n contextmenuItems: [\n {\n text: t('mapWidget.duplicate'),\n callback: async () => {\n const originalLatLngs = layer.getLatLngs() as L.LatLng[][];\n const duplicatedLayer = L.polygon(\n offsetLatLngs(originalLatLngs) as L.LatLng[][],\n ) as unknown as ShapeLayer;\n\n const _onDrawCreated = onDrawCreatedRef.current;\n\n if (_onDrawCreated) {\n await _onDrawCreated(duplicatedLayer);\n }\n setActiveLayer(duplicatedLayer);\n // @ts-ignore no typings\n duplicatedLayer.dragging.enable();\n featureGroupRef.current?.addLayer(duplicatedLayer);\n },\n },\n ],\n });\n },\n [t],\n );\n\n // --- Callbacks: feature loading ---\n\n const loadFeatures = useCallback(\n (fg: L.FeatureGroup, features: GeoJSON.Feature[]) => {\n fg.clearLayers();\n\n const geoJSON = new L.GeoJSON({ type: 'FeatureCollection', features } as GeoJSON.FeatureCollection, {\n onEachFeature: (_, layer: ShapeLayer) => {\n bindEvents(layer);\n bindContextMenu(layer);\n makeDraggable(layer);\n setInitialStyles(layer);\n },\n });\n\n geoJSON.eachLayer((layer: ShapeLayer) => {\n fg.addLayer(layer);\n });\n },\n [bindEvents, bindContextMenu],\n );\n\n const setControlsDisplay = useCallback(\n (value: boolean) => {\n if (featureGroup) {\n const containers = document.getElementsByClassName('leaflet-control-container');\n\n Array.from(containers).forEach((container: HTMLDivElement) => {\n container.style['display'] = value ? 'block' : 'none';\n });\n }\n },\n [featureGroup],\n );\n\n // --- Callbacks: draw event handlers ---\n\n const onDrawCreated = useCallback(\n async (layer: ShapeLayer) => {\n const feature = layer.toGeoJSON();\n\n feature.properties = { ...(feature.properties || {}), id: uuidv4() };\n\n if (!layer.feature) {\n layer.feature = feature;\n }\n await createFeature(feature);\n\n bindEvents(layer);\n bindContextMenu(layer);\n makeDraggable(layer);\n setInitialStyles(layer);\n },\n [createFeature, bindEvents, bindContextMenu],\n );\n\n const onDrawEdited = useCallback(\n async (layers: ShapeLayer[]) => {\n await updateFeatures(layers);\n\n layers.forEach((layer: ShapeLayer) => {\n centerTooltip(layer);\n });\n },\n [updateFeatures],\n );\n\n const onDrawDeleted = useCallback(\n async (layers: ShapeLayer[]) => {\n await removeFeatures(layers);\n setActiveLayer(null);\n },\n [removeFeatures],\n );\n\n const onFeatureGroupReady = (_featureGroup: L.FeatureGroup) => {\n if (!featureGroup) {\n loadFeatures(_featureGroup, settings?.features || []);\n setFeatureGroup(_featureGroup);\n }\n };\n\n const saveMapView = async () => {\n const map = mapRef.current;\n\n if (map && updateSettings) {\n await updateSettings({\n zoom: map.getZoom(),\n center: map.getCenter(),\n });\n setActiveLayer(null);\n setViewChanged(false);\n }\n };\n\n // --- Effects ---\n\n // Track map view changes via zoom/move events.\n // Uses featureGroup as trigger — when it's set, the map is guaranteed to be ready.\n useEffect(() => {\n const map = mapRef.current;\n\n if (!map) return;\n\n const onViewChange = () => setViewChanged(true);\n\n map.on('zoomend', onViewChange);\n map.on('moveend', onViewChange);\n\n return () => {\n map.off('zoomend', onViewChange);\n map.off('moveend', onViewChange);\n };\n }, [featureGroup]);\n\n // MapContainer ignores center/zoom prop changes after initial render.\n // Sync the map view when settings arrive (e.g. after API response).\n useEffect(() => {\n const map = mapRef.current;\n\n if (map && settings?.center && settings?.zoom) {\n map.setView(settings.center, settings.zoom, { animate: false });\n }\n }, [settings?.center, settings?.zoom]);\n\n useEffect(() => {\n const map = mapRef.current;\n\n setControlsDisplay(!!editMode);\n editModeRef.current = !!editMode;\n\n if (map) {\n if (editMode) {\n map.scrollWheelZoom.enable();\n map.dragging.enable();\n } else {\n map.scrollWheelZoom.disable();\n map.dragging.disable();\n setActiveLayer(null);\n }\n }\n }, [editMode, setControlsDisplay]);\n\n // Sync refs for stable callbacks used by Leaflet event handlers\n useEffect(() => {\n updateFeatureRef.current = updateFeature;\n }, [updateFeature]);\n\n useEffect(() => {\n onDrawCreatedRef.current = onDrawCreated;\n onDrawEditedRef.current = onDrawEdited;\n onDrawDeletedRef.current = onDrawDeleted;\n }, [onDrawCreated, onDrawEdited, onDrawDeleted]);\n\n useEffect(() => {\n featureGroupRef.current = featureGroup;\n }, [featureGroup]);\n\n // Side panel for layer settings\n useEffect(() => {\n if (activeLayer && activeLayer !== prevActiveLayerRef.current) {\n updateSidePanelProps({\n open: true,\n width: '25%',\n title: t('mapWidget.areaSettings'),\n mainContent: <LayerSettings data={data} layer={activeLayer} updateFeature={updateFeature} />,\n onClose: () => setActiveLayer(null),\n });\n } else if (!activeLayer && prevActiveLayerRef.current) {\n updateSidePanelProps({ open: false });\n }\n prevActiveLayerRef.current = activeLayer;\n }, [data, activeLayer, updateFeature, updateSidePanelProps, t]);\n\n // Toggle dragging on active layer\n useEffect(() => {\n featureGroup?.eachLayer((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (layer === activeLayer) {\n // @ts-ignore no typings\n layer.dragging.enable();\n } else {\n // @ts-ignore no typings\n layer.dragging.disable();\n\n if (tooltip) {\n mapRef.current?.openTooltip(tooltip);\n }\n }\n });\n }, [activeLayer, featureGroup]);\n\n // Load floor plan image\n useEffect(() => {\n const floorPlanUrl = data.floorPlans?.find((floorPlan) => floorPlan.id === settings?.floorPlanId)?.imageUrl;\n\n if (floorPlanUrl) {\n setImageUrl(floorPlanUrl);\n\n getImageSize(floorPlanUrl)\n .then((dimensions) => setImageDimensions(dimensions))\n .catch(() => {});\n }\n }, [data?.floorPlans, settings?.floorPlanId]);\n\n // Reload features when settings arrive after initial render (race condition fix).\n // Only fires when featureGroup is empty — avoids clearing user-drawn layers.\n // Must run BEFORE the tooltip/status effect below so layers exist when tooltips are bound.\n useEffect(() => {\n if (featureGroup && settings?.features?.length && featureGroup.getLayers().length === 0) {\n loadFeatures(featureGroup, settings.features);\n }\n }, [featureGroup, settings?.features, loadFeatures]);\n\n // Apply status colors, tooltips, and popups to feature layers\n useEffect(() => {\n const getCurrentStatusChange = (workplaceId: string) =>\n (data?.statusChanges || [])\n .filter((statusChange) => statusChange.workplaceId === workplaceId)\n .sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime())\n .pop();\n\n featureGroup?.getLayers().forEach((layer: ShapeLayer) => {\n const workplaceId = layer.feature?.properties.workplaceId;\n\n if (workplaceId) {\n const statusChange = getCurrentStatusChange(workplaceId);\n const statusColor = statusChange?.reason.statusColor;\n\n if (statusColor) {\n const color = mapStatusColorToHex(statusColor);\n\n layer.setStyle({ fillColor: color, fillOpacity: 0.65, color });\n } else {\n setInitialStyles(layer);\n }\n bindTooltip(getWorkplaceName(workplaceId), layer);\n\n if (statusChange?.order || statusChange?.product) {\n const orderNumberLabel = t('mapWidget.orderNumber');\n const productNumberLabel = t('mapWidget.productNumber');\n\n bindPopup(\n `\n <div>\n <p>${orderNumberLabel}: ${statusChange.order?.number || '-'}</p>\n <p>${productNumberLabel}: ${statusChange.product?.number || '-'}</p>\n <div>\n `,\n layer,\n );\n } else {\n mapRef.current?.closePopup(layer.getPopup());\n }\n }\n });\n }, [data, settings, featureGroup, getWorkplaceName, bindPopup, t]);\n\n return {\n containerRef,\n mapRef,\n imageUrl,\n imageDimensions,\n viewChanged,\n onFeatureGroupReady,\n onDrawCreatedRef,\n onDrawEditedRef,\n onDrawDeletedRef,\n saveMapView,\n };\n};\n\nexport default useMap;\n","import { SxProps, Theme } from '@mui/material/styles';\n\nconst styles: Record<string, SxProps<Theme>> = {\n saveButton: {\n padding: (theme) => theme.spacing(0.25, 3),\n fontSize: (theme) => theme.typography.pxToRem(14),\n '&.Mui-disabled': {\n color: 'rgba(255, 255, 255, 0.25)',\n },\n },\n};\n\nexport default styles;\n","import 'leaflet/dist/leaflet.css';\nimport 'leaflet-draw/dist/leaflet.draw.css';\nimport 'leaflet-contextmenu/dist/leaflet.contextmenu.css';\n\nimport { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FeatureGroup, ImageOverlay, MapContainer, ZoomControl } from 'react-leaflet';\nimport { EditControl } from 'react-leaflet-draw';\n\nimport { Box, Button } from '@mui/material';\nimport useSize from '@react-hook/size';\n\nimport { MapProps } from '@/types';\n\nimport Control from './Control';\nimport { setLeafletLocale } from './leafletLocale';\nimport useMap from './useMap';\nimport { calcImageBounds } from './utils';\n\nimport styles from './styles';\n\nconst Map: React.FC<MapProps> = ({ settings, ...props }) => {\n const { t } = useTranslation();\n\n useEffect(() => {\n setLeafletLocale(t);\n }, [t]);\n\n const {\n containerRef,\n mapRef,\n imageUrl,\n imageDimensions,\n viewChanged,\n onFeatureGroupReady,\n onDrawCreatedRef,\n onDrawEditedRef,\n onDrawDeletedRef,\n saveMapView,\n } = useMap({ settings, ...props });\n\n const [width, height] = useSize(containerRef.current);\n\n useEffect(() => {\n mapRef.current?.invalidateSize();\n }, [width, height]);\n\n return (\n <Box\n ref={containerRef}\n width=\"100%\"\n height=\"100%\"\n zIndex=\"0\"\n sx={{ position: 'relative' }}\n data-testid=\"map.container\"\n >\n <MapContainer\n ref={mapRef}\n center={settings?.center || [width / 2, height / 2]}\n minZoom={1}\n maxZoom={5}\n zoom={settings?.zoom || 1}\n zoomSnap={0.1}\n zoomDelta={0.1}\n wheelPxPerZoomLevel={600}\n zoomControl={false}\n doubleClickZoom={false}\n touchZoom={false}\n // @ts-expect-error leaflet-contextmenu extends MapOptions\n contextmenu\n >\n {mapRef.current && imageUrl && imageDimensions && (\n <ImageOverlay url={imageUrl} bounds={calcImageBounds(mapRef.current, imageDimensions)} />\n )}\n <FeatureGroup\n ref={(featureGroup) => {\n if (featureGroup) onFeatureGroupReady(featureGroup);\n }}\n >\n <EditControl\n draw={{\n polyline: false,\n polygon: true,\n rectangle: false,\n circle: false,\n marker: false,\n circlemarker: false,\n }}\n onCreated={async ({ layer }) => {\n const _onDrawCreated = onDrawCreatedRef.current;\n\n if (_onDrawCreated) {\n await _onDrawCreated(layer);\n }\n }}\n onEdited={async ({ layers }) => {\n const _onDrawEdited = onDrawEditedRef.current;\n\n if (_onDrawEdited) {\n await _onDrawEdited(layers.getLayers());\n }\n }}\n onDeleted={async ({ layers }) => {\n const _onDrawDeleted = onDrawDeletedRef.current;\n\n if (_onDrawDeleted) {\n await _onDrawDeleted(layers.getLayers());\n }\n }}\n position=\"topleft\"\n />\n </FeatureGroup>\n <ZoomControl position=\"topright\" />\n <Control mapRef={mapRef} position=\"topright\">\n <Button\n onClick={() => saveMapView()}\n disabled={!viewChanged}\n sx={styles.saveButton}\n data-testid=\"map.freeze-button\"\n >\n {t('mapWidget.freeze')}\n </Button>\n </Control>\n </MapContainer>\n </Box>\n );\n};\n\nexport default Map;\n","import { WidgetViewProps } from '@/types';\n\nimport Map from '../Map';\n\nconst WidgetView: React.FC<WidgetViewProps> = (props) => {\n return <Map {...props} />;\n};\n\nexport default WidgetView;\n","import { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('mapWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n floorPlanId: '',\n },\n validationSchema: yup.object({\n floorPlanId: yup.string().required(),\n }),\n };\n};\n","import { useEffect, useState } from 'react';\n\nimport {\n StatusChange,\n useGqlClients,\n WidgetProps,\n WorkplaceEvent,\n WorkplaceEventDocument,\n WorkplaceEventSubscriptionPayload,\n} from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\nimport { print } from 'graphql';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [gqlWsSubscribed, setGqlWsSubscribed] = useState<boolean>(false);\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!widgetData && graphqlSdk) {\n graphqlSdk\n .listWorkplaces()\n .then(({ workplaces }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n workplaces,\n }));\n })\n .catch(() => {});\n\n graphqlSdk\n .listStatusChanges()\n .then(({ statusChanges }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges,\n })),\n )\n .catch(() => {});\n\n graphqlSdk\n .listFloorPlans()\n .then(({ floorPlans }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n floorPlans,\n }));\n })\n .catch(() => {});\n }\n if (widgetData?.workplaces && gqlWsClient && !gqlWsSubscribed) {\n widgetData.workplaces.forEach(({ id }) => {\n gqlWsClient.subscribe<WorkplaceEventSubscriptionPayload>(\n print(WorkplaceEventDocument),\n { id },\n ({ event, subject }) => {\n if (event === WorkplaceEvent.StatusChangeCreated) {\n const statusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges: [statusChange, ...current.statusChanges],\n }));\n } else if (event === WorkplaceEvent.StatusChangeUpdated) {\n const updatedStatusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => {\n const statusChanges = current.statusChanges.map((statusChange) =>\n statusChange.id === updatedStatusChange.id ? updatedStatusChange : statusChange,\n );\n return {\n ...(current || {}),\n statusChanges,\n };\n });\n }\n },\n );\n setGqlWsSubscribed(true);\n });\n }\n }, [data, graphqlSdk, gqlWsClient, gqlWsSubscribed, widgetData]);\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"map-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'mapWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n const features = settings?.features;\n if (!features?.length) return name;\n\n const mapped = features.filter((f) => f.properties?.workplaceId).length;\n if (mapped === 0) return name;\n\n const statusChanges = data?.statusChanges ?? [];\n\n const latestByWorkplace = new Map<string, { startedAt: string; color: string }>();\n for (const sc of statusChanges) {\n const existing = latestByWorkplace.get(sc.workplaceId);\n if (!existing || sc.startedAt > existing.startedAt) {\n latestByWorkplace.set(sc.workplaceId, { startedAt: sc.startedAt, color: sc.reason?.statusColor ?? '' });\n }\n }\n\n let working = 0;\n let down = 0;\n for (const { color } of latestByWorkplace.values()) {\n if (color === 'green') working++;\n else if (color === 'red') down++;\n }\n\n const parts = [\n t('titleWorkplaces', lang, { count: mapped }),\n t('titleWorking', lang, { count: working }),\n t('titleDown', lang, { count: down }),\n ];\n\n return `${name} — ${parts.join(', ')}`;\n};\n","import './index.css';\n\nimport { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport const thumbnail: string | undefined = undefined;\n\nexport const requiredFeatures: string[] = ['feature.map-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["en","pl","uuidv4","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/components/SettingsFormContent/index.tsx","../src/components/Map/Control/index.tsx","../src/components/Map/leafletLocale.ts","../src/components/Map/LayerSettings/index.tsx","../src/components/Map/utils.ts","../src/components/Map/useMap.tsx","../src/components/Map/styles.ts","../src/components/Map/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.1.15';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { FormControl, InputLabel, MenuItem, Select, Tab, TextField } from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\n\nimport { WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ data, formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('filters');\n\n // -- Translation --\n const { t } = useTranslation();\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('mapWidget.filters')} value=\"filters\" />\n <Tab label={t('mapWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"filters\">\n <FormControl sx={{ mt: 2 }} fullWidth>\n <InputLabel id=\"floor-plan-label\">{t('mapWidget.floorPlan')}</InputLabel>\n <Select\n name=\"floorPlanId\"\n labelId=\"floor-plan-label\"\n variant=\"outlined\"\n value={formProps.values.floorPlanId || ''}\n onChange={formProps.handleChange}\n fullWidth\n data-testid=\"settings.floor-plan-select\"\n >\n {data.floorPlans?.map((floorPlan) => (\n <MenuItem key={floorPlan.id} value={floorPlan.id}>\n {floorPlan.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('mapWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { JSX, createRef, useEffect, useState } from 'react';\n\nimport L from 'leaflet';\n\ninterface Props {\n mapRef: React.RefObject<L.Map | null>;\n position: L.ControlPosition;\n children?: React.ReactNode;\n container?: React.HTMLAttributes<HTMLDivElement>;\n prepend?: boolean;\n}\n\nconst POSITION_CLASSES = {\n bottomleft: 'leaflet-bottom leaflet-left',\n bottomright: 'leaflet-bottom leaflet-right',\n topleft: 'leaflet-top leaflet-left',\n topright: 'leaflet-top leaflet-right',\n};\n\nconst Control = (props: Props): JSX.Element => {\n const [portalRoot, setPortalRoot] = useState<any>(document.createElement('div'));\n const positionClass = (props.position && POSITION_CLASSES[props.position]) || POSITION_CLASSES.topright;\n const controlsContainer = props.mapRef.current?.getContainer().getElementsByClassName(positionClass);\n const controlContainerRef = createRef<HTMLDivElement>();\n\n useEffect(() => {\n if (controlsContainer) {\n setPortalRoot(controlsContainer[0]);\n }\n }, [controlsContainer]);\n\n useEffect(() => {\n if (portalRoot !== null) {\n if (props.prepend !== undefined && props.prepend === true) {\n portalRoot.prepend(controlContainerRef.current);\n } else {\n portalRoot.append(controlContainerRef.current);\n }\n }\n }, [portalRoot, props.prepend, controlContainerRef]);\n\n const className = (props.container?.className?.concat(' ') || '') + 'leaflet-control';\n return (\n <div {...props.container} ref={controlContainerRef} className={className}>\n {props.children}\n </div>\n );\n};\n\nexport default Control;\n","import L from 'leaflet';\n\nexport const setLeafletLocale = (t: (key: string) => string) => {\n // leaflet-draw extends L with drawLocal but has no @types package.\n // Must access inside the function — at module load time leaflet-draw may not be evaluated yet.\n const drawLocal = (L as any).drawLocal;\n if (!drawLocal) return;\n\n drawLocal.draw.toolbar.actions.text = t('mapWidget.leaflet.draw.toolbar.actions.text');\n drawLocal.draw.toolbar.finish.text = t('mapWidget.leaflet.draw.toolbar.finish.text');\n drawLocal.draw.toolbar.undo.text = t('mapWidget.leaflet.draw.toolbar.undo.text');\n\n drawLocal.draw.handlers.polygon.tooltip.start = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.start');\n drawLocal.draw.handlers.polygon.tooltip.cont = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.cont');\n drawLocal.draw.handlers.polygon.tooltip.end = t('mapWidget.leaflet.draw.handlers.polygon.tooltip.end');\n\n drawLocal.edit.toolbar.actions.save.text = t('mapWidget.leaflet.edit.toolbar.actions.save.text');\n drawLocal.edit.toolbar.actions.cancel.text = t('mapWidget.leaflet.edit.toolbar.actions.cancel.text');\n drawLocal.edit.toolbar.actions.clearAll.text = t('mapWidget.leaflet.edit.toolbar.actions.clearAll.text');\n\n drawLocal.edit.toolbar.buttons.edit = t('mapWidget.leaflet.edit.toolbar.buttons.edit');\n drawLocal.edit.toolbar.buttons.editDisabled = t('mapWidget.leaflet.edit.toolbar.buttons.editDisabled');\n drawLocal.edit.toolbar.buttons.remove = t('mapWidget.leaflet.edit.toolbar.buttons.remove');\n drawLocal.edit.toolbar.buttons.removeDisabled = t('mapWidget.leaflet.edit.toolbar.buttons.removeDisabled');\n};\n","import { useTranslation } from 'react-i18next';\n\nimport { FormControl, InputLabel, MenuItem, Select } from '@mui/material';\n\nimport { WidgetViewData } from '@/types';\n\nimport { ShapeLayer } from '../types';\n\ninterface LayerSettingsProps {\n data: WidgetViewData;\n layer: ShapeLayer;\n updateFeature: (feature: GeoJSON.Feature) => Promise<void>;\n}\n\nexport const LayerSettings: React.FC<LayerSettingsProps> = ({ data, layer, updateFeature }) => {\n const { t } = useTranslation();\n const assignWorkplace = async (workplaceId: string) => {\n const feature = layer?.feature;\n\n if (feature) {\n feature.properties.workplaceId = workplaceId;\n\n await updateFeature(feature);\n }\n };\n\n return (\n <FormControl fullWidth>\n <InputLabel id=\"workplace-label\">{t('mapWidget.workplace')}</InputLabel>\n <Select\n labelId=\"workplace-label\"\n variant=\"outlined\"\n value={layer.feature?.properties.workplaceId || ''}\n onChange={(e) => assignWorkplace(e.target.value)}\n data-testid=\"layer-settings.workplace-select\"\n >\n {data.workplaces?.map((workplace) => (\n <MenuItem key={workplace.id} value={workplace.id}>\n {workplace.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","import { Dimensions } from 'react-image-size';\n\nimport { AndonLightColor } from 'andoncloud-dashboard-toolkit';\nimport L, { Content } from 'leaflet';\n\nimport { ShapeLayer } from './types';\n\nexport const DEFAULT_STYLE = { fillColor: '#cccccc', fillOpacity: 0.65, color: '#cccccc' };\n\nexport const mapStatusColorToHex = (color: AndonLightColor): string => {\n switch (color) {\n case 'green':\n return '#2ACB42';\n case 'red':\n return '#FF453A';\n case 'yellow':\n return '#FFC12F';\n default:\n return '#525860';\n }\n};\n\nexport const calcImageBounds = (map: L.Map, imageDimensions: Dimensions) => {\n const topLeftLatLng = map.unproject([0, 0], map.getMaxZoom());\n const bottomRightLatLng = map.unproject([imageDimensions.width, imageDimensions.height], map.getMaxZoom());\n\n return new L.LatLngBounds(topLeftLatLng, bottomRightLatLng);\n};\n\nexport const makeDraggable = (layer: ShapeLayer) => {\n // @ts-ignore no typings\n layer.makeDraggable();\n};\n\nexport const setInitialStyles = (layer: ShapeLayer) => {\n layer.setStyle(DEFAULT_STYLE);\n};\n\nexport const bindTooltip = (content: Content, layer: ShapeLayer) => {\n layer.bindTooltip(content, {\n permanent: true,\n direction: 'center',\n });\n};\n\nexport const centerTooltip = (layer: ShapeLayer) => {\n layer.getTooltip()?.setLatLng(layer.getCenter());\n};\n\nconst DUPLICATE_OFFSET = 30;\n\nexport const offsetLatLngs = (latLngs: L.LatLng[][] | L.LatLng[]): L.LatLng[][] | L.LatLng[] =>\n latLngs.map((item: L.LatLng | L.LatLng[]) => {\n if (Array.isArray(item)) {\n return item.map((ll) => L.latLng(ll.lat + DUPLICATE_OFFSET, ll.lng + DUPLICATE_OFFSET));\n }\n return L.latLng(item.lat + DUPLICATE_OFFSET, item.lng + DUPLICATE_OFFSET);\n }) as L.LatLng[][] | L.LatLng[];\n","import 'leaflet-contextmenu';\nimport 'leaflet-path-drag';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Dimensions, getImageSize } from 'react-image-size';\n\nimport L, { Content } from 'leaflet';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { MapProps } from '@/types';\n\nimport { LayerSettings } from './LayerSettings';\nimport { ShapeLayer } from './types';\nimport {\n bindTooltip,\n centerTooltip,\n makeDraggable,\n mapStatusColorToHex,\n offsetLatLngs,\n setInitialStyles,\n} from './utils';\n\nconst useMap = ({ data, settings, updateSettings, updateSidePanelProps, editMode }: MapProps) => {\n // Refs\n const containerRef = useRef(null);\n const mapRef = useRef<L.Map>(null);\n const prevActiveLayerRef = useRef<ShapeLayer | null>(null);\n const updateFeatureRef = useRef<typeof updateFeature>(null);\n const onDrawCreatedRef = useRef<typeof onDrawCreated>(null);\n const onDrawEditedRef = useRef<typeof onDrawEdited>(null);\n const onDrawDeletedRef = useRef<typeof onDrawDeleted>(null);\n const featureGroupRef = useRef<L.FeatureGroup | null>(null);\n const editModeRef = useRef<boolean>(!!editMode);\n\n // State\n const [imageUrl, setImageUrl] = useState<string>();\n const [imageDimensions, setImageDimensions] = useState<Dimensions | null>(null);\n const [featureGroup, setFeatureGroup] = useState<L.FeatureGroup | null>(null);\n const [activeLayer, setActiveLayer] = useState<ShapeLayer | null>(null);\n const [viewChanged, setViewChanged] = useState(false);\n\n const { t } = useTranslation();\n\n // --- Callbacks: tooltip/popup helpers (need mapRef) ---\n\n const openTooltip = useCallback((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (tooltip) {\n mapRef.current?.openTooltip(tooltip);\n }\n }, []);\n\n const closeTooltip = useCallback((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (tooltip) {\n mapRef.current?.closeTooltip(tooltip);\n }\n }, []);\n\n const bindPopup = useCallback((content: Content, layer: ShapeLayer) => {\n const currentPopup = layer.getPopup();\n\n if (currentPopup) {\n currentPopup.setContent(content);\n mapRef.current?.openPopup(currentPopup);\n } else {\n layer\n .bindPopup(content, {\n closeButton: false,\n closeOnClick: false,\n closeOnEscapeKey: false,\n autoClose: false,\n offset: L.point(0, -2),\n })\n .openPopup();\n\n // @ts-expect-error private method\n layer.off('click', layer._openPopup);\n }\n }, []);\n\n // --- Callbacks: settings mutations ---\n\n const createFeature = useCallback(\n async (feature: GeoJSON.Feature) => {\n if (updateSettings) {\n await updateSettings({\n features: [...(settings?.features || []), feature],\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const updateFeature = useCallback(\n async (updatedFeature: GeoJSON.Feature) => {\n if (updateSettings) {\n await updateSettings({\n features: settings?.features.map((feature) => {\n if (feature.properties?.id === updatedFeature.properties?.id) {\n return updatedFeature;\n }\n return feature;\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const updateFeatures = useCallback(\n async (updatedLayers: ShapeLayer[]) => {\n if (updateSettings) {\n const updatedMapping = updatedLayers.reduce((acc, layer) => {\n const feature = layer.toGeoJSON();\n\n return { ...acc, [feature.properties?.id]: feature };\n }, {});\n\n await updateSettings({\n features: settings?.features.map((feature) => {\n const featureId = feature.properties?.id;\n\n if (featureId in updatedMapping) {\n // @ts-expect-error no typings\n return updatedMapping[featureId];\n }\n return feature;\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const removeFeatures = useCallback(\n async (removedLayers: ShapeLayer[]) => {\n if (updateSettings) {\n const removedIds = removedLayers.map((layer) => (layer.feature as GeoJSON.Feature).properties?.id);\n\n await updateSettings({\n features: settings?.features.filter((feature) => {\n return !removedIds.includes(feature.properties?.id);\n }),\n });\n }\n },\n [settings?.features, updateSettings],\n );\n\n const getWorkplaceName = useCallback(\n (workplaceId: string) => {\n return data.workplaces?.find((workplace) => workplace.id === workplaceId)?.name || '';\n },\n [data?.workplaces],\n );\n\n // --- Callbacks: layer event binding ---\n\n const bindEvents = useCallback(\n (layer: ShapeLayer) => {\n layer.on('click', () => {\n if (editModeRef.current) {\n setActiveLayer(layer);\n }\n });\n // @ts-ignore no typings\n if (layer?._events?.dragstart) {\n layer.off('dragstart');\n }\n // @ts-ignore no typings\n if (layer?._events?.dragend) {\n layer.off('dragend');\n }\n layer.on('dragstart', () => {\n closeTooltip(layer);\n });\n layer.on('dragend', () => {\n const _updateFeature = updateFeatureRef.current;\n\n if (_updateFeature) {\n _updateFeature(layer.toGeoJSON());\n }\n centerTooltip(layer);\n openTooltip(layer);\n\n const popup = layer.getPopup();\n\n if (popup) {\n popup.setLatLng(layer.getCenter());\n mapRef.current?.openPopup(popup);\n }\n });\n },\n [closeTooltip, openTooltip],\n );\n\n const bindContextMenu = useCallback(\n (layer: ShapeLayer) => {\n // @ts-ignore no typings\n layer.bindContextMenu({\n contextmenuItems: [\n {\n text: t('mapWidget.duplicate'),\n callback: async () => {\n const originalLatLngs = layer.getLatLngs() as L.LatLng[][];\n const duplicatedLayer = L.polygon(\n offsetLatLngs(originalLatLngs) as L.LatLng[][],\n ) as unknown as ShapeLayer;\n\n const _onDrawCreated = onDrawCreatedRef.current;\n\n if (_onDrawCreated) {\n await _onDrawCreated(duplicatedLayer);\n }\n setActiveLayer(duplicatedLayer);\n // @ts-ignore no typings\n duplicatedLayer.dragging.enable();\n featureGroupRef.current?.addLayer(duplicatedLayer);\n },\n },\n ],\n });\n },\n [t],\n );\n\n // --- Callbacks: feature loading ---\n\n const loadFeatures = useCallback(\n (fg: L.FeatureGroup, features: GeoJSON.Feature[]) => {\n fg.clearLayers();\n\n const geoJSON = new L.GeoJSON({ type: 'FeatureCollection', features } as GeoJSON.FeatureCollection, {\n onEachFeature: (_, layer: ShapeLayer) => {\n bindEvents(layer);\n bindContextMenu(layer);\n makeDraggable(layer);\n setInitialStyles(layer);\n },\n });\n\n geoJSON.eachLayer((layer: ShapeLayer) => {\n fg.addLayer(layer);\n });\n },\n [bindEvents, bindContextMenu],\n );\n\n const setControlsDisplay = useCallback(\n (value: boolean) => {\n if (featureGroup) {\n const containers = document.getElementsByClassName('leaflet-control-container');\n\n Array.from(containers).forEach((container: HTMLDivElement) => {\n container.style['display'] = value ? 'block' : 'none';\n });\n }\n },\n [featureGroup],\n );\n\n // --- Callbacks: draw event handlers ---\n\n const onDrawCreated = useCallback(\n async (layer: ShapeLayer) => {\n const feature = layer.toGeoJSON();\n\n feature.properties = { ...(feature.properties || {}), id: uuidv4() };\n\n if (!layer.feature) {\n layer.feature = feature;\n }\n await createFeature(feature);\n\n bindEvents(layer);\n bindContextMenu(layer);\n makeDraggable(layer);\n setInitialStyles(layer);\n },\n [createFeature, bindEvents, bindContextMenu],\n );\n\n const onDrawEdited = useCallback(\n async (layers: ShapeLayer[]) => {\n await updateFeatures(layers);\n\n layers.forEach((layer: ShapeLayer) => {\n centerTooltip(layer);\n });\n },\n [updateFeatures],\n );\n\n const onDrawDeleted = useCallback(\n async (layers: ShapeLayer[]) => {\n await removeFeatures(layers);\n setActiveLayer(null);\n },\n [removeFeatures],\n );\n\n const onFeatureGroupReady = (_featureGroup: L.FeatureGroup) => {\n if (!featureGroup) {\n loadFeatures(_featureGroup, settings?.features || []);\n setFeatureGroup(_featureGroup);\n }\n };\n\n const saveMapView = async () => {\n const map = mapRef.current;\n\n if (map && updateSettings) {\n await updateSettings({\n zoom: map.getZoom(),\n center: map.getCenter(),\n });\n setActiveLayer(null);\n setViewChanged(false);\n }\n };\n\n // --- Effects ---\n\n // Track map view changes via zoom/move events.\n // Uses featureGroup as trigger — when it's set, the map is guaranteed to be ready.\n useEffect(() => {\n const map = mapRef.current;\n\n if (!map) return;\n\n const onViewChange = () => setViewChanged(true);\n\n map.on('zoomend', onViewChange);\n map.on('moveend', onViewChange);\n\n return () => {\n map.off('zoomend', onViewChange);\n map.off('moveend', onViewChange);\n };\n }, [featureGroup]);\n\n // MapContainer ignores center/zoom prop changes after initial render.\n // Sync the map view when settings arrive (e.g. after API response).\n useEffect(() => {\n const map = mapRef.current;\n\n if (map && settings?.center && settings?.zoom) {\n map.setView(settings.center, settings.zoom, { animate: false });\n }\n }, [settings?.center, settings?.zoom]);\n\n useEffect(() => {\n const map = mapRef.current;\n\n setControlsDisplay(!!editMode);\n editModeRef.current = !!editMode;\n\n if (map) {\n if (editMode) {\n map.scrollWheelZoom.enable();\n map.dragging.enable();\n } else {\n map.scrollWheelZoom.disable();\n map.dragging.disable();\n setActiveLayer(null);\n }\n }\n }, [editMode, setControlsDisplay]);\n\n // Sync refs for stable callbacks used by Leaflet event handlers\n useEffect(() => {\n updateFeatureRef.current = updateFeature;\n }, [updateFeature]);\n\n useEffect(() => {\n onDrawCreatedRef.current = onDrawCreated;\n onDrawEditedRef.current = onDrawEdited;\n onDrawDeletedRef.current = onDrawDeleted;\n }, [onDrawCreated, onDrawEdited, onDrawDeleted]);\n\n useEffect(() => {\n featureGroupRef.current = featureGroup;\n }, [featureGroup]);\n\n // Side panel for layer settings\n useEffect(() => {\n if (activeLayer && activeLayer !== prevActiveLayerRef.current) {\n updateSidePanelProps({\n open: true,\n width: '25%',\n title: t('mapWidget.areaSettings'),\n mainContent: <LayerSettings data={data} layer={activeLayer} updateFeature={updateFeature} />,\n onClose: () => setActiveLayer(null),\n });\n } else if (!activeLayer && prevActiveLayerRef.current) {\n updateSidePanelProps({ open: false });\n }\n prevActiveLayerRef.current = activeLayer;\n }, [data, activeLayer, updateFeature, updateSidePanelProps, t]);\n\n // Toggle dragging on active layer\n useEffect(() => {\n featureGroup?.eachLayer((layer: ShapeLayer) => {\n const tooltip = layer.getTooltip();\n\n if (layer === activeLayer) {\n // @ts-ignore no typings\n layer.dragging.enable();\n } else {\n // @ts-ignore no typings\n layer.dragging.disable();\n\n if (tooltip) {\n mapRef.current?.openTooltip(tooltip);\n }\n }\n });\n }, [activeLayer, featureGroup]);\n\n // Load floor plan image\n useEffect(() => {\n const floorPlanUrl = data.floorPlans?.find((floorPlan) => floorPlan.id === settings?.floorPlanId)?.imageUrl;\n\n if (floorPlanUrl) {\n setImageUrl(floorPlanUrl);\n\n getImageSize(floorPlanUrl)\n .then((dimensions) => setImageDimensions(dimensions))\n .catch(() => {});\n }\n }, [data?.floorPlans, settings?.floorPlanId]);\n\n // Reload features when settings arrive after initial render (race condition fix).\n // Only fires when featureGroup is empty — avoids clearing user-drawn layers.\n // Must run BEFORE the tooltip/status effect below so layers exist when tooltips are bound.\n useEffect(() => {\n if (featureGroup && settings?.features?.length && featureGroup.getLayers().length === 0) {\n loadFeatures(featureGroup, settings.features);\n }\n }, [featureGroup, settings?.features, loadFeatures]);\n\n // Apply status colors, tooltips, and popups to feature layers\n useEffect(() => {\n const getCurrentStatusChange = (workplaceId: string) =>\n (data?.statusChanges || [])\n .filter((statusChange) => statusChange.workplaceId === workplaceId)\n .sort((a, b) => new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime())\n .pop();\n\n featureGroup?.getLayers().forEach((layer: ShapeLayer) => {\n const workplaceId = layer.feature?.properties.workplaceId;\n\n if (workplaceId) {\n const statusChange = getCurrentStatusChange(workplaceId);\n const statusColor = statusChange?.reason.statusColor;\n\n if (statusColor) {\n const color = mapStatusColorToHex(statusColor);\n\n layer.setStyle({ fillColor: color, fillOpacity: 0.65, color });\n } else {\n setInitialStyles(layer);\n }\n bindTooltip(getWorkplaceName(workplaceId), layer);\n\n if (statusChange?.order || statusChange?.product) {\n const orderNumberLabel = t('mapWidget.orderNumber');\n const productNumberLabel = t('mapWidget.productNumber');\n\n bindPopup(\n `\n <div>\n <p>${orderNumberLabel}: ${statusChange.order?.number || '-'}</p>\n <p>${productNumberLabel}: ${statusChange.product?.number || '-'}</p>\n <div>\n `,\n layer,\n );\n } else {\n mapRef.current?.closePopup(layer.getPopup());\n }\n }\n });\n }, [data, settings, featureGroup, getWorkplaceName, bindPopup, t]);\n\n return {\n containerRef,\n mapRef,\n imageUrl,\n imageDimensions,\n viewChanged,\n onFeatureGroupReady,\n onDrawCreatedRef,\n onDrawEditedRef,\n onDrawDeletedRef,\n saveMapView,\n };\n};\n\nexport default useMap;\n","import { SxProps, Theme } from '@mui/material/styles';\n\nconst styles: Record<string, SxProps<Theme>> = {\n saveButton: {\n padding: (theme) => theme.spacing(0.25, 3),\n fontSize: (theme) => theme.typography.pxToRem(14),\n '&.Mui-disabled': {\n color: 'rgba(255, 255, 255, 0.25)',\n },\n },\n};\n\nexport default styles;\n","import 'leaflet/dist/leaflet.css';\nimport 'leaflet-draw/dist/leaflet.draw.css';\nimport 'leaflet-contextmenu/dist/leaflet.contextmenu.css';\n\nimport { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FeatureGroup, ImageOverlay, MapContainer, ZoomControl } from 'react-leaflet';\nimport { EditControl } from 'react-leaflet-draw';\n\nimport { Box, Button } from '@mui/material';\nimport useSize from '@react-hook/size';\n\nimport { MapProps } from '@/types';\n\nimport Control from './Control';\nimport { setLeafletLocale } from './leafletLocale';\nimport useMap from './useMap';\nimport { calcImageBounds } from './utils';\n\nimport styles from './styles';\n\nconst Map: React.FC<MapProps> = ({ settings, ...props }) => {\n const { t } = useTranslation();\n\n useEffect(() => {\n setLeafletLocale(t);\n }, [t]);\n\n const {\n containerRef,\n mapRef,\n imageUrl,\n imageDimensions,\n viewChanged,\n onFeatureGroupReady,\n onDrawCreatedRef,\n onDrawEditedRef,\n onDrawDeletedRef,\n saveMapView,\n } = useMap({ settings, ...props });\n\n const [width, height] = useSize(containerRef.current);\n\n useEffect(() => {\n mapRef.current?.invalidateSize();\n }, [width, height]);\n\n return (\n <Box\n ref={containerRef}\n width=\"100%\"\n height=\"100%\"\n zIndex=\"0\"\n sx={{ position: 'relative' }}\n data-testid=\"map.container\"\n >\n <MapContainer\n ref={mapRef}\n center={settings?.center || [width / 2, height / 2]}\n minZoom={1}\n maxZoom={5}\n zoom={settings?.zoom || 1}\n zoomSnap={0.1}\n zoomDelta={0.1}\n wheelPxPerZoomLevel={600}\n zoomControl={false}\n doubleClickZoom={false}\n touchZoom={false}\n // @ts-expect-error leaflet-contextmenu extends MapOptions\n contextmenu\n >\n {mapRef.current && imageUrl && imageDimensions && (\n <ImageOverlay url={imageUrl} bounds={calcImageBounds(mapRef.current, imageDimensions)} />\n )}\n <FeatureGroup\n ref={(featureGroup) => {\n if (featureGroup) onFeatureGroupReady(featureGroup);\n }}\n >\n <EditControl\n draw={{\n polyline: false,\n polygon: true,\n rectangle: false,\n circle: false,\n marker: false,\n circlemarker: false,\n }}\n onCreated={async ({ layer }) => {\n const _onDrawCreated = onDrawCreatedRef.current;\n\n if (_onDrawCreated) {\n await _onDrawCreated(layer);\n }\n }}\n onEdited={async ({ layers }) => {\n const _onDrawEdited = onDrawEditedRef.current;\n\n if (_onDrawEdited) {\n await _onDrawEdited(layers.getLayers());\n }\n }}\n onDeleted={async ({ layers }) => {\n const _onDrawDeleted = onDrawDeletedRef.current;\n\n if (_onDrawDeleted) {\n await _onDrawDeleted(layers.getLayers());\n }\n }}\n position=\"topleft\"\n />\n </FeatureGroup>\n <ZoomControl position=\"topright\" />\n <Control mapRef={mapRef} position=\"topright\">\n <Button\n onClick={() => saveMapView()}\n disabled={!viewChanged}\n sx={styles.saveButton}\n data-testid=\"map.freeze-button\"\n >\n {t('mapWidget.freeze')}\n </Button>\n </Control>\n </MapContainer>\n </Box>\n );\n};\n\nexport default Map;\n","import { WidgetViewProps } from '@/types';\n\nimport Map from '../Map';\n\nconst WidgetView: React.FC<WidgetViewProps> = (props) => {\n return <Map {...props} />;\n};\n\nexport default WidgetView;\n","import { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('mapWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n floorPlanId: '',\n },\n validationSchema: yup.object({\n floorPlanId: yup.string().required(),\n }),\n };\n};\n","import { useEffect, useState } from 'react';\n\nimport {\n StatusChange,\n useGqlClients,\n WidgetProps,\n WorkplaceEvent,\n WorkplaceEventDocument,\n WorkplaceEventSubscriptionPayload,\n} from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\nimport { print } from 'graphql';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [gqlWsSubscribed, setGqlWsSubscribed] = useState<boolean>(false);\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!widgetData && graphqlSdk) {\n graphqlSdk\n .listWorkplaces()\n .then(({ workplaces }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n workplaces,\n }));\n })\n .catch(() => {});\n\n graphqlSdk\n .listStatusChanges()\n .then(({ statusChanges }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges,\n })),\n )\n .catch(() => {});\n\n graphqlSdk\n .listFloorPlans()\n .then(({ floorPlans }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n floorPlans,\n }));\n })\n .catch(() => {});\n }\n if (widgetData?.workplaces && gqlWsClient && !gqlWsSubscribed) {\n widgetData.workplaces.forEach(({ id }) => {\n gqlWsClient.subscribe<WorkplaceEventSubscriptionPayload>(\n print(WorkplaceEventDocument),\n { id },\n ({ event, subject }) => {\n if (event === WorkplaceEvent.StatusChangeCreated) {\n const statusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges: [statusChange, ...current.statusChanges],\n }));\n } else if (event === WorkplaceEvent.StatusChangeUpdated) {\n const updatedStatusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => {\n const statusChanges = current.statusChanges.map((statusChange) =>\n statusChange.id === updatedStatusChange.id ? updatedStatusChange : statusChange,\n );\n return {\n ...(current || {}),\n statusChanges,\n };\n });\n }\n },\n );\n setGqlWsSubscribed(true);\n });\n }\n }, [data, graphqlSdk, gqlWsClient, gqlWsSubscribed, widgetData]);\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"map-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'mapWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n const features = settings?.features;\n if (!features?.length) return name;\n\n const mapped = features.filter((f) => f.properties?.workplaceId).length;\n if (mapped === 0) return name;\n\n const mappedWorkplaceIds = new Set(\n features.filter((f) => f.properties?.workplaceId).map((f) => f.properties.workplaceId),\n );\n\n const workplaces = data?.workplaces ?? [];\n\n let working = 0;\n let down = 0;\n for (const wp of workplaces) {\n if (!mappedWorkplaceIds.has(wp.id)) continue;\n const color = wp.currentStatusChange?.reason?.statusColor ?? '';\n if (color === 'green') working++;\n else if (color === 'red') down++;\n }\n\n const parts = [\n t('titleWorkplaces', lang, { count: mapped }),\n t('titleWorking', lang, { count: working }),\n t('titleDown', lang, { count: down }),\n ];\n\n return `${name} — ${parts.join(', ')}`;\n};\n","import './index.css';\n\nimport { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport const thumbnail: string | undefined = undefined;\n\nexport const requiredFeatures: string[] = ['feature.map-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|