@payloadcms/ui 4.0.0-canary.3 → 4.0.0-internal.17c142b

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 (163) hide show
  1. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  2. package/dist/elements/BulkUpload/FormsManager/index.js +13 -0
  3. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  4. package/dist/elements/Card/index.css +1 -1
  5. package/dist/elements/ColumnSelection/Popup.d.ts +12 -0
  6. package/dist/elements/ColumnSelection/Popup.d.ts.map +1 -0
  7. package/dist/elements/{ColumnSelector/index.js → ColumnSelection/Popup.js} +28 -13
  8. package/dist/elements/ColumnSelection/Popup.js.map +1 -0
  9. package/dist/elements/ColumnSelection/index.d.ts +10 -0
  10. package/dist/elements/ColumnSelection/index.d.ts.map +1 -0
  11. package/dist/elements/{ColumnsButton → ColumnSelection}/index.js +23 -17
  12. package/dist/elements/ColumnSelection/index.js.map +1 -0
  13. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  14. package/dist/elements/DocumentControls/index.js +2 -2
  15. package/dist/elements/DocumentControls/index.js.map +1 -1
  16. package/dist/elements/DocumentDrawer/DrawerHeader/index.d.ts.map +1 -1
  17. package/dist/elements/DocumentDrawer/DrawerHeader/index.js +5 -3
  18. package/dist/elements/DocumentDrawer/DrawerHeader/index.js.map +1 -1
  19. package/dist/elements/GroupBy/Popup.d.ts +21 -0
  20. package/dist/elements/GroupBy/Popup.d.ts.map +1 -0
  21. package/dist/elements/GroupBy/Popup.js +269 -0
  22. package/dist/elements/GroupBy/Popup.js.map +1 -0
  23. package/dist/elements/GroupBy/index.d.ts +12 -0
  24. package/dist/elements/GroupBy/index.d.ts.map +1 -0
  25. package/dist/elements/GroupBy/index.js +91 -0
  26. package/dist/elements/GroupBy/index.js.map +1 -0
  27. package/dist/elements/ListColumnSelectionButton/index.d.ts +11 -0
  28. package/dist/elements/ListColumnSelectionButton/index.d.ts.map +1 -0
  29. package/dist/elements/ListColumnSelectionButton/index.js +37 -0
  30. package/dist/elements/ListColumnSelectionButton/index.js.map +1 -0
  31. package/dist/elements/ListControls/index.d.ts.map +1 -1
  32. package/dist/elements/ListControls/index.js +7 -7
  33. package/dist/elements/ListControls/index.js.map +1 -1
  34. package/dist/elements/ListGroupByButton/index.d.ts +12 -0
  35. package/dist/elements/ListGroupByButton/index.d.ts.map +1 -0
  36. package/dist/elements/ListGroupByButton/index.js +55 -0
  37. package/dist/elements/ListGroupByButton/index.js.map +1 -0
  38. package/dist/elements/ListWhereBuilder/index.d.ts +16 -0
  39. package/dist/elements/ListWhereBuilder/index.d.ts.map +1 -0
  40. package/dist/elements/ListWhereBuilder/index.js +62 -0
  41. package/dist/elements/ListWhereBuilder/index.js.map +1 -0
  42. package/dist/elements/Popup/index.d.ts.map +1 -1
  43. package/dist/elements/Popup/index.js +42 -11
  44. package/dist/elements/Popup/index.js.map +1 -1
  45. package/dist/elements/QueryPresets/cells/ColumnsCell/{index.scss → index.css} +1 -3
  46. package/dist/elements/QueryPresets/cells/ColumnsCell/index.d.ts +1 -1
  47. package/dist/elements/QueryPresets/cells/ColumnsCell/index.d.ts.map +1 -1
  48. package/dist/elements/QueryPresets/cells/ColumnsCell/index.js +1 -1
  49. package/dist/elements/QueryPresets/cells/ColumnsCell/index.js.map +1 -1
  50. package/dist/elements/QueryPresets/fields/ColumnsField/index.d.ts +1 -1
  51. package/dist/elements/QueryPresets/fields/ColumnsField/index.d.ts.map +1 -1
  52. package/dist/elements/QueryPresets/fields/ColumnsField/index.js +77 -48
  53. package/dist/elements/QueryPresets/fields/ColumnsField/index.js.map +1 -1
  54. package/dist/elements/QueryPresets/fields/GroupByField/index.d.ts +1 -1
  55. package/dist/elements/QueryPresets/fields/GroupByField/index.d.ts.map +1 -1
  56. package/dist/elements/QueryPresets/fields/GroupByField/index.js +12 -21
  57. package/dist/elements/QueryPresets/fields/GroupByField/index.js.map +1 -1
  58. package/dist/elements/QueryPresets/fields/Heading/index.css +52 -0
  59. package/dist/elements/QueryPresets/fields/Heading/index.d.ts +7 -0
  60. package/dist/elements/QueryPresets/fields/Heading/index.d.ts.map +1 -0
  61. package/dist/elements/QueryPresets/fields/Heading/index.js +31 -0
  62. package/dist/elements/QueryPresets/fields/Heading/index.js.map +1 -0
  63. package/dist/elements/QueryPresets/fields/WhereField/index.d.ts +1 -1
  64. package/dist/elements/QueryPresets/fields/WhereField/index.d.ts.map +1 -1
  65. package/dist/elements/QueryPresets/fields/WhereField/index.js +24 -23
  66. package/dist/elements/QueryPresets/fields/WhereField/index.js.map +1 -1
  67. package/dist/elements/QueryPresets/fields/fields.css +23 -0
  68. package/dist/elements/RelationshipTable/index.js +2 -2
  69. package/dist/elements/RelationshipTable/index.js.map +1 -1
  70. package/dist/elements/RenderServerComponent/clientOnly.d.ts +8 -0
  71. package/dist/elements/RenderServerComponent/clientOnly.d.ts.map +1 -0
  72. package/dist/elements/RenderServerComponent/clientOnly.js +56 -0
  73. package/dist/elements/RenderServerComponent/clientOnly.js.map +1 -0
  74. package/dist/elements/SortColumn/index.css +1 -1
  75. package/dist/elements/Table/index.css +24 -2
  76. package/dist/elements/WhereBuilder/Condition/index.d.ts +1 -0
  77. package/dist/elements/WhereBuilder/Condition/index.d.ts.map +1 -1
  78. package/dist/elements/WhereBuilder/Condition/index.js +17 -2
  79. package/dist/elements/WhereBuilder/Condition/index.js.map +1 -1
  80. package/dist/elements/WhereBuilder/index.d.ts +4 -3
  81. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  82. package/dist/elements/WhereBuilder/index.js +71 -62
  83. package/dist/elements/WhereBuilder/index.js.map +1 -1
  84. package/dist/elements/WhereBuilder/types.d.ts +6 -5
  85. package/dist/elements/WhereBuilder/types.d.ts.map +1 -1
  86. package/dist/elements/WhereBuilder/types.js.map +1 -1
  87. package/dist/exports/client/index.d.ts +1 -0
  88. package/dist/exports/client/index.d.ts.map +1 -1
  89. package/dist/exports/client/index.js +2 -86
  90. package/dist/exports/client/index.js.map +4 -4
  91. package/dist/exports/server.d.ts +3 -0
  92. package/dist/exports/server.d.ts.map +1 -0
  93. package/dist/exports/server.js +2 -0
  94. package/dist/exports/server.js.map +1 -0
  95. package/dist/providers/Auth/index.d.ts +3 -1
  96. package/dist/providers/Auth/index.d.ts.map +1 -1
  97. package/dist/providers/Auth/index.js +8 -3
  98. package/dist/providers/Auth/index.js.map +1 -1
  99. package/dist/scss/app.scss +6 -0
  100. package/dist/styles.css +1361 -1
  101. package/dist/utilities/getVersions.d.ts.map +1 -1
  102. package/dist/utilities/getVersions.js +5 -2
  103. package/dist/utilities/getVersions.js.map +1 -1
  104. package/dist/utilities/handleLivePreview.d.ts.map +1 -1
  105. package/dist/utilities/reduceFieldsToOptions.js +1 -1
  106. package/dist/utilities/reduceFieldsToOptions.js.map +1 -1
  107. package/dist/utilities/serverFunctionRegistry.d.ts +13 -0
  108. package/dist/utilities/serverFunctionRegistry.d.ts.map +1 -0
  109. package/dist/utilities/serverFunctionRegistry.js +25 -0
  110. package/dist/utilities/serverFunctionRegistry.js.map +1 -0
  111. package/dist/views/List/index.client.d.ts.map +1 -1
  112. package/dist/views/List/index.client.js +3 -3
  113. package/dist/views/List/index.client.js.map +1 -1
  114. package/dist/views/List/index.d.ts.map +1 -1
  115. package/dist/views/List/index.js +7 -1
  116. package/dist/views/List/index.js.map +1 -1
  117. package/dist/views/Logout/LogoutClient.d.ts +14 -0
  118. package/dist/views/Logout/LogoutClient.d.ts.map +1 -1
  119. package/dist/views/Logout/LogoutClient.js +38 -32
  120. package/dist/views/Logout/LogoutClient.js.map +1 -1
  121. package/dist/views/Logout/index.d.ts.map +1 -1
  122. package/dist/views/Logout/index.js +7 -2
  123. package/dist/views/Logout/index.js.map +1 -1
  124. package/dist/views/Versions/index.css +0 -4
  125. package/dist/widgets/CollectionCards/getCollectionCardsData.d.ts +20 -0
  126. package/dist/widgets/CollectionCards/getCollectionCardsData.d.ts.map +1 -0
  127. package/dist/widgets/CollectionCards/getCollectionCardsData.js +29 -0
  128. package/dist/widgets/CollectionCards/getCollectionCardsData.js.map +1 -0
  129. package/dist/widgets/CollectionCards/index.client.d.ts +5 -0
  130. package/dist/widgets/CollectionCards/index.client.d.ts.map +1 -0
  131. package/dist/widgets/CollectionCards/index.client.js +139 -0
  132. package/dist/widgets/CollectionCards/index.client.js.map +1 -0
  133. package/package.json +561 -7
  134. package/dist/elements/ColumnSelector/index.d.ts +0 -9
  135. package/dist/elements/ColumnSelector/index.d.ts.map +0 -1
  136. package/dist/elements/ColumnSelector/index.js.map +0 -1
  137. package/dist/elements/ColumnsButton/index.d.ts +0 -7
  138. package/dist/elements/ColumnsButton/index.d.ts.map +0 -1
  139. package/dist/elements/ColumnsButton/index.js.map +0 -1
  140. package/dist/elements/GroupByBuilder/index.d.ts +0 -12
  141. package/dist/elements/GroupByBuilder/index.d.ts.map +0 -1
  142. package/dist/elements/GroupByBuilder/index.js +0 -164
  143. package/dist/elements/GroupByBuilder/index.js.map +0 -1
  144. package/dist/elements/GroupByBuilder/index.scss +0 -39
  145. package/dist/elements/GroupByControl/index.d.ts +0 -9
  146. package/dist/elements/GroupByControl/index.d.ts.map +0 -1
  147. package/dist/elements/GroupByControl/index.js +0 -254
  148. package/dist/elements/GroupByControl/index.js.map +0 -1
  149. package/dist/elements/QueryPresets/fields/ColumnsField/index.scss +0 -17
  150. package/dist/elements/QueryPresets/fields/GroupByField/index.scss +0 -17
  151. package/dist/elements/QueryPresets/fields/WhereField/index.scss +0 -23
  152. package/dist/exports/client/CodeEditor-T3624SG3.js +0 -14
  153. package/dist/exports/client/CodeEditor-T3624SG3.js.map +0 -7
  154. package/dist/exports/client/DatePicker-6KF52Z3G.js +0 -14
  155. package/dist/exports/client/DatePicker-6KF52Z3G.js.map +0 -7
  156. package/dist/exports/client/chunk-5LKBKI4T.js +0 -14
  157. package/dist/exports/client/chunk-5LKBKI4T.js.map +0 -7
  158. package/dist/exports/client/chunk-7T64ULOM.js +0 -29
  159. package/dist/exports/client/chunk-7T64ULOM.js.map +0 -7
  160. package/dist/exports/client/chunk-DMFYTMX6.js +0 -27
  161. package/dist/exports/client/chunk-DMFYTMX6.js.map +0 -7
  162. /package/dist/elements/{ColumnSelector/index.css → ColumnSelection/Popup.css} +0 -0
  163. /package/dist/elements/{GroupByControl/index.css → GroupBy/Popup.css} +0 -0
