@payloadcms/ui 4.0.0-canary.4 → 4.0.0-canary.6

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/dist/css/forms.css +6 -3
  2. package/dist/css/theme.css +2 -1
  3. package/dist/elements/AddNewRelation/index.css +1 -1
  4. package/dist/elements/ArrayAction/index.d.ts.map +1 -1
  5. package/dist/elements/ArrayAction/index.js +1 -0
  6. package/dist/elements/ArrayAction/index.js.map +1 -1
  7. package/dist/elements/Button/index.d.ts.map +1 -1
  8. package/dist/elements/Button/index.js +5 -0
  9. package/dist/elements/Button/index.js.map +1 -1
  10. package/dist/elements/ClipboardAction/index.d.ts.map +1 -1
  11. package/dist/elements/ClipboardAction/index.js +1 -0
  12. package/dist/elements/ClipboardAction/index.js.map +1 -1
  13. package/dist/elements/Collapsible/index.d.ts.map +1 -1
  14. package/dist/elements/Collapsible/index.js +2 -0
  15. package/dist/elements/Collapsible/index.js.map +1 -1
  16. package/dist/elements/DatePicker/index.css +1 -1
  17. package/dist/elements/DatePicker/index.js +1 -1
  18. package/dist/elements/DatePicker/index.js.map +1 -1
  19. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  20. package/dist/elements/DocumentControls/index.js +1 -0
  21. package/dist/elements/DocumentControls/index.js.map +1 -1
  22. package/dist/elements/DocumentFields/index.css +1 -0
  23. package/dist/elements/EditUpload/index.d.ts.map +1 -1
  24. package/dist/elements/EditUpload/index.js +4 -0
  25. package/dist/elements/EditUpload/index.js.map +1 -1
  26. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.css +3 -1
  27. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.css +1 -0
  28. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts +1 -1
  29. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -1
  30. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -1
  31. package/dist/elements/Hierarchy/DocHeaderButton/index.js +12 -12
  32. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -1
  33. package/dist/elements/Hierarchy/Field/index.client.js +14 -14
  34. package/dist/elements/Hierarchy/Field/index.client.js.map +1 -1
  35. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.d.ts.map +1 -0
  36. package/dist/elements/Hierarchy/Modal/fetchAncestorPath.js.map +1 -0
  37. package/dist/elements/Hierarchy/Modal/index.css +88 -0
  38. package/dist/elements/Hierarchy/Modal/index.d.ts +20 -0
  39. package/dist/elements/Hierarchy/Modal/index.d.ts.map +1 -0
  40. package/dist/elements/Hierarchy/{Drawer → Modal}/index.js +105 -81
  41. package/dist/elements/Hierarchy/Modal/index.js.map +1 -0
  42. package/dist/elements/Hierarchy/{Drawer → Modal}/types.d.ts +22 -18
  43. package/dist/elements/Hierarchy/Modal/types.d.ts.map +1 -0
  44. package/dist/elements/Hierarchy/Modal/types.js.map +1 -0
  45. package/dist/elements/Hierarchy/Modal/useHierarchyModal.d.ts +30 -0
  46. package/dist/elements/Hierarchy/Modal/useHierarchyModal.d.ts.map +1 -0
  47. package/dist/elements/Hierarchy/{Drawer/useHierarchyDrawer.js → Modal/useHierarchyModal.js} +51 -50
  48. package/dist/elements/Hierarchy/Modal/useHierarchyModal.js.map +1 -0
  49. package/dist/elements/Hierarchy/MoveMany/index.d.ts +2 -2
  50. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -1
  51. package/dist/elements/Hierarchy/MoveMany/index.js +9 -9
  52. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -1
  53. package/dist/elements/LivePreview/Toolbar/SizeInput/index.d.ts.map +1 -1
  54. package/dist/elements/LivePreview/Toolbar/SizeInput/index.js +1 -0
  55. package/dist/elements/LivePreview/Toolbar/SizeInput/index.js.map +1 -1
  56. package/dist/elements/LivePreview/Window/index.css +6 -0
  57. package/dist/elements/Popup/PopupTrigger/index.d.ts +1 -0
  58. package/dist/elements/Popup/PopupTrigger/index.d.ts.map +1 -1
  59. package/dist/elements/Popup/PopupTrigger/index.js +3 -0
  60. package/dist/elements/Popup/PopupTrigger/index.js.map +1 -1
  61. package/dist/elements/Popup/index.d.ts +6 -0
  62. package/dist/elements/Popup/index.d.ts.map +1 -1
  63. package/dist/elements/Popup/index.js +2 -0
  64. package/dist/elements/Popup/index.js.map +1 -1
  65. package/dist/elements/ReactSelect/DropdownIndicator/index.d.ts.map +1 -1
  66. package/dist/elements/ReactSelect/DropdownIndicator/index.js +19 -12
  67. package/dist/elements/ReactSelect/DropdownIndicator/index.js.map +1 -1
  68. package/dist/elements/ReactSelect/index.css +2 -2
  69. package/dist/elements/ReactSelect/index.js +1 -1
  70. package/dist/elements/ReactSelect/index.js.map +1 -1
  71. package/dist/elements/ReactSelect/types.d.ts +1 -0
  72. package/dist/elements/ReactSelect/types.d.ts.map +1 -1
  73. package/dist/elements/ReactSelect/types.js.map +1 -1
  74. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +24 -24
  75. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
  76. package/dist/elements/TimezonePicker/index.css +1 -1
  77. package/dist/exports/client/index.d.ts +3 -2
  78. package/dist/exports/client/index.d.ts.map +1 -1
  79. package/dist/exports/client/index.js +26 -26
  80. package/dist/exports/client/index.js.map +4 -4
  81. package/dist/exports/rsc/index.d.ts +1 -0
  82. package/dist/exports/rsc/index.d.ts.map +1 -1
  83. package/dist/exports/rsc/index.js +1 -0
  84. package/dist/exports/rsc/index.js.map +1 -1
  85. package/dist/fields/Blocks/SectionTitle/index.d.ts.map +1 -1
  86. package/dist/fields/Blocks/SectionTitle/index.js +1 -0
  87. package/dist/fields/Blocks/SectionTitle/index.js.map +1 -1
  88. package/dist/fields/ConfirmPassword/index.d.ts +4 -0
  89. package/dist/fields/ConfirmPassword/index.d.ts.map +1 -1
  90. package/dist/fields/ConfirmPassword/index.js +37 -33
  91. package/dist/fields/ConfirmPassword/index.js.map +1 -1
  92. package/dist/fields/Number/Input.d.ts.map +1 -1
  93. package/dist/fields/Number/Input.js +29 -25
  94. package/dist/fields/Number/Input.js.map +1 -1
  95. package/dist/fields/Number/types.d.ts +4 -0
  96. package/dist/fields/Number/types.d.ts.map +1 -1
  97. package/dist/fields/Number/types.js.map +1 -1
  98. package/dist/fields/Password/input.d.ts.map +1 -1
  99. package/dist/fields/Password/input.js +33 -29
  100. package/dist/fields/Password/input.js.map +1 -1
  101. package/dist/fields/Password/types.d.ts +4 -0
  102. package/dist/fields/Password/types.d.ts.map +1 -1
  103. package/dist/fields/Password/types.js.map +1 -1
  104. package/dist/fields/Relationship/Input.d.ts.map +1 -1
  105. package/dist/fields/Relationship/Input.js +4 -0
  106. package/dist/fields/Relationship/Input.js.map +1 -1
  107. package/dist/fields/Relationship/types.d.ts +4 -0
  108. package/dist/fields/Relationship/types.d.ts.map +1 -1
  109. package/dist/fields/Relationship/types.js.map +1 -1
  110. package/dist/fields/Select/Input.d.ts +4 -0
  111. package/dist/fields/Select/Input.d.ts.map +1 -1
  112. package/dist/fields/Select/Input.js +45 -40
  113. package/dist/fields/Select/Input.js.map +1 -1
  114. package/dist/fields/Text/Input.d.ts.map +1 -1
  115. package/dist/fields/Text/Input.js +25 -21
  116. package/dist/fields/Text/Input.js.map +1 -1
  117. package/dist/fields/Text/types.d.ts +4 -0
  118. package/dist/fields/Text/types.d.ts.map +1 -1
  119. package/dist/fields/Text/types.js.map +1 -1
  120. package/dist/fields/Textarea/Input.d.ts.map +1 -1
  121. package/dist/fields/Textarea/Input.js +27 -23
  122. package/dist/fields/Textarea/Input.js.map +1 -1
  123. package/dist/fields/Textarea/index.css +1 -1
  124. package/dist/fields/Textarea/types.d.ts +4 -0
  125. package/dist/fields/Textarea/types.d.ts.map +1 -1
  126. package/dist/fields/Textarea/types.js.map +1 -1
  127. package/dist/styles.css +1 -1
  128. package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.d.ts.map +1 -1
  129. package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js +27 -23
  130. package/dist/views/Dashboard/Default/ModularDashboard/WidgetConfigDrawer.js.map +1 -1
  131. package/dist/views/Dashboard/Default/ModularDashboard/index.css +2 -0
  132. package/dist/views/Version/SelectComparison/index.d.ts.map +1 -1
  133. package/dist/views/Version/SelectComparison/index.js +1 -0
  134. package/dist/views/Version/SelectComparison/index.js.map +1 -1
  135. package/dist/widgets/CollectionQuery/SortField/index.d.ts +3 -0
  136. package/dist/widgets/CollectionQuery/SortField/index.d.ts.map +1 -0
  137. package/dist/widgets/CollectionQuery/SortField/index.js +118 -0
  138. package/dist/widgets/CollectionQuery/SortField/index.js.map +1 -0
  139. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.d.ts +18 -0
  140. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.d.ts.map +1 -0
  141. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.js +91 -0
  142. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.js.map +1 -0
  143. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.spec.js +100 -0
  144. package/dist/widgets/CollectionQuery/getCollectionFieldPaths.spec.js.map +1 -0
  145. package/dist/widgets/CollectionQuery/index.css +206 -0
  146. package/dist/widgets/CollectionQuery/index.d.ts +17 -0
  147. package/dist/widgets/CollectionQuery/index.d.ts.map +1 -0
  148. package/dist/widgets/CollectionQuery/index.js +399 -0
  149. package/dist/widgets/CollectionQuery/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,206 @@
