@plone/volto 16.16.0 → 17.0.0-alpha.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.
@@ -7,14 +7,8 @@ import React from 'react';
7
7
  import { FormattedMessage } from 'react-intl';
8
8
  import { isEmpty } from 'lodash';
9
9
 
10
- import {
11
- version as voltoVersion,
12
- name as voltoName,
13
- } from '../../../../package.json';
14
- import {
15
- version as projectVersion,
16
- name as projectName,
17
- } from '@root/../package.json';
10
+ import voltoPackageJson from '../../../../package.json';
11
+ import projectPackageJson from '@root/../package.json';
18
12
 
19
13
  import { defineMessages, useIntl } from 'react-intl';
20
14
  import config from '@plone/volto/registry';
@@ -26,6 +20,8 @@ const messages = defineMessages({
26
20
  },
27
21
  });
28
22
 
23
+ const voltoVersion = voltoPackageJson.version;
24
+
29
25
  const VersionOverview = ({
30
26
  cmf_version,
31
27
  debug_mode,
@@ -37,7 +33,7 @@ const VersionOverview = ({
37
33
  }) => {
38
34
  const intl = useIntl();
39
35
  const { addonsInfo } = config.settings;
40
- const isProject = voltoName !== projectName;
36
+ const isProject = voltoPackageJson.name !== projectPackageJson.name;
41
37
 
42
38
  return (
43
39
  <>
@@ -50,7 +46,7 @@ const VersionOverview = ({
50
46
  >
51
47
  {isProject ? (
52
48
  <li>
53
- {projectName} {projectVersion}
49
+ {projectPackageJson.name} {projectPackageJson.version}
54
50
  </li>
55
51
  ) : null}
56
52
  {voltoVersion && <li>Volto {voltoVersion}</li>}
@@ -61,12 +61,12 @@ const DiffField = ({
61
61
  break;
62
62
  case 'datetime':
63
63
  parts = diffWords(
64
- new Intl.DateTimeFormat(language, readable_date_format).format(
65
- new Date(one),
66
- ),
67
- new Intl.DateTimeFormat(language, readable_date_format).format(
68
- new Date(two),
69
- ),
64
+ new Intl.DateTimeFormat(language, readable_date_format)
65
+ .format(new Date(one))
66
+ .replace('\u202F', ' '),
67
+ new Intl.DateTimeFormat(language, readable_date_format)
68
+ .format(new Date(two))
69
+ .replace('\u202F', ' '),
70
70
  );
71
71
  break;
72
72
  case 'json':
@@ -23,9 +23,9 @@ const FormattedDate = ({
23
23
  <time
24
24
  className={className}
25
25
  dateTime={date}
26
- title={new Intl.DateTimeFormat(language, long_date_format).format(
27
- new Date(toDate(date)),
28
- )}
26
+ title={new Intl.DateTimeFormat(language, long_date_format)
27
+ .format(new Date(toDate(date)))
28
+ .replace('\u202F', ' ')}
29
29
  >
30
30
  {children
31
31
  ? children(
@@ -1,5 +1,5 @@
1
1
  import express from 'express';
2
- import { generateSitemap } from '@plone/volto/helpers';
2
+ import { generateSitemap } from '@plone/volto/helpers/Sitemap/Sitemap';
3
3
 
4
4
  export const sitemap = function (req, res, next) {
5
5
  generateSitemap(req).then((sitemap) => {
@@ -744,6 +744,56 @@ describe('Blocks', () => {
744
744
  },
745
745
  });
746
746
  });
747
+
748
+ it('Sets data according to schema default values, keeps existing data', () => {
749
+ const schema = {
750
+ properties: {
751
+ style: {
752
+ widget: 'object',
753
+ schema: {
754
+ title: 'Style',
755
+ fieldsets: [
756
+ {
757
+ id: 'default',
758
+ fields: ['color', 'theme'],
759
+ title: 'Default',
760
+ },
761
+ ],
762
+ properties: {
763
+ color: {
764
+ title: 'Color',
765
+ default: 'red',
766
+ },
767
+ theme: {
768
+ title: 'Theme',
769
+ default: 'primary',
770
+ },
771
+ },
772
+ required: [],
773
+ },
774
+ },
775
+ },
776
+ };
777
+
778
+ expect(
779
+ applySchemaDefaults({
780
+ schema,
781
+ data: {
782
+ '@type': 'slider',
783
+ style: {
784
+ theme: 'secondary',
785
+ },
786
+ },
787
+ intl: {},
788
+ }),
789
+ ).toEqual({
790
+ '@type': 'slider',
791
+ style: {
792
+ color: 'red',
793
+ theme: 'secondary',
794
+ },
795
+ });
796
+ });
747
797
  });
748
798
 
749
799
  describe('applyBlockDefaults', () => {
@@ -48,7 +48,9 @@ export function formatDate({
48
48
  : short_date_format;
49
49
 
50
50
  const formatter = new Intl.DateTimeFormat(locale, format);
51
- return formatToParts ? formatter.formatToParts(date) : formatter.format(date);
51
+ return formatToParts
52
+ ? formatter.formatToParts(date)
53
+ : formatter.format(date).replace('\u202F', ' ');
52
54
  }
53
55
 
54
56
  export function formatRelativeDate({
@@ -93,5 +95,5 @@ export function formatRelativeDate({
93
95
  ? ''
94
96
  : formatToParts
95
97
  ? formatter.formatToParts(v, tag)
96
- : formatter.format(v, tag); // use "now" ?
98
+ : formatter.format(v, tag).replace('\u202F', ' '); // use "now" ?
97
99
  }
@@ -192,6 +192,8 @@ describe('formatRelativeDate helper', () => {
192
192
  it('can use alternate style narrow', () => {
193
193
  const now = Date.now();
194
194
  const d = new Date(now + 3 * MONTH);
195
- expect(formatRelativeDate({ date: d, style: 'narrow' })).toBe('in 3 mo.');
195
+ expect(['in 3 mo.', 'in 3mo']).toContain(
196
+ formatRelativeDate({ date: d, style: 'narrow' }),
197
+ );
196
198
  });
197
199
  });
@@ -30,7 +30,6 @@ export {
30
30
  removeProtocol,
31
31
  URLUtils,
32
32
  } from '@plone/volto/helpers/Url/Url';
33
- export { generateSitemap } from '@plone/volto/helpers/Sitemap/Sitemap';
34
33
  export { generateRobots } from '@plone/volto/helpers/Robots/Robots';
35
34
  export {
36
35
  nestContent,
@@ -482,7 +482,6 @@ body.has-toolbar.has-sidebar-collapsed .ui.wrapper > .ui.inner.block.full {
482
482
  border: none !important;
483
483
  background: white !important;
484
484
  border-radius: 50% !important;
485
- transform: translateX(-50%);
486
485
  }
487
486
 
488
487
  &:not(.new-add-block) {
@@ -712,20 +711,12 @@ body.has-toolbar.has-sidebar-collapsed .ui.wrapper > .ui.inner.block.full {
712
711
  }
713
712
 
714
713
  .blocks-chooser {
715
- position: absolute;
716
- z-index: 10;
717
- top: 100%;
718
- left: 50%;
719
714
  width: 310px;
720
715
  padding: 4px;
721
716
  background-color: rgba(255, 255, 255, 0.975);
722
717
  border-radius: 2px;
723
718
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.05);
724
719
 
725
- &.new-add-block {
726
- transform: translate(-50%, 22px);
727
- }
728
-
729
720
  &:not(.new-add-block) {
730
721
  top: -12px;
731
722
  left: -9px;
@@ -1,7 +1,9 @@
1
1
  const path = require('path');
2
2
 
3
3
  class RelativeResolverPlugin {
4
- constructor(registry) {
4
+ constructor(registry, source, target) {
5
+ this.source = source || 'resolve';
6
+ this.target = target || 'resolve';
5
7
  this.registry = registry;
6
8
  this.voltoPaths = Object.assign(
7
9
  { '@plone/volto/': `${registry.voltoPath}/src` },
@@ -33,24 +35,36 @@ class RelativeResolverPlugin {
33
35
  }
34
36
 
35
37
  apply(resolver) {
36
- resolver.plugin('resolve', (request, callback) => {
37
- if (
38
- request.request.startsWith('.') &&
39
- request.context &&
40
- request.context.issuer &&
41
- this.isAddon(request)
42
- ) {
43
- const normalizedResourceName = this.getResolvePath(request);
44
- const nextRequest = Object.assign({}, request, {
45
- request: normalizedResourceName,
46
- path: this.registry.projectRootPath,
47
- });
48
-
49
- resolver.doResolve('resolve', nextRequest, '', callback);
50
- } else {
51
- callback();
52
- }
53
- });
38
+ var target = resolver.ensureHook(this.target);
39
+ resolver
40
+ .getHook(this.source)
41
+ .tapAsync(
42
+ 'RelativeResolverPlugin',
43
+ (request, resolveContext, callback) => {
44
+ if (
45
+ request.request.startsWith('.') &&
46
+ request.context &&
47
+ request.context.issuer &&
48
+ this.isAddon(request)
49
+ ) {
50
+ const normalizedResourceName = this.getResolvePath(request);
51
+ const nextRequest = Object.assign({}, request, {
52
+ request: normalizedResourceName,
53
+ path: this.registry.projectRootPath,
54
+ });
55
+
56
+ return resolver.doResolve(
57
+ target,
58
+ nextRequest,
59
+ null,
60
+ resolveContext,
61
+ callback,
62
+ );
63
+ } else {
64
+ callback();
65
+ }
66
+ },
67
+ );
54
68
  }
55
69
  }
56
70
 
@@ -1,23 +1,34 @@
1
1
  const path = require('path');
2
2
 
3
3
  class RootResolverPlugin {
4
+ constructor(source, target) {
5
+ this.source = source || 'resolve';
6
+ this.target = target || 'resolve';
7
+ }
8
+
4
9
  apply(resolver) {
5
- resolver.plugin('resolve', function RelativeBackResolver(
6
- request,
7
- callback,
8
- ) {
9
- if (request.request.startsWith('~/../')) {
10
- const resourcePath = request.request.substr(5);
10
+ var target = resolver.ensureHook(this.target);
11
+ resolver
12
+ .getHook(this.source)
13
+ .tapAsync('RootResolverPlugin', (request, resolveContext, callback) => {
14
+ if (request.request.startsWith('~/../')) {
15
+ const resourcePath = request.request.substr(5);
11
16
 
12
- const nextRequest = Object.assign({}, request, {
13
- request: path.resolve(`./${resourcePath}`),
14
- });
17
+ const nextRequest = Object.assign({}, request, {
18
+ request: path.resolve(`./${resourcePath}`),
19
+ });
15
20
 
16
- resolver.doResolve('resolve', nextRequest, '', callback);
17
- } else {
18
- callback();
19
- }
20
- });
21
+ resolver.doResolve(
22
+ target,
23
+ nextRequest,
24
+ null,
25
+ resolveContext,
26
+ callback,
27
+ );
28
+ } else {
29
+ callback();
30
+ }
31
+ });
21
32
  }
22
33
  }
23
34
 
@@ -16,10 +16,17 @@ module.exports = {
16
16
  loader: 'svgo-loader',
17
17
  options: {
18
18
  plugins: [
19
- { removeTitle: true },
20
- { convertPathData: false },
21
- { removeUselessStrokeAndFill: true },
22
- { removeViewBox: false },
19
+ {
20
+ name: 'preset-default',
21
+ params: {
22
+ overrides: {
23
+ convertPathData: false,
24
+ removeViewBox: false,
25
+ },
26
+ },
27
+ },
28
+ 'removeTitle',
29
+ 'removeUselessStrokeAndFill',
23
30
  ],
24
31
  },
25
32
  },