@asteby/metacore-ui 2.6.1 → 2.6.2
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/layout/header-actions-badge.d.ts +7 -0
- package/dist/layout/header-actions-badge.d.ts.map +1 -0
- package/dist/layout/header-actions-badge.js +16 -0
- package/dist/layout/header-actions-badge.js.map +1 -0
- package/dist/layout/header-actions.d.ts +46 -0
- package/dist/layout/header-actions.d.ts.map +1 -0
- package/dist/layout/header-actions.js +32 -0
- package/dist/layout/header-actions.js.map +1 -0
- package/dist/layout/index.d.ts +1 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +1 -0
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/nav-active.d.ts +14 -5
- package/dist/layout/nav-active.d.ts.map +1 -1
- package/dist/layout/nav-active.js +45 -32
- package/dist/layout/nav-active.js.map +1 -1
- package/dist/layout/nav-group.js +3 -3
- package/dist/layout/nav-group.js.map +1 -1
- package/dist/layout/types.d.ts +9 -0
- package/dist/layout/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the aggregate overflow badge should render. A numeric `0` hides it
|
|
3
|
+
* (so hosts can pass a raw count without guarding falsy-zero), as do `false`,
|
|
4
|
+
* `null`, `undefined` and `''`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function headerActionsHasBadge(badge: number | string | boolean | null | undefined): boolean;
|
|
7
|
+
//# sourceMappingURL=header-actions-badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-actions-badge.d.ts","sourceRoot":"","sources":["../../src/layout/header-actions-badge.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAClD,OAAO,CAIT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Pure, dependency-free badge predicate for the mobile header overflow trigger.
|
|
2
|
+
// Kept in its own module (no `@/` aliases, no JSX) so it can be unit-tested in
|
|
3
|
+
// the package's node test environment without resolving the component's deps.
|
|
4
|
+
/**
|
|
5
|
+
* Whether the aggregate overflow badge should render. A numeric `0` hides it
|
|
6
|
+
* (so hosts can pass a raw count without guarding falsy-zero), as do `false`,
|
|
7
|
+
* `null`, `undefined` and `''`.
|
|
8
|
+
*/
|
|
9
|
+
export function headerActionsHasBadge(badge) {
|
|
10
|
+
if (typeof badge === 'number')
|
|
11
|
+
return badge !== 0;
|
|
12
|
+
if (typeof badge === 'boolean')
|
|
13
|
+
return badge;
|
|
14
|
+
return Boolean(badge);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=header-actions-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-actions-badge.js","sourceRoot":"","sources":["../../src/layout/header-actions-badge.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAmD;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,CAAC,CAAA;IACjD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { headerActionsHasBadge } from './header-actions-badge';
|
|
3
|
+
export { headerActionsHasBadge };
|
|
4
|
+
export interface HeaderActionsProps {
|
|
5
|
+
/**
|
|
6
|
+
* The secondary header toggles (search, dark-mode, print, settings, updates,
|
|
7
|
+
* notifications, …). On `sm:`+ they render inline; below `sm` they collapse
|
|
8
|
+
* into a single overflow popover so they never spill out of the cramped phone
|
|
9
|
+
* header.
|
|
10
|
+
*/
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Aggregate badge bubbled onto the collapsed overflow trigger so a pending
|
|
14
|
+
* notification (e.g. the "1" of a core update) is still visible when the
|
|
15
|
+
* toggles are hidden in the popover. A numeric `0`, `false`, `null`,
|
|
16
|
+
* `undefined` or `''` renders no badge. Hosts compute this from the same
|
|
17
|
+
* counts that drive the individual toggles' badges.
|
|
18
|
+
*/
|
|
19
|
+
overflowBadge?: number | string | boolean | null;
|
|
20
|
+
/** Accessible label for the overflow trigger. Defaults to "More". */
|
|
21
|
+
overflowLabel?: string;
|
|
22
|
+
/** Extra classes on the inline (desktop) container. */
|
|
23
|
+
className?: string;
|
|
24
|
+
/** Extra classes on the overflow popover content. */
|
|
25
|
+
contentClassName?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Responsive wrapper for the secondary header action toggles.
|
|
29
|
+
*
|
|
30
|
+
* - **`sm:`+ (desktop/tablet):** renders `children` inline, exactly as before.
|
|
31
|
+
* - **below `sm` (phone):** collapses every toggle into ONE overflow button (a
|
|
32
|
+
* kebab) that opens a popover containing the same toggles stacked vertically,
|
|
33
|
+
* so the header never overflows. Any pending count is bubbled onto the kebab
|
|
34
|
+
* via `overflowBadge`.
|
|
35
|
+
*
|
|
36
|
+
* Purely Tailwind-driven (`hidden sm:flex` / `flex sm:hidden`) — no resize
|
|
37
|
+
* listeners. The toggles live in the DOM twice (inline + popover) but only the
|
|
38
|
+
* breakpoint-visible copy is rendered/interactive at a time. A Popover (not a
|
|
39
|
+
* DropdownMenu) hosts the overflow so arbitrary interactive children — including
|
|
40
|
+
* toggles that open their own menus — behave correctly.
|
|
41
|
+
*
|
|
42
|
+
* The user avatar / profile dropdown is intentionally NOT part of this — keep it
|
|
43
|
+
* a sibling that stays always-visible outside `<HeaderActions>`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function HeaderActions({ children, overflowBadge, overflowLabel, className, contentClassName, }: HeaderActionsProps): React.JSX.Element;
|
|
46
|
+
//# sourceMappingURL=header-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-actions.d.ts","sourceRoot":"","sources":["../../src/layout/header-actions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,qBAAqB,EAAE,CAAA;AAEhC,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;IAChD,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,aAAa,EACb,aAAsB,EACtB,SAAS,EACT,gBAAgB,GACjB,EAAE,kBAAkB,qBAkDpB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { MoreVertical } from 'lucide-react';
|
|
4
|
+
import { cn } from '../lib/utils';
|
|
5
|
+
import { Button } from '../primitives/button';
|
|
6
|
+
import { Badge } from '../primitives/badge';
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger, } from '../primitives/popover';
|
|
8
|
+
import { headerActionsHasBadge } from './header-actions-badge';
|
|
9
|
+
export { headerActionsHasBadge };
|
|
10
|
+
/**
|
|
11
|
+
* Responsive wrapper for the secondary header action toggles.
|
|
12
|
+
*
|
|
13
|
+
* - **`sm:`+ (desktop/tablet):** renders `children` inline, exactly as before.
|
|
14
|
+
* - **below `sm` (phone):** collapses every toggle into ONE overflow button (a
|
|
15
|
+
* kebab) that opens a popover containing the same toggles stacked vertically,
|
|
16
|
+
* so the header never overflows. Any pending count is bubbled onto the kebab
|
|
17
|
+
* via `overflowBadge`.
|
|
18
|
+
*
|
|
19
|
+
* Purely Tailwind-driven (`hidden sm:flex` / `flex sm:hidden`) — no resize
|
|
20
|
+
* listeners. The toggles live in the DOM twice (inline + popover) but only the
|
|
21
|
+
* breakpoint-visible copy is rendered/interactive at a time. A Popover (not a
|
|
22
|
+
* DropdownMenu) hosts the overflow so arbitrary interactive children — including
|
|
23
|
+
* toggles that open their own menus — behave correctly.
|
|
24
|
+
*
|
|
25
|
+
* The user avatar / profile dropdown is intentionally NOT part of this — keep it
|
|
26
|
+
* a sibling that stays always-visible outside `<HeaderActions>`.
|
|
27
|
+
*/
|
|
28
|
+
export function HeaderActions({ children, overflowBadge, overflowLabel = 'More', className, contentClassName, }) {
|
|
29
|
+
const showBadge = headerActionsHasBadge(overflowBadge);
|
|
30
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn('hidden items-center gap-2 sm:flex sm:gap-4', className), children: children }), _jsx("div", { className: 'flex sm:hidden', children: _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: 'ghost', size: 'icon', className: 'relative', "aria-label": overflowLabel, children: [_jsx(MoreVertical, { className: 'h-5 w-5' }), showBadge && (_jsx(Badge, { className: 'absolute -right-0.5 -top-0.5 h-4 min-w-4 justify-center rounded-full px-1 py-0 text-[10px] leading-none', "aria-hidden": true, children: typeof overflowBadge === 'boolean' ? '' : overflowBadge }))] }) }), _jsx(PopoverContent, { align: 'end', sideOffset: 8, className: cn('flex w-auto min-w-44 flex-col items-stretch gap-1 p-2', contentClassName), children: children })] }) })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=header-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-actions.js","sourceRoot":"","sources":["../../src/layout/header-actions.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,qBAAqB,EAAE,CAAA;AA0BhC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,aAAa,EACb,aAAa,GAAG,MAAM,EACtB,SAAS,EACT,gBAAgB,GACG;IACnB,MAAM,SAAS,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAA;IAEtD,OAAO,CACL,8BAEE,cACE,SAAS,EAAE,EAAE,CACX,4CAA4C,EAC5C,SAAS,CACV,YAEA,QAAQ,GACL,EAGN,cAAK,SAAS,EAAC,gBAAgB,YAC7B,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,UAAU,gBACR,aAAa,aAEzB,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,EACnC,SAAS,IAAI,CACZ,KAAC,KAAK,IACJ,SAAS,EAAC,yGAAyG,iCAGlH,OAAO,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,GAClD,CACT,IACM,GACM,EACjB,KAAC,cAAc,IACb,KAAK,EAAC,KAAK,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,gBAAgB,CACjB,YAEA,QAAQ,GACM,IACT,GACN,IACL,CACJ,CAAA;AACH,CAAC"}
|
package/dist/layout/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { AuthenticatedLayout } from './authenticated-layout';
|
|
2
2
|
export { AppSidebar, OrganizationCard } from './app-sidebar';
|
|
3
3
|
export { Header } from './header';
|
|
4
|
+
export { HeaderActions, type HeaderActionsProps } from './header-actions';
|
|
4
5
|
export { NavUser } from './nav-user';
|
|
5
6
|
export { NavGroup, type NavLinkComponent, type NavGroupProps } from './nav-group';
|
|
6
7
|
export { checkIsActive, splitHref, declaredFiltersMatch, VIEW_PARAMS, type SplitHref, } from './nav-active';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACjF,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,KAAK,SAAS,GACf,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACjF,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,KAAK,SAAS,GACf,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,OAAO,EACP,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAA"}
|
package/dist/layout/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { AuthenticatedLayout } from './authenticated-layout';
|
|
2
2
|
export { AppSidebar, OrganizationCard } from './app-sidebar';
|
|
3
3
|
export { Header } from './header';
|
|
4
|
+
export { HeaderActions } from './header-actions';
|
|
4
5
|
export { NavUser } from './nav-user';
|
|
5
6
|
export { NavGroup } from './nav-group';
|
|
6
7
|
export { checkIsActive, splitHref, declaredFiltersMatch, VIEW_PARAMS, } from './nav-active';
|
package/dist/layout/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAA6C,MAAM,aAAa,CAAA;AACjF,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,WAAW,GAEZ,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,GAGnB,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,aAAa,EAA2B,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAA6C,MAAM,aAAa,CAAA;AACjF,OAAO,EACL,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,WAAW,GAEZ,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,GAGnB,MAAM,aAAa,CAAA"}
|
|
@@ -40,10 +40,14 @@ export declare function declaredFiltersMatch(curFilters: string, targetFilters:
|
|
|
40
40
|
*
|
|
41
41
|
* View-aware, query-aware AND filter-aware so sibling navs over the same model
|
|
42
42
|
* light up ONE at a time:
|
|
43
|
-
* - `view
|
|
44
|
-
*
|
|
45
|
-
* (
|
|
46
|
-
*
|
|
43
|
+
* - The `view` surface param is the item's identity, but it is matched on the
|
|
44
|
+
* EFFECTIVE view: an absent `?view=` resolves to the model's default
|
|
45
|
+
* `view_type` (`defaultView`, the same fallback `DynamicView` uses to pick a
|
|
46
|
+
* renderer). So a view-less landing (`/m/x?per_page=15`) lights ONLY the
|
|
47
|
+
* item whose view equals the model default — the board on a kanban-default
|
|
48
|
+
* model, the list on a list-default model — and never both. Explicit
|
|
49
|
+
* `?view=kanban`/`?view=list` URLs match their item directly. `group_by`
|
|
50
|
+
* only refines a board, so it is not part of the identity.
|
|
47
51
|
* - Other non-`f_` query params (page/sort/search) must match EXACTLY only
|
|
48
52
|
* when the item declares them — transient query never un-highlights a plain
|
|
49
53
|
* link.
|
|
@@ -51,6 +55,11 @@ export declare function declaredFiltersMatch(curFilters: string, targetFilters:
|
|
|
51
55
|
* must all be present in the current href. An item that declares NO filters
|
|
52
56
|
* matches on path alone (a manually-filtered table still highlights its base
|
|
53
57
|
* item), preserving the prior behaviour for plain links.
|
|
58
|
+
*
|
|
59
|
+
* `defaultView` is the model's default `view_type` for this path (e.g.
|
|
60
|
+
* `'kanban'`). Hosts thread it from `metadata.view_type`; when omitted the
|
|
61
|
+
* absent-view fallback is `''` (a view-less URL then only matches a view-less
|
|
62
|
+
* item).
|
|
54
63
|
*/
|
|
55
|
-
export declare function checkIsActive(href: string, item: NavItem, mainNav?: boolean): boolean;
|
|
64
|
+
export declare function checkIsActive(href: string, item: NavItem, mainNav?: boolean, defaultView?: string): boolean;
|
|
56
65
|
//# sourceMappingURL=nav-active.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-active.d.ts","sourceRoot":"","sources":["../../src/layout/nav-active.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAA;AAEvE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,aAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"nav-active.d.ts","sourceRoot":"","sources":["../../src/layout/nav-active.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAA;AAEvE;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,aAAgC,CAAA;AA6BxD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CA0BhD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAIT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,UAAQ,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAqDT"}
|
|
@@ -7,21 +7,30 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export const VIEW_PARAMS = new Set(['view', 'group_by']);
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
10
|
+
* Extracts the `view=` value from a normalized view bucket (e.g. `'kanban'`
|
|
11
|
+
* from `'group_by=stage&view=kanban'`, `'list'` from `'view=list'`, `''` when
|
|
12
|
+
* the bucket declares no `view`). The `view` param is the surface identity
|
|
13
|
+
* (table vs board); `group_by` only refines a board, so it never makes a nav
|
|
14
|
+
* item identity on its own.
|
|
15
|
+
*/
|
|
16
|
+
function viewValueOf(viewBucket) {
|
|
17
|
+
for (const part of viewBucket.split('&')) {
|
|
18
|
+
if (part.startsWith('view='))
|
|
19
|
+
return part.slice('view='.length);
|
|
20
|
+
}
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolves a (possibly empty) `view` value to the EFFECTIVE surface, mirroring
|
|
25
|
+
* `DynamicView.resolveActiveView`: an absent `?view=` falls back to the model's
|
|
26
|
+
* default `view_type`. This is why the matcher must be told the model default —
|
|
27
|
+
* a view-less landing on a kanban-default model paints (and must light) the
|
|
28
|
+
* board, while on a list-default model it paints (and must light) the list.
|
|
29
|
+
* Without a known default we resolve to `''` (no assumption) so a view-less URL
|
|
30
|
+
* only matches a view-less item — never both siblings.
|
|
21
31
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return DEFAULT_VIEW_BUCKETS.has(view);
|
|
32
|
+
function resolveView(viewValue, defaultView) {
|
|
33
|
+
return viewValue || defaultView || '';
|
|
25
34
|
}
|
|
26
35
|
/**
|
|
27
36
|
* Splits a URL into its path and three normalized, sorted query buckets:
|
|
@@ -82,10 +91,14 @@ export function declaredFiltersMatch(curFilters, targetFilters) {
|
|
|
82
91
|
*
|
|
83
92
|
* View-aware, query-aware AND filter-aware so sibling navs over the same model
|
|
84
93
|
* light up ONE at a time:
|
|
85
|
-
* - `view
|
|
86
|
-
*
|
|
87
|
-
* (
|
|
88
|
-
*
|
|
94
|
+
* - The `view` surface param is the item's identity, but it is matched on the
|
|
95
|
+
* EFFECTIVE view: an absent `?view=` resolves to the model's default
|
|
96
|
+
* `view_type` (`defaultView`, the same fallback `DynamicView` uses to pick a
|
|
97
|
+
* renderer). So a view-less landing (`/m/x?per_page=15`) lights ONLY the
|
|
98
|
+
* item whose view equals the model default — the board on a kanban-default
|
|
99
|
+
* model, the list on a list-default model — and never both. Explicit
|
|
100
|
+
* `?view=kanban`/`?view=list` URLs match their item directly. `group_by`
|
|
101
|
+
* only refines a board, so it is not part of the identity.
|
|
89
102
|
* - Other non-`f_` query params (page/sort/search) must match EXACTLY only
|
|
90
103
|
* when the item declares them — transient query never un-highlights a plain
|
|
91
104
|
* link.
|
|
@@ -93,23 +106,23 @@ export function declaredFiltersMatch(curFilters, targetFilters) {
|
|
|
93
106
|
* must all be present in the current href. An item that declares NO filters
|
|
94
107
|
* matches on path alone (a manually-filtered table still highlights its base
|
|
95
108
|
* item), preserving the prior behaviour for plain links.
|
|
109
|
+
*
|
|
110
|
+
* `defaultView` is the model's default `view_type` for this path (e.g.
|
|
111
|
+
* `'kanban'`). Hosts thread it from `metadata.view_type`; when omitted the
|
|
112
|
+
* absent-view fallback is `''` (a view-less URL then only matches a view-less
|
|
113
|
+
* item).
|
|
96
114
|
*/
|
|
97
|
-
export function checkIsActive(href, item, mainNav = false) {
|
|
115
|
+
export function checkIsActive(href, item, mainNav = false, defaultView) {
|
|
98
116
|
const hasItems = 'items' in item && Array.isArray(item.items);
|
|
99
117
|
const cur = splitHref(href);
|
|
100
118
|
const target = splitHref(item.url);
|
|
101
|
-
// Same path: this item matches only when the view
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// lights the Issues/list item on the bare default landing (`?per_page=15`, no
|
|
109
|
-
// `view`) without ever lighting the Board (`?view=kanban`), which is not a
|
|
110
|
-
// default bucket — so siblings stay mutually exclusive.
|
|
111
|
-
const viewMatches = cur.view === target.view ||
|
|
112
|
-
(isDefaultViewBucket(cur.view) && isDefaultViewBucket(target.view));
|
|
119
|
+
// Same path: this item matches only when the EFFECTIVE view (resolving an
|
|
120
|
+
// absent `?view=` to the model default) matches, transient query matches when
|
|
121
|
+
// declared, and declared f_ filters are all present. A same-path item that
|
|
122
|
+
// DOESN'T match falls through (a collapsible parent can still be active via a
|
|
123
|
+
// matching child below) rather than returning early.
|
|
124
|
+
const viewMatches = resolveView(viewValueOf(cur.view), defaultView) ===
|
|
125
|
+
resolveView(viewValueOf(target.view), defaultView);
|
|
113
126
|
if (cur.path === target.path &&
|
|
114
127
|
viewMatches &&
|
|
115
128
|
(!target.query || cur.query === target.query) &&
|
|
@@ -117,7 +130,7 @@ export function checkIsActive(href, item, mainNav = false) {
|
|
|
117
130
|
return true;
|
|
118
131
|
}
|
|
119
132
|
if (hasItems &&
|
|
120
|
-
item.items.some((i) => checkIsActive(href, i))) {
|
|
133
|
+
item.items.some((i) => checkIsActive(href, i, false, defaultView))) {
|
|
121
134
|
return true;
|
|
122
135
|
}
|
|
123
136
|
if (mainNav) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-active.js","sourceRoot":"","sources":["../../src/layout/nav-active.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAExD
|
|
1
|
+
{"version":3,"file":"nav-active.js","sourceRoot":"","sources":["../../src/layout/nav-active.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAExD;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,UAAkB;IACrC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,SAAiB,EAAE,WAAoB;IAC1D,OAAO,SAAS,IAAI,WAAW,IAAI,EAAE,CAAA;AACvC,CAAC;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IACzE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,MAAM,WAAW,GAAuB,EAAE,CAAA;IAC1C,MAAM,aAAa,GAAuB,EAAE,CAAA;IAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;aAC7C,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAE,EAAE,CACrC,CAAC;SACE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9D;SACA,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACd,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;QACvB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;KAC7B,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,aAAqB;IAErB,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAA;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC5D,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,IAAa,EACb,OAAO,GAAG,KAAK,EACf,WAAoB;IAEpB,MAAM,QAAQ,GAAG,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE7D,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,0EAA0E;IAC1E,8EAA8E;IAC9E,2EAA2E;IAC3E,8EAA8E;IAC9E,qDAAqD;IACrD,MAAM,WAAW,GACf,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;QAC/C,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAA;IAEpD,IACE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;QACxB,WAAW;QACX,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;QAC7C,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EACjD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IACE,QAAQ;QACP,IAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAc,EAAE,EAAE,CACzD,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAC3C,EACD,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtD,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YACnD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,GAAG,IAAK,IAA2B,CAAC,KAAK,EAAE,CAAC;gBACrD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACzD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;oBACtD,OAAO,IAAI,CAAA;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/dist/layout/nav-group.js
CHANGED
|
@@ -37,13 +37,13 @@ function hasBadge(badge) {
|
|
|
37
37
|
}
|
|
38
38
|
function SidebarMenuLink({ item, href, LinkComponent, onItemHover, }) {
|
|
39
39
|
const { setOpenMobile } = useSidebar();
|
|
40
|
-
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: checkIsActive(href, item), tooltip: item.title, children: _jsxs(LinkComponent, { to: item.url, onClick: () => setOpenMobile(false), onMouseEnter: () => onItemHover?.(item.url), children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge })] }) }) }));
|
|
40
|
+
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, isActive: checkIsActive(href, item, false, item.defaultView), tooltip: item.title, children: _jsxs(LinkComponent, { to: item.url, onClick: () => setOpenMobile(false), onMouseEnter: () => onItemHover?.(item.url), children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge })] }) }) }));
|
|
41
41
|
}
|
|
42
42
|
function SidebarMenuCollapsible({ item, href, LinkComponent, onItemHover, }) {
|
|
43
43
|
const { setOpenMobile } = useSidebar();
|
|
44
|
-
return (_jsx(Collapsible, { asChild: true, defaultOpen: checkIsActive(href, item, true), className: 'group/collapsible', children: _jsxs(SidebarMenuItem, { children: [_jsx(CollapsibleTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { tooltip: item.title, children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge }), _jsx(ChevronRight, { className: 'ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180' })] }) }), _jsx(CollapsibleContent, { className: 'CollapsibleContent', children: _jsx(SidebarMenuSub, { children: item.items.map((subItem) => (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: checkIsActive(href, subItem), children: _jsxs(LinkComponent, { to: subItem.url, onClick: () => setOpenMobile(false), onMouseEnter: () => onItemHover?.(subItem.url), children: [subItem.icon && _jsx(subItem.icon, {}), _jsx("span", { children: subItem.title }), hasBadge(subItem.badge) && _jsx(NavBadge, { children: subItem.badge })] }) }) }, subItem.title))) }) })] }) }));
|
|
44
|
+
return (_jsx(Collapsible, { asChild: true, defaultOpen: checkIsActive(href, item, true, item.defaultView), className: 'group/collapsible', children: _jsxs(SidebarMenuItem, { children: [_jsx(CollapsibleTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { tooltip: item.title, children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge }), _jsx(ChevronRight, { className: 'ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90 rtl:rotate-180' })] }) }), _jsx(CollapsibleContent, { className: 'CollapsibleContent', children: _jsx(SidebarMenuSub, { children: item.items.map((subItem) => (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { asChild: true, isActive: checkIsActive(href, subItem, false, subItem.defaultView ?? item.defaultView), children: _jsxs(LinkComponent, { to: subItem.url, onClick: () => setOpenMobile(false), onMouseEnter: () => onItemHover?.(subItem.url), children: [subItem.icon && _jsx(subItem.icon, {}), _jsx("span", { children: subItem.title }), hasBadge(subItem.badge) && _jsx(NavBadge, { children: subItem.badge })] }) }) }, subItem.title))) }) })] }) }));
|
|
45
45
|
}
|
|
46
46
|
function SidebarMenuCollapsedDropdown({ item, href, LinkComponent, onItemHover, }) {
|
|
47
|
-
return (_jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { tooltip: item.title, isActive: checkIsActive(href, item), children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge }), _jsx(ChevronRight, { className: 'ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90' })] }) }), _jsxs(DropdownMenuContent, { side: 'right', align: 'start', sideOffset: 4, children: [_jsxs(DropdownMenuLabel, { children: [item.title, " ", item.badge ? `(${item.badge})` : ''] }), _jsx(DropdownMenuSeparator, {}), item.items.map((sub) => (_jsx(DropdownMenuItem, { asChild: true, children: _jsxs(LinkComponent, { to: sub.url, className: `${checkIsActive(href, sub) ? 'bg-secondary' : ''}`, onMouseEnter: () => onItemHover?.(sub.url), children: [sub.icon && _jsx(sub.icon, {}), _jsx("span", { className: 'max-w-52 text-wrap', children: sub.title }), hasBadge(sub.badge) && (_jsx("span", { className: 'ms-auto text-xs', children: sub.badge }))] }) }, `${sub.title}-${sub.url}`)))] })] }) }));
|
|
47
|
+
return (_jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { tooltip: item.title, isActive: checkIsActive(href, item, false, item.defaultView), children: [item.icon && _jsx(item.icon, {}), _jsx("span", { children: item.title }), hasBadge(item.badge) && _jsx(NavBadge, { children: item.badge }), _jsx(ChevronRight, { className: 'ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90' })] }) }), _jsxs(DropdownMenuContent, { side: 'right', align: 'start', sideOffset: 4, children: [_jsxs(DropdownMenuLabel, { children: [item.title, " ", item.badge ? `(${item.badge})` : ''] }), _jsx(DropdownMenuSeparator, {}), item.items.map((sub) => (_jsx(DropdownMenuItem, { asChild: true, children: _jsxs(LinkComponent, { to: sub.url, className: `${checkIsActive(href, sub, false, sub.defaultView ?? item.defaultView) ? 'bg-secondary' : ''}`, onMouseEnter: () => onItemHover?.(sub.url), children: [sub.icon && _jsx(sub.icon, {}), _jsx("span", { className: 'max-w-52 text-wrap', children: sub.title }), hasBadge(sub.badge) && (_jsx("span", { className: 'ms-auto text-xs', children: sub.badge }))] }) }, `${sub.title}-${sub.url}`)))] })] }) }));
|
|
48
48
|
}
|
|
49
49
|
//# sourceMappingURL=nav-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-group.js","sourceRoot":"","sources":["../../src/layout/nav-group.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nav-group.js","sourceRoot":"","sources":["../../src/layout/nav-group.tsx"],"names":[],"mappings":"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"}
|
package/dist/layout/types.d.ts
CHANGED
|
@@ -11,6 +11,15 @@ export interface NavLinkItem {
|
|
|
11
11
|
*/
|
|
12
12
|
badge?: number | string;
|
|
13
13
|
role?: string;
|
|
14
|
+
/**
|
|
15
|
+
* The model's default `view_type` for this entry's path (e.g. `'kanban'` or
|
|
16
|
+
* `'list'`). Lets the active-state matcher resolve a view-less current URL
|
|
17
|
+
* (`/m/x?per_page=15`, no `?view`) to the surface the model actually paints,
|
|
18
|
+
* so exactly one of sibling view items (Board vs List) lights up. Hosts thread
|
|
19
|
+
* it from `metadata.view_type`; omit it and a view-less URL only matches a
|
|
20
|
+
* view-less item.
|
|
21
|
+
*/
|
|
22
|
+
defaultView?: string;
|
|
14
23
|
}
|
|
15
24
|
export interface NavCollapsibleItem extends NavLinkItem {
|
|
16
25
|
items: NavLinkItem[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,kBAAkB,CAAA;AAEtD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
|
package/package.json
CHANGED