@shefing/quickfilter 1.0.38 → 1.0.40

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.
@@ -0,0 +1,27 @@
1
+ import type { groupNavItems } from '@payloadcms/ui/shared';
2
+ import type { ClientUser, Locale, ServerProps } from 'payload';
3
+ import React from 'react';
4
+ export type DashboardViewClientProps = {
5
+ locale: Locale;
6
+ };
7
+ export type DashboardViewServerPropsOnly = {
8
+ globalData: Array<{
9
+ data: {
10
+ _isLocked: boolean;
11
+ _lastEditedAt: string;
12
+ _userEditing: ClientUser | number | string;
13
+ };
14
+ lockDuration?: number;
15
+ slug: string;
16
+ }>;
17
+ /**
18
+ * @deprecated
19
+ * This prop is deprecated and will be removed in the next major version.
20
+ * Components now import their own `Link` directly from `next/link`.
21
+ */
22
+ Link?: React.ComponentType;
23
+ navGroups?: ReturnType<typeof groupNavItems>;
24
+ } & ServerProps;
25
+ export type DashboardViewServerProps = DashboardViewClientProps & DashboardViewServerPropsOnly;
26
+ export declare function DefaultDashboard(props: DashboardViewServerProps): React.JSX.Element;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Dashboard/Default/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO9D,OAAO,KAAmB,MAAM,OAAO,CAAA;AAMvC,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;SAAE,CAAA;QAC/F,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,IAAI,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;IACF;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC1B,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;CAC7C,GAAG,WAAW,CAAA;AAEf,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,GAAG,4BAA4B,CAAA;AAE9F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,qBAgK/D"}
@@ -0,0 +1,138 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getTranslation } from '@payloadcms/translations';
3
+ import { Button, Card, Gutter, Locked } from '@payloadcms/ui';
4
+ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
5
+ import { EntityType } from '@payloadcms/ui/shared';
6
+ import { formatAdminURL } from 'payload/shared';
7
+ import React, { Fragment } from 'react';
8
+ const baseClass = 'dashboard';
9
+ export function DefaultDashboard(props) {
10
+ const { globalData, i18n, i18n: { t }, locale, navGroups, params, payload: { config: { admin: { components: { afterDashboard, beforeDashboard } }, routes: { admin: adminRoute } } }, payload, permissions, searchParams, user } = props;
11
+ return /*#__PURE__*/ _jsx("div", {
12
+ className: baseClass,
13
+ children: /*#__PURE__*/ _jsxs(Gutter, {
14
+ className: `${baseClass}__wrap`,
15
+ children: [
16
+ beforeDashboard && RenderServerComponent({
17
+ Component: beforeDashboard,
18
+ importMap: payload.importMap,
19
+ serverProps: {
20
+ i18n,
21
+ locale,
22
+ params,
23
+ payload,
24
+ permissions,
25
+ searchParams,
26
+ user
27
+ }
28
+ }),
29
+ /*#__PURE__*/ _jsx(Fragment, {
30
+ children: !navGroups || navGroups?.length === 0 ? /*#__PURE__*/ _jsx("p", {
31
+ children: "no nav groups...."
32
+ }) : navGroups.map(({ entities, label }, groupIndex)=>{
33
+ return /*#__PURE__*/ _jsxs("div", {
34
+ className: `${baseClass}__group`,
35
+ children: [
36
+ /*#__PURE__*/ _jsx("h2", {
37
+ className: `${baseClass}__label`,
38
+ children: label
39
+ }),
40
+ /*#__PURE__*/ _jsx("ul", {
41
+ className: `${baseClass}__card-list`,
42
+ children: entities.map(({ slug, type, label, href: entityHref }, entityIndex)=>{
43
+ let title;
44
+ let buttonAriaLabel;
45
+ let createHREF;
46
+ let href;
47
+ let hasCreatePermission;
48
+ let isLocked = null;
49
+ let userEditing = null;
50
+ if (type === EntityType.collection) {
51
+ title = getTranslation(label, i18n);
52
+ buttonAriaLabel = t('general:showAllLabel', {
53
+ label: title
54
+ });
55
+ // Use the processed href if available, otherwise use the default
56
+ href = entityHref || formatAdminURL({
57
+ adminRoute,
58
+ path: `/collections/${slug}`
59
+ });
60
+ createHREF = formatAdminURL({
61
+ adminRoute,
62
+ path: `/collections/${slug}/create`
63
+ });
64
+ hasCreatePermission = permissions?.collections?.[slug]?.create;
65
+ }
66
+ if (type === EntityType.global) {
67
+ title = getTranslation(label, i18n);
68
+ buttonAriaLabel = t('general:editLabel', {
69
+ label: getTranslation(label, i18n)
70
+ });
71
+ href = formatAdminURL({
72
+ adminRoute,
73
+ path: `/globals/${slug}`
74
+ });
75
+ // Find the lock status for the global
76
+ const globalLockData = globalData.find((global)=>global.slug === slug);
77
+ if (globalLockData) {
78
+ isLocked = globalLockData.data._isLocked;
79
+ userEditing = globalLockData.data._userEditing;
80
+ // Check if the lock is expired
81
+ const lockDuration = globalLockData?.lockDuration;
82
+ const lastEditedAt = new Date(globalLockData.data?._lastEditedAt).getTime();
83
+ const lockDurationInMilliseconds = lockDuration * 1000;
84
+ const lockExpirationTime = lastEditedAt + lockDurationInMilliseconds;
85
+ if (new Date().getTime() > lockExpirationTime) {
86
+ isLocked = false;
87
+ userEditing = null;
88
+ }
89
+ }
90
+ }
91
+ return /*#__PURE__*/ _jsx("li", {
92
+ children: /*#__PURE__*/ _jsx(Card, {
93
+ actions: isLocked && user?.id !== userEditing?.id ? /*#__PURE__*/ _jsx(Locked, {
94
+ className: `${baseClass}__locked`,
95
+ user: userEditing
96
+ }) : hasCreatePermission && type === EntityType.collection ? /*#__PURE__*/ _jsx(Button, {
97
+ "aria-label": t('general:createNewLabel', {
98
+ label
99
+ }),
100
+ buttonStyle: "icon-label",
101
+ el: "link",
102
+ icon: "plus",
103
+ iconStyle: "with-border",
104
+ round: true,
105
+ to: createHREF
106
+ }) : undefined,
107
+ buttonAriaLabel: buttonAriaLabel,
108
+ href: href,
109
+ id: `card-${slug}`,
110
+ title: getTranslation(label, i18n),
111
+ titleAs: "h3"
112
+ })
113
+ }, entityIndex);
114
+ })
115
+ })
116
+ ]
117
+ }, groupIndex);
118
+ })
119
+ }),
120
+ afterDashboard && RenderServerComponent({
121
+ Component: afterDashboard,
122
+ importMap: payload.importMap,
123
+ serverProps: {
124
+ i18n,
125
+ locale,
126
+ params,
127
+ payload,
128
+ permissions,
129
+ searchParams,
130
+ user
131
+ }
132
+ })
133
+ ]
134
+ })
135
+ });
136
+ }
137
+
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/Dashboard/Default/index.tsx"],"sourcesContent":["import type { groupNavItems } from '@payloadcms/ui/shared'\nimport type { ClientUser, Locale, ServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Button, Card, Gutter, Locked } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType } from '@payloadcms/ui/shared'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nimport {EntityWithHref} from \"../../types\";\n\nconst baseClass = 'dashboard'\n\nexport type DashboardViewClientProps = {\n locale: Locale\n}\n\nexport type DashboardViewServerPropsOnly = {\n globalData: Array<{\n data: { _isLocked: boolean; _lastEditedAt: string; _userEditing: ClientUser | number | string }\n lockDuration?: number\n slug: string\n }>\n /**\n * @deprecated\n * This prop is deprecated and will be removed in the next major version.\n * Components now import their own `Link` directly from `next/link`.\n */\n Link?: React.ComponentType\n navGroups?: ReturnType<typeof groupNavItems>\n} & ServerProps\n\nexport type DashboardViewServerProps = DashboardViewClientProps & DashboardViewServerPropsOnly\n\nexport function DefaultDashboard(props: DashboardViewServerProps) {\n const {\n globalData,\n i18n,\n i18n: { t },\n locale,\n navGroups,\n params,\n payload: {\n config: {\n admin: {\n components: { afterDashboard, beforeDashboard },\n },\n routes: { admin: adminRoute },\n },\n },\n payload,\n permissions,\n searchParams,\n user,\n } = props\n\n return (\n <div className={baseClass}>\n <Gutter className={`${baseClass}__wrap`}>\n {beforeDashboard &&\n RenderServerComponent({\n Component: beforeDashboard,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n } satisfies ServerProps,\n })}\n\n <Fragment>\n {!navGroups || navGroups?.length === 0 ? (\n <p>no nav groups....</p>\n ) : (\n navGroups.map(({ entities, label }, groupIndex) => {\n return (\n <div className={`${baseClass}__group`} key={groupIndex}>\n <h2 className={`${baseClass}__label`}>{label}</h2>\n <ul className={`${baseClass}__card-list`}>\n {entities.map(({ slug, type, label, href: entityHref }:EntityWithHref, entityIndex) => {\n let title: string\n let buttonAriaLabel: string\n let createHREF: string\n let href: string\n let hasCreatePermission: boolean\n let isLocked = null\n let userEditing = null\n\n if (type === EntityType.collection) {\n title = getTranslation(label, i18n)\n\n buttonAriaLabel = t('general:showAllLabel', { label: title })\n\n // Use the processed href if available, otherwise use the default\n href = entityHref || formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n\n createHREF = formatAdminURL({\n adminRoute,\n path: `/collections/${slug}/create`,\n })\n\n hasCreatePermission = permissions?.collections?.[slug]?.create\n }\n\n if (type === EntityType.global) {\n title = getTranslation(label, i18n)\n\n buttonAriaLabel = t('general:editLabel', {\n label: getTranslation(label, i18n),\n })\n\n href = formatAdminURL({\n adminRoute,\n path: `/globals/${slug}`,\n })\n\n // Find the lock status for the global\n const globalLockData = globalData.find((global) => global.slug === slug)\n if (globalLockData) {\n isLocked = globalLockData.data._isLocked\n userEditing = globalLockData.data._userEditing\n\n // Check if the lock is expired\n const lockDuration = globalLockData?.lockDuration\n const lastEditedAt = new Date(\n globalLockData.data?._lastEditedAt,\n ).getTime()\n\n const lockDurationInMilliseconds = lockDuration * 1000\n const lockExpirationTime = lastEditedAt + lockDurationInMilliseconds\n\n if (new Date().getTime() > lockExpirationTime) {\n isLocked = false\n userEditing = null\n }\n }\n }\n\n return (\n <li key={entityIndex}>\n <Card\n actions={\n isLocked && user?.id !== userEditing?.id ? (\n <Locked className={`${baseClass}__locked`} user={userEditing} />\n ) : hasCreatePermission && type === EntityType.collection ? (\n <Button\n aria-label={t('general:createNewLabel', {\n label,\n })}\n buttonStyle=\"icon-label\"\n el=\"link\"\n icon=\"plus\"\n iconStyle=\"with-border\"\n round\n to={createHREF}\n />\n ) : undefined\n }\n buttonAriaLabel={buttonAriaLabel}\n href={href}\n id={`card-${slug}`}\n title={getTranslation(label, i18n)}\n titleAs=\"h3\"\n />\n </li>\n )\n })}\n </ul>\n </div>\n )\n })\n )}\n </Fragment>\n {afterDashboard &&\n RenderServerComponent({\n Component: afterDashboard,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n } satisfies ServerProps,\n })}\n </Gutter>\n </div>\n )\n}\n"],"names":["getTranslation","Button","Card","Gutter","Locked","RenderServerComponent","EntityType","formatAdminURL","React","Fragment","baseClass","DefaultDashboard","props","globalData","i18n","t","locale","navGroups","params","payload","config","admin","components","afterDashboard","beforeDashboard","routes","adminRoute","permissions","searchParams","user","div","className","Component","importMap","serverProps","length","p","map","entities","label","groupIndex","h2","ul","slug","type","href","entityHref","entityIndex","title","buttonAriaLabel","createHREF","hasCreatePermission","isLocked","userEditing","collection","path","collections","create","global","globalLockData","find","data","_isLocked","_userEditing","lockDuration","lastEditedAt","Date","_lastEditedAt","getTime","lockDurationInMilliseconds","lockExpirationTime","li","actions","id","aria-label","buttonStyle","el","icon","iconStyle","round","to","undefined","titleAs"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AdminViewServerProps } from 'payload';
2
+ import React from 'react';
3
+ export declare function Dashboard({ initPageResult, params, searchParams }: AdminViewServerProps): Promise<React.JSX.Element>;
4
+ export default Dashboard;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Dashboard/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,SAAS,CAAA;AAKjD,OAAO,KAAmB,MAAM,OAAO,CAAA;AAOvC,wBAAsB,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,oBAAoB,8BAoH7F;AAED,eAAe,SAAS,CAAA"}
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { HydrateAuthProvider, SetStepNav } from '@payloadcms/ui';
3
+ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
4
+ import { EntityType, groupNavItems } from '@payloadcms/ui/shared';
5
+ import React, { Fragment } from 'react';
6
+ import { processNavGroups } from '../lib/utils';
7
+ import { DefaultDashboard } from './Default';
8
+ export async function Dashboard({ initPageResult, params, searchParams }) {
9
+ const { locale, permissions, req: { i18n, payload: { config }, payload, user }, req, visibleEntities } = initPageResult;
10
+ const collections = config.collections.filter((collection)=>permissions?.collections?.[collection.slug]?.read && visibleEntities.collections.includes(collection.slug));
11
+ const globals = config.globals.filter((global)=>permissions?.globals?.[global.slug]?.read && visibleEntities.globals.includes(global.slug));
12
+ // Query locked global documents only if there are globals in the config
13
+ let globalData = [];
14
+ if (config.globals.length > 0) {
15
+ const lockedDocuments = await payload.find({
16
+ collection: 'payload-locked-documents',
17
+ depth: 1,
18
+ overrideAccess: false,
19
+ pagination: false,
20
+ req,
21
+ where: {
22
+ globalSlug: {
23
+ exists: true
24
+ }
25
+ }
26
+ });
27
+ // Map over globals to include `lockDuration` and lock data for each global slug
28
+ globalData = config.globals.map((global)=>{
29
+ const lockDurationDefault = 300;
30
+ const lockDuration = typeof global.lockDocuments === 'object' ? global.lockDocuments.duration : lockDurationDefault;
31
+ const lockedDoc = lockedDocuments.docs.find((doc)=>doc.globalSlug === global.slug);
32
+ return {
33
+ slug: global.slug,
34
+ data: {
35
+ _isLocked: !!lockedDoc,
36
+ _lastEditedAt: lockedDoc?.updatedAt ?? null,
37
+ _userEditing: lockedDoc?.user?.value ?? null
38
+ },
39
+ lockDuration
40
+ };
41
+ });
42
+ }
43
+ const navGroups = groupNavItems([
44
+ ...collections.map((collection)=>{
45
+ const entityToGroup = {
46
+ type: EntityType.collection,
47
+ entity: collection
48
+ };
49
+ return entityToGroup;
50
+ }) ?? [],
51
+ ...globals.map((global)=>{
52
+ const entityToGroup = {
53
+ type: EntityType.global,
54
+ entity: global
55
+ };
56
+ return entityToGroup;
57
+ }) ?? []
58
+ ], permissions, i18n);
59
+ // Process collections to calculate URLs with defaultFilter
60
+ const processedGroups = processNavGroups(navGroups, collections, payload, i18n);
61
+ return /*#__PURE__*/ _jsxs(Fragment, {
62
+ children: [
63
+ /*#__PURE__*/ _jsx(HydrateAuthProvider, {
64
+ permissions: permissions
65
+ }),
66
+ /*#__PURE__*/ _jsx(SetStepNav, {
67
+ nav: []
68
+ }),
69
+ RenderServerComponent({
70
+ clientProps: {
71
+ locale
72
+ },
73
+ Component: config.admin?.components?.views?.dashboard?.Component,
74
+ Fallback: DefaultDashboard,
75
+ importMap: payload.importMap,
76
+ serverProps: {
77
+ globalData,
78
+ i18n,
79
+ locale,
80
+ navGroups: processedGroups,
81
+ params,
82
+ payload,
83
+ permissions,
84
+ searchParams,
85
+ user,
86
+ visibleEntities
87
+ }
88
+ })
89
+ ]
90
+ });
91
+ }
92
+ export default Dashboard;
93
+
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Dashboard/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type {AdminViewServerProps} from 'payload'\n\nimport { HydrateAuthProvider, SetStepNav } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React, { Fragment } from 'react'\nimport { processNavGroups } from '../lib/utils'\n\nimport type { DashboardViewClientProps, DashboardViewServerPropsOnly } from './Default/index'\n\nimport { DefaultDashboard } from './Default'\n\nexport async function Dashboard({ initPageResult, params, searchParams }: AdminViewServerProps) {\n const {\n locale,\n permissions,\n req: {\n i18n,\n payload: { config },\n payload,\n user,\n },\n req,\n visibleEntities,\n } = initPageResult\n\n const collections = config.collections.filter(\n (collection) =>\n permissions?.collections?.[collection.slug]?.read &&\n visibleEntities.collections.includes(collection.slug),\n )\n\n const globals = config.globals.filter(\n (global) =>\n permissions?.globals?.[global.slug]?.read && visibleEntities.globals.includes(global.slug),\n )\n\n // Query locked global documents only if there are globals in the config\n let globalData = []\n\n if (config.globals.length > 0) {\n const lockedDocuments = await payload.find({\n collection: 'payload-locked-documents',\n depth: 1,\n overrideAccess: false,\n pagination: false,\n req,\n where: {\n globalSlug: {\n exists: true,\n },\n },\n })\n\n // Map over globals to include `lockDuration` and lock data for each global slug\n globalData = config.globals.map((global) => {\n const lockDurationDefault = 300\n const lockDuration =\n typeof global.lockDocuments === 'object'\n ? global.lockDocuments.duration\n : lockDurationDefault\n\n const lockedDoc = lockedDocuments.docs.find((doc) => doc.globalSlug === global.slug)\n\n return {\n slug: global.slug,\n data: {\n _isLocked: !!lockedDoc,\n _lastEditedAt: lockedDoc?.updatedAt ?? null,\n _userEditing: lockedDoc?.user?.value ?? null,\n },\n lockDuration,\n }\n })\n }\n\n const navGroups = groupNavItems(\n [\n ...(collections.map((collection) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.collection,\n entity: collection,\n }\n\n return entityToGroup\n }) ?? []),\n ...(globals.map((global) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.global,\n entity: global,\n }\n\n return entityToGroup\n }) ?? []),\n ],\n permissions,\n i18n,\n )\n\n // Process collections to calculate URLs with defaultFilter\n const processedGroups = processNavGroups(navGroups, collections, payload, i18n);\n\n return (\n <Fragment>\n <HydrateAuthProvider permissions={permissions} />\n <SetStepNav nav={[]} />\n {RenderServerComponent({\n clientProps: {\n locale,\n } satisfies DashboardViewClientProps,\n Component: config.admin?.components?.views?.dashboard?.Component,\n Fallback: DefaultDashboard,\n importMap: payload.importMap,\n serverProps: {\n globalData,\n i18n,\n locale,\n navGroups: processedGroups,\n params,\n payload,\n permissions,\n searchParams,\n user,\n visibleEntities,\n } satisfies DashboardViewServerPropsOnly,\n })}\n </Fragment>\n )\n}\n\nexport default Dashboard\n"],"names":["HydrateAuthProvider","SetStepNav","RenderServerComponent","EntityType","groupNavItems","React","Fragment","processNavGroups","DefaultDashboard","Dashboard","initPageResult","params","searchParams","locale","permissions","req","i18n","payload","config","user","visibleEntities","collections","filter","collection","slug","read","includes","globals","global","globalData","length","lockedDocuments","find","depth","overrideAccess","pagination","where","globalSlug","exists","map","lockDurationDefault","lockDuration","lockDocuments","duration","lockedDoc","docs","doc","data","_isLocked","_lastEditedAt","updatedAt","_userEditing","value","navGroups","entityToGroup","type","entity","processedGroups","nav","clientProps","Component","admin","components","views","dashboard","Fallback","importMap","serverProps"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { type ClassValue } from 'clsx';
2
- import { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime';
3
2
  import type { FilterDetaild } from '../filters/types/filters-type';
4
3
  import { SupportedLocale } from '../labels';
4
+ import type { Field } from 'payload';
5
5
  export declare function cn(...inputs: ClassValue[]): string;
6
- export declare function handleNavigation(href: string, e: React.MouseEvent, pathname: string, router: AppRouterInstance): void;
7
6
  export declare const parseWhereClauseToFilterValues: (where: any, fields: FilterDetaild[], locale: SupportedLocale) => Record<string, any>;
8
7
  export declare const buildQuickFilterConditions: (values: Record<string, any>, fieldDefs: FilterDetaild[], locale: SupportedLocale) => Record<string, any>[];
8
+ export declare function findFieldByName(fields: Field[], fieldName: string): Field;
9
+ export declare function processNavGroups(groups: any[], collections: any[], payload: any, i18n: any): any[];
9
10
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAA;AAC1F,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAO3C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,KAAK,CAAC,UAAU,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,QAmB1B;AAGD,eAAO,MAAM,8BAA8B,UAClC,GAAG,UACF,aAAa,EAAE,UACf,eAAe,KACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAqGpB,CAAA;AAED,eAAO,MAAM,0BAA0B,WAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aAChB,aAAa,EAAE,UAClB,eAAe,KACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EA6DrB,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAA;AAE5C,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAM3C,OAAO,KAAK,EAAC,KAAK,EAA4C,MAAM,SAAS,CAAA;AAK7E,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAGD,eAAO,MAAM,8BAA8B,UAClC,GAAG,UACF,aAAa,EAAE,UACf,eAAe,KACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAqGpB,CAAA;AAED,eAAO,MAAM,0BAA0B,WAC7B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aAChB,aAAa,EAAE,UAClB,eAAe,KACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EA6DrB,CAAA;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAuCzE;AAGD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,EAAE,EACb,WAAW,EAAE,GAAG,EAAE,EAClB,OAAO,EAAE,GAAG,EACZ,IAAI,EAAE,GAAG,GACR,GAAG,EAAE,CA+DP"}
package/dist/lib/utils.js CHANGED
@@ -1,21 +1,13 @@
1
- import { clsx } from 'clsx';
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */ import { clsx } from 'clsx';
2
2
  import { twMerge } from 'tailwind-merge';
3
3
  import { futureOptionKeys, pastOptionKeys } from '../filters/constants/date-filter-options';
4
4
  import { getDateRangeForOption } from '../filters/utils/date-helpers';
5
+ import { formatAdminURL } from 'payload/shared';
6
+ import { stringify } from 'qs-esm';
7
+ import { EntityType } from '@payloadcms/ui/shared';
5
8
  export function cn(...inputs) {
6
9
  return twMerge(clsx(inputs));
7
10
  }
8
- export function handleNavigation(href, e, pathname, router) {
9
- // Check if we're on holdings page and there's a navigation handler
10
- if (pathname === '/holdings' && typeof window !== 'undefined' && window.holdingsNavigationHandler) {
11
- const canNavigate = window.holdingsNavigationHandler(href);
12
- if (!canNavigate) {
13
- e.preventDefault();
14
- return;
15
- }
16
- }
17
- router.push(href);
18
- }
19
11
  // Translates URL query conditions to the quick filter's internal state
20
12
  export const parseWhereClauseToFilterValues = (where, fields, locale)=>{
21
13
  const values = {};
@@ -200,5 +192,90 @@ export const buildQuickFilterConditions = (values, fieldDefs, locale)=>{
200
192
  });
201
193
  return conditions;
202
194
  };
195
+ // Recursive function to find a field by name
196
+ export function findFieldByName(fields, fieldName) {
197
+ // First check at the current level
198
+ const directMatch = fields.find((f)=>f.name === fieldName);
199
+ if (directMatch) return directMatch;
200
+ // If not found, search recursively in nested structures
201
+ for (const item of fields){
202
+ // Check in array, row, or collapsible fields
203
+ if ((item.type === 'array' || item.type === 'row' || item.type === 'collapsible') && 'fields' in item && Array.isArray(item.fields)) {
204
+ const nestedMatch = findFieldByName(item.fields, fieldName);
205
+ if (nestedMatch) return nestedMatch;
206
+ } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {
207
+ for (const tab of item.tabs){
208
+ if ('fields' in tab && Array.isArray(tab.fields)) {
209
+ const tabMatch = findFieldByName(tab.fields, fieldName);
210
+ if (tabMatch) return tabMatch;
211
+ }
212
+ }
213
+ } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {
214
+ for (const block of item.blocks){
215
+ if ('fields' in block && Array.isArray(block.fields)) {
216
+ const blockMatch = findFieldByName(block.fields, fieldName);
217
+ if (blockMatch) return blockMatch;
218
+ }
219
+ }
220
+ }
221
+ }
222
+ return null;
223
+ }
224
+ // Process nav groups to add href with defaultFilter query parameters
225
+ export function processNavGroups(groups, collections, payload, i18n) {
226
+ return groups.map((group)=>{
227
+ const processedEntities = group.entities.map((entity)=>{
228
+ if (entity.type === EntityType.collection) {
229
+ const collection = collections.find((c)=>c.slug === entity.slug);
230
+ // Check if collection has defaultFilter in custom props
231
+ if (collection?.custom?.defaultFilter) {
232
+ // Base URL without query parameters
233
+ const baseHref = formatAdminURL({
234
+ adminRoute: payload.config.routes.admin,
235
+ path: `/collections/${entity.slug}`
236
+ });
237
+ // Get the fields from the collection for parsing the where clause
238
+ const fields = Object.keys(collection.custom.defaultFilter)?.flat().map((fieldName)=>{
239
+ const fieldConfig = findFieldByName(collection.fields, fieldName);
240
+ return {
241
+ name: fieldName,
242
+ type: fieldConfig?.type,
243
+ options: fieldConfig?.options,
244
+ label: fieldConfig?.label || fieldName,
245
+ row: 0
246
+ };
247
+ }).filter(Boolean) || [];
248
+ // If we have fields and a defaultFilter, calculate the URL with where clause
249
+ if (fields.length > 0) {
250
+ // Parse the defaultFilter to get filter values
251
+ const filterValues = parseWhereClauseToFilterValues(collection.custom.defaultFilter, fields, i18n.language);
252
+ // If we have filter values, add them to the URL
253
+ if (Object.keys(filterValues).length > 0) {
254
+ const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language);
255
+ const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : {
256
+ and: quickFilterConditions
257
+ };
258
+ const query = {
259
+ where: whereCondition
260
+ };
261
+ const stringifiedQuery = stringify(query, {
262
+ addQueryPrefix: true
263
+ });
264
+ return {
265
+ ...entity,
266
+ href: `${baseHref}${stringifiedQuery}`
267
+ };
268
+ }
269
+ }
270
+ }
271
+ }
272
+ return entity;
273
+ });
274
+ return {
275
+ ...group,
276
+ entities: processedEntities
277
+ };
278
+ });
279
+ }
203
280
 
