andoncloud-workplaces-state-timelines-widget 1.2.8 → 1.2.10

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.
@@ -0,0 +1,47 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" fill="none">
2
+ <defs>
3
+ <mask id="m1"><rect x="80" y="14" width="232" height="16" rx="8" fill="white"/></mask>
4
+ <mask id="m2"><rect x="80" y="50" width="232" height="16" rx="8" fill="white"/></mask>
5
+ <mask id="m3"><rect x="80" y="86" width="232" height="16" rx="8" fill="white"/></mask>
6
+ <mask id="m4"><rect x="80" y="122" width="232" height="16" rx="8" fill="white"/></mask>
7
+ </defs>
8
+
9
+ <!-- Row 1 -->
10
+ <text x="16" y="22" font-size="10" font-family="Inter, system-ui" fill="#A7ADB6" dominant-baseline="central">CNC-01</text>
11
+ <text x="16" y="33" font-size="7" font-family="Inter, system-ui" fill="#A7ADB6" opacity="0.5" dominant-baseline="central">06:00 – 14:00</text>
12
+ <g mask="url(#m1)">
13
+ <rect x="80" y="14" width="232" height="16" fill="#11BD4C"/>
14
+ <rect x="180" y="14" width="132" height="16" fill="#FD2121"/>
15
+ <rect x="210" y="14" width="102" height="16" fill="#11BD4C"/>
16
+ <rect x="290" y="14" width="22" height="16" fill="#FFC107"/>
17
+ </g>
18
+
19
+ <!-- Row 2 -->
20
+ <text x="16" y="58" font-size="10" font-family="Inter, system-ui" fill="#A7ADB6" dominant-baseline="central">CNC-02</text>
21
+ <text x="16" y="69" font-size="7" font-family="Inter, system-ui" fill="#A7ADB6" opacity="0.5" dominant-baseline="central">06:00 – 14:00</text>
22
+ <g mask="url(#m2)">
23
+ <rect x="80" y="50" width="232" height="16" fill="#11BD4C"/>
24
+ <rect x="140" y="50" width="172" height="16" fill="#FFC107"/>
25
+ <rect x="160" y="50" width="152" height="16" fill="#11BD4C"/>
26
+ <rect x="280" y="50" width="32" height="16" fill="#FD2121"/>
27
+ </g>
28
+
29
+ <!-- Row 3 -->
30
+ <text x="16" y="94" font-size="10" font-family="Inter, system-ui" fill="#A7ADB6" dominant-baseline="central">WP-03</text>
31
+ <text x="16" y="105" font-size="7" font-family="Inter, system-ui" fill="#A7ADB6" opacity="0.5" dominant-baseline="central">06:00 – 14:00</text>
32
+ <g mask="url(#m3)">
33
+ <rect x="80" y="86" width="232" height="16" fill="#11BD4C"/>
34
+ <rect x="220" y="86" width="92" height="16" fill="#FD2121"/>
35
+ <rect x="260" y="86" width="52" height="16" fill="#11BD4C"/>
36
+ </g>
37
+
38
+ <!-- Row 4 -->
39
+ <text x="16" y="130" font-size="10" font-family="Inter, system-ui" fill="#A7ADB6" dominant-baseline="central">WP-04</text>
40
+ <text x="16" y="141" font-size="7" font-family="Inter, system-ui" fill="#A7ADB6" opacity="0.5" dominant-baseline="central">06:00 – 14:00</text>
41
+ <g mask="url(#m4)">
42
+ <rect x="80" y="122" width="232" height="16" fill="#FFC107"/>
43
+ <rect x="130" y="122" width="182" height="16" fill="#11BD4C"/>
44
+ <rect x="220" y="122" width="92" height="16" fill="#FD2121"/>
45
+ <rect x="245" y="122" width="67" height="16" fill="#11BD4C"/>
46
+ </g>
47
+ </svg>
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { t as thumbnail_default } from "./thumbnail-DANU3GTv.js";
1
2
  import { BaseWidgetData, BaseWidgetSettings, FilterValues, ListShifts_Shift, ListStatusChanges_StatusChange, ListWorkplaces_Workplace, WidgetProps } from "andoncloud-dashboard-toolkit";
2
3
  //#region src/types.d.ts
