@payloadcms/ui 4.0.0-canary.5 → 4.0.0-canary.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/css/forms.css +6 -3
  3. package/dist/css/theme.css +2 -1
  4. package/dist/elements/AddNewRelation/index.css +1 -1
  5. package/dist/elements/DatePicker/index.css +1 -1
  6. package/dist/elements/DatePicker/index.js +1 -1
  7. package/dist/elements/DatePicker/index.js.map +1 -1
  8. package/dist/elements/DocumentFields/index.css +1 -0
  9. package/dist/elements/EditUpload/index.d.ts.map +1 -1
  10. package/dist/elements/EditUpload/index.js +4 -0
  11. package/dist/elements/EditUpload/index.js.map +1 -1
  12. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.css +3 -1
  13. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.css +1 -0
  14. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts +1 -1
  15. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -1
  16. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -1
  17. package/dist/elements/Hierarchy/DocHeaderButton/index.js +12 -12
  18. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -1
  19. package/dist/elements/Hierarchy/Field/index.client.js +14 -14
  20. package/dist/elements/Hierarchy/Field/index.client.js.map +1 -1
  21. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts.map +1 -0
  22. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js.map +1 -0
  23. package/dist/elements/Hierarchy/Modal/index.css +88 -0
  24. package/dist/elements/Hierarchy/Modal/index.d.ts +20 -0
  25. package/dist/elements/Hierarchy/Modal/index.d.ts.map +1 -0
  26. package/dist/elements/Hierarchy/{Drawer → Modal}/index.js +105 -81
  27. package/dist/elements/Hierarchy/Modal/index.js.map +1 -0
  28. package/dist/elements/Hierarchy/{Drawer → Modal}/types.d.ts +22 -18
  29. package/dist/elements/Hierarchy/Modal/types.d.ts.map +1 -0
  30. package/dist/elements/Hierarchy/Modal/types.js.map +1 -0
  31. package/dist/elements/Hierarchy/Modal/useHierarchyModal.d.ts +30 -0
  32. package/dist/elements/Hierarchy/Modal/useHierarchyModal.d.ts.map +1 -0
  33. package/dist/elements/Hierarchy/{Drawer/useHierarchyDrawer.js → Modal/useHierarchyModal.js} +51 -50
  34. package/dist/elements/Hierarchy/Modal/useHierarchyModal.js.map +1 -0
  35. package/dist/elements/Hierarchy/MoveMany/index.d.ts +2 -2
  36. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -1
  37. package/dist/elements/Hierarchy/MoveMany/index.js +9 -9
  38. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -1
  39. package/dist/elements/LivePreview/Toolbar/SizeInput/index.d.ts.map +1 -1
  40. package/dist/elements/LivePreview/Toolbar/SizeInput/index.js +1 -0
  41. package/dist/elements/LivePreview/Toolbar/SizeInput/index.js.map +1 -1
  42. package/dist/elements/LivePreview/Window/index.css +6 -0
  43. package/dist/elements/ReactSelect/index.css +2 -2
  44. package/dist/elements/ReactSelect/index.js +1 -1
  45. package/dist/elements/ReactSelect/index.js.map +1 -1
  46. package/dist/elements/RelationshipTable/index.css +1 -2
  47. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +24 -24
  48. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
  49. package/dist/elements/Table/index.css +7 -2
  50. package/dist/elements/TimezonePicker/index.css +1 -1
  51. package/dist/exports/client/index.d.ts +3 -2
  52. package/dist/exports/client/index.d.ts.map +1 -1
  53. package/dist/exports/client/index.js +26 -26
  54. package/dist/exports/client/index.js.map +4 -4
  55. package/dist/exports/rsc/index.d.ts +2 -0
  56. package/dist/exports/rsc/index.d.ts.map +1 -1
  57. package/dist/exports/rsc/index.js +2 -0
  58. package/dist/exports/rsc/index.js.map +1 -1
  59. package/dist/fields/ConfirmPassword/index.d.ts +4 -0
  60. package/dist/fields/ConfirmPassword/index.d.ts.map +1 -1
  61. package/dist/fields/ConfirmPassword/index.js +37 -33
  62. package/dist/fields/ConfirmPassword/index.js.map +1 -1
  63. package/dist/fields/Number/Input.d.ts.map +1 -1
  64. package/dist/fields/Number/Input.js +29 -25
  65. package/dist/fields/Number/Input.js.map +1 -1
  66. package/dist/fields/Number/types.d.ts +4 -0
  67. package/dist/fields/Number/types.d.ts.map +1 -1
  68. package/dist/fields/Number/types.js.map +1 -1
  69. package/dist/fields/Password/input.d.ts.map +1 -1
  70. package/dist/fields/Password/input.js +33 -29
  71. package/dist/fields/Password/input.js.map +1 -1
  72. package/dist/fields/Password/types.d.ts +4 -0
  73. package/dist/fields/Password/types.d.ts.map +1 -1
  74. package/dist/fields/Password/types.js.map +1 -1
  75. package/dist/fields/Relationship/Input.d.ts.map +1 -1
  76. package/dist/fields/Relationship/Input.js +2 -0
  77. package/dist/fields/Relationship/Input.js.map +1 -1
  78. package/dist/fields/Relationship/types.d.ts +4 -0
  79. package/dist/fields/Relationship/types.d.ts.map +1 -1
  80. package/dist/fields/Relationship/types.js.map +1 -1
  81. package/dist/fields/Select/Input.d.ts +4 -0
  82. package/dist/fields/Select/Input.d.ts.map +1 -1
  83. package/dist/fields/Select/Input.js +44 -40
  84. package/dist/fields/Select/Input.js.map +1 -1
  85. package/dist/fields/Text/Input.d.ts.map +1 -1
  86. package/dist/fields/Text/Input.js +25 -21
  87. package/dist/fields/Text/Input.js.map +1 -1
  88. package/dist/fields/Text/types.d.ts +4 -0
  89. package/dist/fields/Text/types.d.ts.map +1 -1
  90. package/dist/fields/Text/types.js.map +1 -1
  91. package/dist/fields/Textarea/Input.d.ts.map +1 -1
  92. package/dist/fields/Textarea/Input.js +27 -23
  93. package/dist/fields/Textarea/Input.js.map +1 -1
  94. package/dist/fields/Textarea/index.css +1 -1
  95. package/dist/fields/Textarea/types.d.ts +4 -0
  96. package/dist/fields/Textarea/types.d.ts.map +1 -1
  97. package/dist/fields/Textarea/types.js.map +1 -1
  98. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts +1 -0
  99. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.d.ts.map +1 -1
  100. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js +9 -1
  101. package/dist/forms/fieldSchemasToFormState/addFieldStatePromise.js.map +1 -1
  102. package/dist/forms/fieldSchemasToFormState/index.d.ts +2 -1
  103. package/dist/forms/fieldSchemasToFormState/index.d.ts.map +1 -1
  104. package/dist/forms/fieldSchemasToFormState/index.js +2 -0
  105. package/dist/forms/fieldSchemasToFormState/index.js.map +1 -1
  106. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts +2 -1
  107. package/dist/forms/fieldSchemasToFormState/iterateFields.d.ts.map +1 -1
  108. package/dist/forms/fieldSchemasToFormState/iterateFields.js +2 -0
  109. package/dist/forms/fieldSchemasToFormState/iterateFields.js.map +1 -1
  110. package/dist/styles.css +1 -1
  111. package/dist/utilities/buildFormState.d.ts.map +1 -1
  112. package/dist/utilities/buildFormState.js +1 -0
  113. package/dist/utilities/buildFormState.js.map +1 -1
  114. package/dist/utilities/formatRelativeDate.d.ts +15 -0
  115. package/dist/utilities/formatRelativeDate.d.ts.map +1 -0
  116. package/dist/utilities/formatRelativeDate.js +62 -0
  117. package/dist/utilities/formatRelativeDate.js.map +1 -0
  118. package/dist/utilities/recentlyViewed.d.ts +16 -0
  119. package/dist/utilities/recentlyViewed.d.ts.map +1 -0
  120. package/dist/utilities/recentlyViewed.js +21 -0
  121. package/dist/utilities/recentlyViewed.js.map +1 -0
  122. package/dist/utilities/recentlyViewed.spec.js +92 -0
  123. package/dist/utilities/recentlyViewed.spec.js.map +1 -0
  124. package/dist/views/Document/index.d.ts.map +1 -1
  125. package/dist/views/Document/index.js +9 -0
  126. package/dist/views/Document/index.js.map +1 -1
  127. package/dist/views/Document/recordRecentlyViewed.d.ts +12 -0
  128. package/dist/views/Document/recordRecentlyViewed.d.ts.map +1 -0
  129. package/dist/views/Document/recordRecentlyViewed.js +40 -0
  130. package/dist/views/Document/recordRecentlyViewed.js.map +1 -0
  131. package/dist/widgets/CollectionQuery/index.css +10 -152
  132. package/dist/widgets/CollectionQuery/index.d.ts +0 -1
  133. package/dist/widgets/CollectionQuery/index.d.ts.map +1 -1
  134. package/dist/widgets/CollectionQuery/index.js +40 -111
  135. package/dist/widgets/CollectionQuery/index.js.map +1 -1
  136. package/dist/widgets/RecentlyViewed/CollectionsField/index.css +14 -0
  137. package/dist/widgets/RecentlyViewed/CollectionsField/index.d.ts +10 -0
  138. package/dist/widgets/RecentlyViewed/CollectionsField/index.d.ts.map +1 -0
  139. package/dist/widgets/RecentlyViewed/CollectionsField/index.js +76 -0
  140. package/dist/widgets/RecentlyViewed/CollectionsField/index.js.map +1 -0
  141. package/dist/widgets/RecentlyViewed/index.d.ts +10 -0
  142. package/dist/widgets/RecentlyViewed/index.d.ts.map +1 -0
  143. package/dist/widgets/RecentlyViewed/index.js +148 -0
  144. package/dist/widgets/RecentlyViewed/index.js.map +1 -0
  145. package/dist/widgets/WidgetCard/index.css +155 -0
  146. package/dist/widgets/WidgetCard/index.d.ts +19 -0
  147. package/dist/widgets/WidgetCard/index.d.ts.map +1 -0
  148. package/dist/widgets/WidgetCard/index.js +49 -0
  149. package/dist/widgets/WidgetCard/index.js.map +1 -0
  150. package/package.json +4 -4
  151. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts.map +0 -1
  152. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js.map +0 -1
  153. package/dist/elements/Hierarchy/Drawer/index.css +0 -90
  154. package/dist/elements/Hierarchy/Drawer/index.d.ts +0 -20
  155. package/dist/elements/Hierarchy/Drawer/index.d.ts.map +0 -1
  156. package/dist/elements/Hierarchy/Drawer/index.js.map +0 -1
  157. package/dist/elements/Hierarchy/Drawer/types.d.ts.map +0 -1
  158. package/dist/elements/Hierarchy/Drawer/types.js.map +0 -1
  159. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts +0 -30
  160. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts.map +0 -1
  161. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js.map +0 -1
  162. /package/dist/elements/Hierarchy/{Drawer → Modal}/fetchAncestorPath.d.ts +0 -0
  163. /package/dist/elements/Hierarchy/{Drawer → Modal}/fetchAncestorPath.js +0 -0
  164. /package/dist/elements/Hierarchy/{Drawer → Modal}/types.js +0 -0
