@raketa-cloud/admin 1.8.10 → 1.8.12

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 (105) hide show
  1. package/dist/application.css +109 -0
  2. package/package.json +4 -2
  3. package/src/HonoAdapter.js +41 -18
  4. package/src/Logger.js +7 -8
  5. package/src/RaketaContext.js +1 -0
  6. package/src/cipher.js +2 -2
  7. package/src/cloud/ContentTasks.js +31 -0
  8. package/src/cloud/RaketaClient.js +1 -1
  9. package/src/cloud/Redirects.js +2 -2
  10. package/src/cloud/ResourceChanges.js +1 -1
  11. package/src/cloud/ResourceRevisions.js +2 -2
  12. package/src/cloud/Resources.js +28 -12
  13. package/src/cloud/Tags.js +4 -4
  14. package/src/cloud/documents/common.js +16 -0
  15. package/src/cloud/documents/contentTasksDocuments.js +59 -0
  16. package/src/cloud/documents/resourcesDocuments.js +12 -0
  17. package/src/filters.js +3 -3
  18. package/src/handlers/TagsHandler.js +2 -2
  19. package/src/handlers/_shared/getResourceUpdateDestination.js +1 -1
  20. package/src/handlers/categories/index.js +3 -3
  21. package/src/handlers/content_tasks/ContentTasksHandler.js +32 -0
  22. package/src/handlers/resource_revisions/LocksHandler.js +4 -1
  23. package/src/handlers/resources/ClonesHandler.js +1 -3
  24. package/src/handlers/resources/ExportsHandler.js +1 -5
  25. package/src/handlers/resources/ResourcesHandler.js +1 -1
  26. package/src/handlers/resources/TranslationsHandler.js +28 -19
  27. package/src/handlers/resources/URLsHandler.js +3 -1
  28. package/src/helpers/AuthHelper.js +1 -1
  29. package/src/helpers/FormBuilder.js +14 -14
  30. package/src/helpers/Pagination.js +5 -5
  31. package/src/helpers/historyUtils.js +3 -3
  32. package/src/helpers/utils.js +6 -1
  33. package/src/index.js +1 -0
  34. package/src/routeMember.js +9 -4
  35. package/src/routeNestedCollection.js +14 -29
  36. package/src/routeNestedMember.js +17 -6
  37. package/src/routeStandard.js +5 -1
  38. package/src/setupAuthentication.js +1 -1
  39. package/src/setupCloud.js +5 -0
  40. package/src/tests/Adapter.test.js +2 -2
  41. package/src/tests/HonoAdapter.coverage.test.js +44 -22
  42. package/src/tests/HonoAdapter.filter.test.js +28 -18
  43. package/src/tests/HonoAdapter.test.js +3 -3
  44. package/src/tests/RaketaClient.test.js +427 -413
  45. package/src/tests/RaketaContext.test.js +1 -1
  46. package/src/tests/buildResourcePath.test.js +1 -1
  47. package/src/tests/cipher.test.js +16 -16
  48. package/src/tests/filters.test.js +24 -24
  49. package/src/tests/handlers/RedirectsHandler.test/destroy.test.js +1 -1
  50. package/src/tests/handlers/TagsHandler.test/create.test.js +2 -2
  51. package/src/tests/handlers/TagsHandler.test/destroy.test.js +1 -1
  52. package/src/tests/handlers/TagsHandler.test/update.test.js +2 -2
  53. package/src/tests/handlers/categories/create.test.js +2 -2
  54. package/src/tests/handlers/categories/destroy.test.js +1 -1
  55. package/src/tests/handlers/content_tasks/ContentTasksHandler.test/index.test.js +161 -0
  56. package/src/tests/handlers/resource_revisions/CancelSchedulesHandler.test/create.test.js +2 -2
  57. package/src/tests/handlers/resource_revisions/CodeHandler.test/update.test.js +1 -1
  58. package/src/tests/handlers/resource_revisions/GeneralHandler.test/update.test.js +1 -1
  59. package/src/tests/handlers/resource_revisions/LocksHandler.test/create.test.js +5 -5
  60. package/src/tests/handlers/resource_revisions/LocksHandler.test/create_form.test.js +6 -2
  61. package/src/tests/handlers/resource_revisions/MetaHandler.test/update.test.js +1 -1
  62. package/src/tests/handlers/resource_revisions/PublishesHandler.test/create.test.js +5 -5
  63. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/create.test.js +2 -2
  64. package/src/tests/handlers/resource_revisions/ResourceRevisionsHandler.test/destroy.test.js +1 -1
  65. package/src/tests/handlers/resource_revisions/RevertsHandler.test/create.test.js +18 -3
  66. package/src/tests/handlers/resource_revisions/TagHandler.test/update.test.js +1 -1
  67. package/src/tests/handlers/resource_revisions/UnlocksHandler.test/create.test.js +2 -2
  68. package/src/tests/handlers/resource_revisions/VisualHandler.test/update.test.js +1 -1
  69. package/src/tests/handlers/resource_revisions/WidgetHandler.test/update.test.js +2 -2
  70. package/src/tests/handlers/resources/ChangeHandler.test/show.test.js +7 -2
  71. package/src/tests/handlers/resources/ClonesHandler.test/create.test.js +1 -3
  72. package/src/tests/handlers/resources/ExportsHandler.test/index.test.js +8 -8
  73. package/src/tests/handlers/resources/HistoryHandler.test/index.test.js +1 -1
  74. package/src/tests/handlers/resources/ResourcesAPIHandler.test/index.test.js +1 -5
  75. package/src/tests/handlers/resources/ResourcesHandler.test/create.test.js +2 -2
  76. package/src/tests/handlers/resources/ResourcesHandler.test/show.test.js +1 -1
  77. package/src/tests/handlers/resources/TranslationsHandler.test/create.test.js +24 -14
  78. package/src/tests/handlers/resources/TranslationsHandler.test/create_form.test.js +1 -1
  79. package/src/tests/handlers/resources/TranslationsHandler.test/index.test.js +3 -3
  80. package/src/tests/handlers/resources/URLsHandler.test/create.test.js +4 -6
  81. package/src/tests/helpers/AuthHelper.test.js +11 -12
  82. package/src/tests/helpers/CSVExportHelper.test.js +3 -3
  83. package/src/tests/helpers/FormBuilder.test.js +21 -21
  84. package/src/tests/helpers/HTMLBuilder.test.js +4 -4
  85. package/src/tests/helpers/Inflector.test.js +1 -1
  86. package/src/tests/helpers/Pagination.test.js +1 -1
  87. package/src/tests/helpers/utils.test.js +46 -0
  88. package/src/tests/routeCategoriesModule.test.js +10 -5
  89. package/src/tests/routeCollection.test.js +1 -1
  90. package/src/tests/routeMember.test.js +2 -2
  91. package/src/tests/routeNestedCollection.test.js +3 -3
  92. package/src/tests/routeNestedMember.test.js +3 -3
  93. package/src/tests/routeResourceModule.test.js +15 -16
  94. package/src/tests/routeSettings.test.js +3 -3
  95. package/src/tests/routeStandard.test.js +27 -9
  96. package/src/tests/setupAuthentication.test.js +9 -6
  97. package/src/tests/support/factory.js +33 -0
  98. package/src/tests/utils.test.js +19 -19
  99. package/src/views/content_tasks/index.ejs +191 -0
  100. package/src/views/layouts/application.ejs +2 -1
  101. package/src/views/resources/_shared/_toolbar.ejs +33 -2
  102. package/src/views/resources/_shared/_translations_strip.ejs +71 -0
  103. package/src/views/resources/index.ejs +5 -0
  104. package/src/views/resources/show.ejs +1 -29
  105. package/src/views/resources/translations/create_form.ejs +13 -0
