@strapi/content-manager 5.57.0 → 5.59.0

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 (178) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +4 -3
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +4 -3
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/RelativeTime.js +2 -1
  6. package/dist/admin/components/RelativeTime.js.map +1 -1
  7. package/dist/admin/components/RelativeTime.mjs +2 -1
  8. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  9. package/dist/admin/content-manager.js.map +1 -1
  10. package/dist/admin/content-manager.mjs.map +1 -1
  11. package/dist/admin/history/components/VersionContent.js +8 -8
  12. package/dist/admin/history/components/VersionContent.js.map +1 -1
  13. package/dist/admin/history/components/VersionContent.mjs +8 -8
  14. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  16. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  18. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  22. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
  26. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +7 -6
  28. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +7 -6
  30. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +2 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +2 -1
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +2 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
  40. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -3
  42. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +31 -11
  46. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +32 -12
  48. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  54. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormLayout.js +4 -4
  56. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -4
  58. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  60. package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/utils/data.js +3 -3
  62. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  63. package/dist/admin/pages/EditView/utils/data.mjs +3 -3
  64. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  65. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -3
  66. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  67. package/dist/admin/pages/ListConfiguration/components/Settings.mjs +3 -3
  68. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  69. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +2 -2
  70. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  71. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +2 -2
  72. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  73. package/dist/admin/pages/ListView/ListViewPage.js +73 -13
  74. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  75. package/dist/admin/pages/ListView/ListViewPage.mjs +74 -14
  76. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  77. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +1 -1
  78. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
  79. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +1 -1
  80. package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  82. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  83. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -1
  84. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  85. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +4 -1
  86. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  87. package/dist/admin/pages/ListView/components/Filters.js +12 -10
  88. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  89. package/dist/admin/pages/ListView/components/Filters.mjs +12 -10
  90. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  91. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  92. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +2 -1
  94. package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +2 -1
  96. package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
  97. package/dist/admin/pages/ListView/utils/applyAttributeRenames.js +68 -0
  98. package/dist/admin/pages/ListView/utils/applyAttributeRenames.js.map +1 -0
  99. package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs +64 -0
  100. package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs.map +1 -0
  101. package/dist/admin/preview/components/PreviewHeader.js +3 -1
  102. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  103. package/dist/admin/preview/components/PreviewHeader.mjs +3 -1
  104. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  105. package/dist/admin/services/relations.js +5 -2
  106. package/dist/admin/services/relations.js.map +1 -1
  107. package/dist/admin/services/relations.mjs +5 -2
  108. package/dist/admin/services/relations.mjs.map +1 -1
  109. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +1 -1
  110. package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
  111. package/dist/admin/translations/eu.json.js +3 -3
  112. package/dist/admin/translations/eu.json.mjs +3 -3
  113. package/dist/admin/translations/gu.json.js +4 -4
  114. package/dist/admin/translations/gu.json.mjs +4 -4
  115. package/dist/admin/translations/hi.json.js +9 -9
  116. package/dist/admin/translations/hi.json.mjs +9 -9
  117. package/dist/admin/translations/ml.json.js +6 -6
  118. package/dist/admin/translations/ml.json.mjs +6 -6
  119. package/dist/admin/translations/sa.json.js +10 -10
  120. package/dist/admin/translations/sa.json.mjs +10 -10
  121. package/dist/server/history/entitlements.js +26 -0
  122. package/dist/server/history/entitlements.js.map +1 -0
  123. package/dist/server/history/entitlements.mjs +24 -0
  124. package/dist/server/history/entitlements.mjs.map +1 -0
  125. package/dist/server/history/index.js +3 -0
  126. package/dist/server/history/index.js.map +1 -1
  127. package/dist/server/history/index.mjs +3 -0
  128. package/dist/server/history/index.mjs.map +1 -1
  129. package/dist/server/history/services/utils.js +19 -8
  130. package/dist/server/history/services/utils.js.map +1 -1
  131. package/dist/server/history/services/utils.mjs +18 -9
  132. package/dist/server/history/services/utils.mjs.map +1 -1
  133. package/dist/server/homepage/services/homepage.js.map +1 -1
  134. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  135. package/dist/server/preview/services/preview-config.js.map +1 -1
  136. package/dist/server/preview/services/preview-config.mjs.map +1 -1
  137. package/dist/server/register.js +6 -0
  138. package/dist/server/register.js.map +1 -1
  139. package/dist/server/register.mjs +6 -0
  140. package/dist/server/register.mjs.map +1 -1
  141. package/dist/server/services/components.js.map +1 -1
  142. package/dist/server/services/components.mjs.map +1 -1
  143. package/dist/server/services/configuration/rename-fields.js +68 -0
  144. package/dist/server/services/configuration/rename-fields.js.map +1 -0
  145. package/dist/server/services/configuration/rename-fields.mjs +66 -0
  146. package/dist/server/services/configuration/rename-fields.mjs.map +1 -0
  147. package/dist/server/services/utils/configuration/attribute-renames.js +164 -0
  148. package/dist/server/services/utils/configuration/attribute-renames.js.map +1 -0
  149. package/dist/server/services/utils/configuration/attribute-renames.mjs +161 -0
  150. package/dist/server/services/utils/configuration/attribute-renames.mjs.map +1 -0
  151. package/dist/server/services/utils/configuration/attributes.js +12 -12
  152. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  153. package/dist/server/services/utils/configuration/attributes.mjs +12 -12
  154. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  155. package/dist/server/src/history/entitlements.d.ts +9 -0
  156. package/dist/server/src/history/entitlements.d.ts.map +1 -0
  157. package/dist/server/src/history/index.d.ts.map +1 -1
  158. package/dist/server/src/history/services/utils.d.ts +6 -0
  159. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  160. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  161. package/dist/server/src/index.d.ts +2 -0
  162. package/dist/server/src/index.d.ts.map +1 -1
  163. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  164. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  165. package/dist/server/src/register.d.ts.map +1 -1
  166. package/dist/server/src/services/components.d.ts +2 -0
  167. package/dist/server/src/services/components.d.ts.map +1 -1
  168. package/dist/server/src/services/configuration/rename-fields.d.ts +15 -0
  169. package/dist/server/src/services/configuration/rename-fields.d.ts.map +1 -0
  170. package/dist/server/src/services/index.d.ts +2 -0
  171. package/dist/server/src/services/index.d.ts.map +1 -1
  172. package/dist/server/src/services/utils/configuration/attribute-renames.d.ts +57 -0
  173. package/dist/server/src/services/utils/configuration/attribute-renames.d.ts.map +1 -0
  174. package/dist/shared/contracts/content-types.d.ts +5 -0
  175. package/dist/shared/contracts/content-types.d.ts.map +1 -1
  176. package/dist/shared/contracts/relations.d.ts +1 -0
  177. package/dist/shared/contracts/relations.d.ts.map +1 -1
  178. package/package.json +7 -7
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Old attribute name to the name it has after this save and every earlier
5
+ * save whose map is still stored. Identity entries are omitted: a field that
6
+ * was renamed back to its original name must not keep rewriting itself.
7
+ */ const composeAttributeRenames = (previous = {}, next = {})=>{
8
+ const composed = {};
9
+ for (const [from, to] of Object.entries(previous)){
10
+ composed[from] = next[to] ?? to;
11
+ }
12
+ for (const [from, to] of Object.entries(next)){
13
+ composed[from] = to;
14
+ }
15
+ for (const [from, to] of Object.entries(composed)){
16
+ if (from === to) {
17
+ delete composed[from];
18
+ }
19
+ }
20
+ return composed;
21
+ };
22
+ const renamePath = (path, renames)=>{
23
+ if (!path) {
24
+ return path;
25
+ }
26
+ if (renames[path]) {
27
+ return renames[path];
28
+ }
29
+ const [head, ...rest] = path.split('.');
30
+ if (rest.length > 0 && renames[head]) {
31
+ return [
32
+ renames[head],
33
+ ...rest
34
+ ].join('.');
35
+ }
36
+ return path;
37
+ };
38
+ const replaceNames = (names, renames)=>{
39
+ const seen = new Set();
40
+ const next = [];
41
+ for (const name of names){
42
+ const renamed = renames[name] ?? name;
43
+ if (seen.has(renamed)) {
44
+ continue;
45
+ }
46
+ seen.add(renamed);
47
+ next.push(renamed);
48
+ }
49
+ return next;
50
+ };
51
+ const movedMetadata = (metadata, from, to)=>{
52
+ return {
53
+ ...metadata,
54
+ edit: metadata.edit ? {
55
+ ...metadata.edit,
56
+ label: metadata.edit.label === from ? to : metadata.edit.label
57
+ } : metadata.edit,
58
+ list: metadata.list ? {
59
+ ...metadata.list,
60
+ label: metadata.list.label === from ? to : metadata.list.label
61
+ } : metadata.list
62
+ };
63
+ };
64
+ /**
65
+ * One pass over the original metadata. Applying the map in place deletes one
66
+ * side of a swap (`title -> slug`, `slug -> title`), because the destination
67
+ * key is still occupied when the source is moved.
68
+ */ const renameMetadata = (metadatas, renames)=>{
69
+ const next = {};
70
+ for (const [name, metadata] of Object.entries(metadatas)){
71
+ const to = renames[name];
72
+ if (!to || to === name || next[to]) {
73
+ continue;
74
+ }
75
+ next[to] = movedMetadata(metadata, name, to);
76
+ }
77
+ for (const [name, metadata] of Object.entries(metadatas)){
78
+ const to = renames[name];
79
+ if (to && to !== name || next[name]) {
80
+ continue;
81
+ }
82
+ next[name] = metadata;
83
+ }
84
+ return next;
85
+ };
86
+ /**
87
+ * A relation's `mainField` names a field on the target, so a rename of that
88
+ * target has to be applied from the configuration of whoever owns the relation.
89
+ */ const renameRelationMainFields = (metadatas, attributes, allRenames)=>{
90
+ const next = {
91
+ ...metadatas
92
+ };
93
+ for (const [name, attribute] of Object.entries(attributes ?? {})){
94
+ if (attribute?.type !== 'relation') {
95
+ continue;
96
+ }
97
+ const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];
98
+ const metadata = next[name];
99
+ if (!targetRenames || !metadata) {
100
+ continue;
101
+ }
102
+ next[name] = {
103
+ ...metadata,
104
+ edit: metadata.edit ? {
105
+ ...metadata.edit,
106
+ mainField: typeof metadata.edit.mainField === 'string' ? targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField : metadata.edit.mainField
107
+ } : metadata.edit,
108
+ list: metadata.list ? {
109
+ ...metadata.list,
110
+ mainField: typeof metadata.list.mainField === 'string' ? targetRenames[metadata.list.mainField] ?? metadata.list.mainField : metadata.list.mainField
111
+ } : metadata.list
112
+ };
113
+ }
114
+ return next;
115
+ };
116
+ /**
117
+ * Rewrites one stored Content Manager configuration for a rename save.
118
+ *
119
+ * Returns null when there is nothing to store. A model that has never been
120
+ * opened still gets a configuration when one of its own attributes was
121
+ * renamed, so the browser can repair a column list saved before the rename.
122
+ */ const rewriteContentManagerConfiguration = (configuration, { attributes, ownRenames = {}, allRenames })=>{
123
+ const hasOwnRenames = Object.keys(ownRenames).length > 0;
124
+ if (!configuration && !hasOwnRenames) {
125
+ return null;
126
+ }
127
+ const current = configuration ?? {};
128
+ const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);
129
+ const metadatas = renameRelationMainFields(renameMetadata(current.metadatas ?? {}, ownRenames), attributes, allRenames);
130
+ const next = {
131
+ ...current,
132
+ settings: current.settings ? {
133
+ ...current.settings,
134
+ mainField: renamePath(current.settings.mainField, ownRenames),
135
+ defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames)
136
+ } : current.settings,
137
+ metadatas,
138
+ layouts: current.layouts ? {
139
+ ...current.layouts,
140
+ ...Array.isArray(current.layouts.list) ? {
141
+ list: replaceNames(current.layouts.list, ownRenames)
142
+ } : {},
143
+ ...Array.isArray(current.layouts.edit) ? {
144
+ edit: current.layouts.edit.map((row)=>row.map((field)=>({
145
+ ...field,
146
+ name: ownRenames[field.name] ?? field.name
147
+ })))
148
+ } : {},
149
+ ...Array.isArray(current.layouts.editRelations) ? {
150
+ editRelations: replaceNames(current.layouts.editRelations, ownRenames)
151
+ } : {}
152
+ } : current.layouts
153
+ };
154
+ if (Object.keys(attributeRenames).length > 0) {
155
+ next.attributeRenames = attributeRenames;
156
+ } else {
157
+ delete next.attributeRenames;
158
+ }
159
+ return next;
160
+ };
161
+
162
+ exports.composeAttributeRenames = composeAttributeRenames;
163
+ exports.rewriteContentManagerConfiguration = rewriteContentManagerConfiguration;
164
+ //# sourceMappingURL=attribute-renames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-renames.js","sources":["../../../../../server/src/services/utils/configuration/attribute-renames.ts"],"sourcesContent":["/**\n * Old attribute name to the name it has after this save and every earlier\n * save whose map is still stored. Identity entries are omitted: a field that\n * was renamed back to its original name must not keep rewriting itself.\n */\nconst composeAttributeRenames = (\n previous: Record<string, string> = {},\n next: Record<string, string> = {}\n): Record<string, string> => {\n const composed: Record<string, string> = {};\n\n for (const [from, to] of Object.entries(previous)) {\n composed[from] = next[to] ?? to;\n }\n\n for (const [from, to] of Object.entries(next)) {\n composed[from] = to;\n }\n\n for (const [from, to] of Object.entries(composed)) {\n if (from === to) {\n delete composed[from];\n }\n }\n\n return composed;\n};\n\nconst renamePath = (\n path: string | undefined,\n renames: Record<string, string>\n): string | undefined => {\n if (!path) {\n return path;\n }\n\n if (renames[path]) {\n return renames[path];\n }\n\n const [head, ...rest] = path.split('.');\n\n if (rest.length > 0 && renames[head]) {\n return [renames[head], ...rest].join('.');\n }\n\n return path;\n};\n\ntype FieldMetadata = {\n edit?: { label?: string; mainField?: unknown; [key: string]: unknown };\n list?: { label?: string; mainField?: unknown; [key: string]: unknown };\n};\n\ntype StoredConfiguration = {\n settings?: {\n mainField?: string;\n defaultSortBy?: string;\n [key: string]: unknown;\n };\n metadatas?: Record<string, FieldMetadata>;\n layouts?: {\n list?: string[];\n edit?: { name: string; size: number }[][];\n editRelations?: string[];\n [key: string]: unknown;\n };\n attributeRenames?: Record<string, string>;\n [key: string]: unknown;\n};\n\ntype RelationAttribute = {\n type?: string;\n target?: string;\n targetModel?: string;\n};\n\nconst replaceNames = (names: string[], renames: Record<string, string>): string[] => {\n const seen = new Set<string>();\n const next: string[] = [];\n\n for (const name of names) {\n const renamed = renames[name] ?? name;\n\n if (seen.has(renamed)) {\n continue;\n }\n\n seen.add(renamed);\n next.push(renamed);\n }\n\n return next;\n};\n\nconst movedMetadata = (metadata: FieldMetadata, from: string, to: string): FieldMetadata => {\n return {\n ...metadata,\n edit: metadata.edit\n ? { ...metadata.edit, label: metadata.edit.label === from ? to : metadata.edit.label }\n : metadata.edit,\n list: metadata.list\n ? { ...metadata.list, label: metadata.list.label === from ? to : metadata.list.label }\n : metadata.list,\n };\n};\n\n/**\n * One pass over the original metadata. Applying the map in place deletes one\n * side of a swap (`title -> slug`, `slug -> title`), because the destination\n * key is still occupied when the source is moved.\n */\nconst renameMetadata = (\n metadatas: Record<string, FieldMetadata>,\n renames: Record<string, string>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = {};\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if (!to || to === name || next[to]) {\n continue;\n }\n\n next[to] = movedMetadata(metadata, name, to);\n }\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if ((to && to !== name) || next[name]) {\n continue;\n }\n\n next[name] = metadata;\n }\n\n return next;\n};\n\n/**\n * A relation's `mainField` names a field on the target, so a rename of that\n * target has to be applied from the configuration of whoever owns the relation.\n */\nconst renameRelationMainFields = (\n metadatas: Record<string, FieldMetadata>,\n attributes: Record<string, RelationAttribute> | undefined,\n allRenames: Record<string, Record<string, string>>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = { ...metadatas };\n\n for (const [name, attribute] of Object.entries(attributes ?? {})) {\n if (attribute?.type !== 'relation') {\n continue;\n }\n\n const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];\n const metadata = next[name];\n\n if (!targetRenames || !metadata) {\n continue;\n }\n\n next[name] = {\n ...metadata,\n edit: metadata.edit\n ? {\n ...metadata.edit,\n mainField:\n typeof metadata.edit.mainField === 'string'\n ? (targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField)\n : metadata.edit.mainField,\n }\n : metadata.edit,\n list: metadata.list\n ? {\n ...metadata.list,\n mainField:\n typeof metadata.list.mainField === 'string'\n ? (targetRenames[metadata.list.mainField] ?? metadata.list.mainField)\n : metadata.list.mainField,\n }\n : metadata.list,\n };\n }\n\n return next;\n};\n\n/**\n * Rewrites one stored Content Manager configuration for a rename save.\n *\n * Returns null when there is nothing to store. A model that has never been\n * opened still gets a configuration when one of its own attributes was\n * renamed, so the browser can repair a column list saved before the rename.\n */\nconst rewriteContentManagerConfiguration = (\n configuration: StoredConfiguration | null | undefined,\n {\n attributes,\n ownRenames = {},\n allRenames,\n }: {\n attributes?: Record<string, RelationAttribute>;\n ownRenames?: Record<string, string>;\n allRenames: Record<string, Record<string, string>>;\n }\n): StoredConfiguration | null => {\n const hasOwnRenames = Object.keys(ownRenames).length > 0;\n\n if (!configuration && !hasOwnRenames) {\n return null;\n }\n\n const current = configuration ?? {};\n const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);\n const metadatas = renameRelationMainFields(\n renameMetadata(current.metadatas ?? {}, ownRenames),\n attributes,\n allRenames\n );\n const next: StoredConfiguration = {\n ...current,\n settings: current.settings\n ? {\n ...current.settings,\n mainField: renamePath(current.settings.mainField, ownRenames),\n defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames),\n }\n : current.settings,\n metadatas,\n layouts: current.layouts\n ? {\n ...current.layouts,\n ...(Array.isArray(current.layouts.list)\n ? { list: replaceNames(current.layouts.list, ownRenames) }\n : {}),\n ...(Array.isArray(current.layouts.edit)\n ? {\n edit: current.layouts.edit.map((row) =>\n row.map((field) => ({ ...field, name: ownRenames[field.name] ?? field.name }))\n ),\n }\n : {}),\n ...(Array.isArray(current.layouts.editRelations)\n ? { editRelations: replaceNames(current.layouts.editRelations, ownRenames) }\n : {}),\n }\n : current.layouts,\n };\n\n if (Object.keys(attributeRenames).length > 0) {\n next.attributeRenames = attributeRenames;\n } else {\n delete next.attributeRenames;\n }\n\n return next;\n};\n\nexport { composeAttributeRenames, rewriteContentManagerConfiguration };\nexport type { StoredConfiguration };\n"],"names":["composeAttributeRenames","previous","next","composed","from","to","Object","entries","renamePath","path","renames","head","rest","split","length","join","replaceNames","names","seen","Set","name","renamed","has","add","push","movedMetadata","metadata","edit","label","list","renameMetadata","metadatas","renameRelationMainFields","attributes","allRenames","attribute","type","targetRenames","target","targetModel","mainField","rewriteContentManagerConfiguration","configuration","ownRenames","hasOwnRenames","keys","current","attributeRenames","settings","defaultSortBy","layouts","Array","isArray","map","row","field","editRelations"],"mappings":";;AAAA;;;;IAKA,MAAMA,0BAA0B,CAC9BC,QAAAA,GAAmC,EAAE,EACrCC,IAAAA,GAA+B,EAAE,GAAA;AAEjC,IAAA,MAAMC,WAAmC,EAAC;IAE1C,KAAK,MAAM,CAACC,IAAAA,EAAMC,EAAAA,CAAG,IAAIC,MAAAA,CAAOC,OAAO,CAACN,QAAAA,CAAAA,CAAW;AACjDE,QAAAA,QAAQ,CAACC,IAAAA,CAAK,GAAGF,IAAI,CAACG,GAAG,IAAIA,EAAAA;AAC/B,IAAA;IAEA,KAAK,MAAM,CAACD,IAAAA,EAAMC,EAAAA,CAAG,IAAIC,MAAAA,CAAOC,OAAO,CAACL,IAAAA,CAAAA,CAAO;QAC7CC,QAAQ,CAACC,KAAK,GAAGC,EAAAA;AACnB,IAAA;IAEA,KAAK,MAAM,CAACD,IAAAA,EAAMC,EAAAA,CAAG,IAAIC,MAAAA,CAAOC,OAAO,CAACJ,QAAAA,CAAAA,CAAW;AACjD,QAAA,IAAIC,SAASC,EAAAA,EAAI;YACf,OAAOF,QAAQ,CAACC,IAAAA,CAAK;AACvB,QAAA;AACF,IAAA;IAEA,OAAOD,QAAAA;AACT;AAEA,MAAMK,UAAAA,GAAa,CACjBC,IAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAOA,IAAAA;AACT,IAAA;IAEA,IAAIC,OAAO,CAACD,IAAAA,CAAK,EAAE;QACjB,OAAOC,OAAO,CAACD,IAAAA,CAAK;AACtB,IAAA;AAEA,IAAA,MAAM,CAACE,IAAAA,EAAM,GAAGC,KAAK,GAAGH,IAAAA,CAAKI,KAAK,CAAC,GAAA,CAAA;AAEnC,IAAA,IAAID,KAAKE,MAAM,GAAG,KAAKJ,OAAO,CAACC,KAAK,EAAE;QACpC,OAAO;AAACD,YAAAA,OAAO,CAACC,IAAAA,CAAK;AAAKC,YAAAA,GAAAA;AAAK,SAAA,CAACG,IAAI,CAAC,GAAA,CAAA;AACvC,IAAA;IAEA,OAAON,IAAAA;AACT,CAAA;AA8BA,MAAMO,YAAAA,GAAe,CAACC,KAAAA,EAAiBP,OAAAA,GAAAA;AACrC,IAAA,MAAMQ,OAAO,IAAIC,GAAAA,EAAAA;AACjB,IAAA,MAAMjB,OAAiB,EAAE;IAEzB,KAAK,MAAMkB,QAAQH,KAAAA,CAAO;AACxB,QAAA,MAAMI,OAAAA,GAAUX,OAAO,CAACU,IAAAA,CAAK,IAAIA,IAAAA;QAEjC,IAAIF,IAAAA,CAAKI,GAAG,CAACD,OAAAA,CAAAA,EAAU;AACrB,YAAA;AACF,QAAA;AAEAH,QAAAA,IAAAA,CAAKK,GAAG,CAACF,OAAAA,CAAAA;AACTnB,QAAAA,IAAAA,CAAKsB,IAAI,CAACH,OAAAA,CAAAA;AACZ,IAAA;IAEA,OAAOnB,IAAAA;AACT,CAAA;AAEA,MAAMuB,aAAAA,GAAgB,CAACC,QAAAA,EAAyBtB,IAAAA,EAAcC,EAAAA,GAAAA;IAC5D,OAAO;AACL,QAAA,GAAGqB,QAAQ;QACXC,IAAAA,EAAMD,QAAAA,CAASC,IAAI,GACf;AAAE,YAAA,GAAGD,SAASC,IAAI;YAAEC,KAAAA,EAAOF,QAAAA,CAASC,IAAI,CAACC,KAAK,KAAKxB,OAAOC,EAAAA,GAAKqB,QAAAA,CAASC,IAAI,CAACC;AAAM,SAAA,GACnFF,SAASC,IAAI;QACjBE,IAAAA,EAAMH,QAAAA,CAASG,IAAI,GACf;AAAE,YAAA,GAAGH,SAASG,IAAI;YAAED,KAAAA,EAAOF,QAAAA,CAASG,IAAI,CAACD,KAAK,KAAKxB,OAAOC,EAAAA,GAAKqB,QAAAA,CAASG,IAAI,CAACD;AAAM,SAAA,GACnFF,SAASG;AACf,KAAA;AACF,CAAA;AAEA;;;;IAKA,MAAMC,cAAAA,GAAiB,CACrBC,SAAAA,EACArB,OAAAA,GAAAA;AAEA,IAAA,MAAMR,OAAsC,EAAC;IAE7C,KAAK,MAAM,CAACkB,IAAAA,EAAMM,QAAAA,CAAS,IAAIpB,MAAAA,CAAOC,OAAO,CAACwB,SAAAA,CAAAA,CAAY;QACxD,MAAM1B,EAAAA,GAAKK,OAAO,CAACU,IAAAA,CAAK;AAExB,QAAA,IAAI,CAACf,EAAAA,IAAMA,EAAAA,KAAOe,QAAQlB,IAAI,CAACG,GAAG,EAAE;AAClC,YAAA;AACF,QAAA;AAEAH,QAAAA,IAAI,CAACG,EAAAA,CAAG,GAAGoB,aAAAA,CAAcC,UAAUN,IAAAA,EAAMf,EAAAA,CAAAA;AAC3C,IAAA;IAEA,KAAK,MAAM,CAACe,IAAAA,EAAMM,QAAAA,CAAS,IAAIpB,MAAAA,CAAOC,OAAO,CAACwB,SAAAA,CAAAA,CAAY;QACxD,MAAM1B,EAAAA,GAAKK,OAAO,CAACU,IAAAA,CAAK;AAExB,QAAA,IAAI,EAACf,IAAMA,EAAAA,KAAOe,QAASlB,IAAI,CAACkB,KAAK,EAAE;AACrC,YAAA;AACF,QAAA;QAEAlB,IAAI,CAACkB,KAAK,GAAGM,QAAAA;AACf,IAAA;IAEA,OAAOxB,IAAAA;AACT,CAAA;AAEA;;;AAGC,IACD,MAAM8B,wBAAAA,GAA2B,CAC/BD,SAAAA,EACAE,UAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,MAAMhC,IAAAA,GAAsC;AAAE,QAAA,GAAG6B;AAAU,KAAA;IAE3D,KAAK,MAAM,CAACX,IAAAA,EAAMe,SAAAA,CAAU,IAAI7B,OAAOC,OAAO,CAAC0B,UAAAA,IAAc,EAAC,CAAA,CAAI;QAChE,IAAIE,SAAAA,EAAWC,SAAS,UAAA,EAAY;AAClC,YAAA;AACF,QAAA;QAEA,MAAMC,aAAAA,GAAgBH,UAAU,CAACC,SAAAA,CAAUG,MAAM,IAAIH,SAAAA,CAAUI,WAAW,IAAI,EAAA,CAAG;QACjF,MAAMb,QAAAA,GAAWxB,IAAI,CAACkB,IAAAA,CAAK;QAE3B,IAAI,CAACiB,aAAAA,IAAiB,CAACX,QAAAA,EAAU;AAC/B,YAAA;AACF,QAAA;QAEAxB,IAAI,CAACkB,KAAK,GAAG;AACX,YAAA,GAAGM,QAAQ;YACXC,IAAAA,EAAMD,QAAAA,CAASC,IAAI,GACf;AACE,gBAAA,GAAGD,SAASC,IAAI;gBAChBa,SAAAA,EACE,OAAOd,SAASC,IAAI,CAACa,SAAS,KAAK,QAAA,GAC9BH,aAAa,CAACX,QAAAA,CAASC,IAAI,CAACa,SAAS,CAAC,IAAId,QAAAA,CAASC,IAAI,CAACa,SAAS,GAClEd,QAAAA,CAASC,IAAI,CAACa;AACtB,aAAA,GACAd,SAASC,IAAI;YACjBE,IAAAA,EAAMH,QAAAA,CAASG,IAAI,GACf;AACE,gBAAA,GAAGH,SAASG,IAAI;gBAChBW,SAAAA,EACE,OAAOd,SAASG,IAAI,CAACW,SAAS,KAAK,QAAA,GAC9BH,aAAa,CAACX,QAAAA,CAASG,IAAI,CAACW,SAAS,CAAC,IAAId,QAAAA,CAASG,IAAI,CAACW,SAAS,GAClEd,QAAAA,CAASG,IAAI,CAACW;AACtB,aAAA,GACAd,SAASG;AACf,SAAA;AACF,IAAA;IAEA,OAAO3B,IAAAA;AACT,CAAA;AAEA;;;;;;AAMC,IACD,MAAMuC,kCAAAA,GAAqC,CACzCC,aAAAA,EACA,EACET,UAAU,EACVU,UAAAA,GAAa,EAAE,EACfT,UAAU,EAKX,GAAA;AAED,IAAA,MAAMU,gBAAgBtC,MAAAA,CAAOuC,IAAI,CAACF,UAAAA,CAAAA,CAAY7B,MAAM,GAAG,CAAA;IAEvD,IAAI,CAAC4B,aAAAA,IAAiB,CAACE,aAAAA,EAAe;QACpC,OAAO,IAAA;AACT,IAAA;IAEA,MAAME,OAAAA,GAAUJ,iBAAiB,EAAC;AAClC,IAAA,MAAMK,gBAAAA,GAAmB/C,uBAAAA,CAAwB8C,OAAAA,CAAQC,gBAAgB,EAAEJ,UAAAA,CAAAA;IAC3E,MAAMZ,SAAAA,GAAYC,yBAChBF,cAAAA,CAAegB,OAAAA,CAAQf,SAAS,IAAI,EAAC,EAAGY,UAAAA,CAAAA,EACxCV,UAAAA,EACAC,UAAAA,CAAAA;AAEF,IAAA,MAAMhC,IAAAA,GAA4B;AAChC,QAAA,GAAG4C,OAAO;QACVE,QAAAA,EAAUF,OAAAA,CAAQE,QAAQ,GACtB;AACE,YAAA,GAAGF,QAAQE,QAAQ;AACnBR,YAAAA,SAAAA,EAAWhC,UAAAA,CAAWsC,OAAAA,CAAQE,QAAQ,CAACR,SAAS,EAAEG,UAAAA,CAAAA;AAClDM,YAAAA,aAAAA,EAAezC,UAAAA,CAAWsC,OAAAA,CAAQE,QAAQ,CAACC,aAAa,EAAEN,UAAAA;AAC5D,SAAA,GACAG,QAAQE,QAAQ;AACpBjB,QAAAA,SAAAA;QACAmB,OAAAA,EAASJ,OAAAA,CAAQI,OAAO,GACpB;AACE,YAAA,GAAGJ,QAAQI,OAAO;AAClB,YAAA,GAAIC,MAAMC,OAAO,CAACN,QAAQI,OAAO,CAACrB,IAAI,CAAA,GAClC;AAAEA,gBAAAA,IAAAA,EAAMb,YAAAA,CAAa8B,OAAAA,CAAQI,OAAO,CAACrB,IAAI,EAAEc,UAAAA;AAAY,aAAA,GACvD,EAAE;AACN,YAAA,GAAIQ,MAAMC,OAAO,CAACN,QAAQI,OAAO,CAACvB,IAAI,CAAA,GAClC;AACEA,gBAAAA,IAAAA,EAAMmB,OAAAA,CAAQI,OAAO,CAACvB,IAAI,CAAC0B,GAAG,CAAC,CAACC,GAAAA,GAC9BA,GAAAA,CAAID,GAAG,CAAC,CAACE,SAAW;AAAE,4BAAA,GAAGA,KAAK;AAAEnC,4BAAAA,IAAAA,EAAMuB,UAAU,CAACY,KAAAA,CAAMnC,IAAI,CAAC,IAAImC,MAAMnC;yBAAK,CAAA,CAAA;AAE/E,aAAA,GACA,EAAE;AACN,YAAA,GAAI+B,MAAMC,OAAO,CAACN,QAAQI,OAAO,CAACM,aAAa,CAAA,GAC3C;AAAEA,gBAAAA,aAAAA,EAAexC,YAAAA,CAAa8B,OAAAA,CAAQI,OAAO,CAACM,aAAa,EAAEb,UAAAA;AAAY,aAAA,GACzE;AACN,SAAA,GACAG,QAAQI;AACd,KAAA;AAEA,IAAA,IAAI5C,OAAOuC,IAAI,CAACE,gBAAAA,CAAAA,CAAkBjC,MAAM,GAAG,CAAA,EAAG;AAC5CZ,QAAAA,IAAAA,CAAK6C,gBAAgB,GAAGA,gBAAAA;IAC1B,CAAA,MAAO;AACL,QAAA,OAAO7C,KAAK6C,gBAAgB;AAC9B,IAAA;IAEA,OAAO7C,IAAAA;AACT;;;;;"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Old attribute name to the name it has after this save and every earlier
3
+ * save whose map is still stored. Identity entries are omitted: a field that
4
+ * was renamed back to its original name must not keep rewriting itself.
5
+ */ const composeAttributeRenames = (previous = {}, next = {})=>{
6
+ const composed = {};
7
+ for (const [from, to] of Object.entries(previous)){
8
+ composed[from] = next[to] ?? to;
9
+ }
10
+ for (const [from, to] of Object.entries(next)){
11
+ composed[from] = to;
12
+ }
13
+ for (const [from, to] of Object.entries(composed)){
14
+ if (from === to) {
15
+ delete composed[from];
16
+ }
17
+ }
18
+ return composed;
19
+ };
20
+ const renamePath = (path, renames)=>{
21
+ if (!path) {
22
+ return path;
23
+ }
24
+ if (renames[path]) {
25
+ return renames[path];
26
+ }
27
+ const [head, ...rest] = path.split('.');
28
+ if (rest.length > 0 && renames[head]) {
29
+ return [
30
+ renames[head],
31
+ ...rest
32
+ ].join('.');
33
+ }
34
+ return path;
35
+ };
36
+ const replaceNames = (names, renames)=>{
37
+ const seen = new Set();
38
+ const next = [];
39
+ for (const name of names){
40
+ const renamed = renames[name] ?? name;
41
+ if (seen.has(renamed)) {
42
+ continue;
43
+ }
44
+ seen.add(renamed);
45
+ next.push(renamed);
46
+ }
47
+ return next;
48
+ };
49
+ const movedMetadata = (metadata, from, to)=>{
50
+ return {
51
+ ...metadata,
52
+ edit: metadata.edit ? {
53
+ ...metadata.edit,
54
+ label: metadata.edit.label === from ? to : metadata.edit.label
55
+ } : metadata.edit,
56
+ list: metadata.list ? {
57
+ ...metadata.list,
58
+ label: metadata.list.label === from ? to : metadata.list.label
59
+ } : metadata.list
60
+ };
61
+ };
62
+ /**
63
+ * One pass over the original metadata. Applying the map in place deletes one
64
+ * side of a swap (`title -> slug`, `slug -> title`), because the destination
65
+ * key is still occupied when the source is moved.
66
+ */ const renameMetadata = (metadatas, renames)=>{
67
+ const next = {};
68
+ for (const [name, metadata] of Object.entries(metadatas)){
69
+ const to = renames[name];
70
+ if (!to || to === name || next[to]) {
71
+ continue;
72
+ }
73
+ next[to] = movedMetadata(metadata, name, to);
74
+ }
75
+ for (const [name, metadata] of Object.entries(metadatas)){
76
+ const to = renames[name];
77
+ if (to && to !== name || next[name]) {
78
+ continue;
79
+ }
80
+ next[name] = metadata;
81
+ }
82
+ return next;
83
+ };
84
+ /**
85
+ * A relation's `mainField` names a field on the target, so a rename of that
86
+ * target has to be applied from the configuration of whoever owns the relation.
87
+ */ const renameRelationMainFields = (metadatas, attributes, allRenames)=>{
88
+ const next = {
89
+ ...metadatas
90
+ };
91
+ for (const [name, attribute] of Object.entries(attributes ?? {})){
92
+ if (attribute?.type !== 'relation') {
93
+ continue;
94
+ }
95
+ const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];
96
+ const metadata = next[name];
97
+ if (!targetRenames || !metadata) {
98
+ continue;
99
+ }
100
+ next[name] = {
101
+ ...metadata,
102
+ edit: metadata.edit ? {
103
+ ...metadata.edit,
104
+ mainField: typeof metadata.edit.mainField === 'string' ? targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField : metadata.edit.mainField
105
+ } : metadata.edit,
106
+ list: metadata.list ? {
107
+ ...metadata.list,
108
+ mainField: typeof metadata.list.mainField === 'string' ? targetRenames[metadata.list.mainField] ?? metadata.list.mainField : metadata.list.mainField
109
+ } : metadata.list
110
+ };
111
+ }
112
+ return next;
113
+ };
114
+ /**
115
+ * Rewrites one stored Content Manager configuration for a rename save.
116
+ *
117
+ * Returns null when there is nothing to store. A model that has never been
118
+ * opened still gets a configuration when one of its own attributes was
119
+ * renamed, so the browser can repair a column list saved before the rename.
120
+ */ const rewriteContentManagerConfiguration = (configuration, { attributes, ownRenames = {}, allRenames })=>{
121
+ const hasOwnRenames = Object.keys(ownRenames).length > 0;
122
+ if (!configuration && !hasOwnRenames) {
123
+ return null;
124
+ }
125
+ const current = configuration ?? {};
126
+ const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);
127
+ const metadatas = renameRelationMainFields(renameMetadata(current.metadatas ?? {}, ownRenames), attributes, allRenames);
128
+ const next = {
129
+ ...current,
130
+ settings: current.settings ? {
131
+ ...current.settings,
132
+ mainField: renamePath(current.settings.mainField, ownRenames),
133
+ defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames)
134
+ } : current.settings,
135
+ metadatas,
136
+ layouts: current.layouts ? {
137
+ ...current.layouts,
138
+ ...Array.isArray(current.layouts.list) ? {
139
+ list: replaceNames(current.layouts.list, ownRenames)
140
+ } : {},
141
+ ...Array.isArray(current.layouts.edit) ? {
142
+ edit: current.layouts.edit.map((row)=>row.map((field)=>({
143
+ ...field,
144
+ name: ownRenames[field.name] ?? field.name
145
+ })))
146
+ } : {},
147
+ ...Array.isArray(current.layouts.editRelations) ? {
148
+ editRelations: replaceNames(current.layouts.editRelations, ownRenames)
149
+ } : {}
150
+ } : current.layouts
151
+ };
152
+ if (Object.keys(attributeRenames).length > 0) {
153
+ next.attributeRenames = attributeRenames;
154
+ } else {
155
+ delete next.attributeRenames;
156
+ }
157
+ return next;
158
+ };
159
+
160
+ export { composeAttributeRenames, rewriteContentManagerConfiguration };
161
+ //# sourceMappingURL=attribute-renames.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-renames.mjs","sources":["../../../../../server/src/services/utils/configuration/attribute-renames.ts"],"sourcesContent":["/**\n * Old attribute name to the name it has after this save and every earlier\n * save whose map is still stored. Identity entries are omitted: a field that\n * was renamed back to its original name must not keep rewriting itself.\n */\nconst composeAttributeRenames = (\n previous: Record<string, string> = {},\n next: Record<string, string> = {}\n): Record<string, string> => {\n const composed: Record<string, string> = {};\n\n for (const [from, to] of Object.entries(previous)) {\n composed[from] = next[to] ?? to;\n }\n\n for (const [from, to] of Object.entries(next)) {\n composed[from] = to;\n }\n\n for (const [from, to] of Object.entries(composed)) {\n if (from === to) {\n delete composed[from];\n }\n }\n\n return composed;\n};\n\nconst renamePath = (\n path: string | undefined,\n renames: Record<string, string>\n): string | undefined => {\n if (!path) {\n return path;\n }\n\n if (renames[path]) {\n return renames[path];\n }\n\n const [head, ...rest] = path.split('.');\n\n if (rest.length > 0 && renames[head]) {\n return [renames[head], ...rest].join('.');\n }\n\n return path;\n};\n\ntype FieldMetadata = {\n edit?: { label?: string; mainField?: unknown; [key: string]: unknown };\n list?: { label?: string; mainField?: unknown; [key: string]: unknown };\n};\n\ntype StoredConfiguration = {\n settings?: {\n mainField?: string;\n defaultSortBy?: string;\n [key: string]: unknown;\n };\n metadatas?: Record<string, FieldMetadata>;\n layouts?: {\n list?: string[];\n edit?: { name: string; size: number }[][];\n editRelations?: string[];\n [key: string]: unknown;\n };\n attributeRenames?: Record<string, string>;\n [key: string]: unknown;\n};\n\ntype RelationAttribute = {\n type?: string;\n target?: string;\n targetModel?: string;\n};\n\nconst replaceNames = (names: string[], renames: Record<string, string>): string[] => {\n const seen = new Set<string>();\n const next: string[] = [];\n\n for (const name of names) {\n const renamed = renames[name] ?? name;\n\n if (seen.has(renamed)) {\n continue;\n }\n\n seen.add(renamed);\n next.push(renamed);\n }\n\n return next;\n};\n\nconst movedMetadata = (metadata: FieldMetadata, from: string, to: string): FieldMetadata => {\n return {\n ...metadata,\n edit: metadata.edit\n ? { ...metadata.edit, label: metadata.edit.label === from ? to : metadata.edit.label }\n : metadata.edit,\n list: metadata.list\n ? { ...metadata.list, label: metadata.list.label === from ? to : metadata.list.label }\n : metadata.list,\n };\n};\n\n/**\n * One pass over the original metadata. Applying the map in place deletes one\n * side of a swap (`title -> slug`, `slug -> title`), because the destination\n * key is still occupied when the source is moved.\n */\nconst renameMetadata = (\n metadatas: Record<string, FieldMetadata>,\n renames: Record<string, string>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = {};\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if (!to || to === name || next[to]) {\n continue;\n }\n\n next[to] = movedMetadata(metadata, name, to);\n }\n\n for (const [name, metadata] of Object.entries(metadatas)) {\n const to = renames[name];\n\n if ((to && to !== name) || next[name]) {\n continue;\n }\n\n next[name] = metadata;\n }\n\n return next;\n};\n\n/**\n * A relation's `mainField` names a field on the target, so a rename of that\n * target has to be applied from the configuration of whoever owns the relation.\n */\nconst renameRelationMainFields = (\n metadatas: Record<string, FieldMetadata>,\n attributes: Record<string, RelationAttribute> | undefined,\n allRenames: Record<string, Record<string, string>>\n): Record<string, FieldMetadata> => {\n const next: Record<string, FieldMetadata> = { ...metadatas };\n\n for (const [name, attribute] of Object.entries(attributes ?? {})) {\n if (attribute?.type !== 'relation') {\n continue;\n }\n\n const targetRenames = allRenames[attribute.target ?? attribute.targetModel ?? ''];\n const metadata = next[name];\n\n if (!targetRenames || !metadata) {\n continue;\n }\n\n next[name] = {\n ...metadata,\n edit: metadata.edit\n ? {\n ...metadata.edit,\n mainField:\n typeof metadata.edit.mainField === 'string'\n ? (targetRenames[metadata.edit.mainField] ?? metadata.edit.mainField)\n : metadata.edit.mainField,\n }\n : metadata.edit,\n list: metadata.list\n ? {\n ...metadata.list,\n mainField:\n typeof metadata.list.mainField === 'string'\n ? (targetRenames[metadata.list.mainField] ?? metadata.list.mainField)\n : metadata.list.mainField,\n }\n : metadata.list,\n };\n }\n\n return next;\n};\n\n/**\n * Rewrites one stored Content Manager configuration for a rename save.\n *\n * Returns null when there is nothing to store. A model that has never been\n * opened still gets a configuration when one of its own attributes was\n * renamed, so the browser can repair a column list saved before the rename.\n */\nconst rewriteContentManagerConfiguration = (\n configuration: StoredConfiguration | null | undefined,\n {\n attributes,\n ownRenames = {},\n allRenames,\n }: {\n attributes?: Record<string, RelationAttribute>;\n ownRenames?: Record<string, string>;\n allRenames: Record<string, Record<string, string>>;\n }\n): StoredConfiguration | null => {\n const hasOwnRenames = Object.keys(ownRenames).length > 0;\n\n if (!configuration && !hasOwnRenames) {\n return null;\n }\n\n const current = configuration ?? {};\n const attributeRenames = composeAttributeRenames(current.attributeRenames, ownRenames);\n const metadatas = renameRelationMainFields(\n renameMetadata(current.metadatas ?? {}, ownRenames),\n attributes,\n allRenames\n );\n const next: StoredConfiguration = {\n ...current,\n settings: current.settings\n ? {\n ...current.settings,\n mainField: renamePath(current.settings.mainField, ownRenames),\n defaultSortBy: renamePath(current.settings.defaultSortBy, ownRenames),\n }\n : current.settings,\n metadatas,\n layouts: current.layouts\n ? {\n ...current.layouts,\n ...(Array.isArray(current.layouts.list)\n ? { list: replaceNames(current.layouts.list, ownRenames) }\n : {}),\n ...(Array.isArray(current.layouts.edit)\n ? {\n edit: current.layouts.edit.map((row) =>\n row.map((field) => ({ ...field, name: ownRenames[field.name] ?? field.name }))\n ),\n }\n : {}),\n ...(Array.isArray(current.layouts.editRelations)\n ? { editRelations: replaceNames(current.layouts.editRelations, ownRenames) }\n : {}),\n }\n : current.layouts,\n };\n\n if (Object.keys(attributeRenames).length > 0) {\n next.attributeRenames = attributeRenames;\n } else {\n delete next.attributeRenames;\n }\n\n return next;\n};\n\nexport { composeAttributeRenames, rewriteContentManagerConfiguration };\nexport type { StoredConfiguration };\n"],"names":["composeAttributeRenames","previous","next","composed","from","to","Object","entries","renamePath","path","renames","head","rest","split","length","join","replaceNames","names","seen","Set","name","renamed","has","add","push","movedMetadata","metadata","edit","label","list","renameMetadata","metadatas","renameRelationMainFields","attributes","allRenames","attribute","type","targetRenames","target","targetModel","mainField","rewriteContentManagerConfiguration","configuration","ownRenames","hasOwnRenames","keys","current","attributeRenames","settings","defaultSortBy","layouts","Array","isArray","map","row","field","editRelations"],"mappings":"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"}
@@ -9,31 +9,31 @@ var ___default = /*#__PURE__*/_interopDefault(_);
9
9
 
