@raketa-cloud/admin 0.0.88 → 0.0.91

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 (33) hide show
  1. package/jest.config.js +22 -0
  2. package/package.json +2 -2
  3. package/src/cloud/ArticleRevisions.js +33 -5
  4. package/src/cloud/Articles.js +34 -4
  5. package/src/cloud/EventRevisions.js +33 -5
  6. package/src/cloud/Events.js +35 -5
  7. package/src/cloud/PageRevisions.js +31 -3
  8. package/src/cloud/Pages.js +34 -4
  9. package/src/cloud/documents/articlesDocuments.js +44 -3
  10. package/src/cloud/documents/eventsDocuments.js +43 -2
  11. package/src/cloud/documents/pagesDocuments.js +43 -2
  12. package/src/handlers/articles/TranslationsHandler.js +81 -15
  13. package/src/handlers/events/TranslationsHandler.js +80 -14
  14. package/src/handlers/pages/TranslationsHandler.js +84 -18
  15. package/src/helpers/AuthHelper.js +2 -2
  16. package/src/tests/handlers/TagsHandler.test/create.test.js +96 -0
  17. package/src/tests/handlers/TagsHandler.test/create_form.test.js +25 -0
  18. package/src/tests/handlers/TagsHandler.test/destroy.test.js +51 -0
  19. package/src/tests/handlers/TagsHandler.test/edit_form.test.js +60 -0
  20. package/src/tests/handlers/TagsHandler.test/index.test.js +37 -0
  21. package/src/tests/handlers/TagsHandler.test/update.test.js +105 -0
  22. package/src/tests/handlers/articles/TranslationHandler.test/create.test.js +85 -79
  23. package/src/tests/handlers/events/TranslationHandler.test/create.test.js +84 -78
  24. package/src/tests/handlers/pages/TranslationHandler.test/create.test.js +83 -72
  25. package/src/tests/helpers/AuthHelper.test.js +169 -0
  26. package/src/tests/helpers/FormBuildert.test.js +357 -0
  27. package/src/tests/helpers/Inflector.test.js +75 -0
  28. package/src/views/articles/_shared/_revision_toolbar.ejs +9 -9
  29. package/src/views/articles/translations/create_form.ejs +2 -0
  30. package/src/views/events/_shared/_revision_toolbar.ejs +9 -9
  31. package/src/views/events/translations/create_form.ejs +2 -0
  32. package/src/views/pages/_shared/_revision_toolbar.ejs +9 -9
  33. package/src/views/pages/translations/create_form.ejs +3 -1
package/jest.config.js ADDED
@@ -0,0 +1,22 @@
1
+ /** @type {import('jest').Config} */
2
+ const config = {
3
+ collectCoverageFrom: [
4
+ "**/*.{js,jsx}",
5
+ "!**/*.config.js",
6
+ "!**/node_modules/**",
7
+ "!**/vendor/**",
8
+ "!**/cloud/**",
9
+ "!**/coverage/**",
10
+ "!**/tests/support/**",
11
+ ],
12
+ coverageThreshold: {
13
+ global: {
14
+ branches: 71,
15
+ functions: 74,
16
+ lines: 78,
17
+ statements: 78,
18
+ },
19
+ },
20
+ };
21
+
22
+ module.exports = config;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "0.0.88",
3
+ "version": "0.0.91",
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",
7
- "test": "jest"
7
+ "test": "jest --coverage --coverageReporters=text --coverageReporters=\"text-summary\""
8
8
  },
