@optifye/dashboard-core 6.11.37 → 6.11.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -3394,6 +3394,12 @@ var isFullMonthRange = (range, year, monthIndex) => {
3394
3394
  const bounds = getMonthKeyBounds(year, monthIndex);
3395
3395
  return range.startKey === bounds.startKey && range.endKey === bounds.endKey;
3396
3396
  };
3397
+ var getMonthlyTrendComparisonLabel = (range, year, monthIndex) => {
3398
+ if (isFullMonthRange(range, year, monthIndex)) {
3399
+ return "last month";
3400
+ }
3401
+ return range.startKey === range.endKey ? "previous day" : "previous range";
3402
+ };
3397
3403
  var getMonthWeekRanges = (year, monthIndex, timezone, maxKey) => {
3398
3404
  const totalDays = new Date(year, monthIndex + 1, 0).getDate();
3399
3405
  const ranges = [];
@@ -12261,6 +12267,7 @@ var toWorkspaceDetailedMetrics = ({
12261
12267
  return {
12262
12268
  workspace_id: data.workspace_id,
12263
12269
  workspace_name: data.workspace_name,
12270
+ workspace_display_name: typeof data.workspace_display_name === "string" ? data.workspace_display_name : typeof data.display_name === "string" ? data.display_name : null,
12264
12271
  line_id: data.line_id,
12265
12272
  line_name: data.line_name || "",
12266
12273
  line_assembly_enabled: data.line_assembly_enabled === true || data.assembly_enabled === true,
@@ -18409,13 +18416,27 @@ var useMonthlyTrend = (params) => {
18409
18416
  if (typeof params.shiftId === "number") {
18410
18417
  searchParams.append("shift_id", params.shiftId.toString());
18411
18418
  }
18419
+ if (params.startDate && params.endDate) {
18420
+ searchParams.append("start_date", params.startDate);
18421
+ searchParams.append("end_date", params.endDate);
18422
+ }
18412
18423
  if (params.entityType === "line") {
18413
18424
  searchParams.append("line_id", params.entityId);
18414
18425
  } else {
18415
18426
  searchParams.append("workspace_id", params.entityId);
18416
18427
  }
18417
18428
  return searchParams.toString();
18418
- }, [params.entityId, params.entityType, params.month, params.year, params.shiftId, entityConfig?.companyId]);
18429
+ }, [
18430
+ params.companyId,
18431
+ params.endDate,
18432
+ params.entityId,
18433
+ params.entityType,
18434
+ params.month,
18435
+ params.shiftId,
18436
+ params.startDate,
18437
+ params.year,
18438
+ entityConfig?.companyId
18439
+ ]);
18419
18440
  useEffect(() => {
18420
18441
  let isMounted = true;
18421
18442
  if (!queryString || !supabase) {
@@ -47261,6 +47282,10 @@ var LineMonthlyHistory = ({
47261
47282
  const efficiencyImproved = efficiencyDelta >= 0;
47262
47283
  const EfficiencyTrendIcon = efficiencyImproved ? ArrowUp : ArrowDown;
47263
47284
  const efficiencyTrendText = `${Math.abs(efficiencyDelta).toFixed(1)}%`;
47285
+ const trendComparisonLabel = useMemo(
47286
+ () => getMonthlyTrendComparisonLabel(normalizedRange, year, month),
47287
+ [month, normalizedRange, year]
47288
+ );
47264
47289
  const outputDelta = trendSummary?.avg_daily_output?.delta_pp ?? 0;
47265
47290
  const outputImproved = outputDelta >= 0;
47266
47291
  const OutputTrendIcon = outputImproved ? ArrowUp : ArrowDown;
@@ -47511,10 +47536,7 @@ var LineMonthlyHistory = ({
47511
47536
  /* @__PURE__ */ jsx("div", { className: "text-base font-bold text-gray-900 whitespace-nowrap", children: uptimeSummary?.avgDailyStoppages ?? 0 }),
47512
47537
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${stoppagesImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-1.5 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
47513
47538
  /* @__PURE__ */ jsx(StoppagesTrendIcon, { className: "w-3 h-3" }),
47514
- /* @__PURE__ */ jsxs("span", { children: [
47515
- stoppagesTrendText,
47516
- " vs last month"
47517
- ] })
47539
+ /* @__PURE__ */ jsx("span", { children: `${stoppagesTrendText} vs ${trendComparisonLabel}` })
47518
47540
  ] })
47519
47541
  ] })
47520
47542
  ] }),
@@ -47524,10 +47546,7 @@ var LineMonthlyHistory = ({
47524
47546
  /* @__PURE__ */ jsx("div", { className: "text-base font-bold text-gray-900 whitespace-nowrap", children: formatIdleTime(uptimeSummary?.avgIdleTime ?? 0) }),
47525
47547
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${idleImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-1.5 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
47526
47548
  /* @__PURE__ */ jsx(IdleTrendIcon, { className: "w-3 h-3" }),
47527
- /* @__PURE__ */ jsxs("span", { children: [
47528
- idleTrendText,
47529
- " vs last month"
47530
- ] })
47549
+ /* @__PURE__ */ jsx("span", { children: `${idleTrendText} vs ${trendComparisonLabel}` })
47531
47550
  ] })
47532
47551
  ] })
47533
47552
  ] })
@@ -47541,10 +47560,7 @@ var LineMonthlyHistory = ({
47541
47560
  ] }),
47542
47561
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${efficiencyImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-1.5 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
47543
47562
  /* @__PURE__ */ jsx(EfficiencyTrendIcon, { className: "w-3 h-3" }),
47544
- /* @__PURE__ */ jsxs("span", { children: [
47545
- efficiencyTrendText,
47546
- " vs last month"
47547
- ] })
47563
+ /* @__PURE__ */ jsx("span", { children: `${efficiencyTrendText} vs ${trendComparisonLabel}` })
47548
47564
  ] })
47549
47565
  ] })
47550
47566
  ] }),
@@ -47554,10 +47570,7 @@ var LineMonthlyHistory = ({
47554
47570
  /* @__PURE__ */ jsx("div", { className: "text-xl font-bold text-gray-900", children: Math.round(avgOutput).toLocaleString() }),
47555
47571
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${outputImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-1.5 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
47556
47572
  /* @__PURE__ */ jsx(OutputTrendIcon, { className: "w-3 h-3" }),
47557
- /* @__PURE__ */ jsxs("span", { children: [
47558
- outputTrendText,
47559
- " vs last month"
47560
- ] })
47573
+ /* @__PURE__ */ jsx("span", { children: `${outputTrendText} vs ${trendComparisonLabel}` })
47561
47574
  ] })
47562
47575
  ] })
47563
47576
  ] })
@@ -47568,10 +47581,7 @@ var LineMonthlyHistory = ({
47568
47581
  /* @__PURE__ */ jsx("h3", { className: "text-xs sm:text-sm font-bold text-gray-700 text-left", children: "Utilization" }),
47569
47582
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${utilizationImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-1.5 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
47570
47583
  /* @__PURE__ */ jsx(UtilizationTrendIcon, { className: "w-3 h-3" }),
47571
- /* @__PURE__ */ jsxs("span", { children: [
47572
- utilizationTrendText,
47573
- " vs last month"
47574
- ] })
47584
+ /* @__PURE__ */ jsx("span", { children: `${utilizationTrendText} vs ${trendComparisonLabel}` })
47575
47585
  ] })
47576
47586
  ] }),
