@griddo/ax 1.69.9 → 1.72.1

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 (165) hide show
  1. package/config/jest/componentsMock.js +0 -26
  2. package/package.json +4 -3
  3. package/src/Style/index.tsx +1 -1
  4. package/src/__tests__/components/ElementsTooltip/ElementsTooltip.test.tsx +97 -0
  5. package/src/__tests__/components/EmptyState/EmptyState.test.tsx +78 -0
  6. package/src/__tests__/components/FieldContainer/FieldContainer.test.tsx +82 -0
  7. package/src/__tests__/components/Fields/AnalyticsField/AnalyticsField.test.tsx +1 -1
  8. package/src/__tests__/components/Fields/AnalyticsField/PageAnalytics/PageAnalytics.test.tsx +1 -15
  9. package/src/__tests__/components/Fields/AnalyticsField/StructuredDataAnalytics/StructuredDataAnalytics.test.tsx +1 -16
  10. package/src/__tests__/components/Fields/ArrayFieldGroup/ArrayFieldGroup.test.tsx +8 -17
  11. package/src/__tests__/components/Fields/AsyncCheckGroup/AsyncCheckGroup.test.tsx +4 -16
  12. package/src/__tests__/components/Fields/AsyncSelect/AsyncSelect.test.tsx +2 -20
  13. package/src/__tests__/components/Fields/CheckField/CheckField.test.tsx +6 -6
  14. package/src/__tests__/components/Fields/CheckGroup/CheckGroup.test.tsx +15 -15
  15. package/src/__tests__/components/Fields/ColorPicker/ColorPicker.test.tsx +7 -16
  16. package/src/__tests__/components/Fields/ComponentArray/ComponentArray.test.tsx +2 -23
  17. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/MixableComponentArray.test.tsx +11 -31
  18. package/src/__tests__/components/Fields/ComponentArray/MixableComponentArray/PasteModuleButton/PasteModuleButton.test.tsx +15 -21
  19. package/src/__tests__/components/Fields/ComponentArray/SameComponentArray/SameComponentArray.test.tsx +6 -25
  20. package/src/__tests__/components/Fields/ComponentContainer/ComponentContainer.test.tsx +559 -0
  21. package/src/__tests__/components/Fields/ConditionalField/ConditionalField.test.tsx +1 -1
  22. package/src/__tests__/components/Fields/DateField/DateField.test.tsx +1 -1
  23. package/src/__tests__/components/Fields/FieldGroup/FieldGroup.test.tsx +1 -1
  24. package/src/__tests__/components/Fields/FieldsDivider/FieldsDivider.test.tsx +1 -1
  25. package/src/__tests__/components/Fields/FileField/FileField.test.tsx +3 -3
  26. package/src/__tests__/components/Fields/HeadingField/HeadingField.test.tsx +6 -6
  27. package/src/__tests__/components/Fields/HiddenField/HiddenField.test.tsx +2 -8
  28. package/src/__tests__/components/Fields/ImageField/ImageField.test.tsx +471 -0
  29. package/src/__tests__/components/Fields/MultiCheckSelect/MultiCheckSelect.test.tsx +2 -16
  30. package/src/__tests__/components/Fields/MultiCheckSelectGroup/MultiCheckSelectGroup.test.tsx +2 -2
  31. package/src/__tests__/components/Fields/NoteField/NoteField.test.tsx +2 -7
  32. package/src/__tests__/components/Fields/NumberField/NumberField.test.tsx +2 -15
  33. package/src/__tests__/components/Fields/RadioField/RadioField.test.tsx +2 -12
  34. package/src/__tests__/components/Fields/ReferenceField/ReferenceField.test.tsx +171 -19
  35. package/src/__tests__/components/Fields/RichText/RichText.test.tsx +2 -13
  36. package/src/__tests__/components/Fields/Select/Select.test.tsx +3 -23
  37. package/src/__tests__/components/Fields/SliderField/SliderField.test.tsx +2 -15
  38. package/src/__tests__/components/Fields/TagField/TagField.test.tsx +4 -4
  39. package/src/__tests__/components/Fields/TextArea/TextArea.test.tsx +1 -1
  40. package/src/__tests__/components/Fields/TextField/TextField.test.tsx +6 -6
  41. package/src/__tests__/components/Fields/TimeField/HourInput/HourInput.test.tsx +142 -0
  42. package/src/__tests__/components/Fields/TimeField/TimeField.test.tsx +100 -0
  43. package/src/__tests__/components/Fields/ToggleField/ToggleField.test.tsx +2 -10
  44. package/src/__tests__/components/Fields/Tooltip/Tooltip.test.tsx +152 -0
  45. package/src/__tests__/components/Fields/UniqueCheck/UniqueCheck.test.tsx +3 -3
  46. package/src/__tests__/components/Fields/UrlField/UrlField.test.tsx +4 -4
  47. package/src/__tests__/components/Fields/VisualUniqueSelection/ImageSelection/ImageSelection.test.tsx +2 -14
  48. package/src/__tests__/components/Fields/VisualUniqueSelection/ScrollableSelection/ScrollableSelection.test.tsx +6 -20
  49. package/src/__tests__/components/Fields/VisualUniqueSelection/VisualUniqueSelection.test.tsx +3 -29
  50. package/src/__tests__/components/Fields/Wysiwyg/Wysiwyg.test.tsx +1 -1
  51. package/src/__tests__/components/FieldsBehavior/FieldsBehavior.test.tsx +149 -0
  52. package/src/__tests__/components/SubNav/SubNav.test.tsx +37 -0
  53. package/src/__tests__/components/TableCounter/TableCounter.test.tsx +51 -0
  54. package/src/__tests__/components/TableFilters/CategoryFilter/CategoryFilter.test.tsx +241 -0
  55. package/src/__tests__/components/TableFilters/CustomizeFilters/CustomizeFilters.test.tsx +131 -0
  56. package/src/__tests__/components/TableFilters/DateFilter/DateFilter.test.tsx +148 -0
  57. package/src/__tests__/components/TableFilters/LiveFilter/LiveFilter.test.tsx +266 -0
  58. package/src/__tests__/components/TableFilters/NameFilter/NameFilter.test.tsx +196 -0
  59. package/src/__tests__/components/TableFilters/SiteFilter/SiteFilter.test.tsx +318 -0
  60. package/src/__tests__/components/TableFilters/StatusFilter/StatusFilter.test.tsx +195 -0
  61. package/src/__tests__/components/TableFilters/TranslationsFilter/TranslationsFilter.test.tsx +157 -0
  62. package/src/__tests__/components/TableFilters/TypeFilter/TypeFilter.test.tsx +165 -0
  63. package/src/__tests__/components/TableList/TableList.test.tsx +119 -0
  64. package/src/__tests__/components/Tabs/Tabs.test.tsx +205 -0
  65. package/src/__tests__/components/Tag/Tag.test.tsx +140 -0
  66. package/src/__tests__/components/Toast/Toast.test.tsx +102 -0
  67. package/src/api/navigation.tsx +1 -1
  68. package/src/components/Browser/index.tsx +1 -1
  69. package/src/components/Button/index.tsx +3 -3
  70. package/src/components/ConfigPanel/NavigationForm/Field/index.tsx +14 -3
  71. package/src/components/ElementsTooltip/index.tsx +10 -9
  72. package/src/components/EmptyState/index.tsx +2 -2
  73. package/src/components/FieldContainer/index.tsx +3 -3
  74. package/src/components/Fields/ArrayFieldGroup/index.tsx +1 -1
  75. package/src/components/Fields/AsyncCheckGroup/index.tsx +1 -1
  76. package/src/components/Fields/AsyncSelect/index.tsx +1 -1
  77. package/src/components/Fields/CheckField/index.tsx +3 -3
  78. package/src/components/Fields/CheckGroup/index.tsx +2 -2
  79. package/src/components/Fields/ComponentContainer/index.tsx +7 -6
  80. package/src/components/Fields/ComponentContainer/style.tsx +2 -2
  81. package/src/components/Fields/HeadingField/index.tsx +1 -1
  82. package/src/components/Fields/HiddenField/index.tsx +1 -1
  83. package/src/components/Fields/ImageField/index.tsx +10 -5
  84. package/src/components/Fields/MultiCheckSelect/index.tsx +3 -3
  85. package/src/components/Fields/NumberField/index.tsx +2 -1
  86. package/src/components/Fields/ReferenceField/ItemList/Item/index.tsx +5 -7
  87. package/src/components/Fields/ReferenceField/ItemList/Item/style.tsx +2 -2
  88. package/src/components/Fields/ReferenceField/ItemList/index.tsx +1 -1
  89. package/src/components/Fields/RichText/index.tsx +10 -6
  90. package/src/components/Fields/Select/index.tsx +2 -2
  91. package/src/components/Fields/SliderField/index.tsx +1 -1
  92. package/src/components/Fields/TextField/index.tsx +2 -7
  93. package/src/components/Fields/TimeField/HourInput/index.tsx +103 -0
  94. package/src/components/Fields/TimeField/HourInput/style.tsx +19 -0
  95. package/src/components/Fields/TimeField/HourInput/utils.tsx +35 -0
  96. package/src/components/Fields/TimeField/index.tsx +57 -0
  97. package/src/components/Fields/TimeField/style.tsx +37 -0
  98. package/src/components/Fields/index.tsx +2 -0
  99. package/src/components/FieldsBehavior/index.tsx +1 -1
  100. package/src/components/FloatingMenu/index.tsx +2 -2
  101. package/src/components/Gallery/GalleryFilters/Type/index.tsx +50 -0
  102. package/src/components/Gallery/GalleryFilters/Type/style.tsx +39 -0
  103. package/src/components/Gallery/GalleryPanel/DetailPanel/index.tsx +2 -1
  104. package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/style.tsx +3 -3
  105. package/src/components/Gallery/hooks.tsx +10 -4
  106. package/src/components/Gallery/index.tsx +2 -0
  107. package/src/components/Icon/index.tsx +1 -1
  108. package/src/components/IconAction/index.tsx +1 -1
  109. package/src/components/Lists/index.tsx +1 -1
  110. package/src/components/Loading/index.tsx +1 -1
  111. package/src/components/Pagination/index.tsx +1 -1
  112. package/src/components/SideModal/SideModalOption/index.tsx +4 -2
  113. package/src/components/SideModal/index.tsx +1 -1
  114. package/src/components/SubNav/index.tsx +3 -3
  115. package/src/components/SubNav/style.tsx +1 -3
  116. package/src/components/TableCounter/index.tsx +7 -2
  117. package/src/components/TableFilters/CategoryFilter/index.tsx +2 -2
  118. package/src/components/TableFilters/CategoryFilter/style.tsx +1 -10
  119. package/src/components/TableFilters/CustomizeFilters/index.tsx +2 -3
  120. package/src/components/TableFilters/DateFilter/index.tsx +4 -4
  121. package/src/components/TableFilters/LiveFilter/index.tsx +1 -1
  122. package/src/components/TableFilters/LiveFilter/style.tsx +2 -10
  123. package/src/components/TableFilters/NameFilter/index.tsx +4 -4
  124. package/src/components/TableFilters/SiteFilter/index.tsx +16 -13
  125. package/src/components/TableFilters/SiteFilter/style.tsx +1 -10
  126. package/src/components/TableFilters/StatusFilter/index.tsx +3 -3
  127. package/src/components/TableFilters/TranslationsFilter/index.tsx +4 -7
  128. package/src/components/TableFilters/TranslationsFilter/style.tsx +1 -10
  129. package/src/components/TableFilters/TypeFilter/index.tsx +2 -2
  130. package/src/components/TableFilters/TypeFilter/style.tsx +1 -10
  131. package/src/components/TableList/index.tsx +6 -6
  132. package/src/components/TableList/style.tsx +1 -1
  133. package/src/components/Tabs/index.tsx +19 -7
  134. package/src/components/Tag/index.tsx +6 -6
  135. package/src/components/Toast/index.tsx +4 -4
  136. package/src/components/Tooltip/index.tsx +5 -3
  137. package/src/components/index.tsx +2 -0
  138. package/src/containers/Navigation/Defaults/actions.tsx +10 -5
  139. package/src/containers/Navigation/Defaults/utils.tsx +13 -4
  140. package/src/containers/Sites/actions.tsx +7 -0
  141. package/src/containers/Sites/constants.tsx +1 -0
  142. package/src/containers/Sites/interfaces.tsx +6 -0
  143. package/src/containers/Sites/reducer.tsx +4 -0
  144. package/src/containers/StructuredData/actions.tsx +21 -8
  145. package/src/containers/StructuredData/constants.tsx +2 -0
  146. package/src/containers/StructuredData/interfaces.tsx +7 -1
  147. package/src/containers/StructuredData/reducer.tsx +5 -1
  148. package/src/helpers/fields.tsx +2 -2
  149. package/src/helpers/index.tsx +3 -0
  150. package/src/helpers/parseTheme.js +456 -0
  151. package/src/helpers/schemas.tsx +2 -2
  152. package/src/hooks/forms.tsx +2 -1
  153. package/src/modules/App/Routing/NavMenu/index.tsx +9 -1
  154. package/src/modules/Content/BulkHeader/TableHeader/index.tsx +1 -1
  155. package/src/modules/Content/hooks.tsx +19 -12
  156. package/src/modules/Content/index.tsx +23 -14
  157. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/DefaultsBrowser/index.tsx +3 -0
  158. package/src/modules/Navigation/Defaults/DefaultsEditor/Editor/index.tsx +3 -1
  159. package/src/modules/Navigation/Defaults/DefaultsEditor/index.tsx +16 -18
  160. package/src/modules/Navigation/Defaults/DefaultsEditor/utils.tsx +37 -0
  161. package/src/modules/StructuredData/Form/ConnectedField/index.tsx +3 -2
  162. package/src/modules/StructuredData/Form/index.tsx +22 -17
  163. package/src/modules/StructuredData/StructuredDataList/hooks.tsx +30 -20
  164. package/src/modules/StructuredData/StructuredDataList/index.tsx +24 -14
  165. package/src/types/index.tsx +8 -7