9
9
  "devDependencies": {
10
10
  "@babel/core": "7.24.7",
@@ -1,19 +1,20 @@
1
+ import { toUTCISO8601String } from "../utils";
1
2
  import RaketaClient from "./RaketaClient";
2
3
  import {
4
+ ArticleRevisionDocument,
5
+ ArticleRevisionsDocument,
6
+ CancelArticleRevisionScheduleDocument,
7
+ buildBatchStartArticleRevisionDocument,
3
8
  DeleteArticleDocument,
4
9
  LockArticleRevisionDocument,
5
10
  MergeArticleRevisionDocument,
11
+ ReopenArticleChangeDocument,
6
12
  ScheduleArticleRevisionDocument,
7
- CancelArticleRevisionScheduleDocument,
8
- ArticleRevisionDocument,
9
- ArticleRevisionsDocument,
10
13
  StartArticleRevisionDocument,
11
14
  UnlockArticleRevisionDocument,
12
15
  UpdateArticleDocument,
13
16
  UpdateArticleWidgetsDocument,
14
- ReopenArticleChangeDocument,
15
17
  } from "./documents/articlesDocuments";
16
- import { toUTCISO8601String } from "../utils";
17
18
 
18
19
  export default class ArticleRevisions extends RaketaClient {
19
20
  selectUpdateParams(revision) {
@@ -122,6 +123,33 @@ export default class ArticleRevisions extends RaketaClient {
122
123
  return { revision, errors, articleErrors };
123
124
  }
124
125
 
126
+ async createBatch(revisionInputs) {
127
+ const BatchDocument = buildBatchStartArticleRevisionDocument(
128
+ revisionInputs.length
129
+ );
130
+
131
+ const variables = {};
132
+ revisionInputs.forEach((input, i) => {
133
+ variables[`input${i}`] = {
134
+ id: input.articleId,
135
+ locale: input.locale,
136
+ title: "New revision",
137
+ description: "",
138
+ };
139
+ });
140
+
141
+ const response = await this.query(BatchDocument, variables);
142
+
143
+ return revisionInputs.map((_, i) => {
144
+ const result = response[`startRevision${i}`];
145
+ return {
146
+ revision: result.revision,
147
+ errors: result.errors,
148
+ articleErrors: result.articleErrors,
149
+ };
150
+ });
151
+ }
152
+
125
153
  async update(id, locale, params) {
126
154
  const copyParams = { ...params };
127
155
 
@@ -1,15 +1,16 @@
1
+ import { toDateTimeInput, toUTCISO8601String } from "../utils";
1
2
  import RaketaClient from "./RaketaClient";
2
3
  import {
3
- CreateArticleDocument,
4
4
  ArticleByIdDocument,
5
5
  ArticlesDocument,
6
+ ChangeArticleSlugDocument,
6
7
  CloneArticleDocument,
8
+ CreateArticleDocument,
9
+ buildBatchTranslateArticleDocument,
7
10
  DeleteArticleDocument,
8
- TranslateArticleDocument,
9
- ChangeArticleSlugDocument,
10
11
  MiniArticlesDocument,
12
+ TranslateArticleDocument,
11
13
  } from "./documents/articlesDocuments";
12
- import { toDateTimeInput, toUTCISO8601String } from "../utils";
13
14
 
14
15
  export default class Articles extends RaketaClient {
15
16
  defaults() {
@@ -142,6 +143,35 @@ export default class Articles extends RaketaClient {
142
143
  return { article, errors };
143
144
  }
144
145
 
146
+ async translateBatch(sourceArticleId, locales, params) {
147
+ const paramsCopy = { ...params };
148
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
149
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
150
+
151
+ const BatchTranslateDocument = buildBatchTranslateArticleDocument(
152
+ locales.length
153
+ );
154
+
155
+ const variables = {};
156
+ locales.forEach((locale, i) => {
157
+ variables[`input${i}`] = {
158
+ locale,
159
+ sourceArticleId,
160
+ article: paramsCopy,
161
+ };
162
+ });
163
+
164
+ const response = await this.query(BatchTranslateDocument, variables);
165
+
166
+ return locales.map((_, i) => {
167
+ const result = response[`translate${i}`];
168
+ return {
169
+ article: result.article,
170
+ errors: result.errors,
171
+ };
172
+ });
173
+ }
174
+
145
175
  async updateSlug(id, slug, locale, redirect) {
146
176
  const input = {
147
177
  id,
@@ -1,19 +1,20 @@
1
+ import { toUTCISO8601String } from "../utils";
1
2
  import RaketaClient from "./RaketaClient";
2
3
  import {
4
+ CancelEventRevisionScheduleDocument,
5
+ buildBatchStartEventRevisionDocument,
3
6
  DeleteEventDocument,
7
+ EventRevisionDocument,
8
+ EventRevisionsDocument,
4
9
  LockEventRevisionDocument,
5
10
  MergeEventRevisionDocument,
11
+ ReopenEventChangeDocument,
6
12
  ScheduleEventRevisionDocument,
7
- CancelEventRevisionScheduleDocument,
8
- EventRevisionDocument,
9
- EventRevisionsDocument,
10
13
  StartEventRevisionDocument,
11
14
  UnlockEventRevisionDocument,
12
15
  UpdateEventDocument,
13
16
  UpdateEventWidgetsDocument,
14
- ReopenEventChangeDocument,
15
17
  } from "./documents/eventsDocuments";
16
- import { toUTCISO8601String } from "../utils";
17
18
 
18
19
  export default class EventRevisions extends RaketaClient {
19
20
  selectUpdateParams(revision) {
@@ -129,6 +130,33 @@ export default class EventRevisions extends RaketaClient {
129
130
  return { revision, errors, eventErrors };
130
131
  }
131
132
 
133
+ async createBatch(revisionInputs) {
134
+ const BatchDocument = buildBatchStartEventRevisionDocument(
135
+ revisionInputs.length
136
+ );
137
+
138
+ const variables = {};
139
+ revisionInputs.forEach((input, i) => {
140
+ variables[`input${i}`] = {
141
+ id: input.eventId,
142
+ locale: input.locale,
143
+ title: "New revision",
144
+ description: "",
145
+ };
146
+ });
147
+
148
+ const response = await this.query(BatchDocument, variables);
149
+
150
+ return revisionInputs.map((_, i) => {
151
+ const result = response[`startRevision${i}`];
152
+ return {
153
+ revision: result.revision,
154
+ errors: result.errors,
155
+ eventErrors: result.eventErrors,
156
+ };
157
+ });
158
+ }
159
+
132
160
  async update(id, locale, params) {
133
161
  const copyParams = { ...params };
134
162
 
@@ -1,15 +1,16 @@
1
+ import { toDateTimeInput, toUTCISO8601String } from "../utils";
1
2
  import RaketaClient from "./RaketaClient";
2
3
  import {
4
+ ChangeEventSlugDocument,
5
+ CloneEventDocument,
6
+ buildBatchTranslateEventDocument,
3
7
  CreateEventDocument,
8
+ DeleteEventDocument,
4
9
  EventByIdDocument,
5
10
  EventsDocument,
6
- CloneEventDocument,
7
- DeleteEventDocument,
8
- TranslateEventDocument,
9
- ChangeEventSlugDocument,
10
11
  MiniEventsDocument,
12
+ TranslateEventDocument,
11
13
  } from "./documents/eventsDocuments";
12
- import { toDateTimeInput, toUTCISO8601String } from "../utils";
13
14
 
14
15
  export default class Events extends RaketaClient {
15
16
  defaults() {
@@ -152,6 +153,35 @@ export default class Events extends RaketaClient {
152
153
  return { event, errors };
153
154
  }
154
155
 
156
+ async translateBatch(sourceEventId, locales, params) {
157
+ const paramsCopy = { ...params };
158
+ paramsCopy.widgets = JSON.stringify(paramsCopy.widgets);
159
+ paramsCopy.settings = JSON.stringify(paramsCopy.settings);
160
+
161
+ const BatchTranslateDocument = buildBatchTranslateEventDocument(
162
+ locales.length
163
+ );
164
+
165
+ const variables = {};
166
+ locales.forEach((locale, i) => {
167
+ variables[`input${i}`] = {
168
+ locale,
169
+ sourceEventId,
170
+ event: paramsCopy,
171
+ };
172
+ });
173
+
174
+ const response = await this.query(BatchTranslateDocument, variables);
175
+
176
+ return locales.map((_, i) => {
177
+ const result = response[`translate${i}`];
178
+ return {
179
+ event: result.event,
180
+ errors: result.errors,
181
+ };
182
+ });
183
+ }
184
+
155
185
  async updateSlug(id, slug, locale, redirect) {
156
186
  const input = {
157
187
  id,
@@ -1,17 +1,18 @@
1
1
  import RaketaClient from "./RaketaClient";
2
2
  import {
3
+ CancelPageRevisionScheduleDocument,
3
4
  DeletePageDocument,
4
5
  LockPageRevisionDocument,
5
6
  MergePageRevisionDocument,
6
- SchedulePageRevisionDocument,
7
- CancelPageRevisionScheduleDocument,
8
7
  PageRevisionDocument,
9
8
  PageRevisionsDocument,
9
+ ReopenPageChangeDocument,
10
+ SchedulePageRevisionDocument,
10
11
  StartPageRevisionDocument,
11
12
  UnlockPageRevisionDocument,
12
13
  UpdatePageDocument,
13
14
  UpdatePageWidgetsDocument,
14
- ReopenPageChangeDocument,
15
+ buildBatchStartPageRevisionDocument,
15
16
  } from "./documents/pagesDocuments";
16
17
 
17
18
  export default class PageRevisions extends RaketaClient {
@@ -109,6 +110,33 @@ export default class PageRevisions extends RaketaClient {
109
110
  return { revision, errors, pageErrors };
110
111
  }
111
112
 
113
+ async createBatch(revisionInputs) {
114
+ const BatchStartRevisionDocument = buildBatchStartPageRevisionDocument(
115
+ revisionInputs.length
116
+ );
117
+
118
+ const variables = {};
119
+ revisionInputs.forEach((input, i) => {
120
+ variables[`input${i}`] = {
121
+ id: input.pageId,
122
+ locale: input.locale,
123
+ title: "New revision",
124
+ description: "",
125
+ };
126
+ });
127
+
128
+ const response = await this.query(BatchStartRevisionDocument, variables);
129
+
130
+ return revisionInputs.map((_, i) => {
131
+ const result = response[`startRevision${i}`];
132
+ return {
133
+ revision: result.revision,
134
+ errors: result.errors,
135
+ pageErrors: result.pageErrors,
136
+ };
137
+ });
138
+ }
139
+
112
140
  async update(id, locale, params) {
113
141
  const copyParams = { ...params };
114
142
 
@@ -1,13 +1,14 @@
1
1
  import RaketaClient from "./RaketaClient";
2
2
  import {
3
+ buildBatchTranslatePageDocument,
4
+ ChangePageSlugDocument,
5
+ ClonePageDocument,
3
6
  CreatePageDocument,
7
+ DeletePageDocument,
8
+ MiniPagesDocument,
4
9
  PageByIdDocument,
5
10
  PagesDocument,
6
- ClonePageDocument,
7
- DeletePageDocument,
8
11
  TranslatePageDocument,
9
- ChangePageSlugDocument,
10
- MiniPagesDocument,
11
12
  } from "./documents/pagesDocuments";
12
13
 
13
14
  export default class Pages extends RaketaClient {
@@ -133,6 +134,35 @@ export default class Pages extends RaketaClient {
133
134
  return { page, errors };
134
135
  }
135
136
 
137
+ async translateBatch(sourcePageId, locales, params) {
138
+ const copyParams = { ...params };
139
+ copyParams.widgets = JSON.stringify(copyParams.widgets);
140
+ copyParams.settings = JSON.stringify(copyParams.settings);
141
+
142
+ const BatchTranslateDocument = buildBatchTranslatePageDocument(
143
+ locales.length
144
+ );
145
+
146
+ const variables = {};
147
+ locales.forEach((locale, i) => {
148
+ variables[`input${i}`] = {
149
+ locale,
150
+ sourcePageId,
151
+ page: copyParams,
152
+ };
153
+ });
154
+
155
+ const response = await this.query(BatchTranslateDocument, variables);
156
+
157
+ return locales.map((_, i) => {
158
+ const result = response[`translate${i}`];
159
+ return {
160
+ page: result.page,
161
+ errors: result.errors,
162
+ };
163
+ });
164
+ }
165
+
136
166
  async updateSlug(id, slug, locale, redirect) {
137
167
  const input = {
138
168
  id,
@@ -1,13 +1,13 @@
1
1
  import { gql } from "graphql-request";
2
2
  import {
3
+ articleTypeFragment,
3
4
  categoryFragment,
4
5
  errorsFragment,
5
- articleTypeFragment,
6
6
  paginationFragment,
7
7
  revisionMetaFragment,
8
- tagFragment,
9
- summaryChangeFragment,
10
8
  revisionScheduleFragment,
9
+ summaryChangeFragment,
10
+ tagFragment,
11
11
  } from "./common";
12
12
 
13
13
  function minimalArticleFragment() {
@@ -171,6 +171,25 @@ const TranslateArticleDocument = gql`
171
171
  }
172
172
  `;
173
173
 
174
+ const buildBatchTranslateArticleDocument = (count) => gql`
175
+ mutation BatchTranslateArticles(${Array(count)
176
+ .fill(0)
177
+ .map((_, i) => `$input${i}: TranslateArticleInput!`)
178
+ .join(", ")}) {
179
+ ${Array(count)
180
+ .fill(0)
181
+ .map(
182
+ (_, i) => `
183
+ translate${i}: translateArticle(input: $input${i}) {
184
+ article ${articleFragment()}
185
+ errors ${errorsFragment()}
186
+ }
187
+ `
188
+ )
189
+ .join("\n")}
190
+ }
191
+ `;
192
+
174
193
  const ArticleRevisionsDocument = gql`
175
194
  query ArticleRevisions($input: IdInput!) {
176
195
  articleRevisions(input: $input) {
@@ -195,6 +214,26 @@ const StartArticleRevisionDocument = gql`
195
214
  }
196
215
  `;
197
216
 
217
+ const buildBatchStartArticleRevisionDocument = (count) => gql`
218
+ mutation BatchStartArticleRevisions(${Array(count)
219
+ .fill(0)
220
+ .map((_, i) => `$input${i}: StartArticleRevisionInput!`)
221
+ .join(", ")}) {
222
+ ${Array(count)
223
+ .fill(0)
224
+ .map(
225
+ (_, i) => `
226
+ startRevision${i}: startArticleRevision(input: $input${i}) {
227
+ revision ${articleRevisionFragment()}
228
+ errors ${errorsFragment()}
229
+ articleErrors ${errorsFragment()}
230
+ }
231
+ `
232
+ )
233
+ .join("\n")}
234
+ }
235
+ `;
236
+
198
237
  const MergeArticleRevisionDocument = gql`
199
238
  mutation MergeArticleRevision($input: MergeArticleRevisionInput!) {
200
239
  mergeArticleRevision(input: $input) {
@@ -286,4 +325,6 @@ export {
286
325
  ReopenArticleChangeDocument,
287
326
  LockArticleRevisionDocument,
288
327
  UnlockArticleRevisionDocument,
328
+ buildBatchTranslateArticleDocument,
329
+ buildBatchStartArticleRevisionDocument,
289
330
  };
@@ -5,9 +5,9 @@ import {
5
5
  eventTypeFragment,
6
6
  paginationFragment,
7
7
  revisionMetaFragment,
8
- tagFragment,
9
- summaryChangeFragment,
10
8
  revisionScheduleFragment,
9
+ summaryChangeFragment,
10
+ tagFragment,
11
11
  } from "./common";
12
12
 
13
13
  function minimalEventFragment() {
@@ -179,6 +179,25 @@ const TranslateEventDocument = gql`
179
179
  }
180
180
  `;
181
181
 
182
+ const buildBatchTranslateEventDocument = (count) => gql`
183
+ mutation BatchTranslateEvents(${Array(count)
184
+ .fill(0)
185
+ .map((_, i) => `$input${i}: TranslateEventInput!`)
186
+ .join(", ")}) {
187
+ ${Array(count)
188
+ .fill(0)
189
+ .map(
190
+ (_, i) => `
191
+ translate${i}: translateEvent(input: $input${i}) {
192
+ event ${eventFragment()}
193
+ errors ${errorsFragment()}
194
+ }
195
+ `
196
+ )
197
+ .join("\n")}
198
+ }
199
+ `;
200
+
182
201
  const EventRevisionsDocument = gql`
183
202
  query EventRevisions($input: IdInput!) {
184
203
  eventRevisions(input: $input) {
@@ -187,6 +206,26 @@ const EventRevisionsDocument = gql`
187
206
  }
188
207
  `;
189
208
 
209
+ const buildBatchStartEventRevisionDocument = (count) => gql`
210
+ mutation BatchStartEventRevisions(${Array(count)
211
+ .fill(0)
212
+ .map((_, i) => `$input${i}: StartEventRevisionInput!`)
213
+ .join(", ")}) {
214
+ ${Array(count)
215
+ .fill(0)
216
+ .map(
217
+ (_, i) => `
218
+ startRevision${i}: startEventRevision(input: $input${i}) {
219
+ revision ${eventRevisionFragment()}
220
+ errors ${errorsFragment()}
221
+ eventErrors ${errorsFragment()}
222
+ }
223
+ `
224
+ )
225
+ .join("\n")}
226
+ }
227
+ `;
228
+
190
229
  const EventRevisionDocument = gql`
191
230
  query EventRevision($input: IdInput!) {
192
231
  eventRevision(input: $input) ${eventRevisionFragment()}
@@ -294,4 +333,6 @@ export {
294
333
  ReopenEventChangeDocument,
295
334
  LockEventRevisionDocument,
296
335
  UnlockEventRevisionDocument,
336
+ buildBatchStartEventRevisionDocument,
337
+ buildBatchTranslateEventDocument,
297
338
  };
@@ -5,9 +5,9 @@ import {
5
5
  pageTypeFragment,
6
6
  paginationFragment,
7
7
  revisionMetaFragment,
8
- tagFragment,
9
- summaryChangeFragment,
10
8
  revisionScheduleFragment,
9
+ summaryChangeFragment,
10
+ tagFragment,
11
11
  } from "./common";
12
12
 
13
13
  function minimalPageFragment() {
@@ -167,6 +167,25 @@ const TranslatePageDocument = gql`
167
167
  }
168
168
  `;
169
169
 
170
+ const buildBatchTranslatePageDocument = (count) => gql`
171
+ mutation BatchTranslatePages(${Array(count)
172
+ .fill(0)
173
+ .map((_, i) => `$input${i}: TranslatePageInput!`)
174
+ .join(", ")}) {
175
+ ${Array(count)
176
+ .fill(0)
177
+ .map(
178
+ (_, i) => `
179
+ translate${i}: translatePage(input: $input${i}) {
180
+ page ${pageFragment()}
181
+ errors ${errorsFragment()}
182
+ }
183
+ `
184
+ )
185
+ .join("\n")}
186
+ }
187
+ `;
188
+
170
189
  const PageRevisionsDocument = gql`
171
190
  query PageRevisions($input: IdInput!) {
172
191
  pageRevisions(input: $input) {
@@ -191,6 +210,26 @@ const StartPageRevisionDocument = gql`
191
210
  }
192
211
  `;
193
212
 
213
+ const buildBatchStartPageRevisionDocument = (count) => gql`
214
+ mutation BatchStartPageRevisions(${Array(count)
215
+ .fill(0)
216
+ .map((_, i) => `$input${i}: StartPageRevisionInput!`)
217
+ .join(", ")}) {
218
+ ${Array(count)
219
+ .fill(0)
220
+ .map(
221
+ (_, i) => `
222
+ startRevision${i}: startPageRevision(input: $input${i}) {
223
+ revision ${pageRevisionFragment()}
224
+ errors ${errorsFragment()}
225
+ pageErrors ${errorsFragment()}
226
+ }
227
+ `
228
+ )
229
+ .join("\n")}
230
+ }
231
+ `;
232
+
194
233
  const MergePageRevisionDocument = gql`
195
234
  mutation MergePageRevision($input: MergePageRevisionInput!) {
196
235
  mergePageRevision(input: $input) {
@@ -282,4 +321,6 @@ export {
282
321
  ReopenPageChangeDocument,
283
322
  LockPageRevisionDocument,
284
323
  UnlockPageRevisionDocument,
324
+ buildBatchTranslatePageDocument,
325
+ buildBatchStartPageRevisionDocument,
285
326
  };