10
10
  const { getNonVisibleAttributes, getWritableAttributes } = strapiUtils.contentTypes;
11
11
  const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = strapiUtils.contentTypes.constants;
12
- const NON_SORTABLES = [
12
+ const NON_SORTABLES = new Set([
13
13
  'component',
14
14
  'json',
15
15
  'media',
16
16
  'richtext',
17
17
  'dynamiczone',
18
18
  'blocks'
19
- ];
20
- const SORTABLE_RELATIONS = [
19
+ ]);
20
+ const SORTABLE_RELATIONS = new Set([
21
21
  'oneToOne',
22
22
  'manyToOne'
23
- ];
24
- const NON_LISTABLES = [
23
+ ]);
24
+ const NON_LISTABLES = new Set([
25
25
  'json',
26
26
  'password',
27
27
  'richtext',
28
28
  'dynamiczone',
29
29
  'blocks'
30
- ];
31
- const LISTABLE_RELATIONS = [
30
+ ]);
31
+ const LISTABLE_RELATIONS = new Set([
32
32
  'oneToOne',
33
33
  'oneToMany',
34
34
  'manyToOne',
35
35
  'manyToMany'
36
- ];
36
+ ]);
37
37
  // hidden fields are fields that are configured to be hidden from list, and edit views
38
38
  const isHidden = (schema, name)=>{
39
39
  if (!___default.default.has(schema.attributes, name)) {
@@ -58,10 +58,10 @@ const isListable = (schema, name)=>{
58
58
  return false;
59
59
  }
60
60
  const attribute = schema.attributes[name];
61
- if (NON_LISTABLES.includes(attribute.type)) {
61
+ if (NON_LISTABLES.has(attribute.type)) {
62
62
  return false;
63
63
  }
64
- if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {
64
+ if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {
65
65
  return false;
66
66
  }
67
67
  return true;
@@ -72,10 +72,10 @@ const isSortable = (schema, name)=>{
72
72
  }
73
73
  if (schema.modelType === 'component' && name === 'id') return false;
74
74
  const attribute = schema.attributes[name];
75
- if (NON_SORTABLES.includes(attribute.type)) {
75
+ if (NON_SORTABLES.has(attribute.type)) {
76
76
  return false;
77
77
  }
78
- if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {
78
+ if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {
79
79
  return false;
80
80
  }
81
81
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
1
+ {"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = new Set(['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks']);\nconst SORTABLE_RELATIONS = new Set(['oneToOne', 'manyToOne']);\n\nconst NON_LISTABLES = new Set(['json', 'password', 'richtext', 'dynamiczone', 'blocks']);\nconst LISTABLE_RELATIONS = new Set(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany']);\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","Set","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","includes","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
@@ -3,31 +3,31 @@ import { contentTypes } from '@strapi/utils';
3
3
 
4
4
  const { getNonVisibleAttributes, getWritableAttributes } = contentTypes;
5
5
  const { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypes.constants;
6
- const NON_SORTABLES = [
6
+ const NON_SORTABLES = new Set([
7
7
  'component',
8
8
  'json',
9
9
  'media',
10
10
  'richtext',
11
11
  'dynamiczone',
12
12
  'blocks'
13
- ];
14
- const SORTABLE_RELATIONS = [
13
+ ]);
14
+ const SORTABLE_RELATIONS = new Set([
15
15
  'oneToOne',
16
16
  'manyToOne'
17
- ];
18
- const NON_LISTABLES = [
17
+ ]);
18
+ const NON_LISTABLES = new Set([
19
19
  'json',
20
20
  'password',
21
21
  'richtext',
22
22
  'dynamiczone',
23
23
  'blocks'
24
- ];
25
- const LISTABLE_RELATIONS = [
24
+ ]);
25
+ const LISTABLE_RELATIONS = new Set([
26
26
  'oneToOne',
27
27
  'oneToMany',
28
28
  'manyToOne',
29
29
  'manyToMany'
30
- ];
30
+ ]);
31
31
  // hidden fields are fields that are configured to be hidden from list, and edit views
32
32
  const isHidden = (schema, name)=>{
33
33
  if (!_.has(schema.attributes, name)) {
@@ -52,10 +52,10 @@ const isListable = (schema, name)=>{
52
52
  return false;
53
53
  }
54
54
  const attribute = schema.attributes[name];
55
- if (NON_LISTABLES.includes(attribute.type)) {
55
+ if (NON_LISTABLES.has(attribute.type)) {
56
56
  return false;
57
57
  }
58
- if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {
58
+ if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {
59
59
  return false;
60
60
  }
61
61
  return true;
@@ -66,10 +66,10 @@ const isSortable = (schema, name)=>{
66
66
  }
67
67
  if (schema.modelType === 'component' && name === 'id') return false;
68
68
  const attribute = schema.attributes[name];
69
- if (NON_SORTABLES.includes(attribute.type)) {
69
+ if (NON_SORTABLES.has(attribute.type)) {
70
70
  return false;
71
71
  }
72
- if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {
72
+ if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {
73
73
  return false;
74
74
  }
75
75
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
1
+ {"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = new Set(['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks']);\nconst SORTABLE_RELATIONS = new Set(['oneToOne', 'manyToOne']);\n\nconst NON_LISTABLES = new Set(['json', 'password', 'richtext', 'dynamiczone', 'blocks']);\nconst LISTABLE_RELATIONS = new Set(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany']);\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.has(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.has(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","Set","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","includes","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}