@voplus/morpho-workspace 10.0.18 → 10.0.19

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.
Files changed (43) hide show
  1. package/es/components/StatusFilterBar/index.d.ts +33 -0
  2. package/es/components/StatusFilterBar/index.js +169 -0
  3. package/es/components/StatusFilterBar/index.js.map +1 -0
  4. package/es/components/StatusFilterBar/index.test.d.ts +1 -0
  5. package/es/components/StatusFilterBar/index.test.js +102 -0
  6. package/es/components/StatusFilterBar/index.test.js.map +1 -0
  7. package/es/components/StatusFilterBar/statusFilterOverflow.d.ts +44 -0
  8. package/es/components/StatusFilterBar/statusFilterOverflow.js +78 -0
  9. package/es/components/StatusFilterBar/statusFilterOverflow.js.map +1 -0
  10. package/es/components/StatusFilterBar/statusFilterOverflow.test.d.ts +1 -0
  11. package/es/components/StatusFilterBar/statusFilterOverflow.test.js +54 -0
  12. package/es/components/StatusFilterBar/statusFilterOverflow.test.js.map +1 -0
  13. package/es/data/work/metas.js +2 -2
  14. package/es/modules/notification-workspace/components/NotificationListHeader/index.js +2 -8
  15. package/es/modules/notification-workspace/components/NotificationListHeader/index.js.map +1 -1
  16. package/es/modules/work/components/WorkQuickViewDialog/index.d.ts +2 -2
  17. package/es/modules/work/components/WorkQuickViewDialog/index.js +2 -2
  18. package/es/modules/work/components/WorkTableCard/TableCellDetail.d.ts +42 -0
  19. package/es/modules/work/components/WorkTableCard/TableCellDetail.js +161 -0
  20. package/es/modules/work/components/WorkTableCard/TableCellDetail.js.map +1 -0
  21. package/es/modules/work/components/WorkTableCard/index.d.ts +37 -0
  22. package/es/modules/work/components/WorkTableCard/index.js +110 -0
  23. package/es/modules/work/components/WorkTableCard/index.js.map +1 -0
  24. package/es/modules/work/components/WorkTableListCardPage/index.css +2 -2
  25. package/es/modules/work/components/WorkTableListCardPage/index.d.ts +5 -1
  26. package/es/modules/work/components/WorkTableListCardPage/index.js +48 -38
  27. package/es/modules/work/components/WorkTableListCardPage/index.js.map +1 -1
  28. package/es/modules/work/components/WorkTableListCardPage/state.js +1 -0
  29. package/es/modules/work/components/WorkTableListCardPage/state.js.map +1 -1
  30. package/es/modules/work/controls/WorkStatusLabel/index.d.ts +1 -1
  31. package/es/modules/work/work-type/components/WorkTypeStatsLabel/index.js +1 -1
  32. package/es/modules/work/work-type/components/WorkTypeStatsLabel/index.js.map +1 -1
  33. package/es/modules/work/work-type/pages/WorkTypePage/Dashboard.js +2 -4
  34. package/es/modules/work/work-type/pages/WorkTypePage/Dashboard.js.map +1 -1
  35. package/es/modules/work/work-type/pages/WorkTypePage/WorkPageCard.d.ts +5 -0
  36. package/es/modules/work/work-type/pages/WorkTypePage/WorkPageCard.js +15 -0
  37. package/es/modules/work/work-type/pages/WorkTypePage/WorkPageCard.js.map +1 -0
  38. package/es/modules/work/work-type/pages/WorkTypePage/Works.d.ts +0 -1
  39. package/es/modules/work/work-type/pages/WorkTypePage/Works.js +2 -7
  40. package/es/modules/work/work-type/pages/WorkTypePage/Works.js.map +1 -1
  41. package/es/modules/work/work-type/pages/WorkTypePage/index.js +1 -1
  42. package/es/modules/work/work-type/pages/WorkTypePage/index.js.map +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ /** A single status filter item shown in the bar. */
