@voplus/morpho-workspace 10.0.20 → 10.0.21
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/es/modules/notification-workspace/components/NotificationListHeader/index.js +2 -2
- package/es/modules/notification-workspace/components/NotificationListHeader/index.js.map +1 -1
- package/es/modules/work/components/WorkTableListCardPage/index.js +2 -4
- package/es/modules/work/components/WorkTableListCardPage/index.js.map +1 -1
- package/package.json +1 -1
- package/es/components/StatusFilterBar/index.d.ts +0 -33
- package/es/components/StatusFilterBar/index.js +0 -159
- package/es/components/StatusFilterBar/index.js.map +0 -1
- package/es/components/StatusFilterBar/index.test.d.ts +0 -1
- package/es/components/StatusFilterBar/index.test.js +0 -102
- package/es/components/StatusFilterBar/index.test.js.map +0 -1
- package/es/components/StatusFilterBar/statusFilterOverflow.d.ts +0 -44
- package/es/components/StatusFilterBar/statusFilterOverflow.js +0 -78
- package/es/components/StatusFilterBar/statusFilterOverflow.js.map +0 -1
- package/es/components/StatusFilterBar/statusFilterOverflow.test.d.ts +0 -1
- package/es/components/StatusFilterBar/statusFilterOverflow.test.js +0 -54
- package/es/components/StatusFilterBar/statusFilterOverflow.test.js.map +0 -1
|
@@ -10,7 +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 "
|
|
13
|
+
import StatusFilterBar from "@voplus/morpho-ui/es/controls/StatusFilterBar";
|
|
14
14
|
const NotificationListHeader = (props) => {
|
|
15
15
|
const layout = useLayout();
|
|
16
16
|
const mobile = layout.ui.mobile;
|
|
@@ -60,7 +60,7 @@ const NotificationListHeader = (props) => {
|
|
|
60
60
|
? {
|
|
61
61
|
columns: [React.createElement(FlagFilter, { key: "Flag" })],
|
|
62
62
|
}
|
|
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,
|
|
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, onSelect: onClickStatus, className: classnames({ "w-full": isAsideOpen, "flex-1": !isAsideOpen }) })) }));
|
|
64
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))));
|
|
65
65
|
});
|
|
66
66
|
function onClickStatus(item) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/notification-workspace/components/NotificationListHeader/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AACzE,OAAO,EAAE,oCAAoC,EAAE,MAAM,yCAAyC,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,cAAc,MAAM,wEAAwE,CAAC;AACpG,OAAO,iBAAiB,MAAM,kEAAkE,CAAC;AACjG,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,eAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/notification-workspace/components/NotificationListHeader/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAC;AACzE,OAAO,EAAE,oCAAoC,EAAE,MAAM,yCAAyC,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,cAAc,MAAM,wEAAwE,CAAC;AACpG,OAAO,iBAAiB,MAAM,kEAAkE,CAAC;AACjG,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,eAAe,MAAM,+CAA+C,CAAC;AAE5E,MAAM,sBAAsB,GAAG,CAAC,KAK/B,EAAE,EAAE;IACJ,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;IAChC,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;IAC9C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACd,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnB,oCAAoC,CACnC,IAAI,EACJ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EACvF,QAAQ,CAAC,cAAc,CACvB,CAAC;IAEF,oCAAoC,CACnC,IAAI,EACJ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EACrF,QAAQ,CAAC,YAAY,CACrB,CAAC;IACF,oCAAoC,CACnC,IAAI,EACJ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EACtF,QAAQ,CAAC,aAAa,CACtB,CAAC;IACF,oCAAoC,CACnC,IAAI,EACJ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAC1F,QAAQ,CAAC,iBAAiB,CAC1B,CAAC;IAEF,OAAO,OAAO,CAAC,GAAG,EAAE;;QACnB,MAAM,UAAU,GAAG;YAClB;gBACC,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,SAAS;aAChB;YACD;gBACC,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,MAAM;aACzC;YACD;gBACC,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,IAAI;aACvC;YACD;gBACC,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,KAAK;aACxC;YACD;gBACC,GAAG,EAAE,WAAW;gBAChB,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,SAAS;aAChB;SACD,CAAC;QAEF,MAAM,WAAW,GAAG,MAAA,sBAAsB,EAAE,0CAAE,YAAY,CAAC;QAE3D,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CACxB,oBAAC,cAAc,IACd,OAAO,EAAE,KAAK,EACd,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE;gBAC7C,mCAAmC,EAAE,WAAW;aAChD,CAAC,EACF,eAAe,EACd,OAAO,CAAC,IAAI,CAAC,MAAM;gBAClB,CAAC,CAAC;oBACA,OAAO,EAAE,CAAC,oBAAC,UAAU,IAAC,GAAG,EAAC,MAAM,GAAG,CAAC;iBACpC;gBACF,CAAC,CAAC,SAAS,EAEb,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAC5C,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAChD,aAAa,EAAE,EAAE,WAAW,EAAE,yBAAyB,EAAE,EACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,CACf,oBAAC,eAAe,IACf,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,YAAY,EACvB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,GACvE,CACF,GACA,CACF,CAAC;QAEF,OAAO,CACN,6BAAK,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IACpE,CAAC,MAAM,CAAC,CAAC,CAAC,CACV,oBAAC,iBAAiB,IACjB,UAAU,EAAC,MAAM,EACjB,UAAU,EAAE,oBAAC,MAAM,IAAC,IAAI,EAAE,WAAW,GAAI,EACzC,KAAK,EAAC,2BAA2B,EACjC,WAAW,EAAC,oDAAoD,EAChE,cAAc,EAAE,oBAAC,UAAU,OAAG,GAC7B,CACF,CAAC,CAAC,CAAC,CACH,oBAAC,UAAU,OAAG,CACd,CACI,CACN,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,aAAa,CAAC,IAAY;;QAClC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,MAAA,KAAK,CAAC,aAAa,sDAAG,IAAI,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -12,7 +12,7 @@ import WorkTableCard from "../WorkTableCard";
|
|
|
12
12
|
import NewWorkForm from "../NewWorkForm";
|
|
13
13
|
import { useParams } from "react-router-dom";
|
|
14
14
|
import { State } from "./state";
|
|
15
|
-
import StatusFilterBar from "
|
|
15
|
+
import StatusFilterBar from "@voplus/morpho-ui/es/controls/StatusFilterBar";
|
|
16
16
|
import classnames from "classnames";
|
|
17
17
|
import "./index.css";
|
|
18
18
|
/** 仅负责统计单个 status 下 work 的总数,并向上回传;本身不渲染任何内容。 */
|
|
@@ -67,9 +67,7 @@ const WorkTableListCardPage = ({ typesId, contact, searchPosition = "tool", ...p
|
|
|
67
67
|
key: item,
|
|
68
68
|
label: item,
|
|
69
69
|
total: totals[item],
|
|
70
|
-
})), activeKey: state.active,
|
|
71
|
-
"w-full": isAsideOpen,
|
|
72
|
-
}) })) }),
|
|
70
|
+
})), activeKey: state.active, onSelect: onChangeFilter, className: classnames({ "w-full": isAsideOpen, "flex-3": !isAsideOpen }) })) }),
|
|
73
71
|
React.createElement(WorkTableCard, { ...state.cardProps, onClickItem: props.onClickItem, type: (_c = props.type) !== null && _c !== void 0 ? _c : (asideContext.asideContent ? "simple" : "details") })))));
|
|
74
72
|
});
|
|
75
73
|
function onChangeFilter(item) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/work/components/WorkTableListCardPage/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,YAAY,MAAM,qDAAqD,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,iBAAiB,MAAM,kEAAkE,CAAC;AACjG,OAAO,cAAc,MAAM,wEAAwE,CAAC;AACpG,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,eAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/work/components/WorkTableListCardPage/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,33 +0,0 @@
|
|
|
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;
|
|
@@ -1,159 +0,0 @@
|
|
|
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 (the bar's grey pill) used to measure available width. */
|
|
63
|
-
const containerRef = useRef(null);
|
|
64
|
-
/** Ref to the hidden measuring row containing all buttons at natural width. */
|
|
65
|
-
const measureRef = useRef(null);
|
|
66
|
-
/** Ref to the hidden measuring "..." button (mirrors the real more button footprint). */
|
|
67
|
-
const moreMeasureRef = useRef(null);
|
|
68
|
-
/** Number of leading items to show as visible buttons. */
|
|
69
|
-
const [capacity, setCapacity] = useState(items.length);
|
|
70
|
-
/** Recomputes capacity from current measurements. */
|
|
71
|
-
const recompute = useCallback(() => {
|
|
72
|
-
if (!collapsible) {
|
|
73
|
-
setCapacity(fixedOrder.length);
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const container = containerRef.current;
|
|
77
|
-
const measure = measureRef.current;
|
|
78
|
-
if (!container || !measure)
|
|
79
|
-
return;
|
|
80
|
-
const containerWidth = container.getBoundingClientRect().width;
|
|
81
|
-
const childWidths = Array.from(measure.children).map((child) => child.getBoundingClientRect().width);
|
|
82
|
-
const widthByKey = {};
|
|
83
|
-
fixedOrder.forEach((key, i) => { var _a; return (widthByKey[key] = (_a = childWidths[i]) !== null && _a !== void 0 ? _a : 0); });
|
|
84
|
-
const orderedWidths = order.map((key) => { var _a; return (_a = widthByKey[key]) !== null && _a !== void 0 ? _a : 0; });
|
|
85
|
-
const moreWidth = moreMeasureRef.current
|
|
86
|
-
? moreMeasureRef.current.getBoundingClientRect().width
|
|
87
|
-
: 0;
|
|
88
|
-
const containerStyle = window.getComputedStyle(container);
|
|
89
|
-
const gap = parseFloat(containerStyle.columnGap || containerStyle.gap || "") || FALLBACK_GAP;
|
|
90
|
-
// The buttons live inside the bar's own padded pill, so subtract its
|
|
91
|
-
// horizontal padding from the width the layout math is allowed to fill.
|
|
92
|
-
const containerPaddingX = (parseFloat(containerStyle.paddingLeft) || 0) + (parseFloat(containerStyle.paddingRight) || 0);
|
|
93
|
-
const availableWidth = containerWidth - containerPaddingX;
|
|
94
|
-
setCapacity(computeVisibleCount(availableWidth, orderedWidths, moreWidth, gap));
|
|
95
|
-
// Depend on keySignature (not the fixedOrder array identity) so parent
|
|
96
|
-
// re-renders that rebuild `items` with the same keys don't churn the
|
|
97
|
-
// ResizeObserver; fixedOrder/order are captured and read at call time.
|
|
98
|
-
// totalsSignature is included so a changed count (e.g. "Unread (3)" →
|
|
99
|
-
// "Unread (15)") re-measures the button widths.
|
|
100
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
101
|
-
}, [collapsible, keySignature, totalsSignature, order]);
|
|
102
|
-
/** Measure synchronously after layout and whenever inputs change. */
|
|
103
|
-
useLayoutEffect(() => {
|
|
104
|
-
recompute();
|
|
105
|
-
}, [recompute]);
|
|
106
|
-
/** Re-measure on container resize while collapsible. */
|
|
107
|
-
useEffect(() => {
|
|
108
|
-
if (!collapsible)
|
|
109
|
-
return;
|
|
110
|
-
const container = containerRef.current;
|
|
111
|
-
if (!container || typeof ResizeObserver === "undefined")
|
|
112
|
-
return;
|
|
113
|
-
const observer = new ResizeObserver(() => recompute());
|
|
114
|
-
observer.observe(container);
|
|
115
|
-
return () => observer.disconnect();
|
|
116
|
-
}, [collapsible, recompute]);
|
|
117
|
-
/** Effective number of visible items. */
|
|
118
|
-
const visibleCount = collapsible ? Math.min(capacity, items.length) : items.length;
|
|
119
|
-
/** Keys shown as inline buttons. */
|
|
120
|
-
const visibleKeys = order.slice(0, visibleCount);
|
|
121
|
-
/** Keys collapsed into the dropdown, in fixed order. */
|
|
122
|
-
const hiddenKeys = collapsible ? getHiddenKeysInFixedOrder(order, visibleCount, fixedOrder) : [];
|
|
123
|
-
/** Whether the "..." button and dropdown are shown. */
|
|
124
|
-
const showMore = hiddenKeys.length > 0;
|
|
125
|
-
/** Handles clicks on an inline (visible) status button. */
|
|
126
|
-
const handleVisibleClick = (key) => onSelect(key);
|
|
127
|
-
/** Handles clicks on a hidden status inside the dropdown: swap then select. */
|
|
128
|
-
// Invariant: the dropdown is only rendered from the render whose `visibleCount`
|
|
129
|
-
// is current, so reading `visibleCount` from closure here is correct (order is
|
|
130
|
-
// read via the functional updater).
|
|
131
|
-
const handleHiddenClick = (key) => {
|
|
132
|
-
setOrder((prev) => swapToVisibleEnd(prev, visibleCount, key));
|
|
133
|
-
onSelect(key);
|
|
134
|
-
};
|
|
135
|
-
/** Renders the dropdown overlay listing the hidden statuses. */
|
|
136
|
-
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) => {
|
|
137
|
-
const item = itemsByKey[key];
|
|
138
|
-
if (!item)
|
|
139
|
-
return null;
|
|
140
|
-
return (React.createElement("button", { key: key, type: "button", className: statusButtonClass(key, activeKey === key, false), onClick: () => handleHiddenClick(key) }, statusLabel(item)));
|
|
141
|
-
})));
|
|
142
|
-
return (React.createElement("div", { ref: containerRef, className: classnames("status-filter-bar relative flex gap-1.5 items-center bg-bg-grey px-1.5 py-1.5 rounded-base text-font-grey text-sm", className) },
|
|
143
|
-
visibleKeys.map((key) => {
|
|
144
|
-
const item = itemsByKey[key];
|
|
145
|
-
if (!item)
|
|
146
|
-
return null;
|
|
147
|
-
return (React.createElement("button", { key: key, type: "button", className: statusButtonClass(key, activeKey === key, true), onClick: () => handleVisibleClick(key) }, statusLabel(item)));
|
|
148
|
-
}),
|
|
149
|
-
showMore && (React.createElement("div", { className: "group relative flex-none" },
|
|
150
|
-
React.createElement("button", { type: "button", "aria-label": "More statuses", "aria-haspopup": "true", className: statusButtonClass("more", false, false) },
|
|
151
|
-
React.createElement(FAIcon, { icon: faEllipsisSolid })),
|
|
152
|
-
React.createElement("div", { className: "absolute right-0 top-full z-10 pt-1.5 hidden group-hover:block" }, renderOverlay()))),
|
|
153
|
-
collapsible && (React.createElement(React.Fragment, null,
|
|
154
|
-
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))))),
|
|
155
|
-
React.createElement("button", { ref: moreMeasureRef, type: "button", tabIndex: -1, "aria-hidden": true, "data-more": "true", className: classnames("invisible pointer-events-none absolute left-[-9999px] top-0", statusButtonClass("more", false, false)) },
|
|
156
|
-
React.createElement(FAIcon, { icon: faEllipsisSolid }))))));
|
|
157
|
-
};
|
|
158
|
-
export default StatusFilterBar;
|
|
159
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "@testing-library/jest-dom/vitest";
|
|
@@ -1,102 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/index.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
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[];
|
|
@@ -1,78 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,54 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"statusFilterOverflow.test.js","sourceRoot":"","sources":["../../../src/components/StatusFilterBar/statusFilterOverflow.test.ts"],"names":[],"mappings":"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"}
|