@raketa-cloud/admin 1.8.10 → 1.8.11

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 +22 -13
  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.11",
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",
@@ -70,7 +70,8 @@ function getPartialPath(partialPath, views, viewsFallback) {
70
70
  const paths = [
71
71
  sanitizePath(`${process.cwd()}/src/views/${views}/${partialPath}`),
72
72
  sanitizePath(`${currentPath}/views/${views}/${partialPath}`),
73
- viewsFallback && sanitizePath(`${currentPath}/views/${viewsFallback}/${partialPath}`),
73
+ viewsFallback &&
74
+ sanitizePath(`${currentPath}/views/${viewsFallback}/${partialPath}`),
74
75
  ].filter(Boolean);
75
76
 
76
77
  // Return first existing path
@@ -79,7 +80,7 @@ function getPartialPath(partialPath, views, viewsFallback) {
79
80
  if (existingPath) return existingPath;
80
81
 
81
82
  throw new Error(
82
- `Template not found: "${partialPath}"\nSearched in:\n${paths.join("\n")}`
83
+ `Template not found: "${partialPath}"\nSearched in:\n${paths.join("\n")}`,
83
84
  );
84
85
  }
85
86
 
@@ -184,7 +185,7 @@ export default class HonoAdapter {
184
185
  ...assigns,
185
186
  ...localAssigns,
186
187
  },
187
- { filename: partialPath }
188
+ { filename: partialPath },
188
189
  );
189
190
 
190
191
  return rendered;
@@ -197,11 +198,18 @@ export default class HonoAdapter {
197
198
  };
198
199
  }
199
200
 
200
- async renderAction({ views, viewsFallback, action, assigns }, viewHelpersConfig = {}) {
201
+ async renderAction(
202
+ { views, viewsFallback, action, assigns },
203
+ viewHelpersConfig = {},
204
+ ) {
201
205
  // Pick the parent here in the views so we can reuse stuff...
202
206
  const fullTemplatePath = this.getActionPath(views, viewsFallback, action);
203
207
  const renderAssigns = { ...this.getHelpers(viewHelpersConfig), ...assigns };
204
- const renderPartialHelper = this.renderPartial(renderAssigns, views, viewsFallback);
208
+ const renderPartialHelper = this.renderPartial(
209
+ renderAssigns,
210
+ views,
211
+ viewsFallback,
212
+ );
205
213
 
206
214
  try {
207
215
  // Synchronously read the full template file
@@ -214,7 +222,7 @@ export default class HonoAdapter {
214
222
  ...renderAssigns,
215
223
  render_partial: renderPartialHelper,
216
224
  },
217
- { filename: fullTemplatePath }
225
+ { filename: fullTemplatePath },
218
226
  );
219
227
 
220
228
  const fullPage = this.renderLayout(renderAssigns, rendered);
@@ -280,7 +288,7 @@ export default class HonoAdapter {
280
288
 
281
289
  async createAction(
282
290
  [verb, path, resource, views, action, handler],
283
- resourceConfig
291
+ resourceConfig,
284
292
  ) {
285
293
  const { i18n } = this.globalConfig;
286
294
 
@@ -294,7 +302,7 @@ export default class HonoAdapter {
294
302
  next,
295
303
  verb,
296
304
  resource,
297
- action
305
+ action,
298
306
  );
299
307
 
300
308
  // Set context properties
@@ -305,6 +313,7 @@ export default class HonoAdapter {
305
313
  maxOpenRevisions: this.globalConfig?.maxOpenRevisions || 3,
306
314
  locale: currentLocale,
307
315
  remoteConfig: { ...this.globalConfig.remoteConfig },
316
+ globalConfig: this.globalConfig,
308
317
  logger: Logger,
309
318
  });
310
319
 
@@ -328,7 +337,7 @@ export default class HonoAdapter {
328
337
  };
329
338
 
330
339
  ctx.logger.info(
331
- `${ctx.method} "${ctx.rawPath}" -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`
340
+ `${ctx.method} "${ctx.rawPath}" -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`,
332
341
  );
333
342
 
334
343
  const assigns = {
@@ -373,7 +382,7 @@ export default class HonoAdapter {
373
382
 
374
383
  Object.assign(
375
384
  assigns.afterFilterAssigns,
376
- afterResult.assigns || {}
385
+ afterResult.assigns || {},
377
386
  );
378
387
  }
379
388
  }
@@ -395,7 +404,7 @@ export default class HonoAdapter {
395
404
  action,
396
405
  assigns: fullAssigns,
397
406
  },
398
- this.globalConfig?.helpers || {}
407
+ this.globalConfig?.helpers || {},
399
408
  );
400
409
 
401
410
  return routerCtx.html(rendered);
@@ -406,7 +415,7 @@ export default class HonoAdapter {
406
415
  // Single method to handle all route types
407
416
  routeCollection(mapping, resourceConfig) {
408
417
  mapping.forEach((handlerMap) =>
409
- this.createAction(handlerMap, resourceConfig)
418
+ this.createAction(handlerMap, resourceConfig),
410
419
  );
411
420
  }
412
421
 
@@ -428,7 +437,7 @@ export default class HonoAdapter {
428
437
  applyHeaders(headers, router) {
429
438
  if (!headers) return;
430
439
  Object.entries(headers).forEach(([key, value]) =>
431
- router.header(key, value)
440
+ router.header(key, value),
432
441
  );
433
442
  }
434
443
 
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
+ }
@@ -0,0 +1,59 @@
1
+ import { gql } from "graphql-request";
2
+
3
+ /**
4
+ * Query to fetch all content tasks with filters
5
+ */
6
+ export const ContentTasksDocument = gql`
7
+ query ContentTasks($input: ContentTasksInput) {
8
+ contentTasks(input: $input) {
9
+ list {
10
+ id
11
+ workflow
12
+ operator
13
+ operatorMeta
14
+ completedAt
15
+ failedAt
16
+ rejectedAt
17
+ insertedAt
18
+ updatedAt
19
+ resource {
20
+ id
21
+ title
22
+ slug
23
+ locale
24
+ visibility
25
+ resourceType
26
+ insertedAt
27
+ updatedAt
28
+ }
29
+ lokaliseWorkflow {
30
+ id
31
+ status
32
+ settings
33
+ insertedAt
34
+ updatedAt
35
+ }
36
+ }
37
+ pagination {
38
+ currentPage
39
+ pagesCount
40
+ entriesCount
41
+ pageSize
42
+ }
43
+ }
44
+ }
45
+ `;
46
+
47
+ /**
48
+ * Query to fetch unique editors/operators for filtering
49
+ */
50
+ export const ContentTaskEditorsDocument = gql`
51
+ query ContentTaskEditors {
52
+ contentTaskEditors {
53
+ list {
54
+ id
55
+ name
56
+ }
57
+ }
58
+ }
59
+ `;