47577
47587
  pieChartData.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "w-full h-[140px] sm:h-[160px] flex items-center overflow-hidden", children: [
@@ -47923,19 +47933,33 @@ var LineMonthlyPdfGenerator = ({
47923
47933
  is_full_month: fullRange
47924
47934
  });
47925
47935
  const doc = new jsPDF$1();
47926
- doc.setFontSize(14);
47927
- doc.setFont("helvetica", "bold");
47928
- doc.setTextColor(50, 50, 50);
47929
- doc.text("OPTIFYE.AI", 20, 15);
47930
- doc.setFontSize(11);
47931
- doc.setFont("helvetica", "normal");
47932
- doc.setTextColor(80, 80, 80);
47933
- const reportText = isUptimeMode ? "MONTHLY UTILIZATION REPORT" : "MONTHLY PERFORMANCE REPORT";
47934
- const reportTextWidth = doc.getStringUnitWidth(reportText) * 11 / doc.internal.scaleFactor;
47935
- doc.text(reportText, doc.internal.pageSize.width - 20 - reportTextWidth, 15);
47936
- doc.setDrawColor(200, 200, 200);
47937
- doc.setLineWidth(0.5);
47938
- doc.line(20, 20, 190, 20);
47936
+ const pageHeight = typeof doc.internal.pageSize.height === "number" ? Number(doc.internal.pageSize.height) : 297;
47937
+ const footerY = pageHeight - 17;
47938
+ const maxContentY = footerY - 10;
47939
+ const generatedText = `Generated on ${(/* @__PURE__ */ new Date()).toLocaleString("en-IN", { timeZone: "Asia/Kolkata" })}`;
47940
+ const dailySectionTitle = isUptimeMode ? "Daily Utilization Summary" : "Daily Performance Summary";
47941
+ const drawPageChrome = () => {
47942
+ doc.setFontSize(14);
47943
+ doc.setFont("helvetica", "bold");
47944
+ doc.setTextColor(50, 50, 50);
47945
+ doc.text("OPTIFYE.AI", 20, 15);
47946
+ doc.setFontSize(11);
47947
+ doc.setFont("helvetica", "normal");
47948
+ doc.setTextColor(80, 80, 80);
47949
+ const reportText = isUptimeMode ? "MONTHLY UTILIZATION REPORT" : "MONTHLY PERFORMANCE REPORT";
47950
+ const reportTextWidth = doc.getStringUnitWidth(reportText) * 11 / doc.internal.scaleFactor;
47951
+ doc.text(reportText, doc.internal.pageSize.width - 20 - reportTextWidth, 15);
47952
+ doc.setDrawColor(200, 200, 200);
47953
+ doc.setLineWidth(0.5);
47954
+ doc.line(20, 20, 190, 20);
47955
+ };
47956
+ const drawFooter = () => {
47957
+ doc.setFontSize(9);
47958
+ doc.setTextColor(130, 130, 130);
47959
+ doc.text(generatedText, 20, footerY);
47960
+ doc.setTextColor(0, 0, 0);
47961
+ };
47962
+ drawPageChrome();
47939
47963
  doc.setFillColor(250, 250, 250);
47940
47964
  doc.roundedRect(15, 25, 180, 55, 3, 3, "F");
47941
47965
  doc.setFontSize(32);
@@ -47970,6 +47994,10 @@ var LineMonthlyPdfGenerator = ({
47970
47994
  if (shift.hasData !== void 0) return shift.hasData;
47971
47995
  return shift.total_workspaces > 0 || shift.avg_efficiency > 0 || shift.underperforming_workspaces > 0 || (shift.available_time_seconds ?? 0) > 0 || (shift.idle_time_seconds ?? 0) > 0 || (shift.output ?? 0) > 0;
47972
47996
  };
47997
+ const dailyEntries = validDays.map((dayData) => {
47998
+ const shift = getLineShiftData2(dayData, selectedShiftId);
47999
+ return { dayData, shift };
48000
+ }).filter(({ shift }) => hasShiftData(shift)).sort((left, right) => new Date(right.dayData.date).getTime() - new Date(left.dayData.date).getTime());
47973
48001
  const getUptimeTotals2 = (shift, hasData) => {
47974
48002
  if (!hasData || !shift) {
47975
48003
  return { availableSeconds: 0, productiveSeconds: 0, idleSeconds: 0 };
@@ -48096,46 +48124,45 @@ var LineMonthlyPdfGenerator = ({
48096
48124
  }
48097
48125
  const dailySeparatorY = isUptimeMode ? 180 : 165;
48098
48126
  const dailySectionStartY = isUptimeMode ? 185 : 170;
48099
- const dailyTitleY = isUptimeMode ? 195 : 180;
48100
- const dailyHeaderY = isUptimeMode ? 200 : 185;
48101
- const dailyHeaderTextY = isUptimeMode ? 205 : 190;
48102
- const dailyHeaderLineY = isUptimeMode ? 208 : 193;
48103
48127
  const dailyContentStartY = isUptimeMode ? 215 : 200;
48104
- const dailyMaxY = isUptimeMode ? 260 : 245;
48105
48128
  doc.setDrawColor(180, 180, 180);
48106
48129
  doc.setLineWidth(0.8);
48107
48130
  doc.line(20, dailySeparatorY, 190, dailySeparatorY);
48108
- doc.setFillColor(245, 245, 245);
48109
- doc.roundedRect(15, dailySectionStartY, 180, 85, 3, 3, "F");
48110
- doc.setFontSize(18);
48111
- doc.setFont("helvetica", "bold");
48112
- doc.setTextColor(40, 40, 40);
48113
- doc.text(isUptimeMode ? "Daily Utilization Summary" : "Daily Performance Summary", 20, dailyTitleY);
48114
- doc.setTextColor(0, 0, 0);
48115
- if (validDays.length > 0) {
48131
+ const renderDailyTablePage = (startIndex, sectionY, title) => {
48132
+ const rowHeight = 8;
48133
+ const tableHeaderY = sectionY + 15;
48134
+ const headerTextY = tableHeaderY + 5;
48135
+ const firstRowY = headerTextY + 10;
48136
+ const rowsPerPage = Math.max(1, Math.floor((maxContentY - firstRowY) / rowHeight));
48137
+ const pageEntries = dailyEntries.slice(startIndex, startIndex + rowsPerPage);
48138
+ const endY = firstRowY + pageEntries.length * rowHeight;
48139
+ const sectionHeight = Math.max(40, endY - sectionY + 5);
48140
+ doc.setFillColor(245, 245, 245);
48141
+ doc.roundedRect(15, sectionY, 180, sectionHeight, 3, 3, "F");
48142
+ doc.setFontSize(18);
48143
+ doc.setFont("helvetica", "bold");
48144
+ doc.setTextColor(40, 40, 40);
48145
+ doc.text(title, 20, sectionY + 10);
48146
+ doc.setTextColor(0, 0, 0);
48116
48147
  doc.setFontSize(10);
48117
48148
  doc.setFont("helvetica", "bold");
48118
48149
  doc.setFillColor(240, 240, 240);
48119
- doc.roundedRect(20, dailyHeaderY, 170, 7, 1, 1, "F");
48120
- doc.text("Date", 25, dailyHeaderTextY);
48150
+ doc.roundedRect(20, tableHeaderY, 170, 7, 1, 1, "F");
48151
+ doc.text("Date", 25, headerTextY);
48121
48152
  if (isUptimeMode) {
48122
- doc.text("Utilization", 95, dailyHeaderTextY);
48153
+ doc.text("Utilization", 95, headerTextY);
48123
48154
  } else {
48124
- doc.text("Actual", 60, dailyHeaderTextY);
48125
- doc.text("Standard", 95, dailyHeaderTextY);
48126
- doc.text("Efficiency", 135, dailyHeaderTextY);
48127
- doc.text("Status", 170, dailyHeaderTextY);
48155
+ doc.text("Actual", 60, headerTextY);
48156
+ doc.text("Standard", 95, headerTextY);
48157
+ doc.text("Efficiency", 135, headerTextY);
48158
+ doc.text("Status", 170, headerTextY);
48128
48159
  }
48129
48160
  doc.setLineWidth(0.2);
48130
48161
  doc.setDrawColor(220, 220, 220);
48131
- doc.line(20, dailyHeaderLineY, 190, dailyHeaderLineY);
48162
+ doc.line(20, headerTextY + 3, 190, headerTextY + 3);
48132
48163
  doc.setFont("helvetica", "normal");
48133
- let yPos = dailyContentStartY;
48134
- const recentDays = validDays.slice(-10).reverse();
48135
- recentDays.forEach((dayData, index) => {
48136
- if (yPos > dailyMaxY) return;
48137
- const shift = getLineShiftData2(dayData, selectedShiftId);
48138
- if (!hasShiftData(shift)) return;
48164
+ let yPos = firstRowY;
48165
+ pageEntries.forEach(({ dayData, shift }, index) => {
48139
48166
  if (isUptimeMode) {
48140
48167
  doc.setDrawColor(200, 200, 200);
48141
48168
  doc.setLineWidth(0.1);
@@ -48176,12 +48203,34 @@ var LineMonthlyPdfGenerator = ({
48176
48203
  }
48177
48204
  doc.setTextColor(0, 0, 0);
48178
48205
  }
48179
- yPos += 8;
48206
+ yPos += rowHeight;
48180
48207
  });
48181
48208
  if (!isUptimeMode) {
48182
48209
  doc.setLineWidth(0.2);
48183
48210
  doc.setDrawColor(220, 220, 220);
48184
- doc.roundedRect(20, dailyHeaderY, 170, yPos - dailyHeaderY - 3, 1, 1, "S");
48211
+ doc.roundedRect(20, tableHeaderY, 170, yPos - tableHeaderY - 3, 1, 1, "S");
48212
+ }
48213
+ return startIndex + pageEntries.length;
48214
+ };
48215
+ if (dailyEntries.length > 0) {
48216
+ let renderedEntries = renderDailyTablePage(0, dailySectionStartY, dailySectionTitle);
48217
+ while (renderedEntries < dailyEntries.length) {
48218
+ drawFooter();
48219
+ doc.addPage();
48220
+ drawPageChrome();
48221
+ doc.setFontSize(12);
48222
+ doc.setFont("helvetica", "bold");
48223
+ doc.setTextColor(40, 40, 40);
48224
+ doc.text(lineName || "Line", 20, 32);
48225
+ doc.setFont("helvetica", "normal");
48226
+ doc.setTextColor(90, 90, 90);
48227
+ doc.text(`${monthName} \u2022 ${shiftType} \u2022 ${reportStartStr} - ${reportEndStr}`, 20, 40);
48228
+ doc.setTextColor(0, 0, 0);
48229
+ renderedEntries = renderDailyTablePage(
48230
+ renderedEntries,
48231
+ 48,
48232
+ `${dailySectionTitle} (cont.)`
48233
+ );
48185
48234
  }
48186
48235
  } else {
48187
48236
  doc.setFontSize(12);
@@ -48194,20 +48243,9 @@ var LineMonthlyPdfGenerator = ({
48194
48243
  const isCycleTimeWorkspace = (workspace) => workspace.metric_mode === "cycle_time" || lineAssembly && (workspace.avg_cycle_time !== void 0 || workspace.ideal_cycle_time !== void 0 || workspace.cycle_ratio !== void 0);
48195
48244
  const showCycleTimePoorestPerformers = !isUptimeMode && poorestWorkspaces.some(isCycleTimeWorkspace);
48196
48245
  if (poorestWorkspaces && poorestWorkspaces.length > 0) {
48246
+ drawFooter();
48197
48247
  doc.addPage();
48198
- doc.setFontSize(14);
48199
- doc.setFont("helvetica", "bold");
48200
- doc.setTextColor(50, 50, 50);
48201
- doc.text("OPTIFYE.AI", 20, 15);
48202
- doc.setFontSize(11);
48203
- doc.setFont("helvetica", "normal");
48204
- doc.setTextColor(80, 80, 80);
48205
- const reportText2 = isUptimeMode ? "MONTHLY UTILIZATION REPORT" : "MONTHLY PERFORMANCE REPORT";
48206
- const reportTextWidth2 = doc.getStringUnitWidth(reportText2) * 11 / doc.internal.scaleFactor;
48207
- doc.text(reportText2, doc.internal.pageSize.width - 20 - reportTextWidth2, 15);
48208
- doc.setDrawColor(200, 200, 200);
48209
- doc.setLineWidth(0.5);
48210
- doc.line(20, 20, 190, 20);
48248
+ drawPageChrome();
48211
48249
  doc.setFontSize(18);
48212
48250
  doc.setFont("helvetica", "bold");
48213
48251
  doc.setTextColor(40, 40, 40);
@@ -48273,10 +48311,7 @@ var LineMonthlyPdfGenerator = ({
48273
48311
  doc.setDrawColor(220, 220, 220);
48274
48312
  doc.roundedRect(20, 45, 170, yPos2 - 45 - 5, 1, 1, "S");
48275
48313
  }
48276
- doc.setFontSize(9);
48277
- doc.setTextColor(130, 130, 130);
48278
- const generatedText = `Generated on ${(/* @__PURE__ */ new Date()).toLocaleString("en-IN", { timeZone: "Asia/Kolkata" })}`;
48279
- doc.text(generatedText, 20, 280);
48314
+ drawFooter();
48280
48315
  const fileName = `${lineName || "Line"}_${monthName.replace(" ", "_")}_${shiftType.replace(" ", "_")}.pdf`;
48281
48316
  doc.save(fileName);
48282
48317
  } catch (error) {
@@ -49846,6 +49881,10 @@ var formatHours = (value) => {
49846
49881
  if (Math.abs(rounded) < 0.05) return "0h";
49847
49882
  return Number.isInteger(rounded) ? `${rounded}h` : `${rounded.toFixed(1)}h`;
49848
49883
  };
49884
+ var formatCycleSeconds = (value) => {
49885
+ if (!Number.isFinite(value)) return "0.0s";
49886
+ return `${value.toFixed(1)}s`;
49887
+ };
49849
49888
  var CustomTooltip3 = ({ active, payload, label, isUptimeMode }) => {
49850
49889
  if (!active || !payload || payload.length === 0) return null;
49851
49890
  if (isUptimeMode) {
@@ -50156,6 +50195,10 @@ var WorkspaceMonthlyHistory = ({
50156
50195
  avgIdleTime: Math.round(totalIdleTime / filteredShifts.length)
50157
50196
  };
50158
50197
  }, [analysisMonthlyData, selectedShiftId, isUptimeMode, shiftWorkSeconds]);
50198
+ const trendComparisonLabel = useMemo(
50199
+ () => getMonthlyTrendComparisonLabel(normalizedRange, year, month),
50200
+ [month, normalizedRange, year]
50201
+ );
50159
50202
  const efficiencyDelta = trendSummary?.avg_efficiency?.delta_pp ?? 0;
50160
50203
  const efficiencyImproved = efficiencyDelta >= 0;
50161
50204
  const assemblyRangeCycleTime = useMemo(() => {
@@ -50171,17 +50214,17 @@ var WorkspaceMonthlyHistory = ({
50171
50214
  const cycleWorsened = cycleDelta > 0;
50172
50215
  const utilizationDelta = efficiencyDelta;
50173
50216
  const utilizationImproved = utilizationDelta >= 0;
50174
- const utilizationTrendText = `${Math.abs(utilizationDelta).toFixed(1)}% vs last month`;
50217
+ const utilizationTrendText = `${Math.abs(utilizationDelta).toFixed(1)}%`;
50175
50218
  const idleDeltaRaw = trendSummary?.avg_idle_time?.delta_seconds ?? 0;
50176
50219
  const idlePrev = trendSummary?.avg_idle_time?.previous ?? 0;
50177
50220
  const idleDelta = idlePrev ? idleDeltaRaw / idlePrev * 100 : 0;
50178
50221
  const idleImproved = idleDelta <= 0;
50179
- const idleTrendText = `${Math.abs(idleDelta).toFixed(1)}% vs last month`;
50222
+ const idleTrendText = `${Math.abs(idleDelta).toFixed(1)}%`;
50180
50223
  const stoppagesDeltaRaw = trendSummary?.avg_daily_stoppages?.delta_count ?? 0;
50181
50224
  const stoppagesPrev = trendSummary?.avg_daily_stoppages?.previous ?? 0;
50182
50225
  const stoppagesDelta = stoppagesPrev ? stoppagesDeltaRaw / stoppagesPrev * 100 : 0;
50183
50226
  const stoppagesImproved = stoppagesDelta <= 0;
50184
- const stoppagesTrendText = `${Math.abs(stoppagesDelta).toFixed(1)}% vs last month`;
50227
+ const stoppagesTrendText = `${Math.abs(stoppagesDelta).toFixed(1)}%`;
50185
50228
  const calendarData = useMemo(() => {
50186
50229
  const startOfMonth2 = new Date(year, month, 1);
50187
50230
  const endOfMonth2 = new Date(year, month + 1, 0);
@@ -50342,20 +50385,17 @@ var WorkspaceMonthlyHistory = ({
50342
50385
  /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-gray-900", children: formatIdleTime(metrics2?.avgIdleTime ?? 0) }),
50343
50386
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${idleImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50344
50387
  idleImproved ? /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }),
50345
- /* @__PURE__ */ jsx("span", { children: idleTrendText })
50388
+ /* @__PURE__ */ jsx("span", { children: `${idleTrendText} vs ${trendComparisonLabel}` })
50346
50389
  ] })
50347
50390
  ] })
50348
50391
  ] }),
50349
50392
  /* @__PURE__ */ jsxs("div", { className: "bg-white rounded-lg shadow-sm border border-gray-100 p-4 flex flex-col justify-between", children: [
50350
50393
  /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-gray-600 mb-1", children: "Avg Cycle Time" }),
50351
50394
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-nowrap", children: [
50352
- /* @__PURE__ */ jsxs("div", { className: "text-2xl font-bold text-gray-900", children: [
50353
- assemblyRangeCycleTime,
50354
- "s"
50355
- ] }),
50395
+ /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-gray-900", children: formatCycleSeconds(assemblyRangeCycleTime) }),
50356
50396
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${cycleWorsened ? "bg-red-50 text-red-600" : "bg-emerald-50 text-emerald-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50357
50397
  cycleWorsened ? /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }),
50358
- /* @__PURE__ */ jsx("span", { children: `${Math.abs(cycleDelta).toFixed(1)}% vs last month` })
50398
+ /* @__PURE__ */ jsx("span", { children: `${Math.abs(cycleDelta).toFixed(1)}% vs ${trendComparisonLabel}` })
50359
50399
  ] })
50360
50400
  ] })
50361
50401
  ] })
@@ -50366,10 +50406,10 @@ var WorkspaceMonthlyHistory = ({
50366
50406
  /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-gray-900", children: isUptimeMode ? `${metrics2?.avgUtilization ?? 0}%` : `${metrics2?.avgEfficiency ?? 0}%` }),
50367
50407
  isUptimeMode ? /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${utilizationImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50368
50408
  utilizationImproved ? /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }),
50369
- /* @__PURE__ */ jsx("span", { children: utilizationTrendText })
50409
+ /* @__PURE__ */ jsx("span", { children: `${utilizationTrendText} vs ${trendComparisonLabel}` })
50370
50410
  ] }) : /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${efficiencyImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50371
50411
  efficiencyImproved ? /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }),
50372
- /* @__PURE__ */ jsx("span", { children: `${Math.abs(efficiencyDelta).toFixed(1)}% vs last month` })
50412
+ /* @__PURE__ */ jsx("span", { children: `${Math.abs(efficiencyDelta).toFixed(1)}% vs ${trendComparisonLabel}` })
50373
50413
  ] })
