andoncloud-workplaces-state-timelines-widget 1.2.9 → 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.9";
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";
@@ -52,7 +53,7 @@ const resources = {
52
53
  };
53
54
  //#endregion
54
55
  //#region src/version.ts
55
- const LIBRARY_VERSION = "1.2.9";
56
+ const LIBRARY_VERSION = "1.2.10";
56
57
  //#endregion
57
58
  //#region src/components/SettingsFormContent/index.tsx
58
59
  const SettingsFormContent = ({ data, formProps }) => {
@@ -369,10 +370,9 @@ const getTitle = (data, settings, _filters, lang) => {
369
370
  //#endregion
370
371
  //#region src/index.tsx
371
372
  registerTranslations(resources);
372
- const thumbnail = void 0;
373
373
  const requiredFeatures = ["feature.workplaces-state-timelines-widget"];
374
374
  const extraPermissions = [];
375
375
  //#endregion
376
- 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 };
377
377
 
378
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.9';\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 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.9",
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
  },