@@ -0,0 +1,91 @@
1
+ 'use client';
2
+
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { isFieldDisabled } from 'payload/shared';
5
+ import React, { useMemo } from 'react';
6
+ import { ChevronIcon } from '../../icons/Chevron/index.js';
7
+ import { useAuth } from '../../providers/Auth/index.js';
8
+ import { useTranslation } from '../../providers/Translation/index.js';
9
+ import { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js';
10
+ import { Button } from '../Button/index.js';
11
+ import { Popup } from '../Popup/index.js';
12
+ import { GroupByPopup } from './Popup.js';
13
+ const baseClass = 'group-by-control';
14
+ /**
15
+ * Supported field types for group by functionality.
16
+ */
17
+ const supportedFieldTypes = ['text', 'textarea', 'number', 'select', 'relationship', 'date', 'checkbox', 'radio', 'email', 'upload'];
18
+ export const GroupByButton = ({
19
+ collectionSlug,
20
+ fields,
21
+ onChange,
22
+ value
23
+ }) => {
24
+ const {
25
+ i18n,
26
+ t
27
+ } = useTranslation();
28
+ const {
29
+ permissions
30
+ } = useAuth();
31
+ const groupByFieldName = value?.replace(/^-/, '');
32
+ const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields;
33
+ const reducedFields = useMemo(() => reduceFieldsToOptions({
34
+ fieldPermissions,
35
+ fields,
36
+ i18n
37
+ }), [fields, fieldPermissions, i18n]);
38
+ const filteredFields = useMemo(() => reducedFields.filter(field => !isFieldDisabled(field.field, 'groupBy') && field.fieldPath !== 'id' && supportedFieldTypes.includes(field.field.type)), [reducedFields]);
39
+ const groupByField = reducedFields.find(field_0 => field_0.fieldPath === groupByFieldName);
40
+ const isActive = Boolean(groupByFieldName && groupByField);
41
+ if (filteredFields.length === 0) {
42
+ return null;
43
+ }
44
+ const triggerLabel = isActive ? t('general:groupByLabel', {
45
+ label: groupByField?.label || ''
46
+ }) : t('general:groupByLabel', {
47
+ label: ''
48
+ });
49
+ return /*#__PURE__*/_jsx(Popup, {
50
+ className: baseClass,
51
+ horizontalAlign: "right",
52
+ portalClassName: `${baseClass}__popup`,
53
+ render: ({
54
+ close
55
+ }) => /*#__PURE__*/_jsx(GroupByPopup, {
56
+ close: close,
57
+ filteredFields: filteredFields,
58
+ groupByField: groupByField,
59
+ groupByFieldName: groupByFieldName,
60
+ isActive: isActive,
61
+ onChange: onChange,
62
+ value: value
63
+ }),
64
+ renderButton: ({
65
+ active,
66
+ onClick,
67
+ onKeyDown,
68
+ ...ariaProps
69
+ }) => /*#__PURE__*/_jsx(Button, {
70
+ buttonStyle: "secondary",
71
+ className: `${baseClass}__trigger`,
72
+ extraButtonProps: {
73
+ onKeyDown
74
+ },
75
+ icon: /*#__PURE__*/_jsx(ChevronIcon, {
76
+ direction: active ? 'up' : 'down',
77
+ size: 16
78
+ }),
79
+ id: "toggle-group-by",
80
+ onClick: onClick,
81
+ selected: active || isActive,
82
+ size: "medium",
83
+ ...ariaProps,
84
+ children: triggerLabel
85
+ }),
86
+ size: "large",
87
+ theme: "auto",
88
+ verticalAlign: "bottom"
89
+ });
90
+ };
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["isFieldDisabled","React","useMemo","ChevronIcon","useAuth","useTranslation","reduceFieldsToOptions","Button","Popup","GroupByPopup","baseClass","supportedFieldTypes","GroupByButton","collectionSlug","fields","onChange","value","i18n","t","permissions","groupByFieldName","replace","fieldPermissions","collections","reducedFields","filteredFields","filter","field","fieldPath","includes","type","groupByField","find","isActive","Boolean","length","triggerLabel","label","_jsx","className","horizontalAlign","portalClassName","render","close","renderButton","active","onClick","onKeyDown","ariaProps","buttonStyle","extraButtonProps","icon","direction","size","id","selected","theme","verticalAlign"],"sources":["../../../src/elements/GroupBy/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, Field, SanitizedCollectionConfig } from 'payload'\n\nimport { isFieldDisabled } from 'payload/shared'\nimport React, { useMemo } from 'react'\n\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { useAuth } from '../../providers/Auth/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToOptions } from '../../utilities/reduceFieldsToOptions.js'\nimport { Button } from '../Button/index.js'\nimport { Popup } from '../Popup/index.js'\nimport { GroupByPopup } from './Popup.js'\n\nexport type GroupByButtonProps = {\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly fields: ClientField[]\n /** Called with the next `groupBy` value (prefixed with `-` for descending). */\n readonly onChange: (groupBy: string) => void\n /** The current `groupBy` value (prefixed with `-` for descending). */\n readonly value: string\n}\n\nconst baseClass = 'group-by-control'\n\n/**\n * Supported field types for group by functionality.\n */\nconst supportedFieldTypes: Field['type'][] = [\n 'text',\n 'textarea',\n 'number',\n 'select',\n 'relationship',\n 'date',\n 'checkbox',\n 'radio',\n 'email',\n 'upload',\n]\n\nexport const GroupByButton: React.FC<GroupByButtonProps> = ({\n collectionSlug,\n fields,\n onChange,\n value,\n}) => {\n const { i18n, t } = useTranslation()\n const { permissions } = useAuth()\n\n const groupByFieldName = value?.replace(/^-/, '')\n\n const fieldPermissions = permissions?.collections?.[collectionSlug]?.fields\n\n const reducedFields = useMemo(\n () =>\n reduceFieldsToOptions({\n fieldPermissions,\n fields,\n i18n,\n }),\n [fields, fieldPermissions, i18n],\n )\n\n const filteredFields = useMemo(\n () =>\n reducedFields.filter(\n (field) =>\n !isFieldDisabled(field.field, 'groupBy') &&\n field.fieldPath !== 'id' &&\n supportedFieldTypes.includes(field.field.type),\n ),\n [reducedFields],\n )\n\n const groupByField = reducedFields.find((field) => field.fieldPath === groupByFieldName)\n const isActive = Boolean(groupByFieldName && groupByField)\n\n if (filteredFields.length === 0) {\n return null\n }\n\n const triggerLabel = isActive\n ? t('general:groupByLabel', { label: groupByField?.label || '' })\n : t('general:groupByLabel', { label: '' })\n\n return (\n <Popup\n className={baseClass}\n horizontalAlign=\"right\"\n portalClassName={`${baseClass}__popup`}\n render={({ close }) => (\n <GroupByPopup\n close={close}\n filteredFields={filteredFields}\n groupByField={groupByField}\n groupByFieldName={groupByFieldName}\n isActive={isActive}\n onChange={onChange}\n value={value}\n />\n )}\n renderButton={({ active, onClick, onKeyDown, ...ariaProps }) => (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__trigger`}\n extraButtonProps={{ onKeyDown }}\n icon={<ChevronIcon direction={active ? 'up' : 'down'} size={16} />}\n id=\"toggle-group-by\"\n onClick={onClick}\n selected={active || isActive}\n size=\"medium\"\n {...ariaProps}\n >\n {triggerLabel}\n </Button>\n )}\n size=\"large\"\n theme=\"auto\"\n verticalAlign=\"bottom\"\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import type { SanitizedCollectionConfig } from 'payload';
2
+ import React from 'react';
3
+ export type ListColumnSelectionButtonProps = {
4
+ readonly collectionSlug: SanitizedCollectionConfig['slug'];
5
+ };
6
+ /**
7
+ * Connects the presentational {@link ColumnSelectionButton} to the table columns state, so the
8
+ * button itself stays unaware of where its column state is stored.
9
+ */
10
+ export declare const ListColumnSelectionButton: React.FC<ListColumnSelectionButtonProps>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/ListColumnSelectionButton/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;CAC3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAAC,8BAA8B,CAY9E,CAAA"}
@@ -0,0 +1,37 @@
1
+ 'use client';
2
+
3
+ import { c as _c } from "react/compiler-runtime";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import React from 'react';
6
+ import { useTableColumns } from '../../providers/TableColumns/index.js';
7
+ import { ColumnSelectionButton } from '../ColumnSelection/index.js';
8
+ /**
9
+ * Connects the presentational {@link ColumnSelectionButton} to the table columns state, so the
10
+ * button itself stays unaware of where its column state is stored.
11
+ */
12
+ export const ListColumnSelectionButton = t0 => {
13
+ const $ = _c(4);
14
+ const {
15
+ collectionSlug
16
+ } = t0;
17
+ const {
18
+ columns,
19
+ setColumns
20
+ } = useTableColumns();
21
+ let t1;
22
+ if ($[0] !== collectionSlug || $[1] !== columns || $[2] !== setColumns) {
23
+ t1 = _jsx(ColumnSelectionButton, {
24
+ collectionSlug,
25
+ columns,
26
+ onChange: setColumns
27
+ });
28
+ $[0] = collectionSlug;
29
+ $[1] = columns;
30
+ $[2] = setColumns;
31
+ $[3] = t1;
32
+ } else {
33
+ t1 = $[3];
34
+ }
35
+ return t1;
36
+ };
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useTableColumns","ColumnSelectionButton","ListColumnSelectionButton","t0","$","collectionSlug","columns","setColumns","t1","_jsx","onChange"],"sources":["../../../src/elements/ListColumnSelectionButton/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SanitizedCollectionConfig } from 'payload'\n\nimport React from 'react'\n\nimport { useTableColumns } from '../../providers/TableColumns/index.js'\nimport { ColumnSelectionButton } from '../ColumnSelection/index.js'\n\nexport type ListColumnSelectionButtonProps = {\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n}\n\n/**\n * Connects the presentational {@link ColumnSelectionButton} to the table columns state, so the\n * button itself stays unaware of where its column state is stored.\n */\nexport const ListColumnSelectionButton: React.FC<ListColumnSelectionButtonProps> = ({\n collectionSlug,\n}) => {\n const { columns, setColumns } = useTableColumns()\n\n return (\n <ColumnSelectionButton\n collectionSlug={collectionSlug}\n columns={columns}\n onChange={setColumns}\n />\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAIA,OAAOC,KAAA,MAAW;AAElB,SAASC,eAAe,QAAQ;AAChC,SAASC,qBAAqB,QAAQ;AAMtC;;;;AAIA,OAAO,MAAMC,yBAAA,GAAsEC,EAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAAC;IAAAO;EAAA,IAAAF,EAEnF;EACC;IAAAG,OAAA;IAAAC;EAAA,IAAgCP,eAAA;EAAA,IAAAQ,EAAA;EAAA,IAAAJ,CAAA,QAAAC,cAAA,IAAAD,CAAA,QAAAE,OAAA,IAAAF,CAAA,QAAAG,UAAA;IAG9BC,EAAA,GAAAC,IAAA,CAAAR,qBAAA;MAAAI,cAAA;MAAAC,OAAA;MAAAI,QAAA,EAGYH;IAAA,C;;;;;;;;SAHZC,E;CAMJ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/ListControls/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgD,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAanD,OAAO,aAAa,CAAA;AAIpB;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwJpD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/ListControls/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgD,MAAM,OAAO,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAanD,OAAO,aAAa,CAAA;AAIpB;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA2JpD,CAAA"}
@@ -10,11 +10,11 @@ import { Dots } from '../../icons/Dots/index.js';
10
10
  import { useListQuery } from '../../providers/ListQuery/index.js';
11
11
  import { useTranslation } from '../../providers/Translation/index.js';
12
12
  import { Button } from '../Button/index.js';
13
- import { ColumnsButton } from '../ColumnsButton/index.js';
14
- import { GroupByControl } from '../GroupByControl/index.js';
13
+ import { ListColumnSelectionButton } from '../ListColumnSelectionButton/index.js';
14
+ import { ListGroupByButton } from '../ListGroupByButton/index.js';
15
+ import { ListWhereBuilder } from '../ListWhereBuilder/index.js';
15
16
  import { QueryPresetBar } from '../QueryPresets/QueryPresetBar/index.js';
16
17
  import { ListSearchFilter } from '../Search/ListSearchFilter/index.js';
17
- import { WhereBuilder } from '../WhereBuilder/index.js';
18
18
  import './index.css';
19
19
  const baseClass = 'list-controls';
20
20
  /**
@@ -138,10 +138,10 @@ export const ListControls = props => {
138
138
  selected: isWhereOpen || hasActiveFilters,
139
139
  size: "medium",
140
140
  children: t("general:filters")
141
- }), _jsx(GroupByControl, {
141
+ }), _jsx(ListGroupByButton, {
142
142
  collectionSlug: collectionConfig.slug,
143
143
  fields: collectionConfig.fields
144
- }), enableColumns && _jsx(ColumnsButton, {
144
+ }), enableColumns && _jsx(ListColumnSelectionButton, {
145
145
  collectionSlug: collectionConfig.slug
146
146
  }), enableSort && _jsx(Button, {
147
147
  buttonStyle: "secondary",
@@ -182,11 +182,11 @@ export const ListControls = props => {
182
182
  }), !isControlled && isWhereOpen && _jsx("div", {
183
183
  className: `${baseClass}__where`,
184
184
  id: `${baseClass}-where`,
185
- children: _jsx(WhereBuilder, {
185
+ children: _jsx(ListWhereBuilder, {
186
186
  collectionPluralLabel: collectionConfig?.labels?.plural,
187
187
  collectionSlug: collectionConfig.slug,
188
188
  fields: collectionConfig?.fields,
189
- onClose: () => setVisibleDrawer(undefined),
189
+ onEmptyRemove: () => setVisibleDrawer(undefined),
190
190
  renderedFilters,
191
191
  resolvedFilterOptions
192
192
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useWindowInfo","React","Fragment","useEffect","useRef","useState","Popup","PopupList","ChevronIcon","Dots","useListQuery","useTranslation","Button","ColumnsButton","GroupByControl","QueryPresetBar","ListSearchFilter","WhereBuilder","baseClass","ListControls","props","$","beforeActions","collectionConfig","collectionSlug","disableQueryPresets","enableColumns","t0","enableFilters","t1","enableSort","t2","hasCreatePermission","isWhereOpen","isWhereOpenFromProps","listMenuItems","newDocumentURL","onWhereToggle","queryPreset","activePreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","undefined","isControlled","handleSearchChange","hasActiveFilters","query","t","breakpoints","t3","s","smallBreak","searchLabelTranslated","label","split","hasWhereParam","Boolean","where","visibleDrawer","setVisibleDrawer","t4","current","t5","t6","t7","handleWhereToggle","_jsxs","className","children","_jsx","onSearchChange","searchQueryParam","search","enableQueryPresets","buttonStyle","extraButtonProps","icon","direction","size","onClick","selected","slug","fields","el","id","to","Array","isArray","length","button","ariaLabel","horizontalAlign","verticalAlign","ButtonGroup","map","_temp","collectionPluralLabel","labels","plural","onClose","item","i"],"sources":["../../../src/elements/ListControls/index.tsx"],"sourcesContent":["'use client'\n\nimport { useWindowInfo } from '@faceless-ui/window-info'\nimport React, { Fragment, useEffect, useRef, useState } from 'react'\n\nimport type { ListControlsProps } from './types.js'\n\nimport { Popup, PopupList } from '../../elements/Popup/index.js'\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { Dots } from '../../icons/Dots/index.js'\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport { ColumnsButton } from '../ColumnsButton/index.js'\nimport { GroupByControl } from '../GroupByControl/index.js'\nimport { QueryPresetBar } from '../QueryPresets/QueryPresetBar/index.js'\nimport { ListSearchFilter } from '../Search/ListSearchFilter/index.js'\nimport { WhereBuilder } from '../WhereBuilder/index.js'\nimport './index.css'\n\nconst baseClass = 'list-controls'\n\n/**\n * The ListControls component is used to render the controls (search, filter, where)\n * for a collection's list view. You can find those directly above the table which lists\n * the collection's documents.\n */\nexport const ListControls: React.FC<ListControlsProps> = (props) => {\n const {\n beforeActions,\n collectionConfig,\n collectionSlug,\n disableQueryPresets,\n enableColumns = true,\n enableFilters = true,\n enableSort = false,\n hasCreatePermission,\n isWhereOpen: isWhereOpenFromProps,\n listMenuItems,\n newDocumentURL,\n onWhereToggle,\n queryPreset: activePreset,\n queryPresetPermissions,\n renderedFilters,\n resolvedFilterOptions,\n } = props\n\n const isControlled = typeof onWhereToggle === 'function'\n\n const { handleSearchChange, hasActiveFilters, query } = useListQuery()\n\n const { t } = useTranslation()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n // Simplified placeholder - just \"Search\" instead of \"Search by X, Y, Z\"\n const searchLabelTranslated = t('general:searchBy', { label: '' }).split(' ')[0]\n\n const hasWhereParam = useRef(Boolean(query?.where))\n\n const [visibleDrawer, setVisibleDrawer] = useState<'columns' | 'sort' | 'where'>(\n hasActiveFilters ? 'where' : undefined,\n )\n\n useEffect(() => {\n if (hasWhereParam.current && !query?.where) {\n hasWhereParam.current = false\n } else if (query?.where) {\n hasWhereParam.current = true\n }\n }, [setVisibleDrawer, query?.where])\n\n const isWhereOpen = isControlled ? Boolean(isWhereOpenFromProps) : visibleDrawer === 'where'\n const handleWhereToggle = isControlled\n ? onWhereToggle\n : () => setVisibleDrawer(visibleDrawer !== 'where' ? 'where' : undefined)\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__search-row`}>\n <div className={`${baseClass}__left`}>\n <ListSearchFilter\n key={collectionSlug}\n label={searchLabelTranslated}\n onSearchChange={handleSearchChange}\n searchQueryParam={query?.search}\n />\n {collectionConfig?.enableQueryPresets && !disableQueryPresets && (\n <QueryPresetBar\n activePreset={activePreset}\n collectionSlug={collectionSlug}\n queryPresetPermissions={queryPresetPermissions}\n />\n )}\n </div>\n <div className={`${baseClass}__spacer`} />\n <div className={`${baseClass}__actions`}>\n {!smallBreak && beforeActions}\n {enableFilters && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__toggle-where`}\n extraButtonProps={{\n 'aria-controls': `${baseClass}-where`,\n 'aria-expanded': visibleDrawer === 'where',\n }}\n icon={<ChevronIcon direction={isWhereOpen ? 'up' : 'down'} size={16} />}\n id=\"toggle-list-filters\"\n onClick={handleWhereToggle}\n selected={isWhereOpen || hasActiveFilters}\n size=\"medium\"\n >\n {t('general:filters')}\n </Button>\n )}\n <GroupByControl collectionSlug={collectionConfig.slug} fields={collectionConfig.fields} />\n {enableColumns && <ColumnsButton collectionSlug={collectionConfig.slug} />}\n {enableSort && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__toggle-sort`}\n extraButtonProps={{\n 'aria-controls': `${baseClass}-sort`,\n 'aria-expanded': visibleDrawer === 'sort',\n }}\n icon={<ChevronIcon size={16} />}\n id=\"toggle-list-sort\"\n onClick={() => setVisibleDrawer(visibleDrawer !== 'sort' ? 'sort' : undefined)}\n size=\"medium\"\n >\n {t('general:sort')}\n </Button>\n )}\n {hasCreatePermission && newDocumentURL && (\n <Button\n buttonStyle=\"primary\"\n className={`${baseClass}__create-new`}\n el=\"link\"\n id=\"create-new-doc\"\n size=\"medium\"\n to={newDocumentURL}\n >\n {t('general:createNew')}\n </Button>\n )}\n {listMenuItems && Array.isArray(listMenuItems) && listMenuItems.length > 0 && (\n <Popup\n button={<Dots ariaLabel={t('general:moreOptions')} />}\n className={`${baseClass}__popup`}\n horizontalAlign=\"right\"\n id=\"list-menu\"\n size=\"medium\"\n verticalAlign=\"bottom\"\n >\n <PopupList.ButtonGroup>\n {listMenuItems.map((item, i) => (\n <Fragment key={`list-menu-item-${i}`}>{item}</Fragment>\n ))}\n </PopupList.ButtonGroup>\n </Popup>\n )}\n </div>\n </div>\n {!isControlled && isWhereOpen && (\n <div className={`${baseClass}__where`} id={`${baseClass}-where`}>\n <WhereBuilder\n collectionPluralLabel={collectionConfig?.labels?.plural}\n collectionSlug={collectionConfig.slug}\n fields={collectionConfig?.fields}\n onClose={() => setVisibleDrawer(undefined)}\n renderedFilters={renderedFilters}\n resolvedFilterOptions={resolvedFilterOptions}\n />\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,SAASC,aAAa,QAAQ;AAC9B,OAAOC,KAAA,IAASC,QAAQ,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAI7D,SAASC,KAAK,EAAEC,SAAS,QAAQ;AACjC,SAASC,WAAW,QAAQ;AAC5B,SAASC,IAAI,QAAQ;AACrB,SAASC,YAAY,QAAQ;AAC7B,SAASC,cAAc,QAAQ;AAC/B,SAASC,MAAM,QAAQ;AACvB,SAASC,aAAa,QAAQ;AAC9B,SAASC,cAAc,QAAQ;AAC/B,SAASC,cAAc,QAAQ;AAC/B,SAASC,gBAAgB,QAAQ;AACjC,SAASC,YAAY,QAAQ;AAC7B,OAAO;AAEP,MAAMC,SAAA,GAAY;AAElB;;;;;AAKA,OAAO,MAAMC,YAAA,GAA4CC,KAAA;EAAA,MAAAC,CAAA,GAAAtB,EAAA;EACvD;IAAAuB,aAAA;IAAAC,gBAAA;IAAAC,cAAA;IAAAC,mBAAA;IAAAC,aAAA,EAAAC,EAAA;IAAAC,aAAA,EAAAC,EAAA;IAAAC,UAAA,EAAAC,EAAA;IAAAC,mBAAA;IAAAC,WAAA,EAAAC,oBAAA;IAAAC,aAAA;IAAAC,cAAA;IAAAC,aAAA;IAAAC,WAAA,EAAAC,YAAA;IAAAC,sBAAA;IAAAC,eAAA;IAAAC;EAAA,IAiBItB,KAAA;EAZF,MAAAM,aAAA,GAAAC,EAAoB,KAAAgB,SAAA,UAApBhB,EAAoB;EACpB,MAAAC,aAAA,GAAAC,EAAoB,KAAAc,SAAA,UAApBd,EAAoB;EACpB,MAAAC,UAAA,GAAAC,EAAkB,KAAAY,SAAA,WAAlBZ,EAAkB;EAYpB,MAAAa,YAAA,GAAqB,OAAOP,aAAA,KAAkB;EAE9C;IAAAQ,kBAAA;IAAAC,gBAAA;IAAAC;EAAA,IAAwDrC,YAAA;EAExD;IAAAsC;EAAA,IAAcrC,cAAA;EAEd;IAAAsC,WAAA,EAAAC;EAAA,IAEIlD,aAAA;EADW;IAAAmD,CAAA,EAAAC;EAAA,IAAAF,EAAiB;EAIhC,MAAAG,qBAAA,GAA8BL,CAAA,CAAE;IAAAM,KAAA,EAA6B;EAAA,CAAG,EAAAC,KAAA,CAAS,IAAI;EAE7E,MAAAC,aAAA,GAAsBpD,MAAA,CAAOqD,OAAA,CAAQV,KAAA,EAAAW,KAAO;EAE5C,OAAAC,aAAA,EAAAC,gBAAA,IAA0CvD,QAAA,CACxCyC,gBAAA,GAAmB,UAAAH,SAAU;EAAA,IAAAkB,EAAA;EAAA,IAAAxC,CAAA,QAAA0B,KAAA,EAAAW,KAAA;IAGrBG,EAAA,GAAAA,CAAA;MAAA,IACJL,aAAA,CAAAM,OAAA,KAA0Bf,KAAA,EAAAW,KAAO;QACnCF,aAAA,CAAAM,OAAA;MAAA;QAAA,IACSf,KAAA,EAAAW,KAAA;UACTF,aAAA,CAAAM,OAAA;QAAA;MAAA;IAAA;IAEJzC,CAAA,MAAA0B,KAAA,EAAAW,KAAA;IAAArC,CAAA,MAAAwC,EAAA;EAAA;IAAAA,EAAA,GAAAxC,CAAA;EAAA;EAAsB,MAAA0C,EAAA,GAAAhB,KAAA,EAAAW,KAAA;EAAO,IAAAM,EAAA;EAAA,IAAA3C,CAAA,QAAA0C,EAAA;IAA1BC,EAAA,IAACJ,gBAAA,EAAkBG,EAAO;IAAM1C,CAAA,MAAA0C,EAAA;IAAA1C,CAAA,MAAA2C,EAAA;EAAA;IAAAA,EAAA,GAAA3C,CAAA;EAAA;EANnClB,SAAA,CAAU0D,EAMV,EAAGG,EAAgC;EAEnC,MAAA/B,WAAA,GAAoBW,YAAA,GAAea,OAAA,CAAQvB,oBAAA,IAAwByB,aAAA,KAAkB;EAAA,IAAAM,EAAA;EAAA,IAAA5C,CAAA,QAAAuB,YAAA,IAAAvB,CAAA,QAAAgB,aAAA,IAAAhB,CAAA,QAAAsC,aAAA;IAC3DM,EAAA,GAAArB,YAAA,GACtBP,aAAA,SACMuB,gBAAA,CAAiBD,aAAA,KAAkB,UAAU,UAAAhB,SAAU;IAAAtB,CAAA,MAAAuB,YAAA;IAAAvB,CAAA,MAAAgB,aAAA;IAAAhB,CAAA,MAAAsC,aAAA;IAAAtC,CAAA,MAAA4C,EAAA;EAAA;IAAAA,EAAA,GAAA5C,CAAA;EAAA;EAFjE,MAAA6C,iBAAA,GAA0BD,EAEuC;EAAA,OAG/DE,KAAA,CAAC;IAAAC,SAAA,EAAAlD,SAAA;IAAAmD,QAAA,GACCF,KAAA,CAAC;MAAAC,SAAA,EAAe,GAAAlD,SAAA,cAA0B;MAAAmD,QAAA,GACxCF,KAAA,CAAC;QAAAC,SAAA,EAAe,GAAAlD,SAAA,QAAoB;QAAAmD,QAAA,GAClCC,IAAA,CAAAtD,gBAAA;UAAAsC,KAAA,EAESD,qBAAA;UAAAkB,cAAA,EACS1B,kBAAA;UAAA2B,gBAAA,EACEzB,KAAA,EAAA0B;QAAA,GAHbjD,cAAA,GAKND,gBAAA,EAAAmD,kBAAA,KAAyCjD,mBAAA,IACxC6C,IAAA,CAAAvD,cAAA;UAAAwB,YAAA;UAAAf,cAAA;UAAAgB;QAAA,C;UAOJ8B,IAAA,CAAC;QAAAF,SAAA,EAAe,GAAAlD,SAAA;MAAsB,C,GACtCiD,KAAA,CAAC;QAAAC,SAAA,EAAe,GAAAlD,SAAA,WAAuB;QAAAmD,QAAA,GACpC,CAACjB,UAAA,IAAc9B,aAAA,EACfM,aAAA,IACC0C,IAAA,CAAA1D,MAAA;UAAA+D,WAAA,EACc;UAAAP,SAAA,EACD,GAAAlD,SAAA,gBAA4B;UAAA0D,gBAAA;YAAA,iBAEpB,GAAA1D,SAAA,QAAoB;YAAA,iBACpByC,aAAA,KAAkB;UAAA;UAAAkB,IAAA,EAE/BP,IAAA,CAAA9D,WAAA;YAAAsE,SAAA,EAAwB7C,WAAA,GAAc,OAAO;YAAA8C,IAAA;UAAA,C;cAChD;UAAAC,OAAA,EACMd,iBAAA;UAAAe,QAAA,EACChD,WAAA,IAAea,gBAAA;UAAAiC,IAAA,EACpB;UAAAV,QAAA,EAEJrB,CAAA,CAAE;QAAA,C,GAGPsB,IAAA,CAAAxD,cAAA;UAAAU,cAAA,EAAgCD,gBAAA,CAAA2D,IAAA;UAAAC,MAAA,EAA+B5D,gBAAA,CAAA4D;QAAA,C,GAC9DzD,aAAA,IAAiB4C,IAAA,CAAAzD,aAAA;UAAAW,cAAA,EAA+BD,gBAAA,CAAA2D;QAAA,C,GAChDpD,UAAA,IACCwC,IAAA,CAAA1D,MAAA;UAAA+D,WAAA,EACc;UAAAP,SAAA,EACD,GAAAlD,SAAA,eAA2B;UAAA0D,gBAAA;YAAA,iBAEnB,GAAA1D,SAAA,OAAmB;YAAA,iBACnByC,aAAA,KAAkB;UAAA;UAAAkB,IAAA,EAE/BP,IAAA,CAAA9D,WAAA;YAAAuE,IAAA;UAAA,C;cACH;UAAAC,OAAA,EAAAA,CAAA,KACYpB,gBAAA,CAAiBD,aAAA,KAAkB,SAAS,SAAAhB,SAAS;UAAAoC,IAAA,EAC/D;UAAAV,QAAA,EAEJrB,CAAA,CAAE;QAAA,C,GAGNhB,mBAAA,IAAuBI,cAAA,IACtBkC,IAAA,CAAA1D,MAAA;UAAA+D,WAAA,EACc;UAAAP,SAAA,EACD,GAAAlD,SAAA,cAA0B;UAAAkE,EAAA,EAClC;UAAAC,EAAA,EACA;UAAAN,IAAA,EACE;UAAAO,EAAA,EACDlD,cAAA;UAAAiC,QAAA,EAEHrB,CAAA,CAAE;QAAA,C,GAGNb,aAAA,IAAiBoD,KAAA,CAAAC,OAAA,CAAcrD,aAAA,KAAkBA,aAAA,CAAAsD,MAAA,IAAuB,IACvEnB,IAAA,CAAAhE,KAAA;UAAAoF,MAAA,EACUpB,IAAA,CAAA7D,IAAA;YAAAkF,SAAA,EAAiB3C,CAAA,CAAE;UAAA,C;qBAChB,GAAA9B,SAAA,SAAqB;UAAA0E,eAAA,EAChB;UAAAP,EAAA,EACb;UAAAN,IAAA,EACE;UAAAc,aAAA,EACS;UAAAxB,QAAA,EAEdC,IAAA,CAAA/D,SAAA,CAAAuF,WAAA;YAAAzB,QAAA,EACGlC,aAAA,CAAA4D,GAAA,CAAAC,KACqC;UAAA,C;;;QAO/C,CAACpD,YAAA,IAAgBX,WAAA,IAChBqC,IAAA,CAAC;MAAAF,SAAA,EAAe,GAAAlD,SAAA,SAAqB;MAAAmE,EAAA,EAAM,GAAAnE,SAAA,QAAoB;MAAAmD,QAAA,EAC7DC,IAAA,CAAArD,YAAA;QAAAgF,qBAAA,EACyB1E,gBAAA,EAAA2E,MAAA,EAAAC,MAAA;QAAA3E,cAAA,EACPD,gBAAA,CAAA2D,IAAA;QAAAC,MAAA,EACR5D,gBAAA,EAAA4D,MAAA;QAAAiB,OAAA,EAAAA,CAAA,KACOxC,gBAAA,CAAAjB,SAAiB;QAAAF,eAAA;QAAAC;MAAA,C;;;CAQ5C;AAxJyD,SAAAsD,MAAAK,IAAA,EAAAC,CAAA;EAAA,OAmIvChC,IAAA,CAAApE,QAAA;IAAAmE,QAAA,EAAuCgC;EAAA,GAAxB,kBAAkBC,CAAA,EAAG;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useWindowInfo","React","Fragment","useEffect","useRef","useState","Popup","PopupList","ChevronIcon","Dots","useListQuery","useTranslation","Button","ListColumnSelectionButton","ListGroupByButton","ListWhereBuilder","QueryPresetBar","ListSearchFilter","baseClass","ListControls","props","$","beforeActions","collectionConfig","collectionSlug","disableQueryPresets","enableColumns","t0","enableFilters","t1","enableSort","t2","hasCreatePermission","isWhereOpen","isWhereOpenFromProps","listMenuItems","newDocumentURL","onWhereToggle","queryPreset","activePreset","queryPresetPermissions","renderedFilters","resolvedFilterOptions","undefined","isControlled","handleSearchChange","hasActiveFilters","query","t","breakpoints","t3","s","smallBreak","searchLabelTranslated","label","split","hasWhereParam","Boolean","where","visibleDrawer","setVisibleDrawer","t4","current","t5","t6","t7","handleWhereToggle","_jsxs","className","children","_jsx","onSearchChange","searchQueryParam","search","enableQueryPresets","buttonStyle","extraButtonProps","icon","direction","size","onClick","selected","slug","fields","el","id","to","Array","isArray","length","button","ariaLabel","horizontalAlign","verticalAlign","ButtonGroup","map","_temp","collectionPluralLabel","labels","plural","onEmptyRemove","item","i"],"sources":["../../../src/elements/ListControls/index.tsx"],"sourcesContent":["'use client'\n\nimport { useWindowInfo } from '@faceless-ui/window-info'\nimport React, { Fragment, useEffect, useRef, useState } from 'react'\n\nimport type { ListControlsProps } from './types.js'\n\nimport { Popup, PopupList } from '../../elements/Popup/index.js'\nimport { ChevronIcon } from '../../icons/Chevron/index.js'\nimport { Dots } from '../../icons/Dots/index.js'\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport { ListColumnSelectionButton } from '../ListColumnSelectionButton/index.js'\nimport { ListGroupByButton } from '../ListGroupByButton/index.js'\nimport { ListWhereBuilder } from '../ListWhereBuilder/index.js'\nimport { QueryPresetBar } from '../QueryPresets/QueryPresetBar/index.js'\nimport { ListSearchFilter } from '../Search/ListSearchFilter/index.js'\nimport './index.css'\n\nconst baseClass = 'list-controls'\n\n/**\n * The ListControls component is used to render the controls (search, filter, where)\n * for a collection's list view. You can find those directly above the table which lists\n * the collection's documents.\n */\nexport const ListControls: React.FC<ListControlsProps> = (props) => {\n const {\n beforeActions,\n collectionConfig,\n collectionSlug,\n disableQueryPresets,\n enableColumns = true,\n enableFilters = true,\n enableSort = false,\n hasCreatePermission,\n isWhereOpen: isWhereOpenFromProps,\n listMenuItems,\n newDocumentURL,\n onWhereToggle,\n queryPreset: activePreset,\n queryPresetPermissions,\n renderedFilters,\n resolvedFilterOptions,\n } = props\n\n const isControlled = typeof onWhereToggle === 'function'\n\n const { handleSearchChange, hasActiveFilters, query } = useListQuery()\n\n const { t } = useTranslation()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n // Simplified placeholder - just \"Search\" instead of \"Search by X, Y, Z\"\n const searchLabelTranslated = t('general:searchBy', { label: '' }).split(' ')[0]\n\n const hasWhereParam = useRef(Boolean(query?.where))\n\n const [visibleDrawer, setVisibleDrawer] = useState<'columns' | 'sort' | 'where'>(\n hasActiveFilters ? 'where' : undefined,\n )\n\n useEffect(() => {\n if (hasWhereParam.current && !query?.where) {\n hasWhereParam.current = false\n } else if (query?.where) {\n hasWhereParam.current = true\n }\n }, [setVisibleDrawer, query?.where])\n\n const isWhereOpen = isControlled ? Boolean(isWhereOpenFromProps) : visibleDrawer === 'where'\n const handleWhereToggle = isControlled\n ? onWhereToggle\n : () => setVisibleDrawer(visibleDrawer !== 'where' ? 'where' : undefined)\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__search-row`}>\n <div className={`${baseClass}__left`}>\n <ListSearchFilter\n key={collectionSlug}\n label={searchLabelTranslated}\n onSearchChange={handleSearchChange}\n searchQueryParam={query?.search}\n />\n {collectionConfig?.enableQueryPresets && !disableQueryPresets && (\n <QueryPresetBar\n activePreset={activePreset}\n collectionSlug={collectionSlug}\n queryPresetPermissions={queryPresetPermissions}\n />\n )}\n </div>\n <div className={`${baseClass}__spacer`} />\n <div className={`${baseClass}__actions`}>\n {!smallBreak && beforeActions}\n {enableFilters && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__toggle-where`}\n extraButtonProps={{\n 'aria-controls': `${baseClass}-where`,\n 'aria-expanded': visibleDrawer === 'where',\n }}\n icon={<ChevronIcon direction={isWhereOpen ? 'up' : 'down'} size={16} />}\n id=\"toggle-list-filters\"\n onClick={handleWhereToggle}\n selected={isWhereOpen || hasActiveFilters}\n size=\"medium\"\n >\n {t('general:filters')}\n </Button>\n )}\n <ListGroupByButton\n collectionSlug={collectionConfig.slug}\n fields={collectionConfig.fields}\n />\n {enableColumns && <ListColumnSelectionButton collectionSlug={collectionConfig.slug} />}\n {enableSort && (\n <Button\n buttonStyle=\"secondary\"\n className={`${baseClass}__toggle-sort`}\n extraButtonProps={{\n 'aria-controls': `${baseClass}-sort`,\n 'aria-expanded': visibleDrawer === 'sort',\n }}\n icon={<ChevronIcon size={16} />}\n id=\"toggle-list-sort\"\n onClick={() => setVisibleDrawer(visibleDrawer !== 'sort' ? 'sort' : undefined)}\n size=\"medium\"\n >\n {t('general:sort')}\n </Button>\n )}\n {hasCreatePermission && newDocumentURL && (\n <Button\n buttonStyle=\"primary\"\n className={`${baseClass}__create-new`}\n el=\"link\"\n id=\"create-new-doc\"\n size=\"medium\"\n to={newDocumentURL}\n >\n {t('general:createNew')}\n </Button>\n )}\n {listMenuItems && Array.isArray(listMenuItems) && listMenuItems.length > 0 && (\n <Popup\n button={<Dots ariaLabel={t('general:moreOptions')} />}\n className={`${baseClass}__popup`}\n horizontalAlign=\"right\"\n id=\"list-menu\"\n size=\"medium\"\n verticalAlign=\"bottom\"\n >\n <PopupList.ButtonGroup>\n {listMenuItems.map((item, i) => (\n <Fragment key={`list-menu-item-${i}`}>{item}</Fragment>\n ))}\n </PopupList.ButtonGroup>\n </Popup>\n )}\n </div>\n </div>\n {!isControlled && isWhereOpen && (\n <div className={`${baseClass}__where`} id={`${baseClass}-where`}>\n <ListWhereBuilder\n collectionPluralLabel={collectionConfig?.labels?.plural}\n collectionSlug={collectionConfig.slug}\n fields={collectionConfig?.fields}\n onEmptyRemove={() => setVisibleDrawer(undefined)}\n renderedFilters={renderedFilters}\n resolvedFilterOptions={resolvedFilterOptions}\n />\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import type { ClientField, SanitizedCollectionConfig } from 'payload';
2
+ import React from 'react';
3
+ export type ListGroupByButtonProps = {
4
+ readonly collectionSlug: SanitizedCollectionConfig['slug'];
5
+ readonly fields: ClientField[];
6
+ };
7
+ /**
8
+ * Connects the presentational {@link GroupByButton} to the list query state, so the
9
+ * control itself stays unaware of where its value is stored.
10
+ */
11
+ export declare const ListGroupByButton: React.FC<ListGroupByButtonProps>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/ListGroupByButton/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,KAAsB,MAAM,OAAO,CAAA;AAK1C,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC1D,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAC/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAkB9D,CAAA"}
@@ -0,0 +1,55 @@
1
+ 'use client';
2
+
3
+ import { c as _c } from "react/compiler-runtime";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import React, { useCallback } from 'react';
6
+ import { useListQuery } from '../../providers/ListQuery/index.js';
7
+ import { GroupByButton } from '../GroupBy/index.js';
8
+ /**
9
+ * Connects the presentational {@link GroupByButton} to the list query state, so the
10
+ * control itself stays unaware of where its value is stored.
11
+ */
12
+ export const ListGroupByButton = t0 => {
13
+ const $ = _c(7);
14
+ const {
15
+ collectionSlug,
16
+ fields
17
+ } = t0;
18
+ const {
19
+ query,
20
+ refineListData
21
+ } = useListQuery();
22
+ let t1;
23
+ if ($[0] !== refineListData) {
24
+ t1 = groupBy => {
25
+ refineListData({
26
+ groupBy,
27
+ page: 1
28
+ });
29
+ };
30
+ $[0] = refineListData;
31
+ $[1] = t1;
32
+ } else {
33
+ t1 = $[1];
34
+ }
35
+ const handleChange = t1;
36
+ const t2 = query?.groupBy ?? "";
37
+ let t3;
38
+ if ($[2] !== collectionSlug || $[3] !== fields || $[4] !== handleChange || $[5] !== t2) {
39
+ t3 = _jsx(GroupByButton, {
40
+ collectionSlug,
41
+ fields,
42
+ onChange: handleChange,
43
+ value: t2
44
+ });
45
+ $[2] = collectionSlug;
46
+ $[3] = fields;
47
+ $[4] = handleChange;
48
+ $[5] = t2;
49
+ $[6] = t3;
50
+ } else {
51
+ t3 = $[6];
52
+ }
53
+ return t3;
54
+ };
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useCallback","useListQuery","GroupByButton","ListGroupByButton","t0","$","collectionSlug","fields","query","refineListData","t1","groupBy","page","handleChange","t2","t3","_jsx","onChange","value"],"sources":["../../../src/elements/ListGroupByButton/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, SanitizedCollectionConfig } from 'payload'\n\nimport React, { useCallback } from 'react'\n\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { GroupByButton } from '../GroupBy/index.js'\n\nexport type ListGroupByButtonProps = {\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly fields: ClientField[]\n}\n\n/**\n * Connects the presentational {@link GroupByButton} to the list query state, so the\n * control itself stays unaware of where its value is stored.\n */\nexport const ListGroupByButton: React.FC<ListGroupByButtonProps> = ({ collectionSlug, fields }) => {\n const { query, refineListData } = useListQuery()\n\n const handleChange = useCallback(\n (groupBy: string) => {\n void refineListData({ groupBy, page: 1 })\n },\n [refineListData],\n )\n\n return (\n <GroupByButton\n collectionSlug={collectionSlug}\n fields={fields}\n onChange={handleChange}\n value={query?.groupBy ?? ''}\n />\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAGA,OAAOC,KAAA,IAASC,WAAW,QAAQ;AAEnC,SAASC,YAAY,QAAQ;AAC7B,SAASC,aAAa,QAAQ;AAO9B;;;;AAIA,OAAO,MAAMC,iBAAA,GAAsDC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAC;IAAAQ,cAAA;IAAAC;EAAA,IAAAH,EAA0B;EAC5F;IAAAI,KAAA;IAAAC;EAAA,IAAkCR,YAAA;EAAA,IAAAS,EAAA;EAAA,IAAAL,CAAA,QAAAI,cAAA;IAGhCC,EAAA,GAAAC,OAAA;MACOF,cAAA;QAAAE,OAAA;QAAAC,IAAA;MAAA,CAAkC;IAAA;IACzCP,CAAA,MAAAI,cAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAA,EAAA,GAAAL,CAAA;EAAA;EAHF,MAAAQ,YAAA,GAAqBH,EAIH;EAQP,MAAAI,EAAA,GAAAN,KAAA,EAAAG,OAAA,IAAkB;EAAA,IAAAI,EAAA;EAAA,IAAAV,CAAA,QAAAC,cAAA,IAAAD,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAQ,YAAA,IAAAR,CAAA,QAAAS,EAAA;IAJ3BC,EAAA,GAAAC,IAAA,CAAAd,aAAA;MAAAI,cAAA;MAAAC,MAAA;MAAAU,QAAA,EAGYJ,YAAA;MAAAK,KAAA,EACHJ;IAAkB,C;;;;;;;;;SAJ3BC,E;CAOJ","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ import type { ClientField, ResolvedFilterOptions, SanitizedCollectionConfig } from 'payload';
2
+ import React from 'react';
3
+ export type ListWhereBuilderProps = {
4
+ readonly collectionPluralLabel?: SanitizedCollectionConfig['labels']['plural'];
5
+ readonly collectionSlug: SanitizedCollectionConfig['slug'];
6
+ readonly fields: ClientField[];
7
+ readonly onEmptyRemove?: () => void;
8
+ readonly renderedFilters?: Map<string, React.ReactNode>;
9
+ readonly resolvedFilterOptions?: Map<string, ResolvedFilterOptions>;
10
+ };
11
+ /**
12
+ * Wires {@link WhereBuilder} to the list view's query state, reading the current `where`
13
+ * from {@link useListQuery} and persisting edits back to the URL.
14
+ */
15
+ export declare const ListWhereBuilder: React.FC<ListWhereBuilderProps>;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/ListWhereBuilder/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAE5F,OAAO,KAAsB,MAAM,OAAO,CAAA;AAK1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC9E,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAC1D,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,CAAA;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IACvD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAA;CACpE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA2B5D,CAAA"}
@@ -0,0 +1,62 @@
1
+ 'use client';
2
+
3
+ import { c as _c } from "react/compiler-runtime";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import React, { useCallback } from 'react';
6
+ import { useListQuery } from '../../providers/ListQuery/index.js';
7
+ import { WhereBuilder } from '../WhereBuilder/index.js';
8
+ /**
9
+ * Wires {@link WhereBuilder} to the list view's query state, reading the current `where`
10
+ * from {@link useListQuery} and persisting edits back to the URL.
11
+ */
12
+ export const ListWhereBuilder = t0 => {
13
+ const $ = _c(11);
14
+ const {
15
+ collectionPluralLabel,
16
+ collectionSlug,
17
+ fields,
18
+ onEmptyRemove,
19
+ renderedFilters,
20
+ resolvedFilterOptions
21
+ } = t0;
22
+ const {
23
+ handleWhereChange,
24
+ query
25
+ } = useListQuery();
26
+ let t1;
27
+ if ($[0] !== handleWhereChange) {
28
+ t1 = where => handleWhereChange(where);
29
+ $[0] = handleWhereChange;
30
+ $[1] = t1;
31
+ } else {
32
+ t1 = $[1];
33
+ }
34
+ const handleChange = t1;
35
+ const t2 = query?.where;
36
+ let t3;
37
+ if ($[2] !== collectionPluralLabel || $[3] !== collectionSlug || $[4] !== fields || $[5] !== handleChange || $[6] !== onEmptyRemove || $[7] !== renderedFilters || $[8] !== resolvedFilterOptions || $[9] !== t2) {
38
+ t3 = _jsx(WhereBuilder, {
39
+ collectionPluralLabel,
40
+ collectionSlug,
41
+ fields,
42
+ onChange: handleChange,
43
+ onEmptyRemove,
44
+ renderedFilters,
45
+ resolvedFilterOptions,
46
+ value: t2
47
+ });
48
+ $[2] = collectionPluralLabel;
49
+ $[3] = collectionSlug;
50
+ $[4] = fields;
51
+ $[5] = handleChange;
52
+ $[6] = onEmptyRemove;
53
+ $[7] = renderedFilters;
54
+ $[8] = resolvedFilterOptions;
55
+ $[9] = t2;
56
+ $[10] = t3;
57
+ } else {
58
+ t3 = $[10];
59
+ }
60
+ return t3;
61
+ };
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["c","_c","React","useCallback","useListQuery","WhereBuilder","ListWhereBuilder","t0","$","collectionPluralLabel","collectionSlug","fields","onEmptyRemove","renderedFilters","resolvedFilterOptions","handleWhereChange","query","t1","where","handleChange","t2","t3","_jsx","onChange","value"],"sources":["../../../src/elements/ListWhereBuilder/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, ResolvedFilterOptions, SanitizedCollectionConfig } from 'payload'\n\nimport React, { useCallback } from 'react'\n\nimport { useListQuery } from '../../providers/ListQuery/index.js'\nimport { WhereBuilder } from '../WhereBuilder/index.js'\n\nexport type ListWhereBuilderProps = {\n readonly collectionPluralLabel?: SanitizedCollectionConfig['labels']['plural']\n readonly collectionSlug: SanitizedCollectionConfig['slug']\n readonly fields: ClientField[]\n readonly onEmptyRemove?: () => void\n readonly renderedFilters?: Map<string, React.ReactNode>\n readonly resolvedFilterOptions?: Map<string, ResolvedFilterOptions>\n}\n\n/**\n * Wires {@link WhereBuilder} to the list view's query state, reading the current `where`\n * from {@link useListQuery} and persisting edits back to the URL.\n */\nexport const ListWhereBuilder: React.FC<ListWhereBuilderProps> = ({\n collectionPluralLabel,\n collectionSlug,\n fields,\n onEmptyRemove,\n renderedFilters,\n resolvedFilterOptions,\n}) => {\n const { handleWhereChange, query } = useListQuery()\n\n const handleChange = useCallback(\n (where: Parameters<typeof handleWhereChange>[0]) => handleWhereChange(where),\n [handleWhereChange],\n )\n\n return (\n <WhereBuilder\n collectionPluralLabel={collectionPluralLabel}\n collectionSlug={collectionSlug}\n fields={fields}\n onChange={handleChange}\n onEmptyRemove={onEmptyRemove}\n renderedFilters={renderedFilters}\n resolvedFilterOptions={resolvedFilterOptions}\n value={query?.where}\n />\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAGA,OAAOC,KAAA,IAASC,WAAW,QAAQ;AAEnC,SAASC,YAAY,QAAQ;AAC7B,SAASC,YAAY,QAAQ;AAW7B;;;;AAIA,OAAO,MAAMC,gBAAA,GAAoDC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAC;IAAAQ,qBAAA;IAAAC,cAAA;IAAAC,MAAA;IAAAC,aAAA;IAAAC,eAAA;IAAAC;EAAA,IAAAP,EAOjE;EACC;IAAAQ,iBAAA;IAAAC;EAAA,IAAqCZ,YAAA;EAAA,IAAAa,EAAA;EAAA,IAAAT,CAAA,QAAAO,iBAAA;IAGnCE,EAAA,GAAAC,KAAA,IAAoDH,iBAAA,CAAkBG,KAAA;IAAAV,CAAA,MAAAO,iBAAA;IAAAP,CAAA,MAAAS,EAAA;EAAA;IAAAA,EAAA,GAAAT,CAAA;EAAA;EADxE,MAAAW,YAAA,GAAqBF,EAEA;EAYV,MAAAG,EAAA,GAAAJ,KAAA,EAAAE,KAAA;EAAO,IAAAG,EAAA;EAAA,IAAAb,CAAA,QAAAC,qBAAA,IAAAD,CAAA,QAAAE,cAAA,IAAAF,CAAA,QAAAG,MAAA,IAAAH,CAAA,QAAAW,YAAA,IAAAX,CAAA,QAAAI,aAAA,IAAAJ,CAAA,QAAAK,eAAA,IAAAL,CAAA,QAAAM,qBAAA,IAAAN,CAAA,QAAAY,EAAA;IARhBC,EAAA,GAAAC,IAAA,CAAAjB,YAAA;MAAAI,qBAAA;MAAAC,cAAA;MAAAC,MAAA;MAAAY,QAAA,EAIYJ,YAAA;MAAAP,aAAA;MAAAC,eAAA;MAAAC,qBAAA;MAAAU,KAAA,EAIHJ;IAAO,C;;;;;;;;;;;;;SARhBC,E;CAWJ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAEvD,OAAO,KAAuE,MAAM,OAAO,CAAA;AAK3F,OAAO,aAAa,CAAA;AA6BpB,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC/B,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACzD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,OAAO,CAAA;QACf,eAAe,EAAE,OAAO,CAAA;QACxB,eAAe,EAAE,IAAI,CAAA;QACrB,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAA;QAChC,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAA;KACtC,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACjC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACjC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAgetC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Popup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,KAAK,SAAS,MAAM,4BAA4B,CAAA;AAEvD,OAAO,KAAuE,MAAM,OAAO,CAAA;AAK3F,OAAO,aAAa,CAAA;AA4CpB,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC/B,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACzD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,OAAO,CAAA;QACf,eAAe,EAAE,OAAO,CAAA;QACxB,eAAe,EAAE,IAAI,CAAA;QACrB,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAA;QAChC,SAAS,EAAE,KAAK,CAAC,oBAAoB,CAAA;KACtC,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACjC;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACjC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAoftC,CAAA"}
@@ -14,6 +14,20 @@ const PopupContext = /*#__PURE__*/createContext(null);
14
14
  * Selector for all elements the browser considers tabbable.
15
15
  */
16
16
  const TABBABLE_SELECTOR = ['a[href]', 'button:not(:disabled)', 'input:not(:disabled):not([type="hidden"])', 'select:not(:disabled)', 'textarea:not(:disabled)', '[tabindex]', '[contenteditable]:not([contenteditable="false"])', 'audio[controls]', 'video[controls]', 'summary'].map(s => `${s}:not([tabindex="-1"])`).join(', ');
17
+ /**
18
+ * Returns whether the element has a `position: fixed` ancestor (e.g. an open Drawer).
19
+ * Such popups must be positioned with `fixed` so they don't drift when the background scrolls.
20
+ */
21
+ const hasFixedAncestor = element => {
22
+ let node = element?.parentElement;
23
+ while (node && node !== document.body) {
24
+ if (window.getComputedStyle(node).position === 'fixed') {
25
+ return true;
26
+ }
27
+ node = node.parentElement;
28
+ }
29
+ return false;
30
+ };
17
31
  /**
18
32
  * Component that renders a popup, as well as a button that triggers the popup.
19
33
  *
@@ -50,6 +64,11 @@ export const Popup = props => {
50
64
  const popupRef = useRef(null);
51
65
  const triggerRef = useRef(null);
52
66
  /**
67
+ * Whether the trigger is inside a `position: fixed` ancestor (e.g. a Drawer),
68
+ * in which case the popup is positioned with `fixed` instead of `absolute`.
69
+ */
70
+ const isFixedRef = useRef(false);
71
+ /**
53
72
  * Keeps track of whether the popup was opened via keyboard.
54
73
  * This is used to determine whether to autofocus the first element in the popup.
55
74
  * If the popup was opened via mouse, we do not want to autofocus the first element.
@@ -87,6 +106,11 @@ export const Popup = props => {
87
106
  }
88
107
  const triggerRect = trigger.getBoundingClientRect();
89
108
  const popupRect = popup.getBoundingClientRect();
109
+ // Inside a fixed ancestor, use `fixed` (no scroll offset) so background scrolling
110
+ // doesn't shift the popup. Otherwise use page coordinates (absolute).
111
+ const useFixed = isFixedRef.current;
112
+ const scrollY = useFixed ? 0 : window.scrollY;
113
+ const scrollX = useFixed ? 0 : window.scrollX;
90
114
  // Gap between the popup and the trigger/viewport edges (in pixels)
91
115
  const offset = 10;
92
116
  // Additional gap used in side mode so the child popup has breathing room from its parent
@@ -102,9 +126,9 @@ export const Popup = props => {
102
126
  // viewport space.
103
127
  // /////////////////////////////////////
104
128
  // Top: align with trigger top, clamped to viewport
105
- top = triggerRect.top + window.scrollY;
106
- const maxTop = window.scrollY + window.innerHeight - popupRect.height - offset;
107
- top = Math.max(window.scrollY + offset, Math.min(top, maxTop));
129
+ top = triggerRect.top + scrollY;
130
+ const maxTop = scrollY + window.innerHeight - popupRect.height - offset;
131
+ top = Math.max(scrollY + offset, Math.min(top, maxTop));
108
132
  // Use the parent popup's bounding rect as the reference for left/right positioning
109
133
  // so the child appears 4px from the parent popup edge, not just the trigger button.
110
134
  const anchorRect = parentPopup?.popupRef.current ? parentPopup.popupRef.current.getBoundingClientRect() : triggerRect;
@@ -121,7 +145,7 @@ export const Popup = props => {
121
145
  left = anchorRect.left - popupRect.width - sideOffset;
122
146
  }
123
147
  }
124
- left = left + window.scrollX;
148
+ left = left + scrollX;
125
149
  // Caret not used in side mode; set a neutral value
126
150
  caretLeft = popupRect.width / 2;
127
151
  setIsOnTop(false);
@@ -134,20 +158,20 @@ export const Popup = props => {
134
158
  // /////////////////////////////////////
135
159
  let onTop = verticalAlign === 'top';
136
160
  if (verticalAlign === 'bottom') {
137
- top = triggerRect.bottom + window.scrollY + offset;
161
+ top = triggerRect.bottom + scrollY + offset;
138
162
  if (triggerRect.bottom + popupRect.height + offset > window.innerHeight) {
139
163
  // Try to flip above — only do so if there's actually enough room
140
- const topIfAbove = triggerRect.top + window.scrollY - popupRect.height - offset;
141
- if (topIfAbove >= window.scrollY) {
164
+ const topIfAbove = triggerRect.top + scrollY - popupRect.height - offset;
165
+ if (topIfAbove >= scrollY) {
142
166
  top = topIfAbove;
143
167
  onTop = true;
144
168
  }
145
169
  // else: not enough room above either — keep below and let it overflow rather than going off-screen
146
170
  }
147
171
  } else {
148
- top = triggerRect.top + window.scrollY - popupRect.height - offset;
172
+ top = triggerRect.top + scrollY - popupRect.height - offset;
149
173
  if (triggerRect.top - popupRect.height - offset < 0) {
150
- top = triggerRect.bottom + window.scrollY + offset;
174
+ top = triggerRect.bottom + scrollY + offset;
151
175
  onTop = false;
152
176
  }
153
177
  }
@@ -179,8 +203,12 @@ export const Popup = props => {
179
203
  // Values are rounded to match browser's CSS precision and avoid false updates.
180
204
  // /////////////////////////////////////
181
205
  const newTop = `${Math.round(top)}px`;
182
- const newLeft = `${Math.round(left + window.scrollX)}px`;
206
+ const newLeft = `${Math.round(left + scrollX)}px`;
183
207
  const newCaretLeft = `${Math.round(caretLeft)}px`;
208
+ const newPosition = useFixed ? 'fixed' : '';
209
+ if (popup.style.position !== newPosition) {
210
+ popup.style.position = newPosition;
211
+ }
184
212
  if (popup.style.top !== newTop) {
185
213
  popup.style.top = newTop;
186
214
  }
@@ -281,6 +309,7 @@ export const Popup = props => {
281
309
  // `.popup__hidden-content` takes effect. Without this, the inline
282
310
  // styles set during positioning would win over the CSS rule, keeping
283
311
  // portaled children (e.g. a ReactSelect menu) visually on-screen.
312
+ popup_1.style.position = '';
284
313
  popup_1.style.top = '';
285
314
  popup_1.style.left = '';
286
315
  }
@@ -301,9 +330,11 @@ export const Popup = props => {
301
330
  // after the browser has finished laying out the newly-visible popup
302
331
  // content. The rAF call is the authoritative one — it catches cases
303
332
  // where the popup height wasn't stable yet during the first call
304
- // (e.g. ColumnSelector content rendering after hidden → visible
333
+ // (e.g. ColumnSelection popup content rendering after hidden → visible
305
334
  // class switch), which was causing incorrect flip-to-top decisions.
306
335
  // /////////////////////////////////////
336
+ // Decide the positioning strategy once per open.
337
+ isFixedRef.current = hasFixedAncestor(triggerRef.current);
307
338
  updatePosition();
308
339
  const rafId = requestAnimationFrame(() => {
309
340
  updatePosition();