@eeacms/volto-tabs-block 10.0.4 → 10.0.5

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.
@@ -0,0 +1,133 @@
1
+ name: Betterleaks
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ scan:
12
+ name: Scan for secrets
13
+ runs-on: ubuntu-latest
14
+ env:
15
+ SMTP_URL: ${{ secrets.SMTP_URL }}
16
+ SMTP_PORT: ${{ secrets.SMTP_PORT || '25' }}
17
+ SMTP_EMAIL: ${{ secrets.SMTP_EMAIL }}
18
+ SMTP_PASSWORD: ${{ secrets.SMTP_PASSWORD }}
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 1
24
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
25
+
26
+ - name: Run Betterleaks
27
+ id: betterleaks
28
+ continue-on-error: true
29
+ uses: dortort/betterleaks-action@v0.1.0
30
+ with:
31
+ github-token: ${{ secrets.GITHUB_TOKEN }}
32
+ scan-mode: dir
33
+ scan-path: .
34
+ config: .gitleaks.toml
35
+ report-format: json
36
+ report-path: betterleaks-report.json
37
+ redact: "true"
38
+ no-color: "true"
39
+ no-banner: "true"
40
+ fail-on-leak: "true"
41
+
42
+ - name: Upload Betterleaks report
43
+ if: always()
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: betterleaks-report
47
+ path: betterleaks-report.json
48
+ if-no-files-found: ignore
49
+
50
+ - name: Build Betterleaks email summary
51
+ id: leak_summary
52
+ if: steps.betterleaks.outcome == 'failure'
53
+ shell: bash
54
+ run: |
55
+ if [[ -s betterleaks-report.json ]]; then
56
+ jq -r '
57
+ def one_line:
58
+ tostring
59
+ | gsub("[\r\n]+"; " ")
60
+ | if length > 240 then .[0:240] + "..." else . end;
61
+
62
+ .[:20][]
63
+ | "- " + (.RuleID // "unknown-rule")
64
+ + " at " + (.File // "unknown-file")
65
+ + ":" + ((.StartLine // 0) | tostring)
66
+ + "\n match: " + ((.Match // .Secret // "REDACTED") | one_line)
67
+ ' betterleaks-report.json > betterleaks-email-summary.txt
68
+
69
+ count="$(jq 'length' betterleaks-report.json)"
70
+ if (( count > 20 )); then
71
+ {
72
+ echo ""
73
+ echo "... and $((count - 20)) more finding(s). Download the artifact for full details."
74
+ } >> betterleaks-email-summary.txt
75
+ fi
76
+ else
77
+ echo "No JSON report was generated. Download the workflow logs for details." > betterleaks-email-summary.txt
78
+ fi
79
+
80
+ {
81
+ echo "text<<BETTERLEAKS_SUMMARY"
82
+ cat betterleaks-email-summary.txt
83
+ echo "BETTERLEAKS_SUMMARY"
84
+ } >> "$GITHUB_OUTPUT"
85
+
86
+ - name: Resolve committer email
87
+ id: committer
88
+ if: steps.betterleaks.outcome == 'failure'
89
+ shell: bash
90
+ run: |
91
+ committer_email="$(git log -1 --format='%ce')"
92
+ author_email="$(git log -1 --format='%ae')"
93
+ email="$committer_email"
94
+ if [[ -z "$email" || "$email" == *"noreply.github.com"* ]]; then
95
+ email="$author_email"
96
+ fi
97
+ if [[ "$email" =~ ^[^[:space:]@]+@[^[:space:]@]+\.[^[:space:]@]+$ && "$email" != *"noreply.github.com"* ]]; then
98
+ echo "email=$email" >> "$GITHUB_OUTPUT"
99
+ else
100
+ echo "No deliverable committer email found; skipping Betterleaks email notification."
101
+ echo "email=" >> "$GITHUB_OUTPUT"
102
+ fi
103
+
104
+ - name: Email committer on Betterleaks failure
105
+ if: steps.betterleaks.outcome == 'failure' && steps.committer.outputs.email != '' && env.SMTP_URL != '' && env.SMTP_EMAIL != ''
106
+ uses: dawidd6/action-send-mail@v18
107
+ with:
108
+ server_address: ${{ env.SMTP_URL }}
109
+ server_port: ${{ env.SMTP_PORT }}
110
+ secure: ${{ env.SMTP_PORT == '465' }}
111
+ username: ${{ env.SMTP_EMAIL }}
112
+ password: ${{ env.SMTP_PASSWORD }}
113
+ from: ${{ env.SMTP_EMAIL }}
114
+ to: ${{ steps.committer.outputs.email }}
115
+ subject: "[Betterleaks] Secret scan failed in ${{ github.repository }}"
116
+ body: |
117
+ Betterleaks detected one or more potential secrets.
118
+
119
+ Repository: ${{ github.repository }}
120
+ Branch: ${{ github.ref_name }}
121
+ Commit: ${{ github.sha }}
122
+ Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
123
+
124
+ Findings:
125
+ ${{ steps.leak_summary.outputs.text }}
126
+
127
+ Download the betterleaks-report artifact from the workflow run for details.
128
+
129
+ - name: Fail if Betterleaks found leaks
130
+ if: steps.betterleaks.outcome == 'failure'
131
+ run: |
132
+ echo "Betterleaks detected one or more secrets. Download the betterleaks-report artifact from this workflow run for details."
133
+ exit 1
package/.gitleaks.toml ADDED
@@ -0,0 +1,89 @@
1
+ title = "Betterleaks config"
2
+
3
+ [extend]
4
+ useDefault = true
5
+
6
+ [[rules]]
7
+ id = "secret-literal-assignment"
8
+ description = "Secret-like literal assignment in source, YAML, env and config files"
9
+ regex = '''(?i)([A-Za-z0-9_.-]*(?:password|passwd|pwd|api[_-]?key|apikey|access[_-]?key|secret[_-]?access[_-]?key|private[_-]?key|client[_-]?secret|consumer[_-]?key|consumer[_-]?secret|(?:auth|access|refresh|session|api|bearer|id|jwt|csrf|xsrf|oauth)[_-]?token|translate[_-]?auth|translation[_-]?auth|auth[_-]?password|auth[_-]?key|auth[_-]?credentials|database[_-]?url|connection[_-]?string)[A-Za-z0-9_.-]*)[ \t]*[:=][ \t]*["'']?([^"''[:space:]#{}$.][^"''\n#{}]{2,})["'']?'''
10
+ secretGroup = 2
11
+ keywords = [
12
+ "password",
13
+ "passwd",
14
+ "pwd",
15
+ "api_key",
16
+ "apikey",
17
+ "access_key",
18
+ "private_key",
19
+ "client_secret",
20
+ "consumer_key",
21
+ "consumer_secret",
22
+ "auth_token",
23
+ "access_token",
24
+ "refresh_token",
25
+ "session_token",
26
+ "api_token",
27
+ "bearer_token",
28
+ "id_token",
29
+ "jwt_token",
30
+ "csrf_token",
31
+ "xsrf_token",
32
+ "oauth_token",
33
+ "translate_auth",
34
+ "translation_auth",
35
+ "auth_password",
36
+ "auth_key",
37
+ "auth_credentials",
38
+ "database_url",
39
+ "connection_string"
40
+ ]
41
+ tags = ["literal-secret"]
42
+
43
+ [[rules]]
44
+ id = "env-short-secret-assignment"
45
+ description = "Uppercase env-style PASS/TOKEN/SECRET assignment"
46
+ regex = '''\b((?:PASS|TOKEN|SECRET|[A-Z0-9_]*(?:_PASS|_TOKEN|_SECRET|PASS_|TOKEN_|SECRET_)[A-Z0-9_]*))[ \t]*[:=][ \t]*["'']?([^"''[:space:]#{}$.][^"''\n#{}]{2,})["'']?'''
47
+ secretGroup = 2
48
+ keywords = [
49
+ "PASS",
50
+ "TOKEN",
51
+ "SECRET"
52
+ ]
53
+ tags = ["env", "literal-secret"]
54
+
55
+ [[rules]]
56
+ id = "standalone-sk-token"
57
+ description = "Standalone sk-* token not attached to a secret-like variable name"
58
+ regex = '''(?i)\b(sk-[A-Za-z0-9][A-Za-z0-9_-]{20,})\b'''
59
+ secretGroup = 1
60
+ entropy = 2.5
61
+ keywords = ["sk-"]
62
+ tags = ["standalone-token", "generic"]
63
+
64
+ [[rules]]
65
+ id = "dotenv-only-jest-setup"
66
+ description = ".env may only contain the committed Jest setup lines"
67
+ path = '''(?i)(^|/)\.env$'''
68
+ regex = '''(?m)^(.+)$'''
69
+ secretGroup = 1
70
+ tags = ["file", "dotenv"]
71
+ [[rules.allowlists]]
72
+ regexTarget = "match"
73
+ regexes = [
74
+ '''^JEST_USE_SETUP=OFF # Jest configuration variables: ON, OFF\r?$''',
75
+ ]
76
+
77
+ [[rules]]
78
+ id = "forbidden-secret-file"
79
+ description = "Forbidden secret-bearing file committed to repository"
80
+ path = '''(?i)(^|/)(\.env\..*|\.npmrc|\.pypirc|id_rsa|id_ed25519|.*\.(pem|key|p12|pfx|jks|kubeconfig))$'''
81
+ regex = '''(?s).{1,}'''
82
+ tags = ["file", "secret-file"]
83
+
84
+ [[allowlists]]
85
+ description = "Allow Jenkins SonarQube token environment variable reference"
86
+ regexTarget = "match"
87
+ regexes = [
88
+ '''SONAR_AUTH_TOKEN''',
89
+ ]
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. Dates are d
4
4
 
5
5
  Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
6
6
 
7
+ ### [10.0.5](https://github.com/eea/volto-tabs-block/compare/10.0.4...10.0.5) - 29 October 2026
8
+
9
+ #### :bug: Bug Fixes
10
+
11
+ - fix: add a new block to a tab emptied with delete - refs #308479 [dobri1408 - [`985acee`](https://github.com/eea/volto-tabs-block/commit/985aceecb0c9c44fd86ad81ed9557484b55d9e5e)]
12
+ - fix: Add betterleaks github action - refs #304517 [dobri1408 - [`8e3b4c3`](https://github.com/eea/volto-tabs-block/commit/8e3b4c313ac05316602252f68ff6531498a35862)]
13
+
14
+ #### :hammer_and_wrench: Others
15
+
16
+ - test: pin Chromium version 149 to work with Cypress [valentinab25 - [`a867bbe`](https://github.com/eea/volto-tabs-block/commit/a867bbed901538b2e0613d413943035f663beb47)]
7
17
  ### [10.0.4](https://github.com/eea/volto-tabs-block/compare/10.0.3...10.0.4) - 6 June 2026
8
18
 
9
19
  ### [10.0.3](https://github.com/eea/volto-tabs-block/compare/10.0.2...10.0.3) - 4 June 2026
@@ -21,11 +31,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
21
31
 
22
32
  - feat: Volto 18 support - refs #287700 [Alin Voinea - [`f370bb2`](https://github.com/eea/volto-tabs-block/commit/f370bb24f0a741129c21896338baf19ed4bab030)]
23
33
 
24
- #### :house: Internal changes
25
-
26
- - chore: [JENKINSFILE] add package version in sonarqube [valentinab25 - [`1e18835`](https://github.com/eea/volto-tabs-block/commit/1e18835ff2d59579de5dc9bb8ec6056a90dd7f77)]
27
- - chore: [JENKINSFILE] use sonarqube branches [EEA Jenkins - [`1b14a57`](https://github.com/eea/volto-tabs-block/commit/1b14a57d39aa4685294068fff78275a1f6248964)]
28
-
29
34
  #### :hammer_and_wrench: Others
30
35
 
31
36
  - Release 10.0.0: Volto 18 support [Alin Voinea - [`3f509ae`](https://github.com/eea/volto-tabs-block/commit/3f509aed7cff2e43d4d50f64bf24b6244602fd95)]
@@ -36,20 +41,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
36
41
  #### :hammer_and_wrench: Others
37
42
 
38
43
  - Release 9.1.0 [Alin Voinea - [`4396e37`](https://github.com/eea/volto-tabs-block/commit/4396e3740694d99cbb66414783c3fbbef7ed2022)]
39
- - Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`20aaf70`](https://github.com/eea/volto-tabs-block/commit/20aaf70fec13c977a805caeec043457867e62c36)]
40
- - Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`d516041`](https://github.com/eea/volto-tabs-block/commit/d516041244ee793504833b38033e75df20a8fa13)]
41
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`ae5b123`](https://github.com/eea/volto-tabs-block/commit/ae5b123036ab3ec9d225228206016d78ab6dcaa4)]
42
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`74fb410`](https://github.com/eea/volto-tabs-block/commit/74fb410ec9e3657e55fc5ea35c6717a737ddc375)]
43
44
  ### [9.0.3](https://github.com/eea/volto-tabs-block/compare/9.0.2...9.0.3) - 7 May 2025
44
45
 
45
46
  #### :bug: Bug Fixes
46
47
 
47
48
  - fix: Active tab when navigation from within - refs #287006 [Nilesh - [`5133d07`](https://github.com/eea/volto-tabs-block/commit/5133d07b1fcf9fef8b336ea27a679d4aea594513)]
48
49
 
49
- #### :hammer_and_wrench: Others
50
-
51
- - Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`01b5632`](https://github.com/eea/volto-tabs-block/commit/01b563271bd04f4329d9f876278324b970443413)]
52
- - Add Sonarqube tag using ied-frontend addons list [EEA Jenkins - [`d457e25`](https://github.com/eea/volto-tabs-block/commit/d457e25d8a97b080eb8eb32ae4b85db530049e96)]
53
50
  ### [9.0.2](https://github.com/eea/volto-tabs-block/compare/9.0.1...9.0.2) - 27 January 2025
54
51
 
55
52
  #### :house: Internal changes
@@ -98,10 +95,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
98
95
  - feat: Release 8.0.0 - Volto 17 support [alin - [`57dd000`](https://github.com/eea/volto-tabs-block/commit/57dd0008921899688a6175c9fb00588593a7b307)]
99
96
  - feat: Volto 17 support - refs #264527 [EEA Jenkins - [`80b384c`](https://github.com/eea/volto-tabs-block/commit/80b384ca871dd2578b1cd0c0bf3e238d0289b977)]
100
97
 
101
- #### :hammer_and_wrench: Others
102
-
103
- - Add Sonarqube tag using insitu-frontend addons list [EEA Jenkins - [`cb58ea7`](https://github.com/eea/volto-tabs-block/commit/cb58ea7417e8dd237b66908fd53f1f3ca8726566)]
104
- - Add Sonarqube tag using freshwater-frontend addons list [EEA Jenkins - [`4377ffc`](https://github.com/eea/volto-tabs-block/commit/4377ffc350a92f62cbe77b17b67dd331c71cbcd7)]
105
98
  ### [7.5.1](https://github.com/eea/volto-tabs-block/compare/7.5.0...7.5.1) - 28 March 2024
106
99
 
107
100
  #### :nail_care: Enhancements
@@ -144,7 +137,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
144
137
  - Update react-slick version to 0.30.1 [David Ichim - [`3369176`](https://github.com/eea/volto-tabs-block/commit/33691768899e7f91d2cd15319dbe3ebe66cf1513)]
145
138
  - update [Razvan - [`61b19e8`](https://github.com/eea/volto-tabs-block/commit/61b19e8584ff6023320b3671414392ea11449ff0)]
146
139
  - use DefaultEdit variation for responsive accordion, refs #266327 [Razvan - [`11acf6c`](https://github.com/eea/volto-tabs-block/commit/11acf6ce5afe022ddd30bff42c9a3321d1284da6)]
147
- - Add Sonarqube tag using insitu-frontend addons list [EEA Jenkins - [`5045757`](https://github.com/eea/volto-tabs-block/commit/5045757a275477ba382551b301998d835741b716)]
148
140
  ### [7.0.5](https://github.com/eea/volto-tabs-block/compare/7.0.4...7.0.5) - 10 December 2023
149
141
 
150
142
  #### :rocket: New Features
@@ -152,10 +144,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
152
144
  - feat: add more tests for view/edit component [hazigabriel - [`72d0467`](https://github.com/eea/volto-tabs-block/commit/72d0467e74042b103630aacb8cffafb7c7a4a83f)]
153
145
  - feat: refactor custom useQuery hook to avoid uncessary rerender [hazigabriel - [`6f28052`](https://github.com/eea/volto-tabs-block/commit/6f28052336db391ef9c918b2b329da4ae1639850)]
154
146
 
155
- #### :bug: Bug Fixes
156
-
157
- - fix: add jest config to fix jenkins error [hazigabriel - [`63fa962`](https://github.com/eea/volto-tabs-block/commit/63fa962f7f49ac8986ff250db57f544292aa951c)]
158
-
159
147
  ### [7.0.4](https://github.com/eea/volto-tabs-block/compare/7.0.3...7.0.4) - 4 December 2023
160
148
 
161
149
  #### :bug: Bug Fixes
@@ -174,10 +162,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
174
162
 
175
163
  - fix(menu): Update secondary pointing inverted active border color variable in menu [David Ichim - [`d8a7837`](https://github.com/eea/volto-tabs-block/commit/d8a78377058732c42295196810416b41ad41417c)]
176
164
 
177
- #### :hammer_and_wrench: Others
178
-
179
- - test: [JENKINS] Use java17 for sonarqube scanner [valentinab25 - [`3b87d12`](https://github.com/eea/volto-tabs-block/commit/3b87d12df4d01031231b15eb4196f6ff6937706b)]
180
- - test: [JENKINS] Run cypress in started frontend container [valentinab25 - [`f5f3430`](https://github.com/eea/volto-tabs-block/commit/f5f343024b45bb0206e0169cce6dd0e8472b6795)]
181
165
  ### [7.0.1](https://github.com/eea/volto-tabs-block/compare/7.0.0...7.0.1) - 9 November 2023
182
166
 
183
167
  #### :bug: Bug Fixes
@@ -185,17 +169,8 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
185
169
  - fix(tabs): default view style due to missing class found on edit #75 from eea/develop [ichim-david - [`f620621`](https://github.com/eea/volto-tabs-block/commit/f6206213915d072838173ca2a5bff4d4ddc461c1)]
186
170
  - fix(tabs): added missing tabs-secondary-variant class to default tab view template [David Ichim - [`a122359`](https://github.com/eea/volto-tabs-block/commit/a122359601d548d7577e7f978b5025a92469d1dd)]
187
171
 
188
- #### :hammer_and_wrench: Others
189
-
190
- - test: [JENKINS] Add cpu limit on cypress docker [valentinab25 - [`bd6ffd4`](https://github.com/eea/volto-tabs-block/commit/bd6ffd42a00a2d77ff59545d9adaab7a45361446)]
191
- - test: [JENKINS] Increase shm-size to cypress docker [valentinab25 - [`d481e25`](https://github.com/eea/volto-tabs-block/commit/d481e25c4d61d7ff6ea11ff75c99fbdd730ecd82)]
192
- - test: [JENKINS] Improve cypress time [valentinab25 - [`6c39efc`](https://github.com/eea/volto-tabs-block/commit/6c39efcc30bddfebb6c61f8a8cd714f61828ec69)]
193
172
  ## [7.0.0](https://github.com/eea/volto-tabs-block/compare/6.0.3...7.0.0) - 31 October 2023
194
173
 
195
- #### :house: Internal changes
196
-
197
- - chore: [JENKINS] Refactor automated testing [valentinab25 - [`f2e3d39`](https://github.com/eea/volto-tabs-block/commit/f2e3d3973c026f0331b82e0f691ec9bdc5899672)]
198
-
199
174
  #### :hammer_and_wrench: Others
200
175
 
201
176
  - Release 7.0.0 with variation support, icons for titles and i18n improvements #74 from eea/develop [ichim-david - [`a48175f`](https://github.com/eea/volto-tabs-block/commit/a48175fa3bc76650a76f993f0a3f4a3b43d14a9a)]
@@ -248,7 +223,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
248
223
  - Removed static alt title for image and set tab title to image when hideTitle is enabled [David Ichim - [`724f7ff`](https://github.com/eea/volto-tabs-block/commit/724f7fffb07b2679dd7135644e79c04aabdbf5f1)]
249
224
  - fix test by having proper variation name that was accordion and not accordionResponsive [David Ichim - [`7c47ee0`](https://github.com/eea/volto-tabs-block/commit/7c47ee0e8666360b6df4597d00397fe1b00aa861)]
250
225
  - Added format messages to the default tab schema [David Ichim - [`d1503e3`](https://github.com/eea/volto-tabs-block/commit/d1503e31f394208d6fc8afb07b1232dc65e68c04)]
251
- - Use Volto 16 for Jenkins tests until we are compatible with 17 [David Ichim - [`2b67e55`](https://github.com/eea/volto-tabs-block/commit/2b67e55745f815544ea462220a27193f13173e5c)]
252
226
  - updated test to also handle double click on edit and clicking around tabs [David Ichim - [`843f44b`](https://github.com/eea/volto-tabs-block/commit/843f44ba797355987a5a439d741dc947de21afce)]
253
227
  - enable pointing and secondary option and added some basic styling for tabs transformed into accordions [David Ichim - [`31baef7`](https://github.com/eea/volto-tabs-block/commit/31baef71e8765ad44f4c605954edd0995a996ab9)]
254
228
  - avoid double title if icon is enabled and removed rrt styles [David Ichim - [`b29941f`](https://github.com/eea/volto-tabs-block/commit/b29941f37b9b2131fd1b0e021351dd64bdff5237)]
@@ -369,7 +343,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
369
343
  - prettier fix [David Ichim - [`ac3e199`](https://github.com/eea/volto-tabs-block/commit/ac3e199a33651d21c003bf87b544c27f32a4638a)]
370
344
  - bump package version [David Ichim - [`011a9f0`](https://github.com/eea/volto-tabs-block/commit/011a9f0ef826e3a1367f0ea81a64072f49e239f8)]
371
345
  - lint fix after i18n enhancements from community [David Ichim - [`c46f8e1`](https://github.com/eea/volto-tabs-block/commit/c46f8e1096ab7e99b9a98e1c191b27f508e977eb)]
372
- - test: Update Makefile and docker-compose to align it with Jenkinsfile [valentinab25 - [`21697b3`](https://github.com/eea/volto-tabs-block/commit/21697b3ebe7f52f7753e491ab76733df4004955f)]
373
346
  - Add i18n support and pt_BR translation [André Clímaco - [`dfb1e66`](https://github.com/eea/volto-tabs-block/commit/dfb1e667a91e8250ea437a950217c6474771f3e5)]
374
347
  ### [5.0.8](https://github.com/eea/volto-tabs-block/compare/5.0.7...5.0.8) - 18 August 2023
375
348
 
@@ -405,10 +378,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
405
378
  - test: add unit tests for helpers - refs #253277 [ana-oprea - [`aa270d7`](https://github.com/eea/volto-tabs-block/commit/aa270d7db0da5086d48378a6ccf503e563805d72)]
406
379
  ### [5.0.3](https://github.com/eea/volto-tabs-block/compare/5.0.2...5.0.3) - 12 June 2023
407
380
 
408
- #### :house: Internal changes
409
-
410
- - chore: [JENKINS] Deprecate circularity website [valentinab25 - [`820aaa9`](https://github.com/eea/volto-tabs-block/commit/820aaa963e978a893a23b77f694bb011f3d768c1)]
411
-
412
381
  #### :hammer_and_wrench: Others
413
382
 
414
383
  - test: jest should look for addons in node_modules Refs #253277 [valentinab25 - [`e3b0519`](https://github.com/eea/volto-tabs-block/commit/e3b051969a3dac74b5f33340447fe98ffbc0fb14)]
@@ -496,9 +465,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
496
465
 
497
466
  - fix(Edit.jsx): add key prop to MenuItem component to avoid warning in console [Miu Razvan - [`55cc784`](https://github.com/eea/volto-tabs-block/commit/55cc784f452637cf686f80a40aef3809784032f6)]
498
467
 
499
- #### :hammer_and_wrench: Others
500
-
501
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`52bc1b0`](https://github.com/eea/volto-tabs-block/commit/52bc1b0fbd4611173b8ca9dc2cf4033b31474420)]
502
468
  ## [4.0.0](https://github.com/eea/volto-tabs-block/compare/3.0.1...4.0.0) - 10 March 2023
503
469
 
504
470
  #### :house: Internal changes
@@ -509,13 +475,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
509
475
  #### :hammer_and_wrench: Others
510
476
 
511
477
  - Release 4.0.0 [Alin Voinea - [`8fc4cc9`](https://github.com/eea/volto-tabs-block/commit/8fc4cc9d8dc71e623e6586b95871cb3b98dc385f)]
512
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`22d5bdc`](https://github.com/eea/volto-tabs-block/commit/22d5bdc1b3579cc46c73ce855041ca09154eb502)]
513
- - Add Sonarqube tag using advisory-board-frontend addons list [EEA Jenkins - [`fde4324`](https://github.com/eea/volto-tabs-block/commit/fde4324f962cde8e8de0d76a44bee4b67d216bf8)]
514
- - Add Sonarqube tag using advisory-board-frontend addons list [EEA Jenkins - [`9175e47`](https://github.com/eea/volto-tabs-block/commit/9175e470d793edc63b62a99940aed25dd45f3713)]
515
- - test(Jenkins): Run tests and cypress with latest canary @plone/volto [Alin Voinea - [`3348950`](https://github.com/eea/volto-tabs-block/commit/334895036f8e367281abb35a20879c32dfbfc292)]
516
- - Add Sonarqube tag using cca-frontend addons list [EEA Jenkins - [`39bfb39`](https://github.com/eea/volto-tabs-block/commit/39bfb39fa6e8483e639491ff998293e758ac6384)]
517
- - yarn 3 [Alin Voinea - [`7e98df5`](https://github.com/eea/volto-tabs-block/commit/7e98df59669d71945be461e86e282b913538b805)]
518
- - Add Sonarqube tag using demo-kitkat-frontend addons list [EEA Jenkins - [`079d7a4`](https://github.com/eea/volto-tabs-block/commit/079d7a43480e92fe280a9372399ff2d4d28537ae)]
519
478
  ### [3.0.1](https://github.com/eea/volto-tabs-block/compare/3.0.0...3.0.1) - 16 November 2022
520
479
 
521
480
  #### :hammer_and_wrench: Others
@@ -539,9 +498,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
539
498
 
540
499
  #### :hammer_and_wrench: Others
541
500
 
542
- - Add Sonarqube tag using marine-frontend addons list [EEA Jenkins - [`a00e419`](https://github.com/eea/volto-tabs-block/commit/a00e419aef4c82a25f277f5e25e3d512c7838264)]
543
501
  - lint fix [David Ichim - [`c0a898c`](https://github.com/eea/volto-tabs-block/commit/c0a898c54461478baed2ac2f149ae580d4c89aeb)]
544
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`3b284e6`](https://github.com/eea/volto-tabs-block/commit/3b284e65e0eafa9b5ad8c92b4cb77628ffcc8103)]
545
502
  ### [2.2.0](https://github.com/eea/volto-tabs-block/compare/2.1.0...2.2.0) - 25 August 2022
546
503
 
547
504
  #### :hammer_and_wrench: Others
@@ -557,7 +514,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
557
514
 
558
515
  - Release 2.1.0 [Alin Voinea - [`3cdfa30`](https://github.com/eea/volto-tabs-block/commit/3cdfa30d4d03d864be8ad63f0648b4717298734a)]
559
516
  - Squashed commit of the following: [Alin Voinea - [`ca241f5`](https://github.com/eea/volto-tabs-block/commit/ca241f56a96817679a1948154e2a8cc0e17b96fe)]
560
- - Add Sonarqube tag using circularity-frontend addons list [EEA Jenkins - [`68ea5a6`](https://github.com/eea/volto-tabs-block/commit/68ea5a6b971fc36840cf5716a04f68316b229b2b)]
561
517
  ### [2.0.2](https://github.com/eea/volto-tabs-block/compare/2.0.1...2.0.2) - 16 June 2022
562
518
 
563
519
  ### [2.0.1](https://github.com/eea/volto-tabs-block/compare/2.0.0...2.0.1) - 10 June 2022
@@ -601,8 +557,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
601
557
  - Let theme addon to set default values for default template schema [Miu Razvan - [`55f148d`](https://github.com/eea/volto-tabs-block/commit/55f148d1a95417f8a0b55681ce250acde8463c1c)]
602
558
  - Render pane as container if tabs-block has full-width class [Miu Razvan - [`bbffb96`](https://github.com/eea/volto-tabs-block/commit/bbffb96b908476ddee447af3ce79bafb1a12f9a8)]
603
559
  - Refactor default template [Miu Razvan - [`58eff52`](https://github.com/eea/volto-tabs-block/commit/58eff5281adb08a5f8fe6d21fd43330252012277)]
604
- - Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`72a6735`](https://github.com/eea/volto-tabs-block/commit/72a6735cbbc0e7d57b4bb7ea83fea9becc317018)]
605
- - Add Sonarqube tag using eea-website-frontend addons list [EEA Jenkins - [`e928da1`](https://github.com/eea/volto-tabs-block/commit/e928da1df7e4680bd4be9b5d46406800d721b8c5)]
606
560
  ### [1.2.12](https://github.com/eea/volto-tabs-block/compare/1.2.11...1.2.12) - 21 January 2022
607
561
 
608
562
  ### [1.2.11](https://github.com/eea/volto-tabs-block/compare/1.2.10...1.2.11) - 4 January 2022
@@ -615,19 +569,11 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
615
569
  - more cy tests [Daniela Mormocea - [`3aff15c`](https://github.com/eea/volto-tabs-block/commit/3aff15c3cb8247beee2bf80598e2f03400b3a479)]
616
570
  ### [1.2.9](https://github.com/eea/volto-tabs-block/compare/1.2.8...1.2.9) - 18 December 2021
617
571
 
618
- #### :hammer_and_wrench: Others
619
-
620
- - Add Sonarqube tag using freshwater-frontend addons list [EEA Jenkins - [`cd2e2ac`](https://github.com/eea/volto-tabs-block/commit/cd2e2ac1d127bfc688ecf16e17734603ab727a34)]
621
572
  ### [1.2.8](https://github.com/eea/volto-tabs-block/compare/1.2.7...1.2.8) - 10 December 2021
622
573
 
623
574
  #### :hammer_and_wrench: Others
624
575
 
625
576
  - Refs #142010 - Optimize Volto-addons gitflow pipelines [valentinab25 - [`d10c0b3`](https://github.com/eea/volto-tabs-block/commit/d10c0b3d35d25c530d19eebde38dfe5da8fda01b)]
626
- - Add Sonarqube tag using industry-frontend addons list [EEA Jenkins - [`1a7187f`](https://github.com/eea/volto-tabs-block/commit/1a7187f10b2bd9e1307dabf51823f63ccd766864)]
627
- - Add Sonarqube tag using clms-frontend addons list [EEA Jenkins - [`72a7550`](https://github.com/eea/volto-tabs-block/commit/72a755025b38e1d8dd7fe206273a70585e4b9ac8)]
628
- - Add Sonarqube tag using forests-frontend addons list [EEA Jenkins - [`022b277`](https://github.com/eea/volto-tabs-block/commit/022b2779a5d7fd7217c2d8a559eafab0bd86ce23)]
629
- - Add Sonarqube tag using sustainability-frontend addons list [EEA Jenkins - [`84c9bea`](https://github.com/eea/volto-tabs-block/commit/84c9bea7a0aba2fe9ef9713e7131de6da6e0bcce)]
630
- - Add Sonarqube tag using ims-frontend addons list [EEA Jenkins - [`020aa97`](https://github.com/eea/volto-tabs-block/commit/020aa97bc70a643ea3857566c5a1dc3a5200c2be)]
631
577
  ### [1.2.7](https://github.com/eea/volto-tabs-block/compare/1.2.6...1.2.7) - 27 August 2021
632
578
 
633
579
  #### :hammer_and_wrench: Others
@@ -644,12 +590,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
644
590
 
645
591
  - Move less import in View instead of Edit [Tiberiu Ichim - [`84aeff0`](https://github.com/eea/volto-tabs-block/commit/84aeff04a980076f54687c546691d37b6e790478)]
646
592
  - gitignore tweaks [Tiberiu Ichim - [`f4c993d`](https://github.com/eea/volto-tabs-block/commit/f4c993d004b126f08f16651ab9460546fa9e9cad)]
647
- - Add Sonarqube tag using frontend addons list [EEA Jenkins - [`865906a`](https://github.com/eea/volto-tabs-block/commit/865906a0deb261d44cc23e26bfd2d1dd0e319640)]
648
- - Add Sonarqube tag using frontend addons list [EEA Jenkins - [`5383861`](https://github.com/eea/volto-tabs-block/commit/538386100adbc868e693c1c2a5ba13461307ffee)]
649
593
  - Style update [razvanMiu - [`323aaaf`](https://github.com/eea/volto-tabs-block/commit/323aaafcad01d8fdf0e713a1fc254ae9fe319f43)]
650
594
  - Fix 'scroll to' feature on carousel [razvanMiu - [`16c6a08`](https://github.com/eea/volto-tabs-block/commit/16c6a08f6db687542ea38e07a92b265e592f6173)]
651
595
  - Better accesibility [razvanMiu - [`3511611`](https://github.com/eea/volto-tabs-block/commit/351161197270a4807f01d85a7055cbaadae72f8e)]
652
- - Updated Jenkins dependencies [razvanMiu - [`24471fd`](https://github.com/eea/volto-tabs-block/commit/24471fd7c678d04f244b132f13b4c655838f4e94)]
653
596
  - Add jest configuration [valentinab25 - [`c01b021`](https://github.com/eea/volto-tabs-block/commit/c01b0213bcb4b51408b6e3c196b2dcfa086377a9)]
654
597
  ### [1.2.4](https://github.com/eea/volto-tabs-block/compare/1.2.3...1.2.4) - 27 May 2021
655
598
 
package/README.md CHANGED
@@ -133,6 +133,65 @@ See [RELEASE.md](https://github.com/eea/volto-tabs-block/blob/master/RELEASE.md)
133
133
 
134
134
  See [DEVELOP.md](https://github.com/eea/volto-tabs-block/blob/master/DEVELOP.md).
135
135
 
136
+ ## Secret Scanning
137
+
138
+ This repository uses the Betterleaks GitHub Action to scan the current
139
+ repository content on every push and pull request. The scan uses the rules in
140
+ `.gitleaks.toml` and uploads a `betterleaks-report` artifact when a finding is
141
+ detected.
142
+
143
+ If the optional SMTP secrets are configured, failed scans also send an email to
144
+ the last commit committer. The workflow expects these repository or
145
+ organization secrets:
146
+
147
+ - `SMTP_URL`
148
+ - `SMTP_PORT` (optional, defaults to `25`)
149
+ - `SMTP_EMAIL`
150
+ - `SMTP_PASSWORD` (optional if the SMTP server does not require authentication)
151
+
152
+ Port `465` is sent with direct TLS; other ports use the default SMTP handshake.
153
+ The email includes a short finding summary from the redacted Betterleaks report,
154
+ including the redacted matched line from each finding.
155
+
156
+ There are three common outcomes:
157
+
158
+ 1. **Everything is OK.** The `Betterleaks / Scan for secrets` check is green and
159
+ no action is needed. Regular references to runtime values are OK, for example:
160
+
161
+ ```js
162
+ const tokenFromCookie = req.universalCookies.get('auth_token');
163
+ ```
164
+
165
+ 2. **A real secret was found.** The check is red and the workflow log asks you to
166
+ download the `betterleaks-report` artifact. Open the artifact from the GitHub
167
+ Actions run and check the reported file, line and rule. Remove the committed
168
+ value, move it to the proper secret store, and rotate it if it was exposed.
169
+ A report entry looks like this:
170
+
171
+ ```json
172
+ {
173
+ "RuleID": "secret-literal-assignment",
174
+ "File": "src/config.js",
175
+ "StartLine": 12,
176
+ "Secret": "[REDACTED]"
177
+ }
178
+ ```
179
+
180
+ 3. **The finding is a false positive.** Keep the value only if it is clearly not
181
+ sensitive, such as a test fixture, placeholder, or public example. Add
182
+ `betterleaks:allow` on the same line and include a short explanation in the
183
+ pull request.
184
+
185
+ ```js
186
+ const testPassword = 'admin'; //betterleaks:allow
187
+ ```
188
+
189
+ ```yaml
190
+ password: "admin" #betterleaks:allow
191
+ ```
192
+
193
+ Do not add `betterleaks:allow` to real credentials.
194
+
136
195
  ## Copyright and license
137
196
 
138
197
  The Initial Owner of the Original Code is European Environment Agency (EEA).
package/RELEASE.md CHANGED
@@ -33,7 +33,7 @@ Release-it is a tool that automates 4 important steps in the release process:
33
33
  To configure the authentification, you need to export GITHUB_TOKEN for [GitHub](https://github.com/settings/tokens)
34
34
 
35
35
  ```
36
- export GITHUB_TOKEN=XXX-XXXXXXXXXXXXXXXXXXXXXX
36
+ export GITHUB_TOKEN="${GITHUB_TOKEN}"
37
37
  ```
38
38
 
39
39
  To configure npm, you can use the `npm login` command or use a configuration file with a TOKEN :
@@ -15,6 +15,7 @@ module.exports = {
15
15
  '!src/**/*.d.ts',
16
16
  ],
17
17
  moduleNameMapper: {
18
+ '^uuid$': '<rootDir>/src/addons/volto-tabs-block/jest.uuid.js',
18
19
  '\\.(css|less|scss|sass)$': 'identity-obj-proxy',
19
20
  '@plone/volto/cypress': '<rootDir>/node_modules/@plone/volto/cypress',
20
21
  '@plone/volto/babel': '<rootDir>/node_modules/@plone/volto/babel',
package/jest.uuid.js ADDED
@@ -0,0 +1,3 @@
1
+ let counter = 0;
2
+
3
+ export const v4 = () => `test-uuid-${++counter}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeacms/volto-tabs-block",
3
- "version": "10.0.4",
3
+ "version": "10.0.5",
4
4
  "description": "volto-tabs-block: Volto add-on",
5
5
  "main": "src/index.js",
6
6
  "author": "European Environment Agency: IDM2 A-Team",
@@ -3,7 +3,11 @@ import BlockDataForm from '@plone/volto/components/manage/Form/BlockDataForm';
3
3
  import SidebarPortal from '@plone/volto/components/manage/Sidebar/SidebarPortal';
4
4
  import { getBlocksLayoutFieldname } from '@plone/volto/helpers/Blocks/Blocks';
5
5
  import { TABS_BLOCK } from '@eeacms/volto-tabs-block/constants';
6
- import { empty, emptyTab } from '@eeacms/volto-tabs-block/helpers';
6
+ import {
7
+ empty,
8
+ emptyTab,
9
+ fillEmptyTab,
10
+ } from '@eeacms/volto-tabs-block/helpers';
7
11
  import { StyleWrapperView } from '@eeacms/volto-block-style/StyleWrapper';
8
12
  import { BlockStyleWrapperEdit } from '@eeacms/volto-block-style/BlockStyleWrapper';
9
13
  import { getVariation } from '@eeacms/volto-tabs-block/helpers';
@@ -102,10 +106,10 @@ const Edit = (props) => {
102
106
  ...tabsData,
103
107
  blocks: {
104
108
  ...tabsData.blocks,
105
- [activeTab]: {
109
+ [activeTab]: fillEmptyTab({
106
110
  ...tabData,
107
111
  ...blocksState.current,
108
- },
112
+ }),
109
113
  },
110
114
  },
111
115
  });
@@ -219,10 +223,10 @@ const Edit = (props) => {
219
223
  ...tabsData,
220
224
  blocks: {
221
225
  ...tabsData.blocks,
222
- [activeTab]: {
226
+ [activeTab]: fillEmptyTab({
223
227
  ...tabData,
224
228
  ...newBlockData,
225
- },
229
+ }),
226
230
  },
227
231
  },
228
232
  });
@@ -25,6 +25,15 @@ jest.mock(
25
25
  () => ({
26
26
  empty: jest.fn(),
27
27
  emptyTab: jest.fn(() => ({})),
28
+ fillEmptyTab: jest.fn((tab) =>
29
+ tab?.blocks_layout?.items?.length > 0
30
+ ? tab
31
+ : {
32
+ ...tab,
33
+ blocks: { filled: { '@type': 'text' } },
34
+ blocks_layout: { items: ['filled'] },
35
+ },
36
+ ),
28
37
  getVariation: jest.fn(() => 'default'),
29
38
  }),
30
39
  { virtual: true },
@@ -78,10 +87,13 @@ jest.mock('@plone/volto/components/manage/Sidebar/SidebarPortal', () => ({
78
87
  default: ({ children }) => <div>{children}</div>,
79
88
  }));
80
89
 
90
+ const mockBlocksFormProps = jest.fn();
91
+
81
92
  jest.mock('@plone/volto/components/manage/Blocks/Block/BlocksForm', () => ({
82
93
  __esModule: true,
83
94
  default: jest.fn(
84
- ({ multiSelected, onSelectBlock, properties, selectedBlock }) => {
95
+ ({ multiSelected, onSelectBlock, properties, selectedBlock, ...rest }) => {
96
+ mockBlocksFormProps({ properties, ...rest });
85
97
  const blockList = properties.blocks
86
98
  ? Object.entries(properties.blocks)
87
99
  : [];
@@ -110,12 +122,21 @@ jest.mock('@plone/volto/components/manage/Blocks/Block/BlocksForm', () => ({
110
122
 
111
123
  jest.mock('@plone/volto/components/manage/Form/BlocksToolbar', () => ({
112
124
  __esModule: true,
113
- default: ({ selectedBlock, selectedBlocks }) => (
125
+ default: ({ onChangeBlocks, selectedBlock, selectedBlocks }) => (
114
126
  <div
115
127
  data-testid="blocks-toolbar"
116
128
  data-selected-block={selectedBlock || ''}
117
129
  data-selected-blocks={(selectedBlocks || []).join(',')}
118
- />
130
+ >
131
+ <button
132
+ type="button"
133
+ onClick={() =>
134
+ onChangeBlocks({ blocks: {}, blocks_layout: { items: [] } })
135
+ }
136
+ >
137
+ Delete all
138
+ </button>
139
+ </div>
119
140
  ),
120
141
  }));
121
142
 
@@ -236,4 +257,52 @@ describe('Tabs Edit', () => {
236
257
  'block1,block2',
237
258
  );
238
259
  });
260
+
261
+ const renderEdit = (onChangeBlock) =>
262
+ render(
263
+ <Provider store={store}>
264
+ <MemoryRouter>
265
+ <Edit
266
+ block="tabs-block"
267
+ data={mockData}
268
+ onChangeBlock={onChangeBlock}
269
+ onChangeField={jest.fn()}
270
+ selected={true}
271
+ setSidebarTab={jest.fn()}
272
+ blockNode={{ current: document.createElement('div') }}
273
+ />
274
+ </MemoryRouter>
275
+ </Provider>,
276
+ );
277
+
278
+ it('adds a new block to a tab emptied from the toolbar', () => {
279
+ const onChangeBlock = jest.fn();
280
+ renderEdit(onChangeBlock);
281
+ onChangeBlock.mockClear();
282
+
283
+ fireEvent.click(screen.getByRole('button', { name: 'Delete all' }));
284
+
285
+ const tab = onChangeBlock.mock.calls[0][1].data.blocks.tab1;
286
+ expect(onChangeBlock).toHaveBeenCalledTimes(1);
287
+ expect(tab.title).toBe('Tab 1');
288
+ expect(tab.blocks_layout.items).toEqual(['filled']);
289
+ });
290
+
291
+ it('keeps the tab title when the nested form empties it', () => {
292
+ const onChangeBlock = jest.fn();
293
+ renderEdit(onChangeBlock);
294
+ onChangeBlock.mockClear();
295
+
296
+ const { properties, onChangeFormData } =
297
+ mockBlocksFormProps.mock.calls.at(-1)[0];
298
+ onChangeFormData({
299
+ ...properties,
300
+ blocks: {},
301
+ blocks_layout: { items: [] },
302
+ });
303
+
304
+ const tab = onChangeBlock.mock.calls[0][1].data.blocks.tab1;
305
+ expect(tab.title).toBe('Tab 1');
306
+ expect(tab.blocks_layout.items).toEqual(['filled']);
307
+ });
239
308
  });
@@ -6,6 +6,7 @@ import cx from 'classnames';
6
6
  import { Menu, Tab, Input, Container } from 'semantic-ui-react';
7
7
  import BlocksForm from '@plone/volto/components/manage/Blocks/Block/BlocksForm';
8
8
  import { emptyBlocksForm } from '@plone/volto/helpers/Blocks/Blocks';
9
+ import { fillEmptyTab } from '@eeacms/volto-tabs-block/helpers';
9
10
  import { defaultSchemaEnhancer } from '@eeacms/volto-tabs-block/components/variations/default/schema';
10
11
  import { AssetTab } from '@eeacms/volto-tabs-block/components';
11
12
  import {
@@ -180,7 +181,6 @@ export const MenuItem = (props) => {
180
181
  };
181
182
 
182
183
  const Edit = (props) => {
183
- const intl = useIntl();
184
184
  const {
185
185
  activeBlock = null,
186
186
  activeTab = null,
@@ -195,7 +195,6 @@ const Edit = (props) => {
195
195
  tabs = {},
196
196
  tabsData = {},
197
197
  tabsList = [],
198
- emptyTab = () => {},
199
198
  onChangeBlock = noop,
200
199
  onChangeTabData = noop,
201
200
  onSelectBlock = noop,
@@ -267,14 +266,7 @@ const Edit = (props) => {
267
266
  ...tabsData,
268
267
  blocks: {
269
268
  ...tabsData.blocks,
270
- [activeTab]: {
271
- ...(newFormData.blocks_layout?.items.length > 0
272
- ? newFormData
273
- : emptyTab({
274
- schema: schema?.properties?.data?.schema || {},
275
- intl,
276
- })),
277
- },
269
+ [activeTab]: fillEmptyTab(newFormData),
278
270
  },
279
271
  },
280
272
  });
@@ -8,6 +8,7 @@ import isEmpty from 'lodash/isEmpty';
8
8
  import cx from 'classnames';
9
9
  import { Menu, Tab, Container, Dropdown, Input } from 'semantic-ui-react';
10
10
  import { emptyBlocksForm } from '@plone/volto/helpers/Blocks/Blocks';
11
+ import { fillEmptyTab } from '@eeacms/volto-tabs-block/helpers';
11
12
  import BlocksForm from '@plone/volto/components/manage/Blocks/Block/BlocksForm';
12
13
  import { defaultSchemaEnhancer } from '@eeacms/volto-tabs-block/components/variations/default/schema';
13
14
  import {
@@ -282,7 +283,6 @@ const MenuWrapper = (props) => {
282
283
  };
283
284
 
284
285
  const Edit = (props) => {
285
- const intl = useIntl();
286
286
  const {
287
287
  metadata = {},
288
288
  data = {},
@@ -296,7 +296,6 @@ const Edit = (props) => {
296
296
  activeBlock = null,
297
297
  screen,
298
298
  tabsData = {},
299
- emptyTab = () => {},
300
299
  onChangeBlock = noop,
301
300
  onChangeTabData = noop,
302
301
  onSelectBlock = noop,
@@ -370,14 +369,7 @@ const Edit = (props) => {
370
369
  ...tabsData,
371
370
  blocks: {
372
371
  ...tabsData.blocks,
373
- [activeTab]: {
374
- ...(newFormData.blocks_layout.items.length > 0
375
- ? newFormData
376
- : emptyTab({
377
- schema: schema.properties.data.schema,
378
- intl,
379
- })),
380
- },
372
+ [activeTab]: fillEmptyTab(newFormData),
381
373
  },
382
374
  },
383
375
  });
package/src/helpers.js CHANGED
@@ -40,6 +40,14 @@ export const empty = ({ schema, intl }) => {
40
40
  };
41
41
  };
42
42
 
43
+ // Fill an emptied tab right away, keeping its own fields (title, settings).
44
+ // Otherwise the tab is left with no block to type in, and filling it later
45
+ // would add an undo history entry that every undo lands on and refills.
46
+ export const fillEmptyTab = (tab) =>
47
+ tab?.blocks_layout?.items?.length > 0
48
+ ? tab
49
+ : { ...tab, ...emptyBlocksForm() };
50
+
43
51
  export const emptyTab = ({ schema, intl }) => {
44
52
  const data = {
45
53
  '@type': 'tab',
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  empty,
3
3
  emptyTab,
4
+ fillEmptyTab,
4
5
  scrollToTarget,
5
6
  getParentTabFromHash,
6
7
  isTabEmpty,
@@ -136,3 +137,23 @@ describe('getParentTabFromHash function', () => {
136
137
  expect(result).toEqual(null);
137
138
  });
138
139
  });
140
+
141
+ describe('fillEmptyTab function', () => {
142
+ it('fills an emptied tab and keeps its title', () => {
143
+ const result = fillEmptyTab({
144
+ '@type': 'tab',
145
+ title: 'Tab 1',
146
+ blocks: {},
147
+ blocks_layout: { items: [] },
148
+ });
149
+ expect(result.title).toBe('Tab 1');
150
+ expect(result['@type']).toBe('tab');
151
+ expect(result.blocks_layout.items).toHaveLength(1);
152
+ expect(Object.keys(result.blocks)).toEqual(result.blocks_layout.items);
153
+ });
154
+
155
+ it('returns a tab with blocks unchanged', () => {
156
+ const tab = { blocks: { a: {} }, blocks_layout: { items: ['a'] } };
157
+ expect(fillEmptyTab(tab)).toBe(tab);
158
+ });
159
+ });