@@ -0,0 +1,148 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { getTranslation } from '@payloadcms/translations';
3
+ import { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared';
4
+ import React from 'react';
5
+ import { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js';
6
+ import { getPreferences } from '../../utilities/upsertPreferences.js';
7
+ import { WidgetCard, WidgetList } from '../WidgetCard/index.js';
8
+ const displayLimit = 10;
9
+ export async function RecentlyViewedWidget({
10
+ req,
11
+ widgetData
12
+ }) {
13
+ const {
14
+ i18n,
15
+ user
16
+ } = req;
17
+ const title = i18n.t('dashboard:widgetRecentlyViewedTitle');
18
+ const enrichedItems = user ? await getEnrichedItems({
19
+ req,
20
+ widgetData
21
+ }) : [];
22
+ const relativeTimeFormat = getRelativeTimeFormat(i18n.language);
23
+ const items = enrichedItems.map(item => ({
24
+ href: item.href,
25
+ key: `${item.collectionSlug}:${item.id}`,
26
+ main: /*#__PURE__*/_jsxs(_Fragment, {
27
+ children: [item.thumbnailURL ? /*#__PURE__*/_jsx("img", {
28
+ alt: "",
29
+ className: "widget-card__thumbnail",
30
+ src: item.thumbnailURL
31
+ }) : /*#__PURE__*/_jsx("span", {
32
+ className: "widget-card__type",
33
+ children: item.typeLabel
34
+ }), /*#__PURE__*/_jsx("span", {
35
+ className: "widget-card__row-title",
36
+ children: item.title
37
+ })]
38
+ }),
39
+ meta: /*#__PURE__*/_jsx("time", {
40
+ dateTime: item.viewedAt,
41
+ children: formatRelativeDate({
42
+ relativeTimeFormat,
43
+ value: item.viewedAt
44
+ })
45
+ })
46
+ }));
47
+ return /*#__PURE__*/_jsx(WidgetCard, {
48
+ className: "recently-viewed-widget",
49
+ title: title,
50
+ children: /*#__PURE__*/_jsx(WidgetList, {
51
+ emptyMessage: i18n.t('dashboard:widgetRecentlyViewedEmpty'),
52
+ items: items
53
+ })
54
+ });
55
+ }
56
+ /**
57
+ * Loads the stored recently viewed identities and computes display fields from the live documents.
58
+ * Documents are queried with access control, so deleted or now-forbidden docs are dropped.
59
+ */
60
+ async function getEnrichedItems({
61
+ req,
62
+ widgetData
63
+ }) {
64
+ const {
65
+ i18n,
66
+ payload,
67
+ user
68
+ } = req;
69
+ const excludedCollections = new Set(widgetData?.excludedCollections ?? []);
70
+ const preference = await getPreferences(PREFERENCE_KEYS.RECENTLY_VIEWED, payload, user.id, user.collection);
71
+ const items = (preference?.value?.items ?? []).filter(item => !excludedCollections.has(item.collectionSlug) && Boolean(payload.collections[item.collectionSlug]));
72
+ if (items.length === 0) {
73
+ return [];
74
+ }
75
+ const idsByCollection = new Map();
76
+ for (const item of items) {
77
+ const ids = idsByCollection.get(item.collectionSlug) ?? [];
78
+ ids.push(item.id);
79
+ idsByCollection.set(item.collectionSlug, ids);
80
+ }
81
+ const docsByKey = new Map();
82
+ await Promise.all([...idsByCollection.entries()].map(async ([collectionSlug, ids]) => {
83
+ try {
84
+ const result = await payload.find({
85
+ collection: collectionSlug,
86
+ depth: 0,
87
+ limit: ids.length,
88
+ overrideAccess: false,
89
+ pagination: false,
90
+ user,
91
+ where: {
92
+ id: {
93
+ in: ids
94
+ }
95
+ }
96
+ });
97
+ for (const doc of result.docs) {
98
+ docsByKey.set(`${collectionSlug}:${doc.id}`, doc);
99
+ }
100
+ } catch (err) {
101
+ payload.logger.error({
102
+ err,
103
+ msg: `RecentlyViewedWidget: failed to load collection "${collectionSlug}"`
104
+ });
105
+ }
106
+ }));
107
+ const enrichedItems = [];
108
+ for (const item of items) {
109
+ if (enrichedItems.length >= displayLimit) {
110
+ break;
111
+ }
112
+ const doc = docsByKey.get(`${item.collectionSlug}:${item.id}`);
113
+ if (!doc) {
114
+ continue;
115
+ }
116
+ const collectionConfig = payload.collections[item.collectionSlug].config;
117
+ const useAsTitle = collectionConfig.admin?.useAsTitle || 'id';
118
+ const rawTitle = getValueByPath({
119
+ object: doc,
120
+ path: useAsTitle
121
+ });
122
+ enrichedItems.push({
123
+ id: item.id,
124
+ collectionSlug: item.collectionSlug,
125
+ href: formatAdminURL({
126
+ adminRoute: payload.config.routes.admin,
127
+ path: `/collections/${item.collectionSlug}/${item.id}`
128
+ }),
129
+ thumbnailURL: collectionConfig.upload && typeof doc.thumbnailURL === 'string' ? doc.thumbnailURL : undefined,
130
+ title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(item.id),
131
+ typeLabel: getTranslation(collectionConfig.labels.singular, i18n),
132
+ viewedAt: item.viewedAt
133
+ });
134
+ }
135
+ return enrichedItems;
136
+ }
137
+ function getValueByPath({
138
+ object,
139
+ path
140
+ }) {
141
+ return path.split('.').reduce((value, segment) => {
142
+ if (!value || typeof value !== 'object') {
143
+ return undefined;
144
+ }
145
+ return value[segment];
146
+ }, object);
147
+ }
148
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","PREFERENCE_KEYS","React","formatRelativeDate","getRelativeTimeFormat","getPreferences","WidgetCard","WidgetList","displayLimit","RecentlyViewedWidget","req","widgetData","i18n","user","title","t","enrichedItems","getEnrichedItems","relativeTimeFormat","language","items","map","item","href","key","collectionSlug","id","main","_jsxs","_Fragment","thumbnailURL","_jsx","alt","className","src","typeLabel","meta","dateTime","viewedAt","value","emptyMessage","payload","excludedCollections","Set","preference","RECENTLY_VIEWED","collection","filter","has","Boolean","collections","length","idsByCollection","Map","ids","get","push","set","docsByKey","Promise","all","entries","result","find","depth","limit","overrideAccess","pagination","where","in","doc","docs","err","logger","error","msg","collectionConfig","config","useAsTitle","admin","rawTitle","getValueByPath","object","path","adminRoute","routes","upload","undefined","String","labels","singular","split","reduce","segment"],"sources":["../../../src/widgets/RecentlyViewed/index.tsx"],"sourcesContent":["import type { RecentlyViewedPreferences, WidgetServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL, PREFERENCE_KEYS } from 'payload/shared'\nimport React from 'react'\n\nimport type { WidgetListItem } from '../WidgetCard/index.js'\n\nimport { formatRelativeDate, getRelativeTimeFormat } from '../../utilities/formatRelativeDate.js'\nimport { getPreferences } from '../../utilities/upsertPreferences.js'\nimport { WidgetCard, WidgetList } from '../WidgetCard/index.js'\n\ntype RecentlyViewedWidgetData = {\n excludedCollections?: string[]\n}\n\ntype QueryDoc = {\n id: number | string\n thumbnailURL?: unknown\n} & Record<string, unknown>\n\ntype EnrichedItem = {\n collectionSlug: string\n href: string\n id: number | string\n thumbnailURL?: string\n title: string\n typeLabel: string\n viewedAt: string\n}\n\nconst displayLimit = 10\n\nexport async function RecentlyViewedWidget({\n req,\n widgetData,\n}: WidgetServerProps<{ data?: RecentlyViewedWidgetData }>) {\n const { i18n, user } = req\n const title = i18n.t('dashboard:widgetRecentlyViewedTitle')\n\n const enrichedItems = user ? await getEnrichedItems({ req, widgetData }) : []\n const relativeTimeFormat = getRelativeTimeFormat(i18n.language)\n\n const items: WidgetListItem[] = enrichedItems.map((item) => ({\n href: item.href,\n key: `${item.collectionSlug}:${item.id}`,\n main: (\n <>\n {item.thumbnailURL ? (\n <img alt=\"\" className=\"widget-card__thumbnail\" src={item.thumbnailURL} />\n ) : (\n <span className=\"widget-card__type\">{item.typeLabel}</span>\n )}\n <span className=\"widget-card__row-title\">{item.title}</span>\n </>\n ),\n meta: (\n <time dateTime={item.viewedAt}>\n {formatRelativeDate({ relativeTimeFormat, value: item.viewedAt })}\n </time>\n ),\n }))\n\n return (\n <WidgetCard className=\"recently-viewed-widget\" title={title}>\n <WidgetList emptyMessage={i18n.t('dashboard:widgetRecentlyViewedEmpty')} items={items} />\n </WidgetCard>\n )\n}\n\n/**\n * Loads the stored recently viewed identities and computes display fields from the live documents.\n * Documents are queried with access control, so deleted or now-forbidden docs are dropped.\n */\nasync function getEnrichedItems({\n req,\n widgetData,\n}: {\n req: WidgetServerProps['req']\n widgetData: RecentlyViewedWidgetData | undefined\n}): Promise<EnrichedItem[]> {\n const { i18n, payload, user } = req\n const excludedCollections = new Set(widgetData?.excludedCollections ?? [])\n\n const preference = await getPreferences<RecentlyViewedPreferences>(\n PREFERENCE_KEYS.RECENTLY_VIEWED,\n payload,\n user.id,\n user.collection,\n )\n\n const items = (preference?.value?.items ?? []).filter(\n (item) =>\n !excludedCollections.has(item.collectionSlug) &&\n Boolean(payload.collections[item.collectionSlug]),\n )\n\n if (items.length === 0) {\n return []\n }\n\n const idsByCollection = new Map<string, Array<number | string>>()\n for (const item of items) {\n const ids = idsByCollection.get(item.collectionSlug) ?? []\n ids.push(item.id)\n idsByCollection.set(item.collectionSlug, ids)\n }\n\n const docsByKey = new Map<string, QueryDoc>()\n await Promise.all(\n [...idsByCollection.entries()].map(async ([collectionSlug, ids]) => {\n try {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: ids.length,\n overrideAccess: false,\n pagination: false,\n user,\n where: { id: { in: ids } },\n })\n\n for (const doc of result.docs as QueryDoc[]) {\n docsByKey.set(`${collectionSlug}:${doc.id}`, doc)\n }\n } catch (err) {\n payload.logger.error({\n err,\n msg: `RecentlyViewedWidget: failed to load collection \"${collectionSlug}\"`,\n })\n }\n }),\n )\n\n const enrichedItems: EnrichedItem[] = []\n\n for (const item of items) {\n if (enrichedItems.length >= displayLimit) {\n break\n }\n\n const doc = docsByKey.get(`${item.collectionSlug}:${item.id}`)\n\n if (!doc) {\n continue\n }\n\n const collectionConfig = payload.collections[item.collectionSlug].config\n const useAsTitle = collectionConfig.admin?.useAsTitle || 'id'\n const rawTitle = getValueByPath({ object: doc, path: useAsTitle })\n\n enrichedItems.push({\n id: item.id,\n collectionSlug: item.collectionSlug,\n href: formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: `/collections/${item.collectionSlug}/${item.id}`,\n }),\n thumbnailURL:\n collectionConfig.upload && typeof doc.thumbnailURL === 'string'\n ? doc.thumbnailURL\n : undefined,\n title: typeof rawTitle === 'string' && rawTitle ? rawTitle : String(item.id),\n typeLabel: getTranslation(collectionConfig.labels.singular, i18n),\n viewedAt: item.viewedAt,\n })\n }\n\n return enrichedItems\n}\n\nfunction getValueByPath({ object, path }: { object: Record<string, unknown>; path: string }) {\n return path.split('.').reduce<unknown>((value, segment) => {\n if (!value || typeof value !== 'object') {\n return undefined\n }\n\n return (value as Record<string, unknown>)[segment]\n }, object)\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,155 @@
1
+ @layer payload-default {
2
+ .widget-card {
3
+ --widget-card-visible-rows: 5;
4
+ --widget-card-row-gap: var(--spacer-1);
5
+ --widget-card-row-height: 40px;
6
+ --widget-card-scrollbar-width: 6px;
7
+ --widget-card-rows-height: calc(
8
+ (var(--widget-card-row-height) + var(--widget-card-row-gap)) *
9
+ var(--widget-card-visible-rows) - var(--widget-card-row-gap)
10
+ );
11
+
12
+ flex-direction: column;
13
+ align-items: stretch;
14
+ gap: var(--spacer-2-5);
15
+ height: 100%;
16
+ /* Border + padding + header + header/rows gap + the visible row viewport. */
17
+ max-height: calc(
18
+ (var(--stroke-width-small) * 2) + (var(--spacer-2-5) * 3) +
19
+ var(--text-heading-medium-line-height) + var(--widget-card-rows-height)
20
+ );
21
+ overflow: hidden;
22
+ padding: var(--spacer-2-5);
23
+ }
24
+
25
+ .widget-card__header {
26
+ display: flex;
27
+ align-items: center;
28
+ gap: var(--spacer-2);
29
+ }
30
+
31
+ .widget-card__title {
32
+ margin: 0;
33
+ color: var(--color-text);
34
+ font-family: var(--text-heading-medium-font-family);
35
+ font-size: var(--text-heading-medium-font-size);
36
+ font-weight: var(--text-heading-medium-font-weight);
37
+ line-height: var(--text-heading-medium-line-height);
38
+ letter-spacing: var(--text-heading-medium-letter-spacing);
39
+ }
40
+
41
+ .widget-card__rows {
42
+ display: flex;
43
+ flex: 1 1 auto;
44
+ flex-direction: column;
45
+ gap: var(--widget-card-row-gap);
46
+ min-height: 0;
47
+ overflow-y: auto;
48
+ padding: 0;
49
+ margin: 0;
50
+ list-style: none;
51
+ scrollbar-color: GrayText transparent;
52
+ scrollbar-width: thin;
53
+
54
+ &::-webkit-scrollbar {
55
+ width: var(--widget-card-scrollbar-width);
56
+ background: transparent;
57
+ }
58
+
59
+ &::-webkit-scrollbar-corner,
60
+ &::-webkit-scrollbar-track,
61
+ &::-webkit-scrollbar-track-piece {
62
+ background: transparent;
63
+ }
64
+
65
+ &::-webkit-scrollbar-thumb {
66
+ border-radius: var(--radius-small, 3px);
67
+ background: GrayText;
68
+ }
69
+ }
70
+
71
+ .widget-card__row {
72
+ margin: 0;
73
+ }
74
+
75
+ .widget-card__row-link {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: space-between;
79
+ gap: var(--spacer-2);
80
+ min-height: var(--widget-card-row-height);
81
+ padding: var(--spacer-1) calc(var(--spacer-1) * 1.5);
82
+ border: var(--stroke-width-small) solid var(--color-border);
83
+ border-radius: var(--radius-small, 3px);
84
+ background: var(--color-bg);
85
+ color: var(--color-text);
86
+ text-decoration: none;
87
+
88
+ &:hover {
89
+ background: var(--color-bg-secondary-hover);
90
+ text-decoration: none;
91
+ }
92
+ }
93
+
94
+ .widget-card__row-main,
95
+ .widget-card__row-meta {
96
+ display: inline-flex;
97
+ align-items: center;
98
+ min-width: 0;
99
+ }
100
+
101
+ .widget-card__row-main {
102
+ flex: 1 1 auto;
103
+ gap: calc(var(--spacer-1) * 1.5);
104
+ }
105
+
106
+ .widget-card__row-title {
107
+ overflow: hidden;
108
+ color: var(--color-text);
109
+ font-family: var(--text-body-medium-strong-font-family);
110
+ font-size: var(--text-body-medium-strong-font-size);
111
+ font-weight: var(--text-body-medium-strong-font-weight);
112
+ line-height: var(--text-body-medium-strong-line-height);
113
+ letter-spacing: var(--text-body-medium-strong-letter-spacing);
114
+ text-overflow: ellipsis;
115
+ white-space: nowrap;
116
+ }
117
+
118
+ .widget-card__row-meta {
119
+ flex: 0 0 auto;
120
+ gap: var(--spacer-1);
121
+ padding-left: calc(var(--spacer-1) * 1.5);
122
+ color: var(--color-text-secondary);
123
+ font-family: var(--text-body-medium-font-family);
124
+ font-size: var(--text-body-medium-font-size);
125
+ line-height: var(--text-body-medium-line-height);
126
+ letter-spacing: var(--text-body-medium-letter-spacing);
127
+ white-space: nowrap;
128
+ }
129
+
130
+ .widget-card__type {
131
+ flex: 0 0 auto;
132
+ padding: 0 var(--spacer-1);
133
+ border-radius: var(--radius-small, 3px);
134
+ background: var(--color-bg-secondary);
135
+ color: var(--color-text-secondary);
136
+ font-family: var(--text-body-medium-font-family);
137
+ font-size: var(--text-body-medium-font-size);
138
+ line-height: var(--text-body-medium-line-height);
139
+ letter-spacing: var(--text-body-medium-letter-spacing);
140
+ white-space: nowrap;
141
+ }
142
+
143
+ .widget-card__thumbnail {
144
+ width: 24px;
145
+ height: 24px;
146
+ flex: 0 0 auto;
147
+ object-fit: cover;
148
+ border-radius: var(--radius-small, 3px);
149
+ }
150
+
151
+ .widget-card__empty {
152
+ margin: 0;
153
+ color: var(--color-text-secondary);
154
+ }
155
+ }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import '../../elements/Card/index.css';
3
+ import './index.css';
4
+ export type WidgetListItem = {
5
+ href: string;
6
+ key: string;
7
+ main: React.ReactNode;
8
+ meta?: React.ReactNode;
9
+ };
10
+ export declare function WidgetCard({ children, className, title, }: {
11
+ children: React.ReactNode;
12
+ className?: string;
13
+ title: React.ReactNode;
14
+ }): React.JSX.Element;
15
+ export declare function WidgetList({ emptyMessage, items, }: {
16
+ emptyMessage: string;
17
+ items: WidgetListItem[];
18
+ }): React.JSX.Element;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/widgets/WidgetCard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,+BAA+B,CAAA;AACtC,OAAO,aAAa,CAAA;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB,CAAA;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;CACvB,qBASA;AAED,wBAAgB,UAAU,CAAC,EACzB,YAAY,EACZ,KAAK,GACN,EAAE;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,cAAc,EAAE,CAAA;CACxB,qBAiBA"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import '../../elements/Card/index.css';
4
+ import './index.css';
5
+ export function WidgetCard({
6
+ children,
7
+ className,
8
+ title
9
+ }) {
10
+ return /*#__PURE__*/_jsxs("div", {
11
+ className: ['card', 'widget-card', className].filter(Boolean).join(' '),
12
+ children: [/*#__PURE__*/_jsx("div", {
13
+ className: "widget-card__header",
14
+ children: /*#__PURE__*/_jsx("h3", {
15
+ className: "widget-card__title",
16
+ children: title
17
+ })
18
+ }), children]
19
+ });
20
+ }
21
+ export function WidgetList({
22
+ emptyMessage,
23
+ items
24
+ }) {
25
+ if (items.length === 0) {
26
+ return /*#__PURE__*/_jsx("p", {
27
+ className: "widget-card__empty",
28
+ children: emptyMessage
29
+ });
30
+ }
31
+ return /*#__PURE__*/_jsx("ul", {
32
+ className: "widget-card__rows",
33
+ children: items.map(item => /*#__PURE__*/_jsx("li", {
34
+ className: "widget-card__row",
35
+ children: /*#__PURE__*/_jsxs("a", {
36
+ className: "widget-card__row-link",
37
+ href: item.href,
38
+ children: [/*#__PURE__*/_jsx("span", {
39
+ className: "widget-card__row-main",
40
+ children: item.main
41
+ }), item.meta != null ? /*#__PURE__*/_jsx("span", {
42
+ className: "widget-card__row-meta",
43
+ children: item.meta
44
+ }) : null]
45
+ })
46
+ }, item.key))
47
+ });
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["React","WidgetCard","children","className","title","_jsxs","filter","Boolean","join","_jsx","WidgetList","emptyMessage","items","length","map","item","href","main","meta","key"],"sources":["../../../src/widgets/WidgetCard/index.tsx"],"sourcesContent":["import React from 'react'\n\nimport '../../elements/Card/index.css'\nimport './index.css'\n\nexport type WidgetListItem = {\n href: string\n key: string\n main: React.ReactNode\n meta?: React.ReactNode\n}\n\nexport function WidgetCard({\n children,\n className,\n title,\n}: {\n children: React.ReactNode\n className?: string\n title: React.ReactNode\n}) {\n return (\n <div className={['card', 'widget-card', className].filter(Boolean).join(' ')}>\n <div className=\"widget-card__header\">\n <h3 className=\"widget-card__title\">{title}</h3>\n </div>\n {children}\n </div>\n )\n}\n\nexport function WidgetList({\n emptyMessage,\n items,\n}: {\n emptyMessage: string\n items: WidgetListItem[]\n}) {\n if (items.length === 0) {\n return <p className=\"widget-card__empty\">{emptyMessage}</p>\n }\n\n return (\n <ul className=\"widget-card__rows\">\n {items.map((item) => (\n <li className=\"widget-card__row\" key={item.key}>\n <a className=\"widget-card__row-link\" href={item.href}>\n <span className=\"widget-card__row-main\">{item.main}</span>\n {item.meta != null ? <span className=\"widget-card__row-meta\">{item.meta}</span> : null}\n </a>\n </li>\n ))}\n </ul>\n )\n}\n"],"mappings":";AAAA,OAAOA,KAAA,MAAW;AAElB,OAAO;AACP,OAAO;AASP,OAAO,SAASC,WAAW;EACzBC,QAAQ;EACRC,SAAS;EACTC;AAAK,CAKN;EACC,oBACEC,KAAA,CAAC;IAAIF,SAAA,EAAW,CAAC,QAAQ,eAAeA,SAAA,CAAU,CAACG,MAAM,CAACC,OAAA,EAASC,IAAI,CAAC;4BACtEC,IAAA,CAAC;MAAIN,SAAA,EAAU;gBACb,aAAAM,IAAA,CAAC;QAAGN,SAAA,EAAU;kBAAsBC;;QAErCF,QAAA;;AAGP;AAEA,OAAO,SAASQ,WAAW;EACzBC,YAAY;EACZC;AAAK,CAIN;EACC,IAAIA,KAAA,CAAMC,MAAM,KAAK,GAAG;IACtB,oBAAOJ,IAAA,CAAC;MAAEN,SAAA,EAAU;gBAAsBQ;;EAC5C;EAEA,oBACEF,IAAA,CAAC;IAAGN,SAAA,EAAU;cACXS,KAAA,CAAME,GAAG,CAAEC,IAAA,iBACVN,IAAA,CAAC;MAAGN,SAAA,EAAU;gBACZ,aAAAE,KAAA,CAAC;QAAEF,SAAA,EAAU;QAAwBa,IAAA,EAAMD,IAAA,CAAKC,IAAI;gCAClDP,IAAA,CAAC;UAAKN,SAAA,EAAU;oBAAyBY,IAAA,CAAKE;YAC7CF,IAAA,CAAKG,IAAI,IAAI,oBAAOT,IAAA,CAAC;UAAKN,SAAA,EAAU;oBAAyBY,IAAA,CAAKG;aAAe;;OAHhDH,IAAA,CAAKI,GAAG;;AAStD","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/ui",
3
- "version": "4.0.0-canary.5",
3
+ "version": "4.0.0-canary.7",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -243,7 +243,7 @@
243
243
  "ts-essentials": "10.0.3",
244
244
  "use-context-selector": "2.0.0",
245
245
  "uuid": "14.0.0",
246
- "@payloadcms/translations": "4.0.0-canary.5"
246
+ "@payloadcms/translations": "4.0.0-canary.7"
247
247
  },
248
248
  "devDependencies": {
249
249
  "@babel/cli": "7.27.2",
@@ -258,12 +258,12 @@
258
258
  "esbuild": "0.27.1",
259
259
  "esbuild-sass-plugin": "3.3.1",
260
260
  "@payloadcms/eslint-config": "3.28.0",
261
- "payload": "4.0.0-canary.5"
261
+ "payload": "4.0.0-canary.7"
262
262
  },
263
263
  "peerDependencies": {
264
264
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
265
265
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
266
- "payload": "4.0.0-canary.5"
266
+ "payload": "4.0.0-canary.7"
267
267
  },
268
268
  "engines": {
269
269
  "node": ">=24.15.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchAncestorPath.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Drawer/fetchAncestorPath.ts"],"names":[],"mappings":"AAGA,KAAK,qBAAqB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAID;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,GAAG,EACH,cAAc,EACd,MAAM,EACN,eAAe,EACf,SAAS,GACV,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CA+CtD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetchAncestorPath.js","names":["formatAdminURL","qs","MAX_HIERARCHY_DEPTH","fetchAncestorPath","api","collectionSlug","itemId","parentFieldName","serverURL","queryString","stringify","depth","limit","select","where","id","equals","addQueryPrefix","url","apiRoute","path","response","fetch","credentials","ok","data","json","doc","docs","current","undefined","parentId","unshift"],"sources":["../../../../src/elements/Hierarchy/Drawer/fetchAncestorPath.ts"],"sourcesContent":["import { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\n\ntype FetchAncestorPathArgs = {\n api: string\n collectionSlug: string\n itemId: number | string\n parentFieldName: string\n serverURL: string\n}\n\nconst MAX_HIERARCHY_DEPTH = 20\n\n/**\n * Fetches the ancestor path for an item using a single API call with depth.\n * Returns array of ancestor IDs from root to item's parent.\n * Example: item at level 3 returns [grandparentId, parentId]\n */\nexport async function fetchAncestorPath({\n api,\n collectionSlug,\n itemId,\n parentFieldName,\n serverURL,\n}: FetchAncestorPathArgs): Promise<(number | string)[]> {\n const queryString = qs.stringify(\n {\n depth: MAX_HIERARCHY_DEPTH,\n limit: 1,\n select: { [parentFieldName]: true },\n where: { id: { equals: itemId } },\n },\n { addQueryPrefix: true },\n )\n\n const url = formatAdminURL({\n apiRoute: api,\n path: `/${collectionSlug}${queryString}`,\n serverURL,\n })\n\n const response = await fetch(url, { credentials: 'include' })\n\n if (!response.ok) {\n return []\n }\n\n const data = await response.json()\n const doc = data.docs?.[0]\n\n if (!doc) {\n return []\n }\n\n // Walk the nested parent chain to build path from root to immediate parent\n const path: (number | string)[] = []\n let current = doc[parentFieldName]\n\n while (current !== null && current !== undefined) {\n // Parent could be an ID (number/string) or a populated object\n const parentId = typeof current === 'object' ? current.id : current\n\n if (parentId !== null && parentId !== undefined) {\n path.unshift(parentId)\n }\n\n // Move to next parent (only if current is populated object)\n current = typeof current === 'object' ? current[parentFieldName] : null\n }\n\n return path\n}\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ;AAC/B,YAAYC,EAAA,MAAQ;AAUpB,MAAMC,mBAAA,GAAsB;AAE5B;;;;;AAKA,OAAO,eAAeC,kBAAkB;EACtCC,GAAG;EACHC,cAAc;EACdC,MAAM;EACNC,eAAe;EACfC;AAAS,CACa;EACtB,MAAMC,WAAA,GAAcR,EAAA,CAAGS,SAAS,CAC9B;IACEC,KAAA,EAAOT,mBAAA;IACPU,KAAA,EAAO;IACPC,MAAA,EAAQ;MAAE,CAACN,eAAA,GAAkB;IAAK;IAClCO,KAAA,EAAO;MAAEC,EAAA,EAAI;QAAEC,MAAA,EAAQV;MAAO;IAAE;EAClC,GACA;IAAEW,cAAA,EAAgB;EAAK;EAGzB,MAAMC,GAAA,GAAMlB,cAAA,CAAe;IACzBmB,QAAA,EAAUf,GAAA;IACVgB,IAAA,EAAM,IAAIf,cAAA,GAAiBI,WAAA,EAAa;IACxCD;EACF;EAEA,MAAMa,QAAA,GAAW,MAAMC,KAAA,CAAMJ,GAAA,EAAK;IAAEK,WAAA,EAAa;EAAU;EAE3D,IAAI,CAACF,QAAA,CAASG,EAAE,EAAE;IAChB,OAAO,EAAE;EACX;EAEA,MAAMC,IAAA,GAAO,MAAMJ,QAAA,CAASK,IAAI;EAChC,MAAMC,GAAA,GAAMF,IAAA,CAAKG,IAAI,GAAG,EAAE;EAE1B,IAAI,CAACD,GAAA,EAAK;IACR,OAAO,EAAE;EACX;EAEA;EACA,MAAMP,IAAA,GAA4B,EAAE;EACpC,IAAIS,OAAA,GAAUF,GAAG,CAACpB,eAAA,CAAgB;EAElC,OAAOsB,OAAA,KAAY,QAAQA,OAAA,KAAYC,SAAA,EAAW;IAChD;IACA,MAAMC,QAAA,GAAW,OAAOF,OAAA,KAAY,WAAWA,OAAA,CAAQd,EAAE,GAAGc,OAAA;IAE5D,IAAIE,QAAA,KAAa,QAAQA,QAAA,KAAaD,SAAA,EAAW;MAC/CV,IAAA,CAAKY,OAAO,CAACD,QAAA;IACf;IAEA;IACAF,OAAA,GAAU,OAAOA,OAAA,KAAY,WAAWA,OAAO,CAACtB,eAAA,CAAgB,GAAG;EACrE;EAEA,OAAOa,IAAA;AACT","ignoreList":[]}
@@ -1,90 +0,0 @@
1
- @layer payload-default {
2
- .dialog.hierarchy-drawer {
3
- width: min(900px, calc(100vw - var(--spacer-6)));
4
- height: min(700px, calc(100vh - var(--spacer-6)));
5
- max-width: calc(100vw - var(--spacer-6));
6
- }
7
-
8
- .hierarchy-drawer__content {
9
- display: flex;
10
- flex-direction: column;
11
- height: 100%;
12
- background: var(--color-bg);
13
- border-radius: var(--radius-large);
14
- overflow: clip;
15
-
16
- .drawer-action-header {
17
- padding: var(--spacer-2) var(--spacer-3);
18
- }
19
- }
20
-
21
- .hierarchy-drawer__subheader {
22
- display: flex;
23
- justify-content: space-between;
24
- align-items: center;
25
- padding: var(--spacer-2) var(--spacer-2-5);
26
- border-bottom: var(--stroke-width-small) solid var(--color-border);
27
- flex-shrink: 0;
28
- }
29
-
30
- .hierarchy-drawer__subheader-left {
31
- display: flex;
32
- align-items: center;
33
- gap: var(--spacer-2);
34
- font-weight: 500;
35
- color: var(--color-text);
36
-
37
- svg {
38
- width: var(--spacer-3);
39
- height: var(--spacer-3);
40
- }
41
- }
42
-
43
- .hierarchy-drawer__subheader-right {
44
- display: flex;
45
- align-items: center;
46
- gap: var(--spacer-2);
47
- }
48
-
49
- .hierarchy-drawer__selection-info {
50
- color: var(--color-text-secondary);
51
- }
52
-
53
- .hierarchy-drawer__clear-all {
54
- color: var(--color-text-secondary);
55
- text-decoration: underline;
56
- cursor: pointer;
57
- background: none;
58
- border: none;
59
- padding: 0;
60
- font-size: inherit;
61
-
62
- &:hover {
63
- color: var(--color-text);
64
- }
65
- }
66
-
67
- .hierarchy-drawer__move-to-root {
68
- background: none;
69
- border: none;
70
- color: var(--color-text-secondary);
71
- cursor: pointer;
72
- font-size: inherit;
73
- padding: 0;
74
- text-decoration: underline;
75
-
76
- &:hover {
77
- color: var(--color-text);
78
- }
79
- }
80
-
81
- .hierarchy-drawer__columns {
82
- flex: 1;
83
- overflow: hidden;
84
- display: flex;
85
- }
86
-
87
- .hierarchy-drawer__toggler {
88
- cursor: pointer;
89
- }
90
- }
@@ -1,20 +0,0 @@
1
- import React from 'react';
2
- import type { HierarchyColumnBrowserRef } from '../ColumnBrowser/index.js';
3
- import type { HierarchyDrawerInternalProps } from './types.js';
4
- import './index.css';
5
- export declare const baseClass = "hierarchy-drawer";
6
- type HierarchyDrawerContentProps = {
7
- columnBrowserRef?: React.RefObject<HierarchyColumnBrowserRef | null>;
8
- onCreateNew?: (params: {
9
- parentId: null | number | string;
10
- }) => void;
11
- } & HierarchyDrawerInternalProps;
12
- export type HierarchyDrawerContentRef = {
13
- selectItem: (id: number | string) => void;
14
- };
15
- export declare const HierarchyDrawerContent: ({ baseFilter, closeDrawer, columnBrowserRef, disabledIds, filterByCollection, hasMany, hierarchyCollectionSlug, Icon, initialSelections, onCreateNew, onMoveToRoot, onSave, parentFieldName, ref, showMoveToRoot, useAsTitle, }: {
16
- ref?: React.RefObject<HierarchyDrawerContentRef | null>;
17
- } & HierarchyDrawerContentProps) => React.JSX.Element;
18
- export declare const HierarchyDrawer: React.FC<HierarchyDrawerInternalProps>;
19
- export {};
20
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Drawer/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,KAAK,EAAE,4BAA4B,EAAqB,MAAM,YAAY,CAAA;AAajF,OAAO,aAAa,CAAA;AAEpB,eAAO,MAAM,SAAS,qBAAqB,CAAA;AAE3C,KAAK,2BAA2B,GAAG;IACjC,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;IACpE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACrE,GAAG,4BAA4B,CAAA;AAEhC,MAAM,MAAM,yBAAyB,GAAG;IACtC,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAmC,iOAiBnE;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;CAAE,GAAG,2BAA2B,sBAwL3F,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA8FlE,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["getTranslation","React","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","useEffectEvent","TagIcon","useConfig","useHierarchy","useTranslation","DialogModal","useDocumentDrawer","DrawerDepthProvider","DrawerActionHeader","HierarchyColumnBrowser","fetchAncestorPath","baseClass","HierarchyDrawerContent","baseFilter","closeDrawer","columnBrowserRef","disabledIds","filterByCollection","hasMany","hierarchyCollectionSlug","Icon","initialSelections","onCreateNew","onMoveToRoot","onSave","parentFieldName","ref","showMoveToRoot","useAsTitle","i18n","t","config","routes","api","serverURL","getEntityConfig","collectionConfig","collectionSlug","collectionLabel","labels","plural","parentFieldName_internal","hierarchy","initialExpandedPath","setInitialExpandedPath","isLoadingPath","setIsLoadingPath","Boolean","length","hasLoadedPathRef","firstSelection","loadAncestorPath","itemId","path","current","selections","setSelections","map","Map","id","set","selectedIds","Set","keys","ancestorsWithSelections","handleCancel","handleSave","handleSelect","prev","next","has","delete","clear","handleClearAll","selectItem","selectionCount","size","_jsxs","className","_jsx","onCancel","saveLabel","title","label","onClick","type","_Fragment","onSelect","HierarchyDrawer","props","drawerSlug","refreshTree","createParentId","setCreateParentId","drawerContentRef","documentDrawerKey","setDocumentDrawerKey","documentDrawerSlug","DocumentDrawer","closeDocumentDrawer","openDrawer","openDocumentDrawer","handleCreateNew","parentId","setTimeout","handleDocumentSave","doc","undefined","refreshColumn","drawerContent","closeOnBlur","slug","initialData"],"sources":["../../../../src/elements/Hierarchy/Drawer/index.tsx"],"sourcesContent":["'use client'\nimport { getTranslation } from '@payloadcms/translations'\nimport React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport type { HierarchyColumnBrowserRef } from '../ColumnBrowser/index.js'\nimport type { HierarchyDrawerInternalProps, SelectionWithPath } from './types.js'\n\nimport { useEffectEvent } from '../../../hooks/useEffectEvent.js'\nimport { TagIcon } from '../../../icons/Tag/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useHierarchy } from '../../../providers/Hierarchy/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { DialogModal } from '../../Dialog/index.js'\nimport { useDocumentDrawer } from '../../DocumentDrawer/index.js'\nimport { DrawerDepthProvider } from '../../Drawer/index.js'\nimport { DrawerActionHeader } from '../../DrawerActionHeader/index.js'\nimport { HierarchyColumnBrowser } from '../ColumnBrowser/index.js'\nimport { fetchAncestorPath } from './fetchAncestorPath.js'\nimport './index.css'\n\nexport const baseClass = 'hierarchy-drawer'\n\ntype HierarchyDrawerContentProps = {\n columnBrowserRef?: React.RefObject<HierarchyColumnBrowserRef | null>\n onCreateNew?: (params: { parentId: null | number | string }) => void\n} & HierarchyDrawerInternalProps\n\nexport type HierarchyDrawerContentRef = {\n selectItem: (id: number | string) => void\n}\n\nexport const HierarchyDrawerContent = function HierarchyDrawerContent({\n baseFilter,\n closeDrawer,\n columnBrowserRef,\n disabledIds,\n filterByCollection,\n hasMany = false,\n hierarchyCollectionSlug,\n Icon,\n initialSelections,\n onCreateNew,\n onMoveToRoot,\n onSave,\n parentFieldName,\n ref,\n showMoveToRoot,\n useAsTitle,\n}: { ref?: React.RefObject<HierarchyDrawerContentRef | null> } & HierarchyDrawerContentProps) {\n const { i18n, t } = useTranslation()\n // NOTE: Do NOT use useModal() here - it causes re-renders when any modal state changes\n // Use closeDrawer prop instead which already handles closing the modal\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const collectionConfig = getEntityConfig({ collectionSlug: hierarchyCollectionSlug })\n const collectionLabel = collectionConfig\n ? getTranslation(collectionConfig.labels?.plural || hierarchyCollectionSlug, i18n)\n : hierarchyCollectionSlug\n\n const parentFieldName_internal =\n collectionConfig?.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy.parentFieldName\n : parentFieldName\n\n const [initialExpandedPath, setInitialExpandedPath] = useState<(number | string)[] | undefined>()\n const [isLoadingPath, setIsLoadingPath] = useState(Boolean(initialSelections?.length))\n const hasLoadedPathRef = React.useRef(false)\n const firstSelection = initialSelections?.[0]\n\n const loadAncestorPath = useEffectEvent(async (itemId?: number | string) => {\n if (!itemId) {\n setIsLoadingPath(false)\n return\n }\n\n try {\n const path = await fetchAncestorPath({\n api,\n collectionSlug: hierarchyCollectionSlug,\n itemId,\n parentFieldName: parentFieldName_internal,\n serverURL,\n })\n setInitialExpandedPath(path)\n } catch {\n // Silently handle fetch errors - will just start at root\n } finally {\n setIsLoadingPath(false)\n }\n })\n\n // Load ancestor path on mount\n useEffect(() => {\n if (hasLoadedPathRef.current) {\n return\n }\n hasLoadedPathRef.current = true\n void loadAncestorPath(firstSelection)\n }, [firstSelection])\n\n const [selections, setSelections] = useState<Map<number | string, SelectionWithPath>>(() => {\n const map = new Map<number | string, SelectionWithPath>()\n\n if (initialSelections) {\n for (const id of initialSelections) {\n map.set(id, { id, path: [] })\n }\n }\n\n return map\n })\n\n const selectedIds = useMemo(() => new Set(selections.keys()), [selections])\n\n // For now, ancestorsWithSelections is empty - will be computed when we have path tracking\n const ancestorsWithSelections = useMemo(() => new Set<number | string>(), [])\n\n const handleCancel = useCallback(() => {\n closeDrawer()\n }, [closeDrawer])\n\n const handleSave = useCallback(() => {\n onSave({ closeDrawer, selections })\n }, [onSave, selections, closeDrawer])\n\n const handleSelect = useCallback(\n ({\n id,\n path,\n }: {\n id: number | string\n path: Array<{ id: number | string; title: string }>\n }) => {\n setSelections((prev) => {\n const next = new Map(prev)\n\n if (next.has(id)) {\n next.delete(id)\n } else {\n if (!hasMany) {\n // Single select: clear previous selections\n next.clear()\n }\n next.set(id, { id, path })\n }\n\n return next\n })\n },\n [hasMany],\n )\n\n const handleClearAll = useCallback(() => {\n setSelections(new Map())\n }, [])\n\n // Expose selectItem for programmatic selection (e.g., after creating a new item)\n useImperativeHandle(\n ref,\n () => ({\n selectItem: (id: number | string) => {\n setSelections((prev) => {\n const next = new Map(prev)\n if (!hasMany) {\n next.clear()\n }\n // Path will be empty for newly created items - could be enhanced later\n next.set(id, { id, path: [] })\n return next\n })\n },\n }),\n [hasMany],\n )\n\n const selectionCount = selections.size\n\n return (\n <div className={`${baseClass}__content`}>\n <DrawerActionHeader\n onCancel={handleCancel}\n onSave={handleSave}\n saveLabel={t('general:select')}\n title={t('general:selectValue', { label: collectionLabel })}\n />\n <div className={`${baseClass}__subheader`}>\n <div className={`${baseClass}__subheader-left`}>\n {Icon || <TagIcon />}\n <h4>{collectionLabel}</h4>\n </div>\n <div className={`${baseClass}__subheader-right`}>\n {showMoveToRoot && onMoveToRoot && (\n <button className={`${baseClass}__move-to-root`} onClick={onMoveToRoot} type=\"button\">\n {t('hierarchy:moveToRoot')}\n </button>\n )}\n {selectionCount > 0 && (\n <>\n <span className={`${baseClass}__selection-info`}>{selectionCount} selected</span>\n <span>—</span>\n <button className={`${baseClass}__clear-all`} onClick={handleClearAll} type=\"button\">\n {t('general:clearAll')}\n </button>\n </>\n )}\n </div>\n </div>\n <div className={`${baseClass}__columns`}>\n <HierarchyColumnBrowser\n ancestorsWithSelections={ancestorsWithSelections}\n baseFilter={baseFilter}\n disabledIds={disabledIds}\n filterByCollection={filterByCollection}\n hierarchyCollectionSlug={hierarchyCollectionSlug}\n initialExpandedPath={initialExpandedPath}\n isLoadingPath={isLoadingPath}\n onCreateNew={onCreateNew}\n onSelect={handleSelect}\n parentFieldName={parentFieldName}\n ref={columnBrowserRef}\n selectedIds={selectedIds}\n useAsTitle={useAsTitle}\n />\n </div>\n </div>\n )\n}\n\nexport const HierarchyDrawer: React.FC<HierarchyDrawerInternalProps> = (props) => {\n const { drawerSlug, hierarchyCollectionSlug, parentFieldName } = props\n\n const { refreshTree } = useHierarchy()\n\n // Get parentFieldName from hierarchy config\n const { getEntityConfig } = useConfig()\n const collectionConfig = getEntityConfig({ collectionSlug: hierarchyCollectionSlug })\n const parentFieldName_internal =\n collectionConfig?.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy.parentFieldName\n : parentFieldName\n\n // Track which parentId is being used for the document drawer - use state to trigger re-render\n const [createParentId, setCreateParentId] = useState<null | number | string>(null)\n\n // Ref to access column browser's refresh function\n const columnBrowserRef = useRef<HierarchyColumnBrowserRef | null>(null)\n\n // Ref to access drawer content's selectItem function\n const drawerContentRef = useRef<HierarchyDrawerContentRef | null>(null)\n\n // Key for DocumentDrawer to force remount when parentId changes\n const [documentDrawerKey, setDocumentDrawerKey] = useState(0)\n\n // Stable drawer slug for the document drawer - must not change on remount\n const documentDrawerSlug = `${drawerSlug}-create-doc`\n\n // Document drawer for creating new items - rendered OUTSIDE the Drawer to avoid nested modal issues\n const [DocumentDrawer, , { closeDrawer: closeDocumentDrawer, openDrawer: openDocumentDrawer }] =\n useDocumentDrawer({\n collectionSlug: hierarchyCollectionSlug,\n drawerSlug: documentDrawerSlug,\n })\n\n const handleCreateNew = useCallback(\n ({ parentId }: { parentId: null | number | string }) => {\n // Increment key to force DocumentDrawer remount with new initialData\n setDocumentDrawerKey((prev) => prev + 1)\n setCreateParentId(parentId)\n // Use setTimeout to ensure state update triggers re-render before opening drawer\n setTimeout(() => {\n openDocumentDrawer()\n }, 0)\n },\n [openDocumentDrawer],\n )\n\n // Refresh the column, select the new item, and close the document drawer after creation\n const handleDocumentSave = useCallback<\n NonNullable<React.ComponentProps<typeof DocumentDrawer>['onSave']>\n >(\n ({ doc }) => {\n if (columnBrowserRef.current && createParentId !== undefined) {\n void columnBrowserRef.current.refreshColumn(createParentId)\n }\n if (drawerContentRef.current && doc?.id) {\n drawerContentRef.current.selectItem(doc.id)\n }\n refreshTree(hierarchyCollectionSlug)\n closeDocumentDrawer()\n },\n [closeDocumentDrawer, createParentId, hierarchyCollectionSlug, refreshTree],\n )\n\n // Memoize the content - only depends on stable values\n const drawerContent = useMemo(\n () => (\n <HierarchyDrawerContent\n {...props}\n columnBrowserRef={columnBrowserRef}\n onCreateNew={handleCreateNew}\n ref={drawerContentRef}\n />\n ),\n [handleCreateNew, props],\n )\n\n return (\n <>\n <DialogModal className={baseClass} closeOnBlur size=\"large\" slug={drawerSlug}>\n {drawerContent}\n </DialogModal>\n <DrawerDepthProvider>\n <DocumentDrawer\n initialData={\n createParentId !== null ? { [parentFieldName_internal]: createParentId } : undefined\n }\n key={documentDrawerKey}\n onSave={handleDocumentSave}\n />\n </DrawerDepthProvider>\n </>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Drawer/types.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/elements/Hierarchy/Drawer/types.ts"],"sourcesContent":["import type { Where } from 'payload'\nimport type React from 'react'\nimport type { HTMLAttributes } from 'react'\n\nexport type SelectionWithPath = {\n id: number | string\n path: Array<{ id: number | string; title: string }>\n}\n\nexport type UseHierarchyDrawerArgs = {\n /** IDs that should be disabled (e.g., items being moved can't be selected as destination) */\n disabledIds?: Set<number | string>\n /**\n * When provided, filters hierarchy items to only show those that accept these collections.\n * Used with collectionSpecific hierarchy config.\n */\n filterByCollection?: string[]\n hierarchyCollectionSlug: string\n Icon?: React.ReactNode\n}\n\nexport type HierarchyDrawerProps = {\n readonly hasMany?: boolean\n readonly initialSelections?: (number | string)[]\n readonly onMoveToRoot?: () => void\n readonly onSave: (params: {\n closeDrawer: () => void\n selections: Map<number | string, SelectionWithPath>\n }) => void\n readonly showMoveToRoot?: boolean\n}\n\nexport type HierarchyDrawerInternalProps = {\n /** Base filter constraint (e.g., tenant filter) to apply to all queries */\n readonly baseFilter?: null | Where\n readonly closeDrawer: () => void\n /** IDs that should be disabled (e.g., items being moved can't be selected as destination) */\n readonly disabledIds?: Set<number | string>\n readonly drawerSlug: string\n /**\n * When provided, filters hierarchy items to only show those that accept these collections.\n * Used with collectionSpecific hierarchy config.\n */\n readonly filterByCollection?: string[]\n readonly hierarchyCollectionSlug: string\n readonly Icon?: React.ReactNode\n readonly parentFieldName: string\n readonly useAsTitle?: string\n} & HierarchyDrawerProps\n\nexport type HierarchyDrawerTogglerProps = {\n children?: React.ReactNode\n className?: string\n disabled?: boolean\n drawerSlug?: string\n} & HTMLAttributes<HTMLButtonElement>\n\nexport type UseHierarchyDrawer = (args: UseHierarchyDrawerArgs) => [\n React.FC<HierarchyDrawerProps>,\n React.FC<Omit<HierarchyDrawerTogglerProps, 'drawerSlug'>>,\n {\n closeDrawer: () => void\n drawerDepth: number\n drawerSlug: string\n isDrawerOpen: boolean\n openDrawer: () => void\n toggleDrawer: () => void\n },\n]\n\n// Re-export column browser types for backwards compatibility\nexport type { ColumnItemData } from '../ColumnBrowser/types.js'\n"],"mappings":"AAsEA;AACA","ignoreList":[]}