@optifye/dashboard-core 6.12.25 → 6.12.27

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
@@ -16,7 +16,7 @@ import { BarChart as BarChart$1, CartesianGrid, XAxis, YAxis, ReferenceLine, Too
16
16
  import { Slot } from '@radix-ui/react-slot';
17
17
  import * as SelectPrimitive from '@radix-ui/react-select';
18
18
  import { DayPicker, useNavigation as useNavigation$1 } from 'react-day-picker';
19
- import { AdjustmentsHorizontalIcon, ClockIcon, UsersIcon, UserCircleIcon, TicketIcon, CurrencyDollarIcon, QuestionMarkCircleIcon, XMarkIcon, ArrowRightIcon, Bars3Icon, HomeIcon, VideoCameraIcon, TrophyIcon, ChartBarIcon, LightBulbIcon, CubeIcon, HeartIcon, Cog6ToothIcon, ChevronRightIcon, ArrowRightStartOnRectangleIcon, ExclamationCircleIcon, ExclamationTriangleIcon, CalendarIcon, ChevronDownIcon, ChevronLeftIcon, EnvelopeIcon, DocumentTextIcon, ChevronUpIcon, ArrowDownTrayIcon, CheckCircleIcon, ChatBubbleLeftRightIcon, XCircleIcon, FunnelIcon, EyeIcon, InformationCircleIcon, ArrowLeftIcon, PlayCircleIcon } from '@heroicons/react/24/outline';
19
+ import { AdjustmentsHorizontalIcon, ClockIcon, UsersIcon, UserCircleIcon, TicketIcon, CurrencyDollarIcon, QuestionMarkCircleIcon, XMarkIcon, ArrowRightIcon, Bars3Icon, VideoCameraIcon, TrophyIcon, ChartBarIcon, LightBulbIcon, CubeIcon, HeartIcon, Cog6ToothIcon, ChevronRightIcon, ArrowRightStartOnRectangleIcon, ExclamationCircleIcon, ExclamationTriangleIcon, CalendarIcon, ChevronDownIcon, ChevronLeftIcon, EnvelopeIcon, DocumentTextIcon, ChevronUpIcon, ArrowDownTrayIcon, CheckCircleIcon, ChatBubbleLeftRightIcon, XCircleIcon, FunnelIcon, EyeIcon, InformationCircleIcon, ArrowLeftIcon, PlayCircleIcon } from '@heroicons/react/24/outline';
20
20
  import { CheckIcon } from '@heroicons/react/24/solid';
21
21
  import html2canvas from 'html2canvas';
22
22
  import jsPDF, { jsPDF as jsPDF$1 } from 'jspdf';
@@ -22046,14 +22046,87 @@ var toNumber = (value) => {
22046
22046
  }
22047
22047
  return 0;
22048
22048
  };
22049
+ var toOptionalNumber = (value) => {
22050
+ if (typeof value === "number" && Number.isFinite(value)) return value;
22051
+ if (typeof value === "string" && value.trim() !== "") {
22052
+ const parsed = Number(value);
22053
+ return Number.isFinite(parsed) ? parsed : null;
22054
+ }
22055
+ return null;
22056
+ };
22049
22057
  var EFFICIENCY_ON_TRACK_THRESHOLD = 100;
22050
22058
  var isEfficiencyOnTrack = (efficiency) => toNumber(efficiency) >= EFFICIENCY_ON_TRACK_THRESHOLD;
22059
+ var KPI_SIGNAL_LABELS = {
22060
+ stable: "Stable",
22061
+ warning: "Warning",
22062
+ attention: "Attention"
22063
+ };
22064
+ var normalizeLineSignalSource = (source) => source === "recent_flow" ? "recent_flow" : "efficiency";
22065
+ var normalizeLineSignal = (lineSignal, fallbackEfficiency, fallbackWeight) => {
22066
+ if (lineSignal && typeof lineSignal === "object") {
22067
+ const raw = lineSignal;
22068
+ return {
22069
+ source: normalizeLineSignalSource(raw.source),
22070
+ percent: toOptionalNumber(raw.percent),
22071
+ weight: toOptionalNumber(raw.weight),
22072
+ mode: raw.mode === "unavailable" ? "unavailable" : "computed",
22073
+ reason: typeof raw.reason === "string" ? raw.reason : raw.reason ?? null,
22074
+ effectiveEndAt: raw.effective_end_at ?? raw.effectiveEndAt ?? null,
22075
+ computedAt: raw.computed_at ?? raw.computedAt ?? null
22076
+ };
22077
+ }
22078
+ const percent2 = toOptionalNumber(fallbackEfficiency);
22079
+ if (percent2 === null) return null;
22080
+ return {
22081
+ source: "efficiency",
22082
+ percent: percent2,
22083
+ weight: toOptionalNumber(fallbackWeight),
22084
+ mode: "computed",
22085
+ reason: "fallback_efficiency",
22086
+ effectiveEndAt: null,
22087
+ computedAt: null
22088
+ };
22089
+ };
22090
+ var getKpiSignalStatus = (signal, legend = DEFAULT_EFFICIENCY_LEGEND) => {
22091
+ const percent2 = toOptionalNumber(signal?.percent);
22092
+ if (percent2 === null) return null;
22093
+ const color2 = getEfficiencyColor(percent2, legend);
22094
+ if (color2 === "green") return "stable";
22095
+ if (color2 === "yellow") return "warning";
22096
+ return "attention";
22097
+ };
22098
+ var getKpiSignalLabel = (signal, legend = DEFAULT_EFFICIENCY_LEGEND) => {
22099
+ const status = getKpiSignalStatus(signal, legend);
22100
+ return status ? KPI_SIGNAL_LABELS[status] : null;
22101
+ };
22102
+ var aggregateLineSignals = (signals) => {
22103
+ const numericSignals = signals.filter(
22104
+ (signal) => signal !== null && signal !== void 0 && toOptionalNumber(signal.percent) !== null
22105
+ );
22106
+ if (numericSignals.length === 0) return null;
22107
+ const percent2 = numericSignals.reduce(
22108
+ (sum, signal) => sum + (toOptionalNumber(signal.percent) ?? 0),
22109
+ 0
22110
+ ) / numericSignals.length;
22111
+ const signalSources = new Set(numericSignals.map((signal) => signal.source));
22112
+ const source = signalSources.size === 1 ? numericSignals[0].source : "mixed";
22113
+ return {
22114
+ source,
22115
+ percent: percent2,
22116
+ weight: null,
22117
+ mode: "computed",
22118
+ reason: "average",
22119
+ effectiveEndAt: null,
22120
+ computedAt: null
22121
+ };
22122
+ };
22051
22123
  var createDefaultKPIs = () => ({
22052
22124
  underperformingWorkers: { current: 0, total: 0, change: 0 },
22053
22125
  efficiency: { value: 0, change: 0 },
22054
22126
  outputProgress: { current: 0, target: 0, idealOutput: 0, change: 0 },
22055
22127
  avgCycleTime: { value: 0, change: 0 },
22056
- qualityCompliance: { value: 95, change: 0 }
22128
+ qualityCompliance: { value: 95, change: 0 },
22129
+ lineSignal: null
22057
22130
  });
22058
22131
  var buildKPIsFromLineMetricsRow = (row) => {
22059
22132
  if (!row) return createDefaultKPIs();
@@ -22087,15 +22160,28 @@ var buildKPIsFromLineMetricsRow = (row) => {
22087
22160
  qualityCompliance: {
22088
22161
  value: 95,
22089
22162
  change: 0
22090
- }
22163
+ },
22164
+ lineSignal: normalizeLineSignal(row.line_signal, avgEfficiency, idealOutput || lineThreshold)
22091
22165
  };
22092
22166
  };
22093
22167
  var aggregateKPIsFromLineMetricsRows = (rows) => {
22094
22168
  if (!rows || rows.length === 0) return createDefaultKPIs();
22169
+ const lineSignal = aggregateLineSignals(
22170
+ rows.map((row) => normalizeLineSignal(
22171
+ row?.line_signal,
22172
+ row?.avg_efficiency,
22173
+ row?.ideal_output ?? row?.line_threshold
22174
+ ))
22175
+ );
22095
22176
  const eligibleRows = rows.filter(
22096
22177
  (row) => isValidAggregateEfficiency(row?.monitoring_mode ?? row?.monitoringMode, row?.avg_efficiency)
22097
22178
  );
22098
- if (eligibleRows.length === 0) return createDefaultKPIs();
22179
+ if (eligibleRows.length === 0) {
22180
+ return {
22181
+ ...createDefaultKPIs(),
22182
+ lineSignal
22183
+ };
22184
+ }
22099
22185
  const currentOutputSum = eligibleRows.reduce((sum, row) => sum + toNumber(row.current_output), 0);
22100
22186
  const lineThresholdSum = eligibleRows.reduce(
22101
22187
  (sum, row) => sum + (row?.output_target_recalculated !== void 0 && row?.output_target_recalculated !== null ? toNumber(row.output_target_recalculated) : toNumber(row.line_threshold)),
@@ -22142,7 +22228,8 @@ var aggregateKPIsFromLineMetricsRows = (rows) => {
22142
22228
  qualityCompliance: {
22143
22229
  value: 95,
22144
22230
  change: 0
22145
- }
22231
+ },
22232
+ lineSignal
22146
22233
  };
22147
22234
  };