204
281
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime'\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n SelectFilterValue,\n} from '../filters/types/filters-type'\nimport { SupportedLocale } from '../labels'\nimport {\n futureOptionKeys,\n pastOptionKeys,\n} from '../filters/constants/date-filter-options'\nimport { getDateRangeForOption } from '../filters/utils/date-helpers'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function handleNavigation(\n href: string,\n e: React.MouseEvent,\n pathname: string,\n router: AppRouterInstance,\n) {\n // Check if we're on holdings page and there's a navigation handler\n if (\n pathname === '/holdings' &&\n typeof window !== 'undefined' &&\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler\n ) {\n const canNavigate = (\n (window as unknown as Record<string, unknown>).holdingsNavigationHandler as (\n href: string,\n ) => boolean\n )(href)\n if (!canNavigate) {\n e.preventDefault()\n return\n }\n }\n router.push(href)\n}\n\n// Translates URL query conditions to the quick filter's internal state\nexport const parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldNames = new Set(fields.map((f) => f.name))\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return\n\n if (clause.and) {\n clause.and.forEach(recursiveParse)\n return\n }\n if (clause.or) {\n if (clause.or.length > 1) {\n return\n }\n clause.or.forEach(recursiveParse)\n return\n }\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName)\n const condition = clause[fieldName]\n\n // Handle string values for date fields (e.g., 'todayAndFuture')\n if (fieldDef && fieldDef.type === 'date' && typeof condition === 'string') {\n const predefinedValue = condition\n if ([...pastOptionKeys, ...futureOptionKeys].includes(predefinedValue as any)) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue,\n }\n continue\n }\n }\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = (condition.equals == 'true' || condition.equals === true) ? 'checked' : 'unchecked'\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] }\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in }\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys]\n let matchedOption = null\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale)\n let isFromMatch\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString()\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true\n }\n let isToMatch\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString()\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option\n break\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n }\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n }\n }\n }\n }\n }\n }\n }\n }\n\n recursiveParse(where)\n return values\n}\n// Builds an array of condition objects from the quick filter values\nexport const buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = []\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return\n const fieldDef = fieldDefs.find((f) => f.name === fieldName)\n if (!fieldDef) return\n\n let condition: Record<string, any> | null = null\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue\n let from: Date | undefined\n let to: Date | undefined\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale)\n from = range.from\n to = range.to\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from)\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to)\n }\n\n if (from || to) {\n const dateQuery: any = {}\n if (from) dateQuery.greater_than_equal = from\n if (to) dateQuery.less_than_equal = to\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery }\n }\n }\n break\n }\n case 'select': {\n const selectValue = value as SelectFilterValue\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } }\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } }\n }\n }\n break\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } }\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } }\n }\n break\n }\n }\n if (condition) {\n conditions.push(condition)\n }\n })\n return conditions\n}"],"names":["clsx","twMerge","futureOptionKeys","pastOptionKeys","getDateRangeForOption","cn","inputs","handleNavigation","href","e","pathname","router","window","holdingsNavigationHandler","canNavigate","preventDefault","push","parseWhereClauseToFilterValues","where","fields","locale","values","fieldNames","Set","map","f","name","recursiveParse","clause","and","forEach","or","length","fieldName","has","fieldDef","find","condition","type","predefinedValue","includes","equals","selectedValues","Array","isArray","in","fromDate","greater_than_equal","Date","toDate","less_than_equal","allDateOptions","matchedOption","option","range","isFromMatch","from","toDateString","to","undefined","isToMatch","customRange","buildQuickFilterConditions","fieldDefs","conditions","Object","entries","value","dateValue","dateQuery","keys","selectValue","checkboxState"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/utils.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport type {\n CheckboxFilterState,\n DateFilterValue,\n FilterDetaild,\n SelectFilterValue,\n} from '../filters/types/filters-type'\nimport { SupportedLocale } from '../labels'\nimport {\n futureOptionKeys,\n pastOptionKeys,\n} from '../filters/constants/date-filter-options'\nimport { getDateRangeForOption } from '../filters/utils/date-helpers'\nimport type {Field, FieldAffectingData, SelectField, UIField} from 'payload'\nimport { formatAdminURL } from 'payload/shared'\nimport { stringify } from 'qs-esm'\nimport { EntityType } from '@payloadcms/ui/shared'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n// Translates URL query conditions to the quick filter's internal state\nexport const parseWhereClauseToFilterValues = (\n where: any,\n fields: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any> => {\n const values: Record<string, any> = {}\n const fieldNames = new Set(fields.map((f) => f.name))\n\n const recursiveParse = (clause: any) => {\n if (!clause || typeof clause !== 'object') return\n\n if (clause.and) {\n clause.and.forEach(recursiveParse)\n return\n }\n if (clause.or) {\n if (clause.or.length > 1) {\n return\n }\n clause.or.forEach(recursiveParse)\n return\n }\n for (const fieldName in clause) {\n if (fieldNames.has(fieldName)) {\n const fieldDef = fields.find((f) => f.name === fieldName)\n const condition = clause[fieldName]\n\n // Handle string values for date fields (e.g., 'todayAndFuture')\n if (fieldDef && fieldDef.type === 'date' && typeof condition === 'string') {\n const predefinedValue = condition\n if ([...pastOptionKeys, ...futureOptionKeys].includes(predefinedValue as any)) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue,\n }\n continue\n }\n }\n\n if (fieldDef && condition && typeof condition === 'object') {\n if ('equals' in condition) {\n if (fieldDef.type === 'checkbox') {\n values[fieldName] = (condition.equals == 'true' || condition.equals === true) ? 'checked' : 'unchecked'\n } else if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: [condition.equals] }\n }\n } else if ('in' in condition && Array.isArray(condition.in)) {\n if (fieldDef.type === 'select') {\n values[fieldName] = { selectedValues: condition.in }\n }\n } else if ('greater_than_equal' in condition || 'less_than_equal' in condition) {\n if (fieldDef.type === 'date') {\n const fromDate = condition.greater_than_equal\n ? new Date(condition.greater_than_equal)\n : null\n const toDate = condition.less_than_equal ? new Date(condition.less_than_equal) : null\n const allDateOptions = [...pastOptionKeys, ...futureOptionKeys]\n let matchedOption = null\n\n for (const option of allDateOptions) {\n const range = getDateRangeForOption(option, locale)\n let isFromMatch : boolean\n if (fromDate) {\n isFromMatch = range.from?.toDateString() === fromDate.toDateString()\n } else if (fromDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isFromMatch = true\n }\n let isToMatch: boolean\n if (toDate) {\n isToMatch = range.to?.toDateString() === toDate.toDateString()\n } else if (toDate == null && range.to == undefined) {\n // all future: fromDate == null & range.to == undefined\n isToMatch = true\n }\n\n if (isFromMatch && isToMatch) {\n matchedOption = option\n break\n }\n }\n\n if (matchedOption) {\n values[fieldName] = {\n type: 'predefined',\n predefinedValue: matchedOption,\n }\n } else {\n values[fieldName] = {\n type: 'custom',\n customRange: {\n from: fromDate,\n to: toDate,\n },\n }\n }\n }\n }\n }\n }\n }\n }\n\n recursiveParse(where)\n return values\n}\n// Builds an array of condition objects from the quick filter values\nexport const buildQuickFilterConditions = (\n values: Record<string, any>,\n fieldDefs: FilterDetaild[],\n locale: SupportedLocale,\n): Record<string, any>[] => {\n const conditions: Record<string, any>[] = []\n\n Object.entries(values).forEach(([fieldName, value]) => {\n if (!value) return\n const fieldDef = fieldDefs.find((f) => f.name === fieldName)\n if (!fieldDef) return\n\n let condition: Record<string, any> | null = null\n\n switch (fieldDef.type) {\n case 'date': {\n const dateValue = value as DateFilterValue\n let from: Date | undefined\n let to: Date | undefined\n\n if (dateValue.predefinedValue) {\n const range = getDateRangeForOption(dateValue.predefinedValue, locale)\n from = range.from\n to = range.to\n } else if (dateValue.customRange) {\n if (dateValue.customRange.from) from = new Date(dateValue.customRange.from)\n if (dateValue.customRange.to) to = new Date(dateValue.customRange.to)\n }\n\n if (from || to) {\n const dateQuery: any = {}\n if (from) dateQuery.greater_than_equal = from\n if (to) dateQuery.less_than_equal = to\n if (Object.keys(dateQuery).length > 0) {\n condition = { [fieldName]: dateQuery }\n }\n }\n break\n }\n case 'select': {\n const selectValue = value as SelectFilterValue\n if (selectValue.selectedValues && selectValue.selectedValues.length > 0) {\n if (selectValue.selectedValues.length === 1) {\n condition = { [fieldName]: { equals: selectValue.selectedValues[0] } }\n } else {\n condition = { [fieldName]: { in: selectValue.selectedValues } }\n }\n }\n break\n }\n case 'checkbox': {\n const checkboxState = value as CheckboxFilterState\n if (checkboxState === 'checked') {\n condition = { [fieldName]: { equals: 'true' } }\n } else if (checkboxState === 'unchecked') {\n condition = { [fieldName]: { equals: 'false' } }\n }\n break\n }\n }\n if (condition) {\n conditions.push(condition)\n }\n })\n return conditions\n}\n\n// Recursive function to find a field by name\nexport function findFieldByName(fields: Field[], fieldName: string): Field {\n // First check at the current level\n const directMatch = fields.find(\n (f) => (f as FieldAffectingData).name === fieldName,\n )\n if (directMatch) return directMatch\n\n // If not found, search recursively in nested structures\n for (const item of fields) {\n // Check in array, row, or collapsible fields\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n const nestedMatch = findFieldByName(item.fields, fieldName)\n if (nestedMatch) return nestedMatch\n } \n // Check in tabs\n else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n for (const tab of item.tabs) {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n const tabMatch = findFieldByName(tab.fields, fieldName)\n if (tabMatch) return tabMatch\n }\n }\n } \n // Check in blocks\n else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n for (const block of item.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n const blockMatch = findFieldByName(block.fields, fieldName)\n if (blockMatch) return blockMatch\n }\n }\n }\n }\n\n return null\n}\n\n// Process nav groups to add href with defaultFilter query parameters\nexport function processNavGroups(\n groups: any[], \n collections: any[], \n payload: any, \n i18n: any\n): any[] {\n return groups.map(group => {\n const processedEntities = group.entities.map(entity => {\n if (entity.type === EntityType.collection) {\n const collection = collections.find(c => c.slug === entity.slug);\n\n // Check if collection has defaultFilter in custom props\n if (collection?.custom?.defaultFilter) {\n // Base URL without query parameters\n const baseHref = formatAdminURL({ \n adminRoute: payload.config.routes.admin, \n path: `/collections/${entity.slug}` \n });\n\n // Get the fields from the collection for parsing the where clause\n const fields: FilterDetaild[] =\n Object.keys(collection.custom.defaultFilter)\n ?.flat()\n .map((fieldName: string) => {\n const fieldConfig = findFieldByName(collection.fields, fieldName)\n return {\n name: fieldName,\n type: fieldConfig?.type,\n options: (fieldConfig as SelectField)?.options,\n label: (fieldConfig as UIField)?.label || fieldName,\n row: 0,\n } as FilterDetaild\n })\n .filter(Boolean) || []\n\n // If we have fields and a defaultFilter, calculate the URL with where clause\n if (fields.length > 0) {\n // Parse the defaultFilter to get filter values\n const filterValues = parseWhereClauseToFilterValues(\n collection.custom.defaultFilter,\n fields,\n i18n.language as SupportedLocale\n );\n // If we have filter values, add them to the URL\n if (Object.keys(filterValues).length > 0) {\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language as SupportedLocale)\n\n const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : { and: quickFilterConditions };\n const query = {\n where: whereCondition,\n };\n const stringifiedQuery = stringify(query, { addQueryPrefix: true });\n return {\n ...entity,\n href: `${baseHref}${stringifiedQuery}`\n };\n }\n }\n }\n }\n return entity;\n });\n\n return {\n ...group,\n entities: processedEntities\n };\n });\n}\n"],"names":["clsx","twMerge","futureOptionKeys","pastOptionKeys","getDateRangeForOption","formatAdminURL","stringify","EntityType","cn","inputs","parseWhereClauseToFilterValues","where","fields","locale","values","fieldNames","Set","map","f","name","recursiveParse","clause","and","forEach","or","length","fieldName","has","fieldDef","find","condition","type","predefinedValue","includes","equals","selectedValues","Array","isArray","in","fromDate","greater_than_equal","Date","toDate","less_than_equal","allDateOptions","matchedOption","option","range","isFromMatch","from","toDateString","to","undefined","isToMatch","customRange","buildQuickFilterConditions","fieldDefs","conditions","Object","entries","value","dateValue","dateQuery","keys","selectValue","checkboxState","push","findFieldByName","directMatch","item","nestedMatch","tabs","tab","tabMatch","blocks","block","blockMatch","processNavGroups","groups","collections","payload","i18n","group","processedEntities","entities","entity","collection","c","slug","custom","defaultFilter","baseHref","adminRoute","config","routes","admin","path","flat","fieldConfig","options","label","row","filter","Boolean","filterValues","language","quickFilterConditions","whereCondition","query","stringifiedQuery","addQueryPrefix","href"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/nav/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,SAAS,CAAA;AAgB1D,OAAO,KAAmB,MAAM,OAAO,CAAA;AAIvC,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IACtC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;IACxC,cAAc,EAAE,cAAc,CAAA;CAC/B,CA6EA,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/nav/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAQ7C,OAAO,KAAmB,MAAM,OAAO,CAAA;AAKvC,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;IACtC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;IACxC,cAAc,EAAE,cAAc,CAAA;CAC/B,CA6EA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nav/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { groupNavItems } from '@payloadcms/ui/shared'\nimport type { NavPreferences, StaticLabel } from 'payload'\n\n// Extend the Entity type to include the href property\ntype EntityWithHref = {\n label: StaticLabel;\n slug: string;\n type: EntityType;\n href?: string;\n};\n\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { BrowseByFolderButton, Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui'\nimport { EntityType } from '@payloadcms/ui/shared'\nimport { usePathname } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nconst baseClass = 'nav'\n\nexport const DefaultNavClient: React.FC<{\n groups: ReturnType<typeof groupNavItems>\n navPreferences: NavPreferences\n}> = ({ groups, navPreferences }) => {\n const pathname = usePathname()\n\n const {\n config,\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n const folderURL = formatAdminURL({\n adminRoute: config.routes.admin,\n path: config.admin.routes.browseByFolder,\n })\n\n const viewingRootFolderView = pathname.startsWith(folderURL)\n\n return (\n <Fragment>\n {config.folders && config.folders.browseByFolder && <BrowseByFolderButton active={viewingRootFolderView} />}\n {groups.map(({ entities, label }, key) => {\n return (\n <NavGroup isOpen={navPreferences?.groups?.[label]?.open} key={key} label={label}>\n {entities.map(({ slug, type, label, href: entityHref }: EntityWithHref, i) => {\n let href: string = entityHref || \"\"\n let id: string = \"\"\n\n // If href is not provided from the server component, calculate it here\n if (!href) {\n if (type === EntityType.collection) {\n href = formatAdminURL({ adminRoute: config.routes.admin, path: `/collections/${slug}` })\n id = `nav-${slug}`\n }\n\n if (type === EntityType.global) {\n href = formatAdminURL({ adminRoute: config.routes.admin, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n }\n } else {\n // If href is provided, still set the id\n if (type === EntityType.collection) {\n id = `nav-${slug}`\n }\n if (type === EntityType.global) {\n id = `nav-global-${slug}`\n }\n }\n\n const isActive =\n pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length])\n\n const Label = (\n <>\n {isActive && <div className={`${baseClass}__link-indicator`} />}\n <span className={`${baseClass}__link-label`}>{getTranslation(label, i18n)}</span>\n </>\n )\n\n // If the URL matches the link exactly\n if (pathname === href) {\n return (\n <div className={`${baseClass}__link`} id={id} key={i}>\n {Label}\n </div>\n )\n }\n\n return (\n <Link className={`${baseClass}__link`} href={href} id={id} key={i} prefetch={false}>\n {Label}\n </Link>\n )\n })}\n </NavGroup>\n )\n })}\n </Fragment>\n )\n}\n"],"names":["getTranslation","BrowseByFolderButton","Link","NavGroup","useConfig","useTranslation","EntityType","usePathname","formatAdminURL","React","Fragment","baseClass","DefaultNavClient","groups","navPreferences","pathname","config","i18n","folderURL","adminRoute","routes","admin","path","browseByFolder","viewingRootFolderView","startsWith","folders","active","map","entities","label","key","isOpen","open","slug","type","href","entityHref","i","id","collection","global","isActive","undefined","includes","length","Label","div","className","span","prefetch"],"mappings":"AAAA;;AAcA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,oBAAoB,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAChG,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,MAAMC,YAAY;AAElB,OAAO,MAAMC,mBAGR,CAAC,EAAEC,MAAM,EAAEC,cAAc,EAAE;IAC9B,MAAMC,WAAWR;IAEjB,MAAM,EACJS,MAAM,EACP,GAAGZ;IAEJ,MAAM,EAAEa,IAAI,EAAE,GAAGZ;IAEjB,MAAMa,YAAYV,eAAe;QAC/BW,YAAYH,OAAOI,MAAM,CAACC,KAAK;QAC/BC,MAAMN,OAAOK,KAAK,CAACD,MAAM,CAACG,cAAc;IAC1C;IAEA,MAAMC,wBAAwBT,SAASU,UAAU,CAACP;IAElD,qBACE,MAACR;;YACEM,OAAOU,OAAO,IAAIV,OAAOU,OAAO,CAACH,cAAc,kBAAI,KAACtB;gBAAqB0B,QAAQH;;YACjFX,OAAOe,GAAG,CAAC,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAAE,EAAEC;gBAChC,qBACE,KAAC5B;oBAAS6B,QAAQlB,gBAAgBD,QAAQ,CAACiB,MAAM,EAAEG;oBAAgBH,OAAOA;8BACvED,SAASD,GAAG,CAAC,CAAC,EAAEM,IAAI,EAAEC,IAAI,EAAEL,KAAK,EAAEM,MAAMC,UAAU,EAAkB,EAAEC;wBACtE,IAAIF,OAAeC,cAAc;wBACjC,IAAIE,KAAa;wBAEjB,uEAAuE;wBACvE,IAAI,CAACH,MAAM;4BACT,IAAID,SAAS7B,WAAWkC,UAAU,EAAE;gCAClCJ,OAAO5B,eAAe;oCAAEW,YAAYH,OAAOI,MAAM,CAACC,KAAK;oCAAEC,MAAM,CAAC,aAAa,EAAEY,MAAM;gCAAC;gCACtFK,KAAK,CAAC,IAAI,EAAEL,MAAM;4BACpB;4BAEA,IAAIC,SAAS7B,WAAWmC,MAAM,EAAE;gCAC9BL,OAAO5B,eAAe;oCAAEW,YAAYH,OAAOI,MAAM,CAACC,KAAK;oCAAEC,MAAM,CAAC,SAAS,EAAEY,MAAM;gCAAC;gCAClFK,KAAK,CAAC,WAAW,EAAEL,MAAM;4BAC3B;wBACF,OAAO;4BACL,wCAAwC;4BACxC,IAAIC,SAAS7B,WAAWkC,UAAU,EAAE;gCAClCD,KAAK,CAAC,IAAI,EAAEL,MAAM;4BACpB;4BACA,IAAIC,SAAS7B,WAAWmC,MAAM,EAAE;gCAC9BF,KAAK,CAAC,WAAW,EAAEL,MAAM;4BAC3B;wBACF;wBAEA,MAAMQ,WACJ3B,SAASU,UAAU,CAACW,SAAS;4BAAC;4BAAKO;yBAAU,CAACC,QAAQ,CAAC7B,QAAQ,CAACqB,KAAKS,MAAM,CAAC;wBAE9E,MAAMC,sBACJ;;gCACGJ,0BAAY,KAACK;oCAAIC,WAAW,GAAGrC,UAAU,gBAAgB,CAAC;;8CAC3D,KAACsC;oCAAKD,WAAW,GAAGrC,UAAU,YAAY,CAAC;8CAAGX,eAAe8B,OAAOb;;;;wBAIxE,sCAAsC;wBACtC,IAAIF,aAAaqB,MAAM;4BACrB,qBACE,KAACW;gCAAIC,WAAW,GAAGrC,UAAU,MAAM,CAAC;gCAAE4B,IAAIA;0CACvCO;+BADgDR;wBAIvD;wBAEA,qBACE,KAACpC;4BAAK8C,WAAW,GAAGrC,UAAU,MAAM,CAAC;4BAAEyB,MAAMA;4BAAMG,IAAIA;4BAAYW,UAAU;sCAC1EJ;2BAD6DR;oBAIpE;mBAlD4DP;YAqDlE;;;AAGN,EAAC"}
1
+ {"version":3,"sources":["../../src/nav/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { groupNavItems } from '@payloadcms/ui/shared'\nimport type { NavPreferences } from 'payload'\n\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { BrowseByFolderButton, Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui'\nimport { EntityType } from '@payloadcms/ui/shared'\nimport { usePathname } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\nimport {EntityWithHref} from \"../types\";\n\nconst baseClass = 'nav'\n\nexport const DefaultNavClient: React.FC<{\n groups: ReturnType<typeof groupNavItems>\n navPreferences: NavPreferences\n}> = ({ groups, navPreferences }) => {\n const pathname = usePathname()\n\n const {\n config,\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n const folderURL = formatAdminURL({\n adminRoute: config.routes.admin,\n path: config.admin.routes.browseByFolder,\n })\n\n const viewingRootFolderView = pathname.startsWith(folderURL)\n\n return (\n <Fragment>\n {config.folders && config.folders.browseByFolder && <BrowseByFolderButton active={viewingRootFolderView} />}\n {groups.map(({ entities, label }, key) => {\n return (\n <NavGroup isOpen={navPreferences?.groups?.[label]?.open} key={key} label={label}>\n {entities.map(({ slug, type, label, href: entityHref }: EntityWithHref, i) => {\n let href: string = entityHref || \"\"\n let id: string = \"\"\n\n // If href is not provided from the server component, calculate it here\n if (!href) {\n if (type === EntityType.collection) {\n href = formatAdminURL({ adminRoute: config.routes.admin, path: `/collections/${slug}` })\n id = `nav-${slug}`\n }\n\n if (type === EntityType.global) {\n href = formatAdminURL({ adminRoute: config.routes.admin, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n }\n } else {\n // If href is provided, still set the id\n if (type === EntityType.collection) {\n id = `nav-${slug}`\n }\n if (type === EntityType.global) {\n id = `nav-global-${slug}`\n }\n }\n\n const isActive =\n pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length])\n\n const Label = (\n <>\n {isActive && <div className={`${baseClass}__link-indicator`} />}\n <span className={`${baseClass}__link-label`}>{getTranslation(label, i18n)}</span>\n </>\n )\n\n // If the URL matches the link exactly\n if (pathname === href) {\n return (\n <div className={`${baseClass}__link`} id={id} key={i}>\n {Label}\n </div>\n )\n }\n\n return (\n <Link className={`${baseClass}__link`} href={href} id={id} key={i} prefetch={false}>\n {Label}\n </Link>\n )\n })}\n </NavGroup>\n )\n })}\n </Fragment>\n )\n}\n"],"names":["getTranslation","BrowseByFolderButton","Link","NavGroup","useConfig","useTranslation","EntityType","usePathname","formatAdminURL","React","Fragment","baseClass","DefaultNavClient","groups","navPreferences","pathname","config","i18n","folderURL","adminRoute","routes","admin","path","browseByFolder","viewingRootFolderView","startsWith","folders","active","map","entities","label","key","isOpen","open","slug","type","href","entityHref","i","id","collection","global","isActive","undefined","includes","length","Label","div","className","span","prefetch"],"mappings":"AAAA;;AAMA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,oBAAoB,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAChG,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAGvC,MAAMC,YAAY;AAElB,OAAO,MAAMC,mBAGR,CAAC,EAAEC,MAAM,EAAEC,cAAc,EAAE;IAC9B,MAAMC,WAAWR;IAEjB,MAAM,EACJS,MAAM,EACP,GAAGZ;IAEJ,MAAM,EAAEa,IAAI,EAAE,GAAGZ;IAEjB,MAAMa,YAAYV,eAAe;QAC/BW,YAAYH,OAAOI,MAAM,CAACC,KAAK;QAC/BC,MAAMN,OAAOK,KAAK,CAACD,MAAM,CAACG,cAAc;IAC1C;IAEA,MAAMC,wBAAwBT,SAASU,UAAU,CAACP;IAElD,qBACE,MAACR;;YACEM,OAAOU,OAAO,IAAIV,OAAOU,OAAO,CAACH,cAAc,kBAAI,KAACtB;gBAAqB0B,QAAQH;;YACjFX,OAAOe,GAAG,CAAC,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAAE,EAAEC;gBAChC,qBACE,KAAC5B;oBAAS6B,QAAQlB,gBAAgBD,QAAQ,CAACiB,MAAM,EAAEG;oBAAgBH,OAAOA;8BACvED,SAASD,GAAG,CAAC,CAAC,EAAEM,IAAI,EAAEC,IAAI,EAAEL,KAAK,EAAEM,MAAMC,UAAU,EAAkB,EAAEC;wBACtE,IAAIF,OAAeC,cAAc;wBACjC,IAAIE,KAAa;wBAEjB,uEAAuE;wBACvE,IAAI,CAACH,MAAM;4BACT,IAAID,SAAS7B,WAAWkC,UAAU,EAAE;gCAClCJ,OAAO5B,eAAe;oCAAEW,YAAYH,OAAOI,MAAM,CAACC,KAAK;oCAAEC,MAAM,CAAC,aAAa,EAAEY,MAAM;gCAAC;gCACtFK,KAAK,CAAC,IAAI,EAAEL,MAAM;4BACpB;4BAEA,IAAIC,SAAS7B,WAAWmC,MAAM,EAAE;gCAC9BL,OAAO5B,eAAe;oCAAEW,YAAYH,OAAOI,MAAM,CAACC,KAAK;oCAAEC,MAAM,CAAC,SAAS,EAAEY,MAAM;gCAAC;gCAClFK,KAAK,CAAC,WAAW,EAAEL,MAAM;4BAC3B;wBACF,OAAO;4BACL,wCAAwC;4BACxC,IAAIC,SAAS7B,WAAWkC,UAAU,EAAE;gCAClCD,KAAK,CAAC,IAAI,EAAEL,MAAM;4BACpB;4BACA,IAAIC,SAAS7B,WAAWmC,MAAM,EAAE;gCAC9BF,KAAK,CAAC,WAAW,EAAEL,MAAM;4BAC3B;wBACF;wBAEA,MAAMQ,WACJ3B,SAASU,UAAU,CAACW,SAAS;4BAAC;4BAAKO;yBAAU,CAACC,QAAQ,CAAC7B,QAAQ,CAACqB,KAAKS,MAAM,CAAC;wBAE9E,MAAMC,sBACJ;;gCACGJ,0BAAY,KAACK;oCAAIC,WAAW,GAAGrC,UAAU,gBAAgB,CAAC;;8CAC3D,KAACsC;oCAAKD,WAAW,GAAGrC,UAAU,YAAY,CAAC;8CAAGX,eAAe8B,OAAOb;;;;wBAIxE,sCAAsC;wBACtC,IAAIF,aAAaqB,MAAM;4BACrB,qBACE,KAACW;gCAAIC,WAAW,GAAGrC,UAAU,MAAM,CAAC;gCAAE4B,IAAIA;0CACvCO;+BADgDR;wBAIvD;wBAEA,qBACE,KAACpC;4BAAK8C,WAAW,GAAGrC,UAAU,MAAM,CAAC;4BAAEyB,MAAMA;4BAAMG,IAAIA;4BAAYW,UAAU;sCAC1EJ;2BAD6DR;oBAIpE;mBAlD4DP;YAqDlE;;;AAGN,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nav/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,cAAc,EAGd,WAAW,EAEZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAmEzB,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAyL/C,CAAA;AACD,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nav/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EAEd,WAAW,EACZ,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,MAAM,OAAO,CAAA;AAoBzB,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,EAAE,cAAc,CAAA;CACrB,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA2H/C,CAAA;AACD,eAAe,gBAAgB,CAAC"}
package/dist/nav/index.js CHANGED
@@ -3,16 +3,14 @@ import { Logout } from '@payloadcms/ui';
3
3
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
4
4
  import { EntityType, groupNavItems } from '@payloadcms/ui/shared';
