@optifye/dashboard-core 6.11.29 → 6.11.31
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.css +6 -30
- package/dist/index.js +101 -243
- package/dist/index.mjs +101 -243
- package/package.json +1 -1
package/dist/index.css
CHANGED
|
@@ -447,10 +447,6 @@ body {
|
|
|
447
447
|
left: -0.125rem;
|
|
448
448
|
right: -0.125rem;
|
|
449
449
|
}
|
|
450
|
-
.inset-x-0 {
|
|
451
|
-
left: 0px;
|
|
452
|
-
right: 0px;
|
|
453
|
-
}
|
|
454
450
|
.inset-y-0 {
|
|
455
451
|
top: 0px;
|
|
456
452
|
bottom: 0px;
|
|
@@ -665,9 +661,6 @@ body {
|
|
|
665
661
|
.z-\[100\] {
|
|
666
662
|
z-index: 100;
|
|
667
663
|
}
|
|
668
|
-
.z-\[1\] {
|
|
669
|
-
z-index: 1;
|
|
670
|
-
}
|
|
671
664
|
.z-\[60\] {
|
|
672
665
|
z-index: 60;
|
|
673
666
|
}
|
|
@@ -1148,6 +1141,9 @@ body {
|
|
|
1148
1141
|
.max-h-48 {
|
|
1149
1142
|
max-height: 12rem;
|
|
1150
1143
|
}
|
|
1144
|
+
.max-h-52 {
|
|
1145
|
+
max-height: 13rem;
|
|
1146
|
+
}
|
|
1151
1147
|
.max-h-56 {
|
|
1152
1148
|
max-height: 14rem;
|
|
1153
1149
|
}
|
|
@@ -1157,6 +1153,9 @@ body {
|
|
|
1157
1153
|
.max-h-64 {
|
|
1158
1154
|
max-height: 16rem;
|
|
1159
1155
|
}
|
|
1156
|
+
.max-h-72 {
|
|
1157
|
+
max-height: 18rem;
|
|
1158
|
+
}
|
|
1160
1159
|
.max-h-\[--radix-select-content-available-height\] {
|
|
1161
1160
|
max-height: var(--radix-select-content-available-height);
|
|
1162
1161
|
}
|
|
@@ -1813,9 +1812,6 @@ body {
|
|
|
1813
1812
|
.cursor-default {
|
|
1814
1813
|
cursor: default;
|
|
1815
1814
|
}
|
|
1816
|
-
.cursor-grab {
|
|
1817
|
-
cursor: grab;
|
|
1818
|
-
}
|
|
1819
1815
|
.cursor-help {
|
|
1820
1816
|
cursor: help;
|
|
1821
1817
|
}
|
|
@@ -4273,9 +4269,6 @@ body {
|
|
|
4273
4269
|
.font-extrabold {
|
|
4274
4270
|
font-weight: 800;
|
|
4275
4271
|
}
|
|
4276
|
-
.font-light {
|
|
4277
|
-
font-weight: 300;
|
|
4278
|
-
}
|
|
4279
4272
|
.font-medium {
|
|
4280
4273
|
font-weight: 500;
|
|
4281
4274
|
}
|
|
@@ -4871,14 +4864,6 @@ body {
|
|
|
4871
4864
|
var(--tw-ring-shadow, 0 0 #0000),
|
|
4872
4865
|
var(--tw-shadow);
|
|
4873
4866
|
}
|
|
4874
|
-
.shadow-\[0_8px_30px_rgba\(0\,0\,0\,0\.08\)\,0_2px_8px_rgba\(0\,0\,0\,0\.04\)\] {
|
|
4875
|
-
--tw-shadow: 0 8px 30px rgba(0,0,0,0.08),0 2px 8px rgba(0,0,0,0.04);
|
|
4876
|
-
--tw-shadow-colored: 0 8px 30px var(--tw-shadow-color), 0 2px 8px var(--tw-shadow-color);
|
|
4877
|
-
box-shadow:
|
|
4878
|
-
var(--tw-ring-offset-shadow, 0 0 #0000),
|
|
4879
|
-
var(--tw-ring-shadow, 0 0 #0000),
|
|
4880
|
-
var(--tw-shadow);
|
|
4881
|
-
}
|
|
4882
4867
|
.shadow-inner {
|
|
4883
4868
|
--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
|
|
4884
4869
|
--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);
|
|
@@ -6101,9 +6086,6 @@ input[type=range]:active::-moz-range-thumb {
|
|
|
6101
6086
|
--tw-scale-y: 0.99;
|
|
6102
6087
|
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
|
|
6103
6088
|
}
|
|
6104
|
-
.active\:cursor-grabbing:active {
|
|
6105
|
-
cursor: grabbing;
|
|
6106
|
-
}
|
|
6107
6089
|
.active\:bg-blue-800:active {
|
|
6108
6090
|
--tw-bg-opacity: 1;
|
|
6109
6091
|
background-color: rgb(30 64 175 / var(--tw-bg-opacity, 1));
|
|
@@ -6311,9 +6293,6 @@ input[type=range]:active::-moz-range-thumb {
|
|
|
6311
6293
|
.sm\:right-4 {
|
|
6312
6294
|
right: 1rem;
|
|
6313
6295
|
}
|
|
6314
|
-
.sm\:right-auto {
|
|
6315
|
-
right: auto;
|
|
6316
|
-
}
|
|
6317
6296
|
.sm\:top-0 {
|
|
6318
6297
|
top: 0px;
|
|
6319
6298
|
}
|
|
@@ -6507,9 +6486,6 @@ input[type=range]:active::-moz-range-thumb {
|
|
|
6507
6486
|
.sm\:w-\[180px\] {
|
|
6508
6487
|
width: 180px;
|
|
6509
6488
|
}
|
|
6510
|
-
.sm\:w-\[264px\] {
|
|
6511
|
-
width: 264px;
|
|
6512
|
-
}
|
|
6513
6489
|
.sm\:w-\[320px\] {
|
|
6514
6490
|
width: 320px;
|
|
6515
6491
|
}
|
package/dist/index.js
CHANGED
|
@@ -39432,240 +39432,99 @@ var SegmentedTimeInput = ({
|
|
|
39432
39432
|
}
|
|
39433
39433
|
);
|
|
39434
39434
|
};
|
|
39435
|
-
var
|
|
39436
|
-
|
|
39437
|
-
|
|
39438
|
-
|
|
39439
|
-
|
|
39440
|
-
|
|
39441
|
-
|
|
39442
|
-
|
|
39443
|
-
};
|
|
39444
|
-
var ITEM_H = 40;
|
|
39445
|
-
var VISIBLE = 5;
|
|
39446
|
-
var WHEEL_H = ITEM_H * VISIBLE;
|
|
39447
|
-
var PAD = Math.floor(VISIBLE / 2);
|
|
39448
|
-
var ScrollColumn = ({ items, selected, onSelect, width = 56 }) => {
|
|
39449
|
-
const elRef = React142.useRef(null);
|
|
39450
|
-
const suppressRef = React142.useRef(false);
|
|
39451
|
-
const snapTimerRef = React142.useRef(null);
|
|
39452
|
-
const mountedRef = React142.useRef(false);
|
|
39453
|
-
const dragging = React142.useRef(false);
|
|
39454
|
-
const dragStartY = React142.useRef(0);
|
|
39455
|
-
const dragStartScroll = React142.useRef(0);
|
|
39456
|
-
React142.useEffect(() => {
|
|
39457
|
-
injectScrollbarHideCSS();
|
|
39458
|
-
}, []);
|
|
39459
|
-
React142.useEffect(() => {
|
|
39460
|
-
const idx = items.findIndex((i) => i.value === selected);
|
|
39461
|
-
if (idx < 0 || !elRef.current || suppressRef.current) return;
|
|
39462
|
-
const target = idx * ITEM_H;
|
|
39463
|
-
if (!mountedRef.current) {
|
|
39464
|
-
suppressRef.current = true;
|
|
39465
|
-
elRef.current.scrollTop = target;
|
|
39466
|
-
setTimeout(() => {
|
|
39467
|
-
if (elRef.current) elRef.current.scrollTop = target;
|
|
39468
|
-
setTimeout(() => {
|
|
39469
|
-
suppressRef.current = false;
|
|
39470
|
-
mountedRef.current = true;
|
|
39471
|
-
}, 200);
|
|
39472
|
-
}, 30);
|
|
39473
|
-
} else {
|
|
39474
|
-
elRef.current.scrollTo({ top: target, behavior: "smooth" });
|
|
39475
|
-
}
|
|
39476
|
-
}, [selected, items]);
|
|
39477
|
-
const scheduleSnap = React142.useCallback(() => {
|
|
39478
|
-
if (snapTimerRef.current) clearTimeout(snapTimerRef.current);
|
|
39479
|
-
snapTimerRef.current = setTimeout(() => {
|
|
39480
|
-
if (!elRef.current || suppressRef.current) return;
|
|
39481
|
-
const idx = Math.round(elRef.current.scrollTop / ITEM_H);
|
|
39482
|
-
const clamped = Math.max(0, Math.min(items.length - 1, idx));
|
|
39483
|
-
suppressRef.current = true;
|
|
39484
|
-
elRef.current.scrollTo({ top: clamped * ITEM_H, behavior: "smooth" });
|
|
39485
|
-
const item = items[clamped];
|
|
39486
|
-
if (item && item.value !== selected) onSelect(item.value);
|
|
39487
|
-
setTimeout(() => {
|
|
39488
|
-
suppressRef.current = false;
|
|
39489
|
-
}, 150);
|
|
39490
|
-
}, 100);
|
|
39491
|
-
}, [items, selected, onSelect]);
|
|
39492
|
-
const onScroll = React142.useCallback(() => {
|
|
39493
|
-
if (suppressRef.current) return;
|
|
39494
|
-
scheduleSnap();
|
|
39495
|
-
}, [scheduleSnap]);
|
|
39496
|
-
const onMouseDown = React142.useCallback((e) => {
|
|
39497
|
-
dragging.current = true;
|
|
39498
|
-
dragStartY.current = e.clientY;
|
|
39499
|
-
dragStartScroll.current = elRef.current?.scrollTop ?? 0;
|
|
39500
|
-
e.preventDefault();
|
|
39501
|
-
const onMove = (ev) => {
|
|
39502
|
-
if (!dragging.current || !elRef.current) return;
|
|
39503
|
-
const dy = dragStartY.current - ev.clientY;
|
|
39504
|
-
elRef.current.scrollTop = dragStartScroll.current + dy;
|
|
39505
|
-
};
|
|
39506
|
-
const onUp = () => {
|
|
39507
|
-
dragging.current = false;
|
|
39508
|
-
scheduleSnap();
|
|
39509
|
-
document.removeEventListener("mousemove", onMove);
|
|
39510
|
-
document.removeEventListener("mouseup", onUp);
|
|
39511
|
-
};
|
|
39512
|
-
document.addEventListener("mousemove", onMove);
|
|
39513
|
-
document.addEventListener("mouseup", onUp);
|
|
39514
|
-
}, [scheduleSnap]);
|
|
39515
|
-
const onTouchStart = React142.useCallback((e) => {
|
|
39516
|
-
dragging.current = true;
|
|
39517
|
-
dragStartY.current = e.touches[0].clientY;
|
|
39518
|
-
dragStartScroll.current = elRef.current?.scrollTop ?? 0;
|
|
39519
|
-
}, []);
|
|
39520
|
-
const onTouchMove = React142.useCallback((e) => {
|
|
39521
|
-
if (!dragging.current || !elRef.current) return;
|
|
39522
|
-
const dy = dragStartY.current - e.touches[0].clientY;
|
|
39523
|
-
elRef.current.scrollTop = dragStartScroll.current + dy;
|
|
39524
|
-
e.preventDefault();
|
|
39525
|
-
}, []);
|
|
39526
|
-
const onTouchEnd = React142.useCallback(() => {
|
|
39527
|
-
dragging.current = false;
|
|
39528
|
-
scheduleSnap();
|
|
39529
|
-
}, [scheduleSnap]);
|
|
39530
|
-
const handleClick = React142.useCallback((value, idx) => {
|
|
39531
|
-
onSelect(value);
|
|
39532
|
-
if (elRef.current) {
|
|
39533
|
-
suppressRef.current = true;
|
|
39534
|
-
elRef.current.scrollTo({ top: idx * ITEM_H, behavior: "smooth" });
|
|
39535
|
-
setTimeout(() => {
|
|
39536
|
-
suppressRef.current = false;
|
|
39537
|
-
}, 250);
|
|
39435
|
+
var generateTimeSlots = () => {
|
|
39436
|
+
const slots = [];
|
|
39437
|
+
for (let hour = 0; hour < 24; hour++) {
|
|
39438
|
+
for (let minute = 0; minute < 60; minute += 5) {
|
|
39439
|
+
const time24 = `${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}`;
|
|
39440
|
+
const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
|
|
39441
|
+
const ampm = hour < 12 ? "AM" : "PM";
|
|
39442
|
+
const time12 = `${hour12}:${minute.toString().padStart(2, "0")} ${ampm}`;
|
|
39443
|
+
slots.push({ value: time24, label: time12 });
|
|
39538
39444
|
}
|
|
39539
|
-
}
|
|
39540
|
-
return
|
|
39541
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39542
|
-
"div",
|
|
39543
|
-
{
|
|
39544
|
-
className: "absolute left-1 right-1 rounded-lg bg-blue-50/80 border border-blue-200/60 pointer-events-none z-0",
|
|
39545
|
-
style: { top: PAD * ITEM_H, height: ITEM_H }
|
|
39546
|
-
}
|
|
39547
|
-
),
|
|
39548
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39549
|
-
"div",
|
|
39550
|
-
{
|
|
39551
|
-
className: "absolute inset-x-0 top-0 pointer-events-none z-10",
|
|
39552
|
-
style: { height: ITEM_H * 1.8, background: "linear-gradient(to bottom, white 0%, rgba(255,255,255,0.85) 50%, transparent 100%)" }
|
|
39553
|
-
}
|
|
39554
|
-
),
|
|
39555
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39556
|
-
"div",
|
|
39557
|
-
{
|
|
39558
|
-
className: "absolute inset-x-0 bottom-0 pointer-events-none z-10",
|
|
39559
|
-
style: { height: ITEM_H * 1.8, background: "linear-gradient(to top, white 0%, rgba(255,255,255,0.85) 50%, transparent 100%)" }
|
|
39560
|
-
}
|
|
39561
|
-
),
|
|
39562
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
39563
|
-
"div",
|
|
39564
|
-
{
|
|
39565
|
-
ref: elRef,
|
|
39566
|
-
onScroll,
|
|
39567
|
-
onMouseDown,
|
|
39568
|
-
onTouchStart,
|
|
39569
|
-
onTouchMove,
|
|
39570
|
-
onTouchEnd,
|
|
39571
|
-
className: "h-full overflow-y-auto tp-scroll-hide relative z-[1] cursor-grab active:cursor-grabbing",
|
|
39572
|
-
style: { scrollbarWidth: "none", msOverflowStyle: "none" },
|
|
39573
|
-
role: "listbox",
|
|
39574
|
-
children: [
|
|
39575
|
-
Array.from({ length: PAD }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: ITEM_H }, "aria-hidden": true }, `pt-${i}`)),
|
|
39576
|
-
items.map((item, idx) => {
|
|
39577
|
-
const isSel = item.value === selected;
|
|
39578
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
39579
|
-
"div",
|
|
39580
|
-
{
|
|
39581
|
-
onClick: () => handleClick(item.value, idx),
|
|
39582
|
-
className: `flex items-center justify-center transition-all duration-100 ${isSel ? "text-gray-900 font-semibold text-[15px]" : "text-gray-300 text-sm"}`,
|
|
39583
|
-
style: { height: ITEM_H },
|
|
39584
|
-
role: "option",
|
|
39585
|
-
"aria-selected": isSel,
|
|
39586
|
-
children: item.label
|
|
39587
|
-
},
|
|
39588
|
-
item.value
|
|
39589
|
-
);
|
|
39590
|
-
}),
|
|
39591
|
-
Array.from({ length: PAD }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: ITEM_H }, "aria-hidden": true }, `pb-${i}`))
|
|
39592
|
-
]
|
|
39593
|
-
}
|
|
39594
|
-
)
|
|
39595
|
-
] });
|
|
39445
|
+
}
|
|
39446
|
+
return slots;
|
|
39596
39447
|
};
|
|
39597
|
-
var
|
|
39598
|
-
var MINUTES = Array.from({ length: 60 }, (_, i) => ({ value: i, label: pad22(i) }));
|
|
39448
|
+
var TIME_SLOTS = generateTimeSlots();
|
|
39599
39449
|
var TimePopover = ({
|
|
39600
39450
|
hour,
|
|
39601
39451
|
minute,
|
|
39602
39452
|
period,
|
|
39603
|
-
|
|
39604
|
-
|
|
39605
|
-
onPeriodChange,
|
|
39606
|
-
onClose,
|
|
39607
|
-
onNow
|
|
39453
|
+
onTimeChange,
|
|
39454
|
+
onClose
|
|
39608
39455
|
}) => {
|
|
39609
|
-
const
|
|
39456
|
+
const [searchTerm, setSearchTerm] = React142.useState("");
|
|
39457
|
+
const inputRef = React142.useRef(null);
|
|
39458
|
+
const listRef = React142.useRef(null);
|
|
39459
|
+
const selectedValue = to24h(hour, minute, period);
|
|
39460
|
+
React142.useEffect(() => {
|
|
39461
|
+
setTimeout(() => inputRef.current?.focus(), 100);
|
|
39462
|
+
}, []);
|
|
39463
|
+
React142.useEffect(() => {
|
|
39464
|
+
if (!listRef.current) return;
|
|
39465
|
+
const selectedEl = listRef.current.querySelector('[data-selected="true"]');
|
|
39466
|
+
if (selectedEl) {
|
|
39467
|
+
selectedEl.scrollIntoView({ block: "center" });
|
|
39468
|
+
}
|
|
39469
|
+
}, []);
|
|
39470
|
+
const filteredSlots = React142.useMemo(() => {
|
|
39471
|
+
if (!searchTerm) return TIME_SLOTS;
|
|
39472
|
+
const term = searchTerm.toLowerCase().trim();
|
|
39473
|
+
return TIME_SLOTS.filter((slot) => {
|
|
39474
|
+
const label = slot.label.toLowerCase();
|
|
39475
|
+
return label.startsWith(term) || // Handle "05" matching "5:00" — strip leading zero from search
|
|
39476
|
+
label.startsWith(term.replace(/^0+/, "")) || // Handle 24h input like "17" matching "17:00" via the value
|
|
39477
|
+
slot.value.startsWith(term);
|
|
39478
|
+
});
|
|
39479
|
+
}, [searchTerm]);
|
|
39480
|
+
const handleSelect = (timeValue) => {
|
|
39481
|
+
onTimeChange(timeValue);
|
|
39482
|
+
onClose();
|
|
39483
|
+
};
|
|
39484
|
+
const handleKeyDown = (e) => {
|
|
39485
|
+
if (e.key === "Escape") {
|
|
39486
|
+
onClose();
|
|
39487
|
+
} else if (e.key === "Enter") {
|
|
39488
|
+
e.preventDefault();
|
|
39489
|
+
if (filteredSlots.length > 0) {
|
|
39490
|
+
handleSelect(filteredSlots[0].value);
|
|
39491
|
+
}
|
|
39492
|
+
}
|
|
39493
|
+
};
|
|
39610
39494
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
39611
39495
|
"div",
|
|
39612
39496
|
{
|
|
39613
|
-
className: "absolute z-50
|
|
39497
|
+
className: "absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-lg max-h-72 overflow-hidden",
|
|
39614
39498
|
role: "dialog",
|
|
39615
39499
|
"aria-label": "Choose time",
|
|
39616
39500
|
onClick: (e) => e.stopPropagation(),
|
|
39617
39501
|
children: [
|
|
39618
|
-
/* @__PURE__ */ jsxRuntime.
|
|
39619
|
-
|
|
39620
|
-
|
|
39621
|
-
|
|
39622
|
-
|
|
39623
|
-
|
|
39624
|
-
|
|
39625
|
-
|
|
39626
|
-
|
|
39627
|
-
|
|
39628
|
-
|
|
39629
|
-
|
|
39630
|
-
|
|
39631
|
-
|
|
39632
|
-
|
|
39633
|
-
style: { marginTop: bandCenter - 38 },
|
|
39634
|
-
children: ["AM", "PM"].map((p) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
39635
|
-
"button",
|
|
39636
|
-
{
|
|
39637
|
-
type: "button",
|
|
39638
|
-
onClick: () => onPeriodChange(p),
|
|
39639
|
-
className: `w-12 h-8 rounded-lg text-[11px] font-bold tracking-widest transition-all duration-150 ${period === p ? "bg-blue-600 text-white shadow-sm" : "bg-gray-100 text-gray-400 hover:bg-gray-200 hover:text-gray-600"}`,
|
|
39640
|
-
"aria-pressed": period === p,
|
|
39641
|
-
children: p
|
|
39642
|
-
},
|
|
39643
|
-
p
|
|
39644
|
-
))
|
|
39645
|
-
}
|
|
39646
|
-
)
|
|
39647
|
-
] }),
|
|
39648
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-4 border-t border-gray-100" }),
|
|
39649
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
|
|
39650
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39651
|
-
"button",
|
|
39652
|
-
{
|
|
39653
|
-
type: "button",
|
|
39654
|
-
onClick: onNow,
|
|
39655
|
-
className: "text-[13px] font-medium text-blue-600 hover:text-blue-700 transition-colors px-2.5 py-1 rounded-md hover:bg-blue-50",
|
|
39656
|
-
children: "Now"
|
|
39657
|
-
}
|
|
39658
|
-
),
|
|
39659
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
39502
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-2 border-b border-gray-100", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
39503
|
+
"input",
|
|
39504
|
+
{
|
|
39505
|
+
ref: inputRef,
|
|
39506
|
+
type: "text",
|
|
39507
|
+
placeholder: "Search time...",
|
|
39508
|
+
value: searchTerm,
|
|
39509
|
+
onChange: (e) => setSearchTerm(e.target.value),
|
|
39510
|
+
onKeyDown: handleKeyDown,
|
|
39511
|
+
className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
39512
|
+
}
|
|
39513
|
+
) }),
|
|
39514
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { ref: listRef, className: "overflow-y-auto max-h-52", children: filteredSlots.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-3 text-sm text-gray-400 text-center", children: "No matching times" }) : filteredSlots.map((slot) => {
|
|
39515
|
+
const isSelected = slot.value === selectedValue;
|
|
39516
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
39660
39517
|
"button",
|
|
39661
39518
|
{
|
|
39662
39519
|
type: "button",
|
|
39663
|
-
|
|
39664
|
-
|
|
39665
|
-
|
|
39666
|
-
|
|
39667
|
-
|
|
39668
|
-
|
|
39520
|
+
"data-selected": isSelected,
|
|
39521
|
+
onClick: () => handleSelect(slot.value),
|
|
39522
|
+
className: `w-full px-3 py-2 text-left text-sm transition-colors duration-100 ${isSelected ? "bg-blue-50 text-blue-700 font-medium" : "text-gray-700 hover:bg-gray-50"}`,
|
|
39523
|
+
children: slot.label
|
|
39524
|
+
},
|
|
39525
|
+
slot.value
|
|
39526
|
+
);
|
|
39527
|
+
}) })
|
|
39669
39528
|
]
|
|
39670
39529
|
}
|
|
39671
39530
|
);
|
|
@@ -39705,15 +39564,6 @@ var TimePickerDropdown = ({
|
|
|
39705
39564
|
const handlePeriodChange = React142.useCallback((p) => {
|
|
39706
39565
|
emitChange(hour, minute, p);
|
|
39707
39566
|
}, [emitChange, hour, minute]);
|
|
39708
|
-
const handleNow = React142.useCallback(() => {
|
|
39709
|
-
const now4 = /* @__PURE__ */ new Date();
|
|
39710
|
-
const h24 = now4.getHours();
|
|
39711
|
-
const m = now4.getMinutes();
|
|
39712
|
-
const p = h24 >= 12 ? "PM" : "AM";
|
|
39713
|
-
let h12 = h24 % 12;
|
|
39714
|
-
if (h12 === 0) h12 = 12;
|
|
39715
|
-
emitChange(h12, m, p);
|
|
39716
|
-
}, [emitChange]);
|
|
39717
39567
|
const handleSegmentFocus = React142.useCallback((seg) => {
|
|
39718
39568
|
setActiveSegment(seg);
|
|
39719
39569
|
if (!hasValue) {
|
|
@@ -39819,11 +39669,8 @@ var TimePickerDropdown = ({
|
|
|
39819
39669
|
hour,
|
|
39820
39670
|
minute,
|
|
39821
39671
|
period,
|
|
39822
|
-
|
|
39823
|
-
|
|
39824
|
-
onPeriodChange: handlePeriodChange,
|
|
39825
|
-
onClose: () => setIsPopoverOpen(false),
|
|
39826
|
-
onNow: handleNow
|
|
39672
|
+
onTimeChange: onChange,
|
|
39673
|
+
onClose: () => setIsPopoverOpen(false)
|
|
39827
39674
|
}
|
|
39828
39675
|
)
|
|
39829
39676
|
] });
|
|
@@ -40682,7 +40529,18 @@ var FileManagerFilters = ({
|
|
|
40682
40529
|
React142.useEffect(() => {
|
|
40683
40530
|
clipMetadataRef.current = clipMetadata;
|
|
40684
40531
|
}, [clipMetadata]);
|
|
40685
|
-
const
|
|
40532
|
+
const isCategoryExternallyManaged = React142.useCallback((categoryId) => {
|
|
40533
|
+
if (!categoryId) {
|
|
40534
|
+
return false;
|
|
40535
|
+
}
|
|
40536
|
+
if (prefetchedClipMetadata && Array.isArray(prefetchedClipMetadata[categoryId]) && prefetchedClipMetadata[categoryId].length > 0) {
|
|
40537
|
+
return true;
|
|
40538
|
+
}
|
|
40539
|
+
if (activeCategoryLoading !== void 0 && categoryId === activeFilter) {
|
|
40540
|
+
return true;
|
|
40541
|
+
}
|
|
40542
|
+
return false;
|
|
40543
|
+
}, [prefetchedClipMetadata, activeCategoryLoading, activeFilter]);
|
|
40686
40544
|
React142.useEffect(() => {
|
|
40687
40545
|
if (!prefetchedClipMetadata) {
|
|
40688
40546
|
return;
|
|
@@ -41215,11 +41073,11 @@ var FileManagerFilters = ({
|
|
|
41215
41073
|
return newExpanded;
|
|
41216
41074
|
});
|
|
41217
41075
|
const category = categories.find((cat) => cat.id === activeFilter);
|
|
41218
|
-
if (category && !
|
|
41076
|
+
if (category && !isCategoryExternallyManaged(activeFilter) && !clipMetadataRef.current[activeFilter]) {
|
|
41219
41077
|
fetchClipMetadata(activeFilter, 1);
|
|
41220
41078
|
}
|
|
41221
41079
|
}
|
|
41222
|
-
}, [activeFilter,
|
|
41080
|
+
}, [activeFilter, isCategoryExternallyManaged]);
|
|
41223
41081
|
React142.useEffect(() => {
|
|
41224
41082
|
const handleEscape = (e) => {
|
|
41225
41083
|
if (e.key === "Escape") {
|
|
@@ -41245,7 +41103,7 @@ var FileManagerFilters = ({
|
|
|
41245
41103
|
document.body.style.overflow = "unset";
|
|
41246
41104
|
};
|
|
41247
41105
|
}, [showTimeFilterModal, showIdleLabelFilterModal]);
|
|
41248
|
-
const
|
|
41106
|
+
const generateTimeSlots2 = React142.useCallback(() => {
|
|
41249
41107
|
const slots = [];
|
|
41250
41108
|
for (let hour = 0; hour < 24; hour++) {
|
|
41251
41109
|
for (let minute = 0; minute < 60; minute += 15) {
|
|
@@ -41258,7 +41116,7 @@ var FileManagerFilters = ({
|
|
|
41258
41116
|
}
|
|
41259
41117
|
return slots;
|
|
41260
41118
|
}, []);
|
|
41261
|
-
const timeSlots = React142.useMemo(() =>
|
|
41119
|
+
const timeSlots = React142.useMemo(() => generateTimeSlots2(), [generateTimeSlots2]);
|
|
41262
41120
|
const filteredStartSlots = React142.useMemo(
|
|
41263
41121
|
() => timeSlots.filter(
|
|
41264
41122
|
(slot) => slot.label.toLowerCase().includes(startSearchTerm.toLowerCase())
|
|
@@ -41490,14 +41348,14 @@ var FileManagerFilters = ({
|
|
|
41490
41348
|
} else {
|
|
41491
41349
|
newExpanded.add(nodeId);
|
|
41492
41350
|
const category = categories.find((cat) => cat.id === nodeId);
|
|
41493
|
-
if (category && !clipMetadata[nodeId] && !(
|
|
41351
|
+
if (category && !clipMetadata[nodeId] && !isCategoryExternallyManaged(nodeId)) {
|
|
41494
41352
|
console.log(`[FileManager] Fetching clips for expanded category: ${nodeId}`);
|
|
41495
41353
|
fetchClipMetadata(nodeId, 1);
|
|
41496
41354
|
}
|
|
41497
|
-
if (!(
|
|
41355
|
+
if (!isCategoryExternallyManaged(nodeId) && showPercentileCycleFilters && nodeId === "fast-cycles" && (percentileClips["fast-cycles"] || []).length === 0) {
|
|
41498
41356
|
fetchPercentileClips("fast-cycles");
|
|
41499
41357
|
}
|
|
41500
|
-
if (!(
|
|
41358
|
+
if (!isCategoryExternallyManaged(nodeId) && showPercentileCycleFilters && nodeId === "slow-cycles" && (percentileClips["slow-cycles"] || []).length === 0) {
|
|
41501
41359
|
fetchPercentileClips("slow-cycles");
|
|
41502
41360
|
}
|
|
41503
41361
|
}
|
|
@@ -41511,14 +41369,14 @@ var FileManagerFilters = ({
|
|
|
41511
41369
|
} else {
|
|
41512
41370
|
newExpanded.add(node.id);
|
|
41513
41371
|
const category = categories.find((cat) => cat.id === node.id);
|
|
41514
|
-
if (category && !clipMetadata[node.id] && !
|
|
41372
|
+
if (category && !clipMetadata[node.id] && !isCategoryExternallyManaged(node.id)) {
|
|
41515
41373
|
console.log(`[FileManager] Fetching clips for expanded category: ${node.id}`);
|
|
41516
41374
|
fetchClipMetadata(node.id, 1);
|
|
41517
41375
|
}
|
|
41518
|
-
if (!
|
|
41376
|
+
if (!isCategoryExternallyManaged(node.id) && showPercentileCycleFilters && node.id === "fast-cycles" && (percentileClips["fast-cycles"] || []).length === 0) {
|
|
41519
41377
|
fetchPercentileClips("fast-cycles");
|
|
41520
41378
|
}
|
|
41521
|
-
if (!
|
|
41379
|
+
if (!isCategoryExternallyManaged(node.id) && showPercentileCycleFilters && node.id === "slow-cycles" && (percentileClips["slow-cycles"] || []).length === 0) {
|
|
41522
41380
|
fetchPercentileClips("slow-cycles");
|
|
41523
41381
|
}
|
|
41524
41382
|
}
|
|
@@ -43148,7 +43006,7 @@ var BottlenecksContent = ({
|
|
|
43148
43006
|
metadataClips = categoryData.clips.map((clip, index) => ({
|
|
43149
43007
|
id: clip.id,
|
|
43150
43008
|
clipId: clip.id,
|
|
43151
|
-
clip_timestamp: clip.
|
|
43009
|
+
clip_timestamp: clip.creation_timestamp || clip.timestamp,
|
|
43152
43010
|
description: clip.description,
|
|
43153
43011
|
severity: clip.severity,
|
|
43154
43012
|
category: categoryId,
|
package/dist/index.mjs
CHANGED
|
@@ -39403,240 +39403,99 @@ var SegmentedTimeInput = ({
|
|
|
39403
39403
|
}
|
|
39404
39404
|
);
|
|
39405
39405
|
};
|
|
39406
|
-
var
|
|
39407
|
-
|
|
39408
|
-
|
|
39409
|
-
|
|
39410
|
-
|
|
39411
|
-
|
|
39412
|
-
|
|
39413
|
-
|
|
39414
|
-
};
|
|
39415
|
-
var ITEM_H = 40;
|
|
39416
|
-
var VISIBLE = 5;
|
|
39417
|
-
var WHEEL_H = ITEM_H * VISIBLE;
|
|
39418
|
-
var PAD = Math.floor(VISIBLE / 2);
|
|
39419
|
-
var ScrollColumn = ({ items, selected, onSelect, width = 56 }) => {
|
|
39420
|
-
const elRef = useRef(null);
|
|
39421
|
-
const suppressRef = useRef(false);
|
|
39422
|
-
const snapTimerRef = useRef(null);
|
|
39423
|
-
const mountedRef = useRef(false);
|
|
39424
|
-
const dragging = useRef(false);
|
|
39425
|
-
const dragStartY = useRef(0);
|
|
39426
|
-
const dragStartScroll = useRef(0);
|
|
39427
|
-
useEffect(() => {
|
|
39428
|
-
injectScrollbarHideCSS();
|
|
39429
|
-
}, []);
|
|
39430
|
-
useEffect(() => {
|
|
39431
|
-
const idx = items.findIndex((i) => i.value === selected);
|
|
39432
|
-
if (idx < 0 || !elRef.current || suppressRef.current) return;
|
|
39433
|
-
const target = idx * ITEM_H;
|
|
39434
|
-
if (!mountedRef.current) {
|
|
39435
|
-
suppressRef.current = true;
|
|
39436
|
-
elRef.current.scrollTop = target;
|
|
39437
|
-
setTimeout(() => {
|
|
39438
|
-
if (elRef.current) elRef.current.scrollTop = target;
|
|
39439
|
-
setTimeout(() => {
|
|
39440
|
-
suppressRef.current = false;
|
|
39441
|
-
mountedRef.current = true;
|
|
39442
|
-
}, 200);
|
|
39443
|
-
}, 30);
|
|
39444
|
-
} else {
|
|
39445
|
-
elRef.current.scrollTo({ top: target, behavior: "smooth" });
|
|
39446
|
-
}
|
|
39447
|
-
}, [selected, items]);
|
|
39448
|
-
const scheduleSnap = useCallback(() => {
|
|
39449
|
-
if (snapTimerRef.current) clearTimeout(snapTimerRef.current);
|
|
39450
|
-
snapTimerRef.current = setTimeout(() => {
|
|
39451
|
-
if (!elRef.current || suppressRef.current) return;
|
|
39452
|
-
const idx = Math.round(elRef.current.scrollTop / ITEM_H);
|
|
39453
|
-
const clamped = Math.max(0, Math.min(items.length - 1, idx));
|
|
39454
|
-
suppressRef.current = true;
|
|
39455
|
-
elRef.current.scrollTo({ top: clamped * ITEM_H, behavior: "smooth" });
|
|
39456
|
-
const item = items[clamped];
|
|
39457
|
-
if (item && item.value !== selected) onSelect(item.value);
|
|
39458
|
-
setTimeout(() => {
|
|
39459
|
-
suppressRef.current = false;
|
|
39460
|
-
}, 150);
|
|
39461
|
-
}, 100);
|
|
39462
|
-
}, [items, selected, onSelect]);
|
|
39463
|
-
const onScroll = useCallback(() => {
|
|
39464
|
-
if (suppressRef.current) return;
|
|
39465
|
-
scheduleSnap();
|
|
39466
|
-
}, [scheduleSnap]);
|
|
39467
|
-
const onMouseDown = useCallback((e) => {
|
|
39468
|
-
dragging.current = true;
|
|
39469
|
-
dragStartY.current = e.clientY;
|
|
39470
|
-
dragStartScroll.current = elRef.current?.scrollTop ?? 0;
|
|
39471
|
-
e.preventDefault();
|
|
39472
|
-
const onMove = (ev) => {
|
|
39473
|
-
if (!dragging.current || !elRef.current) return;
|
|
39474
|
-
const dy = dragStartY.current - ev.clientY;
|
|
39475
|
-
elRef.current.scrollTop = dragStartScroll.current + dy;
|
|
39476
|
-
};
|
|
39477
|
-
const onUp = () => {
|
|
39478
|
-
dragging.current = false;
|
|
39479
|
-
scheduleSnap();
|
|
39480
|
-
document.removeEventListener("mousemove", onMove);
|
|
39481
|
-
document.removeEventListener("mouseup", onUp);
|
|
39482
|
-
};
|
|
39483
|
-
document.addEventListener("mousemove", onMove);
|
|
39484
|
-
document.addEventListener("mouseup", onUp);
|
|
39485
|
-
}, [scheduleSnap]);
|
|
39486
|
-
const onTouchStart = useCallback((e) => {
|
|
39487
|
-
dragging.current = true;
|
|
39488
|
-
dragStartY.current = e.touches[0].clientY;
|
|
39489
|
-
dragStartScroll.current = elRef.current?.scrollTop ?? 0;
|
|
39490
|
-
}, []);
|
|
39491
|
-
const onTouchMove = useCallback((e) => {
|
|
39492
|
-
if (!dragging.current || !elRef.current) return;
|
|
39493
|
-
const dy = dragStartY.current - e.touches[0].clientY;
|
|
39494
|
-
elRef.current.scrollTop = dragStartScroll.current + dy;
|
|
39495
|
-
e.preventDefault();
|
|
39496
|
-
}, []);
|
|
39497
|
-
const onTouchEnd = useCallback(() => {
|
|
39498
|
-
dragging.current = false;
|
|
39499
|
-
scheduleSnap();
|
|
39500
|
-
}, [scheduleSnap]);
|
|
39501
|
-
const handleClick = useCallback((value, idx) => {
|
|
39502
|
-
onSelect(value);
|
|
39503
|
-
if (elRef.current) {
|
|
39504
|
-
suppressRef.current = true;
|
|
39505
|
-
elRef.current.scrollTo({ top: idx * ITEM_H, behavior: "smooth" });
|
|
39506
|
-
setTimeout(() => {
|
|
39507
|
-
suppressRef.current = false;
|
|
39508
|
-
}, 250);
|
|
39406
|
+
var generateTimeSlots = () => {
|
|
39407
|
+
const slots = [];
|
|
39408
|
+
for (let hour = 0; hour < 24; hour++) {
|
|
39409
|
+
for (let minute = 0; minute < 60; minute += 5) {
|
|
39410
|
+
const time24 = `${hour.toString().padStart(2, "0")}:${minute.toString().padStart(2, "0")}`;
|
|
39411
|
+
const hour12 = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
|
|
39412
|
+
const ampm = hour < 12 ? "AM" : "PM";
|
|
39413
|
+
const time12 = `${hour12}:${minute.toString().padStart(2, "0")} ${ampm}`;
|
|
39414
|
+
slots.push({ value: time24, label: time12 });
|
|
39509
39415
|
}
|
|
39510
|
-
}
|
|
39511
|
-
return
|
|
39512
|
-
/* @__PURE__ */ jsx(
|
|
39513
|
-
"div",
|
|
39514
|
-
{
|
|
39515
|
-
className: "absolute left-1 right-1 rounded-lg bg-blue-50/80 border border-blue-200/60 pointer-events-none z-0",
|
|
39516
|
-
style: { top: PAD * ITEM_H, height: ITEM_H }
|
|
39517
|
-
}
|
|
39518
|
-
),
|
|
39519
|
-
/* @__PURE__ */ jsx(
|
|
39520
|
-
"div",
|
|
39521
|
-
{
|
|
39522
|
-
className: "absolute inset-x-0 top-0 pointer-events-none z-10",
|
|
39523
|
-
style: { height: ITEM_H * 1.8, background: "linear-gradient(to bottom, white 0%, rgba(255,255,255,0.85) 50%, transparent 100%)" }
|
|
39524
|
-
}
|
|
39525
|
-
),
|
|
39526
|
-
/* @__PURE__ */ jsx(
|
|
39527
|
-
"div",
|
|
39528
|
-
{
|
|
39529
|
-
className: "absolute inset-x-0 bottom-0 pointer-events-none z-10",
|
|
39530
|
-
style: { height: ITEM_H * 1.8, background: "linear-gradient(to top, white 0%, rgba(255,255,255,0.85) 50%, transparent 100%)" }
|
|
39531
|
-
}
|
|
39532
|
-
),
|
|
39533
|
-
/* @__PURE__ */ jsxs(
|
|
39534
|
-
"div",
|
|
39535
|
-
{
|
|
39536
|
-
ref: elRef,
|
|
39537
|
-
onScroll,
|
|
39538
|
-
onMouseDown,
|
|
39539
|
-
onTouchStart,
|
|
39540
|
-
onTouchMove,
|
|
39541
|
-
onTouchEnd,
|
|
39542
|
-
className: "h-full overflow-y-auto tp-scroll-hide relative z-[1] cursor-grab active:cursor-grabbing",
|
|
39543
|
-
style: { scrollbarWidth: "none", msOverflowStyle: "none" },
|
|
39544
|
-
role: "listbox",
|
|
39545
|
-
children: [
|
|
39546
|
-
Array.from({ length: PAD }).map((_, i) => /* @__PURE__ */ jsx("div", { style: { height: ITEM_H }, "aria-hidden": true }, `pt-${i}`)),
|
|
39547
|
-
items.map((item, idx) => {
|
|
39548
|
-
const isSel = item.value === selected;
|
|
39549
|
-
return /* @__PURE__ */ jsx(
|
|
39550
|
-
"div",
|
|
39551
|
-
{
|
|
39552
|
-
onClick: () => handleClick(item.value, idx),
|
|
39553
|
-
className: `flex items-center justify-center transition-all duration-100 ${isSel ? "text-gray-900 font-semibold text-[15px]" : "text-gray-300 text-sm"}`,
|
|
39554
|
-
style: { height: ITEM_H },
|
|
39555
|
-
role: "option",
|
|
39556
|
-
"aria-selected": isSel,
|
|
39557
|
-
children: item.label
|
|
39558
|
-
},
|
|
39559
|
-
item.value
|
|
39560
|
-
);
|
|
39561
|
-
}),
|
|
39562
|
-
Array.from({ length: PAD }).map((_, i) => /* @__PURE__ */ jsx("div", { style: { height: ITEM_H }, "aria-hidden": true }, `pb-${i}`))
|
|
39563
|
-
]
|
|
39564
|
-
}
|
|
39565
|
-
)
|
|
39566
|
-
] });
|
|
39416
|
+
}
|
|
39417
|
+
return slots;
|
|
39567
39418
|
};
|
|
39568
|
-
var
|
|
39569
|
-
var MINUTES = Array.from({ length: 60 }, (_, i) => ({ value: i, label: pad22(i) }));
|
|
39419
|
+
var TIME_SLOTS = generateTimeSlots();
|
|
39570
39420
|
var TimePopover = ({
|
|
39571
39421
|
hour,
|
|
39572
39422
|
minute,
|
|
39573
39423
|
period,
|
|
39574
|
-
|
|
39575
|
-
|
|
39576
|
-
onPeriodChange,
|
|
39577
|
-
onClose,
|
|
39578
|
-
onNow
|
|
39424
|
+
onTimeChange,
|
|
39425
|
+
onClose
|
|
39579
39426
|
}) => {
|
|
39580
|
-
const
|
|
39427
|
+
const [searchTerm, setSearchTerm] = useState("");
|
|
39428
|
+
const inputRef = useRef(null);
|
|
39429
|
+
const listRef = useRef(null);
|
|
39430
|
+
const selectedValue = to24h(hour, minute, period);
|
|
39431
|
+
useEffect(() => {
|
|
39432
|
+
setTimeout(() => inputRef.current?.focus(), 100);
|
|
39433
|
+
}, []);
|
|
39434
|
+
useEffect(() => {
|
|
39435
|
+
if (!listRef.current) return;
|
|
39436
|
+
const selectedEl = listRef.current.querySelector('[data-selected="true"]');
|
|
39437
|
+
if (selectedEl) {
|
|
39438
|
+
selectedEl.scrollIntoView({ block: "center" });
|
|
39439
|
+
}
|
|
39440
|
+
}, []);
|
|
39441
|
+
const filteredSlots = useMemo(() => {
|
|
39442
|
+
if (!searchTerm) return TIME_SLOTS;
|
|
39443
|
+
const term = searchTerm.toLowerCase().trim();
|
|
39444
|
+
return TIME_SLOTS.filter((slot) => {
|
|
39445
|
+
const label = slot.label.toLowerCase();
|
|
39446
|
+
return label.startsWith(term) || // Handle "05" matching "5:00" — strip leading zero from search
|
|
39447
|
+
label.startsWith(term.replace(/^0+/, "")) || // Handle 24h input like "17" matching "17:00" via the value
|
|
39448
|
+
slot.value.startsWith(term);
|
|
39449
|
+
});
|
|
39450
|
+
}, [searchTerm]);
|
|
39451
|
+
const handleSelect = (timeValue) => {
|
|
39452
|
+
onTimeChange(timeValue);
|
|
39453
|
+
onClose();
|
|
39454
|
+
};
|
|
39455
|
+
const handleKeyDown = (e) => {
|
|
39456
|
+
if (e.key === "Escape") {
|
|
39457
|
+
onClose();
|
|
39458
|
+
} else if (e.key === "Enter") {
|
|
39459
|
+
e.preventDefault();
|
|
39460
|
+
if (filteredSlots.length > 0) {
|
|
39461
|
+
handleSelect(filteredSlots[0].value);
|
|
39462
|
+
}
|
|
39463
|
+
}
|
|
39464
|
+
};
|
|
39581
39465
|
return /* @__PURE__ */ jsxs(
|
|
39582
39466
|
"div",
|
|
39583
39467
|
{
|
|
39584
|
-
className: "absolute z-50
|
|
39468
|
+
className: "absolute z-50 w-full mt-1 bg-white border border-gray-200 rounded-lg shadow-lg max-h-72 overflow-hidden",
|
|
39585
39469
|
role: "dialog",
|
|
39586
39470
|
"aria-label": "Choose time",
|
|
39587
39471
|
onClick: (e) => e.stopPropagation(),
|
|
39588
39472
|
children: [
|
|
39589
|
-
/* @__PURE__ */
|
|
39590
|
-
|
|
39591
|
-
|
|
39592
|
-
|
|
39593
|
-
|
|
39594
|
-
|
|
39595
|
-
|
|
39596
|
-
|
|
39597
|
-
|
|
39598
|
-
|
|
39599
|
-
|
|
39600
|
-
|
|
39601
|
-
|
|
39602
|
-
|
|
39603
|
-
|
|
39604
|
-
style: { marginTop: bandCenter - 38 },
|
|
39605
|
-
children: ["AM", "PM"].map((p) => /* @__PURE__ */ jsx(
|
|
39606
|
-
"button",
|
|
39607
|
-
{
|
|
39608
|
-
type: "button",
|
|
39609
|
-
onClick: () => onPeriodChange(p),
|
|
39610
|
-
className: `w-12 h-8 rounded-lg text-[11px] font-bold tracking-widest transition-all duration-150 ${period === p ? "bg-blue-600 text-white shadow-sm" : "bg-gray-100 text-gray-400 hover:bg-gray-200 hover:text-gray-600"}`,
|
|
39611
|
-
"aria-pressed": period === p,
|
|
39612
|
-
children: p
|
|
39613
|
-
},
|
|
39614
|
-
p
|
|
39615
|
-
))
|
|
39616
|
-
}
|
|
39617
|
-
)
|
|
39618
|
-
] }),
|
|
39619
|
-
/* @__PURE__ */ jsx("div", { className: "mx-4 border-t border-gray-100" }),
|
|
39620
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2.5", children: [
|
|
39621
|
-
/* @__PURE__ */ jsx(
|
|
39622
|
-
"button",
|
|
39623
|
-
{
|
|
39624
|
-
type: "button",
|
|
39625
|
-
onClick: onNow,
|
|
39626
|
-
className: "text-[13px] font-medium text-blue-600 hover:text-blue-700 transition-colors px-2.5 py-1 rounded-md hover:bg-blue-50",
|
|
39627
|
-
children: "Now"
|
|
39628
|
-
}
|
|
39629
|
-
),
|
|
39630
|
-
/* @__PURE__ */ jsx(
|
|
39473
|
+
/* @__PURE__ */ jsx("div", { className: "p-2 border-b border-gray-100", children: /* @__PURE__ */ jsx(
|
|
39474
|
+
"input",
|
|
39475
|
+
{
|
|
39476
|
+
ref: inputRef,
|
|
39477
|
+
type: "text",
|
|
39478
|
+
placeholder: "Search time...",
|
|
39479
|
+
value: searchTerm,
|
|
39480
|
+
onChange: (e) => setSearchTerm(e.target.value),
|
|
39481
|
+
onKeyDown: handleKeyDown,
|
|
39482
|
+
className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
|
|
39483
|
+
}
|
|
39484
|
+
) }),
|
|
39485
|
+
/* @__PURE__ */ jsx("div", { ref: listRef, className: "overflow-y-auto max-h-52", children: filteredSlots.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-3 py-3 text-sm text-gray-400 text-center", children: "No matching times" }) : filteredSlots.map((slot) => {
|
|
39486
|
+
const isSelected = slot.value === selectedValue;
|
|
39487
|
+
return /* @__PURE__ */ jsx(
|
|
39631
39488
|
"button",
|
|
39632
39489
|
{
|
|
39633
39490
|
type: "button",
|
|
39634
|
-
|
|
39635
|
-
|
|
39636
|
-
|
|
39637
|
-
|
|
39638
|
-
|
|
39639
|
-
|
|
39491
|
+
"data-selected": isSelected,
|
|
39492
|
+
onClick: () => handleSelect(slot.value),
|
|
39493
|
+
className: `w-full px-3 py-2 text-left text-sm transition-colors duration-100 ${isSelected ? "bg-blue-50 text-blue-700 font-medium" : "text-gray-700 hover:bg-gray-50"}`,
|
|
39494
|
+
children: slot.label
|
|
39495
|
+
},
|
|
39496
|
+
slot.value
|
|
39497
|
+
);
|
|
39498
|
+
}) })
|
|
39640
39499
|
]
|
|
39641
39500
|
}
|
|
39642
39501
|
);
|
|
@@ -39676,15 +39535,6 @@ var TimePickerDropdown = ({
|
|
|
39676
39535
|
const handlePeriodChange = useCallback((p) => {
|
|
39677
39536
|
emitChange(hour, minute, p);
|
|
39678
39537
|
}, [emitChange, hour, minute]);
|
|
39679
|
-
const handleNow = useCallback(() => {
|
|
39680
|
-
const now4 = /* @__PURE__ */ new Date();
|
|
39681
|
-
const h24 = now4.getHours();
|
|
39682
|
-
const m = now4.getMinutes();
|
|
39683
|
-
const p = h24 >= 12 ? "PM" : "AM";
|
|
39684
|
-
let h12 = h24 % 12;
|
|
39685
|
-
if (h12 === 0) h12 = 12;
|
|
39686
|
-
emitChange(h12, m, p);
|
|
39687
|
-
}, [emitChange]);
|
|
39688
39538
|
const handleSegmentFocus = useCallback((seg) => {
|
|
39689
39539
|
setActiveSegment(seg);
|
|
39690
39540
|
if (!hasValue) {
|
|
@@ -39790,11 +39640,8 @@ var TimePickerDropdown = ({
|
|
|
39790
39640
|
hour,
|
|
39791
39641
|
minute,
|
|
39792
39642
|
period,
|
|
39793
|
-
|
|
39794
|
-
|
|
39795
|
-
onPeriodChange: handlePeriodChange,
|
|
39796
|
-
onClose: () => setIsPopoverOpen(false),
|
|
39797
|
-
onNow: handleNow
|
|
39643
|
+
onTimeChange: onChange,
|
|
39644
|
+
onClose: () => setIsPopoverOpen(false)
|
|
39798
39645
|
}
|
|
39799
39646
|
)
|
|
39800
39647
|
] });
|
|
@@ -40653,7 +40500,18 @@ var FileManagerFilters = ({
|
|
|
40653
40500
|
useEffect(() => {
|
|
40654
40501
|
clipMetadataRef.current = clipMetadata;
|
|
40655
40502
|
}, [clipMetadata]);
|
|
40656
|
-
const
|
|
40503
|
+
const isCategoryExternallyManaged = useCallback((categoryId) => {
|
|
40504
|
+
if (!categoryId) {
|
|
40505
|
+
return false;
|
|
40506
|
+
}
|
|
40507
|
+
if (prefetchedClipMetadata && Array.isArray(prefetchedClipMetadata[categoryId]) && prefetchedClipMetadata[categoryId].length > 0) {
|
|
40508
|
+
return true;
|
|
40509
|
+
}
|
|
40510
|
+
if (activeCategoryLoading !== void 0 && categoryId === activeFilter) {
|
|
40511
|
+
return true;
|
|
40512
|
+
}
|
|
40513
|
+
return false;
|
|
40514
|
+
}, [prefetchedClipMetadata, activeCategoryLoading, activeFilter]);
|
|
40657
40515
|
useEffect(() => {
|
|
40658
40516
|
if (!prefetchedClipMetadata) {
|
|
40659
40517
|
return;
|
|
@@ -41186,11 +41044,11 @@ var FileManagerFilters = ({
|
|
|
41186
41044
|
return newExpanded;
|
|
41187
41045
|
});
|
|
41188
41046
|
const category = categories.find((cat) => cat.id === activeFilter);
|
|
41189
|
-
if (category && !
|
|
41047
|
+
if (category && !isCategoryExternallyManaged(activeFilter) && !clipMetadataRef.current[activeFilter]) {
|
|
41190
41048
|
fetchClipMetadata(activeFilter, 1);
|
|
41191
41049
|
}
|
|
41192
41050
|
}
|
|
41193
|
-
}, [activeFilter,
|
|
41051
|
+
}, [activeFilter, isCategoryExternallyManaged]);
|
|
41194
41052
|
useEffect(() => {
|
|
41195
41053
|
const handleEscape = (e) => {
|
|
41196
41054
|
if (e.key === "Escape") {
|
|
@@ -41216,7 +41074,7 @@ var FileManagerFilters = ({
|
|
|
41216
41074
|
document.body.style.overflow = "unset";
|
|
41217
41075
|
};
|
|
41218
41076
|
}, [showTimeFilterModal, showIdleLabelFilterModal]);
|
|
41219
|
-
const
|
|
41077
|
+
const generateTimeSlots2 = useCallback(() => {
|
|
41220
41078
|
const slots = [];
|
|
41221
41079
|
for (let hour = 0; hour < 24; hour++) {
|
|
41222
41080
|
for (let minute = 0; minute < 60; minute += 15) {
|
|
@@ -41229,7 +41087,7 @@ var FileManagerFilters = ({
|
|
|
41229
41087
|
}
|
|
41230
41088
|
return slots;
|
|
41231
41089
|
}, []);
|
|
41232
|
-
const timeSlots = useMemo(() =>
|
|
41090
|
+
const timeSlots = useMemo(() => generateTimeSlots2(), [generateTimeSlots2]);
|
|
41233
41091
|
const filteredStartSlots = useMemo(
|
|
41234
41092
|
() => timeSlots.filter(
|
|
41235
41093
|
(slot) => slot.label.toLowerCase().includes(startSearchTerm.toLowerCase())
|
|
@@ -41461,14 +41319,14 @@ var FileManagerFilters = ({
|
|
|
41461
41319
|
} else {
|
|
41462
41320
|
newExpanded.add(nodeId);
|
|
41463
41321
|
const category = categories.find((cat) => cat.id === nodeId);
|
|
41464
|
-
if (category && !clipMetadata[nodeId] && !(
|
|
41322
|
+
if (category && !clipMetadata[nodeId] && !isCategoryExternallyManaged(nodeId)) {
|
|
41465
41323
|
console.log(`[FileManager] Fetching clips for expanded category: ${nodeId}`);
|
|
41466
41324
|
fetchClipMetadata(nodeId, 1);
|
|
41467
41325
|
}
|
|
41468
|
-
if (!(
|
|
41326
|
+
if (!isCategoryExternallyManaged(nodeId) && showPercentileCycleFilters && nodeId === "fast-cycles" && (percentileClips["fast-cycles"] || []).length === 0) {
|
|
41469
41327
|
fetchPercentileClips("fast-cycles");
|
|
41470
41328
|
}
|
|
41471
|
-
if (!(
|
|
41329
|
+
if (!isCategoryExternallyManaged(nodeId) && showPercentileCycleFilters && nodeId === "slow-cycles" && (percentileClips["slow-cycles"] || []).length === 0) {
|
|
41472
41330
|
fetchPercentileClips("slow-cycles");
|
|
41473
41331
|
}
|
|
41474
41332
|
}
|
|
@@ -41482,14 +41340,14 @@ var FileManagerFilters = ({
|
|
|
41482
41340
|
} else {
|
|
41483
41341
|
newExpanded.add(node.id);
|
|
41484
41342
|
const category = categories.find((cat) => cat.id === node.id);
|
|
41485
|
-
if (category && !clipMetadata[node.id] && !
|
|
41343
|
+
if (category && !clipMetadata[node.id] && !isCategoryExternallyManaged(node.id)) {
|
|
41486
41344
|
console.log(`[FileManager] Fetching clips for expanded category: ${node.id}`);
|
|
41487
41345
|
fetchClipMetadata(node.id, 1);
|
|
41488
41346
|
}
|
|
41489
|
-
if (!
|
|
41347
|
+
if (!isCategoryExternallyManaged(node.id) && showPercentileCycleFilters && node.id === "fast-cycles" && (percentileClips["fast-cycles"] || []).length === 0) {
|
|
41490
41348
|
fetchPercentileClips("fast-cycles");
|
|
41491
41349
|
}
|
|
41492
|
-
if (!
|
|
41350
|
+
if (!isCategoryExternallyManaged(node.id) && showPercentileCycleFilters && node.id === "slow-cycles" && (percentileClips["slow-cycles"] || []).length === 0) {
|
|
41493
41351
|
fetchPercentileClips("slow-cycles");
|
|
41494
41352
|
}
|
|
41495
41353
|
}
|
|
@@ -43119,7 +42977,7 @@ var BottlenecksContent = ({
|
|
|
43119
42977
|
metadataClips = categoryData.clips.map((clip, index) => ({
|
|
43120
42978
|
id: clip.id,
|
|
43121
42979
|
clipId: clip.id,
|
|
43122
|
-
clip_timestamp: clip.
|
|
42980
|
+
clip_timestamp: clip.creation_timestamp || clip.timestamp,
|
|
43123
42981
|
description: clip.description,
|
|
43124
42982
|
severity: clip.severity,
|
|
43125
42983
|
category: categoryId,
|