@eeacms/volto-n2k 0.1.15 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.coverage.babel.config.js +1 -1
  2. package/.i18n.babel.config.js +1 -0
  3. package/.project.eslintrc.js +46 -0
  4. package/CHANGELOG.md +20 -2
  5. package/README.md +1 -72
  6. package/RELEASE.md +74 -0
  7. package/babel.config.js +17 -0
  8. package/cypress.config.js +26 -0
  9. package/jest-addon.config.js +4 -4
  10. package/locales/volto.pot +69 -0
  11. package/package.json +21 -14
  12. package/src/components/index.js +3 -3
  13. package/src/components/manage/Blocks/CddaShape/View.jsx +14 -1
  14. package/src/components/manage/Blocks/ExploreHabitats/View.jsx +17 -5
  15. package/src/components/manage/Blocks/ExploreSites/View.jsx +15 -6
  16. package/src/components/manage/Blocks/ExploreSpecies/View.jsx +15 -5
  17. package/src/components/manage/Blocks/HabitatDistribution/View.jsx +14 -1
  18. package/src/components/manage/Blocks/HabitatProtectedSites/View.jsx +14 -1
  19. package/src/components/manage/Blocks/Landing/DefalutView.jsx +0 -16
  20. package/src/components/manage/Blocks/Landing/Edit.jsx +0 -16
  21. package/src/components/manage/Blocks/Landing/View.jsx +0 -16
  22. package/src/components/manage/Blocks/NavigationAnchors/View.jsx +1 -1
  23. package/src/components/manage/Blocks/SiteShape/View.jsx +14 -1
  24. package/src/components/manage/Blocks/SpeciesDistribution/View.jsx +14 -1
  25. package/src/components/manage/Blocks/SpeciesProtectedSites/View.jsx +14 -1
  26. package/src/components/theme/AppExtras/MultilingualRedirector/MultilingualRedirector.jsx +3 -3
  27. package/src/components/theme/Header/Header.jsx +58 -25
  28. package/src/components/theme/LanguageSelector/LanguageSelector.jsx +22 -14
  29. package/src/components/theme/Navigation/Navigation.jsx +37 -22
  30. package/src/components/theme/Sitemap/Sitemap.jsx +2 -2
  31. package/src/index.js +31 -29
  32. package/src/less/styles.less +10 -12
  33. package/src/static/global-line.svg +1 -0
  34. package/Jenkinsfile +0 -242
  35. package/cypress/fixtures/example.json +0 -5
  36. package/cypress/integration/block-basics.js +0 -32
  37. package/cypress/plugins/index.js +0 -26
  38. package/cypress/support/commands.js +0 -315
  39. package/cypress/support/index.js +0 -53
  40. package/cypress.json +0 -17