3
+ export type StatusFilterItem = {
4
+ /** Unique key identifying the status (also used as a CSS class). */
5
+ key: string;
6
+ /** Human-readable label. */
7
+ label: string;
8
+ /** Optional count rendered in parentheses after the label. */
9
+ total?: number;
10
+ };
11
+ /** Props for {@link StatusFilterBar}. */
12
+ export type StatusFilterBarProps = {
13
+ /** Status items in their canonical fixed order. */
14
+ items: StatusFilterItem[];
15
+ /** Currently selected status key. */
16
+ activeKey: string;
17
+ /** Whether overflow collapsing is enabled (true when the aside is open). */
18
+ collapsible: boolean;
19
+ /** Invoked with the selected status key. */
20
+ onSelect: (key: string) => void;
21
+ /** Extra class names for the outer container. */
22
+ className?: string;
23
+ };
24
+ /**
25
+ * Status filter bar with width-based overflow collapsing.
26
+ *
27
+ * When {@link StatusFilterBarProps}`.collapsible` is false, every status is shown
28
+ * inline (original behavior). When true, statuses that do not fit are collapsed
29
+ * into a trailing "..." button whose hover dropdown lists the remaining statuses
30
+ * in fixed order; picking one swaps it into the last visible slot.
31
+ */
32
+ declare const StatusFilterBar: ({ items, activeKey, collapsible, onSelect, className, }: StatusFilterBarProps) => React.JSX.Element;
33
+ export default StatusFilterBar;
@@ -0,0 +1,169 @@
1
+ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
2
+ import { FontAwesomeIcon as FAIcon, faEllipsisSolid } from "@voplus/morpho-ui/es/faIcons";
3
+ import classnames from "classnames";
4
+ import { computeVisibleCount, getHiddenKeysInFixedOrder, swapToVisibleEnd, } from "./statusFilterOverflow";
5
+ /** Gap between adjacent buttons in px (Tailwind gap-1.5 = 0.375rem = 6px). */
6
+ const FALLBACK_GAP = 6;
7
+ /**
8
+ * Builds the class name for a status button, preserving the original styling.
9
+ *
10
+ * @param key - Status key (added as a class for styling hooks).
11
+ * @param active - Whether this status is currently selected.
12
+ * @param grow - Whether the button may flex-grow (false for the measuring row).
13
+ * @returns The composed class name string.
14
+ */
15
+ function statusButtonClass(key, active, grow) {
16
+ return classnames(key, "h-[35px] px-5 rounded-base cursor-pointer uppercase hover:bg-white hover:text-font-secondary", grow ? "flex-[1_0_auto]" : "flex-none", { "bg-white text-font-secondary font-bold": active });
17
+ }
18
+ /**
19
+ * Renders a status label with an optional total suffix.
20
+ *
21
+ * @param item - The status item.
22
+ * @returns The label text, e.g. "Unread (3)".
23
+ */
24
+ function statusLabel(item) {
25
+ return `${item.label}${item.total ? ` (${item.total})` : ""}`;
26
+ }
27
+ /**
28
+ * Status filter bar with width-based overflow collapsing.
29
+ *
30
+ * When {@link StatusFilterBarProps}`.collapsible` is false, every status is shown
31
+ * inline (original behavior). When true, statuses that do not fit are collapsed
32
+ * into a trailing "..." button whose hover dropdown lists the remaining statuses
33
+ * in fixed order; picking one swaps it into the last visible slot.
34
+ */
35
+ const StatusFilterBar = ({ items, activeKey, collapsible, onSelect, className, }) => {
36
+ /** Canonical fixed order of keys, derived from the incoming items. */
37
+ const fixedOrder = useMemo(() => items.map((item) => item.key), [items]);
38
+ /** Lookup from key to item for rendering. */
39
+ const itemsByKey = useMemo(() => {
40
+ const map = {};
41
+ items.forEach((item) => (map[item.key] = item));
42
+ return map;
43
+ }, [items]);
44
+ /** Current left-to-right ordering (mutated by hidden-item swaps). */
45
+ const [order, setOrder] = useState(fixedOrder);
46
+ /**
47
+ * Reset the left-to-right order to canonical when the key set changes, or
48
+ * whenever collapsing is disabled (aside closed) so the flat row always
49
+ * shows the original canonical order regardless of prior swaps.
50
+ */
51
+ const keySignature = fixedOrder.join("|");
52
+ useEffect(() => {
53
+ if (!collapsible) {
54
+ setOrder(fixedOrder);
55
+ return;
56
+ }
57
+ setOrder(fixedOrder);
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ }, [keySignature, collapsible]);
60
+ /** Signature of item totals; changes when any (total) label changes, so widths are re-measured. */
61
+ const totalsSignature = items.map((item) => { var _a; return (_a = item.total) !== null && _a !== void 0 ? _a : ""; }).join("|");
62
+ /** Ref to the outer container used to measure available width. */
63
+ const containerRef = useRef(null);
64
+ /** Ref to the inner pill wrapping the visible buttons (used to read its padding). */
65
+ const innerRef = useRef(null);
66
+ /** Ref to the hidden measuring row containing all buttons at natural width. */
67
+ const measureRef = useRef(null);
68
+ /** Ref to the hidden measuring "..." group (mirrors the real more pill footprint). */
69
+ const moreMeasureRef = useRef(null);
70
+ /** Number of leading items to show as visible buttons. */
71
+ const [capacity, setCapacity] = useState(items.length);
72
+ /** Recomputes capacity from current measurements. */
73
+ const recompute = useCallback(() => {
74
+ if (!collapsible) {
75
+ setCapacity(fixedOrder.length);
76
+ return;
77
+ }
78
+ const container = containerRef.current;
79
+ const measure = measureRef.current;
80
+ if (!container || !measure)
81
+ return;
82
+ const containerWidth = container.getBoundingClientRect().width;
83
+ const childWidths = Array.from(measure.children).map((child) => child.getBoundingClientRect().width);
84
+ const widthByKey = {};
85
+ fixedOrder.forEach((key, i) => { var _a; return (widthByKey[key] = (_a = childWidths[i]) !== null && _a !== void 0 ? _a : 0); });
86
+ const orderedWidths = order.map((key) => { var _a; return (_a = widthByKey[key]) !== null && _a !== void 0 ? _a : 0; });
87
+ const moreWidth = moreMeasureRef.current
88
+ ? moreMeasureRef.current.getBoundingClientRect().width
89
+ : 0;
90
+ const containerStyle = window.getComputedStyle(container);
91
+ const gap = parseFloat(containerStyle.columnGap || containerStyle.gap || "") || FALLBACK_GAP;
92
+ // The visible buttons live inside an inner pill whose horizontal padding
93
+ // eats into the room available for them, so subtract it from the width
94
+ // the layout math is allowed to fill.
95
+ const inner = innerRef.current;
96
+ const innerPaddingX = inner
97
+ ? (() => {
98
+ const style = window.getComputedStyle(inner);
99
+ return (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
100
+ })()
101
+ : 0;
102
+ const availableWidth = containerWidth - innerPaddingX;
103
+ setCapacity(computeVisibleCount(availableWidth, orderedWidths, moreWidth, gap));
104
+ // Depend on keySignature (not the fixedOrder array identity) so parent
105
+ // re-renders that rebuild `items` with the same keys don't churn the
106
+ // ResizeObserver; fixedOrder/order are captured and read at call time.
107
+ // totalsSignature is included so a changed count (e.g. "Unread (3)" →
108
+ // "Unread (15)") re-measures the button widths.
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ }, [collapsible, keySignature, totalsSignature, order]);
111
+ /** Measure synchronously after layout and whenever inputs change. */
112
+ useLayoutEffect(() => {
113
+ recompute();
114
+ }, [recompute]);
115
+ /** Re-measure on container resize while collapsible. */
116
+ useEffect(() => {
117
+ if (!collapsible)
118
+ return;
119
+ const container = containerRef.current;
120
+ if (!container || typeof ResizeObserver === "undefined")
121
+ return;
122
+ const observer = new ResizeObserver(() => recompute());
123
+ observer.observe(container);
124
+ return () => observer.disconnect();
125
+ }, [collapsible, recompute]);
126
+ /** Effective number of visible items. */
127
+ const visibleCount = collapsible ? Math.min(capacity, items.length) : items.length;
128
+ /** Keys shown as inline buttons. */
129
+ const visibleKeys = order.slice(0, visibleCount);
130
+ /** Keys collapsed into the dropdown, in fixed order. */
131
+ const hiddenKeys = collapsible ? getHiddenKeysInFixedOrder(order, visibleCount, fixedOrder) : [];
132
+ /** Whether the "..." button and dropdown are shown. */
133
+ const showMore = hiddenKeys.length > 0;
134
+ /** Handles clicks on an inline (visible) status button. */
135
+ const handleVisibleClick = (key) => onSelect(key);
136
+ /** Handles clicks on a hidden status inside the dropdown: swap then select. */
137
+ // Invariant: the dropdown is only rendered from the render whose `visibleCount`
138
+ // is current, so reading `visibleCount` from closure here is correct (order is
139
+ // read via the functional updater).
140
+ const handleHiddenClick = (key) => {
141
+ setOrder((prev) => swapToVisibleEnd(prev, visibleCount, key));
142
+ onSelect(key);
143
+ };
144
+ /** Renders the dropdown overlay listing the hidden statuses. */
145
+ const renderOverlay = () => (React.createElement("div", { "data-testid": "status-overflow-dropdown", className: "bg-bg-grey p-1.5 rounded-base flex flex-col gap-1.5 text-font-grey text-sm shadow-base w-max whitespace-nowrap" }, hiddenKeys.map((key) => {
146
+ const item = itemsByKey[key];
147
+ if (!item)
148
+ return null;
149
+ return (React.createElement("button", { key: key, type: "button", className: statusButtonClass(key, activeKey === key, false), onClick: () => handleHiddenClick(key) }, statusLabel(item)));
150
+ })));
151
+ return (React.createElement("div", { ref: containerRef, className: classnames("status-filter-bar relative flex gap-1.5 items-center text-font-grey text-sm", className) },
152
+ React.createElement("div", { ref: innerRef, className: "flex-1 flex gap-1.5 items-center justify-start flex-wrap bg-bg-grey px-1.5 py-1.5 rounded-base" }, visibleKeys.map((key) => {
153
+ const item = itemsByKey[key];
154
+ if (!item)
155
+ return null;
156
+ return (React.createElement("button", { key: key, type: "button", className: statusButtonClass(key, activeKey === key, true), onClick: () => handleVisibleClick(key) }, statusLabel(item)));
157
+ })),
158
+ showMore && (React.createElement("div", { className: "group relative flex-none bg-bg-grey px-1.5 py-1.5 rounded-base" },
159
+ React.createElement("button", { type: "button", "aria-label": "More statuses", "aria-haspopup": "true", className: statusButtonClass("more", false, false) },
160
+ React.createElement(FAIcon, { icon: faEllipsisSolid })),
161
+ React.createElement("div", { className: "absolute right-0 top-full z-10 pt-1.5 hidden group-hover:block" }, renderOverlay()))),
162
+ collapsible && (React.createElement(React.Fragment, null,
163
+ React.createElement("div", { ref: measureRef, "aria-hidden": true, className: "invisible pointer-events-none absolute left-[-9999px] top-0 flex gap-1.5" }, items.map((item) => (React.createElement("button", { key: item.key, type: "button", tabIndex: -1, className: statusButtonClass(item.key, false, false) }, statusLabel(item))))),
164
+ React.createElement("div", { ref: moreMeasureRef, "aria-hidden": true, "data-more": "true", className: "invisible pointer-events-none absolute left-[-9999px] top-0 flex-none bg-bg-grey px-1.5 py-1.5 rounded-base" },
165
+ React.createElement("button", { type: "button", tabIndex: -1, className: statusButtonClass("more", false, false) },
166
+ React.createElement(FAIcon, { icon: faEllipsisSolid })))))));
167
+ };
168
+ export default StatusFilterBar;
169
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClG,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GAChB,MAAM,wBAAwB,CAAC;AA0BhC,8EAA8E;AAC9E,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAe,EAAE,IAAa;IACrE,OAAO,UAAU,CAChB,GAAG,EACH,8FAA8F,EAC9F,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,EACtC,EAAE,wCAAwC,EAAE,MAAM,EAAE,CACpD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,IAAsB;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,EACxB,KAAK,EACL,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,GACa,EAAE,EAAE;IAC1B,sEAAsE;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzE,6CAA6C;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAqC,EAAE,CAAC;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAW,UAAU,CAAC,CAAC;IAEzD;;;;OAIG;IACH,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrB,OAAO;QACR,CAAC;QACD,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrB,uDAAuD;IACxD,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAEhC,mGAAmG;IACnG,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,IAAI,CAAC,KAAK,mCAAI,EAAE,CAAA,EAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAExE,kEAAkE;IAClE,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,qFAAqF;IACrF,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC9C,+EAA+E;IAC/E,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,sFAAsF;IACtF,MAAM,cAAc,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEpD,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC;IAE/D,qDAAqD;IACrD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO;QACR,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE,OAAO;QAEnC,MAAM,cAAc,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;QAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CACnD,CAAC,KAAK,EAAE,EAAE,CAAE,KAAqB,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAC/D,CAAC;QACF,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,WAAC,OAAA,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAA,WAAW,CAAC,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAA,EAAA,CAAC,CAAC;QACxE,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,MAAA,UAAU,CAAC,GAAG,CAAC,mCAAI,CAAC,CAAA,EAAA,CAAC,CAAC;QAE/D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO;YACvC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,KAAK;YACtD,CAAC,CAAC,CAAC,CAAC;QAEL,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,IAAI,cAAc,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,YAAY,CAAC;QAE7F,yEAAyE;QACzE,uEAAuE;QACvE,sCAAsC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,aAAa,GAAG,KAAK;YAC1B,CAAC,CAAC,CAAC,GAAG,EAAE;gBACN,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC7C,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,EAAE;YACL,CAAC,CAAC,CAAC,CAAC;QACL,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,CAAC;QAEtD,WAAW,CAAC,mBAAmB,CAAC,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAChF,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,sEAAsE;QACtE,gDAAgD;QAChD,uDAAuD;IACxD,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;IAExD,qEAAqE;IACrE,eAAe,CAAC,GAAG,EAAE;QACpB,SAAS,EAAE,CAAC;IACb,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QAChE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QACvD,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7B,yCAAyC;IACzC,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACnF,oCAAoC;IACpC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IACjD,wDAAwD;IACxD,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,uDAAuD;IACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvC,2DAA2D;IAC3D,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE1D,+EAA+E;IAC/E,gFAAgF;IAChF,+EAA+E;IAC/E,oCAAoC;IACpC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE;QACzC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9D,QAAQ,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,gEAAgE;IAChE,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAC3B,4CACa,0BAA0B,EACtC,SAAS,EAAC,gHAAgH,IAEzH,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,CACN,gCACC,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iBAAiB,CAAC,GAAG,EAAE,SAAS,KAAK,GAAG,EAAE,KAAK,CAAC,EAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAEpC,WAAW,CAAC,IAAI,CAAC,CACV,CACT,CAAC;IACH,CAAC,CAAC,CACG,CACN,CAAC;IAEF,OAAO,CACN,6BACC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,UAAU,CACpB,6EAA6E,EAC7E,SAAS,CACT;QAED,6BACC,GAAG,EAAE,QAAQ,EACb,SAAS,EAAC,gGAAgG,IAEzG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,OAAO,CACN,gCACC,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,iBAAiB,CAAC,GAAG,EAAE,SAAS,KAAK,GAAG,EAAE,IAAI,CAAC,EAC1D,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAErC,WAAW,CAAC,IAAI,CAAC,CACV,CACT,CAAC;QACH,CAAC,CAAC,CACG;QAEL,QAAQ,IAAI,CACZ,6BAAK,SAAS,EAAC,gEAAgE;YAC9E,gCACC,IAAI,EAAC,QAAQ,gBACF,eAAe,mBACZ,MAAM,EACpB,SAAS,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;gBAElD,oBAAC,MAAM,IAAC,IAAI,EAAE,eAAe,GAAI,CACzB;YACT,6BAAK,SAAS,EAAC,gEAAgE,IAC7E,aAAa,EAAE,CACX,CACD,CACN;QAGA,WAAW,IAAI,CACf;YAEC,6BACC,GAAG,EAAE,UAAU,uBAEf,SAAS,EAAC,0EAA0E,IAEnF,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACpB,gCACC,GAAG,EAAE,IAAI,CAAC,GAAG,EACb,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAEnD,WAAW,CAAC,IAAI,CAAC,CACV,CACT,CAAC,CACG;YAEN,6BACC,GAAG,EAAE,cAAc,oCAET,MAAM,EAChB,SAAS,EAAC,6GAA6G;gBAEvH,gCACC,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;oBAElD,oBAAC,MAAM,IAAC,IAAI,EAAE,eAAe,GAAI,CACzB,CACJ,CACJ,CACH,CACI,CACN,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom/vitest";
@@ -0,0 +1,102 @@
1
+ import React from "react";
2
+ import "@testing-library/jest-dom/vitest";
3
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
4
+ import { render, screen, fireEvent, within } from "@testing-library/react";
5
+ import StatusFilterBar from "./index";
6
+ const ITEMS = [
7
+ { key: "all", label: "All" },
8
+ { key: "unread", label: "Unread", total: 3 },
9
+ { key: "read", label: "Read", total: 2 },
10
+ { key: "later", label: "Later", total: 1 },
11
+ { key: "dismissed", label: "Dismissed" },
12
+ ];
13
+ describe("StatusFilterBar (not collapsible)", () => {
14
+ it("renders every status and no more button", () => {
15
+ render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: false, onSelect: vi.fn() }));
16
+ expect(screen.getByText(/^All$/)).toBeInTheDocument();
17
+ expect(screen.getByText(/^Dismissed$/)).toBeInTheDocument();
18
+ expect(screen.queryByLabelText("More statuses")).not.toBeInTheDocument();
19
+ });
20
+ it("calls onSelect when a visible status is clicked", () => {
21
+ const onSelect = vi.fn();
22
+ render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: false, onSelect: onSelect }));
23
+ fireEvent.click(screen.getByText(/^Read/));
24
+ expect(onSelect).toHaveBeenCalledWith("read");
25
+ });
26
+ });
27
+ describe("StatusFilterBar (collapsible with mocked widths)", () => {
28
+ let roCallback = null;
29
+ beforeEach(() => {
30
+ roCallback = null;
31
+ vi.stubGlobal("ResizeObserver", class {
32
+ constructor(cb) {
33
+ roCallback = cb;
34
+ }
35
+ observe() {
36
+ roCallback && roCallback();
37
+ }
38
+ unobserve() { }
39
+ disconnect() { }
40
+ });
41
+ vi.spyOn(HTMLElement.prototype, "getBoundingClientRect").mockImplementation(function () {
42
+ const isContainer = this.classList.contains("status-filter-bar");
43
+ const isMore = this.getAttribute("aria-label") === "More statuses" || this.dataset.more === "true";
44
+ const width = isContainer ? 300 : isMore ? 40 : 100;
45
+ return {
46
+ width,
47
+ height: 35,
48
+ top: 0,
49
+ left: 0,
50
+ right: width,
51
+ bottom: 35,
52
+ x: 0,
53
+ y: 0,
54
+ toJSON: () => ({}),
55
+ };
56
+ });
57
+ });
58
+ afterEach(() => {
59
+ vi.restoreAllMocks();
60
+ vi.unstubAllGlobals();
61
+ });
62
+ it("shows a more button and lists hidden statuses in fixed order", () => {
63
+ render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: true, onSelect: vi.fn() }));
64
+ const more = screen.getByLabelText("More statuses");
65
+ expect(more).toBeInTheDocument();
66
+ const dropdown = screen.getByTestId("status-overflow-dropdown");
67
+ const hiddenLabels = within(dropdown)
68
+ .getAllByRole("button")
69
+ .map((b) => { var _a; return (_a = b.textContent) === null || _a === void 0 ? void 0 : _a.trim(); });
70
+ expect(hiddenLabels).toEqual(["Read (2)", "Later (1)", "Dismissed"]);
71
+ });
72
+ it("swaps a picked hidden status into the visible row and calls onSelect", () => {
73
+ const onSelect = vi.fn();
74
+ render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: true, onSelect: onSelect }));
75
+ const dropdown = screen.getByTestId("status-overflow-dropdown");
76
+ fireEvent.click(within(dropdown).getByText("Later (1)"));
77
+ expect(onSelect).toHaveBeenCalledWith("later");
78
+ const dropdownAfter = screen.getByTestId("status-overflow-dropdown");
79
+ const hiddenLabels = within(dropdownAfter)
80
+ .getAllByRole("button")
81
+ .map((b) => { var _a; return (_a = b.textContent) === null || _a === void 0 ? void 0 : _a.trim(); });
82
+ expect(hiddenLabels).toEqual(["Unread (3)", "Read (2)", "Dismissed"]);
83
+ });
84
+ it("resets to canonical order when collapsible becomes false after a swap", () => {
85
+ const { rerender } = render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: true, onSelect: vi.fn() }));
86
+ const dropdown = screen.getByTestId("status-overflow-dropdown");
87
+ fireEvent.click(within(dropdown).getByText("Later (1)"));
88
+ rerender(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: false, onSelect: vi.fn() }));
89
+ const container = document.querySelector(".status-filter-bar");
90
+ const labels = within(container)
91
+ .getAllByRole("button")
92
+ .map((b) => { var _a; return (_a = b.textContent) === null || _a === void 0 ? void 0 : _a.trim(); });
93
+ expect(labels).toEqual(["All", "Unread (3)", "Read (2)", "Later (1)", "Dismissed"]);
94
+ });
95
+ it("re-renders without throwing when a total changes", () => {
96
+ const { rerender } = render(React.createElement(StatusFilterBar, { items: ITEMS, activeKey: "all", collapsible: true, onSelect: vi.fn() }));
97
+ const changed = ITEMS.map((item) => item.key === "unread" ? { ...item, total: 15 } : item);
98
+ expect(() => rerender(React.createElement(StatusFilterBar, { items: changed, activeKey: "all", collapsible: true, onSelect: vi.fn() }))).not.toThrow();
99
+ expect(screen.getAllByText(/^Unread \(15\)$/).length).toBeGreaterThan(0);
100
+ });
101
+ });
102
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/index.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Pure geometry/ordering helpers for the status filter overflow behavior.
3
+ * These contain no DOM or React so they can be unit-tested in isolation.
4
+ */
5
+ /**
6
+ * Computes how many status items can be shown before the trailing "..." button.
7
+ *
8
+ * When all items fit within the container, every item is shown and no "..."
9
+ * button is needed. Otherwise room is reserved for the "..." button and items
10
+ * are counted greedily from the left.
11
+ *
12
+ * @param containerWidth - Available width of the bar container, in px.
13
+ * @param itemWidths - Natural widths of each item (in the current display order), in px.
14
+ * @param moreWidth - Width of the trailing "..." button, in px.
15
+ * @param gap - Horizontal gap between adjacent elements, in px.
16
+ * @returns The number of leading items to render as visible buttons.
17
+ */
18
+ export declare function computeVisibleCount(containerWidth: number, itemWidths: number[], moreWidth: number, gap: number): number;
19
+ /**
20
+ * Swaps a hidden status key into the last visible slot.
21
+ *
22
+ * The picked hidden key moves to index `visibleCount - 1`, and the key that
23
+ * previously occupied that slot is pushed to the picked key's old position
24
+ * (i.e. into the hidden region). Returns a new array; the input is not mutated.
25
+ *
26
+ * @param order - Current left-to-right ordering of status keys.
27
+ * @param visibleCount - Number of leading keys currently visible.
28
+ * @param key - The hidden key that was selected.
29
+ * @returns A new ordering with the swap applied (or a copy if no swap needed).
30
+ */
31
+ export declare function swapToVisibleEnd(order: string[], visibleCount: number, key: string): string[];
32
+ /**
33
+ * Returns the currently hidden keys, sorted by the canonical fixed order.
34
+ *
35
+ * The visible region is `order.slice(0, visibleCount)`; everything else is
36
+ * hidden. Hidden keys are always listed in the fixed canonical order regardless
37
+ * of their position in the (possibly swapped) `order` array.
38
+ *
39
+ * @param order - Current left-to-right ordering of status keys.
40
+ * @param visibleCount - Number of leading keys currently visible.
41
+ * @param fixedOrder - The canonical order used to sort the dropdown list.
42
+ * @returns Hidden keys in fixed canonical order.
43
+ */
44
+ export declare function getHiddenKeysInFixedOrder(order: string[], visibleCount: number, fixedOrder: string[]): string[];
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Pure geometry/ordering helpers for the status filter overflow behavior.
3
+ * These contain no DOM or React so they can be unit-tested in isolation.
4
+ */
5
+ /**
6
+ * Computes how many status items can be shown before the trailing "..." button.
7
+ *
8
+ * When all items fit within the container, every item is shown and no "..."
9
+ * button is needed. Otherwise room is reserved for the "..." button and items
10
+ * are counted greedily from the left.
11
+ *
12
+ * @param containerWidth - Available width of the bar container, in px.
13
+ * @param itemWidths - Natural widths of each item (in the current display order), in px.
14
+ * @param moreWidth - Width of the trailing "..." button, in px.
15
+ * @param gap - Horizontal gap between adjacent elements, in px.
16
+ * @returns The number of leading items to render as visible buttons.
17
+ */
18
+ export function computeVisibleCount(containerWidth, itemWidths, moreWidth, gap) {
19
+ const total = itemWidths.length;
20
+ if (total === 0)
21
+ return 0;
22
+ const fullWidth = itemWidths.reduce((acc, w, i) => acc + w + (i > 0 ? gap : 0), 0);
23
+ if (fullWidth <= containerWidth)
24
+ return total;
25
+ let count = 0;
26
+ for (let k = 1; k <= total - 1; k++) {
27
+ const itemsWidth = itemWidths
28
+ .slice(0, k)
29
+ .reduce((acc, w, i) => acc + w + (i > 0 ? gap : 0), 0);
30
+ const withMore = itemsWidth + gap + moreWidth;
31
+ if (withMore <= containerWidth) {
32
+ count = k;
33
+ }
34
+ else {
35
+ break;
36
+ }
37
+ }
38
+ return count;
39
+ }
40
+ /**
41
+ * Swaps a hidden status key into the last visible slot.
42
+ *
43
+ * The picked hidden key moves to index `visibleCount - 1`, and the key that
44
+ * previously occupied that slot is pushed to the picked key's old position
45
+ * (i.e. into the hidden region). Returns a new array; the input is not mutated.
46
+ *
47
+ * @param order - Current left-to-right ordering of status keys.
48
+ * @param visibleCount - Number of leading keys currently visible.
49
+ * @param key - The hidden key that was selected.
50
+ * @returns A new ordering with the swap applied (or a copy if no swap needed).
51
+ */
52
+ export function swapToVisibleEnd(order, visibleCount, key) {
53
+ const next = [...order];
54
+ const keyIndex = next.indexOf(key);
55
+ const lastVisibleIndex = visibleCount - 1;
56
+ if (keyIndex === -1 || lastVisibleIndex < 0 || keyIndex <= lastVisibleIndex) {
57
+ return next;
58
+ }
59
+ [next[lastVisibleIndex], next[keyIndex]] = [next[keyIndex], next[lastVisibleIndex]];
60
+ return next;
61
+ }
62
+ /**
63
+ * Returns the currently hidden keys, sorted by the canonical fixed order.
64
+ *
65
+ * The visible region is `order.slice(0, visibleCount)`; everything else is
66
+ * hidden. Hidden keys are always listed in the fixed canonical order regardless
67
+ * of their position in the (possibly swapped) `order` array.
68
+ *
69
+ * @param order - Current left-to-right ordering of status keys.
70
+ * @param visibleCount - Number of leading keys currently visible.
71
+ * @param fixedOrder - The canonical order used to sort the dropdown list.
72
+ * @returns Hidden keys in fixed canonical order.
73
+ */
74
+ export function getHiddenKeysInFixedOrder(order, visibleCount, fixedOrder) {
75
+ const hidden = new Set(order.slice(visibleCount));
76
+ return fixedOrder.filter((key) => hidden.has(key));
77
+ }
78
+ //# sourceMappingURL=statusFilterOverflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusFilterOverflow.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/statusFilterOverflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAClC,cAAsB,EACtB,UAAoB,EACpB,SAAiB,EACjB,GAAW;IAEX,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,IAAI,SAAS,IAAI,cAAc;QAAE,OAAO,KAAK,CAAC;IAE9C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,UAAU;aAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC;QAC9C,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;YAChC,KAAK,GAAG,CAAC,CAAC;QACX,CAAC;aAAM,CAAC;YACP,MAAM;QACP,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,YAAoB,EAAE,GAAW;IAClF,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,gBAAgB,GAAG,YAAY,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,gBAAgB,GAAG,CAAC,IAAI,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QAC7E,OAAO,IAAI,CAAC;IACb,CAAC;IACD,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACxC,KAAe,EACf,YAAoB,EACpB,UAAoB;IAEpB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { computeVisibleCount, swapToVisibleEnd, getHiddenKeysInFixedOrder, } from "./statusFilterOverflow";
3
+ describe("computeVisibleCount", () => {
4
+ it("returns all items when everything fits", () => {
5
+ expect(computeVisibleCount(600, [100, 100, 100, 100, 100], 40, 10)).toBe(5);
6
+ });
7
+ it("reserves room for the more button and counts from the left", () => {
8
+ expect(computeVisibleCount(300, [100, 100, 100, 100, 100], 40, 10)).toBe(2);
9
+ });
10
+ it("returns 0 when not even one item plus more fits", () => {
11
+ expect(computeVisibleCount(50, [100, 100], 40, 10)).toBe(0);
12
+ });
13
+ it("returns 0 for empty input", () => {
14
+ expect(computeVisibleCount(300, [], 40, 10)).toBe(0);
15
+ });
16
+ });
17
+ describe("swapToVisibleEnd", () => {
18
+ const order = ["all", "unread", "read", "later", "dismissed"];
19
+ it("swaps a hidden key with the last visible key", () => {
20
+ expect(swapToVisibleEnd(order, 2, "later")).toEqual([
21
+ "all",
22
+ "later",
23
+ "read",
24
+ "unread",
25
+ "dismissed",
26
+ ]);
27
+ });
28
+ it("leaves order unchanged when the key is already visible", () => {
29
+ expect(swapToVisibleEnd(order, 2, "all")).toEqual(order);
30
+ });
31
+ it("leaves order unchanged when the key is missing", () => {
32
+ expect(swapToVisibleEnd(order, 2, "nope")).toEqual(order);
33
+ });
34
+ it("returns a new array (does not mutate input)", () => {
35
+ const result = swapToVisibleEnd(order, 2, "later");
36
+ expect(result).not.toBe(order);
37
+ expect(order).toEqual(["all", "unread", "read", "later", "dismissed"]);
38
+ });
39
+ });
40
+ describe("getHiddenKeysInFixedOrder", () => {
41
+ const fixedOrder = ["all", "unread", "read", "later", "dismissed"];
42
+ it("returns hidden keys sorted by the fixed order, not the current order", () => {
43
+ const order = ["all", "later", "read", "unread", "dismissed"];
44
+ expect(getHiddenKeysInFixedOrder(order, 2, fixedOrder)).toEqual([
45
+ "unread",
46
+ "read",
47
+ "dismissed",
48
+ ]);
49
+ });
50
+ it("returns empty when everything is visible", () => {
51
+ expect(getHiddenKeysInFixedOrder(fixedOrder, 5, fixedOrder)).toEqual([]);
52
+ });
53
+ });
54
+ //# sourceMappingURL=statusFilterOverflow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusFilterOverflow.test.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/statusFilterOverflow.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const DefaultView = lazy(() => import("../../modules/work/pages/WorkDefaultView"
7
7
  const WorkCard = lazy(() => import("../../modules/work/components/WorkCard"));
