@kitconcept/core 2.0.0-alpha.12 → 2.0.0-alpha.14

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.
package/.changelog.draft CHANGED
@@ -1,7 +1,8 @@
1
- ## 2.0.0-alpha.12 (2026-02-27)
1
+ ## 2.0.0-alpha.14 (2026-03-31)
2
2
 
3
- ### Bugfix
3
+ ### Feature
4
4
 
5
- - Fix content export. @davisagli
5
+ - Moved the `kitconcept.blocks.config` inherit expander in here from the intranet distribution. @sneridagh
6
+ - Use timestamp and site title to name export file. @danalvrz
6
7
 
7
8
 
package/CHANGELOG.md CHANGED
@@ -8,6 +8,29 @@
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## 2.0.0-alpha.14 (2026-03-31)
12
+
13
+ ### Feature
14
+
15
+ - Moved the `kitconcept.blocks.config` inherit expander in here from the intranet distribution. @sneridagh
16
+ - Use timestamp and site title to name export file. @danalvrz
17
+
18
+ ## 2.0.0-alpha.13 (2026-03-14)
19
+
20
+ ### Breaking
21
+
22
+ - Removed add-ons from frontend, moved to the distributions. @sneridagh
23
+ - Replaced support of `@mbarde/volto-image-crop-widget` with `@plone-collective/volto-image-editor`. @sneridagh
24
+
25
+ ### Feature
26
+
27
+ - Improve UX on Export Import control panel and add missing German translations. @danalvrz
28
+
29
+ ### Internal
30
+
31
+ - Use Volto 19a27.
32
+ See https://github.com/plone/volto/releases/tag/19.0.0-alpha.27 @sneridagh
33
+
11
34
  ## 2.0.0-alpha.12 (2026-02-27)
12
35
 
13
36
  ### Bugfix
@@ -22,6 +22,11 @@ msgstr ""
22
22
  msgid "Back"
23
23
  msgstr "Zurück"
24
24
 
25
+ #. Default: "Choose file"
26
+ #: components/Controlpanels/ExportImport
27
+ msgid "Choose file"
28
+ msgstr "Datai auswählen"
29
+
25
30
  #. Default: "Configuration Versions"
26
31
  #: components/Controlpanels/UpgradeControlPanel
27
32
  msgid "Configuration Versions"
@@ -55,7 +60,7 @@ msgstr "Inhalt exportieren"
55
60
  #. Default: "Export Site"
56
61
  #: components/Controlpanels/ExportImport
57
62
  msgid "Export Site"
58
- msgstr "Export-Standort"
63
+ msgstr "Website exportieren"
59
64
 
60
65
  #. Default: "Export successful"
61
66
  #: components/Controlpanels/ExportImport
@@ -65,7 +70,7 @@ msgstr "Export erfolgreich"
65
70
  #. Default: "Exporting…"
66
71
  #: components/Controlpanels/ExportImport
67
72
  msgid "Exporting…"
68
- msgstr ""
73
+ msgstr "Exportieren..."
69
74
 
70
75
  #. Default: "Import Content"
71
76
  #: components/Controlpanels/ExportImport
@@ -75,7 +80,7 @@ msgstr "Inhalt importieren"
75
80
  #. Default: "Import Site"
76
81
  #: components/Controlpanels/ExportImport
77
82
  msgid "Import Site"
78
- msgstr "Importieren Sie die Website"
83
+ msgstr "Website Importieren"
79
84
 
80
85
  #. Default: "Import successful"
81
86
  #: components/Controlpanels/ExportImport
@@ -85,7 +90,7 @@ msgstr "Import erfolgreich"
85
90
  #. Default: "Importing…"
86
91
  #: components/Controlpanels/ExportImport
87
92
  msgid "Importing…"
88
- msgstr ""
93
+ msgstr "Importieren..."
89
94
 
90
95
  #. Default: "Latest available configuration"
91
96
  #: components/Controlpanels/UpgradeControlPanel
@@ -102,6 +107,11 @@ msgstr ""
102
107
  msgid "No addons found"
103
108
  msgstr ""
104
109
 
110
+ #. Default: "No file selected"
111
+ #: components/Controlpanels/ExportImport
112
+ msgid "No file selected"
113
+ msgstr "Keine Datei ausgewählt"
114
+
105
115
  #. Default: "Package Version"
106
116
  #: components/Controlpanels/VersionOverview
107
117
  msgid "Package Version"
@@ -22,6 +22,11 @@ msgstr ""
22
22
  msgid "Back"
23
23
  msgstr ""
24
24
 
25
+ #. Default: "Choose file"
26
+ #: components/Controlpanels/ExportImport
27
+ msgid "Choose file"
28
+ msgstr ""
29
+
25
30
  #. Default: "Configuration Versions"