@@ -1586,10 +1586,26 @@ select {
1586
1586
  position: sticky;
1587
1587
  }
1588
1588
 
1589
+ .-right-0 {
1590
+ right: -0px;
1591
+ }
1592
+
1593
+ .-right-0\.5 {
1594
+ right: -0.125rem;
1595
+ }
1596
+
1589
1597
  .-right-4 {
1590
1598
  right: -1rem;
1591
1599
  }
1592
1600
 
1601
+ .-top-0 {
1602
+ top: -0px;
1603
+ }
1604
+
1605
+ .-top-0\.5 {
1606
+ top: -0.125rem;
1607
+ }
1608
+
1593
1609
  .bottom-20 {
1594
1610
  bottom: 5rem;
1595
1611
  }
@@ -1749,6 +1765,11 @@ select {
1749
1765
  aspect-ratio: 1 / 1;
1750
1766
  }
1751
1767
 
1768
+ .size-12 {
1769
+ width: 3rem;
1770
+ height: 3rem;
1771
+ }
1772
+
1752
1773
  .size-14 {
1753
1774
  width: 3.5rem;
1754
1775
  height: 3.5rem;
@@ -1774,6 +1795,10 @@ select {
1774
1795
  height: 2rem;
1775
1796
  }
1776
1797
 
1798
+ .h-3 {
1799
+ height: 0.75rem;
1800
+ }
1801
+
1777
1802
  .h-5 {
1778
1803
  height: 1.25rem;
1779
1804
  }
@@ -1811,10 +1836,18 @@ select {
1811
1836
  width: 50%;
1812
1837
  }
1813
1838
 
1839
+ .w-1\/3 {
1840
+ width: 33.333333%;
1841
+ }
1842
+
1814
1843
  .w-16 {
1815
1844
  width: 4rem;
1816
1845
  }
1817
1846
 
1847
+ .w-3 {
1848
+ width: 0.75rem;
1849
+ }
1850
+
1818
1851
  .w-48 {
1819
1852
  width: 12rem;
1820
1853
  }
@@ -1864,6 +1897,17 @@ select {
1864
1897
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1865
1898
  }
1866
1899
 
1900
+ @keyframes ping {
1901
+ 75%, 100% {
1902
+ transform: scale(2);
1903
+ opacity: 0;
1904
+ }
1905
+ }
1906
+
1907
+ .animate-ping {
1908
+ animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
1909
+ }
1910
+
1867
1911
  .cursor-not-allowed {
1868
1912
  cursor: not-allowed;
1869
1913
  }
@@ -2003,6 +2047,16 @@ select {
2003
2047
  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
2004
2048
  }
2005
2049
 
2050
+ .bg-blue-100 {
2051
+ --tw-bg-opacity: 1;
2052
+ background-color: rgb(219 234 254 / var(--tw-bg-opacity));
2053
+ }
2054
+
2055
+ .bg-emerald-100 {
2056
+ --tw-bg-opacity: 1;
2057
+ background-color: rgb(209 250 229 / var(--tw-bg-opacity));
2058
+ }
2059
+
2006
2060
  .bg-orange-100 {
2007
2061
  --tw-bg-opacity: 1;
2008
2062
  background-color: rgb(255 237 213 / var(--tw-bg-opacity));
@@ -2026,6 +2080,11 @@ select {
2026
2080
  background-color: rgba(var(--primary), 0.05);
2027
2081
  }
2028
2082
 
2083
+ .bg-red-100 {
2084
+ --tw-bg-opacity: 1;
2085
+ background-color: rgb(254 226 226 / var(--tw-bg-opacity));
2086
+ }
2087
+
2029
2088
  .bg-white {
2030
2089
  --tw-bg-opacity: 1;
2031
2090
  background-color: rgb(255 255 255 / var(--tw-bg-opacity));
@@ -2178,11 +2237,21 @@ select {
2178
2237
  color: rgb(60 64 67 / var(--tw-text-opacity));
2179
2238
  }
2180
2239
 
2240
+ .text-blue-700 {
2241
+ --tw-text-opacity: 1;
2242
+ color: rgb(29 78 216 / var(--tw-text-opacity));
2243
+ }
2244
+
2181
2245
  .text-emerald-600 {
2182
2246
  --tw-text-opacity: 1;
2183
2247
  color: rgb(5 150 105 / var(--tw-text-opacity));
2184
2248
  }
2185
2249
 
2250
+ .text-emerald-700 {
2251
+ --tw-text-opacity: 1;
2252
+ color: rgb(4 120 87 / var(--tw-text-opacity));
2253
+ }
2254
+
2186
2255
  .text-gray-400 {
2187
2256
  --tw-text-opacity: 1;
2188
2257
  color: rgb(156 163 175 / var(--tw-text-opacity));
@@ -2206,6 +2275,10 @@ select {
2206
2275
  color: rgba(var(--foreground), 0.5);
2207
2276
  }
2208
2277
 
2278
+ .text-raketa-foreground\/70 {
2279
+ color: rgba(var(--foreground), 0.7);
2280
+ }
2281
+
2209
2282
  .text-raketa-primary {
2210
2283
  --tw-text-opacity: 1;
2211
2284
  color: rgba(var(--primary), var(--tw-text-opacity));
@@ -2221,6 +2294,11 @@ select {
2221
2294
  color: rgb(220 38 38 / var(--tw-text-opacity));
2222
2295
  }
2223
2296
 
2297
+ .text-red-700 {
2298
+ --tw-text-opacity: 1;
2299
+ color: rgb(185 28 28 / var(--tw-text-opacity));
2300
+ }
2301
+
2224
2302
  .text-rose-600 {
2225
2303
  --tw-text-opacity: 1;
2226
2304
  color: rgb(225 29 72 / var(--tw-text-opacity));
@@ -2247,6 +2325,10 @@ select {
2247
2325
  opacity: 0.6;
2248
2326
  }
2249
2327
 
2328
+ .opacity-75 {
2329
+ opacity: 0.75;
2330
+ }
2331
+
2250
2332
  .shadow-inner {
2251
2333
  --tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
2252
2334
  --tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);
@@ -3152,6 +3234,14 @@ body {
3152
3234
  border-color: rgb(64 64 64 / var(--tw-border-opacity));
3153
3235
  }
3154
3236
 
3237
+ .dark\:bg-blue-900\/50:where(.dark, .dark *) {
3238
+ background-color: rgb(30 58 138 / 0.5);
3239
+ }
3240
+
3241
+ .dark\:bg-emerald-900\/50:where(.dark, .dark *) {
3242
+ background-color: rgb(6 78 59 / 0.5);
3243
+ }
3244
+
3155
3245
  .dark\:bg-orange-900\/50:where(.dark, .dark *) {
3156
3246
  background-color: rgb(124 45 18 / 0.5);
3157
3247
  }
@@ -3160,11 +3250,30 @@ body {
3160
3250
  background-color: rgba(var(--primary), 0.15);
3161
3251
  }
3162
3252
 
3253
+ .dark\:bg-red-900\/50:where(.dark, .dark *) {
3254
+ background-color: rgb(127 29 29 / 0.5);
3255
+ }
3256
+
3257
+ .dark\:text-blue-300:where(.dark, .dark *) {
3258
+ --tw-text-opacity: 1;
3259
+ color: rgb(147 197 253 / var(--tw-text-opacity));
3260
+ }
3261
+
3262
+ .dark\:text-emerald-300:where(.dark, .dark *) {
3263
+ --tw-text-opacity: 1;
3264
+ color: rgb(110 231 183 / var(--tw-text-opacity));
3265
+ }
3266
+
3163
3267
  .dark\:text-orange-300:where(.dark, .dark *) {
3164
3268
  --tw-text-opacity: 1;
3165
3269
  color: rgb(253 186 116 / var(--tw-text-opacity));
3166
3270
  }
3167
3271
 
3272
+ .dark\:text-red-300:where(.dark, .dark *) {
3273
+ --tw-text-opacity: 1;
3274
+ color: rgb(252 165 165 / var(--tw-text-opacity));
3275
+ }
3276
+
3168
3277
  .dark\:invert:where(.dark, .dark *) {
3169
3278
  --tw-invert: invert(100%);
3170
3279
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "1.8.10",
3
+ "version": "1.8.12",
4
4
  "main": "src/index.js",
5
5
  "files": [
6
6
  "src/",
@@ -9,7 +9,9 @@
9
9
  "scripts": {
10
10
  "dev": "npx tailwindcss -i ./src/styles/application.css -o ../../apps/admin/static/application.css --watch",
11
11
  "test": "jest --coverage --coverageReporters=html --coverageReporters=\"text-summary\"",
12
- "prepare": "npx tailwindcss -i ./src/styles/application.css -o ./dist/application.css"
12
+ "prepare": "npx tailwindcss -i ./src/styles/application.css -o ./dist/application.css",
13
+ "lint": "biome lint .",
14
+ "lint:fix": "biome lint --write --unsafe ."
13
15
  },
14
16
  "devDependencies": {
15
17
  "@babel/core": "7.29.7",
@@ -65,21 +65,36 @@ function putIn(result, key, value) {
65
65
  const sanitizePath = (filePath) =>
66
66
  path.normalize(path.join("/", ...filePath.split("/")));
67
67
 
68
- // Find template path, preferring an app override over the package template
69
68
  function getPartialPath(partialPath, views, viewsFallback) {
69
+ // First resolve the partial path relative to the views directory
70
+ // This normalizes "../_nav.ejs" relative to "page_revisions/codes"
71
+ // Result: "page_revisions/_nav.ejs"
72
+ const resolvedPartialPath = sanitizePath(`${views}/${partialPath}`);
73
+
70
74
  const paths = [
71
- sanitizePath(`${process.cwd()}/src/views/${views}/${partialPath}`),
72
- sanitizePath(`${currentPath}/views/${views}/${partialPath}`),
73
- viewsFallback && sanitizePath(`${currentPath}/views/${viewsFallback}/${partialPath}`),
74
- ].filter(Boolean);
75
+ sanitizePath(`${process.cwd()}/src/views/${resolvedPartialPath}`),
76
+ sanitizePath(`${currentPath}/views/${resolvedPartialPath}`),
77
+ ];
78
+
79
+ // For fallback, replace the resource name with the fallback path
80
+ if (viewsFallback) {
81
+ // Extract base resource (e.g., "page_revisions" from "page_revisions/codes")
82
+ const resourceBase = views.split("/")[0];
83
+ // Replace resource base with fallback base
84
+ // "page_revisions/_nav.ejs" → "resource_revisions/_nav.ejs" ✓
85
+ const fallbackPath = resolvedPartialPath.replace(
86
+ resourceBase,
87
+ viewsFallback,
88
+ );
89
+ paths.push(sanitizePath(`${currentPath}/views/${fallbackPath}`));
90
+ }
75
91
 
76
- // Return first existing path
77
92
  const existingPath = paths.find((path) => existsSync(path));
78
93
 
79
94
  if (existingPath) return existingPath;
80
95
 
81
96
  throw new Error(
82
- `Template not found: "${partialPath}"\nSearched in:\n${paths.join("\n")}`
97
+ `Template not found: "${partialPath}"\nSearched in:\n${paths.join("\n")}`,
83
98
  );
84
99
  }
85
100
 
@@ -184,7 +199,7 @@ export default class HonoAdapter {
184
199
  ...assigns,
185
200
  ...localAssigns,
186
201
  },
187
- { filename: partialPath }
202
+ { filename: partialPath },
188
203
  );
189
204
 
190
205
  return rendered;
@@ -197,11 +212,18 @@ export default class HonoAdapter {
197
212
  };
198
213
  }
199
214
 
200
- async renderAction({ views, viewsFallback, action, assigns }, viewHelpersConfig = {}) {
215
+ async renderAction(
216
+ { views, viewsFallback, action, assigns },
217
+ viewHelpersConfig = {},
218
+ ) {
201
219
  // Pick the parent here in the views so we can reuse stuff...
202
220
  const fullTemplatePath = this.getActionPath(views, viewsFallback, action);
203
221
  const renderAssigns = { ...this.getHelpers(viewHelpersConfig), ...assigns };
204
- const renderPartialHelper = this.renderPartial(renderAssigns, views, viewsFallback);
222
+ const renderPartialHelper = this.renderPartial(
223
+ renderAssigns,
224
+ views,
225
+ viewsFallback,
226
+ );
205
227
 
206
228
  try {
207
229
  // Synchronously read the full template file
@@ -214,7 +236,7 @@ export default class HonoAdapter {
214
236
  ...renderAssigns,
215
237
  render_partial: renderPartialHelper,
216
238
  },
217
- { filename: fullTemplatePath }
239
+ { filename: fullTemplatePath },
218
240
  );
219
241
 
220
242
  const fullPage = this.renderLayout(renderAssigns, rendered);
@@ -280,7 +302,7 @@ export default class HonoAdapter {
280
302
 
281
303
  async createAction(
282
304
  [verb, path, resource, views, action, handler],
283
- resourceConfig
305
+ resourceConfig,
284
306
  ) {
285
307
  const { i18n } = this.globalConfig;
286
308
 
@@ -294,7 +316,7 @@ export default class HonoAdapter {
294
316
  next,
295
317
  verb,
296
318
  resource,
297
- action
319
+ action,
298
320
  );
299
321
 
300
322
  // Set context properties
@@ -305,6 +327,7 @@ export default class HonoAdapter {
305
327
  maxOpenRevisions: this.globalConfig?.maxOpenRevisions || 3,
306
328
  locale: currentLocale,
307
329
  remoteConfig: { ...this.globalConfig.remoteConfig },
330
+ globalConfig: this.globalConfig,
308
331
  logger: Logger,
309
332
  });
310
333
 
@@ -328,7 +351,7 @@ export default class HonoAdapter {
328
351
  };
329
352
 
330
353
  ctx.logger.info(
331
- `${ctx.method} "${ctx.rawPath}" -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`
354
+ `${ctx.method} "${ctx.rawPath}" -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`,
332
355
  );
333
356
 
334
357
  const assigns = {
@@ -373,7 +396,7 @@ export default class HonoAdapter {
373
396
 
374
397
  Object.assign(
375
398
  assigns.afterFilterAssigns,
376
- afterResult.assigns || {}
399
+ afterResult.assigns || {},
377
400
  );
378
401
  }
379
402
  }
@@ -395,7 +418,7 @@ export default class HonoAdapter {
395
418
  action,
396
419
  assigns: fullAssigns,
397
420
  },
398
- this.globalConfig?.helpers || {}
421
+ this.globalConfig?.helpers || {},
399
422
  );
400
423
 
401
424
  return routerCtx.html(rendered);
@@ -406,7 +429,7 @@ export default class HonoAdapter {
406
429
  // Single method to handle all route types
407
430
  routeCollection(mapping, resourceConfig) {
408
431
  mapping.forEach((handlerMap) =>
409
- this.createAction(handlerMap, resourceConfig)
432
+ this.createAction(handlerMap, resourceConfig),
410
433
  );
411
434
  }
412
435
 
@@ -428,7 +451,7 @@ export default class HonoAdapter {
428
451
  applyHeaders(headers, router) {
429
452
  if (!headers) return;
430
453
  Object.entries(headers).forEach(([key, value]) =>
431
- router.header(key, value)
454
+ router.header(key, value),
432
455
  );
433
456
  }
434
457
 
package/src/Logger.js CHANGED
@@ -1,21 +1,20 @@
1
- import { inspect } from 'node:util';
1
+ import { inspect } from "node:util";
2
2
 
3
-
4
- const dump = (item) => inspect(item, { depth: null }).replace(/^\'/, '').replace(/\'$/, '')
3
+ const dump = (item) =>
4
+ inspect(item, { depth: null }).replace(/^\'/, "").replace(/\'$/, "");
5
5
 
6
6
  const Logger = {
7
7
  error: (item) => {
8
- console.error('[ERROR]', dump(item));
8
+ console.error("[ERROR]", dump(item));
9
9
  },
10
10
 
11
11
  info: (item) => {
12
- console.info('[INFO]', dump(item));
12
+ console.info("[INFO]", dump(item));
13
13
  },
14
14
 
15
15
  debug: (item) => {
16
- console.debug('[DEBUG]', dump(item));
16
+ console.debug("[DEBUG]", dump(item));
17
17
  },
18
- }
18
+ };
19
19
 
20
20
  export default Logger;
21
-
@@ -39,6 +39,7 @@ export default class RaketaContext {
39
39
 
40
40
  initGlobalContext() {
41
41
  const global = this.getGlobalCtx(this);
42
+
42
43
  for (const key in global) {
43
44
  this[key] = global[key];
44
45
  }
package/src/cipher.js CHANGED
@@ -17,7 +17,7 @@ function encrypt(plaintext, config) {
17
17
  const cipher = createCipheriv(
18
18
  ALGORITHM,
19
19
  deriveKey(config.secrets.crypto_secret),
20
- IV
20
+ IV,
21
21
  );
22
22
 
23
23
  let encrypted = cipher.update(plaintext, "utf8", "hex");
@@ -34,7 +34,7 @@ function decrypt(encryptedText, config) {
34
34
  const decipher = createDecipheriv(
35
35
  ALGORITHM,
36
36
  deriveKey(config.secrets.crypto_secret),
37
- iv
37
+ iv,
38
38
  );
39
39
 
40
40
  let decrypted = decipher.update(encrypted, "hex", "utf8");
@@ -0,0 +1,31 @@
1
+ import RaketaClient from "./RaketaClient.js";
2
+ import {
3
+ ContentTasksDocument,
4
+ ContentTaskEditorsDocument,
5
+ } from "./documents/contentTasksDocuments.js";
6
+
7
+ export default class ContentTasks extends RaketaClient {
8
+ async list(query) {
9
+ const vars = this.buildListInput(query);
10
+
11
+ // Format date filters if any
12
+ if (vars.input.filters) {
13
+ vars.input.filters = this.formatDateFilters(vars.input.filters);
14
+ }
15
+
16
+ const { contentTasks: items } = await this.query(ContentTasksDocument, {
17
+ input: vars.input.filters || vars.input.pagination ? vars.input : null,
18
+ });
19
+
20
+ return items;
21
+ }
22
+
23
+ async editors() {
24
+ const { contentTaskEditors } = await this.query(
25
+ ContentTaskEditorsDocument,
26
+ {},
27
+ );
28
+
29
+ return contentTaskEditors;
30
+ }
31
+ }
@@ -105,7 +105,7 @@ export default class RaketaClient {
105
105
  "x-raketa-project": this.getConfig().cloud.gateway_project,
106
106
  "x-raketa-service": this.getConfig().cloud.dxp_service_private,
107
107
  "x-raketa-identity": this.token,
108
- }
108
+ },
109
109
  );
110
110
  }
111
111
 
@@ -12,7 +12,7 @@ export default class Redirects extends RaketaClient {
12
12
  async list(query) {
13
13
  const { redirects: items } = await this.query(
14
14
  RedirectsDocument,
15
- this.buildListInput(query)
15
+ this.buildListInput(query),
16
16
  );
17
17
 
18
18
  return items;
@@ -73,7 +73,7 @@ export default class Redirects extends RaketaClient {
73
73
  id,
74
74
  locale: "en",
75
75
  },
76
- }
76
+ },
77
77
  );
78
78
 
79
79
  return items;
@@ -21,7 +21,7 @@ export default class ResourceChanges extends RaketaClient {
21
21
  page_size: 50,
22
22
  },
23
23
  },
24
- }
24
+ },
25
25
  );
26
26
 
27
27
  return items;
@@ -39,7 +39,7 @@ export default class ResourceRevisions extends RaketaClient {
39
39
  locale,
40
40
  resourceType,
41
41
  },
42
- }
42
+ },
43
43
  );
44
44
 
45
45
  return items;
@@ -121,7 +121,7 @@ export default class ResourceRevisions extends RaketaClient {
121
121
 
122
122
  async createBatch(revisionInputs) {
123
123
  const BatchStartRevisionDocument = buildBatchStartResourceRevisionDocument(
124
- revisionInputs.length
124
+ revisionInputs.length,
125
125
  );
126
126
 
127
127
  const variables = {};
@@ -133,40 +133,56 @@ export default class Resources extends RaketaClient {
133
133
  return { resource, errors };
134
134
  }
135
135
 
136
- async translate(id, locale, params, resourceType) {
136
+ async translate(id, locale, params, resourceType, workflow) {
137
137
  const paramsCopy = { ...params, resourceType };
138
138
  paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
139
139
  paramsCopy.settings = JSON.stringify(paramsCopy.settings);
140
140
 
141
+ const input = {
142
+ locale,
143
+ sourceResourceId: id,
144
+ resource: paramsCopy,
145
+ };
146
+
147
+ if (workflow) {
148
+ input.workflow = workflow;
149
+ }
150
+
141
151
  const {
142
152
  translateResource: { errors, resource },
143
- } = await this.query(TranslateResourceDocument, {
144
- input: {
145
- locale,
146
- sourceResourceId: id,
147
- resource: paramsCopy,
148
- },
149
- });
153
+ } = await this.query(TranslateResourceDocument, { input });
150
154
 
151
155
  return { resource, errors };
152
156
  }
153
157
 
154
- async translateBatch(sourceResourceId, locales, params, resourceType) {
158
+ async translateBatch(
159
+ sourceResourceId,
160
+ locales,
161
+ params,
162
+ resourceType,
163
+ workflow,
164
+ ) {
155
165
  const paramsCopy = { ...params, resourceType };
156
166
  paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
157
167
  paramsCopy.settings = JSON.stringify(paramsCopy.settings);
158
168
 
159
169
  const BatchTranslateDocument = buildBatchTranslateResourceDocument(
160
- locales.length
170
+ locales.length,
161
171
  );
162
172
 
163
173
  const variables = {};
164
174
  locales.forEach((locale, i) => {
165
- variables[`input${i}`] = {
175
+ const input = {
166
176
  locale,
167
177
  sourceResourceId,
168
178
  resource: paramsCopy,
169
179
  };
180
+
181
+ if (workflow) {
182
+ input.workflow = workflow;
183
+ }
184
+
185
+ variables[`input${i}`] = input;
170
186
  });
171
187
 
172
188
  const response = await this.query(BatchTranslateDocument, variables);
@@ -211,7 +227,7 @@ export default class Resources extends RaketaClient {
211
227
 
212
228
  const { resourceChangePreview } = await this.query(
213
229
  ResourceChangePreviewDocument,
214
- { input }
230
+ { input },
215
231
  );
216
232
 
217
233
  return resourceChangePreview;
package/src/cloud/Tags.js CHANGED
@@ -11,7 +11,7 @@ export default class Tags extends RaketaClient {
11
11
  async list(query, locale) {
12
12
  const { tags: items } = await this.query(
13
13
  TagsDocument,
14
- this.buildListInput(query, locale)
14
+ this.buildListInput(query, locale),
15
15
  );
16
16
 
17
17
  return items;
@@ -22,9 +22,9 @@ export default class Tags extends RaketaClient {
22
22
  input: {
23
23
  locale: locale,
24
24
  orderBy: {
25
- field: 'name',
26
- direction: 'ASC'
27
- }
25
+ field: "name",
26
+ direction: "ASC",
27
+ },
28
28
  },
29
29
  });
30
30
 
@@ -101,3 +101,19 @@ export function summaryChangeFragment() {
101
101
  }
102
102
  `;
103
103
  }
104
+
105
+ export function contentTaskFragment() {
106
+ return gql`
107
+ {
108
+ id
109
+ workflow
110
+ operator
111
+ operatorMeta
112
+ completedAt
113
+ failedAt
114
+ rejectedAt
115
+ insertedAt
116
+ updatedAt
117
+ }
118
+ `;
119
+ }