8
8
  const WorkTableList = lazy(() => import("../../modules/work/components/WorkTableList"));
9
9
  const WorkPropertiesView = lazy(() => import("../../modules/work/components/WorkPropertiesView"));
10
- const WrokQuickViewDialog = lazy(() => import("../../modules/work/components/WorkQuickViewDialog"));
10
+ const WorkQuickViewDialog = lazy(() => import("../../modules/work/components/WorkQuickViewDialog"));
11
11
  /** Meta information for Work document. */
12
12
  export class WorkMeta extends DefaultDocumentTypeMeta {
13
13
  get name() {
@@ -21,7 +21,7 @@ export class WorkMeta extends DefaultDocumentTypeMeta {
21
21
  }
22
22
  getQuickView(document, props) {
23
23
  props.id = document.id;
24
- return suspense(WrokQuickViewDialog)({
24
+ return suspense(WorkQuickViewDialog)({
25
25
  id: document.id,
26
26
  visible: props.visible,
27
27
  onCancel: props.onCancel,
@@ -10,6 +10,7 @@ import { useNotificationListContext } from "../NotificationList/state";
10
10
  import ListHeaderTool from "@voplus/morpho-ui/es/components/layout/ListView/headers/ListHeaderTool";
11
11
  import PageHeadDashboard from "@voplus/morpho-ui/es/components/layout/headers/PageHeadDashboard";
12
12
  import classnames from "classnames";
13
+ import StatusFilterBar from "../../../../components/StatusFilterBar";
13
14
  const NotificationListHeader = (props) => {
14
15
  const layout = useLayout();
15
16
  const mobile = layout.ui.mobile;
@@ -59,14 +60,7 @@ const NotificationListHeader = (props) => {
59
60
  ? {
60
61
  columns: [React.createElement(FlagFilter, { key: "Flag" })],
61
62
  }
62
- : undefined, sortable: context.host.isTest ? true : false, searchHeader: context.host.isTest ? true : false, searchOptions: { placeholder: "Search in notifications" }, preExtra: () => (React.createElement("div", { className: classnames("bg-bg-grey px-1.5 py-1.5 rounded-base flex gap-1.5 items-center text-font-grey text-sm", {
63
- "w-full": isAsideOpen,
64
- }) }, statusMenu.map((item) => (React.createElement("button", { key: item.key, className: classnames(item.key, "h-[35px] px-7 rounded-base cursor-pointer uppercase hover:bg-white hover:text-font-secondary", {
65
- "bg-white text-font-secondary font-bold": statusActive === item.key,
66
- }), onClick: () => onClickStatus(item.key) },
67
- item.label,
68
- " ",
69
- (item === null || item === void 0 ? void 0 : item.total) ? ` (${item.total})` : ""))))) }));
63
+ : undefined, sortable: context.host.isTest ? true : false, searchHeader: context.host.isTest ? true : false, searchOptions: { placeholder: "Search in notifications" }, preExtra: () => (React.createElement(StatusFilterBar, { items: statusMenu, activeKey: statusActive, collapsible: !!isAsideOpen, onSelect: onClickStatus, className: classnames({ "w-full": isAsideOpen }) })) }));
70
64
  return (React.createElement("div", { className: classnames("notifications-header", { mobile: mobile }) }, !mobile ? (React.createElement(PageHeadDashboard, { headerType: "page", avatarIcon: React.createElement(FAIcon, { icon: faBellSolid }), title: "Your Notifications Center", description: "Stay updated: your latest alerts and notifications", moreExpansions: React.createElement(ListHeader, null) })) : (React.createElement(ListHeader, null))));
71
65
  });
72
66
  function onClickStatus(item) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/notification-workspace/components/NotificationListHeader/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/notification-workspace/components/NotificationListHeader/index.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
- declare const WrokQuickViewDialog: (props: {
2
+ declare const WorkQuickViewDialog: (props: {
3
3
  id: string;
4
4
  visible?: boolean;
5
5
  onCancel?: () => void;
6
6
  }) => React.JSX.Element;
7
- export default WrokQuickViewDialog;
7
+ export default WorkQuickViewDialog;
@@ -12,7 +12,7 @@ import DocumentList from "@voplus/morpho-document/es/components/DocumentList";
12
12
  import { observe } from "@voplus/morpho-ui";
13
13
  import { useMetaStore } from "@voplus/morpho-document-core";
14
14
  import { useWork } from "../../../../data/work";
15
- const WrokQuickViewDialog = (props) => {
15
+ const WorkQuickViewDialog = (props) => {
16
16
  const { id } = props;
17
17
  const meta = useMetaStore();
18
18
  const [error, setError] = useState(null);
@@ -53,5 +53,5 @@ const WrokQuickViewDialog = (props) => {
53
53
  }, 100);
54
54
  }
55
55
  };
56
- export default WrokQuickViewDialog;
56
+ export default WorkQuickViewDialog;
57
57
  //# sourceMappingURL=index.js.map