26
31
  #: components/Controlpanels/UpgradeControlPanel
27
32
  msgid "Configuration Versions"
@@ -102,6 +107,11 @@ msgstr ""
102
107
  msgid "No addons found"
103
108
  msgstr ""
104
109
 
110
+ #. Default: "No file selected"
111
+ #: components/Controlpanels/ExportImport
112
+ msgid "No file selected"
113
+ msgstr ""
114
+
105
115
  #. Default: "Package Version"
106
116
  #: components/Controlpanels/VersionOverview
107
117
  msgid "Package Version"
@@ -29,6 +29,11 @@ msgstr ""
29
29
  msgid "Back"
30
30
  msgstr ""
31
31
 
32
+ #. Default: "Choose file"
33
+ #: components/Controlpanels/ExportImport
34
+ msgid "Choose file"
35
+ msgstr ""
36
+
32
37
  #. Default: "Configuration Versions"
33
38
  #: components/Controlpanels/UpgradeControlPanel
34
39
  msgid "Configuration Versions"
@@ -109,6 +114,11 @@ msgstr ""
109
114
  msgid "No addons found"
110
115
  msgstr ""
111
116
 
117
+ #. Default: "No file selected"
118
+ #: components/Controlpanels/ExportImport
119
+ msgid "No file selected"
120
+ msgstr ""
121
+
112
122
  #. Default: "Package Version"
113
123
  #: components/Controlpanels/VersionOverview
114
124
  msgid "Package Version"
@@ -27,6 +27,11 @@ msgstr "Complementos"
27
27
  msgid "Back"
28
28
  msgstr "Voltar"
29
29
 
30
+ #. Default: "Choose file"
31
+ #: components/Controlpanels/ExportImport
32
+ msgid "Choose file"
33
+ msgstr ""
34
+
30
35
  #. Default: "Configuration Versions"
31
36
  #: components/Controlpanels/UpgradeControlPanel
32
37
  msgid "Configuration Versions"
@@ -107,6 +112,11 @@ msgstr "Mais informações sobre o procedimento de atualização podem ser encon
107
112
  msgid "No addons found"
108
113
  msgstr "Nenhum complemento encontrado"
109
114
 
115
+ #. Default: "No file selected"
116
+ #: components/Controlpanels/ExportImport
117
+ msgid "No file selected"
118
+ msgstr ""
119
+
110
120
  #. Default: "Package Version"
111
121
  #: components/Controlpanels/VersionOverview
112
122
  msgid "Package Version"
package/locales/volto.pot CHANGED
@@ -1,7 +1,7 @@
1
1
  msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: Plone\n"
4
- "POT-Creation-Date: 2026-02-24T11:06:04.840Z\n"
4
+ "POT-Creation-Date: 2026-03-09T12:12:02.110Z\n"
5
5
  "Last-Translator: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
6
6
  "Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
7
7
  "Content-Type: text/plain; charset=utf-8\n"
@@ -24,6 +24,11 @@ msgstr ""
24
24
  msgid "Back"
25
25
  msgstr ""
26
26
 
27
+ #. Default: "Choose file"
28
+ #: components/Controlpanels/ExportImport
29
+ msgid "Choose file"
30
+ msgstr ""
31
+
27
32
  #. Default: "Configuration Versions"
28
33
  #: components/Controlpanels/UpgradeControlPanel
29
34
  msgid "Configuration Versions"
@@ -104,6 +109,11 @@ msgstr ""
104
109
  msgid "No addons found"
105
110
  msgstr ""
106
111
 
112
+ #. Default: "No file selected"
113
+ #: components/Controlpanels/ExportImport
114
+ msgid "No file selected"
115
+ msgstr ""
116
+
107
117
  #. Default: "Package Version"
108
118
  #: components/Controlpanels/VersionOverview
109
119
  msgid "Package Version"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitconcept/core",
3
- "version": "2.0.0-alpha.12",
3
+ "version": "2.0.0-alpha.14",
4
4
  "description": "Core setup for kitconcept GmbH distributions built on top of Plone",
5
5
  "main": "src/index.ts",
6
6
  "license": "MIT",
@@ -19,17 +19,8 @@
19
19
  "publishConfig": {
20
20
  "access": "public"
21
21
  },
22
- "scripts": {
23
- "i18n": "rm -rf build/messages && NODE_ENV=production i18n --addon",
24
- "dry-release": "release-it --dry-run",
25
- "release": "release-it",
26
- "release-major-alpha": "release-it major --preRelease=alpha",
27
- "release-alpha": "release-it --preRelease=alpha"
28
- },
29
22
  "dependencies": {
30
- "@mbarde/volto-image-crop-widget": "^0.5.1",
31
- "@plone-collective/volto-authomatic": "3.0.0-alpha.6",
32
- "@plone/components": "workspace:^"
23
+ "@plone/components": "^4.0.0-alpha.6"
33
24
  },
