@digihmis/esm-triage-app 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/70.js +1 -0
- package/dist/70.js.map +1 -0
- package/dist/737.js +1 -1
- package/dist/737.js.map +1 -1
- package/dist/digihmis-esm-triage-app.js +1 -1
- package/dist/digihmis-esm-triage-app.js.buildmanifest.json +29 -29
- package/dist/digihmis-esm-triage-app.js.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +4 -2
- package/src/config-schema.ts +3 -2
- package/src/icon-wrapper/icon-wrapper.extension.tsx +2 -17
- package/src/left-panel/left-panel.component.tsx +6 -100
- package/src/page-header/page-header.component.tsx +4 -27
- package/src/routes.json +4 -3
- package/src/triage-queue-dashboard/triage-queue-dashboard.component.tsx +14 -147
- package/dist/976.js +0 -1
- package/dist/976.js.map +0 -1
- package/src/triage-queue-dashboard/triage-dashboard.resource.ts +0 -75
package/dist/routes.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"fhir2":">=1.2","webservices.rest":"
|
|
1
|
+
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"fhir2":">=1.2","webservices.rest":">=2.24.0"},"extensions":[{"name":"triage-dashboard-header","slot":"triage-sidebar-slot","component":"triageDashboardHeader","order":0,"online":true,"offline":true},{"name":"triage-db-link","slot":"triage-dashboard-slot","component":"leftPanelLink","meta":{"name":"triage","slot":"triage-homepage-dashboard-slot","title":"Triage Queue"},"order":1,"online":true,"offline":true},{"name":"triage-queue-dashboard","slot":"triage-homepage-dashboard-slot","component":"triageQueueDashboard"},{"name":"patient-vitals-link","slot":"triage-dashboard-slot","component":"patientVitalsLink","meta":{"name":"triage/:patientUuid/vitals","slot":"triage-vitals-dashboard-slot","title":"Patient Vitals","showOnlyOnRoute":"/vitals"},"order":2,"online":true,"offline":true},{"name":"patient-vitals-history","slot":"triage-vitals-dashboard-slot","component":"patientVitalsHistory"},{"name":"vitals-header","slot":"patient-vitals-header-slot","component":"vitalsHeader","online":true,"offline":true}],"workspaces":[{"name":"record-vitals-workspace","component":"recordVitalsWorkspace","title":"Record Vitals","type":"other-form","canMaximize":true,"width":"extra-wide"}],"version":"1.0.2"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digihmis/esm-triage-app",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Triage microfrontend for the OpenMRS SPA",
|
|
5
5
|
"browser": "dist/digihmis-esm-triage-app.js",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"start": "openmrs develop",
|
|
19
19
|
"test": "cross-env TZ=UTC jest --config jest.config.js --verbose false --passWithNoTests",
|
|
20
20
|
"test:watch": "cross-env TZ=UTC jest --watch --config jest.config.js",
|
|
21
|
-
"typescript": "tsc"
|
|
21
|
+
"typescript": "tsc",
|
|
22
|
+
"prepublishOnly": "rspack --mode=production"
|
|
22
23
|
},
|
|
23
24
|
"browserslist": [
|
|
24
25
|
"extends browserslist-config-openmrs"
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
"url": "https://github.com/its-kios09/DigiHMIS-apps/issues"
|
|
38
39
|
},
|
|
39
40
|
"dependencies": {
|
|
41
|
+
"@digihmis/esm-commons-lib": "1.0.0",
|
|
40
42
|
"lodash-es": "^4.17.15",
|
|
41
43
|
"react-to-print": "2.14.13"
|
|
42
44
|
},
|
package/src/config-schema.ts
CHANGED
|
@@ -83,13 +83,14 @@ export const configSchema: ConfigSchema = {
|
|
|
83
83
|
},
|
|
84
84
|
OpenmrsIdentifierTypeUuid: {
|
|
85
85
|
_type: Type.UUID,
|
|
86
|
-
_default: '
|
|
86
|
+
_default: '8d793bee-c2cc-11de-8d13-0010c6dffd0f',
|
|
87
87
|
_description: 'UUID for OpenMRS Identifier Type',
|
|
88
88
|
},
|
|
89
89
|
vitals: {
|
|
90
90
|
encounterTypeUuid: {
|
|
91
91
|
_type: Type.UUID,
|
|
92
|
-
_default: '
|
|
92
|
+
_default: 'c0136e8e-a430-4e47-a1cc-327efa99b62a',
|
|
93
|
+
_description: 'Encounter type recorded at triage (DigiHMIS Triage encounter type)',
|
|
93
94
|
},
|
|
94
95
|
vitalsOverdueThresholdHours: {
|
|
95
96
|
_type: Type.Number,
|
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
interface IconWrapperProps {
|
|
4
|
-
src: string;
|
|
5
|
-
alt?: string;
|
|
6
|
-
className?: string;
|
|
7
|
-
style?: React.CSSProperties;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const IconWrapper: React.FC<IconWrapperProps> = ({
|
|
11
|
-
src,
|
|
12
|
-
alt = 'Icon',
|
|
13
|
-
className,
|
|
14
|
-
style = { width: '100px', height: '148px' },
|
|
15
|
-
}) => {
|
|
16
|
-
return <img src={src} alt={alt} className={className} style={style} />;
|
|
17
|
-
};
|
|
1
|
+
// Moved to the shared library so every app uses one implementation.
|
|
2
|
+
export { IconWrapper, type IconWrapperProps } from '@digihmis/esm-commons-lib';
|
|
@@ -1,100 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import styles from './left-panel.scss';
|
|
8
|
-
|
|
9
|
-
export interface DashboardLinkConfig {
|
|
10
|
-
name: string;
|
|
11
|
-
title: string;
|
|
12
|
-
icon?: string | CarbonIconType;
|
|
13
|
-
showOnlyOnRoute?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const DashboardLink = ({ dashboardLinkConfig }: { dashboardLinkConfig: DashboardLinkConfig }) => {
|
|
17
|
-
const { t } = useTranslation();
|
|
18
|
-
const { name, title, icon, showOnlyOnRoute } = dashboardLinkConfig;
|
|
19
|
-
const location = useLocation();
|
|
20
|
-
const params = useParams();
|
|
21
|
-
const spaBasePath = window.getOpenmrsSpaBase() + 'home';
|
|
22
|
-
|
|
23
|
-
// Extract patientUuid from the current URL path if params.patientUuid is not available
|
|
24
|
-
const patientUuid = useMemo(() => {
|
|
25
|
-
if (params.patientUuid) {
|
|
26
|
-
return params.patientUuid;
|
|
27
|
-
}
|
|
28
|
-
// Extract UUID from path like /triage/UUID/vitals or /triage/patient/UUID/vitals
|
|
29
|
-
const pathParts = location.pathname.split('/');
|
|
30
|
-
const triageIndex = pathParts.indexOf('triage');
|
|
31
|
-
if (triageIndex !== -1 && pathParts.length > triageIndex + 1) {
|
|
32
|
-
const nextPart = pathParts[triageIndex + 1];
|
|
33
|
-
// Check if it's a UUID pattern (basic check)
|
|
34
|
-
if (nextPart && nextPart.length > 20 && nextPart.includes('-')) {
|
|
35
|
-
return nextPart;
|
|
36
|
-
}
|
|
37
|
-
// Check if path is /triage/patient/UUID/vitals
|
|
38
|
-
if (nextPart === 'patient' && pathParts.length > triageIndex + 2) {
|
|
39
|
-
const uuidPart = pathParts[triageIndex + 2];
|
|
40
|
-
if (uuidPart && uuidPart.length > 20 && uuidPart.includes('-')) {
|
|
41
|
-
return uuidPart;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
}, [params.patientUuid, location.pathname]);
|
|
47
|
-
|
|
48
|
-
const shouldShow = useMemo(() => {
|
|
49
|
-
if (!showOnlyOnRoute) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
return location.pathname.includes(showOnlyOnRoute);
|
|
53
|
-
}, [showOnlyOnRoute, location.pathname]);
|
|
54
|
-
|
|
55
|
-
const linkPath = useMemo(() => {
|
|
56
|
-
let path = name;
|
|
57
|
-
if (name.includes(':patientUuid') && patientUuid) {
|
|
58
|
-
path = name.replace(':patientUuid', patientUuid);
|
|
59
|
-
}
|
|
60
|
-
return path;
|
|
61
|
-
}, [name, patientUuid]);
|
|
62
|
-
|
|
63
|
-
const isActive = useMemo(() => {
|
|
64
|
-
if (name.includes(':patientUuid')) {
|
|
65
|
-
return location.pathname.includes('/vitals');
|
|
66
|
-
}
|
|
67
|
-
const urlSegment = decodeURIComponent(last(location.pathname.split('/')));
|
|
68
|
-
const nameSegment = name.split('/').at(-1);
|
|
69
|
-
return nameSegment === urlSegment;
|
|
70
|
-
}, [location.pathname, name]);
|
|
71
|
-
|
|
72
|
-
if (!shouldShow) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const IconComp = typeof icon !== 'string' ? (icon as CarbonIconType) : null;
|
|
77
|
-
|
|
78
|
-
return (
|
|
79
|
-
<ConfigurableLink
|
|
80
|
-
to={`${spaBasePath}/${linkPath}`}
|
|
81
|
-
className={`cds--side-nav__link ${isActive && 'active-left-nav-link'}`}>
|
|
82
|
-
{typeof icon === 'string' ? (
|
|
83
|
-
<MaybeIcon icon={icon} className={styles.icon} size={16} />
|
|
84
|
-
) : (
|
|
85
|
-
IconComp && <IconComp className={styles.icon} />
|
|
86
|
-
)}
|
|
87
|
-
{t(title)}
|
|
88
|
-
</ConfigurableLink>
|
|
89
|
-
);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
export const createDashboardLink = (dashboardLinkConfig: DashboardLinkConfig) => () => {
|
|
93
|
-
return (
|
|
94
|
-
<BrowserRouter>
|
|
95
|
-
<DashboardLink dashboardLinkConfig={dashboardLinkConfig} />
|
|
96
|
-
</BrowserRouter>
|
|
97
|
-
);
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export default DashboardLink;
|
|
1
|
+
// Moved to the shared library so every app uses one implementation.
|
|
2
|
+
export {
|
|
3
|
+
DashboardLink as default,
|
|
4
|
+
createDashboardLink,
|
|
5
|
+
type DashboardLinkConfig,
|
|
6
|
+
} from '@digihmis/esm-commons-lib';
|
|
@@ -1,35 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useTranslation } from 'react-i18next';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import styles from './page-header.scss';
|
|
3
|
+
import { useConfig } from '@openmrs/esm-framework';
|
|
4
|
+
import { PageHeader as CommonPageHeader } from '@digihmis/esm-commons-lib';
|
|
6
5
|
import { ConfigObject } from '../config-schema';
|
|
7
|
-
import { IconWrapper } from '../icon-wrapper/icon-wrapper.extension';
|
|
8
6
|
|
|
7
|
+
// The shared header lives in @digihmis/esm-commons-lib; this passes the module's title + icon.
|
|
9
8
|
export const PageHeader: React.FC = () => {
|
|
10
9
|
const { t } = useTranslation();
|
|
11
|
-
const userSession = useSession();
|
|
12
10
|
const { triageIcon } = useConfig<ConfigObject>();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return (
|
|
16
|
-
<div className={styles.header}>
|
|
17
|
-
<div className={styles['left-justified-items']}>
|
|
18
|
-
<IconWrapper src={triageIcon.src} alt={triageIcon.alt} />
|
|
19
|
-
<div className={styles['page-labels']}>
|
|
20
|
-
<p className={styles['page-name']}>{userLocation}</p>
|
|
21
|
-
<p className={styles['page-subtitle']}>{t('triage', 'Triage')}</p>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
<div className={styles['right-justified-items']}>
|
|
25
|
-
<div className={styles.extensionSlot}>
|
|
26
|
-
<ExtensionSlot name={'provider-banner-slot'} />
|
|
27
|
-
<div className={styles['date-and-location']}>
|
|
28
|
-
<Calendar size={16} />
|
|
29
|
-
<span className={styles.value}>{formatDate(new Date(), { mode: 'wide', noToday: true })}</span>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
);
|
|
11
|
+
return <CommonPageHeader title={t('triage', 'Triage')} iconSrc={triageIcon.src} iconAlt={triageIcon.alt} />;
|
|
35
12
|
};
|
package/src/routes.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.openmrs.org/routes.schema.json",
|
|
3
3
|
"backendDependencies": {
|
|
4
4
|
"fhir2": ">=1.2",
|
|
5
|
-
"webservices.rest": "
|
|
5
|
+
"webservices.rest": ">=2.24.0"
|
|
6
6
|
},
|
|
7
7
|
"extensions": [
|
|
8
8
|
{
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"name": "patient-vitals-history",
|
|
50
50
|
"slot": "triage-vitals-dashboard-slot",
|
|
51
51
|
"component": "patientVitalsHistory"
|
|
52
|
-
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
53
54
|
"name": "vitals-header",
|
|
54
55
|
"slot": "patient-vitals-header-slot",
|
|
55
56
|
"component": "vitalsHeader",
|
|
@@ -67,4 +68,4 @@
|
|
|
67
68
|
"width": "extra-wide"
|
|
68
69
|
}
|
|
69
70
|
]
|
|
70
|
-
}
|
|
71
|
+
}
|
|
@@ -1,152 +1,31 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
import { PageHeader } from '../page-header/page-header.component';
|
|
3
3
|
import { Button, Tile, InlineLoading } from '@carbon/react';
|
|
4
|
-
import { ConnectionTwoWay, Login, Logout
|
|
4
|
+
import { ConnectionTwoWay, Login, Logout } from '@carbon/react/icons';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { CardHeader } from '@openmrs/esm-patient-common-lib';
|
|
7
|
-
import {
|
|
7
|
+
import { useConfig } from '@openmrs/esm-framework';
|
|
8
|
+
import { ClockInBanner, useProviderClockIn } from '@digihmis/esm-commons-lib';
|
|
8
9
|
import styles from './triage-queue-dashboard.scss';
|
|
9
10
|
|
|
10
|
-
import { type ProviderSession } from './type';
|
|
11
|
-
import { clockOutProvider, useActiveSessions, useQueueMetrics } from './triage-dashboard.resource';
|
|
12
11
|
import { ConfigObject } from '../config-schema';
|
|
13
12
|
import { QueueRoomTable } from '../queue-room-table/queue-room-table.component';
|
|
14
13
|
|
|
15
14
|
export const TriageQueueDashboard: React.FC = () => {
|
|
16
15
|
const { t } = useTranslation();
|
|
17
|
-
const { currentProvider } = useSession();
|
|
18
16
|
const { triageQueueUuid } = useConfig<ConfigObject>();
|
|
19
17
|
|
|
20
|
-
const [isProcessing, setIsProcessing] = useState(false);
|
|
21
|
-
const [activeSession, setActiveSession] = useState<ProviderSession | null>(null);
|
|
22
|
-
|
|
23
|
-
const isClockedIn = activeSession !== null;
|
|
24
|
-
|
|
25
|
-
const {
|
|
26
|
-
activeSessions,
|
|
27
|
-
mutate: mutateSessions,
|
|
28
|
-
isLoading: isLoadingSessions,
|
|
29
|
-
} = useActiveSessions(currentProvider?.uuid || '');
|
|
30
|
-
|
|
31
18
|
const {
|
|
19
|
+
activeSession,
|
|
20
|
+
isClockedIn,
|
|
21
|
+
isProcessing,
|
|
32
22
|
metrics,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const triageSession = activeSessions.find((session) => session.queueRoom?.queue?.uuid === triageQueueUuid);
|
|
40
|
-
setActiveSession(triageSession || null);
|
|
41
|
-
} else {
|
|
42
|
-
setActiveSession(null);
|
|
43
|
-
}
|
|
44
|
-
}, [activeSessions, triageQueueUuid]);
|
|
45
|
-
|
|
46
|
-
const handleClockIn = () => {
|
|
47
|
-
const dispose = showModal('generic-clock-in-modal', {
|
|
48
|
-
moduleName: 'Triage',
|
|
49
|
-
url: window.location.pathname,
|
|
50
|
-
queueUuid: triageQueueUuid,
|
|
51
|
-
closeModal: () => dispose(),
|
|
52
|
-
onClockInSuccess: (sessionData: ProviderSession) => {
|
|
53
|
-
setActiveSession(sessionData);
|
|
54
|
-
mutateSessions();
|
|
55
|
-
mutateMetrics();
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const handleClockOut = async () => {
|
|
61
|
-
if (!activeSession?.uuid) {
|
|
62
|
-
showSnackbar({
|
|
63
|
-
title: t('error', 'Error'),
|
|
64
|
-
subtitle: t('noActiveSession', 'No active session found'),
|
|
65
|
-
kind: 'error',
|
|
66
|
-
});
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
setIsProcessing(true);
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
await clockOutProvider(activeSession.uuid);
|
|
74
|
-
|
|
75
|
-
showSnackbar({
|
|
76
|
-
title: t('clockOutSuccess', 'Clock Out Successful'),
|
|
77
|
-
subtitle: t('clockOutSuccessMessage', 'You have been clocked out successfully'),
|
|
78
|
-
kind: 'success',
|
|
79
|
-
timeoutInMs: 3000,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
setActiveSession(null);
|
|
83
|
-
mutateSessions();
|
|
84
|
-
mutateMetrics();
|
|
85
|
-
} catch (error) {
|
|
86
|
-
console.error('Clock out error:', error);
|
|
87
|
-
|
|
88
|
-
const errorMessage = error?.responseBody?.error || t('clockOutFailed', 'Failed to clock out');
|
|
89
|
-
|
|
90
|
-
showSnackbar({
|
|
91
|
-
title: t('clockOutError', 'Clock Out Failed'),
|
|
92
|
-
subtitle: errorMessage,
|
|
93
|
-
kind: 'error',
|
|
94
|
-
timeoutInMs: 5000,
|
|
95
|
-
});
|
|
96
|
-
} finally {
|
|
97
|
-
setIsProcessing(false);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const handleSwitchServicePoint = async () => {
|
|
102
|
-
if (!activeSession?.uuid) {
|
|
103
|
-
showSnackbar({
|
|
104
|
-
title: t('error', 'Error'),
|
|
105
|
-
subtitle: t('noActiveSession', 'No active session found'),
|
|
106
|
-
kind: 'error',
|
|
107
|
-
});
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
setIsProcessing(true);
|
|
112
|
-
|
|
113
|
-
try {
|
|
114
|
-
await clockOutProvider(activeSession.uuid);
|
|
115
|
-
|
|
116
|
-
showSnackbar({
|
|
117
|
-
title: t('switchingStation', 'Switching Station'),
|
|
118
|
-
subtitle: t('clockedOutFromCurrent', 'Clocked out from current station'),
|
|
119
|
-
kind: 'info',
|
|
120
|
-
timeoutInMs: 2000,
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
await mutateSessions();
|
|
124
|
-
setActiveSession(null);
|
|
125
|
-
|
|
126
|
-
const dispose = showModal('generic-clock-in-modal', {
|
|
127
|
-
moduleName: 'Triage',
|
|
128
|
-
url: window.location.pathname,
|
|
129
|
-
queueUuid: triageQueueUuid,
|
|
130
|
-
closeModal: () => dispose(),
|
|
131
|
-
onClockInSuccess: (sessionData: ProviderSession) => {
|
|
132
|
-
setActiveSession(sessionData);
|
|
133
|
-
mutateSessions();
|
|
134
|
-
mutateMetrics();
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
} catch (error) {
|
|
138
|
-
const errorMessage = error?.responseBody?.error || t('switchStationFailed', 'Failed to switch station');
|
|
139
|
-
|
|
140
|
-
showSnackbar({
|
|
141
|
-
title: t('switchStationError', 'Switch Station Failed'),
|
|
142
|
-
subtitle: errorMessage,
|
|
143
|
-
kind: 'error',
|
|
144
|
-
timeoutInMs: 5000,
|
|
145
|
-
});
|
|
146
|
-
} finally {
|
|
147
|
-
setIsProcessing(false);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
23
|
+
isLoadingSessions,
|
|
24
|
+
isLoadingMetrics,
|
|
25
|
+
handleClockIn,
|
|
26
|
+
handleClockOut,
|
|
27
|
+
handleSwitchServicePoint,
|
|
28
|
+
} = useProviderClockIn({ queueUuid: triageQueueUuid, moduleName: 'Triage' });
|
|
150
29
|
|
|
151
30
|
const isLoading = isLoadingSessions || isLoadingMetrics;
|
|
152
31
|
|
|
@@ -192,19 +71,7 @@ export const TriageQueueDashboard: React.FC = () => {
|
|
|
192
71
|
</Tile>
|
|
193
72
|
|
|
194
73
|
{isClockedIn && activeSession && (
|
|
195
|
-
<
|
|
196
|
-
<div className={styles.clockInInfo}>
|
|
197
|
-
<Alarm size={20} className={styles.alarmIcon} />
|
|
198
|
-
<div className={styles.clockInText}>
|
|
199
|
-
<strong>{t('clockedInTo', 'Clocked in to')}: </strong>
|
|
200
|
-
{activeSession?.queueRoom?.display}
|
|
201
|
-
<span className={styles.clockInTime}>
|
|
202
|
-
{' '}
|
|
203
|
-
({t('since', 'since')} {formatDate(new Date(activeSession.clockInTime), { mode: 'wide' })})
|
|
204
|
-
</span>
|
|
205
|
-
</div>
|
|
206
|
-
</div>
|
|
207
|
-
</Tile>
|
|
74
|
+
<ClockInBanner roomDisplay={activeSession?.queueRoom?.display} clockInTime={activeSession.clockInTime} />
|
|
208
75
|
)}
|
|
209
76
|
|
|
210
77
|
<div className={styles.cardHeaderContainer}>
|