@@ -1,315 +0,0 @@
1
- /* eslint no-console: ["error", { allow: ["log"] }] */
2
-
3
- // --- AUTOLOGIN -------------------------------------------------------------
4
- Cypress.Commands.add('autologin', () => {
5
- let api_url, user, password;
6
- api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
7
- user = 'admin';
8
- password = 'admin';
9
-
10
- return cy
11
- .request({
12
- method: 'POST',
13
- url: `${api_url}/@login`,
14
- headers: { Accept: 'application/json' },
15
- body: { login: user, password: password },
16
- })
17
- .then((response) => cy.setCookie('auth_token', response.body.token));
18
- });
19
-
20
- // --- CREATE CONTENT --------------------------------------------------------
21
- Cypress.Commands.add(
22
- 'createContent',
23
- ({
24
- contentType,
25
- contentId,
26
- contentTitle,
27
- path = '',
28
- allow_discussion = false,
29
- }) => {
30
- let api_url, auth;
31
- api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
32
- auth = {
33
- user: 'admin',
34
- pass: 'admin',
35
- };
36
- if (contentType === 'File') {
37
- return cy.request({
38
- method: 'POST',
39
- url: `${api_url}/${path}`,
40
- headers: {
41
- Accept: 'application/json',
42
- },
43
- auth: auth,
44
- body: {
45
- '@type': contentType,
46
- id: contentId,
47
- title: contentTitle,
48
- file: {
49
- data: 'dGVzdGZpbGUK',
50
- encoding: 'base64',
51
- filename: 'lorem.txt',
52
- 'content-type': 'text/plain',
53
- },
54
- allow_discussion: allow_discussion,
55
- },
56
- });
57
- }
58
- if (contentType === 'Image') {
59
- return cy.request({
60
- method: 'POST',
61
- url: `${api_url}/${path}`,
62
- headers: {
63
- Accept: 'application/json',
64
- },
65
- auth: auth,
66
- body: {
67
- '@type': contentType,
68
- id: contentId,
69
- title: contentTitle,
70
- image: {
71
- data:
72
- 'iVBORw0KGgoAAAANSUhEUgAAANcAAAA4CAMAAABZsZ3QAAAAM1BMVEX29fK42OU+oMvn7u9drtIPisHI4OhstdWZyt4fkcXX5+sAg74umMhNp86p0eJ7vNiKw9v/UV4wAAAAAXRSTlMAQObYZgAABBxJREFUeF7tmuty4yAMhZG4X2zn/Z92J5tsBJwWXG/i3XR6frW2Y/SBLIRAfaQUDNt8E5tLUt9BycfcKfq3R6Mlfyimtx4rzp+K3dtibXkor99zsEqLYZltblTecciogoh+TXfY1Ve4dn07rCDGG9dHSEEOg/GmXl0U1XDxTKxNK5De7BxsyyBr6gGm2/vPxKJ8F6f7BXKfRMp1xIWK9A+5ks25alSb353dWnDJN1k35EL5f8dVGifTf/4tjUuuFq7u4srmXC60yAmldLXIWbg65RKU87lcGxJCFqUPv0IacW0PmSivOZFLE908inPToMmii/roG+MRV/O8FU88i8tFsxV3a06MFUw0Qu7RmAtdV5/HVVaOVMTWNOWSwMljLhzhcB6XIS7OK5V6AvRDNN7t5VJWQs1J40UmalbK56usBG/CuCHSYuc+rkUGeMCViNRARPrzW52N3oQLe6WifNliSuuGaH3czbVNudI9s7ZLUCLHVwWlyES522o1t14uvmbblmVTKqFjaZYJFSTPP4dLL1kU1z7p0lzdbRulmEWLxoQX+z9ce7A8GqEEucllLxePuZwdJl1Lezu0hoswvTPt61DrFcRuujV/2cmlxaGBC7Aw6cpovGANwRiSdOAWJ5AGy4gLL64dl0QhUEAuEUNws+XxV+OKGPdw/hESGYF9XEGaFC7sNLMSXWJjHsnanYi87VK428N2uxpOjOFANcagLM5l+7mSycM8KknZpKLcGi6jmzWGr/vLurZ/0g4u9AZuAoeb5r1ceQhyiTPY1E4wUR6u/F3H2ojSpXMMriBPT9cezTto8Cx+MsglHL4fv1Rxrb1LVw9yvyQpJ3AhFnLZfuRLH2QsOG3FGGD20X/th/u5bFAt16Bt308KjF+MNOXgl/SquIEySX3GhaZvc67KZbDxcCDORz2N8yCWPaY5lyQZO7lQ29fnZbt3Xu6qoge4+DjXl/MocySPOp9rlvdyznahRyHEYd77v3LhugOXDv4J65QXfl803BDAdaWBEDhfVx7nKofjoVCgxnUAqw/UAUDPn788BDvQuG4TDtdtUPvzjSlXAB8DvaDOhhrmhwbywylXAm8CvaouikJTL93gs3y7Yy4VYbIxOHrcMizPqWOjqO9l3Uz52kibQy4xxOgqhJvD+w5rvokOcAlGvNCfeqCv1ste1stzLm0f71Iq3ZfTrPfuE5nhPtF+LvQE2lffQC7pYtQy3tdzdrKvd5TLVVzDetScS3nEKmmwDyt1Cev1kX3YfbvzNK4fzrlw+cB6vm+uiUgf2zdXI62241LawCb7Pi5FXFPF8KpzDoF/Sw2lg+GrHNbno1mhPu+VCF/vfMnw06PnUl6j48dVHD3jHNHPua+fc3o/5yp/zsGi0vYtzi3Pz5mHd4T6BWMIlewacd63AAAAAElFTkSuQmCC',
73
- encoding: 'base64',
74
- filename: 'image.png',
75
- 'content-type': 'image/png',
76
- },
77
- },
78
- });
79
- }
80
- if (['Document', 'Folder', 'CMSFolder'].includes(contentType)) {
81
- return cy
82
- .request({
83
- method: 'POST',
84
- url: `${api_url}/${path}`,
85
- headers: {
86
- Accept: 'application/json',
87
- },
88
- auth: auth,
89
- body: {
90
- '@type': contentType,
91
- id: contentId,
92
- title: contentTitle,
93
- blocks: {
94
- 'd3f1c443-583f-4e8e-a682-3bf25752a300': { '@type': 'title' },
95
- '7624cf59-05d0-4055-8f55-5fd6597d84b0': { '@type': 'text' },
96
- },
97
- blocks_layout: {
98
- items: [
99
- 'd3f1c443-583f-4e8e-a682-3bf25752a300',
100
- '7624cf59-05d0-4055-8f55-5fd6597d84b0',
101
- ],
102
- },
103
- allow_discussion: allow_discussion,
104
- },
105
- })
106
- .then(() => console.log(`${contentType} created`));
107
- } else {
108
- return cy
109
- .request({
110
- method: 'POST',
111
- url: `${api_url}/${path}`,
112
- headers: {
113
- Accept: 'application/json',
114
- },
115
- auth: auth,
116
- body: {
117
- '@type': contentType,
118
- id: contentId,
119
- title: contentTitle,
120
- allow_discussion: allow_discussion,
121
- },
122
- })
123
- .then(() => console.log(`${contentType} created`));
124
- }
125
- },
126
- );
127
-
128
- // --- REMOVE CONTENT --------------------------------------------------------
129
- Cypress.Commands.add('removeContent', (path) => {
130
- let api_url, auth;
131
- api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
132
- auth = {
133
- user: 'admin',
134
- pass: 'admin',
135
- };
136
- return cy
137
- .request({
138
- method: 'DELETE',
139
- url: `${api_url}/${path}`,
140
- headers: {
141
- Accept: 'application/json',
142
- },
143
- auth: auth,
144
- body: {},
145
- })
146
- .then(() => console.log(`${path} removed`));
147
- });
148
-
149
- // --- SET WORKFLOW ----------------------------------------------------------
150
- Cypress.Commands.add(
151
- 'setWorkflow',
152
- ({
153
- path = '/',
154
- actor = 'admin',
155
- review_state = 'publish',
156
- time = '1995-07-31T18:30:00',
157
- title = '',
158
- comment = '',
159
- effective = '2018-01-21T08:00:00',
160
- expires = '2019-01-21T08:00:00',
161
- include_children = true,
162
- }) => {
163
- let api_url, auth;
164
- api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
165
- auth = {
166
- user: 'admin',
167
- pass: 'admin',
168
- };
169
- return cy.request({
170
- method: 'POST',
171
- url: `${api_url}/${path}/@workflow/${review_state}`,
172
- headers: {
173
- Accept: 'application/json',
174
- },
175
- auth: auth,
176
- body: {
177
- actor: actor,
178
- review_state: review_state,
179
- time: time,
180
- title: title,
181
- comment: comment,
182
- effective: effective,
183
- expires: expires,
184
- include_children: include_children,
185
- },
186
- });
187
- },
188
- );
189
-
190
- // --- waitForResourceToLoad ----------------------------------------------------------
191
- Cypress.Commands.add('waitForResourceToLoad', (fileName, type) => {
192
- const resourceCheckInterval = 40;
193
-
194
- return new Cypress.Promise((resolve) => {
195
- const checkIfResourceHasBeenLoaded = () => {
196
- const resource = cy
197
- .state('window')
198
- .performance.getEntriesByType('resource')
199
- .filter((entry) => !type || entry.initiatorType === type)
200
- .find((entry) => entry.name.includes(fileName));
201
-
202
- if (resource) {
203
- resolve();
204
-
205
- return;
206
- }
207
-
208
- setTimeout(checkIfResourceHasBeenLoaded, resourceCheckInterval);
209
- };
210
-
211
- checkIfResourceHasBeenLoaded();
212
- });
213
- });
214
-
215
- // Low level command reused by `setSelection` and low level command `setCursor`
216
- Cypress.Commands.add('selection', { prevSubject: true }, (subject, fn) => {
217
- cy.wrap(subject).trigger('mousedown').then(fn).trigger('mouseup');
218
-
219
- cy.document().trigger('selectionchange');
220
- return cy.wrap(subject);
221
- });
222
-
223
- Cypress.Commands.add(
224
- 'setSelection',
225
- { prevSubject: true },
226
- (subject, query, endQuery) => {
227
- return cy.wrap(subject).selection(($el) => {
228
- if (typeof query === 'string') {
229
- const anchorNode = getTextNode($el[0], query);
230
- const focusNode = endQuery ? getTextNode($el[0], endQuery) : anchorNode;
231
- const anchorOffset = anchorNode.wholeText.indexOf(query);
232
- const focusOffset = endQuery
233
- ? focusNode.wholeText.indexOf(endQuery) + endQuery.length
234
- : anchorOffset + query.length;
235
- setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
236
- } else if (typeof query === 'object') {
237
- const el = $el[0];
238
- const anchorNode = getTextNode(el.querySelector(query.anchorQuery));
239
- const anchorOffset = query.anchorOffset || 0;
240
- const focusNode = query.focusQuery
241
- ? getTextNode(el.querySelector(query.focusQuery))
242
- : anchorNode;
243
- const focusOffset = query.focusOffset || 0;
244
- setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
245
- }
246
- });
247
- },
248
- );
249
-
250
- // Low level command reused by `setCursorBefore` and `setCursorAfter`, equal to `setCursorAfter`
251
- Cypress.Commands.add(
252
- 'setCursor',
253
- { prevSubject: true },
254
- (subject, query, atStart) => {
255
- return cy.wrap(subject).selection(($el) => {
256
- const node = getTextNode($el[0], query);
257
- const offset =
258
- node.wholeText.indexOf(query) + (atStart ? 0 : query.length);
259
- const document = node.ownerDocument;
260
- document.getSelection().removeAllRanges();
261
- document.getSelection().collapse(node, offset);
262
- });
263
- // Depending on what you're testing, you may need to chain a `.click()` here to ensure
264
- // further commands are picked up by whatever you're testing (this was required for Slate, for example).
265
- },
266
- );
267
-
268
- Cypress.Commands.add(
269
- 'setCursorBefore',
270
- { prevSubject: true },
271
- (subject, query) => {
272
- cy.wrap(subject).setCursor(query, true);
273
- },
274
- );
275
-
276
- Cypress.Commands.add(
277
- 'setCursorAfter',
278
- { prevSubject: true },
279
- (subject, query) => {
280
- cy.wrap(subject).setCursor(query);
281
- },
282
- );
283
-
284
- // Helper functions
285
- function getTextNode(el, match) {
286
- const walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
287
- if (!match) {
288
- return walk.nextNode();
289
- }
290
-
291
- let node;
292
- while ((node = walk.nextNode())) {
293
- if (node.wholeText.includes(match)) {
294
- return node;
295
- }
296
- }
297
- }
298
-
299
- function setBaseAndExtent(...args) {
300
- const document = args[0].ownerDocument;
301
- document.getSelection().removeAllRanges();
302
- document.getSelection().setBaseAndExtent(...args);
303
- }
304
-
305
- Cypress.Commands.add('navigate', (route = '') => {
306
- return cy.window().its('appHistory').invoke('push', route);
307
- });
308
-
309
- Cypress.Commands.add('store', () => {
310
- return cy.window().its('store').invoke('getStore', '');
311
- });
312
-
313
- Cypress.Commands.add('settings', (key, value) => {
314
- return cy.window().its('settings');
315
- });
@@ -1,53 +0,0 @@
1
- // ***********************************************************
2
- // This example support/index.js is processed and
3
- // loaded automatically before your test files.
4
- //
5
- // This is a great place to put global configuration and
6
- // behavior that modifies Cypress.
7
- //
8
- // You can change the location of this file or turn off
9
- // automatically serving support files with the
10
- // 'supportFile' configuration option.
11
- //
12
- // You can read more here:
13
- // https://on.cypress.io/configuration
14
- // ***********************************************************
15
-
16
- // Import commands.js using ES2015 syntax:
17
- import './commands';
18
-
19
- // Alternatively you can use CommonJS syntax:
20
- // require('./commands')
21
-
22
- /* coverage-start
23
- //Generate code-coverage
24
- import '@cypress/code-coverage/support';
25
- coverage-end */
26
-
27
- export const setupBeforeEach = () => {
28
- cy.autologin();
29
- cy.createContent({
30
- contentType: 'Document',
31
- contentId: 'cypress',
32
- contentTitle: 'Cypress',
33
- });
34
- cy.createContent({
35
- contentType: 'Document',
36
- contentId: 'my-page',
37
- contentTitle: 'My Page',
38
- path: 'cypress',
39
- });
40
- cy.visit('/cypress/my-page');
41
- cy.waitForResourceToLoad('@navigation');
42
- cy.waitForResourceToLoad('@breadcrumbs');
43
- cy.waitForResourceToLoad('@actions');
44
- cy.waitForResourceToLoad('@types');
45
- cy.waitForResourceToLoad('my-page');
46
- cy.navigate('/cypress/my-page/edit');
47
- cy.get(`.block.title [data-contents]`);
48
- };
49
-
50
- export const tearDownAfterEach = () => {
51
- cy.autologin();
52
- cy.removeContent('cypress');
53
- };
package/cypress.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "baseUrl": "http://localhost:3000",
3
- "viewportWidth": 1280,
4
- "defaultCommandTimeout": 8888,
5
- "reporter": "junit",
6
- "video": true,
7
- "reporterOptions": {
8
- "mochaFile": "cypress/reports/cypress-[hash].xml",
9
- "jenkinsMode": true,
10
- "toConsole": true
11
- },
12
- "chromeWebSecurity": false,
13
- "retries": {
14
- "runMode": 8,
15
- "openMode": 0
16
- }
17
- }