34
25
  "peerDependencies": {
35
26
  "react": "^18.2.0",
@@ -39,13 +30,20 @@
39
30
  },
40
31
  "devDependencies": {
41
32
  "@plone/scripts": "^3.6.1",
42
- "@plone/types": "workspace:*",
43
33
  "@types/lodash": "^4.14.201",
44
34
  "@types/react": "^18.3.1",
45
35
  "@types/react-dom": "^18.3.1",
46
36
  "lodash": "4.17.21",
47
37
  "release-it": "^19.0.5",
48
38
  "typescript": "^5.7.3",
49
- "vitest": "^3.1.2"
39
+ "vitest": "^3.1.2",
40
+ "@plone/types": "2.0.0-alpha.14"
41
+ },
42
+ "scripts": {
43
+ "i18n": "rm -rf build/messages && NODE_ENV=production i18n --addon",
44
+ "dry-release": "release-it --dry-run",
45
+ "release": "release-it",
46
+ "release-major-alpha": "release-it major --preRelease=alpha",
47
+ "release-alpha": "release-it --preRelease=alpha"
50
48
  }
51
- }
49
+ }
@@ -3,7 +3,7 @@
3
3
  * using @plone/components (React Aria based)
4
4
  */
5
5
 
6
- import React, { useState } from 'react';
6
+ import React, { useRef, useState } from 'react';
7
7
  import Toolbar from '@plone/volto/components/manage/Toolbar/Toolbar';
8
8
  import Icon from '@plone/volto/components/theme/Icon/Icon';
9
9
  import { Link } from 'react-router-dom';
@@ -17,11 +17,13 @@ import { createPortal } from 'react-dom';
17
17
  import { useDispatch, useSelector } from 'react-redux';
18
18
  import { importContent } from '../../actions/exportImport/exportImport';
19
19
 
20
- import uploadSVG from '@plone/volto/icons/upload.svg';
21
- import downloadSVG from '@plone/volto/icons/download.svg';
20
+ import importSVG from '../../icons/import.svg';
21
+ import exportSVG from '../../icons/export.svg';
22
22
  import backSVG from '@plone/volto/icons/back.svg';
23
23
 
24
24
  import { defineMessages, useIntl } from 'react-intl';
25
+ import { slugify } from '@plone/volto/helpers/Utils/Utils';
26
+ import config from '@plone/volto/registry';
25
27
 