22148
22235
 
@@ -34696,19 +34783,19 @@ var SkuRow = ({ sku, isSelected, isLive, onSelect }) => {
34696
34783
  onClick: () => onSelect?.(isSelected ? null : sku.sku_id),
34697
34784
  "data-testid": `sku-progress-row-${sku.sku_id}`,
34698
34785
  children: [
34699
- /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-3", children: [
34700
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 truncate", children: [
34786
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
34787
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2 flex-1 min-w-0", children: [
34701
34788
  /* @__PURE__ */ jsx(
34702
34789
  "span",
34703
34790
  {
34704
- className: "text-sm font-semibold text-gray-800 truncate",
34791
+ className: "text-xs sm:text-sm font-semibold text-gray-800 break-words line-clamp-2",
34705
34792
  title: skuLabel,
34706
34793
  children: skuLabel
34707
34794
  }
34708
34795
  ),
34709
- isLive && /* @__PURE__ */ jsx("div", { className: "w-2 h-2 rounded-full bg-green-500 shrink-0 shadow-[0_0_4px_rgba(34,197,94,0.6)]", title: "Currently running" })
34796
+ isLive && /* @__PURE__ */ jsx("div", { className: "w-2 h-2 rounded-full bg-green-500 shrink-0 shadow-[0_0_4px_rgba(34,197,94,0.6)] mt-1.5", title: "Currently running" })
34710
34797
  ] }),