5
5
  import React from 'react';
6
- import { formatAdminURL } from 'payload/shared';
7
- import { parseWhereClauseToFilterValues, buildQuickFilterConditions } from '../lib/utils';
8
- import { stringify } from 'qs-esm';
6
+ import { processNavGroups } from '../lib/utils';
9
7
  import { NavHamburger } from './NavHamburger';
10
8
  import { NavWrapper } from './NavWrapper';
11
9
  // Import SCSS only in browser environment
12
10
  // This prevents Node.js from trying to import SCSS directly
13
11
  // which causes ERR_UNKNOWN_FILE_EXTENSION error
14
12
  if (typeof window !== 'undefined') {
15
- // @ts-ignore
13
+ // @ts-expect-error - Dynamic import of CSS is not recognized by TypeScript
16
14
  import('./index.scss').catch((err)=>{
17
15
  console.warn('Failed to load SCSS file:', err);
18
16
  });
@@ -20,35 +18,6 @@ if (typeof window !== 'undefined') {
20
18
  const baseClass = 'nav';
21
19
  import { getNavPrefs } from './getNavPrefs';
22
20
  import { DefaultNavClient } from './index.client';
23
- // Recursive function to find a field by name
24
- function findFieldByName(fields, fieldName) {
25
- // First check at the current level
26
- const directMatch = fields.find((f)=>f.name === fieldName);
27
- if (directMatch) return directMatch;
28
- // If not found, search recursively in nested structures
29
- for (const item of fields){
30
- // Check in array, row, or collapsible fields
31
- if ((item.type === 'array' || item.type === 'row' || item.type === 'collapsible') && 'fields' in item && Array.isArray(item.fields)) {
32
- const nestedMatch = findFieldByName(item.fields, fieldName);
33
- if (nestedMatch) return nestedMatch;
34
- } else if (item.type === 'tabs' && Array.isArray(item.tabs)) {
35
- for (const tab of item.tabs){
36
- if ('fields' in tab && Array.isArray(tab.fields)) {
37
- const tabMatch = findFieldByName(tab.fields, fieldName);
38
- if (tabMatch) return tabMatch;
39
- }
40
- }
41
- } else if (item.type === 'blocks' && Array.isArray(item.blocks)) {
42
- for (const block of item.blocks){
43
- if ('fields' in block && Array.isArray(block.fields)) {
44
- const blockMatch = findFieldByName(block.fields, fieldName);
45
- if (blockMatch) return blockMatch;
46
- }
47
- }
48
- }
49
- }
50
- return null;
51
- }
52
21
  export const NavDefaultFilter = async (props)=>{
53
22
  const { documentSubViewType, i18n, locale, params, payload, permissions, req, searchParams, user, viewType, visibleEntities } = props;
54
23
  if (!payload?.config) {
@@ -67,60 +36,7 @@ export const NavDefaultFilter = async (props)=>{
67
36
  ], permissions, i18n);
68
37
  const navPreferences = await getNavPrefs(req);
69
38
  // Process collections to calculate URLs with defaultFilter
70
- const processedGroups = groups.map((group)=>{
71
- const processedEntities = group.entities.map((entity)=>{
72
- if (entity.type === EntityType.collection) {
73
- const collection = collections.find((c)=>c.slug === entity.slug);
74
- debugger;
75
- // Check if collection has defaultFilter in custom props
76
- if (collection?.custom?.defaultFilter) {
77
- // Base URL without query parameters
78
- const baseHref = formatAdminURL({
79
- adminRoute: payload.config.routes.admin,
80
- path: `/collections/${entity.slug}`
81
- });
82
- // Get the fields from the collection for parsing the where clause
83
- const fields = Object.keys(collection.custom.defaultFilter)?.flat().map((fieldName)=>{
84
- const fieldConfig = findFieldByName(collection.fields, fieldName);
85
- return {
86
- name: fieldName,
87
- type: fieldConfig?.type,
88
- options: fieldConfig?.options,
89
- label: fieldConfig?.label || fieldName,
90
- row: 0
91
- };
92
- }).filter(Boolean) || [];
93
- // If we have fields and a defaultFilter, calculate the URL with where clause
94
- if (fields.length > 0) {
95
- // Parse the defaultFilter to get filter values
96
- const filterValues = parseWhereClauseToFilterValues(collection.custom.defaultFilter, fields, i18n.language);
97
- // If we have filter values, add them to the URL
98
- if (Object.keys(filterValues).length > 0) {
99
- const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language);
100
- const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : {
101
- and: quickFilterConditions
102
- };
103
- const query = {
104
- where: whereCondition
105
- };
106
- const stringifiedQuery = stringify(query, {
107
- addQueryPrefix: true
108
- });
109
- return {
110
- ...entity,
111
- href: `${baseHref}${stringifiedQuery}`
112
- };
113
- }
114
- }
115
- }
116
- }
117
- return entity;
118
- });
119
- return {
120
- ...group,
121
- entities: processedEntities
122
- };
123
- });
39
+ const processedGroups = processNavGroups(groups, collections, payload, i18n);
124
40
  const LogoutComponent = RenderServerComponent({
125
41
  clientProps: {
126
42
  documentSubViewType,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type {\n Field,\n NavPreferences,\n PayloadRequest,\n SanitizedPermissions,\n SelectField,\n ServerProps,\n UIField,\n} from 'payload'\n\nimport { Logout } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\nimport { formatAdminURL } from 'payload/shared'\nimport { parseWhereClauseToFilterValues, buildQuickFilterConditions } from '../lib/utils'\nimport type { FilterDetaild } from '../filters/types/filters-type'\nimport type { SupportedLocale } from '../labels'\nimport { stringify } from 'qs-esm'\n\nimport { NavHamburger } from './NavHamburger'\nimport { NavWrapper } from './NavWrapper'\n// Import SCSS only in browser environment\n// This prevents Node.js from trying to import SCSS directly\n// which causes ERR_UNKNOWN_FILE_EXTENSION error\nif (typeof window !== 'undefined') {\n // @ts-ignore\n import('./index.scss').catch(err => {\n console.warn('Failed to load SCSS file:', err);\n });\n}\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { DefaultNavClient } from './index.client'\nimport { FieldAffectingData } from 'payload'\n\n// Recursive function to find a field by name\nfunction findFieldByName(fields: Field[], fieldName: string): Field {\n // First check at the current level\n const directMatch = fields.find(\n (f) => (f as FieldAffectingData).name === fieldName,\n )\n if (directMatch) return directMatch\n\n // If not found, search recursively in nested structures\n for (const item of fields) {\n // Check in array, row, or collapsible fields\n if (\n (item.type === 'array' || item.type === 'row' || item.type === 'collapsible') &&\n 'fields' in item &&\n Array.isArray(item.fields)\n ) {\n const nestedMatch = findFieldByName(item.fields, fieldName)\n if (nestedMatch) return nestedMatch\n } \n // Check in tabs\n else if (item.type === 'tabs' && Array.isArray(item.tabs)) {\n for (const tab of item.tabs) {\n if ('fields' in tab && Array.isArray(tab.fields)) {\n const tabMatch = findFieldByName(tab.fields, fieldName)\n if (tabMatch) return tabMatch\n }\n }\n } \n // Check in blocks\n else if (item.type === 'blocks' && Array.isArray(item.blocks)) {\n for (const block of item.blocks) {\n if ('fields' in block && Array.isArray(block.fields)) {\n const blockMatch = findFieldByName(block.fields, fieldName)\n if (blockMatch) return blockMatch\n }\n }\n }\n }\n\n return null\n}\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const NavDefaultFilter: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks, logout },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions as SanitizedPermissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req as PayloadRequest)\n\n // Process collections to calculate URLs with defaultFilter\n const processedGroups = groups.map(group => {\n const processedEntities = group.entities.map(entity => {\n if (entity.type === EntityType.collection) {\n const collection = collections.find(c => c.slug === entity.slug);\n debugger\n // Check if collection has defaultFilter in custom props\n if (collection?.custom?.defaultFilter) {\n // Base URL without query parameters\n const baseHref = formatAdminURL({ \n adminRoute: payload.config.routes.admin, \n path: `/collections/${entity.slug}` \n });\n\n // Get the fields from the collection for parsing the where clause\n const fields: FilterDetaild[] =\n Object.keys(collection.custom.defaultFilter)\n ?.flat()\n .map((fieldName: string) => {\n const fieldConfig = findFieldByName(collection.fields, fieldName)\n return {\n name: fieldName,\n type: fieldConfig?.type,\n options: (fieldConfig as SelectField )?.options,\n label: (fieldConfig as UIField)?.label || fieldName,\n row: 0,\n } as FilterDetaild\n })\n .filter(Boolean) || []\n\n // If we have fields and a defaultFilter, calculate the URL with where clause\n if (fields.length > 0) {\n // Parse the defaultFilter to get filter values\n const filterValues = parseWhereClauseToFilterValues(\n collection.custom.defaultFilter,\n fields,\n i18n.language as SupportedLocale\n );\n // If we have filter values, add them to the URL\n if (Object.keys(filterValues).length > 0) {\n const quickFilterConditions = buildQuickFilterConditions(filterValues, fields, i18n.language as SupportedLocale)\n\n\n const whereCondition = quickFilterConditions.length === 1 ? quickFilterConditions[0] : { and: quickFilterConditions };\n const query = {\n where: whereCondition,\n };\n const stringifiedQuery = stringify(query, { addQueryPrefix: true });\n return {\n ...entity,\n href: `${baseHref}${stringifiedQuery}`\n };\n }\n }\n }\n }\n return entity;\n });\n\n return {\n ...group,\n entities: processedEntities\n };\n });\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n return (\n <NavWrapper baseClass={baseClass}>\n <nav className={`${baseClass}__wrap`}>\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <DefaultNavClient groups={processedGroups} navPreferences={navPreferences as NavPreferences} />\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <div className={`${baseClass}__controls`}>{LogoutComponent}</div>\n </nav>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\nexport default NavDefaultFilter;\n"],"names":["Logout","RenderServerComponent","EntityType","groupNavItems","React","formatAdminURL","parseWhereClauseToFilterValues","buildQuickFilterConditions","stringify","NavHamburger","NavWrapper","window","catch","err","console","warn","baseClass","getNavPrefs","DefaultNavClient","findFieldByName","fields","fieldName","directMatch","find","f","name","item","type","Array","isArray","nestedMatch","tabs","tab","tabMatch","blocks","block","blockMatch","NavDefaultFilter","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","logout","collections","globals","groups","filter","slug","includes","map","collection","entity","global","navPreferences","processedGroups","group","processedEntities","entities","c","custom","defaultFilter","baseHref","adminRoute","routes","path","Object","keys","flat","fieldConfig","options","label","row","Boolean","length","filterValues","language","quickFilterConditions","whereCondition","and","query","where","stringifiedQuery","addQueryPrefix","href","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","nav","className","div"],"mappings":";AAWA,SAASA,MAAM,QAAQ,iBAAgB;AACvC,SAASC,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,UAAU,EAAEC,aAAa,QAAQ,wBAAuB;AACjE,OAAOC,WAAW,QAAO;AACzB,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,SAASC,8BAA8B,EAAEC,0BAA0B,QAAQ,eAAc;AAGzF,SAASC,SAAS,QAAQ,SAAQ;AAElC,SAASC,YAAY,QAAQ,iBAAgB;AAC7C,SAASC,UAAU,QAAQ,eAAc;AACzC,0CAA0C;AAC1C,4DAA4D;AAC5D,gDAAgD;AAChD,IAAI,OAAOC,WAAW,aAAa;IACjC,aAAa;IACb,MAAM,CAAC,gBAAgBC,KAAK,CAACC,CAAAA;QAC3BC,QAAQC,IAAI,CAAC,6BAA6BF;IAC5C;AACF;AAEA,MAAMG,YAAY;AAElB,SAASC,WAAW,QAAQ,gBAAe;AAC3C,SAASC,gBAAgB,QAAQ,iBAAgB;AAGjD,6CAA6C;AAC7C,SAASC,gBAAgBC,MAAe,EAAEC,SAAiB;IACzD,mCAAmC;IACnC,MAAMC,cAAcF,OAAOG,IAAI,CAC7B,CAACC,IAAM,AAACA,EAAyBC,IAAI,KAAKJ;IAE5C,IAAIC,aAAa,OAAOA;IAExB,wDAAwD;IACxD,KAAK,MAAMI,QAAQN,OAAQ;QACzB,6CAA6C;QAC7C,IACE,AAACM,CAAAA,KAAKC,IAAI,KAAK,WAAWD,KAAKC,IAAI,KAAK,SAASD,KAAKC,IAAI,KAAK,aAAY,KAC3E,YAAYD,QACZE,MAAMC,OAAO,CAACH,KAAKN,MAAM,GACzB;YACA,MAAMU,cAAcX,gBAAgBO,KAAKN,MAAM,EAAEC;YACjD,IAAIS,aAAa,OAAOA;QAC1B,OAEK,IAAIJ,KAAKC,IAAI,KAAK,UAAUC,MAAMC,OAAO,CAACH,KAAKK,IAAI,GAAG;YACzD,KAAK,MAAMC,OAAON,KAAKK,IAAI,CAAE;gBAC3B,IAAI,YAAYC,OAAOJ,MAAMC,OAAO,CAACG,IAAIZ,MAAM,GAAG;oBAChD,MAAMa,WAAWd,gBAAgBa,IAAIZ,MAAM,EAAEC;oBAC7C,IAAIY,UAAU,OAAOA;gBACvB;YACF;QACF,OAEK,IAAIP,KAAKC,IAAI,KAAK,YAAYC,MAAMC,OAAO,CAACH,KAAKQ,MAAM,GAAG;YAC7D,KAAK,MAAMC,SAAST,KAAKQ,MAAM,CAAE;gBAC/B,IAAI,YAAYC,SAASP,MAAMC,OAAO,CAACM,MAAMf,MAAM,GAAG;oBACpD,MAAMgB,aAAajB,gBAAgBgB,MAAMf,MAAM,EAAEC;oBACjD,IAAIe,YAAY,OAAOA;gBACzB;YACF;QACF;IACF;IAEA,OAAO;AACT;AAMA,OAAO,MAAMC,mBAAuC,OAAOC;IACzD,MAAM,EACJC,mBAAmB,EACnBC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,WAAW,EACXC,GAAG,EACHC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,eAAe,EAChB,GAAGX;IAEJ,IAAI,CAACK,SAASO,QAAQ;QACpB,OAAO;IACT;IAEA,MAAM,EACJC,OAAO,EACLC,YAAY,EAAEC,aAAa,EAAEC,cAAc,EAAEC,MAAM,EAAE,EACtD,EACDC,WAAW,EACXC,OAAO,EACR,GAAGd,QAAQO,MAAM;IAElB,MAAMQ,SAASvD,cACb;WACKqD,YACAG,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKX,iBAAiBO,YAAYK,SAASD,OAC3DE,GAAG,CACF,CAACC,aACE,CAAA;gBACCpC,MAAMzB,WAAW6D,UAAU;gBAC3BC,QAAQD;YACV,CAAA;WAEHN,QACAE,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKX,iBAAiBQ,QAAQI,SAASD,OACvDE,GAAG,CACF,CAACG,SACE,CAAA;gBACCtC,MAAMzB,WAAW+D,MAAM;gBACvBD,QAAQC;YACV,CAAA;KAEP,EACDrB,aACAJ;IAGF,MAAM0B,iBAAiB,MAAMjD,YAAY4B;IAEzC,2DAA2D;IAC3D,MAAMsB,kBAAkBT,OAAOI,GAAG,CAACM,CAAAA;QACjC,MAAMC,oBAAoBD,MAAME,QAAQ,CAACR,GAAG,CAACE,CAAAA;YAC3C,IAAIA,OAAOrC,IAAI,KAAKzB,WAAW6D,UAAU,EAAE;gBACzC,MAAMA,aAAaP,YAAYjC,IAAI,CAACgD,CAAAA,IAAKA,EAAEX,IAAI,KAAKI,OAAOJ,IAAI;gBAC/D,QAAQ;gBACR,wDAAwD;gBACxD,IAAIG,YAAYS,QAAQC,eAAe;oBACrC,oCAAoC;oBACpC,MAAMC,WAAWrE,eAAe;wBAC9BsE,YAAYhC,QAAQO,MAAM,CAAC0B,MAAM,CAACzB,KAAK;wBACvC0B,MAAM,CAAC,aAAa,EAAEb,OAAOJ,IAAI,EAAE;oBACrC;oBAEA,kEAAkE;oBAClE,MAAMxC,SACJ0D,OAAOC,IAAI,CAAChB,WAAWS,MAAM,CAACC,aAAa,GACvCO,OACDlB,IAAI,CAACzC;wBACJ,MAAM4D,cAAc9D,gBAAgB4C,WAAW3C,MAAM,EAAEC;wBACvD,OAAO;4BACLI,MAAMJ;4BACNM,MAAMsD,aAAatD;4BACnBuD,SAAUD,aAA+BC;4BACzCC,OAAO,AAACF,aAAyBE,SAAS9D;4BAC1C+D,KAAK;wBACP;oBACF,GACCzB,OAAO0B,YAAY,EAAE;oBAE1B,6EAA6E;oBAC7E,IAAIjE,OAAOkE,MAAM,GAAG,GAAG;wBACrB,+CAA+C;wBAC/C,MAAMC,eAAejF,+BACnByD,WAAWS,MAAM,CAACC,aAAa,EAC/BrD,QACAoB,KAAKgD,QAAQ;wBAEf,gDAAgD;wBAChD,IAAIV,OAAOC,IAAI,CAACQ,cAAcD,MAAM,GAAG,GAAG;4BACxC,MAAMG,wBAAwBlF,2BAA2BgF,cAAcnE,QAAQoB,KAAKgD,QAAQ;4BAG5F,MAAME,iBAAiBD,sBAAsBH,MAAM,KAAK,IAAIG,qBAAqB,CAAC,EAAE,GAAG;gCAAEE,KAAKF;4BAAsB;4BACpH,MAAMG,QAAQ;gCACZC,OAAOH;4BACT;4BACA,MAAMI,mBAAmBtF,UAAUoF,OAAO;gCAAEG,gBAAgB;4BAAK;4BACjE,OAAO;gCACL,GAAG/B,MAAM;gCACTgC,MAAM,GAAGtB,WAAWoB,kBAAkB;4BACxC;wBACF;oBACF;gBACF;YACF;YACA,OAAO9B;QACT;QAEA,OAAO;YACL,GAAGI,KAAK;YACRE,UAAUD;QACZ;IACF;IAEA,MAAM4B,kBAAkBhG,sBAAsB;QAC5CiG,aAAa;YACX3D;YACAS;QACF;QACAmD,WAAW5C,QAAQ6C;QACnBC,UAAUrG;QACVsG,WAAW3D,QAAQ2D,SAAS;QAC5BC,aAAa;YACX/D;YACAC;YACAC;YACAC;YACAC;YACAE;YACAC;QACF;IACF;IAEA,qBACE,MAACrC;QAAWM,WAAWA;;0BACrB,MAACwF;gBAAIC,WAAW,GAAGzF,UAAU,MAAM,CAAC;;oBACjCf,sBAAsB;wBACrBiG,aAAa;4BACX3D;4BACAS;wBACF;wBACAmD,WAAW7C;wBACXgD,WAAW3D,QAAQ2D,SAAS;wBAC5BC,aAAa;4BACX/D;4BACAC;4BACAC;4BACAC;4BACAC;4BACAE;4BACAC;wBACF;oBACF;kCACA,KAAC7B;wBAAiBwC,QAAQS;wBAAiBD,gBAAgBA;;oBAC1DjE,sBAAsB;wBACrBiG,aAAa;4BACX3D;4BACAS;wBACF;wBACAmD,WAAW9C;wBACXiD,WAAW3D,QAAQ2D,SAAS;wBAC5BC,aAAa;4BACX/D;4BACAC;4BACAC;4BACAC;4BACAC;4BACAE;4BACAC;wBACF;oBACF;kCACA,KAAC2D;wBAAID,WAAW,GAAGzF,UAAU,UAAU,CAAC;kCAAGiF;;;;0BAE7C,KAACS;gBAAID,WAAW,GAAGzF,UAAU,QAAQ,CAAC;0BACpC,cAAA,KAAC0F;oBAAID,WAAW,GAAGzF,UAAU,gBAAgB,CAAC;8BAC5C,cAAA,KAACP;wBAAaO,WAAWA;;;;;;AAKnC,EAAC;AACD,eAAeqB,iBAAiB"}
1
+ {"version":3,"sources":["../../src/nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type {\n NavPreferences,\n PayloadRequest,\n SanitizedPermissions,\n ServerProps,\n} from 'payload'\n\nimport { Logout } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\nimport { processNavGroups } from '../lib/utils'\n\nimport { NavHamburger } from './NavHamburger'\nimport { NavWrapper } from './NavWrapper'\n// Import SCSS only in browser environment\n// This prevents Node.js from trying to import SCSS directly\n// which causes ERR_UNKNOWN_FILE_EXTENSION error\nif (typeof window !== 'undefined') {\n // @ts-expect-error - Dynamic import of CSS is not recognized by TypeScript\n import('./index.scss').catch(err => {\n console.warn('Failed to load SCSS file:', err);\n });\n}\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { DefaultNavClient } from './index.client'\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const NavDefaultFilter: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks, logout },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions as SanitizedPermissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req as PayloadRequest)\n\n // Process collections to calculate URLs with defaultFilter\n const processedGroups = processNavGroups(groups, collections, payload, i18n);\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n return (\n <NavWrapper baseClass={baseClass}>\n <nav className={`${baseClass}__wrap`}>\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <DefaultNavClient groups={processedGroups} navPreferences={navPreferences as NavPreferences} />\n {RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })}\n <div className={`${baseClass}__controls`}>{LogoutComponent}</div>\n </nav>\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\nexport default NavDefaultFilter;\n"],"names":["Logout","RenderServerComponent","EntityType","groupNavItems","React","processNavGroups","NavHamburger","NavWrapper","window","catch","err","console","warn","baseClass","getNavPrefs","DefaultNavClient","NavDefaultFilter","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","logout","collections","globals","groups","filter","slug","includes","map","collection","type","entity","global","navPreferences","processedGroups","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","nav","className","div"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,15 @@
1
+ import type { StaticLabel } from "payload";
2
+ import { EntityType } from "@payloadcms/ui/shared";
1
3
  export type CollectionFilterPluginConfig = {
2
4
  /**
3
5
  * List of collections to add filters to
4
6
  */
5
7
  disabled?: boolean;
6
8
  };
9
+ export type EntityWithHref = {
10
+ label: StaticLabel;
11
+ slug: string;
12
+ type: EntityType;
13
+ href?: string;
14
+ };
7
15
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEjD,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAIF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
package/dist/types.js CHANGED
@@ -1,3 +1,4 @@
1
+ // Extend the Entity type to include the href property
1
2
  export { };
2
3
 
3
4
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type CollectionFilterPluginConfig = {\n /**\n * List of collections to add filters to\n */\n disabled?: boolean;\n};\n"],"names":[],"mappings":"AAAA,WAKE"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {StaticLabel} from \"payload\";\nimport {EntityType} from \"@payloadcms/ui/shared\";\n\nexport type CollectionFilterPluginConfig = {\n /**\n * List of collections to add filters to\n */\n disabled?: boolean;\n};\n\n\n// Extend the Entity type to include the href property\nexport type EntityWithHref = {\n label: StaticLabel;\n slug: string;\n type: EntityType;\n href?: string;\n};"],"names":[],"mappings":"AAWA,sDAAsD;AACtD,WAKE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shefing/quickfilter",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "private": false,
5
5
  "bugs": "https://github.com/shefing/payload-tools/issues",
6
6
  "repository": "https://github.com/shefing/payload-tools",
@@ -25,6 +25,10 @@
25
25
  "./nav": {
26
26
  "import": "./dist/nav/index.js",
27
27
  "require": "./dist/nav/index.js"
28
+ },
29
+ "./Dashboard": {
30
+ "import": "./dist/Dashboard/index.js",
31
+ "require": "./dist/Dashboard/index.js"
28
32
  }
29
33
  },
30
34
  "devDependencies": {
@@ -46,6 +50,7 @@
46
50
  "typescript": "5.7.3"
47
51
  },
48
52
  "dependencies": {
53
+ "@payloadcms/next": "^3.49.0",
49
54
  "@payloadcms/translations": "^3.49.0",
50
55
  "@payloadcms/ui": "^3.49.0",
51
56
  "@radix-ui/react-checkbox": "^1.1.4",