@webiny/app-headless-cms 6.0.0-rc.2 → 6.0.0-rc.3

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 (169) hide show
  1. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.d.ts +2 -0
  2. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js +18 -0
  3. package/admin/components/ContentEntries/Header/ButtonRefresh/ButtonRefresh.js.map +1 -0
  4. package/admin/components/ContentEntries/Header/ButtonRefresh/index.d.ts +1 -0
  5. package/admin/components/ContentEntries/Header/ButtonRefresh/index.js +3 -0
  6. package/admin/components/ContentEntries/Header/ButtonRefresh/index.js.map +1 -0
  7. package/admin/components/ContentEntries/Header/Header.js +2 -1
  8. package/admin/components/ContentEntries/Header/Header.js.map +1 -1
  9. package/admin/components/ContentEntries/SidebarContent/SidebarContent.js +1 -1
  10. package/admin/components/ContentEntries/SidebarContent/SidebarContent.js.map +1 -1
  11. package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js +1 -1
  12. package/admin/components/ContentEntries/SidebarHeader/SidebarHeader.js.map +1 -1
  13. package/admin/components/ContentModelEditor/ContentModelEditor.js +1 -6
  14. package/admin/components/ContentModelEditor/ContentModelEditor.js.map +1 -1
  15. package/admin/components/ContentModelEditor/ContentModelEditorProvider.d.ts +2 -0
  16. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js +14 -2
  17. package/admin/components/ContentModelEditor/ContentModelEditorProvider.js.map +1 -1
  18. package/admin/components/ContentModelEditor/FieldsSidebar.js +51 -2
  19. package/admin/components/ContentModelEditor/FieldsSidebar.js.map +1 -1
  20. package/admin/components/Droppable.d.ts +1 -1
  21. package/admin/components/Droppable.js.map +1 -1
  22. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js +3 -3
  23. package/admin/components/FieldEditor/EditFieldDialog/AppearanceTab.js.map +1 -1
  24. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.d.ts +10 -0
  25. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js +69 -0
  26. package/admin/components/FieldEditor/EditFieldDialog/FieldSettingsTabs.js.map +1 -0
  27. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js +27 -9
  28. package/admin/components/FieldEditor/EditFieldDialog/GeneralTab.js.map +1 -1
  29. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.d.ts +2 -0
  30. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js +14 -0
  31. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/CannotUsePermissions.js.map +1 -0
  32. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.d.ts +15 -0
  33. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js +131 -0
  34. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/FieldPermissionsSelection.js.map +1 -0
  35. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.d.ts +4 -0
  36. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js +74 -0
  37. package/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js.map +1 -0
  38. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.d.ts +13 -0
  39. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js +203 -0
  40. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js.map +1 -0
  41. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.d.ts +1 -0
  42. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js +3 -0
  43. package/admin/components/FieldEditor/EditFieldDialog/RulesTab/index.js.map +1 -0
  44. package/admin/components/FieldEditor/EditFieldDialog.js +13 -56
  45. package/admin/components/FieldEditor/EditFieldDialog.js.map +1 -1
  46. package/admin/components/FieldEditor/EditFieldDialogContainer.d.ts +12 -0
  47. package/admin/components/FieldEditor/EditFieldDialogContainer.js +40 -0
  48. package/admin/components/FieldEditor/EditFieldDialogContainer.js.map +1 -0
  49. package/admin/components/FieldEditor/EditFieldDrawerContainer.d.ts +12 -0
  50. package/admin/components/FieldEditor/EditFieldDrawerContainer.js +40 -0
  51. package/admin/components/FieldEditor/EditFieldDrawerContainer.js.map +1 -0
  52. package/admin/components/FieldEditor/FieldEditor.js +148 -88
  53. package/admin/components/FieldEditor/FieldEditor.js.map +1 -1
  54. package/admin/components/FieldEditor/FieldEditorContext.d.ts +33 -3
  55. package/admin/components/FieldEditor/FieldEditorContext.js +225 -6
  56. package/admin/components/FieldEditor/FieldEditorContext.js.map +1 -1
  57. package/admin/components/FieldEditor/LayoutCell.d.ts +9 -0
  58. package/admin/components/FieldEditor/LayoutCell.js +33 -0
  59. package/admin/components/FieldEditor/LayoutCell.js.map +1 -0
  60. package/admin/components/FieldEditor/utils/deleteField.js +12 -4
  61. package/admin/components/FieldEditor/utils/deleteField.js.map +1 -1
  62. package/admin/components/FieldEditor/utils/getFieldPosition.js +6 -1
  63. package/admin/components/FieldEditor/utils/getFieldPosition.js.map +1 -1
  64. package/admin/graphql/contentModels.d.ts +2 -2
  65. package/admin/graphql/contentModels.js +7 -0
  66. package/admin/graphql/contentModels.js.map +1 -1
  67. package/admin/hooks/useModelFieldGraphqlContext.d.ts +1 -0
  68. package/admin/plugins/fieldRenderers/DynamicSection.d.ts +2 -1
  69. package/admin/plugins/fieldRenderers/DynamicSection.js +3 -1
  70. package/admin/plugins/fieldRenderers/DynamicSection.js.map +1 -1
  71. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js +7 -1
  72. package/admin/plugins/fieldRenderers/boolean/booleanSwitch.js.map +1 -1
  73. package/admin/plugins/fieldRenderers/checkboxes.js +7 -1
  74. package/admin/plugins/fieldRenderers/checkboxes.js.map +1 -1
  75. package/admin/plugins/fieldRenderers/dateTime/Input.js +9 -2
  76. package/admin/plugins/fieldRenderers/dateTime/Input.js.map +1 -1
  77. package/admin/plugins/fieldRenderers/dateTime/Select.js +7 -0
  78. package/admin/plugins/fieldRenderers/dateTime/Select.js.map +1 -1
  79. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.d.ts +1 -0
  80. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js +9 -5
  81. package/admin/plugins/fieldRenderers/dynamicZone/MultiValueDynamicZone.js.map +1 -1
  82. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.d.ts +2 -1
  83. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js +18 -10
  84. package/admin/plugins/fieldRenderers/dynamicZone/SingleValueDynamicZone.js.map +1 -1
  85. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js +13 -4
  86. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInput.js.map +1 -1
  87. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js +10 -4
  88. package/admin/plugins/fieldRenderers/lexicalText/lexicalTextInputs.js.map +1 -1
  89. package/admin/plugins/fieldRenderers/longText/longText.js +7 -1
  90. package/admin/plugins/fieldRenderers/longText/longText.js.map +1 -1
  91. package/admin/plugins/fieldRenderers/longText/longTexts.js +12 -3
  92. package/admin/plugins/fieldRenderers/longText/longTexts.js.map +1 -1
  93. package/admin/plugins/fieldRenderers/number/numberInput.js +7 -1
  94. package/admin/plugins/fieldRenderers/number/numberInput.js.map +1 -1
  95. package/admin/plugins/fieldRenderers/number/numberInputs.js +11 -3
  96. package/admin/plugins/fieldRenderers/number/numberInputs.js.map +1 -1
  97. package/admin/plugins/fieldRenderers/object/FieldSettings.d.ts +2 -1
  98. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js +5 -0
  99. package/admin/plugins/fieldRenderers/object/MultiValueContainer.js.map +1 -1
  100. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.d.ts +1 -0
  101. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js +3 -2
  102. package/admin/plugins/fieldRenderers/object/MultiValueItemContainer.js.map +1 -1
  103. package/admin/plugins/fieldRenderers/radioButtons.js +7 -1
  104. package/admin/plugins/fieldRenderers/radioButtons.js.map +1 -1
  105. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js +15 -7
  106. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedMultipleReferenceField.js.map +1 -1
  107. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js +14 -7
  108. package/admin/plugins/fieldRenderers/ref/advanced/components/AdvancedSingleReferenceField.js.map +1 -1
  109. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.d.ts +3 -1
  110. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js +7 -6
  111. package/admin/plugins/fieldRenderers/ref/advanced/components/Entry.js.map +1 -1
  112. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.d.ts +1 -1
  113. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js +9 -3
  114. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesAutocomplete.js.map +1 -1
  115. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.d.ts +1 -1
  116. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js +9 -3
  117. package/admin/plugins/fieldRenderers/ref/components/ContentEntriesMultiAutoComplete.js.map +1 -1
  118. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js +7 -1
  119. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleMultipleRenderer.js.map +1 -1
  120. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js +7 -1
  121. package/admin/plugins/fieldRenderers/ref/simple/components/SimpleSingleRenderer.js.map +1 -1
  122. package/admin/plugins/fieldRenderers/select.js +7 -1
  123. package/admin/plugins/fieldRenderers/select.js.map +1 -1
  124. package/admin/plugins/fieldRenderers/text/tags.js +7 -1
  125. package/admin/plugins/fieldRenderers/text/tags.js.map +1 -1
  126. package/admin/plugins/fieldRenderers/text/textInput.js +7 -1
  127. package/admin/plugins/fieldRenderers/text/textInput.js.map +1 -1
  128. package/admin/plugins/fieldRenderers/text/textInputs.js +12 -3
  129. package/admin/plugins/fieldRenderers/text/textInputs.js.map +1 -1
  130. package/admin/plugins/fields/ui/TabsLayoutEditor.d.ts +9 -0
  131. package/admin/plugins/fields/ui/TabsLayoutEditor.js +470 -0
  132. package/admin/plugins/fields/ui/TabsLayoutEditor.js.map +1 -0
  133. package/admin/plugins/fields/ui/alert.d.ts +2 -2
  134. package/admin/plugins/fields/ui/alert.js +144 -17
  135. package/admin/plugins/fields/ui/alert.js.map +1 -1
  136. package/admin/plugins/fields/ui/index.d.ts +1 -0
  137. package/admin/plugins/fields/ui/index.js +1 -0
  138. package/admin/plugins/fields/ui/index.js.map +1 -1
  139. package/admin/plugins/fields/ui/separator.d.ts +2 -2
  140. package/admin/plugins/fields/ui/separator.js +131 -17
  141. package/admin/plugins/fields/ui/separator.js.map +1 -1
  142. package/admin/plugins/fields/ui/tabs.d.ts +2 -0
  143. package/admin/plugins/fields/ui/tabs.js +89 -0
  144. package/admin/plugins/fields/ui/tabs.js.map +1 -0
  145. package/admin/plugins/index.d.ts +1 -0
  146. package/admin/views/contentEntries/hooks/useContentEntriesList.d.ts +1 -0
  147. package/admin/views/contentEntries/hooks/useContentEntriesList.js +4 -2
  148. package/admin/views/contentEntries/hooks/useContentEntriesList.js.map +1 -1
  149. package/admin/views/contentModels/importing/graphql.d.ts +2 -2
  150. package/admin/views/contentModels/importing/graphql.js.map +1 -1
  151. package/allPlugins.d.ts +2 -1
  152. package/allPlugins.js +2 -3
  153. package/allPlugins.js.map +1 -1
  154. package/exports/admin/cms/model.d.ts +1 -0
  155. package/exports/admin/cms/model.js +3 -0
  156. package/exports/admin/cms/model.js.map +1 -0
  157. package/package.json +23 -23
  158. package/types.d.ts +1 -0
  159. package/types.js +5 -1
  160. package/types.js.map +1 -1
  161. package/admin/plugins/fieldRenderers/ui/alert.d.ts +0 -2
  162. package/admin/plugins/fieldRenderers/ui/alert.js +0 -32
  163. package/admin/plugins/fieldRenderers/ui/alert.js.map +0 -1
  164. package/admin/plugins/fieldRenderers/ui/index.d.ts +0 -2
  165. package/admin/plugins/fieldRenderers/ui/index.js +0 -4
  166. package/admin/plugins/fieldRenderers/ui/index.js.map +0 -1
  167. package/admin/plugins/fieldRenderers/ui/separator.d.ts +0 -2
  168. package/admin/plugins/fieldRenderers/ui/separator.js +0 -31
  169. package/admin/plugins/fieldRenderers/ui/separator.js.map +0 -1