@@ -0,0 +1,456 @@
1
+ const procUnit = (u, fn) => {
2
+ const unitLess = parseFloat(u.match(/\d*\.?\d*/)[0]);
3
+ const unit = u.split(unitLess.toString())[1];
4
+ const unitLessProccesed = fn(unitLess);
5
+ return `${unitLessProccesed}${unit}`;
6
+ };
7
+
8
+ const halfUnit = (u) => {
9
+ return procUnit(u, (n) => n / 2);
10
+ };
11
+
12
+ /**
13
+ * hexToRGBA
14
+ * Convierte un color en formato Hexadecimal a formato RGBA
15
+ * @param {string} hex El color en formato hexadecimal
16
+ * @param {number} opacity La valor de opacidad del color, de 0 a 1
17
+ * @example
18
+ * Convierte el color #FFFFFF a RGBA()
19
+ * hexToRGBA("#FFFFFF", 0.5)
20
+ * -> "rgba(255, 255, 255, 0.5)"
21
+ *
22
+ * @return {string} Una cadena con el valor rgba dentro de rgba()
23
+ */
24
+ const hexToRGBA = (hex, opacity = 1.0) => {
25
+ const clearHex = hex[0] === "#" ? hex.substring(1, 7) : hex;
26
+ const hexToR = parseInt(clearHex.substring(0, 2), 16);
27
+ const hexToG = parseInt(clearHex.substring(2, 4), 16);
28
+ const hexToB = parseInt(clearHex.substring(4, 6), 16);
29
+ return `rgba(${hexToR}, ${hexToG}, ${hexToB}, ${opacity})`;
30
+ };
31
+
32
+ /**
33
+ * isDifferent
34
+ * Comprueba si value1 y value2 son iguales, en caso negativo devuelve una cadena
35
+ * con el valor `value2` asociado a la `prop` (css).
36
+ * Si son iguales devuelve una cadena vacía.
37
+ *
38
+ * Esta función se usa para construir una especia de cascada (a lo css) al
39
+ * construir los estilos de textos responsive. Así si hay una nueva proiedad
40
+ * con un valor diferente
41
+ *
42
+ * @param {string} prop La propiedad css que compara
43
+ * @param {string} value1 El primera valor de la prop
44
+ * @param {string} value2 El segundo valor de la prop
45
+ * @example
46
+ * Compara el font-size
47
+ * isDifferent("font-size", "24px", "24px")
48
+ * -> ""
49
+ *
50
+ * @example
51
+ * Compara el font-size
52
+ * isDifferent("font-size", "10px", "32px")
53
+ * -> "font-size: 32px"
54
+ *
55
+ * @return {string} Una cadena con la propiedad y el valor nuevo, o una cadena
56
+ * vacía, si los valores son iguales.
57
+ */
58
+ const isDifferent = (prop, value1, value2) => {
59
+ if (value2) {
60
+ if (value1 === value2) {
61
+ return "";
62
+ } else {
63
+ return `${prop}: ${value2};`;
64
+ }
65
+ } else {
66
+ return "";
67
+ }
68
+ };
69
+
70
+ /**
71
+ * has
72
+ * Determina si existe en el archivo .json una propiedad.
73
+ * Si existe devuelve el par "prop: value", si no busca la proiedad en el
74
+ * apartado defaultStyles y la devuelve. Si tampoco existe ahí, devuelve ""
75
+ *
76
+ * @param {string} prop La propiedad css
77
+ * @param {string} value El valor de la propiedad css
78
+ * @param {string} fallBackValue El valor de la propiedad css en caso de no
79
+ * existir la propiedad value
80
+ */
81
+ const has = (prop, value, fallBackValue) => {
82
+ if (value) {
83
+ return `${prop}: ${value};`;
84
+ }
85
+ if (fallBackValue) {
86
+ return `${prop}: ${fallBackValue};`;
87
+ }
88
+ return "";
89
+ };
90
+
91
+ /**
92
+ * parseColors
93
+ * Parsea un objeto de colors con la siguiente estructura
94
+ * {
95
+ * color: {
96
+ * colors: {
97
+ * colorName1: {
98
+ * value: "#ffffff",
99
+ * opacity: "1"
100
+ * },
101
+ * colorName2: {
102
+ * value: "#ffffff",
103
+ * opacity: "1"
104
+ * },
105
+ * }
106
+ * }
107
+ * }
108
+ * @param {object} theme El tema
109
+ */
110
+
111
+ const parseColors = (theme) => {
112
+ try {
113
+ const colors = theme.color.colors;
114
+ const color = Object.keys(colors).reduce((acc, label) => {
115
+ const isOpaque = (entry) => entry.opacity === 1 || entry.opacity === undefined || entry.opacity === null;
116
+ const _isHEX = (entry) => {
117
+ try {
118
+ return entry.value[0] === "#";
119
+ } catch (e) {
120
+ return false;
121
+ }
122
+ };
123
+ const _isHSL = (entry) => {
124
+ try {
125
+ return entry.type.toLowerCase() === "hsl";
126
+ } catch (e) {
127
+ return false;
128
+ }
129
+ };
130
+ const _isRGB = (entry) => {
131
+ try {
132
+ return entry.type.toLowerCase() === "rgb";
133
+ } catch (e) {
134
+ return false;
135
+ }
136
+ };
137
+ const isHSL = (entry) => _isHSL(entry) && isOpaque(entry);
138
+ const isHSLA = (entry) => _isHSL(entry) && !isOpaque(entry);
139
+ const isHEX = (entry) => _isHEX(entry) && isOpaque(entry);
140
+ const isHEXA = (entry) => _isHEX(entry) && !isOpaque(entry);
141
+ const isRGB = (entry) => _isRGB(entry) && isOpaque(entry);
142
+ const isRGBA = (entry) => _isRGB(entry) && !isOpaque(entry);
143
+
144
+ if (isHSLA(colors[label])) {
145
+ acc[label] = `hsla(${colors[label].value
146
+ .map((v, idx) => `${idx === 0 ? v : typeof v === "string" ? (v.indexOf("%") === -1 ? v + "%" : v) : v + "%"}`)
147
+ .join(", ")}, ${colors[label].opacity})`;
148
+ }
149
+ if (isHSL(colors[label])) {
150
+ acc[label] = `hsl(${colors[label].value
151
+ .map((v, idx) => `${idx === 0 ? v : typeof v === "string" ? (v.indexOf("%") === -1 ? v + "%" : v) : v + "%"}`)
152
+ .join(", ")})`;
153
+ }
154
+ if (isHEX(colors[label])) {
155
+ acc[label] = `${colors[label].value}`;
156
+ }
157
+ if (isHEXA(colors[label])) {
158
+ acc[label] = `${hexToRGBA(colors[label].value, colors[label].opacity)}`;
159
+ }
160
+ if (isRGB(colors[label])) {
161
+ acc[label] = `rgb(${colors[label].value.join(", ")})`;
162
+ }
163
+ if (isRGBA(colors[label])) {
164
+ acc[label] = `rgba(${colors[label].value.join(", ")}, ${colors[label].opacity})`;
165
+ }
166
+ return acc;
167
+ }, {});
168
+
169
+ // Autogenerador
170
+ // color.interactiveMain = color.interactiveMain ? "#fff" : "#000"
171
+
172
+ return color;
173
+ } catch (e) {
174
+ return null;
175
+ }
176
+ };
177
+
178
+ const parseGradients = (theme) => {
179
+ try {
180
+ const gradients = theme.gradient.gradients;
181
+ const gradient = Object.keys(gradients).reduce((acc, label) => {
182
+ acc[label] = `linear-gradient(${gradients[label].direction}, ${gradients[label].stops
183
+ .map((stop) => `${hexToRGBA(stop.color, stop.opacity)} ${stop.position}`)
184
+ .join(",")})`;
185
+ return acc;
186
+ }, {});
187
+ return gradient;
188
+ } catch (e) {
189
+ return null;
190
+ }
191
+ };
192
+
193
+ const parseShadows = (theme) => {
194
+ try {
195
+ const shadows = theme.shadow.shadows;
196
+ const shadow = Object.keys(shadows).reduce((acc, label) => {
197
+ acc[label] = `${shadows[label].x}px ${shadows[label].y}px ${shadows[label].blur}px ${hexToRGBA(
198
+ shadows[label].color,
199
+ shadows[label].opacity
200
+ )}`;
201
+ return acc;
202
+ }, {});
203
+ return shadow;
204
+ } catch (e) {
205
+ return null;
206
+ }
207
+ };
208
+
209
+ const parseMediaqueries = (theme) => {
210
+ try {
211
+ const mediaqueries = theme.mediaquery.mediaqueries;
212
+ let mqObject = {};
213
+ mediaqueries.forEach((mq) => {
214
+ if (mq.label !== "default") {
215
+ const minWidth = mq.minWidth ? `and (min-width: ${mq.minWidth})` : "";
216
+ const maxWidth = mq.maxWidth ? `and (max-width: ${mq.maxWidth})` : "";
217
+ mqObject[mq.label] = `@media only screen ${minWidth} ${maxWidth}`;
218
+ }
219
+ });
220
+
221
+ return mqObject;
222
+ } catch (e) {
223
+ return null;
224
+ }
225
+ };
226
+
227
+ const parseFontFamilies = (theme) => {
228
+ try {
229
+ return theme.fontFamily.fontFamilies;
230
+ } catch (e) {
231
+ return null;
232
+ }
233
+ };
234
+
235
+ const getUnitValue = (x) => {
236
+ if (typeof x === "string") {
237
+ return x.match(/\d*\.?\d+?/)[0];
238
+ }
239
+ if (typeof x === "number") {
240
+ return x;
241
+ }
242
+ };
243
+
244
+ const cropText = (top, bottom) => {
245
+ return `
246
+ &::before, &::after {
247
+ content: "";
248
+ display: block;
249
+ }
250
+ &::before {
251
+ margin-bottom: ${bottom}em;
252
+ }
253
+ &::after {
254
+ margin-top: ${top}em;
255
+ }
256
+ `;
257
+ };
258
+
259
+ export const parseTextStyles = (theme) => {
260
+ try {
261
+ // Space object for rebass grid.
262
+ const mq = parseMediaqueries(theme);
263
+ const fontFamily = parseFontFamilies(theme);
264
+
265
+ // With process
266
+ const defaultStyles = theme.textStyle.defaultStyles;
267
+ const textStyles = theme.textStyle.textStyles;
268
+
269
+ // fontRes
270
+ let textStyleObject = {};
271
+ textStyles.forEach((style) => {
272
+ let FONTSIZE = getUnitValue(style.fontSize);
273
+ let CROPTOP = style.croptop !== undefined ? style.croptop : 0;
274
+ let CROPBOTTOM = style.cropbottom !== undefined ? style.cropbottom : 0;
275
+ let dynCropTop = (Math.max(CROPTOP + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
276
+ let dynCropBottom = (Math.max(CROPBOTTOM + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
277
+ textStyleObject[style.name] = `
278
+
279
+ ${has("font-family", fontFamily[style.fontFamily], fontFamily[defaultStyles.fontFamily])}
280
+ ${has("font-size", style.fontSize, defaultStyles.fontSize)}
281
+ ${has("font-weight", style.fontWeight, defaultStyles.fontWeight)}
282
+ ${has("letter-spacing", style.letterSpacing, defaultStyles.letterSpacing)}
283
+ ${has("line-height", style.lineHeight, defaultStyles.lineHeight)}
284
+ ${has("font-style", style.fontStyle, defaultStyles.fontStyle)}
285
+ ${has("text-transform", style.textTransform, defaultStyles.textTransform)}
286
+ ${CROPTOP && CROPBOTTOM ? cropText(dynCropTop, dynCropBottom) : ""}
287
+
288
+ ${
289
+ style.responsive
290
+ ? style.responsive
291
+ .map((bp, idx) => {
292
+ FONTSIZE = getUnitValue(bp.fontSize);
293
+ CROPTOP = bp.croptop !== undefined ? bp.croptop : 0;
294
+ CROPBOTTOM = bp.cropbottom !== undefined ? bp.cropbottom : 0;
295
+ dynCropTop = (Math.max(CROPTOP + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
296
+ dynCropBottom = (Math.max(CROPBOTTOM + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
297
+ if (idx < 1) {
298
+ // En el primer ciclo se compara con el breakpoint base: style
299
+ return `
300
+ ${mq[bp.breakpoint]} {
301
+ ${isDifferent("font-family", fontFamily[style.fontFamily], fontFamily[bp.fontFamily])}
302
+ ${isDifferent("font-size", style.fontSize, bp.fontSize)}
303
+ ${isDifferent("font-weight", style.fontWeight, bp.fontWeight)}
304
+ ${isDifferent("line-height", style.lineHeight, bp.lineHeight)}
305
+ ${isDifferent("letter-spacing", style.letterSpacing, bp.letterSpacing)}
306
+ ${isDifferent("font-style", style.fontStyle, bp.fontStyle)}
307
+ ${isDifferent("text-transform", style.textTransform, bp.textTransform)}
308
+ ${CROPTOP && CROPBOTTOM ? cropText(dynCropTop, dynCropBottom) : ""}
309
+ }
310
+ `;
311
+ } else {
312
+ // A partir del segundo ciclo se compara con el breakpoint anterior
313
+ FONTSIZE = getUnitValue(bp.fontSize);
314
+ CROPTOP = bp.croptop !== undefined ? bp.croptop : 0;
315
+ CROPBOTTOM = bp.cropbottom !== undefined ? bp.cropbottom : 0;
316
+ dynCropTop = (Math.max(CROPTOP + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
317
+ dynCropBottom = (Math.max(CROPBOTTOM + (1 - 1) * (FONTSIZE / 2), 0) / FONTSIZE) * -1;
318
+ return `
319
+ ${mq[bp.breakpoint]} {
320
+ ${isDifferent("font-family", fontFamily[style.responsive[idx - 1].fontFamily], fontFamily[bp.fontFamily])}
321
+ ${isDifferent("font-size", style.responsive[idx - 1].fontSize, bp.fontSize)}
322
+ ${isDifferent("font-weight", style.responsive[idx - 1].fontWeight, bp.fontWeight)}
323
+ ${isDifferent("line-height", style.responsive[idx - 1].lineHeight, bp.lineHeight)}
324
+ ${isDifferent("letter-spacing", style.responsive[idx - 1].letterSpacing, bp.letterSpacing)}
325
+ ${isDifferent("font-style", style.responsive[idx - 1].fontStyle, bp.fontStyle)}
326
+ ${isDifferent("text-transform", style.responsive[idx - 1].textTransform, bp.textTransform)}
327
+ ${CROPTOP && CROPBOTTOM ? cropText(dynCropTop, dynCropBottom) : ""}
328
+ }
329
+ `;
330
+ }
331
+ })
332
+ .join("")
333
+ : ""
334
+ }
335
+ `;
336
+ // End
337
+ });
338
+
339
+ return textStyleObject;
340
+ } catch (e) {
341
+ return null;
342
+ }
343
+ };
344
+
345
+ const parseBreakpoints = (theme) => {
346
+ try {
347
+ // return Object.fromEntries(Object.entries(theme.mediaquery.mediaqueries.map(bp => bp.minWidth).filter(Boolean)))
348
+ return theme.mediaquery.mediaqueries.map((bp) => bp.minWidth).filter(Boolean);
349
+ } catch (e) {
350
+ return null;
351
+ }
352
+ };
353
+
354
+ const parseFontSizes = (theme) => {
355
+ try {
356
+ return [
357
+ ...new Set(
358
+ theme.textStyle.textStyles
359
+ .map((entry) => entry.fontSize)
360
+ .filter(Boolean)
361
+ .reverse()
362
+ .map((entry) => Number(entry.split("px")[0]))
363
+ .sort((a, b) => a - b)
364
+ ),
365
+ ];
366
+ } catch (e) {
367
+ return null;
368
+ }
369
+ };
370
+
371
+ const parseNegativeSpacing = (theme) => {
372
+ const getNegative = (v) => `-${v}`;
373
+ if (theme.spacing) {
374
+ if (Object.keys(theme.spacing).length) {
375
+ return Object.entries(theme.spacing).reduce(
376
+ (prev, [key, value]) => ({
377
+ ...prev,
378
+ [key]: typeof value === "string" ? getNegative(value) : undefined,
379
+ }),
380
+ {}
381
+ );
382
+ }
383
+ }
384
+ };
385
+
386
+ const parseHalfSpacing = (theme) => {
387
+ if (theme.spacing) {
388
+ if (Object.keys(theme.spacing).length) {
389
+ return Object.entries(theme.spacing).reduce(
390
+ (prev, [key, value]) => ({
391
+ ...prev,
392
+ [key]: typeof value === "string" ? halfUnit(value) : undefined,
393
+ }),
394
+ {}
395
+ );
396
+ }
397
+ }
398
+ };
399
+
400
+ const parseNegativeHalfSpacing = (theme) => {
401
+ const getNegative = (v) => `-${v}`;
402
+ if (theme.spacing) {
403
+ if (Object.keys(theme.spacing).length) {
404
+ return Object.entries(theme.spacing).reduce(
405
+ (prev, [key, value]) => ({
406
+ ...prev,
407
+ [key]: typeof value === "string" ? getNegative(halfUnit(value)) : undefined,
408
+ }),
409
+ {}
410
+ );
411
+ }
412
+ }
413
+ };
414
+
415
+ const parseTheme = (theme) => {
416
+ // Añadir también al parseo de temas todos los elementos que no necesiten ser
417
+ // paseados.
418
+
419
+ const color = parseColors(theme);
420
+ const gradient = parseGradients(theme);
421
+ const shadow = parseShadows(theme);
422
+ const mq = parseMediaqueries(theme);
423
+ const textStyle = parseTextStyles(theme);
424
+ const breakpoints = parseBreakpoints(theme);
425
+ const fontFamily = parseFontFamilies(theme);
426
+
427
+ // Breakpoints alias.
428
+ // De esta manera se pueden utilizar las props responsive así:
429
+ // <Text display={{small:"none", xlarge:"block"}} >...</Text>
430
+ try {
431
+ theme.mediaquery.mediaqueries.forEach((mq) => {
432
+ breakpoints[mq.label] = mq.minWidth;
433
+ });
434
+ } catch (e) {
435
+ //
436
+ }
437
+
438
+ const returnObject = {
439
+ ...theme,
440
+ fontFamily,
441
+ color,
442
+ colors: color,
443
+ gradient,
444
+ shadow,
445
+ mq,
446
+ textStyle,
447
+ breakpoints,
448
+ fontSizes: parseFontSizes(theme),
449
+ negateSpacing: parseNegativeSpacing(theme),
450
+ halfSpacing: parseHalfSpacing(theme),
451
+ negateHalfSpacing: parseNegativeHalfSpacing(theme),
452
+ };
453
+ return returnObject;
454
+ };
455
+
456
+ export { parseTheme };
@@ -6,10 +6,10 @@ import { pageSchemas } from "@ax/schemas";
6
6
  const allSchemas = { ...schemas.all, ...pageSchemas };
7
7
 
8
8
  const getSchema = (name: string) => allSchemas[name];
9
- const getDefaultSchema = (name: string) => allSchemas[name].default;
9
+ const getDefaultSchema = (name: string) => (allSchemas[name] ? allSchemas[name].default : {});
10
10
 
11
11
  const getSchemaThumbnails = (name: string, theme?: string) => {
12
- if (!allSchemas[name].thumbnails) return null;
12
+ if (!allSchemas[name]?.thumbnails) return null;
13
13
 
14
14
  return theme && allSchemas[name].thumbnails[theme] ? allSchemas[name].thumbnails[theme] : allSchemas[name].thumbnails;
15
15
  };
@@ -63,7 +63,7 @@ const useIsDirty = (
63
63
 
64
64
  const prevContent = usePrevious(updatedValues, isSaved);
65
65
 
66
- const hasChanged = () => {
66
+ const hasChanged = (): boolean => {
67
67
  if (prevContent && updatedValues) {
68
68
  const updatedValuesCloned = updatedValues && deepClone(updatedValues);
69
69
  const originalValuesCloned = prevContent && deepClone(prevContent);
@@ -74,6 +74,7 @@ const useIsDirty = (
74
74
 
75
75
  return hasChanged;
76
76
  }
77
+ return false;
77
78
  };
78
79
 
79
80
  const resetDirty = () => {
@@ -15,7 +15,7 @@ import { NavProvider } from "./context";
15
15
  import * as S from "./style";
16
16
 
17
17
  const NavMenu = (props: IProps) => {
18
- const { location, setHistoryPush, logout, currentSiteInfo, siteLanguages, lang } = props;
18
+ const { location, setHistoryPush, logout, currentSiteInfo, siteLanguages, lang, categories } = props;
19
19
 
20
20
  const [isOpened, setIsOpened] = useState(false);
21
21
 
@@ -116,6 +116,12 @@ const NavMenu = (props: IProps) => {
116
116
 
117
117
  const isSitePublished = isSite && currentSiteInfo && currentSiteInfo.isPublished;
118
118
 
119
+ if (isSite) {
120
+ const isSiteCategoriesAvailable = categories.site.length;
121
+ const siteCategoriesRouteIdx = config.routes.findIndex((route: IRouter) => route.path === "/sites/categories");
122
+ config.routes[siteCategoriesRouteIdx].showInNav = isSiteCategoriesAvailable;
123
+ }
124
+
119
125
  return (
120
126
  <NavProvider value={{ state, toggleSubmenu }}>
121
127
  <S.NavWrapper type={config.type} isOpened={isOpened}>
@@ -182,12 +188,14 @@ interface IConfig {
182
188
  }
183
189
 
184
190
  interface INavMenuProps {
191
+ categories: any;
185
192
  currentSiteInfo: any;
186
193
  siteLanguages: any[];
187
194
  lang: any;
188
195
  }
189
196
 
190
197
  const mapStateToProps = (state: IRootState) => ({
198
+ categories: state.structuredData.categories,
191
199
  currentSiteInfo: state.sites.currentSiteInfo,
192
200
  siteLanguages: state.sites.currentSiteLanguages,
193
201
  lang: state.app.lang,
@@ -94,7 +94,7 @@ const TableHeader = (props: IProps): JSX.Element => {
94
94
  {CategoryColumns}
95
95
  {activeColumns.includes("type") && (
96
96
  <S.HeaderWrapper>
97
- <TypeFilter filterItems={filterItems} filters={typeFilters} value={filterValues.types} pointer="type" />
97
+ <TypeFilter filterItems={filterItems} filters={typeFilters} value={filterValues.type} pointer="type" />
98
98
  </S.HeaderWrapper>
99
99
  )}
100
100
  {activeColumns.includes("live") && (
@@ -1,4 +1,4 @@
1
- import { useState } from "react";
1
+ import { useEffect, useState } from "react";
2
2
 
3
3
  const useSortedListStatus = () => {
4
4
  const sortedInitialState: {
@@ -21,7 +21,7 @@ const useSortedListStatus = () => {
21
21
  };
22
22
  };
23
23
 
24
- const useFilterQuery = () => {
24
+ const useFilterQuery = (values?: Record<string, string> | null) => {
25
25
  const initialQueryValues = {
26
26
  type: "all",
27
27
  translated: "all",
@@ -30,9 +30,7 @@ const useFilterQuery = () => {
30
30
  categories: "all",
31
31
  };
32
32
 
33
- const [query, setQuery] = useState(initialQueryValues);
34
-
35
- const setFilterQuery = (filterValues: any) => {
33
+ const getFilterQuery = (filterValues: any) => {
36
34
  const { type, translated, liveStatus, order, categories } = filterValues;
37
35
  let filterQuery = "";
38
36
 
@@ -63,8 +61,14 @@ const useFilterQuery = () => {
63
61
  return filterQuery;
64
62
  };
65
63
 
64
+ const initState = values ? values : initialQueryValues;
65
+ const [state, setState] = useState(initState);
66
+
67
+ const initQuery = values ? getFilterQuery(values) : "";
68
+ const [query, setQuery] = useState(initQuery);
69
+
66
70
  const setFiltersSelection = (pointer: string, filter: string, isAscendent?: boolean) => {
67
- const { type, translated, liveStatus, order, categories } = query;
71
+ const { type, translated, liveStatus, order, categories } = state;
68
72
  const orderMethod = isAscendent ? "asc" : "desc";
69
73
  const filterValues = {
70
74
  type: pointer === "type" ? filter : type,
@@ -74,18 +78,21 @@ const useFilterQuery = () => {
74
78
  categories: pointer === "categories" ? filter : categories,
75
79
  };
76
80
 
77
- setQuery(filterValues);
78
-
79
- return filterValues;
81
+ setState(filterValues);
82
+ const filterQuery = getFilterQuery(filterValues);
83
+ setQuery(filterQuery);
80
84
  };
81
85
 
82
- const resetFilterQuery = () => setQuery(initialQueryValues);
86
+ const resetFilterQuery = () => {
87
+ setState(initialQueryValues);
88
+ setQuery("");
89
+ };
83
90
 
84
91
  return {
85
92
  setFiltersSelection,
86
- setFilterQuery,
87
93
  resetFilterQuery,
88
- filterValues: query,
94
+ filterValues: state,
95
+ query,
89
96
  };
90
97
  };
91
98