1
+ @layer payload-default {
2
+ .collection-query-widget {
3
+ --collection-query-widget-visible-rows: 5;
4
+ --collection-query-widget-row-gap: var(--spacer-1);
5
+ --collection-query-widget-row-height: 40px;
6
+ --collection-query-widget-scrollbar-width: 6px;
7
+ --collection-query-widget-rows-height: calc(
8
+ (
9
+ var(--collection-query-widget-row-height) + var(--collection-query-widget-row-gap)
10
+ ) * var(--collection-query-widget-visible-rows) - var(--collection-query-widget-row-gap)
11
+ );
12
+
13
+ flex-direction: column;
14
+ align-items: stretch;
15
+ gap: var(--spacer-2-5);
16
+ height: 100%;
17
+ /* Border + padding + header + header/rows gap + the visible row viewport. */
18
+ max-height: calc(
19
+ (var(--stroke-width-small) * 2) + (var(--spacer-2-5) * 3) +
20
+ var(--text-heading-small-line-height, 24px) +
21
+ var(--collection-query-widget-rows-height)
22
+ );
23
+ overflow: hidden;
24
+ padding: var(--spacer-2-5);
25
+ }
26
+
27
+ .collection-query-widget__title {
28
+ margin: 0;
29
+ color: var(--color-text);
30
+ font-family: var(--text-heading-small-font-family, var(--text-body-large-strong-font-family));
31
+ font-size: var(--text-heading-small-font-size, 20px);
32
+ font-weight: var(--text-heading-small-font-weight, var(--text-body-large-strong-font-weight));
33
+ line-height: var(--text-heading-small-line-height, 24px);
34
+ }
35
+
36
+ .collection-query-widget__header {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--spacer-2);
40
+ }
41
+
42
+ .collection-query-widget__rows {
43
+ display: flex;
44
+ flex: 1 1 auto;
45
+ flex-direction: column;
46
+ gap: var(--collection-query-widget-row-gap);
47
+ min-height: 0;
48
+ overflow-y: auto;
49
+ padding: 0;
50
+ padding-inline-end: calc(
51
+ var(--collection-query-widget-scrollbar-width) + var(--spacer-1)
52
+ );
53
+ margin: 0;
54
+ list-style: none;
55
+ scrollbar-color: GrayText transparent;
56
+ scrollbar-width: thin;
57
+
58
+ &::-webkit-scrollbar {
59
+ width: var(--collection-query-widget-scrollbar-width);
60
+ background: transparent;
61
+ }
62
+
63
+ &::-webkit-scrollbar-corner,
64
+ &::-webkit-scrollbar-track,
65
+ &::-webkit-scrollbar-track-piece {
66
+ background: transparent;
67
+ }
68
+
69
+ &::-webkit-scrollbar-thumb {
70
+ border-radius: var(--radius-small, 3px);
71
+ background: GrayText;
72
+ }
73
+ }
74
+
75
+ .collection-query-widget__row {
76
+ margin: 0;
77
+ }
78
+
79
+ .collection-query-widget__row-link {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: space-between;
83
+ gap: var(--spacer-2);
84
+ min-height: var(--collection-query-widget-row-height);
85
+ padding: var(--spacer-1) calc(var(--spacer-1) * 1.5);
86
+ border: var(--stroke-width-small) solid var(--color-border);
87
+ border-radius: var(--radius-small, 3px);
88
+ background: var(--color-bg);
89
+ color: var(--color-text);
90
+ text-decoration: none;
91
+
92
+ &:hover {
93
+ background: var(--color-bg-secondary-hover);
94
+ text-decoration: none;
95
+ }
96
+ }
97
+
98
+ .collection-query-widget__row-main,
99
+ .collection-query-widget__row-meta {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ min-width: 0;
103
+ }
104
+
105
+ .collection-query-widget__row-main {
106
+ flex: 1 1 auto;
107
+ gap: calc(var(--spacer-1) * 1.5);
108
+ }
109
+
110
+ .collection-query-widget__row-meta {
111
+ flex: 0 0 auto;
112
+ gap: var(--spacer-1);
113
+ padding-left: calc(var(--spacer-1) * 1.5);
114
+ color: var(--color-text-secondary);
115
+ font-family: var(--text-body-small-font-family, var(--text-body-medium-font-family));
116
+ font-size: var(--text-body-small-font-size, 13px);
117
+ line-height: var(--text-body-small-line-height, 20px);
118
+ white-space: nowrap;
119
+ }
120
+
121
+ .collection-query-widget__row-title {
122
+ overflow: hidden;
123
+ color: var(--color-text);
124
+ font-family: var(
125
+ --text-body-small-strong-font-family,
126
+ var(--text-body-medium-strong-font-family)
127
+ );
128
+ font-size: var(--text-body-small-strong-font-size, 13px);
129
+ font-weight: var(
130
+ --text-body-small-strong-font-weight,
131
+ var(--text-body-medium-strong-font-weight)
132
+ );
133
+ line-height: var(--text-body-small-strong-line-height, 24px);
134
+ text-overflow: ellipsis;
135
+ white-space: nowrap;
136
+ }
137
+
138
+ .collection-query-widget--error {
139
+ border-color: var(--color-bg-danger);
140
+ }
141
+
142
+ .collection-query-widget--error .collection-query-widget__title {
143
+ color: var(--color-text-danger);
144
+ }
145
+
146
+ .collection-query-widget__error {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: calc(var(--spacer-1) * 1.5);
150
+ padding: calc(var(--spacer-1) * 1.5);
151
+ border: var(--stroke-width-small) solid var(--color-bg-danger);
152
+ border-radius: var(--radius-small, 3px);
153
+ background: var(--color-bg-danger-tertiary);
154
+ color: var(--color-text-danger);
155
+ font-family: var(--text-body-small-font-family, var(--text-body-medium-font-family));
156
+ font-size: var(--text-body-small-font-size, 13px);
157
+ line-height: var(--text-body-small-line-height, 20px);
158
+ }
159
+
160
+ .collection-query-widget__error-title {
161
+ display: inline-flex;
162
+ width: fit-content;
163
+ padding: 0 var(--spacer-1);
164
+ margin: 0;
165
+ border-radius: var(--radius-small, 3px);
166
+ background: var(--color-bg-danger);
167
+ color: var(--color-text-ondanger);
168
+ font-family: var(--text-body-small-strong-font-family, var(--text-body-medium-strong-font-family));
169
+ font-size: var(--text-body-small-strong-font-size, 13px);
170
+ font-weight: var(
171
+ --text-body-small-strong-font-weight,
172
+ var(--text-body-medium-strong-font-weight)
173
+ );
174
+ line-height: var(--text-body-small-strong-line-height, 20px);
175
+ }
176
+
177
+ .collection-query-widget__error-list {
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: var(--spacer-1);
181
+ padding: 0;
182
+ margin: 0;
183
+ list-style: none;
184
+ }
185
+
186
+ .collection-query-widget__error-list li {
187
+ display: flex;
188
+ gap: var(--spacer-1);
189
+ min-width: 0;
190
+ }
191
+
192
+ .collection-query-widget__error-list li::before {
193
+ content: '';
194
+ width: 4px;
195
+ height: 4px;
196
+ flex: 0 0 auto;
197
+ margin-top: calc(var(--spacer-1) * 1.25);
198
+ border-radius: 50%;
199
+ background: currentColor;
200
+ }
201
+
202
+ .collection-query-widget__empty {
203
+ margin: 0;
204
+ color: var(--color-text-secondary);
205
+ }
206
+ }
@@ -0,0 +1,17 @@
1
+ import type { CollectionSlug, Where, WidgetServerProps } from 'payload';
2
+ import React from 'react';
3
+ import '../../elements/Card/index.css';
4
+ import './index.css';
5
+ type CollectionQueryWidgetData = {
6
+ limit?: number;
7
+ relatedCollection?: CollectionSlug;
8
+ sortDirection?: 'asc' | 'desc';
9
+ sortField?: string;
10
+ title?: string;
11
+ where?: Where;
12
+ };
13
+ export declare function CollectionQueryWidget({ req, widgetData, }: WidgetServerProps<{
14
+ data?: CollectionQueryWidgetData;
15
+ }>): Promise<React.JSX.Element>;
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/widgets/CollectionQuery/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAIvE,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,+BAA+B,CAAA;AACtC,OAAO,aAAa,CAAA;AAGpB,KAAK,yBAAyB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iBAAiB,CAAC,EAAE,cAAc,CAAA;IAClC,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAiBD,wBAAsB,qBAAqB,CAAC,EAC1C,GAAG,EACH,UAAU,GACX,EAAE,iBAAiB,CAAC;IAAE,IAAI,CAAC,EAAE,yBAAyB,CAAA;CAAE,CAAC,8BAmHzD"}
@@ -0,0 +1,399 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getTranslation } from '@payloadcms/translations';
3
+ import { formatAdminURL } from 'payload/shared';
4
+ import React from 'react';
5
+ import '../../elements/Card/index.css';
6
+ import './index.css';
7
+ import { getCollectionFieldPaths } from './getCollectionFieldPaths.js';
8
+ const minLimit = 1;
9
+ const maxLimit = 25;
10
+ const emptyFieldPaths = {
11
+ filterableFieldPaths: new Set(),
12
+ relationshipFieldPaths: new Set(),
13
+ sortableFieldPaths: new Set()
14
+ };
15
+ export async function CollectionQueryWidget({
16
+ req,
17
+ widgetData
18
+ }) {
19
+ const {
20
+ i18n,
21
+ payload,
22
+ user
23
+ } = req;
24
+ const {
25
+ relatedCollection,
26
+ sortDirection = 'desc',
27
+ sortField,
28
+ title: titleFromData,
29
+ where
30
+ } = widgetData ?? {};
31
+ const limit = clampLimit(widgetData?.limit);
32
+ const collectionConfig = relatedCollection ? payload.collections[relatedCollection]?.config : undefined;
33
+ const title = titleFromData || (collectionConfig ? getTranslation(collectionConfig.labels.plural, i18n) : i18n.t('dashboard:widgetTitleFallback'));
34
+ const fieldPaths = collectionConfig ? getCollectionFieldPaths(collectionConfig.fields) : emptyFieldPaths;
35
+ const validationErrors = getValidationErrors({
36
+ collectionConfig,
37
+ fieldPaths,
38
+ i18n,
39
+ relatedCollection,
40
+ sortField,
41
+ where
42
+ });
43
+ if (validationErrors.length > 0 || !relatedCollection || !collectionConfig) {
44
+ return /*#__PURE__*/_jsx(CollectionQueryError, {
45
+ errors: validationErrors,
46
+ i18n: i18n,
47
+ title: title
48
+ });
49
+ }
50
+ const sort = sortField ? `${sortDirection === 'desc' ? '-' : ''}${sortField}` : undefined;
51
+ const adminRoute = payload.config.routes.admin;
52
+ let docs;
53
+ try {
54
+ const result = await payload.find({
55
+ collection: relatedCollection,
56
+ depth: 0,
57
+ limit,
58
+ overrideAccess: false,
59
+ sort,
60
+ user,
61
+ where
62
+ });
63
+ docs = result.docs;
64
+ } catch (err) {
65
+ payload.logger.error({
66
+ err,
67
+ msg: `CollectionQueryWidget: failed to query collection "${relatedCollection}"`
68
+ });
69
+ return /*#__PURE__*/_jsx(CollectionQueryError, {
70
+ errors: [i18n.t('dashboard:widgetQueryError')],
71
+ i18n: i18n,
72
+ title: title
73
+ });
74
+ }
75
+ const documentLabelPath = getCollectionDocumentLabelPath(collectionConfig.admin);
76
+ const relativeTimeFormat = getRelativeTimeFormat(i18n.language);
77
+ return /*#__PURE__*/_jsxs("div", {
78
+ className: "card collection-query-widget",
79
+ children: [/*#__PURE__*/_jsx("div", {
80
+ className: "collection-query-widget__header",
81
+ children: /*#__PURE__*/_jsx("h3", {
82
+ className: "collection-query-widget__title",
83
+ children: title
84
+ })
85
+ }), docs.length > 0 ? /*#__PURE__*/_jsx("ul", {
86
+ className: "collection-query-widget__rows",
87
+ children: docs.map(doc => {
88
+ const sortMeta = getDocSortMeta({
89
+ doc,
90
+ i18n,
91
+ relativeTimeFormat,
92
+ sortField
93
+ });
94
+ return /*#__PURE__*/_jsx("li", {
95
+ className: "collection-query-widget__row",
96
+ children: /*#__PURE__*/_jsxs("a", {
97
+ className: "collection-query-widget__row-link",
98
+ href: getDocumentHref({
99
+ id: doc.id,
100
+ adminRoute,
101
+ collectionSlug: relatedCollection
102
+ }),
103
+ children: [/*#__PURE__*/_jsx("span", {
104
+ className: "collection-query-widget__row-main",
105
+ children: /*#__PURE__*/_jsx("span", {
106
+ className: "collection-query-widget__row-title",
107
+ children: getDocLabel({
108
+ doc,
109
+ documentLabelPath
110
+ })
111
+ })
112
+ }), /*#__PURE__*/_jsx("span", {
113
+ className: "collection-query-widget__row-meta",
114
+ children: sortMeta ? sortMeta.dateTime ? /*#__PURE__*/_jsx("time", {
115
+ dateTime: sortMeta.dateTime,
116
+ children: sortMeta.label
117
+ }) : sortMeta.label : null
118
+ })]
119
+ })
120
+ }, doc.id);
121
+ })
122
+ }) : /*#__PURE__*/_jsx("p", {
123
+ className: "collection-query-widget__empty",
124
+ children: i18n.t('general:noResultsFound')
125
+ })]
126
+ });
127
+ }
128
+ function CollectionQueryError({
129
+ errors,
130
+ i18n,
131
+ title
132
+ }) {
133
+ return /*#__PURE__*/_jsxs("div", {
134
+ className: "card collection-query-widget collection-query-widget--error",
135
+ children: [/*#__PURE__*/_jsx("div", {
136
+ className: "collection-query-widget__header",
137
+ children: /*#__PURE__*/_jsx("h3", {
138
+ className: "collection-query-widget__title",
139
+ children: title
140
+ })
141
+ }), /*#__PURE__*/_jsxs("div", {
142
+ className: "collection-query-widget__error",
143
+ children: [/*#__PURE__*/_jsx("p", {
144
+ className: "collection-query-widget__error-title",
145
+ children: i18n.t('dashboard:widgetConfigurationError')
146
+ }), /*#__PURE__*/_jsx("ul", {
147
+ className: "collection-query-widget__error-list",
148
+ children: errors.map(error => /*#__PURE__*/_jsx("li", {
149
+ children: error
150
+ }, error))
151
+ })]
152
+ })]
153
+ });
154
+ }
155
+ function clampLimit(limit) {
156
+ if (typeof limit !== 'number' || Number.isNaN(limit)) {
157
+ return 5;
158
+ }
159
+ return Math.min(Math.max(Math.floor(limit), minLimit), maxLimit);
160
+ }
161
+ function getCollectionDocumentLabelPath(adminConfig) {
162
+ return adminConfig.useAsTitle || 'id';
163
+ }
164
+ function getDocSortMeta({
165
+ doc,
166
+ i18n,
167
+ relativeTimeFormat,
168
+ sortField
169
+ }) {
170
+ const value = sortField ? getValueByPath({
171
+ object: doc,
172
+ path: sortField
173
+ }) : doc.updatedAt || doc.createdAt;
174
+ if (value === null || typeof value === 'undefined' || value === '') {
175
+ return null;
176
+ }
177
+ if (value instanceof Date) {
178
+ const dateTime = value.toISOString();
179
+ return {
180
+ dateTime,
181
+ label: formatRelativeDate({
182
+ relativeTimeFormat,
183
+ value: dateTime
184
+ })
185
+ };
186
+ }
187
+ if (typeof value === 'string') {
188
+ if (isDateString(value)) {
189
+ return {
190
+ dateTime: value,
191
+ label: formatRelativeDate({
192
+ relativeTimeFormat,
193
+ value
194
+ })
195
+ };
196
+ }
197
+ return {
198
+ label: value
199
+ };
200
+ }
201
+ if (typeof value === 'number') {
202
+ return {
203
+ label: value.toLocaleString(i18n.language)
204
+ };
205
+ }
206
+ if (typeof value === 'boolean') {
207
+ return {
208
+ label: value ? i18n.t('general:true') : i18n.t('general:false')
209
+ };
210
+ }
211
+ return null;
212
+ }
213
+ function getDocLabel({
214
+ doc,
215
+ documentLabelPath
216
+ }) {
217
+ const title = getValueByPath({
218
+ object: doc,
219
+ path: documentLabelPath
220
+ });
221
+ return typeof title === 'string' && title ? title : String(doc.id);
222
+ }
223
+ function getValidationErrors({
224
+ collectionConfig,
225
+ fieldPaths,
226
+ i18n,
227
+ relatedCollection,
228
+ sortField,
229
+ where
230
+ }) {
231
+ const errors = [];
232
+ if (!relatedCollection) {
233
+ errors.push(i18n.t('dashboard:widgetCollectionRequired'));
234
+ return errors;
235
+ }
236
+ if (!collectionConfig) {
237
+ errors.push(i18n.t('dashboard:widgetInvalidCollection', {
238
+ collection: relatedCollection
239
+ }));
240
+ return errors;
241
+ }
242
+ if (sortField) {
243
+ if (!fieldPaths.filterableFieldPaths.has(sortField)) {
244
+ errors.push(i18n.t('dashboard:widgetInvalidSortField', {
245
+ collection: relatedCollection,
246
+ field: sortField
247
+ }));
248
+ } else if (!fieldPaths.sortableFieldPaths.has(sortField)) {
249
+ errors.push(i18n.t('dashboard:widgetNonSortableSortField', {
250
+ collection: relatedCollection,
251
+ field: sortField
252
+ }));
253
+ }
254
+ }
255
+ for (const fieldPath of getWhereFieldPaths(where)) {
256
+ if (fieldPaths.filterableFieldPaths.has(fieldPath) || hasRelationshipAncestor({
257
+ path: fieldPath,
258
+ relationshipFieldPaths: fieldPaths.relationshipFieldPaths
259
+ })) {
260
+ continue;
261
+ }
262
+ errors.push(i18n.t('dashboard:widgetInvalidFilterField', {
263
+ collection: relatedCollection,
264
+ field: fieldPath
265
+ }));
266
+ }
267
+ return errors;
268
+ }
269
+ /**
270
+ * A `where` path that traverses into a relationship (e.g. `category.name`) cannot be validated
271
+ * against this collection's fields because it targets another collection, so accept it when any
272
+ * ancestor segment is a relationship.
273
+ */
274
+ function hasRelationshipAncestor({
275
+ path,
276
+ relationshipFieldPaths
277
+ }) {
278
+ const segments = path.split('.');
279
+ let prefix = '';
280
+ for (const segment of segments) {
281
+ prefix = prefix ? `${prefix}.${segment}` : segment;
282
+ if (relationshipFieldPaths.has(prefix)) {
283
+ return true;
284
+ }
285
+ }
286
+ return false;
287
+ }
288
+ function getWhereFieldPaths(where) {
289
+ const fieldPaths = new Set();
290
+ collectWhereFieldPaths({
291
+ fieldPaths,
292
+ value: where
293
+ });
294
+ return fieldPaths;
295
+ }
296
+ function collectWhereFieldPaths({
297
+ fieldPaths,
298
+ value
299
+ }) {
300
+ if (!value || typeof value !== 'object') {
301
+ return;
302
+ }
303
+ if (Array.isArray(value)) {
304
+ for (const item of value) {
305
+ collectWhereFieldPaths({
306
+ fieldPaths,
307
+ value: item
308
+ });
309
+ }
310
+ return;
311
+ }
312
+ for (const [key, childValue] of Object.entries(value)) {
313
+ if (key === 'and' || key === 'or') {
314
+ collectWhereFieldPaths({
315
+ fieldPaths,
316
+ value: childValue
317
+ });
318
+ continue;
319
+ }
320
+ fieldPaths.add(key);
321
+ }
322
+ }
323
+ function getDocumentHref({
324
+ id,
325
+ adminRoute,
326
+ collectionSlug
327
+ }) {
328
+ return formatAdminURL({
329
+ adminRoute,
330
+ path: `/collections/${collectionSlug}/${id}`
331
+ });
332
+ }
333
+ function getValueByPath({
334
+ object,
335
+ path
336
+ }) {
337
+ return path.split('.').reduce((value, segment) => {
338
+ if (!value || typeof value !== 'object') {
339
+ return undefined;
340
+ }
341
+ return value[segment];
342
+ }, object);
343
+ }
344
+ function getRelativeTimeFormat(language) {
345
+ try {
346
+ return new Intl.RelativeTimeFormat(language, {
347
+ numeric: 'auto',
348
+ style: 'narrow'
349
+ });
350
+ } catch {
351
+ return new Intl.RelativeTimeFormat('en', {
352
+ numeric: 'auto',
353
+ style: 'narrow'
354
+ });
355
+ }
356
+ }
357
+ const relativeTimeDivisions = [{
358
+ amount: 60,
359
+ unit: 'seconds'
360
+ }, {
361
+ amount: 60,
362
+ unit: 'minutes'
363
+ }, {
364
+ amount: 24,
365
+ unit: 'hours'
366
+ }, {
367
+ amount: 7,
368
+ unit: 'days'
369
+ }, {
370
+ amount: 4.34524,
371
+ unit: 'weeks'
372
+ }, {
373
+ amount: 12,
374
+ unit: 'months'
375
+ }, {
376
+ amount: Number.POSITIVE_INFINITY,
377
+ unit: 'years'
378
+ }];
379
+ function formatRelativeDate({
380
+ relativeTimeFormat,
381
+ value
382
+ }) {
383
+ const date = new Date(value);
384
+ if (Number.isNaN(date.getTime())) {
385
+ return value;
386
+ }
387
+ let duration = (date.getTime() - Date.now()) / 1000;
388
+ for (const division of relativeTimeDivisions) {
389
+ if (Math.abs(duration) < division.amount) {
390
+ return relativeTimeFormat.format(Math.round(duration), division.unit);
391
+ }
392
+ duration /= division.amount;
393
+ }
394
+ return relativeTimeFormat.format(Math.round(duration), 'years');
395
+ }
396
+ function isDateString(value) {
397
+ return /^\d{4}-\d{2}-\d{2}/.test(value) && !Number.isNaN(new Date(value).getTime());
398
+ }
399
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","formatAdminURL","React","getCollectionFieldPaths","minLimit","maxLimit","emptyFieldPaths","filterableFieldPaths","Set","relationshipFieldPaths","sortableFieldPaths","CollectionQueryWidget","req","widgetData","i18n","payload","user","relatedCollection","sortDirection","sortField","title","titleFromData","where","limit","clampLimit","collectionConfig","collections","config","undefined","labels","plural","t","fieldPaths","fields","validationErrors","getValidationErrors","length","_jsx","CollectionQueryError","errors","sort","adminRoute","routes","admin","docs","result","find","collection","depth","overrideAccess","err","logger","error","msg","documentLabelPath","getCollectionDocumentLabelPath","relativeTimeFormat","getRelativeTimeFormat","language","_jsxs","className","map","doc","sortMeta","getDocSortMeta","href","getDocumentHref","id","collectionSlug","getDocLabel","dateTime","label","Number","isNaN","Math","min","max","floor","adminConfig","useAsTitle","value","getValueByPath","object","path","updatedAt","createdAt","Date","toISOString","formatRelativeDate","isDateString","toLocaleString","String","push","has","field","fieldPath","getWhereFieldPaths","hasRelationshipAncestor","segments","split","prefix","segment","collectWhereFieldPaths","Array","isArray","item","key","childValue","Object","entries","add","reduce","Intl","RelativeTimeFormat","numeric","style","relativeTimeDivisions","amount","unit","POSITIVE_INFINITY","date","getTime","duration","now","division","abs","format","round","test"],"sources":["../../../src/widgets/CollectionQuery/index.tsx"],"sourcesContent":["import type { I18n } from '@payloadcms/translations'\nimport type { CollectionSlug, Where, WidgetServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { CollectionFieldPaths } from './getCollectionFieldPaths.js'\n\nimport '../../elements/Card/index.css'\nimport './index.css'\nimport { getCollectionFieldPaths } from './getCollectionFieldPaths.js'\n\ntype CollectionQueryWidgetData = {\n limit?: number\n relatedCollection?: CollectionSlug\n sortDirection?: 'asc' | 'desc'\n sortField?: string\n title?: string\n where?: Where\n}\n\ntype QueryDoc = {\n createdAt?: string\n id: number | string\n updatedAt?: string\n} & Record<string, unknown>\n\nconst minLimit = 1\nconst maxLimit = 25\n\nconst emptyFieldPaths: CollectionFieldPaths = {\n filterableFieldPaths: new Set<string>(),\n relationshipFieldPaths: new Set<string>(),\n sortableFieldPaths: new Set<string>(),\n}\n\nexport async function CollectionQueryWidget({\n req,\n widgetData,\n}: WidgetServerProps<{ data?: CollectionQueryWidgetData }>) {\n const { i18n, payload, user } = req\n const {\n relatedCollection,\n sortDirection = 'desc',\n sortField,\n title: titleFromData,\n where,\n } = widgetData ?? {}\n const limit = clampLimit(widgetData?.limit)\n const collectionConfig = relatedCollection\n ? payload.collections[relatedCollection]?.config\n : undefined\n\n const title =\n titleFromData ||\n (collectionConfig\n ? getTranslation(collectionConfig.labels.plural, i18n)\n : i18n.t('dashboard:widgetTitleFallback'))\n\n const fieldPaths = collectionConfig\n ? getCollectionFieldPaths(collectionConfig.fields)\n : emptyFieldPaths\n const validationErrors = getValidationErrors({\n collectionConfig,\n fieldPaths,\n i18n,\n relatedCollection,\n sortField,\n where,\n })\n\n if (validationErrors.length > 0 || !relatedCollection || !collectionConfig) {\n return <CollectionQueryError errors={validationErrors} i18n={i18n} title={title} />\n }\n\n const sort = sortField ? `${sortDirection === 'desc' ? '-' : ''}${sortField}` : undefined\n const adminRoute = payload.config.routes.admin\n\n let docs: QueryDoc[]\n\n try {\n const result = await payload.find({\n collection: relatedCollection,\n depth: 0,\n limit,\n overrideAccess: false,\n sort,\n user,\n where,\n })\n\n docs = result.docs as QueryDoc[]\n } catch (err) {\n payload.logger.error({\n err,\n msg: `CollectionQueryWidget: failed to query collection \"${relatedCollection}\"`,\n })\n\n return (\n <CollectionQueryError\n errors={[i18n.t('dashboard:widgetQueryError')]}\n i18n={i18n}\n title={title}\n />\n )\n }\n\n const documentLabelPath = getCollectionDocumentLabelPath(collectionConfig.admin)\n const relativeTimeFormat = getRelativeTimeFormat(i18n.language)\n\n return (\n <div className=\"card collection-query-widget\">\n <div className=\"collection-query-widget__header\">\n <h3 className=\"collection-query-widget__title\">{title}</h3>\n </div>\n {docs.length > 0 ? (\n <ul className=\"collection-query-widget__rows\">\n {docs.map((doc) => {\n const sortMeta = getDocSortMeta({ doc, i18n, relativeTimeFormat, sortField })\n\n return (\n <li className=\"collection-query-widget__row\" key={doc.id}>\n <a\n className=\"collection-query-widget__row-link\"\n href={getDocumentHref({\n id: doc.id,\n adminRoute,\n collectionSlug: relatedCollection,\n })}\n >\n <span className=\"collection-query-widget__row-main\">\n <span className=\"collection-query-widget__row-title\">\n {getDocLabel({ doc, documentLabelPath })}\n </span>\n </span>\n <span className=\"collection-query-widget__row-meta\">\n {sortMeta ? (\n sortMeta.dateTime ? (\n <time dateTime={sortMeta.dateTime}>{sortMeta.label}</time>\n ) : (\n sortMeta.label\n )\n ) : null}\n </span>\n </a>\n </li>\n )\n })}\n </ul>\n ) : (\n <p className=\"collection-query-widget__empty\">{i18n.t('general:noResultsFound')}</p>\n )}\n </div>\n )\n}\n\nfunction CollectionQueryError({\n errors,\n i18n,\n title,\n}: {\n errors: string[]\n i18n: I18n\n title: string\n}) {\n return (\n <div className=\"card collection-query-widget collection-query-widget--error\">\n <div className=\"collection-query-widget__header\">\n <h3 className=\"collection-query-widget__title\">{title}</h3>\n </div>\n <div className=\"collection-query-widget__error\">\n <p className=\"collection-query-widget__error-title\">\n {i18n.t('dashboard:widgetConfigurationError')}\n </p>\n <ul className=\"collection-query-widget__error-list\">\n {errors.map((error) => (\n <li key={error}>{error}</li>\n ))}\n </ul>\n </div>\n </div>\n )\n}\n\nfunction clampLimit(limit: number | undefined) {\n if (typeof limit !== 'number' || Number.isNaN(limit)) {\n return 5\n }\n\n return Math.min(Math.max(Math.floor(limit), minLimit), maxLimit)\n}\n\nfunction getCollectionDocumentLabelPath(adminConfig: { useAsTitle?: string }) {\n return adminConfig.useAsTitle || 'id'\n}\n\nfunction getDocSortMeta({\n doc,\n i18n,\n relativeTimeFormat,\n sortField,\n}: {\n doc: QueryDoc\n i18n: I18n\n relativeTimeFormat: Intl.RelativeTimeFormat\n sortField?: string\n}) {\n const value = sortField\n ? getValueByPath({ object: doc, path: sortField })\n : doc.updatedAt || doc.createdAt\n\n if (value === null || typeof value === 'undefined' || value === '') {\n return null\n }\n\n if (value instanceof Date) {\n const dateTime = value.toISOString()\n\n return {\n dateTime,\n label: formatRelativeDate({ relativeTimeFormat, value: dateTime }),\n }\n }\n\n if (typeof value === 'string') {\n if (isDateString(value)) {\n return {\n dateTime: value,\n label: formatRelativeDate({ relativeTimeFormat, value }),\n }\n }\n\n return { label: value }\n }\n\n if (typeof value === 'number') {\n return { label: value.toLocaleString(i18n.language) }\n }\n\n if (typeof value === 'boolean') {\n return { label: value ? i18n.t('general:true') : i18n.t('general:false') }\n }\n\n return null\n}\n\nfunction getDocLabel({ doc, documentLabelPath }: { doc: QueryDoc; documentLabelPath: string }) {\n const title = getValueByPath({ object: doc, path: documentLabelPath })\n\n return typeof title === 'string' && title ? title : String(doc.id)\n}\n\nfunction getValidationErrors({\n collectionConfig,\n fieldPaths,\n i18n,\n relatedCollection,\n sortField,\n where,\n}: {\n collectionConfig: unknown\n fieldPaths: CollectionFieldPaths\n i18n: I18n\n relatedCollection?: CollectionSlug\n sortField?: string\n where?: Where\n}) {\n const errors: string[] = []\n\n if (!relatedCollection) {\n errors.push(i18n.t('dashboard:widgetCollectionRequired'))\n\n return errors\n }\n\n if (!collectionConfig) {\n errors.push(i18n.t('dashboard:widgetInvalidCollection', { collection: relatedCollection }))\n\n return errors\n }\n\n if (sortField) {\n if (!fieldPaths.filterableFieldPaths.has(sortField)) {\n errors.push(\n i18n.t('dashboard:widgetInvalidSortField', {\n collection: relatedCollection,\n field: sortField,\n }),\n )\n } else if (!fieldPaths.sortableFieldPaths.has(sortField)) {\n errors.push(\n i18n.t('dashboard:widgetNonSortableSortField', {\n collection: relatedCollection,\n field: sortField,\n }),\n )\n }\n }\n\n for (const fieldPath of getWhereFieldPaths(where)) {\n if (\n fieldPaths.filterableFieldPaths.has(fieldPath) ||\n hasRelationshipAncestor({\n path: fieldPath,\n relationshipFieldPaths: fieldPaths.relationshipFieldPaths,\n })\n ) {\n continue\n }\n\n errors.push(\n i18n.t('dashboard:widgetInvalidFilterField', {\n collection: relatedCollection,\n field: fieldPath,\n }),\n )\n }\n\n return errors\n}\n\n/**\n * A `where` path that traverses into a relationship (e.g. `category.name`) cannot be validated\n * against this collection's fields because it targets another collection, so accept it when any\n * ancestor segment is a relationship.\n */\nfunction hasRelationshipAncestor({\n path,\n relationshipFieldPaths,\n}: {\n path: string\n relationshipFieldPaths: Set<string>\n}) {\n const segments = path.split('.')\n let prefix = ''\n\n for (const segment of segments) {\n prefix = prefix ? `${prefix}.${segment}` : segment\n\n if (relationshipFieldPaths.has(prefix)) {\n return true\n }\n }\n\n return false\n}\n\nfunction getWhereFieldPaths(where: undefined | Where) {\n const fieldPaths = new Set<string>()\n\n collectWhereFieldPaths({ fieldPaths, value: where })\n\n return fieldPaths\n}\n\nfunction collectWhereFieldPaths({\n fieldPaths,\n value,\n}: {\n fieldPaths: Set<string>\n value: unknown\n}) {\n if (!value || typeof value !== 'object') {\n return\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n collectWhereFieldPaths({ fieldPaths, value: item })\n }\n\n return\n }\n\n for (const [key, childValue] of Object.entries(value)) {\n if (key === 'and' || key === 'or') {\n collectWhereFieldPaths({ fieldPaths, value: childValue })\n\n continue\n }\n\n fieldPaths.add(key)\n }\n}\n\nfunction getDocumentHref({\n id,\n adminRoute,\n collectionSlug,\n}: {\n adminRoute: string\n collectionSlug: CollectionSlug\n id: number | string\n}) {\n return formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/${id}`,\n })\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\nfunction getRelativeTimeFormat(language: string) {\n try {\n return new Intl.RelativeTimeFormat(language, { numeric: 'auto', style: 'narrow' })\n } catch {\n return new Intl.RelativeTimeFormat('en', { numeric: 'auto', style: 'narrow' })\n }\n}\n\nconst relativeTimeDivisions: { amount: number; unit: Intl.RelativeTimeFormatUnit }[] = [\n { amount: 60, unit: 'seconds' },\n { amount: 60, unit: 'minutes' },\n { amount: 24, unit: 'hours' },\n { amount: 7, unit: 'days' },\n { amount: 4.34524, unit: 'weeks' },\n { amount: 12, unit: 'months' },\n { amount: Number.POSITIVE_INFINITY, unit: 'years' },\n]\n\nfunction formatRelativeDate({\n relativeTimeFormat,\n value,\n}: {\n relativeTimeFormat: Intl.RelativeTimeFormat\n value: string\n}) {\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n return value\n }\n\n let duration = (date.getTime() - Date.now()) / 1000\n\n for (const division of relativeTimeDivisions) {\n if (Math.abs(duration) < division.amount) {\n return relativeTimeFormat.format(Math.round(duration), division.unit)\n }\n\n duration /= division.amount\n }\n\n return relativeTimeFormat.format(Math.round(duration), 'years')\n}\n\nfunction isDateString(value: string) {\n return /^\\d{4}-\\d{2}-\\d{2}/.test(value) && !Number.isNaN(new Date(value).getTime())\n}\n"],"mappings":"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","ignoreList":[]}