@@ -1,31 +1,158 @@
1
1
  import React from "react";
2
2
  import { ReactComponent as AlertIcon } from "@webiny/icons/warning.svg";
3
+ import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
4
+ import { ReactComponent as DeleteIcon } from "@webiny/icons/delete.svg";
3
5
  import { i18n } from "@webiny/app/i18n/index.js";
6
+ import { Alert, Grid, IconButton, Tabs, Textarea, Select, Text } from "@webiny/admin-ui";
7
+ import { useDialogs } from "@webiny/app-admin";
8
+ import { Bind } from "@webiny/form";
9
+ import { PermissionsTab } from "../../../components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js";
10
+ import { RulesTab } from "../../../components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js";
11
+ import { useModelEditor } from "../../../components/ContentModelEditor/useModelEditor.js";
4
12
  const t = i18n.ns("app-headless-cms/admin/fields");
13
+ const AlertSettings = () => {
14
+ return /*#__PURE__*/React.createElement(Grid, {
15
+ className: "mt-md"
16
+ }, /*#__PURE__*/React.createElement(Grid.Column, {
17
+ span: 12
18
+ }, /*#__PURE__*/React.createElement(Bind, {
19
+ name: "label"
20
+ }, /*#__PURE__*/React.createElement(Textarea, {
21
+ label: "Message"
22
+ }))), /*#__PURE__*/React.createElement(Grid.Column, {
23
+ span: 12
24
+ }, /*#__PURE__*/React.createElement(Bind, {
25
+ name: "alertType",
26
+ defaultValue: "info"
27
+ }, /*#__PURE__*/React.createElement(Select, {
28
+ displayResetAction: false,
29
+ label: "Alert type",
30
+ options: [{
31
+ value: "info",
32
+ label: "Info"
33
+ }, {
34
+ value: "success",
35
+ label: "Success"
36
+ }, {
37
+ value: "warning",
38
+ label: "Warning"
39
+ }, {
40
+ value: "danger",
41
+ label: "Danger"
42
+ }]
43
+ }))));
44
+ };
45
+ const AlertDialogContent = ({
46
+ fieldOptions
47
+ }) => {
48
+ return /*#__PURE__*/React.createElement(Tabs, {
49
+ size: "md",
50
+ separator: true,
51
+ tabs: [/*#__PURE__*/React.createElement(Tabs.Tab, {
52
+ key: "alert",
53
+ trigger: "Alert",
54
+ value: "alert",
55
+ content: /*#__PURE__*/React.createElement(AlertSettings, null)
56
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
57
+ key: "permissions",
58
+ trigger: "Permissions",
59
+ value: "permissions",
60
+ content: /*#__PURE__*/React.createElement(PermissionsTab, {
61
+ gridClassName: "mt-md"
62
+ })
63
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
64
+ key: "rules",
65
+ trigger: "Rules",
66
+ value: "rules",
67
+ content: /*#__PURE__*/React.createElement(RulesTab, {
68
+ gridClassName: "mt-md",
69
+ fieldOptions: fieldOptions
70
+ })
71
+ })]
72
+ });
73
+ };
74
+ const AlertLayoutCell = ({
75
+ descriptor,
76
+ onUpdate,
77
+ onDelete
78
+ }) => {
79
+ const {
80
+ fieldOptions
81
+ } = useModelEditor();
82
+ const dialogs = useDialogs();
83
+ const openSettings = () => {
84
+ dialogs.showDialog({
85
+ title: "Alert Settings",
86
+ description: "Configure the alert and access permissions",
87
+ acceptLabel: "Save",
88
+ cancelLabel: "Cancel",
89
+ formData: {
90
+ label: descriptor.label,
91
+ alertType: descriptor.alertType,
92
+ rules: descriptor.rules ?? []
93
+ },
94
+ content: /*#__PURE__*/React.createElement(AlertDialogContent, {
95
+ fieldOptions: fieldOptions
96
+ }),
97
+ onAccept: data => {
98
+ onUpdate({
99
+ ...descriptor,
100
+ label: data.label ?? "",
101
+ alertType: data.alertType ?? "info",
102
+ rules: data.rules ?? []
103
+ });
104
+ }
105
+ });
106
+ };
107
+ return /*#__PURE__*/React.createElement("div", {
108
+ className: "flex items-center justify-between"
109
+ }, /*#__PURE__*/React.createElement("div", {
110
+ className: "flex-1"
111
+ }, descriptor.label ? /*#__PURE__*/React.createElement(Alert, {
112
+ type: descriptor.alertType
113
+ }, descriptor.label) : /*#__PURE__*/React.createElement(Text, {
114
+ size: "sm",
115
+ className: "text-neutral-strong italic"
116
+ }, "Alert (no message set)")), /*#__PURE__*/React.createElement("div", {
117
+ className: "flex items-center gap-xs ml-sm"
118
+ }, /*#__PURE__*/React.createElement(IconButton, {
119
+ icon: /*#__PURE__*/React.createElement(EditIcon, null),
120
+ onClick: openSettings,
121
+ variant: "ghost",
122
+ size: "sm"
123
+ }), /*#__PURE__*/React.createElement(IconButton, {
124
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, null),
125
+ onClick: onDelete,
126
+ variant: "ghost",
127
+ size: "sm"
128
+ })));
129
+ };
5
130
  export const uiAlertField = {
6
- type: "cms-editor-field-type",
7
- name: "cms-editor-field-type-ui-alert",
131
+ type: "cms-editor-layout-field-type",
132
+ name: "cms-editor-layout-field-type-alert",
8
133
  field: {
9
- type: "ui:alert",
134
+ type: "alert",
10
135
  label: t`Alert`,
11
- description: t`Show an alert field which is not stored in the database.`,
136
+ description: t`Show an alert message in the form.`,
12
137
  icon: /*#__PURE__*/React.createElement(AlertIcon, null),
13
- allowLayout: false,
14
- hideInAdmin: false,
15
- allowList: false,
16
138
  canEditSettings: true,
17
- allowPredefinedValues: false,
18
- tags: undefined,
19
- createField() {
139
+ createDescriptor() {
20
140
  return {
21
- type: "ui:alert",
22
- list: false,
23
- validation: undefined,
24
- listValidation: undefined,
25
- renderer: {
26
- name: "uiAlert"
27
- }
141
+ type: "alert",
142
+ label: "",
143
+ alertType: "info"
28
144
  };
145
+ },
146
+ render({
147
+ descriptor,
148
+ onUpdate,
149
+ onDelete
150
+ }) {
151
+ return /*#__PURE__*/React.createElement(AlertLayoutCell, {
152
+ descriptor: descriptor,
153
+ onUpdate: onUpdate,
154
+ onDelete: onDelete
155
+ });
29
156
  }
30
157
  }
31
158
  };
@@ -1 +1 @@
1
- {"version":3,"names":["React","ReactComponent","AlertIcon","i18n","t","ns","uiAlertField","type","name","field","label","description","icon","createElement","allowLayout","hideInAdmin","allowList","canEditSettings","allowPredefinedValues","tags","undefined","createField","list","validation","listValidation","renderer"],"sources":["alert.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsModelFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReactComponent as AlertIcon } from \"@webiny/icons/warning.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields\");\n\nexport const uiAlertField: CmsModelFieldTypePlugin = {\n type: \"cms-editor-field-type\",\n name: \"cms-editor-field-type-ui-alert\",\n field: {\n type: \"ui:alert\",\n label: t`Alert`,\n description: t`Show an alert field which is not stored in the database.`,\n icon: <AlertIcon />,\n allowLayout: false,\n hideInAdmin: false,\n allowList: false,\n canEditSettings: true,\n allowPredefinedValues: false,\n tags: undefined,\n createField() {\n return {\n type: \"ui:alert\",\n list: false,\n validation: undefined,\n listValidation: undefined,\n renderer: {\n name: \"uiAlert\"\n }\n };\n }\n }\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,cAAc,IAAIC,SAAS,QAAQ,2BAA2B;AACvE,SAASC,IAAI,QAAQ,2BAA2B;AAEhD,MAAMC,CAAC,GAAGD,IAAI,CAACE,EAAE,CAAC,+BAA+B,CAAC;AAElD,OAAO,MAAMC,YAAqC,GAAG;EACjDC,IAAI,EAAE,uBAAuB;EAC7BC,IAAI,EAAE,gCAAgC;EACtCC,KAAK,EAAE;IACHF,IAAI,EAAE,UAAU;IAChBG,KAAK,EAAEN,CAAC,OAAO;IACfO,WAAW,EAAEP,CAAC,0DAA0D;IACxEQ,IAAI,eAAEZ,KAAA,CAAAa,aAAA,CAACX,SAAS,MAAE,CAAC;IACnBY,WAAW,EAAE,KAAK;IAClBC,WAAW,EAAE,KAAK;IAClBC,SAAS,EAAE,KAAK;IAChBC,eAAe,EAAE,IAAI;IACrBC,qBAAqB,EAAE,KAAK;IAC5BC,IAAI,EAAEC,SAAS;IACfC,WAAWA,CAAA,EAAG;MACV,OAAO;QACHd,IAAI,EAAE,UAAU;QAChBe,IAAI,EAAE,KAAK;QACXC,UAAU,EAAEH,SAAS;QACrBI,cAAc,EAAEJ,SAAS;QACzBK,QAAQ,EAAE;UACNjB,IAAI,EAAE;QACV;MACJ,CAAC;IACL;EACJ;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","ReactComponent","AlertIcon","EditIcon","DeleteIcon","i18n","Alert","Grid","IconButton","Tabs","Textarea","Select","Text","useDialogs","Bind","PermissionsTab","RulesTab","useModelEditor","t","ns","AlertSettings","createElement","className","Column","span","name","label","defaultValue","displayResetAction","options","value","AlertDialogContent","fieldOptions","size","separator","tabs","Tab","key","trigger","content","gridClassName","AlertLayoutCell","descriptor","onUpdate","onDelete","dialogs","openSettings","showDialog","title","description","acceptLabel","cancelLabel","formData","alertType","rules","onAccept","data","type","icon","onClick","variant","uiAlertField","field","canEditSettings","createDescriptor","render"],"sources":["alert.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsLayoutFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type {\n CmsAlertLayoutDescriptor,\n CmsLayoutDescriptor\n} from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ReactComponent as AlertIcon } from \"@webiny/icons/warning.svg\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Alert, Grid, IconButton, Tabs, Textarea, Select, Text } from \"@webiny/admin-ui\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport { Bind } from \"@webiny/form\";\nimport { PermissionsTab } from \"~/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js\";\nimport { RulesTab } from \"~/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js\";\nimport { useModelEditor } from \"~/admin/components/ContentModelEditor/useModelEditor.js\";\nimport type { FieldOption } from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields\");\n\nconst AlertSettings = () => {\n return (\n <Grid className={\"mt-md\"}>\n <Grid.Column span={12}>\n <Bind name={\"label\"}>\n <Textarea label={\"Message\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"alertType\"} defaultValue={\"info\"}>\n <Select\n displayResetAction={false}\n label={\"Alert type\"}\n options={[\n { value: \"info\", label: \"Info\" },\n { value: \"success\", label: \"Success\" },\n { value: \"warning\", label: \"Warning\" },\n { value: \"danger\", label: \"Danger\" }\n ]}\n />\n </Bind>\n </Grid.Column>\n </Grid>\n );\n};\n\nconst AlertDialogContent = ({ fieldOptions }: { fieldOptions: FieldOption[] }) => {\n return (\n <Tabs\n size={\"md\"}\n separator\n tabs={[\n <Tabs.Tab\n key={\"alert\"}\n trigger={\"Alert\"}\n value={\"alert\"}\n content={<AlertSettings />}\n />,\n <Tabs.Tab\n key={\"permissions\"}\n trigger={\"Permissions\"}\n value={\"permissions\"}\n content={<PermissionsTab gridClassName={\"mt-md\"} />}\n />,\n <Tabs.Tab\n key={\"rules\"}\n trigger={\"Rules\"}\n value={\"rules\"}\n content={<RulesTab gridClassName={\"mt-md\"} fieldOptions={fieldOptions} />}\n />\n ]}\n />\n );\n};\n\ninterface AlertLayoutCellProps {\n descriptor: CmsAlertLayoutDescriptor;\n onUpdate: (d: CmsLayoutDescriptor) => void;\n onDelete: () => void;\n}\n\nconst AlertLayoutCell = ({ descriptor, onUpdate, onDelete }: AlertLayoutCellProps) => {\n const { fieldOptions } = useModelEditor();\n const dialogs = useDialogs();\n\n const openSettings = () => {\n dialogs.showDialog({\n title: \"Alert Settings\",\n description: \"Configure the alert and access permissions\",\n acceptLabel: \"Save\",\n cancelLabel: \"Cancel\",\n formData: {\n label: descriptor.label,\n alertType: descriptor.alertType,\n rules: descriptor.rules ?? []\n },\n content: <AlertDialogContent fieldOptions={fieldOptions} />,\n onAccept: data => {\n onUpdate({\n ...descriptor,\n label: data.label ?? \"\",\n alertType: (data.alertType as CmsAlertLayoutDescriptor[\"alertType\"]) ?? \"info\",\n rules: data.rules ?? []\n });\n }\n });\n };\n\n return (\n <div className={\"flex items-center justify-between\"}>\n <div className={\"flex-1\"}>\n {descriptor.label ? (\n <Alert type={descriptor.alertType}>{descriptor.label}</Alert>\n ) : (\n <Text size={\"sm\"} className={\"text-neutral-strong italic\"}>\n Alert (no message set)\n </Text>\n )}\n </div>\n <div className={\"flex items-center gap-xs ml-sm\"}>\n <IconButton\n icon={<EditIcon />}\n onClick={openSettings}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n <IconButton\n icon={<DeleteIcon />}\n onClick={onDelete}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n </div>\n </div>\n );\n};\n\nexport const uiAlertField: CmsLayoutFieldTypePlugin = {\n type: \"cms-editor-layout-field-type\",\n name: \"cms-editor-layout-field-type-alert\",\n field: {\n type: \"alert\",\n label: t`Alert`,\n description: t`Show an alert message in the form.`,\n icon: <AlertIcon />,\n canEditSettings: true,\n createDescriptor() {\n return { type: \"alert\", label: \"\", alertType: \"info\" };\n },\n render({ descriptor, onUpdate, onDelete }) {\n return (\n <AlertLayoutCell\n descriptor={descriptor as CmsAlertLayoutDescriptor}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n );\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,3 @@
1
1
  export * from "./alert.js";
2
2
  export * from "./separator.js";
3
+ export * from "./tabs.js";
@@ -1,4 +1,5 @@
1
1
  export * from "./alert.js";
2
2
  export * from "./separator.js";
3
+ export * from "./tabs.js";
3
4
 
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./alert.js\";\nexport * from \"./separator.js\";\n"],"mappings":"AAAA;AACA","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./alert.js\";\nexport * from \"./separator.js\";\nexport * from \"./tabs.js\";\n"],"mappings":"AAAA;AACA;AACA","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import type { CmsModelFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
2
- export declare const uiSeparatorField: CmsModelFieldTypePlugin;
1
+ import type { CmsLayoutFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
2
+ export declare const uiSeparatorField: CmsLayoutFieldTypePlugin;
@@ -1,31 +1,145 @@
1
1
  import React from "react";
2
2
  import { ReactComponent as SeparatorIcon } from "@webiny/icons/line_style.svg";
3
+ import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
4
+ import { ReactComponent as DeleteIcon } from "@webiny/icons/delete.svg";
3
5
  import { i18n } from "@webiny/app/i18n/index.js";
6
+ import { Grid, IconButton, Input, Separator, Tabs, Text } from "@webiny/admin-ui";
7
+ import { useDialogs } from "@webiny/app-admin";
8
+ import { Bind } from "@webiny/form";
9
+ import { PermissionsTab } from "../../../components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js";
10
+ import { RulesTab } from "../../../components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js";
11
+ import { useModelEditor } from "../../../components/ContentModelEditor/useModelEditor.js";
4
12
  const t = i18n.ns("app-headless-cms/admin/fields");
13
+ const SeparatorSettings = () => {
14
+ return /*#__PURE__*/React.createElement(Grid, {
15
+ className: "mt-md"
16
+ }, /*#__PURE__*/React.createElement(Grid.Column, {
17
+ span: 12
18
+ }, /*#__PURE__*/React.createElement(Bind, {
19
+ name: "label"
20
+ }, /*#__PURE__*/React.createElement(Input, {
21
+ label: "Label"
22
+ }))), /*#__PURE__*/React.createElement(Grid.Column, {
23
+ span: 12
24
+ }, /*#__PURE__*/React.createElement(Bind, {
25
+ name: "description"
26
+ }, /*#__PURE__*/React.createElement(Input, {
27
+ label: "Description"
28
+ }))));
29
+ };
30
+ const SeparatorDialogContent = ({
31
+ fieldOptions
32
+ }) => {
33
+ return /*#__PURE__*/React.createElement(Tabs, {
34
+ size: "md",
35
+ separator: true,
36
+ tabs: [/*#__PURE__*/React.createElement(Tabs.Tab, {
37
+ key: "separator",
38
+ trigger: "Separator",
39
+ value: "separator",
40
+ content: /*#__PURE__*/React.createElement(SeparatorSettings, null)
41
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
42
+ key: "permissions",
43
+ trigger: "Permissions",
44
+ value: "permissions",
45
+ content: /*#__PURE__*/React.createElement(PermissionsTab, {
46
+ gridClassName: "mt-md"
47
+ })
48
+ }), /*#__PURE__*/React.createElement(Tabs.Tab, {
49
+ key: "rules",
50
+ trigger: "Rules",
51
+ value: "rules",
52
+ content: /*#__PURE__*/React.createElement(RulesTab, {
53
+ gridClassName: "mt-md",
54
+ fieldOptions: fieldOptions
55
+ })
56
+ })]
57
+ });
58
+ };
59
+ const SeparatorLayoutCell = ({
60
+ descriptor,
61
+ onUpdate,
62
+ onDelete
63
+ }) => {
64
+ const {
65
+ fieldOptions
66
+ } = useModelEditor();
67
+ const dialogs = useDialogs();
68
+ const openSettings = () => {
69
+ dialogs.showDialog({
70
+ title: "Separator Settings",
71
+ description: "Configure the separator and access permissions",
72
+ acceptLabel: "Save",
73
+ cancelLabel: "Cancel",
74
+ formData: {
75
+ label: descriptor.label,
76
+ description: descriptor.description ?? "",
77
+ rules: descriptor.rules ?? []
78
+ },
79
+ content: /*#__PURE__*/React.createElement(SeparatorDialogContent, {
80
+ fieldOptions: fieldOptions
81
+ }),
82
+ onAccept: data => {
83
+ onUpdate({
84
+ ...descriptor,
85
+ label: data.label ?? "",
86
+ description: data.description ?? "",
87
+ rules: data.rules ?? []
88
+ });
89
+ }
90
+ });
91
+ };
92
+ return /*#__PURE__*/React.createElement("div", {
93
+ className: "flex items-center gap-sm"
94
+ }, /*#__PURE__*/React.createElement("div", {
95
+ className: "flex-1"
96
+ }, /*#__PURE__*/React.createElement(Separator, {
97
+ variant: "accent",
98
+ labelPosition: "start"
99
+ }, descriptor.label), descriptor.description && /*#__PURE__*/React.createElement(Text, {
100
+ as: "div",
101
+ size: "sm",
102
+ className: "text-neutral-strong mt-sm"
103
+ }, descriptor.description)), /*#__PURE__*/React.createElement("div", {
104
+ className: "flex items-center gap-xs"
105
+ }, /*#__PURE__*/React.createElement(IconButton, {
106
+ icon: /*#__PURE__*/React.createElement(EditIcon, null),
107
+ onClick: openSettings,
108
+ variant: "ghost",
109
+ size: "sm"
110
+ }), /*#__PURE__*/React.createElement(IconButton, {
111
+ icon: /*#__PURE__*/React.createElement(DeleteIcon, null),
112
+ onClick: onDelete,
113
+ variant: "ghost",
114
+ size: "sm"
115
+ })));
116
+ };
5
117
  export const uiSeparatorField = {
6
- type: "cms-editor-field-type",
7
- name: "cms-editor-field-type-ui-separator",
118
+ type: "cms-editor-layout-field-type",
119
+ name: "cms-editor-layout-field-type-separator",
8
120
  field: {
9
- type: "ui:separator",
121
+ type: "separator",
10
122
  label: t`Separator`,
11
- description: t`Show a separator field which is not stored in the database.`,
123
+ description: t`Show a visual separator between fields.`,
12
124
  icon: /*#__PURE__*/React.createElement(SeparatorIcon, null),
13
- allowLayout: false,
14
- hideInAdmin: false,
15
- allowList: false,
16
125
  canEditSettings: true,
17
- allowPredefinedValues: false,
18
- tags: undefined,
19
- createField() {
126
+ createDescriptor() {
20
127
  return {
21
- type: "ui:separator",
22
- list: false,
23
- validation: undefined,
24
- listValidation: undefined,
25
- renderer: {
26
- name: "uiSeparator"
27
- }
128
+ type: "separator",
129
+ label: "Section",
130
+ description: "Your description goes here"
28
131
  };
132
+ },
133
+ render({
134
+ descriptor,
135
+ onUpdate,
136
+ onDelete
137
+ }) {
138
+ return /*#__PURE__*/React.createElement(SeparatorLayoutCell, {
139
+ descriptor: descriptor,
140
+ onUpdate: onUpdate,
141
+ onDelete: onDelete
142
+ });
29
143
  }
30
144
  }
31
145
  };
@@ -1 +1 @@
1
- {"version":3,"names":["React","ReactComponent","SeparatorIcon","i18n","t","ns","uiSeparatorField","type","name","field","label","description","icon","createElement","allowLayout","hideInAdmin","allowList","canEditSettings","allowPredefinedValues","tags","undefined","createField","list","validation","listValidation","renderer"],"sources":["separator.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsModelFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport { ReactComponent as SeparatorIcon } from \"@webiny/icons/line_style.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields\");\n\nexport const uiSeparatorField: CmsModelFieldTypePlugin = {\n type: \"cms-editor-field-type\",\n name: \"cms-editor-field-type-ui-separator\",\n field: {\n type: \"ui:separator\",\n label: t`Separator`,\n description: t`Show a separator field which is not stored in the database.`,\n icon: <SeparatorIcon />,\n allowLayout: false,\n hideInAdmin: false,\n allowList: false,\n canEditSettings: true,\n allowPredefinedValues: false,\n tags: undefined,\n createField() {\n return {\n type: \"ui:separator\",\n list: false,\n validation: undefined,\n listValidation: undefined,\n renderer: {\n name: \"uiSeparator\"\n }\n };\n }\n }\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAASC,cAAc,IAAIC,aAAa,QAAQ,8BAA8B;AAC9E,SAASC,IAAI,QAAQ,2BAA2B;AAEhD,MAAMC,CAAC,GAAGD,IAAI,CAACE,EAAE,CAAC,+BAA+B,CAAC;AAElD,OAAO,MAAMC,gBAAyC,GAAG;EACrDC,IAAI,EAAE,uBAAuB;EAC7BC,IAAI,EAAE,oCAAoC;EAC1CC,KAAK,EAAE;IACHF,IAAI,EAAE,cAAc;IACpBG,KAAK,EAAEN,CAAC,WAAW;IACnBO,WAAW,EAAEP,CAAC,6DAA6D;IAC3EQ,IAAI,eAAEZ,KAAA,CAAAa,aAAA,CAACX,aAAa,MAAE,CAAC;IACvBY,WAAW,EAAE,KAAK;IAClBC,WAAW,EAAE,KAAK;IAClBC,SAAS,EAAE,KAAK;IAChBC,eAAe,EAAE,IAAI;IACrBC,qBAAqB,EAAE,KAAK;IAC5BC,IAAI,EAAEC,SAAS;IACfC,WAAWA,CAAA,EAAG;MACV,OAAO;QACHd,IAAI,EAAE,cAAc;QACpBe,IAAI,EAAE,KAAK;QACXC,UAAU,EAAEH,SAAS;QACrBI,cAAc,EAAEJ,SAAS;QACzBK,QAAQ,EAAE;UACNjB,IAAI,EAAE;QACV;MACJ,CAAC;IACL;EACJ;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","ReactComponent","SeparatorIcon","EditIcon","DeleteIcon","i18n","Grid","IconButton","Input","Separator","Tabs","Text","useDialogs","Bind","PermissionsTab","RulesTab","useModelEditor","t","ns","SeparatorSettings","createElement","className","Column","span","name","label","SeparatorDialogContent","fieldOptions","size","separator","tabs","Tab","key","trigger","value","content","gridClassName","SeparatorLayoutCell","descriptor","onUpdate","onDelete","dialogs","openSettings","showDialog","title","description","acceptLabel","cancelLabel","formData","rules","onAccept","data","variant","labelPosition","as","icon","onClick","uiSeparatorField","type","field","canEditSettings","createDescriptor","render"],"sources":["separator.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsLayoutFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type {\n CmsSeparatorLayoutDescriptor,\n CmsLayoutDescriptor\n} from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ReactComponent as SeparatorIcon } from \"@webiny/icons/line_style.svg\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Grid, IconButton, Input, Separator, Tabs, Text } from \"@webiny/admin-ui\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport { Bind } from \"@webiny/form\";\nimport { PermissionsTab } from \"~/admin/components/FieldEditor/EditFieldDialog/PermissionsTab/PermissionsTab.js\";\nimport { RulesTab } from \"~/admin/components/FieldEditor/EditFieldDialog/RulesTab/RulesTab.js\";\nimport { useModelEditor } from \"~/admin/components/ContentModelEditor/useModelEditor.js\";\nimport type { FieldOption } from \"@webiny/app-headless-cms-common/Fields/fieldOptions.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields\");\n\nconst SeparatorSettings = () => {\n return (\n <Grid className={\"mt-md\"}>\n <Grid.Column span={12}>\n <Bind name={\"label\"}>\n <Input label={\"Label\"} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"description\"}>\n <Input label={\"Description\"} />\n </Bind>\n </Grid.Column>\n </Grid>\n );\n};\n\nconst SeparatorDialogContent = ({ fieldOptions }: { fieldOptions: FieldOption[] }) => {\n return (\n <Tabs\n size={\"md\"}\n separator\n tabs={[\n <Tabs.Tab\n key={\"separator\"}\n trigger={\"Separator\"}\n value={\"separator\"}\n content={<SeparatorSettings />}\n />,\n <Tabs.Tab\n key={\"permissions\"}\n trigger={\"Permissions\"}\n value={\"permissions\"}\n content={<PermissionsTab gridClassName={\"mt-md\"} />}\n />,\n <Tabs.Tab\n key={\"rules\"}\n trigger={\"Rules\"}\n value={\"rules\"}\n content={<RulesTab gridClassName={\"mt-md\"} fieldOptions={fieldOptions} />}\n />\n ]}\n />\n );\n};\n\ninterface SeparatorLayoutCellProps {\n descriptor: CmsSeparatorLayoutDescriptor;\n onUpdate: (d: CmsLayoutDescriptor) => void;\n onDelete: () => void;\n}\n\nconst SeparatorLayoutCell = ({ descriptor, onUpdate, onDelete }: SeparatorLayoutCellProps) => {\n const { fieldOptions } = useModelEditor();\n const dialogs = useDialogs();\n\n const openSettings = () => {\n dialogs.showDialog({\n title: \"Separator Settings\",\n description: \"Configure the separator and access permissions\",\n acceptLabel: \"Save\",\n cancelLabel: \"Cancel\",\n formData: {\n label: descriptor.label,\n description: descriptor.description ?? \"\",\n rules: descriptor.rules ?? []\n },\n content: <SeparatorDialogContent fieldOptions={fieldOptions} />,\n onAccept: data => {\n onUpdate({\n ...descriptor,\n label: data.label ?? \"\",\n description: data.description ?? \"\",\n rules: data.rules ?? []\n });\n }\n });\n };\n\n return (\n <div className={\"flex items-center gap-sm\"}>\n <div className={\"flex-1\"}>\n <Separator variant={\"accent\"} labelPosition={\"start\"}>\n {descriptor.label}\n </Separator>\n {descriptor.description && (\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong mt-sm\"}>\n {descriptor.description}\n </Text>\n )}\n </div>\n <div className={\"flex items-center gap-xs\"}>\n <IconButton\n icon={<EditIcon />}\n onClick={openSettings}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n <IconButton\n icon={<DeleteIcon />}\n onClick={onDelete}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n </div>\n </div>\n );\n};\n\nexport const uiSeparatorField: CmsLayoutFieldTypePlugin = {\n type: \"cms-editor-layout-field-type\",\n name: \"cms-editor-layout-field-type-separator\",\n field: {\n type: \"separator\",\n label: t`Separator`,\n description: t`Show a visual separator between fields.`,\n icon: <SeparatorIcon />,\n canEditSettings: true,\n createDescriptor() {\n return {\n type: \"separator\",\n label: \"Section\",\n description: \"Your description goes here\"\n };\n },\n render({ descriptor, onUpdate, onDelete }) {\n return (\n <SeparatorLayoutCell\n descriptor={descriptor as CmsSeparatorLayoutDescriptor}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n );\n }\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import type { CmsLayoutFieldTypePlugin } from "@webiny/app-headless-cms-common/types/index.js";
2
+ export declare const uiTabsField: CmsLayoutFieldTypePlugin;
@@ -0,0 +1,89 @@
1
+ import React from "react";
2
+ import { ReactComponent as TabsIcon } from "@webiny/icons/tab.svg";
3
+ import { i18n } from "@webiny/app/i18n/index.js";
4
+ import { generateAlphaNumericLowerCaseId } from "@webiny/utils";
5
+ import { TabsLayoutEditor } from "./TabsLayoutEditor.js";
6
+ const t = i18n.ns("app-headless-cms/admin/fields");
7
+ export const uiTabsField = {
8
+ type: "cms-editor-layout-field-type",
9
+ name: "cms-editor-layout-field-type-tabs",
10
+ field: {
11
+ type: "tabs",
12
+ label: t`Tabs`,
13
+ description: t`Group fields into tabs.`,
14
+ icon: /*#__PURE__*/React.createElement(TabsIcon, null),
15
+ canEditSettings: true,
16
+ createDescriptor() {
17
+ return {
18
+ type: "tabs",
19
+ label: "Tabs",
20
+ description: null,
21
+ help: null,
22
+ tabs: [{
23
+ id: generateAlphaNumericLowerCaseId(8),
24
+ label: "Tab 1",
25
+ layout: []
26
+ }]
27
+ };
28
+ },
29
+ collectFields({
30
+ descriptor,
31
+ getField
32
+ }) {
33
+ const tabs = descriptor.tabs;
34
+ if (!tabs) {
35
+ return [];
36
+ }
37
+ const result = [];
38
+ for (const tab of tabs) {
39
+ for (const row of tab.layout) {
40
+ for (const cell of row) {
41
+ if (typeof cell === "string") {
42
+ const f = getField(cell);
43
+ if (f) {
44
+ result.push(f);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return result;
51
+ },
52
+ getFieldLabelPrefixes({
53
+ descriptor
54
+ }) {
55
+ const tabsDescriptor = descriptor;
56
+ const tabs = tabsDescriptor.tabs;
57
+ if (!tabs) {
58
+ return {};
59
+ }
60
+ const descriptorLabel = tabsDescriptor.label || "Tabs";
61
+ const prefixes = {};
62
+ for (const tab of tabs) {
63
+ const tabLabel = tab.label || "Tab";
64
+ const prefix = `${descriptorLabel} › ${tabLabel}`;
65
+ for (const row of tab.layout) {
66
+ for (const cell of row) {
67
+ if (typeof cell === "string") {
68
+ prefixes[cell] = prefix;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ return prefixes;
74
+ },
75
+ render({
76
+ descriptor,
77
+ onUpdate,
78
+ onDelete
79
+ }) {
80
+ return /*#__PURE__*/React.createElement(TabsLayoutEditor, {
81
+ descriptor: descriptor,
82
+ onUpdate: onUpdate,
83
+ onDelete: onDelete
84
+ });
85
+ }
86
+ }
87
+ };
88
+
89
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","ReactComponent","TabsIcon","i18n","generateAlphaNumericLowerCaseId","TabsLayoutEditor","t","ns","uiTabsField","type","name","field","label","description","icon","createElement","canEditSettings","createDescriptor","help","tabs","id","layout","collectFields","descriptor","getField","result","tab","row","cell","f","push","getFieldLabelPrefixes","tabsDescriptor","descriptorLabel","prefixes","tabLabel","prefix","render","onUpdate","onDelete"],"sources":["tabs.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CmsLayoutFieldTypePlugin } from \"@webiny/app-headless-cms-common/types/index.js\";\nimport type { CmsTabLayoutDescriptor } from \"@webiny/app-headless-cms-common/types/model.js\";\nimport { ReactComponent as TabsIcon } from \"@webiny/icons/tab.svg\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport { TabsLayoutEditor } from \"./TabsLayoutEditor.js\";\n\nconst t = i18n.ns(\"app-headless-cms/admin/fields\");\n\nexport const uiTabsField: CmsLayoutFieldTypePlugin = {\n type: \"cms-editor-layout-field-type\",\n name: \"cms-editor-layout-field-type-tabs\",\n field: {\n type: \"tabs\",\n label: t`Tabs`,\n description: t`Group fields into tabs.`,\n icon: <TabsIcon />,\n canEditSettings: true,\n createDescriptor() {\n return {\n type: \"tabs\",\n label: \"Tabs\",\n description: null,\n help: null,\n tabs: [{ id: generateAlphaNumericLowerCaseId(8), label: \"Tab 1\", layout: [] }]\n };\n },\n collectFields({ descriptor, getField }) {\n const tabs = (descriptor as CmsTabLayoutDescriptor).tabs;\n if (!tabs) {\n return [];\n }\n const result = [];\n for (const tab of tabs) {\n for (const row of tab.layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n const f = getField(cell);\n if (f) {\n result.push(f);\n }\n }\n }\n }\n }\n return result;\n },\n getFieldLabelPrefixes({ descriptor }) {\n const tabsDescriptor = descriptor as CmsTabLayoutDescriptor;\n const tabs = tabsDescriptor.tabs;\n if (!tabs) {\n return {};\n }\n const descriptorLabel = tabsDescriptor.label || \"Tabs\";\n const prefixes: Record<string, string> = {};\n for (const tab of tabs) {\n const tabLabel = tab.label || \"Tab\";\n const prefix = `${descriptorLabel} › ${tabLabel}`;\n for (const row of tab.layout) {\n for (const cell of row) {\n if (typeof cell === \"string\") {\n prefixes[cell] = prefix;\n }\n }\n }\n }\n return prefixes;\n },\n render({ descriptor, onUpdate, onDelete }) {\n return (\n <TabsLayoutEditor\n descriptor={descriptor as CmsTabLayoutDescriptor}\n onUpdate={onUpdate}\n onDelete={onDelete}\n />\n );\n }\n }\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,SAASC,cAAc,IAAIC,QAAQ,QAAQ,uBAAuB;AAClE,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,+BAA+B,QAAQ,eAAe;AAC/D,SAASC,gBAAgB;AAEzB,MAAMC,CAAC,GAAGH,IAAI,CAACI,EAAE,CAAC,+BAA+B,CAAC;AAElD,OAAO,MAAMC,WAAqC,GAAG;EACjDC,IAAI,EAAE,8BAA8B;EACpCC,IAAI,EAAE,mCAAmC;EACzCC,KAAK,EAAE;IACHF,IAAI,EAAE,MAAM;IACZG,KAAK,EAAEN,CAAC,MAAM;IACdO,WAAW,EAAEP,CAAC,yBAAyB;IACvCQ,IAAI,eAAEd,KAAA,CAAAe,aAAA,CAACb,QAAQ,MAAE,CAAC;IAClBc,eAAe,EAAE,IAAI;IACrBC,gBAAgBA,CAAA,EAAG;MACf,OAAO;QACHR,IAAI,EAAE,MAAM;QACZG,KAAK,EAAE,MAAM;QACbC,WAAW,EAAE,IAAI;QACjBK,IAAI,EAAE,IAAI;QACVC,IAAI,EAAE,CAAC;UAAEC,EAAE,EAAEhB,+BAA+B,CAAC,CAAC,CAAC;UAAEQ,KAAK,EAAE,OAAO;UAAES,MAAM,EAAE;QAAG,CAAC;MACjF,CAAC;IACL,CAAC;IACDC,aAAaA,CAAC;MAAEC,UAAU;MAAEC;IAAS,CAAC,EAAE;MACpC,MAAML,IAAI,GAAII,UAAU,CAA4BJ,IAAI;MACxD,IAAI,CAACA,IAAI,EAAE;QACP,OAAO,EAAE;MACb;MACA,MAAMM,MAAM,GAAG,EAAE;MACjB,KAAK,MAAMC,GAAG,IAAIP,IAAI,EAAE;QACpB,KAAK,MAAMQ,GAAG,IAAID,GAAG,CAACL,MAAM,EAAE;UAC1B,KAAK,MAAMO,IAAI,IAAID,GAAG,EAAE;YACpB,IAAI,OAAOC,IAAI,KAAK,QAAQ,EAAE;cAC1B,MAAMC,CAAC,GAAGL,QAAQ,CAACI,IAAI,CAAC;cACxB,IAAIC,CAAC,EAAE;gBACHJ,MAAM,CAACK,IAAI,CAACD,CAAC,CAAC;cAClB;YACJ;UACJ;QACJ;MACJ;MACA,OAAOJ,MAAM;IACjB,CAAC;IACDM,qBAAqBA,CAAC;MAAER;IAAW,CAAC,EAAE;MAClC,MAAMS,cAAc,GAAGT,UAAoC;MAC3D,MAAMJ,IAAI,GAAGa,cAAc,CAACb,IAAI;MAChC,IAAI,CAACA,IAAI,EAAE;QACP,OAAO,CAAC,CAAC;MACb;MACA,MAAMc,eAAe,GAAGD,cAAc,CAACpB,KAAK,IAAI,MAAM;MACtD,MAAMsB,QAAgC,GAAG,CAAC,CAAC;MAC3C,KAAK,MAAMR,GAAG,IAAIP,IAAI,EAAE;QACpB,MAAMgB,QAAQ,GAAGT,GAAG,CAACd,KAAK,IAAI,KAAK;QACnC,MAAMwB,MAAM,GAAG,GAAGH,eAAe,MAAME,QAAQ,EAAE;QACjD,KAAK,MAAMR,GAAG,IAAID,GAAG,CAACL,MAAM,EAAE;UAC1B,KAAK,MAAMO,IAAI,IAAID,GAAG,EAAE;YACpB,IAAI,OAAOC,IAAI,KAAK,QAAQ,EAAE;cAC1BM,QAAQ,CAACN,IAAI,CAAC,GAAGQ,MAAM;YAC3B;UACJ;QACJ;MACJ;MACA,OAAOF,QAAQ;IACnB,CAAC;IACDG,MAAMA,CAAC;MAAEd,UAAU;MAAEe,QAAQ;MAAEC;IAAS,CAAC,EAAE;MACvC,oBACIvC,KAAA,CAAAe,aAAA,CAACV,gBAAgB;QACbkB,UAAU,EAAEA,UAAqC;QACjDe,QAAQ,EAAEA,QAAS;QACnBC,QAAQ,EAAEA;MAAS,CACtB,CAAC;IAEV;EACJ;AACJ,CAAC","ignoreList":[]}
@@ -18,6 +18,7 @@ declare const _default: () => (import("@webiny/app-headless-cms-common/types/ind
18
18
  settings?: Record<string, any>;
19
19
  } | import("@webiny/app-headless-cms-common/types/index.js").CmsModelFieldRendererPlugin["renderer"]["render"];
20
20
  tags?: string[];
21
+ rules?: import("@webiny/app-headless-cms-common/types/model.js").FieldRule[];
21
22
  }>[] | import("@webiny/app-headless-cms-common/types/index.js").CmsEditorFormSettingsPlugin<import("@webiny/app/types.js").GenericRecord> | import("@webiny/app/index.js").ApolloCacheObjectIdPlugin<import("@webiny/app/index.js").ApolloCacheObject> | {
22
23
  name: string;
23
24
  type: string;
@@ -29,6 +29,7 @@ export interface ContentEntriesListProviderContext {
29
29
  setFilters: (data: Record<string, any>) => void;
30
30
  selectAll: () => void;
31
31
  unselectAll: () => void;
32
+ refresh: () => Promise<void>;
32
33
  isSelectedAll: boolean;
33
34
  getWhere: () => Record<string, any>;
34
35
  searchQuery: string;
@@ -45,7 +45,8 @@ export const ContentEntriesListProvider = ({
45
45
  isSelectedAll,
46
46
  selectAll,
47
47
  unselectAll,
48
- getWhere
48
+ getWhere,
49
+ refresh
49
50
  } = useAcoList();
50
51
  const [sorting, setSorting] = useState([]);
51
52
  const [search, setSearch] = useState("");
@@ -159,7 +160,8 @@ export const ContentEntriesListProvider = ({
159
160
  selectAll,
160
161
  unselectAll,
161
162
  getWhere,
162
- searchQuery
163
+ searchQuery,
164
+ refresh
163
165
  };
164
166
  return /*#__PURE__*/React.createElement(ContentEntriesListContext.Provider, {
165
167
  value: context
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useMemo","useState","debounce","useRoute","useRouter","makeDecoratable","createSort","useAcoList","useNavigateFolder","useContentEntries","ROOT_FOLDER","Routes","ContentEntriesListContext","createContext","undefined","ContentEntriesListProvider","children","goToRoute","getLink","route","ContentEntries","List","contentModel","currentFolderId","folders","initialFolders","currentFolder","isListLoading","isListLoadingMore","isSearch","listMoreRecords","listTitle","meta","records","initialRecords","selected","setSearchQuery","setListSort","setFilters","setSelected","showFilters","hideFilters","showingFilters","showingSelectAll","isSelectedAll","selectAll","unselectAll","getWhere","sorting","setSorting","search","setSearch","searchQuery","params","updateSearch","onSelectRow","rows","items","filter","item","$type","cmsContentEntries","map","data","getEntryEditUrl","entry","folderId","id","length","sort","isField","fields","some","field","fieldId","includes","navigateTo","input","searchPlaceholder","pluralApiName","title","context","modelId","createElement","Provider","value","useContentEntriesList","useContext","Error"],"sources":["useContentEntriesList.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { useRoute, useRouter } from \"@webiny/app-admin\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport type { FolderDto, ListMeta } from \"@webiny/app-aco\";\nimport { createSort, useAcoList, useNavigateFolder } from \"@webiny/app-aco\";\nimport { useContentEntries } from \"./useContentEntries.js\";\nimport type { CmsContentEntry, TableItem } from \"~/types.js\";\nimport type { OnSortingChange, Sorting } from \"@webiny/ui/DataTable/index.js\";\nimport { ROOT_FOLDER } from \"~/admin/constants.js\";\nimport { Routes } from \"~/routes.js\";\n\ninterface UpdateSearchCallableParams {\n search: string;\n}\ninterface UpdateSearchCallable {\n (params: UpdateSearchCallableParams): void;\n}\n\nexport interface ContentEntriesListProviderContext {\n modelId: string;\n folderId: string;\n navigateTo: (folderId?: string) => void;\n folders: FolderDto[];\n getEntryEditUrl: (item: CmsContentEntry) => string;\n hideFilters: () => void;\n isListLoading: boolean;\n isListLoadingMore: boolean;\n isSearch: boolean;\n listMoreRecords: () => void;\n listTitle?: string;\n meta: ListMeta;\n onSelectRow: (rows: TableItem[] | []) => void;\n records: CmsContentEntry[];\n search: string;\n selected: CmsContentEntry[];\n setSearch: (value: string) => void;\n setSelected: (data: CmsContentEntry[]) => void;\n setSorting: OnSortingChange;\n showFilters: () => void;\n showingFilters: boolean;\n showingSelectAll: boolean;\n sorting: Sorting;\n setFilters: (data: Record<string, any>) => void;\n selectAll: () => void;\n unselectAll: () => void;\n isSelectedAll: boolean;\n getWhere: () => Record<string, any>;\n searchQuery: string;\n searchPlaceholder: string;\n}\n\nexport const ContentEntriesListContext = React.createContext<\n ContentEntriesListProviderContext | undefined\n>(undefined);\n\ninterface ContentEntriesListProviderProps {\n children: React.ReactNode;\n}\n\nexport const ContentEntriesListProvider = ({ children }: ContentEntriesListProviderProps) => {\n const { goToRoute, getLink } = useRouter();\n const { route } = useRoute(Routes.ContentEntries.List);\n const { contentModel } = useContentEntries();\n const { currentFolderId } = useNavigateFolder();\n\n const {\n folders: initialFolders,\n currentFolder,\n isListLoading,\n isListLoadingMore,\n isSearch,\n listMoreRecords,\n listTitle,\n meta,\n records: initialRecords,\n selected,\n setSearchQuery,\n setListSort,\n setFilters,\n setSelected,\n showFilters,\n hideFilters,\n showingFilters,\n showingSelectAll,\n isSelectedAll,\n selectAll,\n unselectAll,\n getWhere\n } = useAcoList<CmsContentEntry>();\n\n const [sorting, setSorting] = useState<Sorting>([]);\n const [search, setSearch] = useState<string>(\"\");\n\n const searchQuery = route.params.search ?? \"\";\n\n // Search-related logic: update `searchQuery` state and querystring\n const updateSearch = useCallback(\n debounce<UpdateSearchCallable>(({ search }) => {\n if (searchQuery !== search) {\n setSearchQuery(search);\n goToRoute(Routes.ContentEntries.List, { ...route.params, search });\n }\n }, 500),\n [searchQuery, route]\n );\n\n useEffect(() => {\n setSearch(route.params.search ?? \"\");\n }, [route]);\n\n // When \"search\" changes, trigger search-related logics\n useEffect(() => {\n updateSearch({ search });\n }, [search]);\n\n const onSelectRow: ContentEntriesListProviderContext[\"onSelectRow\"] = rows => {\n const items = rows.filter(item => item.$type === \"RECORD\");\n\n const cmsContentEntries = items.map(item => item.data as CmsContentEntry);\n\n setSelected(cmsContentEntries);\n };\n\n const getEntryEditUrl = useCallback(\n (entry: CmsContentEntry): string => {\n return getLink(Routes.ContentEntries.List, {\n ...route.params,\n folderId: currentFolderId,\n id: entry.id\n });\n },\n [currentFolderId]\n );\n\n useEffect(() => {\n if (!sorting?.length) {\n return;\n }\n const sort = createSort(\n /**\n * We need to map sorting IDs to match expected CMS values.\n */\n sorting.map(item => {\n const isField = contentModel.fields.some(field => field.fieldId === item.id);\n /**\n * We only prefix model fields with the \"values_\" string.\n */\n if (item.id.includes(\"values_\") || !isField) {\n return item;\n }\n return {\n ...item,\n id: `values_${item.id}`\n };\n })\n );\n if (!sort) {\n return;\n }\n setListSort(sort);\n }, [sorting, contentModel]);\n\n const navigateTo = useCallback(\n (input?: string) => {\n const folderId = input || currentFolderId || ROOT_FOLDER;\n\n const params = { ...route.params, id: undefined, folderId };\n goToRoute(Routes.ContentEntries.List, params);\n },\n [currentFolderId, route]\n );\n\n const searchPlaceholder = useMemo(() => {\n if (!currentFolder) {\n return \"Search...\";\n }\n\n if (currentFolder.id === ROOT_FOLDER) {\n return `Search all ${contentModel.pluralApiName}`;\n }\n\n return `Search in \"${currentFolder.title}\"`;\n }, [currentFolder, contentModel]);\n\n const context: ContentEntriesListProviderContext = {\n modelId: contentModel.modelId,\n folderId: currentFolderId || ROOT_FOLDER,\n navigateTo,\n folders: initialFolders,\n getEntryEditUrl,\n isListLoading,\n isListLoadingMore,\n isSearch,\n listTitle,\n listMoreRecords,\n meta,\n onSelectRow,\n records: initialRecords,\n search,\n searchPlaceholder,\n selected,\n setSelected,\n setSearch,\n sorting,\n setSorting,\n showingFilters,\n showFilters,\n hideFilters,\n setFilters,\n showingSelectAll,\n isSelectedAll,\n selectAll,\n unselectAll,\n getWhere,\n searchQuery\n };\n\n return (\n <ContentEntriesListContext.Provider value={context}>\n {children}\n </ContentEntriesListContext.Provider>\n );\n};\n\nexport const useContentEntriesList = makeDecoratable((): ContentEntriesListProviderContext => {\n const context = React.useContext(ContentEntriesListContext);\n\n if (!context) {\n throw new Error(\"useContentEntriesList must be used within a ContentEntriesListContext\");\n }\n\n return context;\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useMemo","useState","debounce","useRoute","useRouter","makeDecoratable","createSort","useAcoList","useNavigateFolder","useContentEntries","ROOT_FOLDER","Routes","ContentEntriesListContext","createContext","undefined","ContentEntriesListProvider","children","goToRoute","getLink","route","ContentEntries","List","contentModel","currentFolderId","folders","initialFolders","currentFolder","isListLoading","isListLoadingMore","isSearch","listMoreRecords","listTitle","meta","records","initialRecords","selected","setSearchQuery","setListSort","setFilters","setSelected","showFilters","hideFilters","showingFilters","showingSelectAll","isSelectedAll","selectAll","unselectAll","getWhere","refresh","sorting","setSorting","search","setSearch","searchQuery","params","updateSearch","onSelectRow","rows","items","filter","item","$type","cmsContentEntries","map","data","getEntryEditUrl","entry","folderId","id","length","sort","isField","fields","some","field","fieldId","includes","navigateTo","input","searchPlaceholder","pluralApiName","title","context","modelId","createElement","Provider","value","useContentEntriesList","useContext","Error"],"sources":["useContentEntriesList.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { useRoute, useRouter } from \"@webiny/app-admin\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport type { FolderDto, ListMeta } from \"@webiny/app-aco\";\nimport { createSort, useAcoList, useNavigateFolder } from \"@webiny/app-aco\";\nimport { useContentEntries } from \"./useContentEntries.js\";\nimport type { CmsContentEntry, TableItem } from \"~/types.js\";\nimport type { OnSortingChange, Sorting } from \"@webiny/ui/DataTable/index.js\";\nimport { ROOT_FOLDER } from \"~/admin/constants.js\";\nimport { Routes } from \"~/routes.js\";\n\ninterface UpdateSearchCallableParams {\n search: string;\n}\ninterface UpdateSearchCallable {\n (params: UpdateSearchCallableParams): void;\n}\n\nexport interface ContentEntriesListProviderContext {\n modelId: string;\n folderId: string;\n navigateTo: (folderId?: string) => void;\n folders: FolderDto[];\n getEntryEditUrl: (item: CmsContentEntry) => string;\n hideFilters: () => void;\n isListLoading: boolean;\n isListLoadingMore: boolean;\n isSearch: boolean;\n listMoreRecords: () => void;\n listTitle?: string;\n meta: ListMeta;\n onSelectRow: (rows: TableItem[] | []) => void;\n records: CmsContentEntry[];\n search: string;\n selected: CmsContentEntry[];\n setSearch: (value: string) => void;\n setSelected: (data: CmsContentEntry[]) => void;\n setSorting: OnSortingChange;\n showFilters: () => void;\n showingFilters: boolean;\n showingSelectAll: boolean;\n sorting: Sorting;\n setFilters: (data: Record<string, any>) => void;\n selectAll: () => void;\n unselectAll: () => void;\n refresh: () => Promise<void>;\n isSelectedAll: boolean;\n getWhere: () => Record<string, any>;\n searchQuery: string;\n searchPlaceholder: string;\n}\n\nexport const ContentEntriesListContext = React.createContext<\n ContentEntriesListProviderContext | undefined\n>(undefined);\n\ninterface ContentEntriesListProviderProps {\n children: React.ReactNode;\n}\n\nexport const ContentEntriesListProvider = ({ children }: ContentEntriesListProviderProps) => {\n const { goToRoute, getLink } = useRouter();\n const { route } = useRoute(Routes.ContentEntries.List);\n const { contentModel } = useContentEntries();\n const { currentFolderId } = useNavigateFolder();\n\n const {\n folders: initialFolders,\n currentFolder,\n isListLoading,\n isListLoadingMore,\n isSearch,\n listMoreRecords,\n listTitle,\n meta,\n records: initialRecords,\n selected,\n setSearchQuery,\n setListSort,\n setFilters,\n setSelected,\n showFilters,\n hideFilters,\n showingFilters,\n showingSelectAll,\n isSelectedAll,\n selectAll,\n unselectAll,\n getWhere,\n refresh\n } = useAcoList<CmsContentEntry>();\n\n const [sorting, setSorting] = useState<Sorting>([]);\n const [search, setSearch] = useState<string>(\"\");\n\n const searchQuery = route.params.search ?? \"\";\n\n // Search-related logic: update `searchQuery` state and querystring\n const updateSearch = useCallback(\n debounce<UpdateSearchCallable>(({ search }) => {\n if (searchQuery !== search) {\n setSearchQuery(search);\n goToRoute(Routes.ContentEntries.List, { ...route.params, search });\n }\n }, 500),\n [searchQuery, route]\n );\n\n useEffect(() => {\n setSearch(route.params.search ?? \"\");\n }, [route]);\n\n // When \"search\" changes, trigger search-related logics\n useEffect(() => {\n updateSearch({ search });\n }, [search]);\n\n const onSelectRow: ContentEntriesListProviderContext[\"onSelectRow\"] = rows => {\n const items = rows.filter(item => item.$type === \"RECORD\");\n\n const cmsContentEntries = items.map(item => item.data as CmsContentEntry);\n\n setSelected(cmsContentEntries);\n };\n\n const getEntryEditUrl = useCallback(\n (entry: CmsContentEntry): string => {\n return getLink(Routes.ContentEntries.List, {\n ...route.params,\n folderId: currentFolderId,\n id: entry.id\n });\n },\n [currentFolderId]\n );\n\n useEffect(() => {\n if (!sorting?.length) {\n return;\n }\n const sort = createSort(\n /**\n * We need to map sorting IDs to match expected CMS values.\n */\n sorting.map(item => {\n const isField = contentModel.fields.some(field => field.fieldId === item.id);\n /**\n * We only prefix model fields with the \"values_\" string.\n */\n if (item.id.includes(\"values_\") || !isField) {\n return item;\n }\n return {\n ...item,\n id: `values_${item.id}`\n };\n })\n );\n if (!sort) {\n return;\n }\n setListSort(sort);\n }, [sorting, contentModel]);\n\n const navigateTo = useCallback(\n (input?: string) => {\n const folderId = input || currentFolderId || ROOT_FOLDER;\n\n const params = { ...route.params, id: undefined, folderId };\n goToRoute(Routes.ContentEntries.List, params);\n },\n [currentFolderId, route]\n );\n\n const searchPlaceholder = useMemo(() => {\n if (!currentFolder) {\n return \"Search...\";\n }\n\n if (currentFolder.id === ROOT_FOLDER) {\n return `Search all ${contentModel.pluralApiName}`;\n }\n\n return `Search in \"${currentFolder.title}\"`;\n }, [currentFolder, contentModel]);\n\n const context: ContentEntriesListProviderContext = {\n modelId: contentModel.modelId,\n folderId: currentFolderId || ROOT_FOLDER,\n navigateTo,\n folders: initialFolders,\n getEntryEditUrl,\n isListLoading,\n isListLoadingMore,\n isSearch,\n listTitle,\n listMoreRecords,\n meta,\n onSelectRow,\n records: initialRecords,\n search,\n searchPlaceholder,\n selected,\n setSelected,\n setSearch,\n sorting,\n setSorting,\n showingFilters,\n showFilters,\n hideFilters,\n setFilters,\n showingSelectAll,\n isSelectedAll,\n selectAll,\n unselectAll,\n getWhere,\n searchQuery,\n refresh\n };\n\n return (\n <ContentEntriesListContext.Provider value={context}>\n {children}\n </ContentEntriesListContext.Provider>\n );\n};\n\nexport const useContentEntriesList = makeDecoratable((): ContentEntriesListProviderContext => {\n const context = React.useContext(ContentEntriesListContext);\n\n if (!context) {\n throw new Error(\"useContentEntriesList must be used within a ContentEntriesListContext\");\n }\n\n return context;\n});\n"],"mappings":"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","ignoreList":[]}