@raketa-cloud/admin 0.0.30 → 0.0.33

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 (173) hide show
  1. package/package.json +1 -1
  2. package/src/Adapter.js +3 -6
  3. package/src/HonoAdapter.js +3 -3
  4. package/src/Logger.js +21 -0
  5. package/src/cloud/ArticleRevisions.js +30 -1
  6. package/src/cloud/Articles.js +22 -9
  7. package/src/cloud/EventRevisions.js +40 -1
  8. package/src/cloud/Events.js +32 -11
  9. package/src/cloud/PageRevisions.js +20 -1
  10. package/src/cloud/Pages.js +13 -7
  11. package/src/cloud/RaketaClient.js +76 -0
  12. package/src/handlers/article_revisions/CodeHandler.js +18 -34
  13. package/src/handlers/article_revisions/GeneralHandler.js +19 -38
  14. package/src/handlers/article_revisions/LocksHandler.js +11 -6
  15. package/src/handlers/article_revisions/MetaHandler.js +18 -34
  16. package/src/handlers/article_revisions/TagHandler.js +23 -29
  17. package/src/handlers/article_revisions/UnlocksHandler.js +1 -1
  18. package/src/handlers/article_revisions/VisualHandler.js +18 -28
  19. package/src/handlers/articles/ArticlesHandler.js +11 -25
  20. package/src/handlers/articles/DeletesHandler.js +4 -4
  21. package/src/handlers/articles/TranslationsHandler.js +30 -56
  22. package/src/handlers/articles/URLsHandler.js +7 -7
  23. package/src/handlers/event_revisions/CodeHandler.js +22 -36
  24. package/src/handlers/event_revisions/GeneralHandler.js +22 -42
  25. package/src/handlers/event_revisions/LocksHandler.js +7 -6
  26. package/src/handlers/event_revisions/MetaHandler.js +22 -36
  27. package/src/handlers/event_revisions/TagHandler.js +25 -29
  28. package/src/handlers/event_revisions/VisualHandler.js +22 -30
  29. package/src/handlers/events/DeletesHandler.js +4 -4
  30. package/src/handlers/events/EventsHandler.js +13 -27
  31. package/src/handlers/events/TranslationsHandler.js +35 -58
  32. package/src/handlers/events/URLsHandler.js +7 -7
  33. package/src/handlers/page_revisions/CodeHandler.js +8 -34
  34. package/src/handlers/page_revisions/GeneralHandler.js +10 -37
  35. package/src/handlers/page_revisions/LocksHandler.js +11 -6
  36. package/src/handlers/page_revisions/MetaHandler.js +8 -34
  37. package/src/handlers/page_revisions/TagHandler.js +16 -27
  38. package/src/handlers/page_revisions/VisualHandler.js +8 -28
  39. package/src/handlers/pages/DeletesHandler.js +4 -4
  40. package/src/handlers/pages/PagesHandler.js +7 -24
  41. package/src/handlers/pages/TranslationsHandler.js +23 -45
  42. package/src/handlers/pages/URLsHandler.js +7 -7
  43. package/src/helpers/FormBuilder.js +1 -2
  44. package/src/helpers/Inflector.js +6 -0
  45. package/src/index.js +2 -0
  46. package/src/styles/application.css +7 -7
  47. package/src/tests/handlers/RedirectsHandler.test/create.test.js +1 -1
  48. package/src/tests/handlers/RedirectsHandler.test/create_form.test.js +1 -1
  49. package/src/tests/handlers/RedirectsHandler.test/destroy.test.js +1 -1
  50. package/src/tests/handlers/RedirectsHandler.test/edit_form.test.js +1 -1
  51. package/src/tests/handlers/RedirectsHandler.test/index.test.js +1 -1
  52. package/src/tests/handlers/RedirectsHandler.test/show.test.js +1 -1
  53. package/src/tests/handlers/RedirectsHandler.test/update.test.js +1 -1
  54. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/create.test.js +1 -1
  55. package/src/tests/handlers/article_revisions/ArticleRevisionsHandler.test/destroy.test.js +1 -1
  56. package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +7 -7
  57. package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +37 -19
  58. package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +5 -11
  59. package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +36 -28
  60. package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +7 -8
  61. package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +41 -25
  62. package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +2 -2
  63. package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +2 -2
  64. package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +1 -1
  65. package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +10 -7
  66. package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +20 -14
  67. package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +7 -6
  68. package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +30 -19
  69. package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +2 -2
  70. package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +2 -2
  71. package/src/tests/handlers/articles/ArticlesHandler.test/create.test.js +53 -29
  72. package/src/tests/handlers/articles/ArticlesHandler.test/create_form.test.js +3 -3
  73. package/src/tests/handlers/articles/ArticlesHandler.test/index.test.js +2 -2
  74. package/src/tests/handlers/articles/ArticlesHandler.test/show.test.js +3 -3
  75. package/src/tests/handlers/articles/ClonesHandler.test/create.test.js +1 -1
  76. package/src/tests/handlers/articles/DeletesHandler.test/create.test.js +4 -4
  77. package/src/tests/handlers/articles/DeletesHandler.test/create_form.test.js +2 -2
  78. package/src/tests/handlers/articles/URLsHandler.test/create.test.js +6 -6
  79. package/src/tests/handlers/articles/URLsHandler.test/create_form.test.js +2 -2
  80. package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +11 -7
  81. package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +43 -19
  82. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/create.test.js +1 -1
  83. package/src/tests/handlers/event_revisions/EventRevisionsHandler.test/destroy.test.js +1 -1
  84. package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +7 -13
  85. package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +42 -32
  86. package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +11 -8
  87. package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +47 -25
  88. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +2 -2
  89. package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +2 -2
  90. package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +1 -1
  91. package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +14 -7
  92. package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +26 -14
  93. package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +11 -6
  94. package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +36 -19
  95. package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +2 -2
  96. package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +2 -2
  97. package/src/tests/handlers/events/ClonesHandler.test/create.test.js +1 -1
  98. package/src/tests/handlers/events/DeletesHandler.test/create.test.js +4 -4
  99. package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +2 -2
  100. package/src/tests/handlers/events/EventsHandler.test/create.test.js +53 -37
  101. package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +3 -3
  102. package/src/tests/handlers/events/EventsHandler.test/index.test.js +2 -2
  103. package/src/tests/handlers/events/EventsHandler.test/show.test.js +3 -3
  104. package/src/tests/handlers/events/URLsHandler.test/create.test.js +6 -6
  105. package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +2 -2
  106. package/src/tests/handlers/page_revisions/CodesHandler.test/edit_form.test.js +10 -8
  107. package/src/tests/handlers/page_revisions/CodesHandler.test/update.test.js +30 -17
  108. package/src/tests/handlers/page_revisions/GeneralHandler.test/edit_form.test.js +3 -11
  109. package/src/tests/handlers/page_revisions/GeneralHandler.test/update.test.js +38 -22
  110. package/src/tests/handlers/page_revisions/MetaHandler.test/edit_form.test.js +2 -8
  111. package/src/tests/handlers/page_revisions/MetaHandler.test/update.test.js +37 -23
  112. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/create.test.js +1 -1
  113. package/src/tests/handlers/page_revisions/PageRevisionsHandler.test/destroy.test.js +1 -1
  114. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +2 -2
  115. package/src/tests/handlers/page_revisions/PublishesHandler.test/create_form.test.js +2 -2
  116. package/src/tests/handlers/page_revisions/RevertsHandler.test/create.test.js +1 -1
  117. package/src/tests/handlers/page_revisions/TagHandler.test/edit_form.test.js +3 -7
  118. package/src/tests/handlers/page_revisions/TagHandler.test/update.test.js +11 -12
  119. package/src/tests/handlers/page_revisions/VisualHandler.test.test/edit_form.test.js +10 -7
  120. package/src/tests/handlers/page_revisions/VisualHandler.test.test/update.test.js +23 -17
  121. package/src/tests/handlers/page_revisions/WidgetHandler.test/show.test.js +2 -2
  122. package/src/tests/handlers/page_revisions/WidgetHandler.test/update.test.js +2 -2
  123. package/src/tests/handlers/pages/ConesHandler.test/create.test.js +1 -1
  124. package/src/tests/handlers/pages/DeletesHandler.test/create.test.js +4 -4
  125. package/src/tests/handlers/pages/DeletesHandler.test/create_form.test.js +2 -2
  126. package/src/tests/handlers/pages/PagesHandler.test/create.test.js +50 -27
  127. package/src/tests/handlers/pages/PagesHandler.test/create_form.test.js +3 -3
  128. package/src/tests/handlers/pages/PagesHandler.test/index.test.js +2 -2
  129. package/src/tests/handlers/pages/PagesHandler.test/show.test.js +3 -3
  130. package/src/tests/handlers/pages/URLsHandler.test/create.test.js +6 -6
  131. package/src/tests/handlers/pages/URLsHandler.test/create_form.test.js +2 -2
  132. package/src/utils.js +12 -0
  133. package/src/views/_shared/_credentials_input.ejs +31 -0
  134. package/src/views/_shared/_layout_input.ejs +5 -0
  135. package/src/views/article_revisions/_nav.ejs +5 -5
  136. package/src/views/article_revisions/codes/edit_form.ejs +17 -6
  137. package/src/views/article_revisions/general/edit_form.ejs +10 -36
  138. package/src/views/article_revisions/locks/create_form.ejs +4 -4
  139. package/src/views/article_revisions/meta/edit_form.ejs +7 -7
  140. package/src/views/article_revisions/tags/edit_form.ejs +5 -5
  141. package/src/views/article_revisions/visuals/edit_form.ejs +5 -9
  142. package/src/views/articles/_form.ejs +6 -37
  143. package/src/views/articles/deletes/create_form.ejs +9 -9
  144. package/src/views/articles/index.ejs +1 -1
  145. package/src/views/articles/translations/_form.ejs +14 -46
  146. package/src/views/articles/urls/create_form.ejs +5 -5
  147. package/src/views/event_revisions/_nav.ejs +5 -5
  148. package/src/views/event_revisions/codes/edit_form.ejs +17 -6
  149. package/src/views/event_revisions/general/edit_form.ejs +12 -38
  150. package/src/views/event_revisions/locks/create_form.ejs +4 -4
  151. package/src/views/event_revisions/meta/edit_form.ejs +7 -7
  152. package/src/views/event_revisions/tags/edit_form.ejs +5 -5
  153. package/src/views/event_revisions/visuals/edit_form.ejs +5 -9
  154. package/src/views/events/_form.ejs +8 -39
  155. package/src/views/events/deletes/create_form.ejs +9 -9
  156. package/src/views/events/index.ejs +1 -1
  157. package/src/views/events/translations/_form.ejs +16 -47
  158. package/src/views/events/urls/create_form.ejs +5 -5
  159. package/src/views/layouts/application.ejs +57 -35
  160. package/src/views/page_revisions/_nav.ejs +5 -5
  161. package/src/views/page_revisions/codes/edit_form.ejs +17 -6
  162. package/src/views/page_revisions/general/edit_form.ejs +8 -35
  163. package/src/views/page_revisions/locks/create_form.ejs +4 -4
  164. package/src/views/page_revisions/meta/edit_form.ejs +7 -7
  165. package/src/views/page_revisions/publishes/_form.ejs +9 -9
  166. package/src/views/page_revisions/tags/edit_form.ejs +5 -5
  167. package/src/views/page_revisions/visuals/edit_form.ejs +5 -9
  168. package/src/views/pages/_form.ejs +5 -36
  169. package/src/views/pages/deletes/create_form.ejs +9 -9
  170. package/src/views/pages/index.ejs +1 -1
  171. package/src/views/pages/translations/_form.ejs +13 -45
  172. package/src/views/pages/urls/create_form.ejs +5 -5
  173. package/tailwind.config.js +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "0.0.30",