3
4
  interface WidgetViewData {
@@ -21,12 +22,11 @@ declare const getDisplayName: (lang: string) => string;
21
22
  declare const getTitle: (data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
22
23
  //#endregion
23
24
  //#region src/version.d.ts
24
- declare const LIBRARY_VERSION = "1.2.8";
25
+ declare const LIBRARY_VERSION = "1.2.10";
25
26
  //#endregion
26
27
  //#region src/index.d.ts
27
- declare const thumbnail: string | undefined;
28
28
  declare const requiredFeatures: string[];
29
29
  declare const extraPermissions: string[];
30
30
  //#endregion
31
- export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
31
+ export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
32
32
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { t as thumbnail_default } from "./thumbnail-DANU3GTv.js";
1
2
  import { registerTranslations } from "andoncloud-sdk";
2
3
  import { Fragment, useCallback, useEffect, useState } from "react";
3
4
  import { SortableSelect, WorkplaceEvent, WorkplaceEventDocument, getCurrentShift, normalizeShifts, useGqlClients } from "andoncloud-dashboard-toolkit";
@@ -26,7 +27,8 @@ const resources = {
26
27
  "selectAndArrangeTheOrder": "Select and arrange the order",
27
28
  "settings": "Settings",
28
29
  "thisFieldIsRequired": "This field is required",
29
- "displayName": "Status changes history for current shift",
30
+ "displayName": "Status changes history",
31
+ "titleCurrentShift": "current shift",
30
32
  "titleWorkplaces_one": "{{count}} workplace",
31
33
  "titleWorkplaces_other": "{{count}} workplaces",
32
34
  "workplaces": "Workplaces"
@@ -41,7 +43,8 @@ const resources = {
41
43
  "selectAndArrangeTheOrder": "Wybierz i ustal kolejność",
42
44
  "settings": "Ustawienia",
43
45
  "thisFieldIsRequired": "To pole jest wymagane",
44
- "displayName": "Historia zmian statusów dla obecnej zmiany",
46
+ "displayName": "Historia zmian statusów",
47
+ "titleCurrentShift": "aktualna zmiana",
45
48
  "titleWorkplaces_one": "{{count}} stanowisko",
46
49
  "titleWorkplaces_few": "{{count}} stanowiska",
47
50
  "titleWorkplaces_many": "{{count}} stanowisk",
@@ -50,7 +53,7 @@ const resources = {
50
53
  };
51
54
  //#endregion
52
55
  //#region src/version.ts
53
- const LIBRARY_VERSION = "1.2.8";
56
+ const LIBRARY_VERSION = "1.2.10";
54
57
  //#endregion
55
58
  //#region src/components/SettingsFormContent/index.tsx
56
59
  const SettingsFormContent = ({ data, formProps }) => {
@@ -362,15 +365,14 @@ const getTitle = (data, settings, _filters, lang) => {
362
365
  const selectedIds = settings?.workplacesIds?.length ? new Set(settings.workplacesIds) : null;
363
366
  const workplaces = selectedIds ? allWorkplaces.filter((wp) => selectedIds.has(wp.id)) : allWorkplaces;
364
367
  if (!workplaces.length) return name;
365
- return `${name} — ${t("titleWorkplaces", lang, { count: workplaces.length })}`;
368
+ return `${name} — ${t("titleCurrentShift", lang)}, ${t("titleWorkplaces", lang, { count: workplaces.length })}`;
366
369
  };
367
370
  //#endregion
368
371
  //#region src/index.tsx
369
372
  registerTranslations(resources);
370
- const thumbnail = void 0;
371
373
  const requiredFeatures = ["feature.workplaces-state-timelines-widget"];
372
374
  const extraPermissions = [];
373
375
  //#endregion
374
- export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
376
+ export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
375
377
 
376
378
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["en","pl","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/helpers.ts","../src/components/TimelineLoader/index.tsx","../src/components/Timeline/styled.ts","../src/components/Timeline/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.2.8';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { Tab, TextField } from '@mui/material';\nimport { SortableSelect } from 'andoncloud-dashboard-toolkit';\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('workplaces');\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('workplacesStateTimelinesWidget.workplaces')} value=\"workplaces\" />\n <Tab label={t('workplacesStateTimelinesWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"workplaces\">\n <SortableSelect\n placeholder={`${t('workplacesStateTimelinesWidget.selectAndArrangeTheOrder')}...`}\n options={data.workplaces?.map(({ id, name }) => ({ label: name, value: id }))}\n selected={formProps.values.workplacesIds}\n onChange={(selected) => formProps.setFieldValue('workplacesIds', [...selected])}\n />\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('workplacesStateTimelinesWidget.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 { AndonLightColor, ListStatusChanges_StatusChange, NormalizedShift } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nexport const durationSeconds = (\n shift: NormalizedShift,\n statusChange: ListStatusChanges_StatusChange,\n currentDate: Date,\n) => {\n const startedAt = shift.startedAt.isAfter(statusChange.startedAt) ? shift.startedAt : dayjs(statusChange.startedAt);\n\n if (startedAt && statusChange.finishedAt) {\n return Math.abs(startedAt.diff(dayjs(statusChange.finishedAt), 'seconds'));\n }\n return Math.abs(dayjs(currentDate).diff(startedAt, 'seconds'));\n};\n\nexport const mapTimelineColor = (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","import ContentLoader from 'react-content-loader';\n\nconst TimelineLoader = () => (\n <ContentLoader\n data-testid=\"timeline-loading\"\n height=\"28\"\n width=\"100%\"\n speed={1.5}\n backgroundColor=\"#3d3d3d\"\n foregroundColor=\"#ffffff\"\n >\n <rect x=\"4%\" y=\"10\" ry=\"6\" width=\"92%\" height=\"14\" />\n </ContentLoader>\n);\n\nexport default TimelineLoader;\n","import { styled } from '@mui/material/styles';\nimport { AndonLightColor } from 'andoncloud-dashboard-toolkit';\n\nimport { mapTimelineColor } from '@/helpers';\n\nexport interface TimelineElementProps {\n percentWidth: number;\n color?: AndonLightColor;\n}\n\nexport const TimelineRow = styled('div')({\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n padding: '10px 0',\n background: '#252A32',\n '&:nth-of-type(2n)': {\n background: '#30353d',\n },\n});\n\nexport const TimelineWrapper = styled('div')({\n display: 'flex',\n margin: '6px 0',\n zIndex: 3,\n flexDirection: 'row',\n height: '20px',\n width: '100%',\n overflow: 'hidden',\n borderRadius: '4px',\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n});\n\nexport const TimelineTimeInfoContainer = styled('div')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n});\n\nexport const TimelineTimeInfo = styled('span')({\n margin: '0 1.5em',\n fontSize: '12px',\n fontWeight: 500,\n lineHeight: '12px',\n color: 'rgba(255, 255, 255, 0.5)',\n});\n\nexport const TimelineElement = styled('div')<TimelineElementProps>(({ percentWidth, color }) => ({\n flexBasis: `${percentWidth}%`,\n flexShrink: 0,\n backgroundColor: mapTimelineColor(color as AndonLightColor),\n '&:first-of-type': {\n borderTopLeftRadius: '4px',\n borderBottomLeftRadius: '4px',\n },\n}));\n","import { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { Typography } from '@mui/material';\nimport { ListStatusChanges_StatusChange, NormalizedShift } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\nimport isBetween from 'dayjs/plugin/isBetween';\n\nimport { durationSeconds } from '@/helpers';\n\ndayjs.extend(isBetween);\n\nimport TimelineLoader from '../TimelineLoader';\n\nimport { TimelineElement, TimelineRow, TimelineTimeInfo, TimelineWrapper } from './styled';\n\nexport interface TimelineProps {\n title: string;\n shift: NormalizedShift | null;\n statusChanges: ListStatusChanges_StatusChange[];\n loading?: boolean;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({ title, shift, statusChanges, loading }) => {\n const [shiftStatusChanges, setShiftStatusChanges] = useState<ListStatusChanges_StatusChange[]>([]);\n const calculateShiftDuration = useCallback(() => {\n return shift ? Math.abs(shift.startedAt.diff(shift.finishedAt, 'seconds')) : 0;\n }, [shift]);\n const isShiftStatusChange = useCallback(\n (statusChange: ListStatusChanges_StatusChange) => {\n const startedAt = dayjs(statusChange.startedAt);\n const finishedAt = statusChange.finishedAt ? dayjs(statusChange.finishedAt) : null;\n\n if (shift) {\n return (\n startedAt.isBetween(shift.startedAt, shift.finishedAt) ||\n finishedAt?.isBetween(shift.startedAt, shift.finishedAt) ||\n (startedAt.isBefore(shift.startedAt) && !finishedAt)\n );\n }\n return false;\n },\n [shift],\n );\n const [shiftDuration, setShiftDuration] = useState<number>(() => calculateShiftDuration());\n\n useEffect(() => {\n setShiftDuration(calculateShiftDuration());\n }, [shift, calculateShiftDuration]);\n\n useEffect(() => {\n setShiftStatusChanges(statusChanges.filter((statusChange) => isShiftStatusChange(statusChange)));\n }, [statusChanges, isShiftStatusChange]);\n\n if (loading) return <TimelineLoader />;\n\n return (\n <TimelineRow>\n <Typography\n sx={{\n display: title ? 'block' : 'none',\n flexBasis: '25%',\n marginLeft: '20px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n color: 'white',\n }}\n >\n {title}\n </Typography>\n {shift && (\n <Fragment>\n <TimelineTimeInfo>{shift.startedAt.format('HH:mm')}</TimelineTimeInfo>\n <TimelineWrapper data-testid=\"timeline\">\n {shiftStatusChanges?.map(\n (status) =>\n status.reason.statusColor && (\n <TimelineElement\n data-testid={`timeline-element-${status.id}-color-${status.reason.statusColor}`}\n key={`${status.id}${status.author.id}`}\n color={status.reason.statusColor}\n percentWidth={Math.min((durationSeconds(shift, status, new Date()) / shiftDuration) * 100, 100)}\n />\n ),\n )}\n </TimelineWrapper>\n <TimelineTimeInfo>{shift.finishedAt.format('HH:mm')}</TimelineTimeInfo>\n </Fragment>\n )}\n </TimelineRow>\n );\n};\n\nexport default Timeline;\n","import { useEffect, useState } from 'react';\n\nimport { Box } from '@mui/material';\nimport { getCurrentShift, NormalizedShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { WidgetViewProps } from '@/types';\n\nimport Timeline from '../Timeline';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n const [currentShift, setCurrentShift] = useState<NormalizedShift | null>(null);\n const getTitle = (workplaceId: string) => {\n const workplaces = data.workplaces;\n\n return settings?.workplacesIds?.length === 1\n ? ''\n : workplaces?.find((workplace) => workplace.id === workplaceId)?.name || '';\n };\n\n useEffect(() => {\n const updateCurrentShift = () => {\n const currentDate = dayjs();\n\n setCurrentShift(getCurrentShift(currentDate, normalizeShifts(data?.shifts || [], currentDate)));\n };\n const intervalId = setInterval(() => updateCurrentShift(), 10 * 1000);\n\n updateCurrentShift();\n\n return () => {\n clearInterval(intervalId);\n };\n }, [data?.shifts]);\n\n return (\n <Box display=\"flex\" flexDirection=\"column\" height=\"100%\">\n {settings?.workplacesIds.map((workplaceId) => (\n <Timeline\n key={workplaceId}\n title={getTitle(workplaceId)}\n shift={currentShift}\n statusChanges={data.statusChanges?.filter((statusChange) => statusChange.workplaceId === workplaceId) || []}\n loading={data === undefined}\n />\n ))}\n </Box>\n );\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('workplacesStateTimelinesWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n workplacesIds: [],\n },\n validationSchema: yup.object({\n workplacesIds: yup.array().of(yup.string()).required(),\n }),\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport {\n ListStatusChanges_StatusChange,\n StatusChange,\n useGqlClients,\n WidgetProps,\n WorkplaceEvent,\n WorkplaceEventDocument,\n WorkplaceEventSubscriptionPayload,\n} from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\nimport dayjs from 'dayjs';\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>> = ({\n url,\n wsUrl,\n lang,\n data,\n settings,\n ...widgetProps\n}) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n const [widgetSettings, setWidgetSettings] = useState<WidgetSettings | undefined>(settings);\n\n const sortStatusChagnges = (items: ListStatusChanges_StatusChange[]): ListStatusChanges_StatusChange[] => {\n return items.sort((item1, item2) => {\n if (item1.finishedAt && item2.finishedAt) return dayjs(item1.finishedAt).diff(dayjs(item2.finishedAt));\n return item1.finishedAt ? -1 : 1;\n });\n };\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n }));\n })\n .catch(() => {});\n\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 return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges: sortStatusChagnges(statusChanges),\n }));\n })\n .catch(() => {});\n }\n if (widgetSettings?.workplacesIds && gqlWsClient) {\n widgetSettings.workplacesIds.forEach((workplaceId) => {\n gqlWsClient.subscribe<WorkplaceEventSubscriptionPayload>(\n print(WorkplaceEventDocument),\n { id: workplaceId },\n ({ event, subject }) => {\n if (event === WorkplaceEvent.StatusChangeCreated) {\n const statusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => {\n const workplaceStatusChanges = current?.statusChanges?.filter(\n (statusChange) => statusChange.workplaceId === workplaceId,\n );\n const lastStatusChange = workplaceStatusChanges[workplaceStatusChanges.length - 1];\n\n if (lastStatusChange) {\n lastStatusChange.finishedAt = statusChange.startedAt;\n }\n return {\n ...(current || {}),\n statusChanges: [...current.statusChanges, statusChange],\n };\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 });\n }\n }, [data, graphqlSdk, gqlWsClient, widgetSettings]);\n\n const handleSettingsChange = useCallback(\n (settings: WidgetSettings) => {\n setWidgetSettings({ ...settings });\n },\n [setWidgetSettings],\n );\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n settings={settings}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n onSettingsChange={handleSettingsChange}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"workplaces-state-timelines-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 = 'workplacesStateTimelinesWidget';\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 allWorkplaces = data?.workplaces;\n if (!allWorkplaces?.length) return name;\n\n const selectedIds = settings?.workplacesIds?.length ? new Set(settings.workplacesIds) : null;\n const workplaces = selectedIds ? allWorkplaces.filter((wp) => selectedIds.has(wp.id)) : allWorkplaces;\n if (!workplaces.length) return name;\n\n return `${name} — ${t('titleWorkplaces', lang, { count: workplaces.length })}`;\n};\n","import { 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.workplaces-state-timelines-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","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/helpers.ts","../src/components/TimelineLoader/index.tsx","../src/components/Timeline/styled.ts","../src/components/Timeline/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.2.10';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { Tab, TextField } from '@mui/material';\nimport { SortableSelect } from 'andoncloud-dashboard-toolkit';\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('workplaces');\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('workplacesStateTimelinesWidget.workplaces')} value=\"workplaces\" />\n <Tab label={t('workplacesStateTimelinesWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"workplaces\">\n <SortableSelect\n placeholder={`${t('workplacesStateTimelinesWidget.selectAndArrangeTheOrder')}...`}\n options={data.workplaces?.map(({ id, name }) => ({ label: name, value: id }))}\n selected={formProps.values.workplacesIds}\n onChange={(selected) => formProps.setFieldValue('workplacesIds', [...selected])}\n />\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('workplacesStateTimelinesWidget.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 { AndonLightColor, ListStatusChanges_StatusChange, NormalizedShift } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nexport const durationSeconds = (\n shift: NormalizedShift,\n statusChange: ListStatusChanges_StatusChange,\n currentDate: Date,\n) => {\n const startedAt = shift.startedAt.isAfter(statusChange.startedAt) ? shift.startedAt : dayjs(statusChange.startedAt);\n\n if (startedAt && statusChange.finishedAt) {\n return Math.abs(startedAt.diff(dayjs(statusChange.finishedAt), 'seconds'));\n }\n return Math.abs(dayjs(currentDate).diff(startedAt, 'seconds'));\n};\n\nexport const mapTimelineColor = (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","import ContentLoader from 'react-content-loader';\n\nconst TimelineLoader = () => (\n <ContentLoader\n data-testid=\"timeline-loading\"\n height=\"28\"\n width=\"100%\"\n speed={1.5}\n backgroundColor=\"#3d3d3d\"\n foregroundColor=\"#ffffff\"\n >\n <rect x=\"4%\" y=\"10\" ry=\"6\" width=\"92%\" height=\"14\" />\n </ContentLoader>\n);\n\nexport default TimelineLoader;\n","import { styled } from '@mui/material/styles';\nimport { AndonLightColor } from 'andoncloud-dashboard-toolkit';\n\nimport { mapTimelineColor } from '@/helpers';\n\nexport interface TimelineElementProps {\n percentWidth: number;\n color?: AndonLightColor;\n}\n\nexport const TimelineRow = styled('div')({\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n padding: '10px 0',\n background: '#252A32',\n '&:nth-of-type(2n)': {\n background: '#30353d',\n },\n});\n\nexport const TimelineWrapper = styled('div')({\n display: 'flex',\n margin: '6px 0',\n zIndex: 3,\n flexDirection: 'row',\n height: '20px',\n width: '100%',\n overflow: 'hidden',\n borderRadius: '4px',\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\n});\n\nexport const TimelineTimeInfoContainer = styled('div')({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n});\n\nexport const TimelineTimeInfo = styled('span')({\n margin: '0 1.5em',\n fontSize: '12px',\n fontWeight: 500,\n lineHeight: '12px',\n color: 'rgba(255, 255, 255, 0.5)',\n});\n\nexport const TimelineElement = styled('div')<TimelineElementProps>(({ percentWidth, color }) => ({\n flexBasis: `${percentWidth}%`,\n flexShrink: 0,\n backgroundColor: mapTimelineColor(color as AndonLightColor),\n '&:first-of-type': {\n borderTopLeftRadius: '4px',\n borderBottomLeftRadius: '4px',\n },\n}));\n","import { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { Typography } from '@mui/material';\nimport { ListStatusChanges_StatusChange, NormalizedShift } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\nimport isBetween from 'dayjs/plugin/isBetween';\n\nimport { durationSeconds } from '@/helpers';\n\ndayjs.extend(isBetween);\n\nimport TimelineLoader from '../TimelineLoader';\n\nimport { TimelineElement, TimelineRow, TimelineTimeInfo, TimelineWrapper } from './styled';\n\nexport interface TimelineProps {\n title: string;\n shift: NormalizedShift | null;\n statusChanges: ListStatusChanges_StatusChange[];\n loading?: boolean;\n}\n\nconst Timeline: React.FC<TimelineProps> = ({ title, shift, statusChanges, loading }) => {\n const [shiftStatusChanges, setShiftStatusChanges] = useState<ListStatusChanges_StatusChange[]>([]);\n const calculateShiftDuration = useCallback(() => {\n return shift ? Math.abs(shift.startedAt.diff(shift.finishedAt, 'seconds')) : 0;\n }, [shift]);\n const isShiftStatusChange = useCallback(\n (statusChange: ListStatusChanges_StatusChange) => {\n const startedAt = dayjs(statusChange.startedAt);\n const finishedAt = statusChange.finishedAt ? dayjs(statusChange.finishedAt) : null;\n\n if (shift) {\n return (\n startedAt.isBetween(shift.startedAt, shift.finishedAt) ||\n finishedAt?.isBetween(shift.startedAt, shift.finishedAt) ||\n (startedAt.isBefore(shift.startedAt) && !finishedAt)\n );\n }\n return false;\n },\n [shift],\n );\n const [shiftDuration, setShiftDuration] = useState<number>(() => calculateShiftDuration());\n\n useEffect(() => {\n setShiftDuration(calculateShiftDuration());\n }, [shift, calculateShiftDuration]);\n\n useEffect(() => {\n setShiftStatusChanges(statusChanges.filter((statusChange) => isShiftStatusChange(statusChange)));\n }, [statusChanges, isShiftStatusChange]);\n\n if (loading) return <TimelineLoader />;\n\n return (\n <TimelineRow>\n <Typography\n sx={{\n display: title ? 'block' : 'none',\n flexBasis: '25%',\n marginLeft: '20px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n color: 'white',\n }}\n >\n {title}\n </Typography>\n {shift && (\n <Fragment>\n <TimelineTimeInfo>{shift.startedAt.format('HH:mm')}</TimelineTimeInfo>\n <TimelineWrapper data-testid=\"timeline\">\n {shiftStatusChanges?.map(\n (status) =>\n status.reason.statusColor && (\n <TimelineElement\n data-testid={`timeline-element-${status.id}-color-${status.reason.statusColor}`}\n key={`${status.id}${status.author.id}`}\n color={status.reason.statusColor}\n percentWidth={Math.min((durationSeconds(shift, status, new Date()) / shiftDuration) * 100, 100)}\n />\n ),\n )}\n </TimelineWrapper>\n <TimelineTimeInfo>{shift.finishedAt.format('HH:mm')}</TimelineTimeInfo>\n </Fragment>\n )}\n </TimelineRow>\n );\n};\n\nexport default Timeline;\n","import { useEffect, useState } from 'react';\n\nimport { Box } from '@mui/material';\nimport { getCurrentShift, NormalizedShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { WidgetViewProps } from '@/types';\n\nimport Timeline from '../Timeline';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n const [currentShift, setCurrentShift] = useState<NormalizedShift | null>(null);\n const getTitle = (workplaceId: string) => {\n const workplaces = data.workplaces;\n\n return settings?.workplacesIds?.length === 1\n ? ''\n : workplaces?.find((workplace) => workplace.id === workplaceId)?.name || '';\n };\n\n useEffect(() => {\n const updateCurrentShift = () => {\n const currentDate = dayjs();\n\n setCurrentShift(getCurrentShift(currentDate, normalizeShifts(data?.shifts || [], currentDate)));\n };\n const intervalId = setInterval(() => updateCurrentShift(), 10 * 1000);\n\n updateCurrentShift();\n\n return () => {\n clearInterval(intervalId);\n };\n }, [data?.shifts]);\n\n return (\n <Box display=\"flex\" flexDirection=\"column\" height=\"100%\">\n {settings?.workplacesIds.map((workplaceId) => (\n <Timeline\n key={workplaceId}\n title={getTitle(workplaceId)}\n shift={currentShift}\n statusChanges={data.statusChanges?.filter((statusChange) => statusChange.workplaceId === workplaceId) || []}\n loading={data === undefined}\n />\n ))}\n </Box>\n );\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('workplacesStateTimelinesWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n workplacesIds: [],\n },\n validationSchema: yup.object({\n workplacesIds: yup.array().of(yup.string()).required(),\n }),\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport {\n ListStatusChanges_StatusChange,\n StatusChange,\n useGqlClients,\n WidgetProps,\n WorkplaceEvent,\n WorkplaceEventDocument,\n WorkplaceEventSubscriptionPayload,\n} from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\nimport dayjs from 'dayjs';\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>> = ({\n url,\n wsUrl,\n lang,\n data,\n settings,\n ...widgetProps\n}) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n const [widgetSettings, setWidgetSettings] = useState<WidgetSettings | undefined>(settings);\n\n const sortStatusChagnges = (items: ListStatusChanges_StatusChange[]): ListStatusChanges_StatusChange[] => {\n return items.sort((item1, item2) => {\n if (item1.finishedAt && item2.finishedAt) return dayjs(item1.finishedAt).diff(dayjs(item2.finishedAt));\n return item1.finishedAt ? -1 : 1;\n });\n };\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n }));\n })\n .catch(() => {});\n\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 return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n statusChanges: sortStatusChagnges(statusChanges),\n }));\n })\n .catch(() => {});\n }\n if (widgetSettings?.workplacesIds && gqlWsClient) {\n widgetSettings.workplacesIds.forEach((workplaceId) => {\n gqlWsClient.subscribe<WorkplaceEventSubscriptionPayload>(\n print(WorkplaceEventDocument),\n { id: workplaceId },\n ({ event, subject }) => {\n if (event === WorkplaceEvent.StatusChangeCreated) {\n const statusChange = subject as StatusChange;\n\n setWidgetData((current: WidgetData) => {\n const workplaceStatusChanges = current?.statusChanges?.filter(\n (statusChange) => statusChange.workplaceId === workplaceId,\n );\n const lastStatusChange = workplaceStatusChanges[workplaceStatusChanges.length - 1];\n\n if (lastStatusChange) {\n lastStatusChange.finishedAt = statusChange.startedAt;\n }\n return {\n ...(current || {}),\n statusChanges: [...current.statusChanges, statusChange],\n };\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 });\n }\n }, [data, graphqlSdk, gqlWsClient, widgetSettings]);\n\n const handleSettingsChange = useCallback(\n (settings: WidgetSettings) => {\n setWidgetSettings({ ...settings });\n },\n [setWidgetSettings],\n );\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n settings={settings}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n onSettingsChange={handleSettingsChange}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"workplaces-state-timelines-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 = 'workplacesStateTimelinesWidget';\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 allWorkplaces = data?.workplaces;\n if (!allWorkplaces?.length) return name;\n\n const selectedIds = settings?.workplacesIds?.length ? new Set(settings.workplacesIds) : null;\n const workplaces = selectedIds ? allWorkplaces.filter((wp) => selectedIds.has(wp.id)) : allWorkplaces;\n if (!workplaces.length) return name;\n\n return `${name} — ${t('titleCurrentShift', lang)}, ${t('titleWorkplaces', lang, { count: workplaces.length })}`;\n};\n","import { 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 { default as thumbnail } from './assets/thumbnail.svg';\n\nexport const requiredFeatures: string[] = ['feature.workplaces-state-timelines-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region src/assets/thumbnail.svg
2
+ var thumbnail_default = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\" fill=\"none\">%0A <defs>%0A <mask id=\"m1\"><rect x=\"80\" y=\"14\" width=\"232\" height=\"16\" rx=\"8\" fill=\"white\"/></mask>%0A <mask id=\"m2\"><rect x=\"80\" y=\"50\" width=\"232\" height=\"16\" rx=\"8\" fill=\"white\"/></mask>%0A <mask id=\"m3\"><rect x=\"80\" y=\"86\" width=\"232\" height=\"16\" rx=\"8\" fill=\"white\"/></mask>%0A <mask id=\"m4\"><rect x=\"80\" y=\"122\" width=\"232\" height=\"16\" rx=\"8\" fill=\"white\"/></mask>%0A </defs>%0A%0A <!-- Row 1 -->%0A <text x=\"16\" y=\"22\" font-size=\"10\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" dominant-baseline=\"central\">CNC-01</text>%0A <text x=\"16\" y=\"33\" font-size=\"7\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" opacity=\"0.5\" dominant-baseline=\"central\">06:00 – 14:00</text>%0A <g mask=\"url(%23m1)\">%0A <rect x=\"80\" y=\"14\" width=\"232\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"180\" y=\"14\" width=\"132\" height=\"16\" fill=\"%23FD2121\"/>%0A <rect x=\"210\" y=\"14\" width=\"102\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"290\" y=\"14\" width=\"22\" height=\"16\" fill=\"%23FFC107\"/>%0A </g>%0A%0A <!-- Row 2 -->%0A <text x=\"16\" y=\"58\" font-size=\"10\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" dominant-baseline=\"central\">CNC-02</text>%0A <text x=\"16\" y=\"69\" font-size=\"7\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" opacity=\"0.5\" dominant-baseline=\"central\">06:00 – 14:00</text>%0A <g mask=\"url(%23m2)\">%0A <rect x=\"80\" y=\"50\" width=\"232\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"140\" y=\"50\" width=\"172\" height=\"16\" fill=\"%23FFC107\"/>%0A <rect x=\"160\" y=\"50\" width=\"152\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"280\" y=\"50\" width=\"32\" height=\"16\" fill=\"%23FD2121\"/>%0A </g>%0A%0A <!-- Row 3 -->%0A <text x=\"16\" y=\"94\" font-size=\"10\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" dominant-baseline=\"central\">WP-03</text>%0A <text x=\"16\" y=\"105\" font-size=\"7\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" opacity=\"0.5\" dominant-baseline=\"central\">06:00 – 14:00</text>%0A <g mask=\"url(%23m3)\">%0A <rect x=\"80\" y=\"86\" width=\"232\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"220\" y=\"86\" width=\"92\" height=\"16\" fill=\"%23FD2121\"/>%0A <rect x=\"260\" y=\"86\" width=\"52\" height=\"16\" fill=\"%2311BD4C\"/>%0A </g>%0A%0A <!-- Row 4 -->%0A <text x=\"16\" y=\"130\" font-size=\"10\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" dominant-baseline=\"central\">WP-04</text>%0A <text x=\"16\" y=\"141\" font-size=\"7\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\" opacity=\"0.5\" dominant-baseline=\"central\">06:00 – 14:00</text>%0A <g mask=\"url(%23m4)\">%0A <rect x=\"80\" y=\"122\" width=\"232\" height=\"16\" fill=\"%23FFC107\"/>%0A <rect x=\"130\" y=\"122\" width=\"182\" height=\"16\" fill=\"%2311BD4C\"/>%0A <rect x=\"220\" y=\"122\" width=\"92\" height=\"16\" fill=\"%23FD2121\"/>%0A <rect x=\"245\" y=\"122\" width=\"67\" height=\"16\" fill=\"%2311BD4C\"/>%0A </g>%0A</svg>%0A";
3
+ //#endregion
4
+ export { thumbnail_default as t };
5
+
6
+ //# sourceMappingURL=thumbnail-DANU3GTv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail-DANU3GTv.js","names":[],"sources":["../src/assets/thumbnail.svg"],"sourcesContent":["\"data:image/svg+xml,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 320 180\\\" fill=\\\"none\\\">%0A <defs>%0A <mask id=\\\"m1\\\"><rect x=\\\"80\\\" y=\\\"14\\\" width=\\\"232\\\" height=\\\"16\\\" rx=\\\"8\\\" fill=\\\"white\\\"/></mask>%0A <mask id=\\\"m2\\\"><rect x=\\\"80\\\" y=\\\"50\\\" width=\\\"232\\\" height=\\\"16\\\" rx=\\\"8\\\" fill=\\\"white\\\"/></mask>%0A <mask id=\\\"m3\\\"><rect x=\\\"80\\\" y=\\\"86\\\" width=\\\"232\\\" height=\\\"16\\\" rx=\\\"8\\\" fill=\\\"white\\\"/></mask>%0A <mask id=\\\"m4\\\"><rect x=\\\"80\\\" y=\\\"122\\\" width=\\\"232\\\" height=\\\"16\\\" rx=\\\"8\\\" fill=\\\"white\\\"/></mask>%0A </defs>%0A%0A <!-- Row 1 -->%0A <text x=\\\"16\\\" y=\\\"22\\\" font-size=\\\"10\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" dominant-baseline=\\\"central\\\">CNC-01</text>%0A <text x=\\\"16\\\" y=\\\"33\\\" font-size=\\\"7\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" opacity=\\\"0.5\\\" dominant-baseline=\\\"central\\\">06:00 – 14:00</text>%0A <g mask=\\\"url(%23m1)\\\">%0A <rect x=\\\"80\\\" y=\\\"14\\\" width=\\\"232\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"180\\\" y=\\\"14\\\" width=\\\"132\\\" height=\\\"16\\\" fill=\\\"%23FD2121\\\"/>%0A <rect x=\\\"210\\\" y=\\\"14\\\" width=\\\"102\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"290\\\" y=\\\"14\\\" width=\\\"22\\\" height=\\\"16\\\" fill=\\\"%23FFC107\\\"/>%0A </g>%0A%0A <!-- Row 2 -->%0A <text x=\\\"16\\\" y=\\\"58\\\" font-size=\\\"10\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" dominant-baseline=\\\"central\\\">CNC-02</text>%0A <text x=\\\"16\\\" y=\\\"69\\\" font-size=\\\"7\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" opacity=\\\"0.5\\\" dominant-baseline=\\\"central\\\">06:00 – 14:00</text>%0A <g mask=\\\"url(%23m2)\\\">%0A <rect x=\\\"80\\\" y=\\\"50\\\" width=\\\"232\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"140\\\" y=\\\"50\\\" width=\\\"172\\\" height=\\\"16\\\" fill=\\\"%23FFC107\\\"/>%0A <rect x=\\\"160\\\" y=\\\"50\\\" width=\\\"152\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"280\\\" y=\\\"50\\\" width=\\\"32\\\" height=\\\"16\\\" fill=\\\"%23FD2121\\\"/>%0A </g>%0A%0A <!-- Row 3 -->%0A <text x=\\\"16\\\" y=\\\"94\\\" font-size=\\\"10\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" dominant-baseline=\\\"central\\\">WP-03</text>%0A <text x=\\\"16\\\" y=\\\"105\\\" font-size=\\\"7\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" opacity=\\\"0.5\\\" dominant-baseline=\\\"central\\\">06:00 – 14:00</text>%0A <g mask=\\\"url(%23m3)\\\">%0A <rect x=\\\"80\\\" y=\\\"86\\\" width=\\\"232\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"220\\\" y=\\\"86\\\" width=\\\"92\\\" height=\\\"16\\\" fill=\\\"%23FD2121\\\"/>%0A <rect x=\\\"260\\\" y=\\\"86\\\" width=\\\"52\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A </g>%0A%0A <!-- Row 4 -->%0A <text x=\\\"16\\\" y=\\\"130\\\" font-size=\\\"10\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" dominant-baseline=\\\"central\\\">WP-04</text>%0A <text x=\\\"16\\\" y=\\\"141\\\" font-size=\\\"7\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\" opacity=\\\"0.5\\\" dominant-baseline=\\\"central\\\">06:00 – 14:00</text>%0A <g mask=\\\"url(%23m4)\\\">%0A <rect x=\\\"80\\\" y=\\\"122\\\" width=\\\"232\\\" height=\\\"16\\\" fill=\\\"%23FFC107\\\"/>%0A <rect x=\\\"130\\\" y=\\\"122\\\" width=\\\"182\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"220\\\" y=\\\"122\\\" width=\\\"92\\\" height=\\\"16\\\" fill=\\\"%23FD2121\\\"/>%0A <rect x=\\\"245\\\" y=\\\"122\\\" width=\\\"67\\\" height=\\\"16\\\" fill=\\\"%2311BD4C\\\"/>%0A </g>%0A</svg>%0A\""],"mappings":";wBAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "andoncloud-workplaces-state-timelines-widget",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
4
4
  "description": "Made with create-andoncloud-widget",
5
5
  "author": "Adrian Olszewski",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "start": "run-p build:watch start:preview",
19
19
  "start:preview": "cd preview && npm run start",
20
20
  "test": "cypress run --component",
21
- "update": "ncu --reject graphql-request -u && npm install --ignore-scripts && cd preview && ncu -u && npm install",
21
+ "update": "ncu --reject graphql-request,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers -u && npm install --ignore-scripts && cd preview && ncu -u && npm install --ignore-scripts",
22
22
  "version:bump": "npm version --no-git-tag-version patch"
23
23
  },
24
24
  "peerDependencies": {
@@ -44,25 +44,25 @@
44
44
  "@mui/x-date-pickers": "^8.27.2",
45
45
  "@types/react": "^19.2.14",
46
46
  "ajv": "^8.18.0",
47
- "andoncloud-dashboard-toolkit": "^1.5.63",
47
+ "andoncloud-dashboard-toolkit": "^1.5.79",
48
48
  "andoncloud-library-scripts": "^2.0.0",
49
- "andoncloud-sdk": "^1.7.25",
50
- "andoncloud-widget-base": "^1.2.25",
51
- "cypress": "^15.13.0",
49
+ "andoncloud-sdk": "^1.7.30",
50
+ "andoncloud-widget-base": "^1.2.30",
51
+ "cypress": "^15.13.1",
52
52
  "eslint-config-andoncloud": "^1.1.0",
53
53
  "graphql-request": "^6.1.0",
54
- "i18next": "^26.0.2",
54
+ "i18next": "^26.0.5",
55
55
  "mobx": "^6.15.0",
56
56
  "mobx-react-lite": "^4.1.1",
57
- "npm-check-updates": "^19.6.6",
57
+ "npm-check-updates": "^21.0.0",
58
58
  "npm-run-all": "^4.1.5",
59
- "postcss": "^8.5.8",
60
- "react": "^19.2.4",
61
- "react-dom": "^19.2.4",
62
- "react-i18next": "^17.0.1",
63
- "react-router-dom": "^7.13.2",
59
+ "postcss": "^8.5.9",
60
+ "react": "^19.2.5",
61
+ "react-dom": "^19.2.5",
62
+ "react-i18next": "^17.0.3",
63
+ "react-router-dom": "^7.14.1",
64
64
  "react-scripts": "^5.0.1",
65
- "tsdown": "^0.21.7",
65
+ "tsdown": "^0.21.8",
66
66
  "typescript": "~5.9.3",
67
67
  "webpack-dev-server": "^5.2.3"
68
68
  },