50374
50414
  ] })
50375
50415
  ] }),
@@ -50379,7 +50419,7 @@ var WorkspaceMonthlyHistory = ({
50379
50419
  /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold text-gray-900", children: formatIdleTime(metrics2?.avgIdleTime ?? 0) }),
50380
50420
  /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${idleImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50381
50421
  idleImproved ? /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }),
50382
- /* @__PURE__ */ jsx("span", { children: idleTrendText })
50422
+ /* @__PURE__ */ jsx("span", { children: `${idleTrendText} vs ${trendComparisonLabel}` })
50383
50423
  ] })
50384
50424
  ] })
50385
50425
  ] }),
@@ -50392,10 +50432,10 @@ var WorkspaceMonthlyHistory = ({
50392
50432
  ] }),
50393
50433
  isUptimeMode ? /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${stoppagesImproved ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50394
50434
  stoppagesImproved ? /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }),
50395
- /* @__PURE__ */ jsx("span", { children: stoppagesTrendText })
50435
+ /* @__PURE__ */ jsx("span", { children: `${stoppagesTrendText} vs ${trendComparisonLabel}` })
50396
50436
  ] }) : /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1 ${cycleWorsened ? "bg-red-50 text-red-600" : "bg-emerald-50 text-emerald-600"} px-2 py-0.5 rounded-full text-[10px] font-medium whitespace-nowrap flex-shrink-0`, children: [
50397
50437
  cycleWorsened ? /* @__PURE__ */ jsx(ArrowUp, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(ArrowDown, { className: "w-3 h-3" }),
50398
- /* @__PURE__ */ jsx("span", { children: `${Math.abs(cycleDelta).toFixed(1)}% vs last month` })
50438
+ /* @__PURE__ */ jsx("span", { children: `${Math.abs(cycleDelta).toFixed(1)}% vs ${trendComparisonLabel}` })
50399
50439
  ] })
50400
50440
  ] })
50401
50441
  ] })
@@ -51107,6 +51147,7 @@ var getShiftDisplayName2 = (shiftId, availableShifts) => {
51107
51147
  var WorkspaceMonthlyPdfGenerator = ({
51108
51148
  workspaceId,
51109
51149
  workspaceName,
51150
+ lineName,
51110
51151
  monthlyData,
51111
51152
  analysisData,
51112
51153
  selectedMonth,
@@ -51172,9 +51213,17 @@ var WorkspaceMonthlyPdfGenerator = ({
51172
51213
  year: "numeric",
51173
51214
  timeZone: "Asia/Kolkata"
51174
51215
  });
51216
+ const doc = new jsPDF$1();
51217
+ const pageHeight = typeof doc.internal.pageSize.height === "number" ? Number(doc.internal.pageSize.height) : 297;
51218
+ const footerY = pageHeight - 17;
51219
+ const maxContentY = footerY - 10;
51220
+ const generatedText = `Generated on ${(/* @__PURE__ */ new Date()).toLocaleString("en-IN", { timeZone: "Asia/Kolkata" })}`;
51221
+ const resolvedLineName = lineName?.trim() || "Line";
51222
+ const dailySectionTitle = isUptimeMode ? "Daily Utilization Summary" : "Daily Performance Summary";
51175
51223
  trackCoreEvent("Workspace Monthly PDF Export Clicked", {
51176
51224
  workspace_id: workspaceId,
51177
51225
  workspace_name: workspaceName,
51226
+ line_name: resolvedLineName,
51178
51227
  month: selectedMonth,
51179
51228
  year: selectedYear,
51180
51229
  shift_id: selectedShiftId,
@@ -51182,26 +51231,34 @@ var WorkspaceMonthlyPdfGenerator = ({
51182
51231
  range_end: normalizedRange.endKey,
51183
51232
  is_full_month: fullRange
51184
51233
  });
51185
- const doc = new jsPDF$1();
51186
- doc.setFontSize(14);
51187
- doc.setFont("helvetica", "bold");
51188
- doc.setTextColor(50, 50, 50);
51189
- doc.text("OPTIFYE.AI", 20, 15);
51190
- doc.setFontSize(11);
51191
- doc.setFont("helvetica", "normal");
51192
- doc.setTextColor(80, 80, 80);
51193
- const reportText = isUptimeMode ? "MONTHLY UTILIZATION REPORT" : "MONTHLY PERFORMANCE REPORT";
51194
- const reportTextWidth = doc.getStringUnitWidth(reportText) * 11 / doc.internal.scaleFactor;
51195
- doc.text(reportText, doc.internal.pageSize.width - 20 - reportTextWidth, 15);
51196
- doc.setDrawColor(200, 200, 200);
51197
- doc.setLineWidth(0.5);
51198
- doc.line(20, 20, 190, 20);
51234
+ const drawPageChrome = () => {
51235
+ doc.setFontSize(14);
51236
+ doc.setFont("helvetica", "bold");
51237
+ doc.setTextColor(50, 50, 50);
51238
+ doc.text("OPTIFYE.AI", 20, 15);
51239
+ doc.setFontSize(11);
51240
+ doc.setFont("helvetica", "normal");
51241
+ doc.setTextColor(80, 80, 80);
51242
+ const reportText = isUptimeMode ? "MONTHLY UTILIZATION REPORT" : "MONTHLY PERFORMANCE REPORT";
51243
+ const reportTextWidth = doc.getStringUnitWidth(reportText) * 11 / doc.internal.scaleFactor;
51244
+ doc.text(reportText, doc.internal.pageSize.width - 20 - reportTextWidth, 15);
51245
+ doc.setDrawColor(200, 200, 200);
51246
+ doc.setLineWidth(0.5);
51247
+ doc.line(20, 20, 190, 20);
51248
+ };
51249
+ const drawFooter = () => {
51250
+ doc.setFontSize(9);
51251
+ doc.setTextColor(130, 130, 130);
51252
+ doc.text(generatedText, 20, footerY);
51253
+ doc.setTextColor(0, 0, 0);
51254
+ };
51255
+ drawPageChrome();
51199
51256
  doc.setFillColor(250, 250, 250);
51200
51257
  doc.roundedRect(15, 25, 180, 55, 3, 3, "F");
51201
51258
  doc.setFontSize(32);
51202
51259
  doc.setFont("helvetica", "bold");
51203
51260
  doc.setTextColor(0, 0, 0);
51204
- doc.text("Line 1", 20, 40);
51261
+ doc.text(resolvedLineName, 20, 40);
51205
51262
  doc.setFontSize(22);
51206
51263
  doc.setFont("helvetica", "normal");
51207
51264
  doc.setTextColor(40, 40, 40);
@@ -51230,6 +51287,10 @@ var WorkspaceMonthlyPdfGenerator = ({
51230
51287
  return date.getMonth() === selectedMonth && date.getFullYear() === selectedYear;
51231
51288
  });
51232
51289
  const validShifts = validDays.map((day) => getShiftData(day, selectedShiftId)).filter(hasShiftData);
51290
+ const dailyEntries = validDays.map((dayData) => {
51291
+ const shift = getShiftData(dayData, selectedShiftId);
51292
+ return { dayData, shift };
51293
+ }).filter(({ shift }) => hasShiftData(shift)).sort((left, right) => new Date(right.dayData.date).getTime() - new Date(left.dayData.date).getTime());
51233
51294
  const filteredShifts = isUptimeMode ? validShifts : validShifts.filter((shift) => (shift.efficiency ?? 0) >= 5);
51234
51295
  const monthlyMetrics = filteredShifts.length > 0 ? isUptimeMode ? (() => {
51235
51296
  const totalIdleTime = filteredShifts.reduce((sum, shift) => sum + shift.idleTime, 0);
@@ -51356,21 +51417,27 @@ var WorkspaceMonthlyPdfGenerator = ({
51356
51417
  doc.setLineWidth(0.8);
51357
51418
  const separatorY = isAssemblyWorkspaceAndNotUptime ? 150 : 180;
51358
51419
  doc.line(20, separatorY, 190, separatorY);
51359
- doc.setFillColor(245, 245, 245);
51360
51420
  const dailySectionY = isAssemblyWorkspaceAndNotUptime ? 155 : 185;
51361
- doc.roundedRect(15, dailySectionY, 180, 85, 3, 3, "F");
51362
- doc.setFontSize(18);
51363
- doc.setFont("helvetica", "bold");
51364
- doc.setTextColor(40, 40, 40);
51365
- doc.text(isUptimeMode ? "Daily Utilization Summary" : "Daily Performance Summary", 20, dailySectionY + 10);
51366
- doc.setTextColor(0, 0, 0);
51367
- if (validDays.length > 0) {
51421
+ const renderDailyTablePage = (startIndex, sectionY, title) => {
51422
+ const rowHeight = 8;
51423
+ const tableHeaderY = sectionY + 15;
51424
+ const textY = tableHeaderY + 5;
51425
+ const firstRowY = textY + 10;
51426
+ const rowsPerPage = Math.max(1, Math.floor((maxContentY - firstRowY) / rowHeight));
51427
+ const pageEntries = dailyEntries.slice(startIndex, startIndex + rowsPerPage);
51428
+ const endY = firstRowY + pageEntries.length * rowHeight;
51429
+ const sectionHeight = Math.max(40, endY - sectionY + 5);
51430
+ doc.setFillColor(245, 245, 245);
51431
+ doc.roundedRect(15, sectionY, 180, sectionHeight, 3, 3, "F");
51432
+ doc.setFontSize(18);
51433
+ doc.setFont("helvetica", "bold");
51434
+ doc.setTextColor(40, 40, 40);
51435
+ doc.text(title, 20, sectionY + 10);
51436
+ doc.setTextColor(0, 0, 0);
51368
51437
  doc.setFontSize(10);
51369
51438
  doc.setFont("helvetica", "bold");
51370
51439
  doc.setFillColor(240, 240, 240);
51371
- const tableHeaderY = dailySectionY + 15;
51372
51440
  doc.roundedRect(20, tableHeaderY, 170, 7, 1, 1, "F");
51373
- const textY = tableHeaderY + 5;
51374
51441
  doc.text("Date", 25, textY);
51375
51442
  doc.text(isUptimeMode ? "Productive" : isAssemblyWorkspace ? "Actual Cycle Time" : "Actual", 60, textY);
51376
51443
  doc.text(isUptimeMode ? "Idle" : isAssemblyWorkspace ? "Standard Cycle Time" : "Standard", 95, textY);
@@ -51380,12 +51447,8 @@ var WorkspaceMonthlyPdfGenerator = ({
51380
51447
  doc.setDrawColor(220, 220, 220);
51381
51448
  doc.line(20, textY + 3, 190, textY + 3);
51382
51449
  doc.setFont("helvetica", "normal");
51383
- let yPos = textY + 10;
51384
- const recentDays = validDays.slice(-10).reverse();
51385
- recentDays.forEach((dayData, index) => {
51386
- if (yPos > 260) return;
51387
- const shift = getShiftData(dayData, selectedShiftId);
51388
- if (!hasShiftData(shift)) return;
51450
+ let yPos = firstRowY;
51451
+ pageEntries.forEach(({ dayData, shift }, index) => {
51389
51452
  if (index % 2 === 0) {
51390
51453
  doc.setFillColor(252, 252, 252);
51391
51454
  doc.roundedRect(20, yPos - 4, 170, 7, 1, 1, "F");
@@ -51418,11 +51481,35 @@ var WorkspaceMonthlyPdfGenerator = ({
51418
51481
  doc.text(`${shift.efficiency.toFixed(1)}%`, 135, yPos);
51419
51482
  drawStatusMark(doc, 171, yPos - 0.3, shift.efficiency >= effectiveLegend.green_min);
51420
51483
  }
51421
- yPos += 8;
51484
+ yPos += rowHeight;
51422
51485
  });
51423
51486
  doc.setLineWidth(0.2);
51424
51487
  doc.setDrawColor(220, 220, 220);
51425
51488
  doc.roundedRect(20, tableHeaderY, 170, yPos - tableHeaderY - 3, 1, 1, "S");
51489
+ return startIndex + pageEntries.length;
51490
+ };
51491
+ if (dailyEntries.length > 0) {
51492
+ let renderedEntries = renderDailyTablePage(0, dailySectionY, dailySectionTitle);
51493
+ while (renderedEntries < dailyEntries.length) {
51494
+ drawFooter();
51495
+ doc.addPage();
51496
+ drawPageChrome();
51497
+ doc.setFontSize(12);
51498
+ doc.setFont("helvetica", "bold");
51499
+ doc.setTextColor(40, 40, 40);
51500
+ doc.text(resolvedLineName, 20, 32);
51501
+ doc.setFont("helvetica", "normal");
51502
+ doc.text(getWorkspaceDisplayName(workspaceName), 20, 40);
51503
+ doc.setFontSize(10);
51504
+ doc.setTextColor(90, 90, 90);
51505
+ doc.text(`${monthName} \u2022 ${shiftType} \u2022 ${reportStartStr} - ${reportEndStr}`, 20, 48);
51506
+ doc.setTextColor(0, 0, 0);
51507
+ renderedEntries = renderDailyTablePage(
51508
+ renderedEntries,
51509
+ 56,
51510
+ `${dailySectionTitle} (cont.)`
51511
+ );
51512
+ }
51426
51513
  } else {
51427
51514
  doc.setFontSize(12);
51428
51515
  doc.setFont("helvetica", "normal");
@@ -51430,10 +51517,7 @@ var WorkspaceMonthlyPdfGenerator = ({
51430
51517
  doc.text("No daily data available for this month", 25, dailySectionY + 30);
51431
51518
  doc.setTextColor(0, 0, 0);
51432
51519
  }
51433
- doc.setFontSize(9);
51434
- doc.setTextColor(130, 130, 130);
51435
- const generatedText = `Generated on ${(/* @__PURE__ */ new Date()).toLocaleString("en-IN", { timeZone: "Asia/Kolkata" })}`;
51436
- doc.text(generatedText, 20, 280);
51520
+ drawFooter();
51437
51521
  const fileName = `${getWorkspaceDisplayName(workspaceName)}_${monthName.replace(" ", "_")}_${shiftType.replace(" ", "_")}.pdf`;
51438
51522
  doc.save(fileName);
51439
51523
  } catch (error) {
@@ -63582,7 +63666,9 @@ var KPIDetailView = ({
63582
63666
  month: currentMonth,
63583
63667
  year: currentYear,
63584
63668
  shiftId: selectedShiftId,
63585
- companyId: resolvedCompanyId
63669
+ companyId: resolvedCompanyId,
63670
+ startDate: isFullRange ? void 0 : rangeStart,
63671
+ endDate: isFullRange ? void 0 : rangeEnd
63586
63672
  });
63587
63673
  const configuredTimezone = timezone || dashboardConfig.dateTimeConfig?.defaultTimezone || "UTC";
63588
63674
  useMemo(() => getCurrentTimeInZone(configuredTimezone), [configuredTimezone]);
@@ -71065,7 +71151,9 @@ var WorkspaceDetailView = ({
71065
71151
  month: selectedMonth,
71066
71152
  year: selectedYear,
71067
71153
  shiftId: selectedShift,
71068
- companyId: dashboardConfig?.entityConfig?.companyId
71154
+ companyId: dashboardConfig?.entityConfig?.companyId,
71155
+ startDate: isFullRange ? void 0 : rangeStart,
71156
+ endDate: isFullRange ? void 0 : rangeEnd
71069
71157
  });
71070
71158
  const {
71071
71159
  isFastSlowClipFiltersEnabled,
@@ -71332,6 +71420,7 @@ var WorkspaceDetailView = ({
71332
71420
  line_name: "",
71333
71421
  line_assembly_enabled: cachedOverviewMetrics.assembly_enabled === true,
71334
71422
  workspace_name: cachedOverviewMetrics.workspace_name,
71423
+ workspace_display_name: cachedOverviewMetrics.displayName ?? null,
71335
71424
  workspace_id: cachedOverviewMetrics.workspace_uuid || "",
71336
71425
  company_id: cachedOverviewMetrics.company_id,
71337
71426
  company_name: "",
@@ -71646,7 +71735,17 @@ var WorkspaceDetailView = ({
71646
71735
  const analysisMonthlyData = useMemo(() => {
71647
71736
  return filterDataByDateKeyRange(monthlyData, range);
71648
71737
  }, [monthlyData, range]);
71649
- const formattedWorkspaceName = displayName || formatWorkspaceName3(workspace?.workspace_name || "", resolvedLineId);
71738
+ const formattedWorkspaceName = displayName || workspace?.workspace_display_name || formatWorkspaceName3(workspace?.workspace_name || "", resolvedLineId);
71739
+ const resolvedLineName = useMemo(() => {
71740
+ const workspaceLineName = workspace?.line_name?.trim();
71741
+ if (workspaceLineName) {
71742
+ return workspaceLineName;
71743
+ }
71744
+ if (resolvedLineId && dashboardConfig?.entityConfig) {
71745
+ return getLineDisplayName(dashboardConfig.entityConfig, resolvedLineId);
71746
+ }
71747
+ return "Line";
71748
+ }, [dashboardConfig?.entityConfig, resolvedLineId, workspace?.line_name]);
71650
71749
  const workspaceCycleTimeEligibility = workspace ? {
71651
71750
  line_assembly_enabled: workspace.line_assembly_enabled,
71652
71751
  action_family: workspace.action_family,
@@ -72191,6 +72290,7 @@ var WorkspaceDetailView = ({
72191
72290
  {
72192
72291
  workspaceId,
72193
72292
  workspaceName: formattedWorkspaceName,
72293
+ lineName: resolvedLineName,
72194
72294
  monthlyData,
72195
72295
  analysisData: analysisMonthlyData,
72196
72296
  selectedMonth,
@@ -78880,6 +78980,12 @@ var buildDeltaBadge = (delta, options) => {
78880
78980
  text: `${options.formatter(delta)} vs ${options.comparisonLabel}`
78881
78981
  };
78882
78982
  };
78983
+ var parseSpecificShiftId = (shiftMode) => {
78984
+ const rawMode = String(shiftMode || "").trim().toLowerCase();
78985
+ if (!rawMode.startsWith("shift:")) return null;
78986
+ const parsed = Number(rawMode.split(":", 2)[1]);
78987
+ return Number.isFinite(parsed) ? parsed : null;
78988
+ };
78883
78989
  var normalizeShiftLabel = (shiftName, shiftMode) => {
78884
78990
  if (shiftMode === "all") {
78885
78991
  return "All Shifts";
@@ -78891,6 +78997,10 @@ var normalizeShiftLabel = (shiftName, shiftMode) => {
78891
78997
  if (normalizedName === "night") return "Night Shift";
78892
78998
  return /shift/i.test(trimmedName) ? trimmedName : `${trimmedName} Shift`;
78893
78999
  }
79000
+ const specificShiftId = parseSpecificShiftId(shiftMode);
79001
+ if (specificShiftId !== null) {
79002
+ return `Shift ${specificShiftId}`;
79003
+ }
78894
79004
  if (shiftMode === "night") return "Night Shift";
78895
79005
  return "Day Shift";
78896
79006
  };
@@ -78963,6 +79073,7 @@ var OperationsOverviewHeader = React143__default.memo(({
78963
79073
  dateRange,
78964
79074
  displayDateRange,
78965
79075
  trendMode,
79076
+ shiftFilterOptions,
78966
79077
  isLiveScope,
78967
79078
  liveShiftName,
78968
79079
  lineOptions,
@@ -79216,7 +79327,7 @@ var OperationsOverviewHeader = React143__default.memo(({
79216
79327
  /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
79217
79328
  /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
79218
79329
  /* @__PURE__ */ jsx("label", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide ml-1", children: "Shift" }),
79219
- /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs(
79330
+ /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
79220
79331
  "select",
79221
79332
  {
79222
79333
  value: trendMode,
@@ -79228,11 +79339,7 @@ var OperationsOverviewHeader = React143__default.memo(({
79228
79339
  backgroundRepeat: "no-repeat",
79229
79340
  backgroundSize: "1.2em 1.2em"
79230
79341
  },
79231
- children: [
79232
- /* @__PURE__ */ jsx("option", { value: "all", children: "All Shifts" }),
79233
- /* @__PURE__ */ jsx("option", { value: "day", children: "Day Shift" }),
79234
- /* @__PURE__ */ jsx("option", { value: "night", children: "Night Shift" })
79235
- ]
79342
+ children: shiftFilterOptions.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label }, option.value))
79236
79343
  }
79237
79344
  ) })
79238
79345
  ] }),
@@ -80302,6 +80409,24 @@ var normalizeShiftId = (value) => {
80302
80409
  }
80303
80410
  return null;
80304
80411
  };
80412
+ var buildSpecificShiftMode = (value) => {
80413
+ const normalizedShiftId = normalizeShiftId(value);
80414
+ return normalizedShiftId === null ? null : `shift:${normalizedShiftId}`;
80415
+ };
80416
+ var parseSpecificShiftMode = (value) => {
80417
+ const rawValue = String(value || "").trim().toLowerCase();
80418
+ if (!rawValue.startsWith("shift:")) return null;
80419
+ const parsed = Number(rawValue.split(":", 2)[1]);
80420
+ return Number.isFinite(parsed) ? parsed : null;
80421
+ };
80422
+ var formatShiftOptionLabel = (shiftName, shiftId) => {
80423
+ const trimmedName = shiftName?.trim();
80424
+ if (trimmedName) {
80425
+ return /shift/i.test(trimmedName) ? trimmedName : `${trimmedName} Shift`;
80426
+ }
80427
+ const normalizedShiftId = normalizeShiftId(shiftId);
80428
+ return normalizedShiftId === null ? "Unknown Shift" : `Shift ${normalizedShiftId}`;
80429
+ };
80305
80430
  var classifyShiftBucket = ({
80306
80431
  shiftName,
80307
80432
  shiftId,
@@ -80388,6 +80513,26 @@ var normalizeShiftWindowMinutes = (startTime, endTime) => {
80388
80513
  }
80389
80514
  return { startMinutes, endMinutes };
80390
80515
  };
80516
+ var getOperationalSortStartMinutes = (startTime, endTime) => {
80517
+ const normalizedWindow = normalizeShiftWindowMinutes(startTime, endTime);
80518
+ if (!normalizedWindow) return null;
80519
+ return normalizedWindow.startMinutes < 6 * 60 ? normalizedWindow.startMinutes + 24 * 60 : normalizedWindow.startMinutes;
80520
+ };
80521
+ var doesShiftMatchTrendMode = ({
80522
+ trendMode,
80523
+ shiftName,
80524
+ shiftId,
80525
+ startTime,
80526
+ endTime
80527
+ }) => {
80528
+ if (trendMode === "all") return true;
80529
+ const specificShiftId = parseSpecificShiftMode(trendMode);
80530
+ if (specificShiftId !== null) {
80531
+ return normalizeShiftId(shiftId) === specificShiftId;
80532
+ }
80533
+ const bucket = classifyShiftBucket({ shiftName, shiftId, startTime, endTime });
80534
+ return bucket === trendMode;
80535
+ };
80391
80536
  var PlantHeadView = () => {
80392
80537
  const supabase = useSupabase();
80393
80538
  const entityConfig = useEntityConfig();
@@ -80518,6 +80663,45 @@ var PlantHeadView = () => {
80518
80663
  shiftConfigMap,
80519
80664
  isLoading: isShiftConfigLoading
80520
80665
  } = useMultiLineShiftConfigs(scopedLineIds, staticShiftConfig);
80666
+ const shiftFilterOptions = React143__default.useMemo(() => {
80667
+ const optionsById = /* @__PURE__ */ new Map();
80668
+ scopedLineIds.forEach((lineId) => {
80669
+ const shiftConfig = shiftConfigMap.get(lineId) || staticShiftConfig;
80670
+ getShiftWindowsForConfig(shiftConfig).forEach((shift) => {
80671
+ const shiftId = normalizeShiftId(shift.shiftId);
80672
+ if (shiftId === null) return;
80673
+ const sortKey = getOperationalSortStartMinutes(shift.startTime, shift.endTime) ?? 24 * 60 + shiftId;
80674
+ const existing = optionsById.get(shiftId);
80675
+ const label = formatShiftOptionLabel(shift.shiftName, shiftId);
80676
+ if (!existing) {
80677
+ optionsById.set(shiftId, {
80678
+ value: buildSpecificShiftMode(shiftId),
80679
+ label,
80680
+ shiftId,
80681
+ shiftName: shift.shiftName || null,
80682
+ startTime: shift.startTime || null,
80683
+ endTime: shift.endTime || null,
80684
+ sortKey
80685
+ });
80686
+ return;
80687
+ }
80688
+ if ((!existing.shiftName || existing.shiftName === `Shift ${shiftId}`) && shift.shiftName) {
80689
+ existing.shiftName = shift.shiftName;
80690
+ existing.label = label;
80691
+ }
80692
+ if (sortKey < existing.sortKey) {
80693
+ existing.sortKey = sortKey;
80694
+ existing.startTime = shift.startTime || null;
80695
+ existing.endTime = shift.endTime || null;
80696
+ }
80697
+ });
80698
+ });
80699
+ const dynamicOptions = Array.from(optionsById.values()).sort((a, b) => a.sortKey - b.sortKey || (a.shiftId || 0) - (b.shiftId || 0)).map(({ sortKey, ...option }) => option);
80700
+ return [
80701
+ { value: "all", label: "All Shifts" },
80702
+ ...dynamicOptions
80703
+ ];
80704
+ }, [appTimezone, scopedLineIds, shiftConfigMap, staticShiftConfig]);
80521
80705
  React143__default.useEffect(() => {
80522
80706
  if (scopedLineIds.length === 0 || isShiftConfigLoading) {
80523
80707
  return;
@@ -80580,18 +80764,20 @@ var PlantHeadView = () => {
80580
80764
  if (!activeShift) {
80581
80765
  return [];
80582
80766
  }
80583
- const trendBucket = classifyShiftBucket({
80767
+ const bucketTrendMode = classifyShiftBucket({
80584
80768
  shiftName: activeShift.shiftName,
80585
80769
  shiftId: activeShift.shiftId,
80586
80770
  startTime: activeShift.startTime,
80587
80771
  endTime: activeShift.endTime
80588
80772
  });
80589
- if (!trendBucket || trendBucket === "all") {
80773
+ const exactTrendMode = buildSpecificShiftMode(activeShift.shiftId);
80774
+ if (!bucketTrendMode && !exactTrendMode) {
80590
80775
  return [];
80591
80776
  }
80592
80777
  return [{
80593
80778
  lineId,
80594
- trendMode: trendBucket,
80779
+ exactTrendMode,
80780
+ bucketTrendMode,
80595
80781
  shiftId: activeShift.shiftId,
80596
80782
  shiftName: activeShift.shiftName || null,
80597
80783
  startTime: activeShift.startTime || null,
@@ -80600,14 +80786,12 @@ var PlantHeadView = () => {
80600
80786
  }];
80601
80787
  });
80602
80788
  }, [appTimezone, scopedLineIds, shiftConfigMap, shiftResolutionNow, staticShiftConfig]);
80603
- const hasActiveDayShiftLine = React143__default.useMemo(
80604
- () => activeLineShiftStates.some((shift) => shift.trendMode === "day" && shift.date === resolvedOperationalToday),
80605
- [activeLineShiftStates, resolvedOperationalToday]
80606
- );
80607
- const hasActiveNightShiftLine = React143__default.useMemo(
80608
- () => activeLineShiftStates.some((shift) => shift.trendMode === "night" && shift.date === resolvedOperationalToday),
80609
- [activeLineShiftStates, resolvedOperationalToday]
80610
- );
80789
+ const uniformActiveTrendMode = React143__default.useMemo(() => {
80790
+ const activeModes = Array.from(new Set(
80791
+ activeLineShiftStates.filter((shift) => shift.date === resolvedOperationalToday).map((shift) => shift.exactTrendMode).filter((mode) => !!mode)
80792
+ ));
80793
+ return activeModes.length === 1 ? activeModes[0] : null;
80794
+ }, [activeLineShiftStates, resolvedOperationalToday]);
80611
80795
  const resolvedTrendMode = isInitialScopeReady ? trendMode : "all";
80612
80796
  const hourlyWindowStartTime = React143__default.useMemo(() => {
80613
80797
  if (scopedLineIds.length === 0) {
@@ -80618,13 +80802,19 @@ var PlantHeadView = () => {
80618
80802
  scopedLineIds.forEach((lineId) => {
80619
80803
  const shiftConfig = shiftConfigMap.get(lineId) || staticShiftConfig;
80620
80804
  getShiftWindowsForConfig(shiftConfig).forEach((shift) => {
80621
- const bucket = classifyShiftBucket({
80805
+ classifyShiftBucket({
80622
80806
  shiftName: shift.shiftName,
80623
80807
  shiftId: shift.shiftId,
80624
80808
  startTime: shift.startTime,
80625
80809
  endTime: shift.endTime
80626
80810
  });
80627
- if (resolvedTrendMode !== "all" && bucket !== resolvedTrendMode) {
80811
+ if (!doesShiftMatchTrendMode({
80812
+ trendMode: resolvedTrendMode,
80813
+ shiftName: shift.shiftName,
80814
+ shiftId: shift.shiftId,
80815
+ startTime: shift.startTime,
80816
+ endTime: shift.endTime
80817
+ })) {
80628
80818
  return;
80629
80819
  }
80630
80820
  const normalizedWindow = normalizeShiftWindowMinutes(shift.startTime, shift.endTime);
@@ -80698,11 +80888,11 @@ var PlantHeadView = () => {
80698
80888
  endKey: nextStartKey
80699
80889
  };
80700
80890
  });
80701
- setTrendMode("all");
80891
+ setTrendMode(uniformActiveTrendMode || "all");
80702
80892
  setUsesThisWeekComparison(false);
80703
80893
  hasAutoInitializedScopeRef.current = true;
80704
80894
  setIsInitialScopeReady(true);
80705
- }, [fallbackOperationalDate, isShiftScopeResolved, resolvedOperationalToday, scopedLineIds.length]);
80895
+ }, [fallbackOperationalDate, isShiftScopeResolved, resolvedOperationalToday, scopedLineIds.length, uniformActiveTrendMode]);
80706
80896
  const handleDateRangeChange = React143__default.useCallback((range, meta) => {
80707
80897
  hasUserAdjustedScopeRef.current = true;
80708
80898
  setIsInitialScopeReady(true);
@@ -80789,6 +80979,33 @@ var PlantHeadView = () => {
80789
80979
  () => resolvedTrendMode,
80790
80980
  [resolvedTrendMode]
80791
80981
  );
80982
+ const hasActiveSelectedShiftLine = React143__default.useMemo(
80983
+ () => activeLineShiftStates.some((shift) => {
80984
+ if (shift.date !== resolvedOperationalToday) return false;
80985
+ if (effectiveTrendMode === "all") return true;
80986
+ const specificShiftId = parseSpecificShiftMode(effectiveTrendMode);
80987
+ if (specificShiftId !== null) {
80988
+ return shift.exactTrendMode === effectiveTrendMode;
80989
+ }
80990
+ return shift.bucketTrendMode === effectiveTrendMode;
80991
+ }),
80992
+ [activeLineShiftStates, effectiveTrendMode, resolvedOperationalToday]
80993
+ );
80994
+ const activeLiveShiftName = React143__default.useMemo(
80995
+ () => {
80996
+ if (effectiveTrendMode === "all") return null;
80997
+ const matchingShift = activeLineShiftStates.find((shift) => {
80998
+ if (shift.date !== resolvedOperationalToday) return false;
80999
+ const specificShiftId = parseSpecificShiftMode(effectiveTrendMode);
81000
+ if (specificShiftId !== null) {
81001
+ return shift.exactTrendMode === effectiveTrendMode;
81002
+ }
81003
+ return shift.bucketTrendMode === effectiveTrendMode;
81004
+ });
81005
+ return matchingShift?.shiftName || null;
81006
+ },
81007
+ [activeLineShiftStates, effectiveTrendMode, resolvedOperationalToday]
81008
+ );
80792
81009
  const hourlyLabelStartTime = React143__default.useMemo(() => {
80793
81010
  if (scopedLineIds.length === 0) {
80794
81011
  return null;
@@ -80800,12 +81017,11 @@ var PlantHeadView = () => {
80800
81017
  [effectiveDateRange.endKey, effectiveDateRange.startKey]
80801
81018
  );
80802
81019
  const isLiveScope = React143__default.useMemo(
80803
- () => isSingleDayScope && effectiveDateRange.startKey === resolvedOperationalToday && (effectiveTrendMode === "all" || effectiveTrendMode === "day" && hasActiveDayShiftLine || effectiveTrendMode === "night" && hasActiveNightShiftLine),
81020
+ () => isSingleDayScope && effectiveDateRange.startKey === resolvedOperationalToday && hasActiveSelectedShiftLine,
80804
81021
  [
80805
81022
  effectiveDateRange.startKey,
80806
81023
  effectiveTrendMode,
80807
- hasActiveDayShiftLine,
80808
- hasActiveNightShiftLine,
81024
+ hasActiveSelectedShiftLine,
80809
81025
  isSingleDayScope,
80810
81026
  resolvedOperationalToday
80811
81027
  ]
@@ -80842,8 +81058,9 @@ var PlantHeadView = () => {
80842
81058
  dateRange,
80843
81059
  displayDateRange: headerDateRange,
80844
81060
  trendMode,
81061
+ shiftFilterOptions,
80845
81062
  isLiveScope,
80846
- liveShiftName: isLiveScope && trendMode !== "all" ? trendMode : null,
81063
+ liveShiftName: isLiveScope && trendMode !== "all" ? activeLiveShiftName : null,
80847
81064
  lineOptions,
80848
81065
  supervisorOptions,
80849
81066
  selectedSupervisorId,
@@ -81378,4 +81595,4 @@ var streamProxyConfig = {
81378
81595
  }
81379
81596
  };
81380
81597
 
81381
- export { ACTION_FAMILIES, ACTION_NAMES, AIAgentView_default as AIAgentView, AcceptInvite, AcceptInviteView_default as AcceptInviteView, AdvancedFilterDialog, AdvancedFilterPanel, AudioService, AuthCallback, AuthCallbackView_default as AuthCallbackView, AuthProvider, AuthService, AuthenticatedBottleneckClipsView, AuthenticatedFactoryView, AuthenticatedHelpView, AuthenticatedHomeView, AuthenticatedShiftsView, AuthenticatedTargetsView, AuthenticatedTicketsView, AuthenticatedWorkspaceHealthView, AvatarUpload, AxelNotificationPopup, AxelOrb, BackButton, BackButtonMinimal, BarChart, BaseHistoryCalendar, BottleneckClipsModal, BottleneckClipsView_default as BottleneckClipsView, BottlenecksContent, BreakNotificationPopup, CachePrefetchStatus, Card2 as Card, CardContent2 as CardContent, CardDescription2 as CardDescription, CardFooter2 as CardFooter, CardHeader2 as CardHeader, CardTitle2 as CardTitle, ChangeRoleDialog, ClipFilterProvider, ClipsCostView_default as ClipsCostView, CompactWorkspaceHealthCard, ConfirmRemoveUserDialog, CongratulationsOverlay, CroppedHlsVideoPlayer, CroppedVideoPlayer, CycleTimeChart, CycleTimeOverTimeChart, DEFAULT_ANALYTICS_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_CONFIG, DEFAULT_DATABASE_CONFIG, DEFAULT_DATE_TIME_CONFIG, DEFAULT_ENDPOINTS_CONFIG, DEFAULT_ENTITY_CONFIG, DEFAULT_HOME_VIEW_CONFIG, DEFAULT_MAP_VIEW_CONFIG, DEFAULT_SHIFT_CONFIG, DEFAULT_SHIFT_DATA, DEFAULT_THEME_CONFIG, DEFAULT_VIDEO_CONFIG, DEFAULT_WORKSPACE_CONFIG, DEFAULT_WORKSPACE_POSITIONS, DashboardHeader, DashboardLayout, DashboardOverridesProvider, DashboardProvider, DateDisplay_default as DateDisplay, DateTimeDisplay, DebugAuth, DebugAuthView_default as DebugAuthView, DetailedHealthStatus, DiagnosisVideoModal, EFFICIENCY_ON_TRACK_THRESHOLD, EmptyStateMessage, EncouragementOverlay, FactoryAssignmentDropdown, FactoryView_default as FactoryView, FileManagerFilters, FilterDialogTrigger, FirstTimeLoginDebug, FirstTimeLoginHandler, FittingTitle, GaugeChart, GridComponentsPlaceholder, HamburgerButton, Header, HealthDateShiftSelector, HealthStatusGrid, HealthStatusIndicator, HelpView_default as HelpView, HlsVideoPlayer, HomeView_default as HomeView, HourlyOutputChart2 as HourlyOutputChart, HourlyUptimeChart, ISTTimer_default as ISTTimer, IdleTimeVlmConfigProvider, ImprovementCenterView_default as ImprovementCenterView, InlineEditableText, InteractiveOnboardingTour, InvitationService, InvitationsTable, InviteUserDialog, KPICard, KPIDetailView_default as KPIDetailView, KPIGrid, KPIHeader, KPISection, KPIsOverviewView_default as KPIsOverviewView, LINE_1_UUID, LINE_2_UUID, LargeOutputProgressChart, LeaderboardDetailView_default as LeaderboardDetailView, Legend5 as Legend, LineAssignmentDropdown, LineChart, LineHistoryCalendar, LineMonthlyHistory, LineMonthlyPdfGenerator, LinePdfExportButton, LinePdfGenerator, LineWhatsAppShareButton, LinesService, LiveTimer, LoadingInline, LoadingOverlay_default as LoadingOverlay, LoadingPage_default as LoadingPage, LoadingSkeleton, LoadingState, LoginPage, LoginView_default as LoginView, Logo, MainLayout, MapGridView, MetricCard_default as MetricCard, MinimalOnboardingPopup, MobileMenuProvider, NewClipsNotification, NoWorkspaceData, OnboardingDemo, OnboardingTour, OptifyeAgentClient, OptifyeLogoLoader_default as OptifyeLogoLoader, OutputProgressChart, PageHeader, PieChart4 as PieChart, PlantHeadView_default as PlantHeadView, PlayPauseIndicator, PrefetchConfigurationError, PrefetchError, PrefetchEvents, PrefetchStatus, PrefetchTimeoutError, ProfileView_default as ProfileView, ROOT_DASHBOARD_EVENT_NAMES, RegistryProvider, RoleBadge, S3ClipsSupabaseService as S3ClipsService, S3Service, SKUManagementView, SOPComplianceChart, SSEChatClient, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SessionTracker, SessionTrackingContext, SessionTrackingProvider, SettingsPopup, ShiftDisplay_default as ShiftDisplay, ShiftsView_default as ShiftsView, SideNavBar, SignupWithInvitation, SilentErrorBoundary, SimpleOnboardingPopup, SingleVideoStream_default as SingleVideoStream, Skeleton, SubscriptionManager, SubscriptionManagerProvider, SupabaseProvider, SupervisorDropdown_default as SupervisorDropdown, SupervisorManagementView_default as SupervisorManagementView, SupervisorService, TargetWorkspaceGrid, TargetsView_default as TargetsView, TeamManagementView_default as TeamManagementView, ThreadSidebar, TicketHistory_default as TicketHistory, TicketHistoryService, TicketsView_default as TicketsView, TimeDisplay_default as TimeDisplay, TimePickerDropdown, Timer_default as Timer, TimezoneProvider, TimezoneService, UptimeDonutChart, UptimeLineChart, UptimeMetricCards, UserAvatar, UserManagementService, UserManagementTable, UserService, UserUsageDetailModal, UserUsageStats, VideoCard, VideoGridView, VideoPlayer, VideoPreloader, WORKSPACE_POSITIONS, WhatsAppShareButton, WorkspaceCard, WorkspaceCycleTimeMetricCards, WorkspaceDetailView_default as WorkspaceDetailView, WorkspaceDisplayNameExample, WorkspaceGrid, WorkspaceGridItem, WorkspaceHealthCard, WorkspaceHealthView_default as WorkspaceHealthView, WorkspaceHistoryCalendar, WorkspaceMetricCards, WorkspaceMetricCardsImpl, WorkspaceMonthlyDataFetcher, WorkspaceMonthlyHistory, WorkspaceMonthlyPdfGenerator, WorkspacePdfExportButton, WorkspacePdfGenerator, WorkspaceWhatsAppShareButton, actionService, aggregateKPIsFromLineMetricsRows, alertsService, apiUtils, areAllLinesOnSameShift, authCoreService, authOTPService, authRateLimitService, awardsService, buildDateKey, buildKPIsFromLineMetricsRow, buildShiftGroupsKey, canRoleAccessDashboardPath, canRoleAccessTeamManagement, canRoleAssignFactories, canRoleAssignLines, canRoleChangeRole, canRoleInviteRole, canRoleManageCompany, canRoleManageTargets, canRoleManageUsers, canRoleRemoveUser, canRoleViewClipsCost, canRoleViewUsageStats, captureHandledFrontendException, captureSentryException, captureSentryMessage, checkRateLimit2 as checkRateLimit, clearAllRateLimits2 as clearAllRateLimits, clearRateLimit2 as clearRateLimit, clearS3VideoCache, clearS3VideoFromCache, clearSentryContext, clearWorkspaceDisplayNamesCache, cn, createDefaultKPIs, createInvitationService, createLinesService, createSessionTracker, createStorageService, createStreamProxyHandler, createSupabaseClient, createSupervisorService, createThrottledReload, createUserManagementService, createUserService, dashboardService, deleteThread, fetchIdleTimeReasons, filterDataByDateKeyRange, forceRefreshWorkspaceDisplayNames, formatAwardMonth, formatDateInZone, formatDateKeyForDisplay, formatDateTimeInZone, formatDuration2 as formatDuration, formatISTDate, formatIdleTime, formatRangeLabel, formatReasonLabel, formatRelativeTime, formatTimeInZone, fromUrlFriendlyName, getActionDisplayName, getActiveShift, getAllLineDisplayNames, getAllThreadMessages, getAllWorkspaceDisplayNamesAsync, getAllWorkspaceDisplayNamesSnapshot, getAnonClient, getAssignableRoles, getAssignmentColumnLabel, getAvailableShiftIds, getAwardBadgeType, getAwardDescription, getAwardTitle, getBrowserName, getCameraNumber, getCompanyMetricsTableName, getConfigurableShortWorkspaceDisplayName, getConfigurableWorkspaceDisplayName, getConfiguredLineIds, getCoreSessionRecordingProperties, getCoreSessionReplayUrl, getCurrentShift, getCurrentShiftForLine, getCurrentTimeInZone, getCurrentWeekFullRange, getCurrentWeekToDateRange, getDashboardHeaderTimeInZone, getDateKeyFromDate, getDaysDifferenceInZone, getDefaultCameraStreamUrl, getDefaultLineId, getDefaultTabForWorkspace, getInitials, getLineDisplayName, getManufacturingInsights, getMetricsTablePrefix, getMonthKeyBounds, getMonthWeekRanges, getNextUpdateInterval, getOperationalDate, getRoleAssignmentKind, getRoleDescription, getRoleLabel, getRoleMetadata, getRoleNavPaths, getS3SignedUrl, getS3VideoSrc, getShiftData, getShiftNameById, getShiftWorkDurationSeconds, getShortShiftName, getShortWorkspaceDisplayName, getShortWorkspaceDisplayNameAsync, getStoredWorkspaceMappings, getSubscriptionManager, getThreadMessages, getUniformShiftGroup, getUserThreads, getUserThreadsPaginated, getVisibleRolesForCurrentUser, getWorkspaceDisplayName, getWorkspaceDisplayNameAsync, getWorkspaceDisplayNamesMap, getWorkspaceFromUrl, getWorkspaceNavigationParams, groupLinesByShift, hasAnyShiftData, identifyCoreUser, initializeCoreMixpanel, isEfficiencyOnTrack, isFactoryScopedRole, isFullMonthRange, isIgnorableFrontendError, isLegacyConfiguration, isLoopbackHostname, isPrefetchError, isRecentFlowVideoGridMetricMode, isSafari, isSupervisorRole, isTransitionPeriod, isUrlPermanentlyFailed, isValidFactoryViewConfiguration, isValidLineInfoPayload, isValidPrefetchParams, isValidPrefetchStatus, isValidWorkspaceDetailedMetricsPayload, isValidWorkspaceMetricsPayload, isWipGatedVideoGridMetricMode, isWorkspaceDisplayNamesLoaded, isWorkspaceDisplayNamesLoading, lineLeaderboardService, linesService, mergeWithDefaultConfig, migrateLegacyConfiguration, normalizeActionFamily, normalizeDateKeyRange, normalizeRoleLevel, normalizeVideoGridMetricMode, optifyeAgentClient, parseDateKeyToDate, parseS3Uri, preInitializeWorkspaceDisplayNames, preloadS3Video, preloadS3VideoUrl, preloadS3VideosUrl, preloadVideoUrl, preloadVideosUrl, qualityService, realtimeService, refreshWorkspaceDisplayNames, resetCoreMixpanel, resetFailedUrl, resetSubscriptionManager, s3VideoPreloader, setSentryUserContext, setSentryWorkspaceContext, shouldEnableLocalDevTestLogin, shuffleArray, simulateApiDelay, skuService, startCoreSessionRecording, stopCoreSessionRecording, storeWorkspaceMapping, streamProxyConfig, subscribeWorkspaceDisplayNames, throttledReloadDashboard, toUrlFriendlyName, trackCoreEvent, trackCorePageView, transformToChartData, updateThreadTitle, upsertWorkspaceDisplayNameInCache, useAccessControl, useActiveBreaks, useActiveLineId, useAllWorkspaceMetrics, useAnalyticsConfig, useAppTimezone, useAudioService, useAuth, useAuthConfig, useAxelNotifications, useCanSaveTargets, useClipFilter, useClipTypes, useClipTypesWithCounts, useClipsInit, useCompanyClipsCost, useCompanyFastSlowClipFiltersEnabled, useCompanyHasVlmEnabledLine, useCompanyUsersUsage, useComponentOverride, useCustomConfig, useDashboardConfig, useDashboardMetrics, useDatabaseConfig, useDateFormatter, useDateTimeConfig, useDynamicShiftConfig, useEndpointsConfig, useEntityConfig, useFactoryOverviewMetrics, useFeatureFlags, useFormatNumber, useHasLineAccess, useHideMobileHeader, useHistoricWorkspaceMetrics, useHlsStream, useHlsStreamWithCropping, useHookOverride, useHourEndTimer, useHourlyTargetAchievements, useHourlyTargetMisses, useIdleTimeClipClassifications, useIdleTimeReasons, useIdleTimeVlmConfig, useKpiTrends, useLeaderboardMetrics, useLineDetailedMetrics, useLineKPIs, useLineMetrics, useLineShiftConfig, useLineSupervisor, useLineWorkspaceMetrics, useLines, useMessages, useMetrics, useMobileMenu, useMonthlyTrend, useMultiLineShiftConfigs, useNavigation, useOperationalShiftKey, useOptionalSupabase, useOverrides, usePageOverride, usePrefetchClipCounts, useRealtimeLineMetrics, useRegistry, useSKUs, useSessionKeepAlive, useSessionTracking, useSessionTrackingContext, useShiftConfig, useShiftGroups, useShifts, useSubscriptionManager, useSubscriptionManagerSafe, useSupabase, useSupabaseClient, useSupervisorsByLineIds, useTargets, useTeamManagementPermissions, useTheme, useThemeConfig, useThreads, useTicketHistory, useTimezoneContext, useUserLineAccess, useUserUsage, useVideoConfig, useWorkspaceConfig, useWorkspaceDetailedMetrics, useWorkspaceDisplayName, useWorkspaceDisplayNames, useWorkspaceDisplayNamesMap, useWorkspaceHealthById, useWorkspaceHealthLastSeen, useWorkspaceHealthStatus, useWorkspaceMetrics, useWorkspaceNavigation, useWorkspaceOperators, useWorkspaceUptimeTimeline, useWorkspaceVideoStreams, userService, videoPrefetchManager, videoPreloader, weeklyTopPerformerService, whatsappService, withAccessControl, withAuth, withRegistry, withTimezone, workspaceHealthService, workspaceService };
81598
+ export { ACTION_FAMILIES, ACTION_NAMES, AIAgentView_default as AIAgentView, AcceptInvite, AcceptInviteView_default as AcceptInviteView, AdvancedFilterDialog, AdvancedFilterPanel, AudioService, AuthCallback, AuthCallbackView_default as AuthCallbackView, AuthProvider, AuthService, AuthenticatedBottleneckClipsView, AuthenticatedFactoryView, AuthenticatedHelpView, AuthenticatedHomeView, AuthenticatedShiftsView, AuthenticatedTargetsView, AuthenticatedTicketsView, AuthenticatedWorkspaceHealthView, AvatarUpload, AxelNotificationPopup, AxelOrb, BackButton, BackButtonMinimal, BarChart, BaseHistoryCalendar, BottleneckClipsModal, BottleneckClipsView_default as BottleneckClipsView, BottlenecksContent, BreakNotificationPopup, CachePrefetchStatus, Card2 as Card, CardContent2 as CardContent, CardDescription2 as CardDescription, CardFooter2 as CardFooter, CardHeader2 as CardHeader, CardTitle2 as CardTitle, ChangeRoleDialog, ClipFilterProvider, ClipsCostView_default as ClipsCostView, CompactWorkspaceHealthCard, ConfirmRemoveUserDialog, CongratulationsOverlay, CroppedHlsVideoPlayer, CroppedVideoPlayer, CycleTimeChart, CycleTimeOverTimeChart, DEFAULT_ANALYTICS_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_CONFIG, DEFAULT_DATABASE_CONFIG, DEFAULT_DATE_TIME_CONFIG, DEFAULT_ENDPOINTS_CONFIG, DEFAULT_ENTITY_CONFIG, DEFAULT_HOME_VIEW_CONFIG, DEFAULT_MAP_VIEW_CONFIG, DEFAULT_SHIFT_CONFIG, DEFAULT_SHIFT_DATA, DEFAULT_THEME_CONFIG, DEFAULT_VIDEO_CONFIG, DEFAULT_WORKSPACE_CONFIG, DEFAULT_WORKSPACE_POSITIONS, DashboardHeader, DashboardLayout, DashboardOverridesProvider, DashboardProvider, DateDisplay_default as DateDisplay, DateTimeDisplay, DebugAuth, DebugAuthView_default as DebugAuthView, DetailedHealthStatus, DiagnosisVideoModal, EFFICIENCY_ON_TRACK_THRESHOLD, EmptyStateMessage, EncouragementOverlay, FactoryAssignmentDropdown, FactoryView_default as FactoryView, FileManagerFilters, FilterDialogTrigger, FirstTimeLoginDebug, FirstTimeLoginHandler, FittingTitle, GaugeChart, GridComponentsPlaceholder, HamburgerButton, Header, HealthDateShiftSelector, HealthStatusGrid, HealthStatusIndicator, HelpView_default as HelpView, HlsVideoPlayer, HomeView_default as HomeView, HourlyOutputChart2 as HourlyOutputChart, HourlyUptimeChart, ISTTimer_default as ISTTimer, IdleTimeVlmConfigProvider, ImprovementCenterView_default as ImprovementCenterView, InlineEditableText, InteractiveOnboardingTour, InvitationService, InvitationsTable, InviteUserDialog, KPICard, KPIDetailView_default as KPIDetailView, KPIGrid, KPIHeader, KPISection, KPIsOverviewView_default as KPIsOverviewView, LINE_1_UUID, LINE_2_UUID, LargeOutputProgressChart, LeaderboardDetailView_default as LeaderboardDetailView, Legend5 as Legend, LineAssignmentDropdown, LineChart, LineHistoryCalendar, LineMonthlyHistory, LineMonthlyPdfGenerator, LinePdfExportButton, LinePdfGenerator, LineWhatsAppShareButton, LinesService, LiveTimer, LoadingInline, LoadingOverlay_default as LoadingOverlay, LoadingPage_default as LoadingPage, LoadingSkeleton, LoadingState, LoginPage, LoginView_default as LoginView, Logo, MainLayout, MapGridView, MetricCard_default as MetricCard, MinimalOnboardingPopup, MobileMenuProvider, NewClipsNotification, NoWorkspaceData, OnboardingDemo, OnboardingTour, OptifyeAgentClient, OptifyeLogoLoader_default as OptifyeLogoLoader, OutputProgressChart, PageHeader, PieChart4 as PieChart, PlantHeadView_default as PlantHeadView, PlayPauseIndicator, PrefetchConfigurationError, PrefetchError, PrefetchEvents, PrefetchStatus, PrefetchTimeoutError, ProfileView_default as ProfileView, ROOT_DASHBOARD_EVENT_NAMES, RegistryProvider, RoleBadge, S3ClipsSupabaseService as S3ClipsService, S3Service, SKUManagementView, SOPComplianceChart, SSEChatClient, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SessionTracker, SessionTrackingContext, SessionTrackingProvider, SettingsPopup, ShiftDisplay_default as ShiftDisplay, ShiftsView_default as ShiftsView, SideNavBar, SignupWithInvitation, SilentErrorBoundary, SimpleOnboardingPopup, SingleVideoStream_default as SingleVideoStream, Skeleton, SubscriptionManager, SubscriptionManagerProvider, SupabaseProvider, SupervisorDropdown_default as SupervisorDropdown, SupervisorManagementView_default as SupervisorManagementView, SupervisorService, TargetWorkspaceGrid, TargetsView_default as TargetsView, TeamManagementView_default as TeamManagementView, ThreadSidebar, TicketHistory_default as TicketHistory, TicketHistoryService, TicketsView_default as TicketsView, TimeDisplay_default as TimeDisplay, TimePickerDropdown, Timer_default as Timer, TimezoneProvider, TimezoneService, UptimeDonutChart, UptimeLineChart, UptimeMetricCards, UserAvatar, UserManagementService, UserManagementTable, UserService, UserUsageDetailModal, UserUsageStats, VideoCard, VideoGridView, VideoPlayer, VideoPreloader, WORKSPACE_POSITIONS, WhatsAppShareButton, WorkspaceCard, WorkspaceCycleTimeMetricCards, WorkspaceDetailView_default as WorkspaceDetailView, WorkspaceDisplayNameExample, WorkspaceGrid, WorkspaceGridItem, WorkspaceHealthCard, WorkspaceHealthView_default as WorkspaceHealthView, WorkspaceHistoryCalendar, WorkspaceMetricCards, WorkspaceMetricCardsImpl, WorkspaceMonthlyDataFetcher, WorkspaceMonthlyHistory, WorkspaceMonthlyPdfGenerator, WorkspacePdfExportButton, WorkspacePdfGenerator, WorkspaceWhatsAppShareButton, actionService, aggregateKPIsFromLineMetricsRows, alertsService, apiUtils, areAllLinesOnSameShift, authCoreService, authOTPService, authRateLimitService, awardsService, buildDateKey, buildKPIsFromLineMetricsRow, buildShiftGroupsKey, canRoleAccessDashboardPath, canRoleAccessTeamManagement, canRoleAssignFactories, canRoleAssignLines, canRoleChangeRole, canRoleInviteRole, canRoleManageCompany, canRoleManageTargets, canRoleManageUsers, canRoleRemoveUser, canRoleViewClipsCost, canRoleViewUsageStats, captureHandledFrontendException, captureSentryException, captureSentryMessage, checkRateLimit2 as checkRateLimit, clearAllRateLimits2 as clearAllRateLimits, clearRateLimit2 as clearRateLimit, clearS3VideoCache, clearS3VideoFromCache, clearSentryContext, clearWorkspaceDisplayNamesCache, cn, createDefaultKPIs, createInvitationService, createLinesService, createSessionTracker, createStorageService, createStreamProxyHandler, createSupabaseClient, createSupervisorService, createThrottledReload, createUserManagementService, createUserService, dashboardService, deleteThread, fetchIdleTimeReasons, filterDataByDateKeyRange, forceRefreshWorkspaceDisplayNames, formatAwardMonth, formatDateInZone, formatDateKeyForDisplay, formatDateTimeInZone, formatDuration2 as formatDuration, formatISTDate, formatIdleTime, formatRangeLabel, formatReasonLabel, formatRelativeTime, formatTimeInZone, fromUrlFriendlyName, getActionDisplayName, getActiveShift, getAllLineDisplayNames, getAllThreadMessages, getAllWorkspaceDisplayNamesAsync, getAllWorkspaceDisplayNamesSnapshot, getAnonClient, getAssignableRoles, getAssignmentColumnLabel, getAvailableShiftIds, getAwardBadgeType, getAwardDescription, getAwardTitle, getBrowserName, getCameraNumber, getCompanyMetricsTableName, getConfigurableShortWorkspaceDisplayName, getConfigurableWorkspaceDisplayName, getConfiguredLineIds, getCoreSessionRecordingProperties, getCoreSessionReplayUrl, getCurrentShift, getCurrentShiftForLine, getCurrentTimeInZone, getCurrentWeekFullRange, getCurrentWeekToDateRange, getDashboardHeaderTimeInZone, getDateKeyFromDate, getDaysDifferenceInZone, getDefaultCameraStreamUrl, getDefaultLineId, getDefaultTabForWorkspace, getInitials, getLineDisplayName, getManufacturingInsights, getMetricsTablePrefix, getMonthKeyBounds, getMonthWeekRanges, getMonthlyTrendComparisonLabel, getNextUpdateInterval, getOperationalDate, getRoleAssignmentKind, getRoleDescription, getRoleLabel, getRoleMetadata, getRoleNavPaths, getS3SignedUrl, getS3VideoSrc, getShiftData, getShiftNameById, getShiftWorkDurationSeconds, getShortShiftName, getShortWorkspaceDisplayName, getShortWorkspaceDisplayNameAsync, getStoredWorkspaceMappings, getSubscriptionManager, getThreadMessages, getUniformShiftGroup, getUserThreads, getUserThreadsPaginated, getVisibleRolesForCurrentUser, getWorkspaceDisplayName, getWorkspaceDisplayNameAsync, getWorkspaceDisplayNamesMap, getWorkspaceFromUrl, getWorkspaceNavigationParams, groupLinesByShift, hasAnyShiftData, identifyCoreUser, initializeCoreMixpanel, isEfficiencyOnTrack, isFactoryScopedRole, isFullMonthRange, isIgnorableFrontendError, isLegacyConfiguration, isLoopbackHostname, isPrefetchError, isRecentFlowVideoGridMetricMode, isSafari, isSupervisorRole, isTransitionPeriod, isUrlPermanentlyFailed, isValidFactoryViewConfiguration, isValidLineInfoPayload, isValidPrefetchParams, isValidPrefetchStatus, isValidWorkspaceDetailedMetricsPayload, isValidWorkspaceMetricsPayload, isWipGatedVideoGridMetricMode, isWorkspaceDisplayNamesLoaded, isWorkspaceDisplayNamesLoading, lineLeaderboardService, linesService, mergeWithDefaultConfig, migrateLegacyConfiguration, normalizeActionFamily, normalizeDateKeyRange, normalizeRoleLevel, normalizeVideoGridMetricMode, optifyeAgentClient, parseDateKeyToDate, parseS3Uri, preInitializeWorkspaceDisplayNames, preloadS3Video, preloadS3VideoUrl, preloadS3VideosUrl, preloadVideoUrl, preloadVideosUrl, qualityService, realtimeService, refreshWorkspaceDisplayNames, resetCoreMixpanel, resetFailedUrl, resetSubscriptionManager, s3VideoPreloader, setSentryUserContext, setSentryWorkspaceContext, shouldEnableLocalDevTestLogin, shuffleArray, simulateApiDelay, skuService, startCoreSessionRecording, stopCoreSessionRecording, storeWorkspaceMapping, streamProxyConfig, subscribeWorkspaceDisplayNames, throttledReloadDashboard, toUrlFriendlyName, trackCoreEvent, trackCorePageView, transformToChartData, updateThreadTitle, upsertWorkspaceDisplayNameInCache, useAccessControl, useActiveBreaks, useActiveLineId, useAllWorkspaceMetrics, useAnalyticsConfig, useAppTimezone, useAudioService, useAuth, useAuthConfig, useAxelNotifications, useCanSaveTargets, useClipFilter, useClipTypes, useClipTypesWithCounts, useClipsInit, useCompanyClipsCost, useCompanyFastSlowClipFiltersEnabled, useCompanyHasVlmEnabledLine, useCompanyUsersUsage, useComponentOverride, useCustomConfig, useDashboardConfig, useDashboardMetrics, useDatabaseConfig, useDateFormatter, useDateTimeConfig, useDynamicShiftConfig, useEndpointsConfig, useEntityConfig, useFactoryOverviewMetrics, useFeatureFlags, useFormatNumber, useHasLineAccess, useHideMobileHeader, useHistoricWorkspaceMetrics, useHlsStream, useHlsStreamWithCropping, useHookOverride, useHourEndTimer, useHourlyTargetAchievements, useHourlyTargetMisses, useIdleTimeClipClassifications, useIdleTimeReasons, useIdleTimeVlmConfig, useKpiTrends, useLeaderboardMetrics, useLineDetailedMetrics, useLineKPIs, useLineMetrics, useLineShiftConfig, useLineSupervisor, useLineWorkspaceMetrics, useLines, useMessages, useMetrics, useMobileMenu, useMonthlyTrend, useMultiLineShiftConfigs, useNavigation, useOperationalShiftKey, useOptionalSupabase, useOverrides, usePageOverride, usePrefetchClipCounts, useRealtimeLineMetrics, useRegistry, useSKUs, useSessionKeepAlive, useSessionTracking, useSessionTrackingContext, useShiftConfig, useShiftGroups, useShifts, useSubscriptionManager, useSubscriptionManagerSafe, useSupabase, useSupabaseClient, useSupervisorsByLineIds, useTargets, useTeamManagementPermissions, useTheme, useThemeConfig, useThreads, useTicketHistory, useTimezoneContext, useUserLineAccess, useUserUsage, useVideoConfig, useWorkspaceConfig, useWorkspaceDetailedMetrics, useWorkspaceDisplayName, useWorkspaceDisplayNames, useWorkspaceDisplayNamesMap, useWorkspaceHealthById, useWorkspaceHealthLastSeen, useWorkspaceHealthStatus, useWorkspaceMetrics, useWorkspaceNavigation, useWorkspaceOperators, useWorkspaceUptimeTimeline, useWorkspaceVideoStreams, userService, videoPrefetchManager, videoPreloader, weeklyTopPerformerService, whatsappService, withAccessControl, withAuth, withRegistry, withTimezone, workspaceHealthService, workspaceService };