3
+ "version": "0.0.33",
4
4
  "main": "src/index.js",
5
5
  "scripts": {
6
6
  "dev": "npx tailwindcss -i ./src/styles/application.css -o ../../apps/admin/static/application.css --watch",
package/src/Adapter.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import ejs from "ejs";
4
+ import Logger from "./Logger";
4
5
  import currentPath from "./currentPath.cjs";
5
6
  import FormBuilder from "./helpers/FormBuilder";
6
7
  import HTMLBuilder from "./helpers/HTMLBuilder";
7
8
  import form_for from "./helpers/form_for";
8
9
  import pagination from "./helpers/pagination_helper";
9
10
  import sort_button from "./helpers/sort_button";
11
+ import Inflector from "./helpers/Inflector";
10
12
 
11
13
  function escapeHtml(string) {
12
14
  var matchHtmlRegExp = /["'&<>]/;
@@ -66,12 +68,6 @@ const renderError = (message, stack) => {
66
68
  return `<style>${errorCSS}</style><div class="fail-squid">🦑</div><h1>${message}</h1><pre>${escapeHtml(stack)}</pre>`;
67
69
  };
68
70
 
69
- const Logger = {
70
- error: (msg) => {
71
- console.error(`\x1b[31m🦑 ${msg}\x1b[0m`);
72
- },
73
- };
74
-
75
71
  function putIn(result, key, value) {
76
72
  const segments = key.split(/[\[\]]+/).filter(Boolean);
77
73
  let current = result;
@@ -164,6 +160,7 @@ export default class Adapter {
164
160
  form_for: form_for(viewHelpersConfig),
165
161
  sort_button,
166
162
  pagination,
163
+ Inflector,
167
164
  };
168
165
  }
169
166
 
@@ -1,4 +1,5 @@
1
1
  import Adapter from "./Adapter";
2
+ import Logger from "./Logger";
2
3
  import RaketaContext from "./RaketaContext";
3
4
  import setupAuthentication from "./setupAuthentication";
4
5
 
@@ -101,6 +102,7 @@ export default class HonoAdapter extends Adapter {
101
102
  ctx.defaultLocale = this.globalConfig.i18n.defaultLocale;
102
103
  ctx.locale = currentLocale;
103
104
  ctx.remoteConfig = { ...this.globalConfig.remoteConfig };
105
+ ctx.logger = Logger;
104
106
 
105
107
  const _context = {
106
108
  timezones: this.globalConfig.i18n.timezones,
@@ -115,9 +117,7 @@ export default class HonoAdapter extends Adapter {
115
117
  resourceConfig: resourceConfig,
116
118
  };
117
119
 
118
- console.info(
119
- `\x1b[35m[${ctx.method}] ${ctx.rawPath}\x1b[0m -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`
120
- );
120
+ ctx.logger.info(`${ctx.method} "${ctx.rawPath}" -> ${resource}/${action} | ${JSON.stringify(ctx.params)}`);
121
121
 
122
122
  const assigns = {
123
123
  beforeFilterAssigns: {},
package/src/Logger.js ADDED
@@ -0,0 +1,21 @@
1
+ import { inspect } from 'node:util';
2
+
3
+
4
+ const dump = (item) => inspect(item, { depth: null }).replace(/^\'/, '').replace(/\'$/, '')
5
+
6
+ const Logger = {
7
+ error: (item) => {
8
+ console.error('[ERROR]', dump(item));
9
+ },
10
+
11
+ info: (item) => {
12
+ console.info('[INFO]', dump(item));
13
+ },
14
+
15
+ debug: (item) => {
16
+ console.debug('[DEBUG]', dump(item));
17
+ },
18
+ }
19
+
20
+ export default Logger;
21
+
@@ -11,8 +11,32 @@ import {
11
11
  UpdateArticleWidgetsDocument,
12
12
  ReopenArticleChangeDocument,
13
13
  } from "./documents/articlesDocuments";
14
+ import { toUTCISO8601String } from "../utils";
14
15
 
15
16
  export default class ArticleRevisions extends RaketaClient {
17
+ selectUpdateParams(revision) {
18
+ return {
19
+ title: revision.title,
20
+ slug: revision.slug,
21
+ publishAt: revision.publishAt,
22
+ widgets: [...revision.widgets],
23
+ settings: {
24
+ ...revision.settings,
25
+ },
26
+ visibility: revision.visibility,
27
+ tags: revision.tags.map((t) => (t.id ? t.id : t)),
28
+ categories: revision.categories.map((c) => (c.id ? c.id : c)),
29
+ };
30
+ }
31
+
32
+ formatDates(params) {
33
+ if (params.publishAt) {
34
+ params.publishAt = toUTCISO8601String(params.publishAt);
35
+ }
36
+
37
+ return { ...params };
38
+ }
39
+
16
40
  async all(articleId, locale) {
17
41
  const { articleRevisions: items } = await this.query(
18
42
  ArticleRevisionsDocument,
@@ -69,13 +93,18 @@ export default class ArticleRevisions extends RaketaClient {
69
93
  }
70
94
 
71
95
  async update(id, locale, params) {
96
+ const copyParams = { ...params };
97
+
98
+ copyParams.widgets = JSON.stringify(params.widgets || []);
99
+ copyParams.settings = JSON.stringify(params.settings || {});
100
+
72
101
  const {
73
102
  updateArticle: { errors, article },
74
103
  } = await this.query(UpdateArticleDocument, {
75
104
  input: {
76
105
  id,
77
106
  locale,
78
- article: params,
107
+ article: copyParams,
79
108
  },
80
109
  });
81
110
 
@@ -8,19 +8,30 @@ import {
8
8
  TranslateArticleDocument,
9
9
  ChangeArticleSlugDocument,
10
10
  } from "./documents/articlesDocuments";
11
- import { toDateTimeInput } from "../utils";
11
+ import { toDateTimeInput, toUTCISO8601String } from "../utils";
12
12
 
13
13
  export default class Articles extends RaketaClient {
14
14
  defaults() {
15
15
  return {
16
16
  visibility: "private",
17
- layout: "default",
18
- publish_at: toDateTimeInput(new Date()),
17
+ publishAt: toDateTimeInput(new Date()),
18
+ settings: {
19
+ layout: "default",
20
+ },
21
+ widgets: [],
19
22
  tags: [],
20
23
  categories: [],
21
24
  };
22
25
  }
23
26
 
27
+ formatDates(params) {
28
+ if (params.publishAt) {
29
+ params.publishAt = toUTCISO8601String(params.publishAt);
30
+ }
31
+
32
+ return { ...params };
33
+ }
34
+
24
35
  visibilityOptions() {
25
36
  return [
26
37
  ["private", "Private"],
@@ -68,15 +79,16 @@ export default class Articles extends RaketaClient {
68
79
  }
69
80
 
70
81
  async create(params, locale, articleTypeSlug) {
71
- params.widgets = JSON.stringify(params.widgets);
72
- params.settings = JSON.stringify(params.settings);
82
+ const paramsCopy = { ...params };
83
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
84
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
73
85
 
74
86
  const {
75
87
  createArticle: { errors, article },
76
88
  } = await this.query(CreateArticleDocument, {
77
89
  input: {
78
90
  locale,
79
- article: params,
91
+ article: paramsCopy,
80
92
  articleTypeSlug,
81
93
  },
82
94
  });
@@ -112,8 +124,9 @@ export default class Articles extends RaketaClient {
112
124
  }
113
125
 
114
126
  async translate(id, locale, params) {
115
- params.widgets = JSON.stringify(params.widgets);
116
- params.settings = JSON.stringify(params.settings);
127
+ const paramsCopy = { ...params };
128
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
129
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
117
130
 
118
131
  const {
119
132
  translateArticle: { errors, article },
@@ -121,7 +134,7 @@ export default class Articles extends RaketaClient {
121
134
  input: {
122
135
  locale,
123
136
  sourceArticleId: id,
124
- article: params,
137
+ article: paramsCopy,
125
138
  },
126
139
  });
127
140
 
@@ -11,8 +11,42 @@ import {
11
11
  UpdateEventWidgetsDocument,
12
12
  ReopenEventChangeDocument,
13
13
  } from "./documents/eventsDocuments";
14
+ import { toUTCISO8601String } from "../utils";
14
15
 
15
16
  export default class EventRevisions extends RaketaClient {
17
+ selectUpdateParams(revision) {
18
+ return {
19
+ title: revision.title,
20
+ slug: revision.slug,
21
+ publishAt: revision.publishAt,
22
+ startsAt: revision.startsAt,
23
+ endsAt: revision.endsAt,
24
+ widgets: [...revision.widgets],
25
+ settings: {
26
+ ...revision.settings,
27
+ },
28
+ visibility: revision.visibility,
29
+ tags: revision.tags.map((t) => (t.id ? t.id : t)),
30
+ categories: revision.categories.map((c) => (c.id ? c.id : c)),
31
+ };
32
+ }
33
+
34
+ formatDates(params) {
35
+ if (params.publishAt) {
36
+ params.publishAt = toUTCISO8601String(params.publishAt);
37
+ }
38
+
39
+ if (params.startsAt) {
40
+ params.startsAt = toUTCISO8601String(params.startsAt);
41
+ }
42
+
43
+ if (params.endsAt) {
44
+ params.endsAt = toUTCISO8601String(params.endsAt);
45
+ }
46
+
47
+ return { ...params };
48
+ }
49
+
16
50
  async all(eventId, locale) {
17
51
  const { eventRevisions: items } = await this.query(EventRevisionsDocument, {
18
52
  input: {
@@ -66,13 +100,18 @@ export default class EventRevisions extends RaketaClient {
66
100
  }
67
101
 
68
102
  async update(id, locale, params) {
103
+ const copyParams = { ...params };
104
+
105
+ copyParams.widgets = JSON.stringify(params.widgets || []);
106
+ copyParams.settings = JSON.stringify(params.settings || {});
107
+
69
108
  const {
70
109
  updateEvent: { errors, event },
71
110
  } = await this.query(UpdateEventDocument, {
72
111
  input: {
73
112
  id,
74
113
  locale,
75
- event: params,
114
+ event: copyParams,
76
115
  },
77
116
  });
78
117
 
@@ -8,21 +8,40 @@ import {
8
8
  TranslateEventDocument,
9
9
  ChangeEventSlugDocument,
10
10
  } from "./documents/eventsDocuments";
11
- import { toDateTimeInput } from "../utils";
11
+ import { toDateTimeInput, toUTCISO8601String } from "../utils";
12
12
 
13
13
  export default class Events extends RaketaClient {
14
14
  defaults() {
15
15
  return {
16
16
  visibility: "private",
17
- layout: "default",
18
- publish_at: toDateTimeInput(),
19
- starts_at: toDateTimeInput(),
20
- ends_at: toDateTimeInput(),
17
+ publishAt: toDateTimeInput(),
18
+ startsAt: toDateTimeInput(),
19
+ endsAt: toDateTimeInput(),
20
+ settings: {
21
+ layout: "default",
22
+ },
23
+ widgets: [],
21
24
  tags: [],
22
25
  categories: [],
23
26
  };
24
27
  }
25
28
 
29
+ formatDates(params) {
30
+ if (params.publishAt) {
31
+ params.publishAt = toUTCISO8601String(params.publishAt);
32
+ }
33
+
34
+ if (params.startsAt) {
35
+ params.startsAt = toUTCISO8601String(params.startsAt);
36
+ }
37
+
38
+ if (params.endsAt) {
39
+ params.endsAt = toUTCISO8601String(params.endsAt);
40
+ }
41
+
42
+ return { ...params };
43
+ }
44
+
26
45
  visibilityOptions() {
27
46
  return [
28
47
  ["private", "Private"],
@@ -70,15 +89,16 @@ export default class Events extends RaketaClient {
70
89
  }
71
90
 
72
91
  async create(params, locale, eventTypeSlug) {
73
- params.widgets = JSON.stringify(params.widgets);
74
- params.settings = JSON.stringify(params.settings);
92
+ const paramsCopy = { ...params };
93
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
94
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
75
95
 
76
96
  const {
77
97
  createEvent: { errors, event },
78
98
  } = await this.query(CreateEventDocument, {
79
99
  input: {
80
100
  locale,
81
- event: params,
101
+ event: paramsCopy,
82
102
  eventTypeSlug,
83
103
  },
84
104
  });
@@ -114,8 +134,9 @@ export default class Events extends RaketaClient {
114
134
  }
115
135
 
116
136
  async translate(id, locale, params) {
117
- params.widgets = JSON.stringify(params.widgets);
118
- params.settings = JSON.stringify(params.settings);
137
+ const paramsCopy = { ...params };
138
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
139
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
119
140
 
120
141
  const {
121
142
  translateEvent: { errors, event },
@@ -123,7 +144,7 @@ export default class Events extends RaketaClient {
123
144
  input: {
124
145
  locale,
125
146
  sourceEventId: id,
126
- event: params,
147
+ event: paramsCopy,
127
148
  },
128
149
  });
129
150
 
@@ -13,6 +13,20 @@ import {
13
13
  } from "./documents/pagesDocuments";
14
14
 
15
15
  export default class PageRevisions extends RaketaClient {
16
+ selectUpdateParams(revision) {
17
+ return {
18
+ title: revision.title,
19
+ slug: revision.slug,
20
+ widgets: [...revision.widgets],
21
+ settings: {
22
+ ...revision.settings,
23
+ },
24
+ visibility: revision.visibility,
25
+ tags: revision.tags.map((t) => (t.id ? t.id : t)),
26
+ categories: revision.categories.map((c) => (c.id ? c.id : c)),
27
+ };
28
+ }
29
+
16
30
  async all(pageId, locale) {
17
31
  const { pageRevisions: items } = await this.query(PageRevisionsDocument, {
18
32
  input: {
@@ -66,13 +80,18 @@ export default class PageRevisions extends RaketaClient {
66
80
  }
67
81
 
68
82
  async update(id, locale, params) {
83
+ const copyParams = { ...params };
84
+
85
+ copyParams.widgets = JSON.stringify(params.widgets || []);
86
+ copyParams.settings = JSON.stringify(params.settings || {});
87
+
69
88
  const {
70
89
  updatePage: { errors, page },
71
90
  } = await this.query(UpdatePageDocument, {
72
91
  input: {
73
92
  id,
74
93
  locale,
75
- page: params,
94
+ page: copyParams,
76
95
  },
77
96
  });
78
97
 
@@ -13,9 +13,12 @@ export default class Pages extends RaketaClient {
13
13
  defaults() {
14
14
  return {
15
15
  visibility: "private",
16
- layout: "default",
17
16
  tags: [],
18
17
  categories: [],
18
+ widgets: [],
19
+ settings: {
20
+ layout: "default",
21
+ },
19
22
  };
20
23
  }
21
24
 
@@ -66,15 +69,16 @@ export default class Pages extends RaketaClient {
66
69
  }
67
70
 
68
71
  async create(params, locale, pageTypeSlug) {
69
- params.widgets = JSON.stringify(params.widgets);
70
- params.settings = JSON.stringify(params.settings);
72
+ const paramsCopy = { ...params };
73
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
74
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
71
75
 
72
76
  const {
73
77
  createPage: { errors, page },
74
78
  } = await this.query(CreatePageDocument, {
75
79
  input: {
76
80
  locale,
77
- page: params,
81
+ page: paramsCopy,
78
82
  pageTypeSlug,
79
83
  },
80
84
  });
@@ -110,8 +114,10 @@ export default class Pages extends RaketaClient {
110
114
  }
111
115
 
112
116
  async translate(id, locale, params) {
113
- params.widgets = JSON.stringify(params.widgets);
114
- params.settings = JSON.stringify(params.settings);
117
+ const copyParams = { ...params };
118
+
119
+ copyParams.widgets = JSON.stringify(copyParams.widgets);
120
+ copyParams.settings = JSON.stringify(copyParams.settings);
115
121
 
116
122
  const {
117
123
  translatePage: { errors, page },
@@ -119,7 +125,7 @@ export default class Pages extends RaketaClient {
119
125
  input: {
120
126
  locale,
121
127
  sourcePageId: id,
122
- page: params,
128
+ page: copyParams,
123
129
  },
124
130
  });
125
131
 
@@ -8,6 +8,78 @@ function isObjectEmpty(obj) {
8
8
  return true;
9
9
  }
10
10
 
11
+ function deepMerge(target, updates) {
12
+ if (typeof target !== "object" || target === null) {
13
+ return updates;
14
+ }
15
+
16
+ if (typeof updates !== "object" || updates === null) {
17
+ return target;
18
+ }
19
+
20
+ for (let key of Object.keys(updates)) {
21
+ if (Array.isArray(updates[key])) {
22
+ if (!Array.isArray(target[key])) {
23
+ target[key] = [];
24
+ }
25
+ target[key] = updates[key];
26
+ } else if (typeof updates[key] === "object" && updates[key] !== null) {
27
+ if (!target[key] || typeof target[key] !== "object") {
28
+ target[key] = {};
29
+ }
30
+ target[key] = deepMerge(target[key], updates[key]);
31
+ } else {
32
+ target[key] = updates[key];
33
+ }
34
+ }
35
+
36
+ return target;
37
+ }
38
+
39
+ function parseJson(str) {
40
+ if (!str) {
41
+ return str;
42
+ }
43
+
44
+ try {
45
+ const res = JSON.parse(str);
46
+
47
+ if (typeof res === "object") {
48
+ return res;
49
+ }
50
+
51
+ return str;
52
+ } catch (e) {
53
+ return str;
54
+ }
55
+ }
56
+
57
+ function parseJsonFields(params) {
58
+ if (!params) {
59
+ return params;
60
+ }
61
+
62
+ if (typeof params === "string") {
63
+ return parseJson(params);
64
+ }
65
+
66
+ for (let key of Object.keys(params)) {
67
+ if (typeof params[key] === "string") {
68
+ params[key] = parseJson(params[key]);
69
+ }
70
+
71
+ if (Array.isArray(params[key])) {
72
+ params[key] = params[key].map((item) => parseJsonFields(item));
73
+ }
74
+
75
+ if (typeof params[key] === "object") {
76
+ params[key] = parseJsonFields(params[key]);
77
+ }
78
+ }
79
+
80
+ return params;
81
+ }
82
+
11
83
  export default class RaketaClient {
12
84
  constructor(getConfig, token) {
13
85
  this.getConfig = getConfig;
@@ -134,4 +206,8 @@ export default class RaketaClient {
134
206
 
135
207
  return variables;
136
208
  }
209
+
210
+ deepMerge(target, source) {
211
+ return parseJsonFields(deepMerge(structuredClone(target), source));
212
+ }
137
213
  }
@@ -1,27 +1,23 @@
1
+ import { toDateTimeInput } from "../../utils";
2
+
1
3
  const edit_form = async (ctx) => {
2
4
  const { parent_id } = ctx.params;
3
5
 
4
- const revision = await ctx.client.articleRevisions.find(
6
+ const resource = await ctx.client.articleRevisions.find(
5
7
  parent_id,
6
8
  ctx.locale
7
9
  );
8
10
 
9
- if (!revision) {
11
+ if (!resource) {
10
12
  throw new Error(`Missing revision #${parent_id}`);
11
13
  }
12
14
 
13
- const code_settings = {
14
- id: revision.id,
15
- originalId: revision.originalId,
16
- scripts: JSON.stringify(revision.settings.codes?.scripts || []),
17
- structured_data: JSON.stringify(
18
- revision.settings.codes?.structured_data || {}
19
- ),
20
- };
21
-
22
15
  return {
23
16
  assigns: {
24
- code_settings,
17
+ resource: {
18
+ ...resource,
19
+ publishAt: toDateTimeInput(resource.publishAt),
20
+ },
25
21
  errors: {},
26
22
  _translations: [],
27
23
  },
@@ -40,39 +36,27 @@ const update = async (ctx) => {
40
36
  throw new Error(`Missing revision #${parent_id}`);
41
37
  }
42
38
 
43
- const params = ctx.resourceParams.code_settings;
39
+ const params = ctx.resourceParams.resource;
40
+ const resource = ctx.client.articleRevisions.deepMerge(
41
+ revision,
42
+ ctx.client.articleRevisions.formatDates(params)
43
+ );
44
44
 
45
45
  const { errors } = await ctx.client.articleRevisions.update(
46
46
  revision.id,
47
47
  ctx.locale,
48
- {
49
- slug: revision.slug,
50
- title: revision.title,
51
- visibility: revision.visibility,
52
- publishAt: revision.publishAt,
53
- widgets: JSON.stringify(revision.widgets),
54
- tags: revision.tags.map((t) => t.id),
55
- categories: revision.categories.map((c) => c.id),
56
- settings: JSON.stringify({
57
- ...revision.settings,
58
- codes: {
59
- scripts: JSON.parse(params.scripts),
60
- structured_data: JSON.parse(params.structured_data),
61
- },
62
- }),
63
- }
48
+ ctx.client.articleRevisions.selectUpdateParams(resource)
64
49
  );
65
50
 
66
51
  if (errors) {
67
52
  return {
68
53
  assigns: {
69
- code_settings: {
70
- ...params,
71
- id: revision.id,
72
- originalId: revision.originalId,
54
+ resource: {
55
+ ...resource,
56
+ publishAt: toDateTimeInput(resource.publishAt),
73
57
  },
74
58
  errors: {
75
- code_settings: ctx.client.articleRevisions.formatErrors(errors),
59
+ resource: ctx.client.articleRevisions.formatErrors(errors),
76
60
  },
77
61
  _translations: [],
78
62
  },