@7365admin1/layer-common 3.0.9 → 3.0.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.
package/CHANGELOG.md
CHANGED
|
@@ -1079,7 +1079,7 @@ const isHygieneMode = computed(
|
|
|
1079
1079
|
const {
|
|
1080
1080
|
getDashboard,
|
|
1081
1081
|
getDashboardHygiene,
|
|
1082
|
-
|
|
1082
|
+
getDashboardWeeklyActivity,
|
|
1083
1083
|
getDashboardHygieneTaskSchedule,
|
|
1084
1084
|
getDashboardHygieneAttendance,
|
|
1085
1085
|
getDashboardHygieneFeedbacks,
|
|
@@ -1169,13 +1169,13 @@ const { data: getDashboardAltReq, pending: loadingAltMetrics } =
|
|
|
1169
1169
|
}
|
|
1170
1170
|
);
|
|
1171
1171
|
|
|
1172
|
-
// Weekly activity (
|
|
1172
|
+
// Weekly activity (all modes)
|
|
1173
1173
|
const { data: weeklyActivityReq, pending: loadingWeeklyActivity } =
|
|
1174
1174
|
await useLazyAsyncData(
|
|
1175
1175
|
`get-dashboard-weekly-activity-${props.site}-${props.serviceType}`,
|
|
1176
1176
|
() =>
|
|
1177
|
-
props.serviceType
|
|
1178
|
-
?
|
|
1177
|
+
props.serviceType
|
|
1178
|
+
? getDashboardWeeklyActivity(
|
|
1179
1179
|
props.site,
|
|
1180
1180
|
props.serviceType as TServiceType,
|
|
1181
1181
|
currentPeriod.value
|
|
@@ -1251,10 +1251,10 @@ const finalLoading = computed(() => {
|
|
|
1251
1251
|
);
|
|
1252
1252
|
}
|
|
1253
1253
|
if (isPropertyMode.value) {
|
|
1254
|
-
return loadingAltMetrics.value || loadingFeedbacks.value;
|
|
1254
|
+
return loadingAltMetrics.value || loadingWeeklyActivity.value || loadingFeedbacks.value;
|
|
1255
1255
|
}
|
|
1256
1256
|
// security
|
|
1257
|
-
return loadingAltMetrics.value || loadingAttendance.value || loadingFeedbacks.value;
|
|
1257
|
+
return loadingAltMetrics.value || loadingWeeklyActivity.value || loadingAttendance.value || loadingFeedbacks.value;
|
|
1258
1258
|
});
|
|
1259
1259
|
|
|
1260
1260
|
// ─── Merged Dashboard Data ────────────────────────────────────────────────────
|
|
@@ -1262,45 +1262,49 @@ const finalLoading = computed(() => {
|
|
|
1262
1262
|
const finalDashboardData = computed<Record<string, any>>(() => {
|
|
1263
1263
|
if (!props.serviceType) return props.dashboardData || {};
|
|
1264
1264
|
|
|
1265
|
+
let weeklyActivity = weeklyActivityReq.value ?? [];
|
|
1266
|
+
const hasNoActivity =
|
|
1267
|
+
!weeklyActivity.length ||
|
|
1268
|
+
weeklyActivity.every(
|
|
1269
|
+
(item: any) =>
|
|
1270
|
+
!item.workOrder &&
|
|
1271
|
+
!item.taskCompleted &&
|
|
1272
|
+
!item.openWorkOrder &&
|
|
1273
|
+
!item.closedWorkOrder &&
|
|
1274
|
+
!item.incidents &&
|
|
1275
|
+
!item.visitors
|
|
1276
|
+
);
|
|
1277
|
+
|
|
1278
|
+
if (hasNoActivity && currentPeriod.value === "thisWeek") {
|
|
1279
|
+
weeklyActivity = [
|
|
1280
|
+
{ day: "Mon", workOrder: 800, taskCompleted: 1400 },
|
|
1281
|
+
{ day: "Tue", workOrder: 450, taskCompleted: 900 },
|
|
1282
|
+
{ day: "Wed", workOrder: 950, taskCompleted: 1640 },
|
|
1283
|
+
{ day: "Thu", workOrder: 2000, taskCompleted: 2100 },
|
|
1284
|
+
{ day: "Fri", workOrder: 2000, taskCompleted: 2700 },
|
|
1285
|
+
{ day: "Sat", workOrder: 2200, taskCompleted: 3100 },
|
|
1286
|
+
{ day: "Sun", workOrder: 2800, taskCompleted: 3200 },
|
|
1287
|
+
];
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
const activityChart = {
|
|
1291
|
+
labels: weeklyActivity.map((item: any) => item.day || item.label),
|
|
1292
|
+
workOrders: weeklyActivity.map(
|
|
1293
|
+
(item: any) => item.workOrder ?? item.openWorkOrder
|
|
1294
|
+
),
|
|
1295
|
+
taskCompleted: weeklyActivity.map(
|
|
1296
|
+
(item: any) => item.taskCompleted ?? item.closedWorkOrder
|
|
1297
|
+
),
|
|
1298
|
+
};
|
|
1299
|
+
|
|
1265
1300
|
if (isHygieneMode.value) {
|
|
1266
1301
|
const data = getDashboardReq.value ?? {};
|
|
1267
|
-
let weeklyActivity = weeklyActivityReq.value ?? [];
|
|
1268
|
-
const hasNoActivity =
|
|
1269
|
-
!weeklyActivity.length ||
|
|
1270
|
-
weeklyActivity.every(
|
|
1271
|
-
(item: any) =>
|
|
1272
|
-
!item.workOrder &&
|
|
1273
|
-
!item.taskCompleted &&
|
|
1274
|
-
!item.openWorkOrder &&
|
|
1275
|
-
!item.closedWorkOrder
|
|
1276
|
-
);
|
|
1277
|
-
|
|
1278
|
-
if (hasNoActivity && currentPeriod.value === "thisWeek") {
|
|
1279
|
-
weeklyActivity = [
|
|
1280
|
-
{ day: "Mon", workOrder: 800, taskCompleted: 1400 },
|
|
1281
|
-
{ day: "Tue", workOrder: 450, taskCompleted: 900 },
|
|
1282
|
-
{ day: "Wed", workOrder: 950, taskCompleted: 1640 },
|
|
1283
|
-
{ day: "Thu", workOrder: 2000, taskCompleted: 2100 },
|
|
1284
|
-
{ day: "Fri", workOrder: 2000, taskCompleted: 2700 },
|
|
1285
|
-
{ day: "Sat", workOrder: 2200, taskCompleted: 3100 },
|
|
1286
|
-
{ day: "Sun", workOrder: 2800, taskCompleted: 3200 },
|
|
1287
|
-
];
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
1302
|
return {
|
|
1291
1303
|
...data,
|
|
1292
1304
|
openWorkOrder: data.openWorkOrder ?? { count: 0, percentage: 0 },
|
|
1293
1305
|
supplyAlert: data.supplyAlert ?? { count: 0, percentage: 0 },
|
|
1294
1306
|
taskCompleted: data.taskCompleted ?? { count: 0, percentage: 0 },
|
|
1295
|
-
activityChart
|
|
1296
|
-
labels: weeklyActivity.map((item: any) => item.day || item.label),
|
|
1297
|
-
workOrders: weeklyActivity.map(
|
|
1298
|
-
(item: any) => item.workOrder ?? item.openWorkOrder
|
|
1299
|
-
),
|
|
1300
|
-
taskCompleted: weeklyActivity.map(
|
|
1301
|
-
(item: any) => item.taskCompleted ?? item.closedWorkOrder
|
|
1302
|
-
),
|
|
1303
|
-
},
|
|
1307
|
+
activityChart,
|
|
1304
1308
|
taskScheduleItems: taskScheduleReq.value?.items ?? [],
|
|
1305
1309
|
attendanceItems: attendanceReq.value?.items ?? [],
|
|
1306
1310
|
feedbackItems: feedbacksReq.value?.items ?? [],
|
|
@@ -1311,6 +1315,7 @@ const finalDashboardData = computed<Record<string, any>>(() => {
|
|
|
1311
1315
|
const data = getDashboardAltReq.value ?? {};
|
|
1312
1316
|
return {
|
|
1313
1317
|
...data,
|
|
1318
|
+
activityChart,
|
|
1314
1319
|
feedbackItems: feedbacksReq.value?.items ?? [],
|
|
1315
1320
|
openWorkOrder: data.openWorkOrder ?? { count: 0, inProgress: 0, percentage: 0 },
|
|
1316
1321
|
openIncidents: data.openIncidents ?? { count: 0, highSeverity: 0, percentage: 0 },
|
|
@@ -1328,6 +1333,7 @@ const finalDashboardData = computed<Record<string, any>>(() => {
|
|
|
1328
1333
|
const data = getDashboardAltReq.value ?? {};
|
|
1329
1334
|
return {
|
|
1330
1335
|
...data,
|
|
1336
|
+
activityChart,
|
|
1331
1337
|
feedbackItems: feedbacksReq.value?.items ?? [],
|
|
1332
1338
|
attendanceItems: attendanceReq.value?.items ?? [],
|
|
1333
1339
|
openWorkOrder: data.openWorkOrder ?? {
|
|
@@ -1397,14 +1403,14 @@ const propertyCardValues: TDashboardCardValue[] = [
|
|
|
1397
1403
|
key: "visitors",
|
|
1398
1404
|
periodKey: "period",
|
|
1399
1405
|
title: "Visitors",
|
|
1400
|
-
icon: "mdi-account-
|
|
1406
|
+
icon: "mdi-account-multiple",
|
|
1401
1407
|
color: "#d28722",
|
|
1402
1408
|
},
|
|
1403
1409
|
{
|
|
1404
1410
|
key: "facilityBookings",
|
|
1405
1411
|
periodKey: "period",
|
|
1406
1412
|
title: "Facility Booking",
|
|
1407
|
-
icon: "mdi-
|
|
1413
|
+
icon: "mdi-office-building",
|
|
1408
1414
|
color: "#23824f",
|
|
1409
1415
|
},
|
|
1410
1416
|
];
|
|
@@ -1428,14 +1434,14 @@ const securityCardValues: TDashboardCardValue[] = [
|
|
|
1428
1434
|
key: "visitors",
|
|
1429
1435
|
periodKey: "period",
|
|
1430
1436
|
title: "Visitors",
|
|
1431
|
-
icon: "mdi-account-
|
|
1437
|
+
icon: "mdi-account-multiple",
|
|
1432
1438
|
color: "#d28722",
|
|
1433
1439
|
},
|
|
1434
1440
|
{
|
|
1435
1441
|
key: "patrolCompliance",
|
|
1436
1442
|
periodKey: "period",
|
|
1437
1443
|
title: "Patrol Compliance",
|
|
1438
|
-
icon: "mdi-
|
|
1444
|
+
icon: "mdi-office-building",
|
|
1439
1445
|
color: "#23824f",
|
|
1440
1446
|
},
|
|
1441
1447
|
];
|
|
@@ -1603,7 +1609,7 @@ const facilityOptions = computed(() =>
|
|
|
1603
1609
|
function getPropertyKpiCards() {
|
|
1604
1610
|
const workOrderMetric = getMetric(["openWorkOrder", "workOrders", "openWorkOrders", "workOrder"]);
|
|
1605
1611
|
const incidentMetric = getMetric(["openIncidents", "incidents", "incidentReports"]);
|
|
1606
|
-
const visitorMetric =
|
|
1612
|
+
const visitorMetric = getFilteredVisitorMetric();
|
|
1607
1613
|
const facilityMetric = computeFacilityMetric();
|
|
1608
1614
|
|
|
1609
1615
|
return [
|
|
@@ -1615,7 +1621,7 @@ function getPropertyKpiCards() {
|
|
|
1615
1621
|
tint: "#d7ecff",
|
|
1616
1622
|
value: formatNumber(toNumber(workOrderMetric?.count)),
|
|
1617
1623
|
percentage: toNumber(workOrderMetric?.percentage),
|
|
1618
|
-
meta:
|
|
1624
|
+
meta: getMetricMeta(workOrderMetric),
|
|
1619
1625
|
raw: workOrderMetric,
|
|
1620
1626
|
filter: undefined,
|
|
1621
1627
|
},
|
|
@@ -1627,19 +1633,19 @@ function getPropertyKpiCards() {
|
|
|
1627
1633
|
tint: "#ffdede",
|
|
1628
1634
|
value: formatNumber(toNumber(incidentMetric?.count)),
|
|
1629
1635
|
percentage: toNumber(incidentMetric?.percentage),
|
|
1630
|
-
meta:
|
|
1636
|
+
meta: getMetricMeta(incidentMetric),
|
|
1631
1637
|
raw: incidentMetric,
|
|
1632
1638
|
filter: undefined,
|
|
1633
1639
|
},
|
|
1634
1640
|
{
|
|
1635
1641
|
key: "visitors",
|
|
1636
1642
|
title: "Visitors",
|
|
1637
|
-
icon: "mdi-account-
|
|
1643
|
+
icon: "mdi-account-multiple",
|
|
1638
1644
|
color: "#d28722",
|
|
1639
1645
|
tint: "#ffe4bd",
|
|
1640
1646
|
value: formatNumber(toNumber(visitorMetric?.count)),
|
|
1641
1647
|
percentage: toNumber(visitorMetric?.percentage),
|
|
1642
|
-
meta:
|
|
1648
|
+
meta: getMetricMeta(visitorMetric),
|
|
1643
1649
|
raw: visitorMetric,
|
|
1644
1650
|
filter: {
|
|
1645
1651
|
model: visitorType.value,
|
|
@@ -1653,12 +1659,12 @@ function getPropertyKpiCards() {
|
|
|
1653
1659
|
{
|
|
1654
1660
|
key: "facilityBookings",
|
|
1655
1661
|
title: "Facility Booking",
|
|
1656
|
-
icon: "mdi-
|
|
1662
|
+
icon: "mdi-office-building",
|
|
1657
1663
|
color: "#23824f",
|
|
1658
1664
|
tint: "#c8f3da",
|
|
1659
1665
|
value: formatNumber(toNumber(facilityMetric?.count)),
|
|
1660
1666
|
percentage: toNumber(facilityMetric?.percentage),
|
|
1661
|
-
meta:
|
|
1667
|
+
meta: getMetricMeta(facilityMetric),
|
|
1662
1668
|
raw: facilityMetric,
|
|
1663
1669
|
filter: {
|
|
1664
1670
|
model: facilityType.value,
|
|
@@ -1700,6 +1706,7 @@ function getSecurityKpiCards() {
|
|
|
1700
1706
|
const workOrderMetric = getMetric(["openWorkOrder", "workOrders", "openWorkOrders", "workOrder"]);
|
|
1701
1707
|
const incidentMetric = getMetric(["openIncidents", "incidents", "incidentReports"]);
|
|
1702
1708
|
const patrolMetric = getMetric(["patrolCompliance", "patrol"]);
|
|
1709
|
+
const visitorMetric = getFilteredVisitorMetric();
|
|
1703
1710
|
|
|
1704
1711
|
return [
|
|
1705
1712
|
{
|
|
@@ -1710,7 +1717,7 @@ function getSecurityKpiCards() {
|
|
|
1710
1717
|
tint: "#d7ecff",
|
|
1711
1718
|
value: formatNumber(toNumber(workOrderMetric?.count)),
|
|
1712
1719
|
percentage: toNumber(workOrderMetric?.percentage),
|
|
1713
|
-
meta:
|
|
1720
|
+
meta: getMetricMeta(workOrderMetric),
|
|
1714
1721
|
raw: workOrderMetric,
|
|
1715
1722
|
filter: undefined,
|
|
1716
1723
|
},
|
|
@@ -1722,20 +1729,20 @@ function getSecurityKpiCards() {
|
|
|
1722
1729
|
tint: "#ffdede",
|
|
1723
1730
|
value: formatNumber(toNumber(incidentMetric?.count)),
|
|
1724
1731
|
percentage: toNumber(incidentMetric?.percentage),
|
|
1725
|
-
meta:
|
|
1732
|
+
meta: getMetricMeta(incidentMetric),
|
|
1726
1733
|
raw: incidentMetric,
|
|
1727
1734
|
filter: undefined,
|
|
1728
1735
|
},
|
|
1729
1736
|
{
|
|
1730
1737
|
key: "visitors",
|
|
1731
1738
|
title: "Visitors",
|
|
1732
|
-
icon: "mdi-account-
|
|
1739
|
+
icon: "mdi-account-multiple",
|
|
1733
1740
|
color: "#d28722",
|
|
1734
1741
|
tint: "#ffe4bd",
|
|
1735
|
-
value: formatNumber(toNumber(
|
|
1736
|
-
percentage: toNumber(
|
|
1737
|
-
meta:
|
|
1738
|
-
raw:
|
|
1742
|
+
value: formatNumber(toNumber(visitorMetric?.count)),
|
|
1743
|
+
percentage: toNumber(visitorMetric?.percentage),
|
|
1744
|
+
meta: getMetricMeta(visitorMetric),
|
|
1745
|
+
raw: visitorMetric,
|
|
1739
1746
|
filter: {
|
|
1740
1747
|
model: visitorType.value,
|
|
1741
1748
|
options: visitorOptions.value,
|
|
@@ -1748,12 +1755,12 @@ function getSecurityKpiCards() {
|
|
|
1748
1755
|
{
|
|
1749
1756
|
key: "patrolCompliance",
|
|
1750
1757
|
title: "Patrol Compliance",
|
|
1751
|
-
icon: "mdi-
|
|
1758
|
+
icon: "mdi-office-building",
|
|
1752
1759
|
color: "#23824f",
|
|
1753
1760
|
tint: "#c8f3da",
|
|
1754
1761
|
value: `${toNumber(patrolMetric?.count)}%`,
|
|
1755
1762
|
percentage: toNumber(patrolMetric?.percentage),
|
|
1756
|
-
meta:
|
|
1763
|
+
meta: getMetricMeta(patrolMetric),
|
|
1757
1764
|
raw: patrolMetric,
|
|
1758
1765
|
filter: undefined,
|
|
1759
1766
|
},
|
|
@@ -2022,6 +2029,10 @@ function getMetricMeta(metric: DashboardMetric) {
|
|
|
2022
2029
|
`${formatNumber(toNumber((metric as any).missedCheckpoints ?? (metric as any).missed))} checkpoint missed`
|
|
2023
2030
|
);
|
|
2024
2031
|
}
|
|
2032
|
+
if (typeof metric.ongoing !== "undefined")
|
|
2033
|
+
parts.push(`${formatNumber(toNumber(metric.ongoing))} ongoing`);
|
|
2034
|
+
if (typeof metric.waitingApproval !== "undefined")
|
|
2035
|
+
parts.push(`${formatNumber(toNumber(metric.waitingApproval))} waiting approval`);
|
|
2025
2036
|
if (typeof metric.lowStock !== "undefined")
|
|
2026
2037
|
parts.push(`${formatNumber(toNumber(metric.lowStock))} low stock`);
|
|
2027
2038
|
if (typeof metric.outOfStock !== "undefined")
|
|
@@ -2032,7 +2043,7 @@ function getMetricMeta(metric: DashboardMetric) {
|
|
|
2032
2043
|
) {
|
|
2033
2044
|
parts.push(`${formatNumber(toNumber(metric.completed))} completed`);
|
|
2034
2045
|
}
|
|
2035
|
-
return parts.join("
|
|
2046
|
+
return parts.join(" • ");
|
|
2036
2047
|
}
|
|
2037
2048
|
|
|
2038
2049
|
function getFilteredVisitorMetric(): DashboardMetric {
|
|
@@ -33,7 +33,7 @@ export default function () {
|
|
|
33
33
|
);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function
|
|
36
|
+
function getDashboardWeeklyActivity(
|
|
37
37
|
site = "",
|
|
38
38
|
serviceType: TServiceType = "cleaning_services",
|
|
39
39
|
period?: TDashboardValues
|
|
@@ -149,7 +149,7 @@ export default function () {
|
|
|
149
149
|
return {
|
|
150
150
|
getDashboard,
|
|
151
151
|
getDashboardHygiene,
|
|
152
|
-
|
|
152
|
+
getDashboardWeeklyActivity,
|
|
153
153
|
getDashboardHygieneTaskSchedule,
|
|
154
154
|
getDashboardHygieneAttendance,
|
|
155
155
|
getDashboardHygieneFeedbacks,
|
package/composables/useMember.ts
CHANGED
|
@@ -58,7 +58,7 @@ export default function useMember() {
|
|
|
58
58
|
if (search) query.search = search;
|
|
59
59
|
if (user) query.user = user;
|
|
60
60
|
if (org) query.org = org;
|
|
61
|
-
|
|
61
|
+
if (siteId) query.siteId = siteId;
|
|
62
62
|
return useNuxtApp().$api<Record<string, any>>("/api/members", {
|
|
63
63
|
method: "GET",
|
|
64
64
|
query,
|
|
@@ -120,10 +120,9 @@ export default function useMember() {
|
|
|
120
120
|
return useNuxtApp().$api<TMember>("/api/members/direct", {
|
|
121
121
|
method: "POST",
|
|
122
122
|
body: payload,
|
|
123
|
-
})
|
|
123
|
+
});
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
|
|
127
126
|
function updateMemberSite(id: string, siteId: string, siteName: string) {
|
|
128
127
|
return useNuxtApp().$api(`/api/members/site`, {
|
|
129
128
|
method: "PUT",
|