26
28
  const messages = defineMessages({
27
29
  back: {
@@ -72,14 +74,24 @@ const messages = defineMessages({
72
74
  id: 'Importing…',
73
75
  defaultMessage: 'Importing…',
74
76
  },
77
+ chooseFile: {
78
+ id: 'Choose file',
79
+ defaultMessage: 'Choose file',
80
+ },
81
+ noFileSelected: {
82
+ id: 'No file selected',
83
+ defaultMessage: 'No file selected',
84
+ },
75
85
  });
76
86
 
77
87
  const ContentTransfer = ({ pathname }) => {
78
88
  const [file, setFile] = useState(null);
89
+ const fileInputRef = useRef(null);
79
90
  const intl = useIntl();
80
91
  const isClient = useClient();
81
92
  const dispatch = useDispatch();
82
93
  const token = useSelector((state) => state.userSession.token);
94
+ const siteTitle = config.settings.publicURL;
83
95
 
84
96
  const [exporting, setExporting] = useState(false);
85
97
  const [importing, setImporting] = useState(false);
@@ -103,7 +115,8 @@ const ContentTransfer = ({ pathname }) => {
103
115
 
104
116
  const a = document.createElement('a');
105
117
  a.href = url;
106
- a.download = 'export.zip';
118
+ const timestamp = new Date().toISOString().slice(0, 16).replace(':', '-');
119
+ a.download = `${slugify(siteTitle)}_${timestamp}.zip`;
107
120
  a.click();
108
121
 
109
122
  window.URL.revokeObjectURL(url);
@@ -168,13 +181,15 @@ const ContentTransfer = ({ pathname }) => {
168
181
  <div className="grid-container">
169
182
  <div className="grid-column export">
170
183
  <h2>{intl.formatMessage(messages.exportContent)}</h2>
184
+ <span>
185
+ <Icon name={exportSVG} size="50px" />
186
+ </span>
171
187
 
172
188
  <Button
173
189
  variant="primary"
174
190
  isDisabled={exporting}
175
191
  onPress={handleExport}
176
192
  >
177
- <Icon name={downloadSVG} size="20px" />
178
193
  {exporting ? (
179
194
  <span>{intl.formatMessage(messages.exporting)}</span>
180
195
  ) : (
@@ -185,19 +200,38 @@ const ContentTransfer = ({ pathname }) => {
185
200
 
186
201
  <div className="grid-column import">
187
202
  <h2>{intl.formatMessage(messages.importContent)}</h2>
203
+ <span>
204
+ <Icon name={importSVG} size="50px" />
205
+ </span>
188
206
 
189
- <input
190
- type="file"
191
- accept=".zip"
192
- onChange={(e) => setFile(e.target.files[0])}
193
- />
207
+ <div className="file-input-wrapper">
208
+ <input
209
+ ref={fileInputRef}
210
+ type="file"
211
+ accept=".zip"
212
+ onChange={(e) => setFile(e.target.files[0])}
213
+ hidden
214
+ />
215
+ <Button
216
+ variant="secondary"
217
+ onPress={() => fileInputRef.current?.click()}
218
+ >
219
+ {intl.formatMessage(messages.chooseFile)}
220
+ </Button>
221
+ <span className="file-input-name">
222
+ {file
223
+ ? file.name.length > 48
224
+ ? `${file.name.slice(0, 35)}…${file.name.slice(-12)}`
225
+ : file.name
226
+ : intl.formatMessage(messages.noFileSelected)}
227
+ </span>
228
+ </div>
194
229
 
195
230
  <Button
196
231
  variant="primary"
197
232
  isDisabled={!file || importing}
198
233
  onPress={handleImport}
199
234
  >
200
- <Icon name={uploadSVG} size="20px" />
201
235
  {importing ? (
202
236
  <span>{intl.formatMessage(messages.importing)}</span>
203
237
  ) : (
@@ -1,9 +1,34 @@
1
1
  import type { ConfigType } from '@plone/registry';
2
+ import type { apiExpandersType } from '@plone/types';
2
3
 
3
4
  export default function install(config: ConfigType) {
4
5
  // Language is Deutsch
5
6
  config.settings.defaultLanguage = 'de';
6
7
  config.settings.supportedLanguages = ['en', 'de'];
7
8
 
9
+ const EXPANDERS_INHERIT_BEHAVIORS = 'kitconcept.blocks.config';
10
+
11
+ // Add API expander for inheriting blocks config
12
+ config.settings.apiExpanders = [
13
+ ...config.settings.apiExpanders,
14
+ {
15
+ match: '',
16
+ GET_CONTENT: ['inherit'],
17
+ querystring: (config, querystring) => {
18
+ if (querystring['expand.inherit.behaviors']) {
19
+ return {
20
+ 'expand.inherit.behaviors': querystring[
21
+ 'expand.inherit.behaviors'
22
+ ].concat(',', EXPANDERS_INHERIT_BEHAVIORS),
23
+ };
24
+ } else {
25
+ return {
26
+ 'expand.inherit.behaviors': EXPANDERS_INHERIT_BEHAVIORS,
27
+ };
28
+ }
29
+ },
30
+ } as apiExpandersType,
31
+ ];
32
+
8
33
  return config;
9
34
  }
@@ -0,0 +1,11 @@
1
+ <svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_22614_98210)">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M21.1539 0V3.84615H43.4423L15.9423 31.3269L18.6731 34.0577L46.1539 6.55769V28.8462H50V0H21.1539Z" fill="black"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M34.6154 46.1538H3.84615V15.3846H25V11.5385H0V50H38.4615V25H34.6154V46.1538Z" fill="black"/>
5
+ </g>
6
+ <defs>
7
+ <clipPath id="clip0_22614_98210">
8
+ <rect width="50" height="50" fill="white"/>
9
+ </clipPath>
10
+ </defs>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g clip-path="url(#clip0_22614_98218)">
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M28.8462 50L28.8462 46.1539L6.55774 46.1538L34.0577 18.6731L31.327 15.9423L3.8462 43.4423L3.8462 21.1538L5.21129e-05 21.1538L4.95911e-05 50L28.8462 50Z" fill="black"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M15.3846 3.84616L46.1538 3.84616L46.1538 34.6154L25 34.6154L25 38.4616L50 38.4616L50 1.20005e-05L11.5385 8.63812e-06L11.5385 25L15.3846 25L15.3846 3.84616Z" fill="black"/>
5
+ </g>
6
+ <defs>
7
+ <clipPath id="clip0_22614_98218">
8
+ <rect width="50" height="50" fill="white" transform="translate(50 50) rotate(-180)"/>
9
+ </clipPath>
10
+ </defs>
11
+ </svg>