34711
- /* @__PURE__ */ jsxs("span", { className: "text-xs text-gray-500 font-medium tabular-nums shrink-0", children: [
34798
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-gray-500 font-medium tabular-nums shrink-0 pt-0.5", children: [
34712
34799
  Math.round(current),
34713
34800
  " / ",
34714
34801
  Math.round(target)
@@ -36117,6 +36204,37 @@ var interpretIdleValue = (value) => {
36117
36204
  if (value === "x" || value === null || value === void 0) return "unknown";
36118
36205
  return "unknown";
36119
36206
  };
36207
+ var timeToMinutes = (value) => {
36208
+ const parsed = parseTime(value);
36209
+ if (!parsed) return null;
36210
+ return parsed.hour * 60 + parsed.minute;
36211
+ };
36212
+ var normalizeBreaksOnShiftTimeline2 = (shiftStart, shiftBreaks) => {
36213
+ const shiftStartMinutes = timeToMinutes(shiftStart);
36214
+ if (shiftStartMinutes === null || !Array.isArray(shiftBreaks)) {
36215
+ return [];
36216
+ }
36217
+ return shiftBreaks.flatMap((entry) => {
36218
+ const startRaw = timeToMinutes(entry?.startTime ?? entry?.start);
36219
+ const endRaw = timeToMinutes(entry?.endTime ?? entry?.end);
36220
+ if (startRaw === null || endRaw === null) return [];
36221
+ let start = startRaw;
36222
+ let end = endRaw;
36223
+ if (end <= start) {
36224
+ end += 24 * 60;
36225
+ }
36226
+ if (start < shiftStartMinutes) {
36227
+ start += 24 * 60;
36228
+ end += 24 * 60;
36229
+ }
36230
+ return [{ start, end }];
36231
+ });
36232
+ };
36233
+ var isBreakMinute = (minuteIndex, shiftStartMinutes, normalizedBreaks) => {
36234
+ if (!normalizedBreaks.length) return false;
36235
+ const absoluteMinute = shiftStartMinutes + minuteIndex;
36236
+ return normalizedBreaks.some((entry) => entry.start <= absoluteMinute && absoluteMinute < entry.end);
36237
+ };
36120
36238
  var getShiftDurationMinutes = (shiftStart, shiftEnd) => {
36121
36239
  const start = parseTime(shiftStart);
36122
36240
  const end = parseTime(shiftEnd);
@@ -36127,6 +36245,29 @@ var getShiftDurationMinutes = (shiftStart, shiftEnd) => {
36127
36245
  }
36128
36246
  return duration > 0 ? duration : null;
36129
36247
  };
36248
+ var getBreakExcludedShiftMinutes = ({
36249
+ shiftStart,
36250
+ shiftEnd,
36251
+ elapsedMinutes,
36252
+ shiftBreaks
36253
+ }) => {
36254
+ const shiftMinutes = getShiftDurationMinutes(shiftStart, shiftEnd);
36255
+ if (shiftMinutes === null) return null;
36256
+ const elapsedLimit = Number.isFinite(elapsedMinutes) ? Math.min(Math.max(Math.floor(elapsedMinutes ?? 0), 0), shiftMinutes) : shiftMinutes;
36257
+ if (elapsedLimit <= 0) return 0;
36258
+ const startTime = parseTime(shiftStart);
36259
+ if (!startTime) return elapsedLimit;
36260
+ const shiftStartMinutes = startTime.hour * 60 + startTime.minute;
36261
+ const normalizedBreaks = normalizeBreaksOnShiftTimeline2(shiftStart, shiftBreaks);
36262
+ if (!normalizedBreaks.length) return elapsedLimit;
36263
+ let workingMinutes = 0;
36264
+ for (let minuteIndex = 0; minuteIndex < elapsedLimit; minuteIndex += 1) {
36265
+ if (!isBreakMinute(minuteIndex, shiftStartMinutes, normalizedBreaks)) {
36266
+ workingMinutes += 1;
36267
+ }
36268
+ }
36269
+ return workingMinutes;
36270
+ };
36130
36271
  var getShiftElapsedMinutes = ({
36131
36272
  shiftStart,
36132
36273
  shiftEnd,
@@ -36191,7 +36332,8 @@ var buildUptimeSeries = ({
36191
36332
  shiftEnd,
36192
36333
  shiftDate,
36193
36334
  timezone,
36194
- elapsedMinutes
36335
+ elapsedMinutes,
36336
+ shiftBreaks
36195
36337
  }) => {
36196
36338
  const normalizedIdle = normalizeIdleTimeHourly(idleTimeHourly || {});
36197
36339
  const hasIdleData = Object.keys(normalizedIdle).length > 0;
@@ -36246,6 +36388,8 @@ var buildUptimeSeries = ({
36246
36388
  const points = [];
36247
36389
  let activeMinutes = 0;
36248
36390
  let idleMinutes = 0;
36391
+ const shiftStartMinutes = startTime.hour * 60 + startTime.minute;
36392
+ const normalizedBreaks = normalizeBreaksOnShiftTimeline2(shiftStart, shiftBreaks);
36249
36393
  for (let minuteIndex = 0; minuteIndex < shiftMinutes; minuteIndex += 1) {
36250
36394
  const minuteDate = addMinutes(shiftStartDate, minuteIndex);
36251
36395
  const timeLabel = formatInTimeZone(minuteDate, timezone, "h:mm a");
@@ -36258,6 +36402,15 @@ var buildUptimeSeries = ({
36258
36402
  });
36259
36403
  continue;
36260
36404
  }
36405
+ if (isBreakMinute(minuteIndex, shiftStartMinutes, normalizedBreaks)) {
36406
+ points.push({
36407
+ minuteIndex,
36408
+ timeLabel,
36409
+ uptime: null,
36410
+ status: "break"
36411
+ });
36412
+ continue;
36413
+ }
36261
36414
  const hourKey = formatInTimeZone(minuteDate, timezone, "H");
36262
36415
  const minuteKey = Number.parseInt(formatInTimeZone(minuteDate, timezone, "m"), 10);
36263
36416
  const hourBucket = normalizedIdle[hourKey] || [];
@@ -39418,6 +39571,7 @@ var HourlyUptimeChartComponent = ({
39418
39571
  shiftDate,
39419
39572
  timezone,
39420
39573
  elapsedMinutes,
39574
+ shiftBreaks,
39421
39575
  className = ""
39422
39576
  }) => {
39423
39577
  const containerRef = React144__default.useRef(null);
@@ -39429,8 +39583,9 @@ var HourlyUptimeChartComponent = ({
39429
39583
  shiftEnd,
39430
39584
  shiftDate,
39431
39585
  timezone,
39432
- elapsedMinutes
39433
- }), [idleTimeHourly, shiftStart, shiftEnd, shiftDate, timezone, elapsedMinutes]);
39586
+ elapsedMinutes,
39587
+ shiftBreaks
39588
+ }), [idleTimeHourly, shiftStart, shiftEnd, shiftDate, timezone, elapsedMinutes, shiftBreaks]);
39434
39589
  const hasAggregateData = Boolean(hourlyAggregates && hourlyAggregates.length > 0);
39435
39590
  const shiftStartTime = React144__default.useMemo(
39436
39591
  () => getTimeFromTimeString(shiftStart),
@@ -44978,7 +45133,7 @@ var FileManagerFilters = ({
44978
45133
  onClick: () => {
44979
45134
  onIdleClipSortChange?.(idleClipSort === "latest" ? "idle_duration_desc" : "latest");
44980
45135
  },
44981
- className: `p-2 rounded-xl transition-all duration-200 ${idleClipSort === "idle_duration_desc" ? "bg-orange-100 text-orange-600 hover:bg-orange-200 shadow-sm" : "bg-slate-100 text-slate-600 hover:bg-slate-200"}`,
45136
+ className: `p-2 rounded-xl transition-all duration-200 ${idleClipSort === "idle_duration_desc" ? "bg-blue-100 text-blue-600 hover:bg-blue-200 shadow-sm" : "bg-slate-100 text-slate-600 hover:bg-slate-200"}`,
44982
45137
  title: idleClipSort === "idle_duration_desc" ? "Sort by newest first" : "Sort by longest idle first",
44983
45138
  "aria-label": idleClipSort === "idle_duration_desc" ? "Sort idle clips by newest first" : "Sort idle clips by longest idle first",
44984
45139
  children: /* @__PURE__ */ jsx(ArrowDownWideNarrow, { className: "h-5 w-5" })
@@ -45045,7 +45200,7 @@ var FileManagerFilters = ({
45045
45200
  }
45046
45201
  )
45047
45202
  ] }),
45048
- activeFilter === "idle_time" && idleClipSort === "idle_duration_desc" && /* @__PURE__ */ jsxs("div", { className: "inline-flex w-fit items-center gap-2 rounded-full border border-orange-100 bg-orange-50/70 px-2.5 py-1 text-xs text-orange-700 shadow-sm", children: [
45203
+ activeFilter === "idle_time" && idleClipSort === "idle_duration_desc" && /* @__PURE__ */ jsxs("div", { className: "inline-flex w-fit items-center gap-2 rounded-full border border-blue-100 bg-blue-50/70 px-2.5 py-1 text-xs text-blue-700 shadow-sm", children: [
45049
45204
  /* @__PURE__ */ jsx(ArrowDownWideNarrow, { className: "h-3.5 w-3.5" }),
45050
45205
  /* @__PURE__ */ jsx("span", { className: "font-medium", children: "Longest idle first" }),
45051
45206
  /* @__PURE__ */ jsx(
@@ -45055,7 +45210,7 @@ var FileManagerFilters = ({
45055
45210
  e.stopPropagation();
45056
45211
  onIdleClipSortChange?.("latest");
45057
45212
  },
45058
- className: "rounded-full p-0.5 transition-colors hover:bg-orange-100",
45213
+ className: "rounded-full p-0.5 transition-colors hover:bg-blue-100",
45059
45214
  title: "Clear idle sort",
45060
45215
  children: /* @__PURE__ */ jsx(X, { className: "h-3.5 w-3.5" })
45061
45216
  }
@@ -51622,7 +51777,8 @@ var LineMonthlyPdfGenerator = ({
51622
51777
  };
51623
51778
  var LineWhatsAppShareButton = ({
51624
51779
  lineInfo,
51625
- className
51780
+ className,
51781
+ shiftBreaks = []
51626
51782
  }) => {
51627
51783
  const handleShare = () => {
51628
51784
  trackCoreEvent("Line WhatsApp Share Clicked", {
@@ -51636,7 +51792,8 @@ var LineWhatsAppShareButton = ({
51636
51792
  shiftStart: lineInfo.metrics.shift_start,
51637
51793
  shiftEnd: lineInfo.metrics.shift_end,
51638
51794
  shiftDate: lineInfo.date,
51639
- timezone: "Asia/Kolkata"
51795
+ timezone: "Asia/Kolkata",
51796
+ shiftBreaks
51640
51797
  }) : null;
51641
51798
  const efficiencyValue = Number.isFinite(lineInfo.metrics.avg_efficiency) ? Number(lineInfo.metrics.avg_efficiency) : null;
51642
51799
  const utilization = efficiencyValue !== null ? efficiencyValue : uptimeSeries && uptimeSeries.availableMinutes > 0 ? uptimeSeries.activeMinutes / uptimeSeries.availableMinutes * 100 : 0;
@@ -51805,16 +51962,24 @@ var LinePdfGenerator = ({
51805
51962
  shiftStart,
51806
51963
  shiftEnd,
51807
51964
  shiftDate,
51808
- timezone: effectiveUptimeTimezone
51965
+ timezone: effectiveUptimeTimezone,
51966
+ shiftBreaks
51809
51967
  });
51810
51968
  let activeMinutes = uptimeSeries.activeMinutes;
51811
51969
  let idleMinutes = uptimeSeries.idleMinutes;
51812
51970
  let availableMinutes = uptimeSeries.availableMinutes;
51813
51971
  let hasData = uptimeSeries.hasData;
51814
- if (!hasData) {
51972
+ const hasIdleHourlyPayload = Boolean(
51973
+ workspace.idle_time_hourly && typeof workspace.idle_time_hourly === "object" && Object.keys(workspace.idle_time_hourly).length > 0
51974
+ );
51975
+ if (!hasData && !hasIdleHourlyPayload) {
51815
51976
  const idleTimeValue = workspace.idle_time;
51816
51977
  const hasIdleTimeValue = Number.isFinite(idleTimeValue);
51817
- const fallbackDuration = shiftDurationMinutes;
51978
+ const fallbackDuration = getBreakExcludedShiftMinutes({
51979
+ shiftStart,
51980
+ shiftEnd,
51981
+ shiftBreaks
51982
+ }) ?? shiftDurationMinutes;
51818
51983
  if (hasIdleTimeValue && idleTimeValue > 0 && fallbackDuration > 0) {
51819
51984
  const idleFromAggregate = Math.min(Math.max(Number(idleTimeValue) / 60, 0), fallbackDuration);
51820
51985
  idleMinutes = idleFromAggregate;
@@ -51886,7 +52051,8 @@ var LinePdfGenerator = ({
51886
52051
  shiftStart: lineShiftStart,
51887
52052
  shiftEnd: lineShiftEnd,
51888
52053
  shiftDate: lineInfo.date,
51889
- timezone: effectiveUptimeTimezone
52054
+ timezone: effectiveUptimeTimezone,
52055
+ shiftBreaks
51890
52056
  });
51891
52057
  hourlyData = buildHourlyFromSeries(lineUptimeSeries);
51892
52058
  }
@@ -53825,7 +53991,8 @@ var WorkspaceMonthlyHistory = ({
53825
53991
  };
53826
53992
  var WorkspaceWhatsAppShareButton = ({
53827
53993
  workspace,
53828
- className
53994
+ className,
53995
+ shiftBreaks = []
53829
53996
  }) => {
53830
53997
  const handleShare = () => {
53831
53998
  trackCoreEvent("Workspace WhatsApp Share Clicked", {
@@ -53841,7 +54008,11 @@ var WorkspaceWhatsAppShareButton = ({
53841
54008
  timeZone: "Asia/Kolkata"
53842
54009
  });
53843
54010
  const isUptimeMode = workspace.monitoring_mode === "uptime";
53844
- const shiftMinutes = getShiftDurationMinutes(workspace.shift_start, workspace.shift_end);
54011
+ const shiftMinutes = getBreakExcludedShiftMinutes({
54012
+ shiftStart: workspace.shift_start,
54013
+ shiftEnd: workspace.shift_end,
54014
+ shiftBreaks
54015
+ }) ?? getShiftDurationMinutes(workspace.shift_start, workspace.shift_end);
53845
54016
  const shiftSeconds = shiftMinutes ? shiftMinutes * 60 : 0;
53846
54017
  const idleSeconds = Math.max(workspace.idle_time || 0, 0);
53847
54018
  const clampedIdleSeconds = shiftSeconds > 0 ? Math.min(idleSeconds, shiftSeconds) : idleSeconds;
@@ -53931,7 +54102,11 @@ var WorkspacePdfGenerator = ({
53931
54102
  try {
53932
54103
  const isUptimeMode = workspace.monitoring_mode === "uptime";
53933
54104
  const isAssemblyCycleMode = !isUptimeMode && shouldUseAssemblyCycleTimeLayout(workspace);
53934
- const shiftMinutes = getShiftDurationMinutes(workspace.shift_start, workspace.shift_end);
54105
+ const shiftMinutes = getBreakExcludedShiftMinutes({
54106
+ shiftStart: workspace.shift_start,
54107
+ shiftEnd: workspace.shift_end,
54108
+ shiftBreaks
54109
+ }) ?? getShiftDurationMinutes(workspace.shift_start, workspace.shift_end);
53935
54110
  const shiftSeconds = shiftMinutes ? shiftMinutes * 60 : 0;
53936
54111
  const idleSeconds = Math.max(workspace.idle_time || 0, 0);
53937
54112
  const clampedIdleSeconds = shiftSeconds > 0 ? Math.min(idleSeconds, shiftSeconds) : idleSeconds;
@@ -54101,7 +54276,8 @@ var WorkspacePdfGenerator = ({
54101
54276
  shiftStart: workspace.shift_start,
54102
54277
  shiftEnd: workspace.shift_end,
54103
54278
  shiftDate: workspace.date,
54104
- timezone: reportTimezone
54279
+ timezone: reportTimezone,
54280
+ shiftBreaks
54105
54281
  }) : null;
54106
54282
  const hourlyUptime = uptimeSeries?.points?.length ? Array.from({ length: Math.ceil(uptimeSeries.shiftMinutes / 60) }, (_, index) => {
54107
54283
  const start = index * 60;
@@ -57496,7 +57672,7 @@ var SideNavBar = memo$1(({
57496
57672
  const role = user?.role_level;
57497
57673
  const roleNavPaths = useMemo(() => getRoleNavPaths(role), [role]);
57498
57674
  const showLiveMonitorLink = roleNavPaths.includes("/live-monitor");
57499
- const rootDashboardSurface = useMemo(() => role === "owner" || role === "plant_head" || role === "optifye" ? "operations_overview" : "monitor", [role]);
57675
+ const rootDashboardSurface = useMemo(() => "monitor", []);
57500
57676
  const getBasePath = useCallback((path) => {
57501
57677
  const firstSegment = path.split("?")[0].split("/").filter(Boolean)[0];
57502
57678
  return firstSegment ? `/${firstSegment}` : "/";
@@ -57547,12 +57723,6 @@ var SideNavBar = memo$1(({
57547
57723
  dashboard_surface: dashboardSurface
57548
57724
  }
57549
57725
  }), []);
57550
- const handleHomeClick = useCallback(() => {
57551
- navigate("/", {
57552
- trackingEvent: buildDashboardSurfaceTrackingEvent("side_nav", "/", rootDashboardSurface)
57553
- });
57554
- onMobileMenuClose?.();
57555
- }, [navigate, onMobileMenuClose, buildDashboardSurfaceTrackingEvent, rootDashboardSurface]);
57556
57726
  const handleLeaderboardClick = useCallback(() => {
57557
57727
  navigate(`/leaderboard`, {
57558
57728
  trackingEvent: {
@@ -57858,7 +58028,6 @@ var SideNavBar = memo$1(({
57858
58028
  });
57859
58029
  onMobileMenuClose?.();
57860
58030
  }, [navigate, onMobileMenuClose, buildDashboardSurfaceTrackingEvent, rootDashboardSurface]);
57861
- const homeButtonClasses = useMemo(() => getButtonClasses("/"), [getButtonClasses]);
57862
58031
  const liveButtonClasses = useMemo(() => getButtonClasses("/live-monitor"), [getButtonClasses]);
57863
58032
  const leaderboardButtonClasses = useMemo(() => getButtonClasses("/leaderboard"), [getButtonClasses]);
57864
58033
  const kpisButtonClasses = useMemo(() => getButtonClasses("/kpis"), [getButtonClasses]);
@@ -57889,118 +58058,99 @@ var SideNavBar = memo$1(({
57889
58058
  children: /* @__PURE__ */ jsx(Logo, { className: "w-12 h-12 object-contain cursor-pointer" })
57890
58059
  }
57891
58060
  ) }),
57892
- /* @__PURE__ */ jsxs("div", { className: "flex-1 w-full py-6 px-4 overflow-y-auto", children: [
57893
- /* @__PURE__ */ jsxs("div", { className: "mb-6", children: [
57894
- canAccessPath("/") && /* @__PURE__ */ jsxs(
57895
- "button",
57896
- {
57897
- onClick: handleHomeClick,
57898
- className: homeButtonClasses,
57899
- "aria-label": "Home",
57900
- tabIndex: 0,
57901
- role: "tab",
57902
- "aria-selected": isPathActive("/"),
57903
- children: [
57904
- /* @__PURE__ */ jsx(HomeIcon, { className: "w-5 h-5 mb-1" }),
57905
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Home" })
57906
- ]
57907
- }
57908
- ),
57909
- showLiveMonitorLink && canAccessPath("/live-monitor") && /* @__PURE__ */ jsxs(
57910
- "button",
57911
- {
57912
- onClick: handleLiveClick,
57913
- className: `${liveButtonClasses} mt-3`,
57914
- "aria-label": "Monitor",
57915
- tabIndex: 0,
57916
- role: "tab",
57917
- "aria-selected": isPathActive("/live-monitor"),
57918
- children: [
57919
- /* @__PURE__ */ jsx(VideoCameraIcon, { className: "w-5 h-5 mb-1" }),
57920
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Monitor" })
57921
- ]
57922
- }
57923
- )
57924
- ] }),
57925
- /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
57926
- canAccessPath("/leaderboard") && /* @__PURE__ */ jsxs(
57927
- "button",
57928
- {
57929
- onClick: handleLeaderboardClick,
57930
- className: leaderboardButtonClasses,
57931
- "aria-label": "Leaderboard",
57932
- tabIndex: 0,
57933
- role: "tab",
57934
- "aria-selected": isPathActive("/leaderboard"),
57935
- children: [
57936
- /* @__PURE__ */ jsx(TrophyIcon, { className: "w-5 h-5 mb-1" }),
57937
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Leaders" })
57938
- ]
57939
- }
57940
- ),
57941
- canAccessPath("/kpis") && /* @__PURE__ */ jsxs(
57942
- "button",
57943
- {
57944
- onClick: handleKPIsClick,
57945
- className: kpisButtonClasses,
57946
- "aria-label": "Lines",
57947
- tabIndex: 0,
57948
- role: "tab",
57949
- "aria-selected": isPathActive("/kpis"),
57950
- children: [
57951
- /* @__PURE__ */ jsx(ChartBarIcon, { className: "w-5 h-5 mb-1" }),
57952
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Lines" })
57953
- ]
57954
- }
57955
- ),
57956
- canAccessPath("/improvement-center") && /* @__PURE__ */ jsxs(
57957
- "button",
57958
- {
57959
- onClick: handleImprovementClick,
57960
- className: improvementButtonClasses,
57961
- "aria-label": "Improvement Center",
57962
- tabIndex: 0,
57963
- role: "tab",
57964
- "aria-selected": isPathActive("/improvement-center"),
57965
- children: [
57966
- /* @__PURE__ */ jsx(LightBulbIcon, { className: "w-5 h-5 mb-1" }),
57967
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight text-center", children: "Improve" })
57968
- ]
57969
- }
57970
- ),
57971
- showSupervisorManagement,
57972
- skuEnabled && canAccessPath("/skus") && /* @__PURE__ */ jsxs(
57973
- "button",
57974
- {
57975
- onClick: handleSKUsClick,
57976
- className: skusButtonClasses,
57977
- "aria-label": "SKU Management",
57978
- tabIndex: 0,
57979
- role: "tab",
57980
- "aria-selected": isPathActive("/skus"),
57981
- children: [
57982
- /* @__PURE__ */ jsx(CubeIcon, { className: "w-5 h-5 mb-1" }),
57983
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "SKUs" })
57984
- ]
57985
- }
57986
- ),
57987
- canAccessPath("/health") && /* @__PURE__ */ jsxs(
57988
- "button",
57989
- {
57990
- onClick: handleHealthClick,
57991
- className: healthButtonClasses,
57992
- "aria-label": "System Health",
57993
- tabIndex: 0,
57994
- role: "tab",
57995
- "aria-selected": isPathActive("/health"),
57996
- children: [
57997
- /* @__PURE__ */ jsx(HeartIcon, { className: "w-5 h-5 mb-1" }),
57998
- /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Health" })
57999
- ]
58000
- }
58001
- )
58002
- ] })
58003
- ] }),
58061
+ /* @__PURE__ */ jsx("div", { className: "flex-1 w-full py-6 px-4 overflow-y-auto", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
58062
+ showLiveMonitorLink && canAccessPath("/live-monitor") && /* @__PURE__ */ jsxs(
58063
+ "button",
58064
+ {
58065
+ onClick: handleLiveClick,
58066
+ className: liveButtonClasses,
58067
+ "aria-label": "Monitor",
58068
+ tabIndex: 0,
58069
+ role: "tab",
58070
+ "aria-selected": isPathActive("/live-monitor"),
58071
+ children: [
58072
+ /* @__PURE__ */ jsx(VideoCameraIcon, { className: "w-5 h-5 mb-1" }),
58073
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Monitor" })
58074
+ ]
58075
+ }
58076
+ ),
58077
+ canAccessPath("/leaderboard") && /* @__PURE__ */ jsxs(
58078
+ "button",
58079
+ {
58080
+ onClick: handleLeaderboardClick,
58081
+ className: leaderboardButtonClasses,
58082
+ "aria-label": "Leaderboard",
58083
+ tabIndex: 0,
58084
+ role: "tab",
58085
+ "aria-selected": isPathActive("/leaderboard"),
58086
+ children: [
58087
+ /* @__PURE__ */ jsx(TrophyIcon, { className: "w-5 h-5 mb-1" }),
58088
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Leaders" })
58089
+ ]
58090
+ }
58091
+ ),
58092
+ canAccessPath("/kpis") && /* @__PURE__ */ jsxs(
58093
+ "button",
58094
+ {
58095
+ onClick: handleKPIsClick,
58096
+ className: kpisButtonClasses,
58097
+ "aria-label": "Lines",
58098
+ tabIndex: 0,
58099
+ role: "tab",
58100
+ "aria-selected": isPathActive("/kpis"),
58101
+ children: [
58102
+ /* @__PURE__ */ jsx(ChartBarIcon, { className: "w-5 h-5 mb-1" }),
58103
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Lines" })
58104
+ ]
58105
+ }
58106
+ ),
58107
+ canAccessPath("/improvement-center") && /* @__PURE__ */ jsxs(
58108
+ "button",
58109
+ {
58110
+ onClick: handleImprovementClick,
58111
+ className: improvementButtonClasses,
58112
+ "aria-label": "Improvement Center",
58113
+ tabIndex: 0,
58114
+ role: "tab",
58115
+ "aria-selected": isPathActive("/improvement-center"),
58116
+ children: [
58117
+ /* @__PURE__ */ jsx(LightBulbIcon, { className: "w-5 h-5 mb-1" }),
58118
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight text-center", children: "Improve" })
58119
+ ]
58120
+ }
58121
+ ),
58122
+ showSupervisorManagement,
58123
+ skuEnabled && canAccessPath("/skus") && /* @__PURE__ */ jsxs(
58124
+ "button",
58125
+ {
58126
+ onClick: handleSKUsClick,
58127
+ className: skusButtonClasses,
58128
+ "aria-label": "SKU Management",
58129
+ tabIndex: 0,
58130
+ role: "tab",
58131
+ "aria-selected": isPathActive("/skus"),
58132
+ children: [
58133
+ /* @__PURE__ */ jsx(CubeIcon, { className: "w-5 h-5 mb-1" }),
58134
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "SKUs" })
58135
+ ]
58136
+ }
58137
+ ),
58138
+ canAccessPath("/health") && /* @__PURE__ */ jsxs(
58139
+ "button",
58140
+ {
58141
+ onClick: handleHealthClick,
58142
+ className: healthButtonClasses,
58143
+ "aria-label": "System Health",
58144
+ tabIndex: 0,
58145
+ role: "tab",
58146
+ "aria-selected": isPathActive("/health"),
58147
+ children: [
58148
+ /* @__PURE__ */ jsx(HeartIcon, { className: "w-5 h-5 mb-1" }),
58149
+ /* @__PURE__ */ jsx("span", { className: "text-xs sm:text-[10px] font-medium leading-tight", children: "Health" })
58150
+ ]
58151
+ }
58152
+ )
58153
+ ] }) }),
58004
58154
  /* @__PURE__ */ jsx("div", { className: "w-full py-4 px-4 border-t border-gray-100 flex-shrink-0 flex flex-col gap-2", children: settingsItems.length > 0 && /* @__PURE__ */ jsxs(
58005
58155
  "button",
58006
58156
  {
@@ -58037,23 +58187,11 @@ var SideNavBar = memo$1(({
58037
58187
  };
58038
58188
  };
58039
58189
  return /* @__PURE__ */ jsxs("nav", { className: "px-5 py-6", children: [
58040
- canAccessPath("/") && /* @__PURE__ */ jsxs(
58041
- "button",
58042
- {
58043
- onClick: handleMobileNavClick(handleHomeClick),
58044
- className: getMobileButtonClass("/"),
58045
- "aria-label": "Home",
58046
- children: [
58047
- /* @__PURE__ */ jsx(HomeIcon, { className: getIconClass("/") }),
58048
- /* @__PURE__ */ jsx("span", { className: "text-base font-medium", children: "Home" })
58049
- ]
58050
- }
58051
- ),
58052
58190
  showLiveMonitorLink && canAccessPath("/live-monitor") && /* @__PURE__ */ jsxs(
58053
58191
  "button",
58054
58192
  {
58055
58193
  onClick: handleMobileNavClick(handleLiveClick),
58056
- className: `${getMobileButtonClass("/live-monitor")} mt-2`,
58194
+ className: getMobileButtonClass("/live-monitor"),
58057
58195
  "aria-label": "Monitor",
58058
58196
  children: [
58059
58197
  /* @__PURE__ */ jsx(VideoCameraIcon, { className: getIconClass("/live-monitor") }),
@@ -67896,6 +68034,7 @@ var UptimeBottomSection = memo$1(({
67896
68034
  shiftDate,
67897
68035
  timezone,
67898
68036
  elapsedMinutes,
68037
+ shiftBreaks,
67899
68038
  urlDate,
67900
68039
  urlShift,
67901
68040
  navigate
@@ -67983,7 +68122,8 @@ var UptimeBottomSection = memo$1(({
67983
68122
  shiftEnd,
67984
68123
  shiftDate,
67985
68124
  timezone,
67986
- elapsedMinutes
68125
+ elapsedMinutes,
68126
+ shiftBreaks
67987
68127
  }
67988
68128
  ) })
67989
68129
  ] })
@@ -68301,7 +68441,8 @@ var KPIDetailView = ({
68301
68441
  shiftStart: resolvedShiftStart || void 0,
68302
68442
  shiftEnd: resolvedShiftEnd || void 0,
68303
68443
  shiftDate: metric.date,
68304
- timezone: configuredTimezone
68444
+ timezone: configuredTimezone,
68445
+ shiftBreaks: shiftConfig?.shifts?.find((shift) => shift.shiftId === metric.shift_id)?.breaks || []
68305
68446
  }) : null;
68306
68447
  const idleTimeSeconds = isUptimeMode ? hasBackendUptimeSeconds ? metricIdleTimeSeconds ?? 0 : (uptimeSeries2?.idleMinutes || 0) * 60 : 0;
68307
68448
  const activeTimeSeconds = isUptimeMode ? hasBackendUptimeSeconds ? metricActiveTimeSeconds ?? 0 : (uptimeSeries2?.activeMinutes || 0) * 60 : 0;
@@ -68481,6 +68622,10 @@ var KPIDetailView = ({
68481
68622
  end: chartMetrics.shift_end || fallback.end
68482
68623
  };
68483
68624
  }, [chartMetrics?.shift_start, chartMetrics?.shift_end, chartMetrics?.shift_id, resolveShiftTimes]);
68625
+ const resolvedShiftBreaks = useMemo(
68626
+ () => shiftConfig?.shifts?.find((shift) => shift.shiftId === chartMetrics?.shift_id)?.breaks || [],
68627
+ [shiftConfig?.shifts, chartMetrics?.shift_id]
68628
+ );
68484
68629
  const lineSkuBreakdown = useMemo(
68485
68630
  () => resolvedLineInfo?.metrics.sku_breakdown ?? [],
68486
68631
  [resolvedLineInfo]
@@ -68614,7 +68759,8 @@ var KPIDetailView = ({
68614
68759
  shiftEnd: null,
68615
68760
  shiftDate: null,
68616
68761
  timezone: configuredTimezone,
68617
- elapsedMinutes: null
68762
+ elapsedMinutes: null,
68763
+ shiftBreaks: resolvedShiftBreaks
68618
68764
  });
68619
68765
  }
68620
68766
  return buildUptimeSeries({
@@ -68623,9 +68769,10 @@ var KPIDetailView = ({
68623
68769
  shiftEnd: resolvedShiftTimes.end,
68624
68770
  shiftDate: chartMetrics.date,
68625
68771
  timezone: configuredTimezone,
68626
- elapsedMinutes: elapsedShiftMinutes
68772
+ elapsedMinutes: elapsedShiftMinutes,
68773
+ shiftBreaks: resolvedShiftBreaks
68627
68774
  });
68628
- }, [chartMetrics, resolvedShiftTimes.start, resolvedShiftTimes.end, configuredTimezone, elapsedShiftMinutes]);
68775
+ }, [chartMetrics, resolvedShiftTimes.start, resolvedShiftTimes.end, configuredTimezone, elapsedShiftMinutes, resolvedShiftBreaks]);
68629
68776
  const lineUtilizationFromLine = useMemo(() => {
68630
68777
  const efficiencyValue = Number.isFinite(chartMetrics?.avg_efficiency) ? Number(chartMetrics?.avg_efficiency) : null;
68631
68778
  if (efficiencyValue !== null) return efficiencyValue;
@@ -68652,7 +68799,8 @@ var KPIDetailView = ({
68652
68799
  shiftEnd,
68653
68800
  shiftDate,
68654
68801
  timezone: configuredTimezone,
68655
- elapsedMinutes: workspaceElapsedMinutes
68802
+ elapsedMinutes: workspaceElapsedMinutes,
68803
+ shiftBreaks: resolvedShiftBreaks
68656
68804
  });
68657
68805
  let activeMinutes = uptimeSeries2.activeMinutes;
68658
68806
  let idleMinutes = uptimeSeries2.idleMinutes;
@@ -68664,7 +68812,12 @@ var KPIDetailView = ({
68664
68812
  );
68665
68813
  const idleTimeValue = workspace.idle_time;
68666
68814
  const hasIdleTimeValue = Number.isFinite(idleTimeValue);
68667
- const fallbackDuration = workspaceElapsedMinutes ?? shiftMinutes;
68815
+ const fallbackDuration = getBreakExcludedShiftMinutes({
68816
+ shiftStart,
68817
+ shiftEnd,
68818
+ elapsedMinutes: workspaceElapsedMinutes,
68819
+ shiftBreaks: resolvedShiftBreaks
68820
+ }) ?? workspaceElapsedMinutes ?? shiftMinutes;
68668
68821
  if (!hasIdleHourlyPayload && hasIdleTimeValue && idleTimeValue > 0 && fallbackDuration > 0) {
68669
68822
  const idleSeconds = Number(idleTimeValue);
68670
68823
  const idleFromAggregate = Math.min(Math.max(idleSeconds / 60, 0), fallbackDuration);
@@ -68694,7 +68847,8 @@ var KPIDetailView = ({
68694
68847
  resolvedShiftTimes.end,
68695
68848
  chartMetrics?.date,
68696
68849
  configuredTimezone,
68697
- isCurrentShiftView
68850
+ isCurrentShiftView,
68851
+ resolvedShiftBreaks
68698
68852
  ]);
68699
68853
  const lineUptimeStats = useMemo(() => {
68700
68854
  if (!isUptimeMode) {
@@ -69381,6 +69535,7 @@ var KPIDetailView = ({
69381
69535
  shiftDate: chartMetrics?.date,
69382
69536
  timezone: configuredTimezone,
69383
69537
  elapsedMinutes: elapsedShiftMinutes,
69538
+ shiftBreaks: resolvedShiftBreaks,
69384
69539
  urlDate,
69385
69540
  urlShift,
69386
69541
  navigate
@@ -69495,6 +69650,7 @@ var KPIDetailView = ({
69495
69650
  shiftDate: chartMetrics?.date,
69496
69651
  timezone: configuredTimezone,
69497
69652
  elapsedMinutes: elapsedShiftMinutes,
69653
+ shiftBreaks: resolvedShiftBreaks,
69498
69654
  urlDate,
69499
69655
  urlShift,
69500
69656
  navigate
@@ -69601,6 +69757,19 @@ var formatDateKey2 = (dateKey, timezone, options) => {
69601
69757
  return dateKey;
69602
69758
  }
69603
69759
  };
69760
+ var getFirstName = (displayName) => {
69761
+ const trimmedName = displayName.trim();
69762
+ if (!trimmedName) return "";
69763
+ return trimmedName.split(/\s+/)[0];
69764
+ };
69765
+ var formatSupervisorFirstNames = (supervisors, fallbackSupervisorNames) => {
69766
+ const firstNames = supervisors.map((supervisor) => getFirstName(supervisor.displayName)).filter((name) => name.length > 0);
69767
+ if (firstNames.length > 0) {
69768
+ return Array.from(new Set(firstNames)).join(", ");
69769
+ }
69770
+ const fallbackFirstNames = fallbackSupervisorNames.flatMap((names) => names.split(",")).map(getFirstName).filter((name) => name.length > 0);
69771
+ return fallbackFirstNames.length > 0 ? Array.from(new Set(fallbackFirstNames)).join(", ") : "Unassigned";
69772
+ };
69604
69773
  var LeaderboardCountdown = ({ targetDate, format: format10, finishedLabel = "Finished", placeholder = "--", onFinished }) => {
69605
69774
  const [time2, setTime] = useState("");
69606
69775
  const hasFinishedRef = useRef(false);
@@ -69726,7 +69895,7 @@ var LinesLeaderboard = ({
69726
69895
  });
69727
69896
  const supervisors = Array.from(supervisorByUserId.values());
69728
69897
  const primarySupervisor = supervisors[0];
69729
- const supervisorName = supervisors.length > 1 ? `${supervisors.length} supervisors` : primarySupervisor?.displayName || fallbackSupervisorNames[0] || "Unassigned";
69898
+ const supervisorName = formatSupervisorFirstNames(supervisors, fallbackSupervisorNames);
69730
69899
  const supervisorImage = primarySupervisor?.profilePhotoUrl || null;
69731
69900
  return {
69732
69901
  ...row,
@@ -69986,21 +70155,49 @@ var LinesLeaderboard = ({
69986
70155
  ] }) }) }) })
69987
70156
  ] });
69988
70157
  };
70158
+ var SIGNAL_PILL_STYLES = {
70159
+ stable: {
70160
+ container: "bg-emerald-100 text-emerald-700 border border-emerald-200",
70161
+ dot: "bg-emerald-500"
70162
+ },
70163
+ warning: {
70164
+ container: "bg-amber-100 text-amber-700 border border-amber-200",
70165
+ dot: "bg-amber-500"
70166
+ },
70167
+ attention: {
70168
+ container: "bg-red-100 text-red-700 border border-red-200",
70169
+ dot: "bg-red-500"
70170
+ }
70171
+ };
70172
+ var KpiSignalPill = ({ signal, efficiencyLegend }) => {
70173
+ const status = getKpiSignalStatus(signal, efficiencyLegend);
70174
+ const label = getKpiSignalLabel(signal, efficiencyLegend);
70175
+ if (!status || !label) return null;
70176
+ const styles2 = SIGNAL_PILL_STYLES[status];
70177
+ return /* @__PURE__ */ jsxs(
70178
+ "div",
70179
+ {
70180
+ className: `flex items-center gap-1.5 px-2.5 sm:px-3 py-1 sm:py-1.5 rounded-full text-xs font-medium flex-shrink-0 ${styles2.container}`,
70181
+ style: { minWidth: "fit-content" },
70182
+ children: [
70183
+ /* @__PURE__ */ jsx("div", { className: `w-2 h-2 rounded-full ${styles2.dot} animate-pulse` }),
70184
+ /* @__PURE__ */ jsx("span", { children: label })
70185
+ ]
70186
+ }
70187
+ );
70188
+ };
69989
70189
  var LineCard = ({
69990
70190
  line,
69991
70191
  kpis,
69992
70192
  isLoading,
69993
70193
  error,
69994
70194
  onClick,
70195
+ efficiencyLegend,
69995
70196
  supervisorEnabled = false,
69996
70197
  supervisorName,
69997
70198
  supervisors
69998
70199
  }) => {
69999
70200
  const isUptimeLine = (line.monitoring_mode ?? "output") === "uptime";
70000
- const isOnTrack = React144__default.useMemo(() => {
70001
- if (!kpis) return null;
70002
- return isEfficiencyOnTrack(kpis.efficiency.value);
70003
- }, [kpis]);
70004
70201
  return /* @__PURE__ */ jsxs(
70005
70202
  motion.div,
70006
70203
  {
@@ -70072,10 +70269,7 @@ var LineCard = ({
70072
70269
  ] })
70073
70270
  ] })
70074
70271
  ] }),
70075
- !isUptimeLine && kpis && isOnTrack !== null && /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1.5 px-2.5 sm:px-3 py-1 sm:py-1.5 rounded-full text-xs font-medium flex-shrink-0 ${isOnTrack ? "bg-emerald-100 text-emerald-700 border border-emerald-200" : "bg-red-100 text-red-700 border border-red-200"}`, style: { minWidth: "fit-content" }, children: [
70076
- /* @__PURE__ */ jsx("div", { className: `w-2 h-2 rounded-full ${isOnTrack ? "bg-emerald-500" : "bg-red-500"} animate-pulse` }),
70077
- /* @__PURE__ */ jsx("span", { children: isOnTrack ? "On Track" : "Behind" })
70078
- ] })
70272
+ !isUptimeLine && kpis && /* @__PURE__ */ jsx(KpiSignalPill, { signal: kpis.lineSignal, efficiencyLegend })
70079
70273
  ] }) }),
70080
70274
  isLoading && !kpis && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
70081
70275
  /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
@@ -70143,12 +70337,9 @@ var KpiGroupCard = ({
70143
70337
  isLoading,
70144
70338
  error,
70145
70339
  isUptimeMode,
70340
+ efficiencyLegend,
70146
70341
  onClick
70147
70342
  }) => {
70148
- const isOnTrack = React144__default.useMemo(() => {
70149
- if (!kpis) return null;
70150
- return isEfficiencyOnTrack(kpis.efficiency.value);
70151
- }, [kpis]);
70152
70343
  const outputTarget = Number(kpis?.outputProgress?.target ?? 0);
70153
70344
  const outputCurrent = Number(kpis?.outputProgress?.current ?? 0);
70154
70345
  const progressPercent = outputTarget > 0 ? Math.min(outputCurrent / outputTarget * 100, 100) : 0;
@@ -70172,10 +70363,7 @@ var KpiGroupCard = ({
70172
70363
  ),
70173
70364
  /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs font-medium text-gray-500", children: subtitle })
70174
70365
  ] }),
70175
- !isUptimeMode && kpis && isOnTrack !== null && /* @__PURE__ */ jsxs("div", { className: `flex items-center gap-1.5 px-2.5 sm:px-3 py-1 sm:py-1.5 rounded-full text-xs font-medium flex-shrink-0 ${isOnTrack ? "bg-emerald-100 text-emerald-700 border border-emerald-200" : "bg-red-100 text-red-700 border border-red-200"}`, style: { minWidth: "fit-content" }, children: [
70176
- /* @__PURE__ */ jsx("div", { className: `w-2 h-2 rounded-full ${isOnTrack ? "bg-emerald-500" : "bg-red-500"} animate-pulse` }),
70177
- /* @__PURE__ */ jsx("span", { children: isOnTrack ? "On Track" : "Behind" })
70178
- ] })
70366
+ !isUptimeMode && kpis && /* @__PURE__ */ jsx(KpiSignalPill, { signal: kpis.lineSignal, efficiencyLegend })
70179
70367
  ] }) }),
70180
70368
  isLoading && !kpis && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
70181
70369
  /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
@@ -70492,7 +70680,8 @@ var KPIsOverviewView = ({
70492
70680
  const {
70493
70681
  lineMetrics,
70494
70682
  isLoading: metricsLoading,
70495
- error: metricsError
70683
+ error: metricsError,
70684
+ efficiencyLegend
70496
70685
  } = useDashboardMetrics({
70497
70686
  lineId: factoryViewId,
70498
70687
  userAccessibleLineIds: metricsLineIds
@@ -70836,7 +71025,11 @@ var KPIsOverviewView = ({
70836
71025
  trackProps.output_current = kpis.outputProgress?.current;
70837
71026
  trackProps.output_target = kpis.outputProgress?.target;
70838
71027
  trackProps.underperforming_workers = kpis.underperformingWorkers?.current;
70839
- trackProps.status = isEfficiencyOnTrack(kpis.efficiency?.value) ? "On Track" : "Behind";
71028
+ const signalLabel = getKpiSignalLabel(kpis.lineSignal, efficiencyLegend);
71029
+ if (signalLabel) {
71030
+ trackProps.status = signalLabel;
71031
+ trackProps.signal_source = kpis.lineSignal?.source ?? null;
71032
+ }
70840
71033
  }
70841
71034
  trackCoreEvent("Line Card Clicked", trackProps);
70842
71035
  if (activeTab === "leaderboard" && timeRange === "today" && isHistoricalLeaderboardDaily) {
@@ -70922,6 +71115,7 @@ var KPIsOverviewView = ({
70922
71115
  isLoading: metricsLoading,
70923
71116
  error: metricsError,
70924
71117
  onClick: (kpis) => handleLineClick(line, kpis),
71118
+ efficiencyLegend,
70925
71119
  supervisorEnabled,
70926
71120
  supervisorName: supervisorNamesByLineId.get(line.id) || null,
70927
71121
  supervisors: supervisorsByLineId?.get(line.id)
@@ -70943,6 +71137,7 @@ var KPIsOverviewView = ({
70943
71137
  isLoading: metricsLoading,
70944
71138
  error: metricsError,
70945
71139
  isUptimeMode: viewType === "machine",
71140
+ efficiencyLegend,
70946
71141
  onClick
70947
71142
  },
70948
71143
  key
@@ -76980,6 +77175,10 @@ var WorkspaceDetailView = ({
76980
77175
  timezone
76981
77176
  });
76982
77177
  }, [isCurrentShiftView, workspace?.shift_start, workspace?.shift_end, idleClipDate, timezone]);
77178
+ const workspaceShiftBreaks = useMemo(
77179
+ () => shiftConfig?.shifts?.find((shift2) => shift2.shiftId === workspace?.shift_id)?.breaks || [],
77180
+ [shiftConfig?.shifts, workspace?.shift_id]
77181
+ );
76983
77182
  const uptimeSeries = useMemo(
76984
77183
  () => buildUptimeSeries({
76985
77184
  idleTimeHourly: workspace?.idle_time_hourly,
@@ -76987,17 +77186,26 @@ var WorkspaceDetailView = ({
76987
77186
  shiftEnd: workspace?.shift_end,
76988
77187
  shiftDate: idleClipDate,
76989
77188
  timezone,
76990
- elapsedMinutes: elapsedShiftMinutes
77189
+ elapsedMinutes: elapsedShiftMinutes,
77190
+ shiftBreaks: workspaceShiftBreaks
76991
77191
  }),
76992
- [workspace?.idle_time_hourly, workspace?.shift_start, workspace?.shift_end, idleClipDate, timezone, elapsedShiftMinutes]
77192
+ [workspace?.idle_time_hourly, workspace?.shift_start, workspace?.shift_end, idleClipDate, timezone, elapsedShiftMinutes, workspaceShiftBreaks]
76993
77193
  );
76994
77194
  const uptimePieData = useMemo(() => {
76995
77195
  if (!isUptimeMode) return [];
76996
77196
  let activeMinutes = uptimeSeries.activeMinutes;
76997
77197
  let idleMinutes = uptimeSeries.idleMinutes;
76998
77198
  let totalMinutes = uptimeSeries.availableMinutes;
76999
- const fallbackDuration = elapsedShiftMinutes ?? shiftDurationMinutes;
77000
- if (!uptimeSeries.hasData && fallbackDuration !== null && fallbackDuration !== void 0) {
77199
+ const fallbackDuration = getBreakExcludedShiftMinutes({
77200
+ shiftStart: workspace?.shift_start,
77201
+ shiftEnd: workspace?.shift_end,
77202
+ elapsedMinutes: elapsedShiftMinutes,
77203
+ shiftBreaks: workspaceShiftBreaks
77204
+ }) ?? elapsedShiftMinutes ?? shiftDurationMinutes;
77205
+ const hasIdleHourlyPayload = Boolean(
77206
+ workspace?.idle_time_hourly && typeof workspace.idle_time_hourly === "object" && Object.keys(workspace.idle_time_hourly).length > 0
77207
+ );
77208
+ if (!uptimeSeries.hasData && !hasIdleHourlyPayload && fallbackDuration !== null && fallbackDuration !== void 0) {
77001
77209
  const idleSeconds = Number(workspace?.idle_time || 0);
77002
77210
  const idleFromAggregate = Math.min(Math.max(Math.round(idleSeconds / 60), 0), fallbackDuration);
77003
77211
  const activeFromAggregate = Math.max(fallbackDuration - idleFromAggregate, 0);
@@ -77010,7 +77218,7 @@ var WorkspaceDetailView = ({
77010
77218
  { name: "Productive", value: activeMinutes },
77011
77219
  { name: "Idle", value: idleMinutes }
77012
77220
  ];
77013
- }, [isUptimeMode, uptimeSeries, shiftDurationMinutes, elapsedShiftMinutes, workspace?.idle_time]);
77221
+ }, [isUptimeMode, uptimeSeries, shiftDurationMinutes, elapsedShiftMinutes, workspace?.idle_time, workspace?.shift_start, workspace?.shift_end, workspaceShiftBreaks]);
77014
77222
  const overviewTabLabel = isUptimeMode ? "Utilization" : "Efficiency";
77015
77223
  const idleClipFetchEnabled = Boolean(
77016
77224
  workspaceId && idleClipDate && idleClipShiftId !== void 0 && activeTab === "overview" && idleTimeVlmEnabled && isOutputLayout
@@ -77489,7 +77697,8 @@ var WorkspaceDetailView = ({
77489
77697
  shiftEnd: workspace.shift_end,
77490
77698
  shiftDate: idleClipDate,
77491
77699
  timezone,
77492
- elapsedMinutes: elapsedShiftMinutes
77700
+ elapsedMinutes: elapsedShiftMinutes,
77701
+ shiftBreaks: workspaceShiftBreaks
77493
77702
  }
77494
77703
  ) : isAssemblyCycleLayout ? shouldShowCycleTimeUnavailableState ? cycleTimeUnavailableView : shouldShowCycleTimeChart ? /* @__PURE__ */ jsx(
77495
77704
  CycleTimeOverTimeChart,
@@ -77642,7 +77851,8 @@ var WorkspaceDetailView = ({
77642
77851
  shiftEnd: workspace.shift_end,
77643
77852
  shiftDate: idleClipDate,
77644
77853
  timezone,
77645
- elapsedMinutes: elapsedShiftMinutes
77854
+ elapsedMinutes: elapsedShiftMinutes,
77855
+ shiftBreaks: workspaceShiftBreaks
77646
77856
  }
77647
77857
  ) : isAssemblyCycleLayout ? shouldShowCycleTimeUnavailableState ? cycleTimeUnavailableView : shouldShowCycleTimeChart ? /* @__PURE__ */ jsx(
77648
77858
  CycleTimeOverTimeChart,
@@ -87006,4 +87216,4 @@ var RecentFlowSnapshotGrid = ({
87006
87216
  );
87007
87217
  };
87008
87218
 
87009
- 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, RecentFlowSnapshotGrid, RegistryProvider, RoleBadge, S3ClipsSupabaseService as S3ClipsService, S3Service, SENTRY_HANDLED_EVENT_SESSION_LIMIT, SENTRY_HANDLED_EVENT_WINDOW_MS, SENTRY_QUOTA_STORAGE_KEY, 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, addSentryBreadcrumb, aggregateKPIsFromLineMetricsRows, alertsService, apiUtils, areAllLinesOnSameShift, authCoreService, authOTPService, authRateLimitService, awardsService, buildDateKey, buildKPIsFromLineMetricsRow, buildKpiLineHierarchy, buildLineLeaderboardRows, buildLineSkuBreakdown, 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, combineLineMetricsRows, countRealSkus, createDefaultKPIs, createInvitationService, createLinesService, createSessionTracker, createStorageService, createStreamProxyHandler, createSupabaseClient, createSupervisorService, createThrottledReload, createUserManagementService, createUserService, dashboardService, deleteThread, fetchIdleTimeReasons, fetchLineDummySkuId, fetchLineSkuCatalog, filterDataByDateKeyRange, filterRealSkuBreakdown, 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, getDateKeyFromValue, getDayDateKey, 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, isRealSku, isRecentFlowVideoGridMetricMode, isSafari, isSupervisorRole, isTransitionPeriod, isUrlPermanentlyFailed, isValidFactoryViewConfiguration, isValidLineInfoPayload, isValidPrefetchParams, isValidPrefetchStatus, isValidWorkspaceDetailedMetricsPayload, isValidWorkspaceMetricsPayload, isWipGatedVideoGridMetricMode, isWorkspaceDisplayNamesLoaded, isWorkspaceDisplayNamesLoading, lineLeaderboardService, linesService, mergeWithDefaultConfig, migrateLegacyConfiguration, normalizeActionFamily, normalizeDateKeyRange, normalizeDateKeyRangeUnbounded, normalizeRoleLevel, normalizeVideoGridMetricMode, optifyeAgentClient, parseDateKeyToDate, parseS3Uri, pickPreferredLineMetricsRow, preInitializeWorkspaceDisplayNames, preloadS3Video, preloadS3VideoUrl, preloadS3VideosUrl, preloadVideoUrl, preloadVideosUrl, qualityService, realtimeService, refreshWorkspaceDisplayNames, resetCoreMixpanel, resetFailedUrl, resetSentryQuotaForTests, resetSubscriptionManager, resolveDefaultSkuId, resolveLiveSkuId, s3VideoPreloader, selectPreferredLineMetricsRow, 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 };
87219
+ 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, KPI_SIGNAL_LABELS, 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, RecentFlowSnapshotGrid, RegistryProvider, RoleBadge, S3ClipsSupabaseService as S3ClipsService, S3Service, SENTRY_HANDLED_EVENT_SESSION_LIMIT, SENTRY_HANDLED_EVENT_WINDOW_MS, SENTRY_QUOTA_STORAGE_KEY, 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, addSentryBreadcrumb, aggregateKPIsFromLineMetricsRows, aggregateLineSignals, alertsService, apiUtils, areAllLinesOnSameShift, authCoreService, authOTPService, authRateLimitService, awardsService, buildDateKey, buildKPIsFromLineMetricsRow, buildKpiLineHierarchy, buildLineLeaderboardRows, buildLineSkuBreakdown, 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, combineLineMetricsRows, countRealSkus, createDefaultKPIs, createInvitationService, createLinesService, createSessionTracker, createStorageService, createStreamProxyHandler, createSupabaseClient, createSupervisorService, createThrottledReload, createUserManagementService, createUserService, dashboardService, deleteThread, fetchIdleTimeReasons, fetchLineDummySkuId, fetchLineSkuCatalog, filterDataByDateKeyRange, filterRealSkuBreakdown, 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, getDateKeyFromValue, getDayDateKey, getDaysDifferenceInZone, getDefaultCameraStreamUrl, getDefaultLineId, getDefaultTabForWorkspace, getInitials, getKpiSignalLabel, getKpiSignalStatus, 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, isRealSku, isRecentFlowVideoGridMetricMode, isSafari, isSupervisorRole, isTransitionPeriod, isUrlPermanentlyFailed, isValidFactoryViewConfiguration, isValidLineInfoPayload, isValidPrefetchParams, isValidPrefetchStatus, isValidWorkspaceDetailedMetricsPayload, isValidWorkspaceMetricsPayload, isWipGatedVideoGridMetricMode, isWorkspaceDisplayNamesLoaded, isWorkspaceDisplayNamesLoading, lineLeaderboardService, linesService, mergeWithDefaultConfig, migrateLegacyConfiguration, normalizeActionFamily, normalizeDateKeyRange, normalizeDateKeyRangeUnbounded, normalizeRoleLevel, normalizeVideoGridMetricMode, optifyeAgentClient, parseDateKeyToDate, parseS3Uri, pickPreferredLineMetricsRow, preInitializeWorkspaceDisplayNames, preloadS3Video, preloadS3VideoUrl, preloadS3VideosUrl, preloadVideoUrl, preloadVideosUrl, qualityService, realtimeService, refreshWorkspaceDisplayNames, resetCoreMixpanel, resetFailedUrl, resetSentryQuotaForTests, resetSubscriptionManager, resolveDefaultSkuId, resolveLiveSkuId, s3VideoPreloader, selectPreferredLineMetricsRow, 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 };