typo3-typescript-sources 13.4.26 → 14.0.0

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 (199) hide show
  1. package/.github/workflows/sync-and-publish.yml +114 -66
  2. package/.last-synced-tag +1 -1
  3. package/README-TYPO3.md +1 -1
  4. package/README.md +8 -1
  5. package/backend/action-button/deferred-action.ts +2 -0
  6. package/backend/action-button/immediate-action.ts +2 -0
  7. package/backend/ajax-data-handler.ts +1 -116
  8. package/backend/clipboard-panel.ts +5 -5
  9. package/backend/code-editor/element/code-mirror-element.ts +1 -1
  10. package/backend/code-editor/stream-parser/typoscript.ts +1 -1
  11. package/backend/color-picker.ts +5 -4
  12. package/backend/color-scheme-switch.ts +1 -1
  13. package/backend/column-selector-button.ts +1 -1
  14. package/backend/context-menu-actions.ts +1 -0
  15. package/backend/context-menu.ts +3 -3
  16. package/backend/copy-to-clipboard.ts +1 -1
  17. package/backend/date-time-picker.ts +10 -16
  18. package/backend/drag-tooltip.ts +1 -1
  19. package/backend/drag-uploader.ts +34 -36
  20. package/backend/element/alert-element.ts +2 -2
  21. package/backend/element/breadcrumb.ts +306 -0
  22. package/backend/element/combobox-element.ts +712 -0
  23. package/backend/element/dispatch-modal-button.ts +1 -1
  24. package/backend/element/draggable-resizable-element.ts +1 -1
  25. package/backend/element/editable-page-title.ts +6 -5
  26. package/backend/element/icon-element.ts +2 -2
  27. package/backend/element/pagination.ts +4 -4
  28. package/backend/element/progress-bar-element.ts +2 -2
  29. package/backend/element/progress-tracker-element.ts +2 -2
  30. package/backend/element/pseudo-button.ts +1 -1
  31. package/backend/element/qrcode-element.ts +129 -0
  32. package/backend/element/spinner-element.ts +1 -1
  33. package/backend/element/thumbnail-element.ts +3 -0
  34. package/backend/form-engine/container/files-control-container.ts +4 -4
  35. package/backend/form-engine/container/flex-form-section-container.ts +0 -1
  36. package/backend/form-engine/container/inline-control-container.ts +4 -4
  37. package/backend/form-engine/container/site-language-container.ts +2 -2
  38. package/backend/form-engine/element/abstract-sortable-select-items.ts +2 -2
  39. package/backend/form-engine/element/color-element.ts +2 -1
  40. package/backend/form-engine/element/datetime-element.ts +2 -1
  41. package/backend/form-engine/element/extra/char-counter.ts +1 -1
  42. package/backend/form-engine/element/online-media-form-element.ts +1 -1
  43. package/backend/form-engine/element/select-country-element.ts +82 -0
  44. package/backend/form-engine/element/select-tree-toolbar.ts +20 -18
  45. package/backend/form-engine/element/select-tree.ts +6 -1
  46. package/backend/form-engine/element/suggest/result-container.ts +1 -1
  47. package/backend/form-engine/element/suggest/result-item.ts +1 -1
  48. package/backend/form-engine/element/table-wizard-element.ts +1 -1
  49. package/backend/form-engine/field-control/password-generator.ts +2 -1
  50. package/backend/form-engine/field-wizard/value-picker.ts +7 -34
  51. package/backend/form-engine/inline-relation/inline-response-interface.ts +0 -1
  52. package/backend/form-engine-link-browser-adapter.ts +1 -5
  53. package/backend/form-engine-review.ts +2 -2
  54. package/backend/form-engine-suggest.ts +1 -1
  55. package/backend/form-engine-validation.ts +19 -80
  56. package/backend/form-engine.ts +40 -42
  57. package/backend/grid-editor.ts +4 -4
  58. package/backend/hotkeys/hotkey-storage.ts +18 -3
  59. package/backend/hotkeys.ts +46 -27
  60. package/backend/image-manipulation.ts +4 -4
  61. package/backend/layout-module/drag-drop.ts +1 -1
  62. package/backend/link-browser.ts +1 -11
  63. package/backend/live-search/element/backend-search.ts +1 -1
  64. package/backend/live-search/element/hint.ts +1 -1
  65. package/backend/live-search/element/provider/default-result-item.ts +1 -1
  66. package/backend/live-search/element/provider/page-provider-result-item.ts +1 -1
  67. package/backend/live-search/element/result/item/action/action-container.ts +1 -1
  68. package/backend/live-search/element/result/item/action/action.ts +2 -2
  69. package/backend/live-search/element/result/item/item-container.ts +2 -2
  70. package/backend/live-search/element/result/item/item.ts +1 -1
  71. package/backend/live-search/element/result/result-container.ts +1 -6
  72. package/backend/live-search/element/result/result-detail-container.ts +1 -1
  73. package/backend/live-search/element/result/result-pagination.ts +2 -3
  74. package/backend/live-search/element/search-option-item.ts +1 -1
  75. package/backend/live-search/live-search-shortcut.ts +14 -1
  76. package/backend/localization/finisher/noop-finisher.ts +48 -0
  77. package/backend/localization/finisher/redirect-finisher.ts +55 -0
  78. package/backend/localization/finisher/reload-finisher.ts +45 -0
  79. package/backend/localization/localization-button.ts +52 -0
  80. package/backend/localization/localization-finisher.ts +50 -0
  81. package/backend/localization/localization-wizard.ts +451 -0
  82. package/backend/localization/steps/confirm-step.ts +61 -0
  83. package/backend/localization/steps/content-record-selection-step.ts +389 -0
  84. package/backend/localization/steps/finisher-step.ts +179 -0
  85. package/backend/localization/steps/handler-selection-step.ts +200 -0
  86. package/backend/localization/steps/mode-step.ts +199 -0
  87. package/backend/localization/steps/source-language-step.ts +187 -0
  88. package/backend/localization/steps/target-language-step.ts +195 -0
  89. package/backend/localization.ts +2 -377
  90. package/backend/login/pasted-password-checker.ts +22 -0
  91. package/backend/login-refresh.ts +1 -1
  92. package/backend/login.ts +32 -5
  93. package/backend/modal.ts +108 -81
  94. package/backend/module/iframe.ts +1 -1
  95. package/backend/module/router.ts +12 -18
  96. package/backend/module-menu.ts +7 -2
  97. package/backend/multi-record-selection-edit-action.ts +1 -0
  98. package/backend/multi-step-wizard.ts +50 -50
  99. package/backend/new-content-element-wizard-button.ts +1 -1
  100. package/backend/new-record-wizard.ts +102 -9
  101. package/backend/notification.ts +3 -3
  102. package/backend/pagetsconfig/pagetsconfig-includes.ts +1 -1
  103. package/backend/record-download-button.ts +2 -3
  104. package/backend/record-usage/record-usage-store.ts +65 -0
  105. package/backend/recordlist.ts +70 -0
  106. package/backend/resource/resource.ts +4 -0
  107. package/backend/security/element/csp-reports.ts +7 -85
  108. package/backend/security/element/sudo-mode.ts +1 -1
  109. package/backend/settings/editor/editable-setting.ts +2 -1
  110. package/backend/settings/editor.ts +18 -6
  111. package/backend/settings/type/base.ts +1 -1
  112. package/backend/settings/type/bool.ts +1 -1
  113. package/backend/settings/type/color.ts +1 -1
  114. package/backend/settings/type/int.ts +2 -2
  115. package/backend/settings/type/number.ts +2 -2
  116. package/backend/settings/type/page.ts +1 -1
  117. package/backend/settings/type/string.ts +2 -2
  118. package/backend/settings/type/stringlist.ts +1 -1
  119. package/backend/settings/type/url.ts +43 -0
  120. package/backend/storage/abstract-client-storage.ts +1 -1
  121. package/backend/storage/module-state-storage.ts +5 -0
  122. package/backend/switch-user.ts +1 -1
  123. package/backend/tests/form-engine-validation-test.ts +12 -12
  124. package/backend/tests/login/pasted-password-checker-test.ts +43 -0
  125. package/backend/toolbar/live-search.ts +2 -7
  126. package/backend/tree/file-storage-browser.ts +1 -1
  127. package/backend/tree/file-storage-tree-container.ts +9 -5
  128. package/backend/tree/file-storage-tree.ts +13 -1
  129. package/backend/tree/page-browser.ts +3 -3
  130. package/backend/tree/page-tree-element.ts +11 -8
  131. package/backend/tree/tree-module-state.ts +1 -1
  132. package/backend/tree/tree-node-toggle.ts +1 -1
  133. package/backend/tree/tree-toolbar.ts +4 -3
  134. package/backend/tree/tree.ts +5 -5
  135. package/backend/user-settings-manager.ts +25 -1
  136. package/backend/utility/dom-helper.ts +11 -1
  137. package/backend/utility/format-utility.ts +30 -0
  138. package/backend/utility.ts +0 -21
  139. package/backend/viewport/content-container.ts +4 -1
  140. package/backend/viewport/resizable-navigation.ts +3 -3
  141. package/backend/wizard/move-content-element.ts +2 -2
  142. package/core/ajax/ajax-request.ts +5 -2
  143. package/core/authentication/mfa-provider/totp.ts +1 -1
  144. package/core/directive/markdown.ts +2 -2
  145. package/core/event/throttle-event.ts +1 -1
  146. package/core/factory/url-factory.ts +73 -0
  147. package/core/lit-helper.ts +2 -2
  148. package/core/tests/factory/url-factory-test.ts +105 -0
  149. package/dashboard/dashboard.ts +100 -5
  150. package/extensionmanager/distribution-image.ts +1 -1
  151. package/filelist/context-menu-actions.ts +21 -16
  152. package/filelist/file-delete.ts +1 -1
  153. package/filelist/file-list-actions.ts +9 -1
  154. package/filelist/file-list-rename-handler.ts +7 -4
  155. package/filelist/file-list-replace-handler.ts +141 -0
  156. package/filelist/file-list.ts +1 -0
  157. package/filelist/{create-folder.ts → resource-creation.ts} +2 -2
  158. package/form/backend/form-editor/component/property-grid-editor.ts +4 -4
  159. package/form/backend/form-editor/core.ts +1 -2
  160. package/form/backend/form-manager/view-model.ts +28 -67
  161. package/install/installer.ts +4 -4
  162. package/install/module/maintenance/reference-index.ts +154 -0
  163. package/install/renderable/flash-message.ts +1 -1
  164. package/install/renderable/info-box.ts +1 -1
  165. package/install/renderable/language-packs.ts +3 -3
  166. package/install/renderable/offset-group.ts +1 -1
  167. package/install/renderable/wrap-group.ts +1 -1
  168. package/install/router.ts +2 -1
  169. package/package.json +2 -2
  170. package/rte-ckeditor/ckeditor5.ts +3 -3
  171. package/rte-ckeditor/plugin/typo3-link.ts +2 -33
  172. package/rte-ckeditor/rte-link-browser.ts +1 -0
  173. package/scheduler/form-engine/element/timing-options-element.ts +74 -0
  174. package/scheduler/new-scheduler-task-wizard-button.ts +51 -0
  175. package/scheduler/scheduler-add-group.ts +28 -0
  176. package/scheduler/scheduler.ts +3 -359
  177. package/scheduler/setup-check-button.ts +50 -0
  178. package/styleguide/element/theme-switcher-element.ts +2 -1
  179. package/sys-note/element/delete-button.ts +1 -1
  180. package/tstemplate/template-analyzer.ts +1 -1
  181. package/viewpage/main.ts +5 -3
  182. package/workspaces/backend.ts +34 -31
  183. package/workspaces/preview.ts +6 -8
  184. package/workspaces/renderable/comment-view.ts +3 -3
  185. package/workspaces/renderable/diff-view.ts +3 -3
  186. package/workspaces/renderable/history-view.ts +3 -3
  187. package/workspaces/renderable/record-information.ts +2 -2
  188. package/workspaces/renderable/record-table.ts +26 -6
  189. package/workspaces/renderable/send-to-stage-form.ts +1 -9
  190. package/workspaces/toolbar/workspaces-menu.ts +5 -3
  191. package/workspaces/workspaces.ts +1 -36
  192. package/backend/document-save-actions.ts +0 -159
  193. package/backend/hotkeys/events.ts +0 -47
  194. package/backend/hotkeys/hotkey-struct.ts +0 -58
  195. package/backend/hotkeys/negotiator.ts +0 -53
  196. package/backend/wizard.ts +0 -331
  197. package/filelist/file-replace.ts +0 -37
  198. package/lowlevel/reference-index.ts +0 -44
  199. package/scheduler/scheduler-editable-group-name.ts +0 -307
@@ -2,111 +2,142 @@ name: Sync TYPO3 TypeScript Sources and Publish
2
2
 
3
3
  on:
4
4
  schedule:
5
- # Prüfe täglich um 2 Uhr morgens auf neue Tags
5
+ # Check daily at 2 AM for new tags
6
6
  - cron: '0 2 * * *'
7
7
  workflow_dispatch:
8
8
  inputs:
9
9
  tag:
10
- description: 'Spezifischer TYPO3 Tag (z.B. v13.4.0)'
10
+ description: 'Specific TYPO3 tag (e.g. v14.0.0 or v13.4.0)'
11
11
  required: false
12
12
  type: string
13
13
 
14
+ permissions:
15
+ contents: read
16
+
14
17
  jobs:
15
- check-and-sync:
18
+ setup:
16
19
  runs-on: ubuntu-latest
17
20
  outputs:
18
- has_new_version: ${{ steps.check.outputs.has_new_version }}
19
- typo3_version: ${{ steps.check.outputs.typo3_version }}
21
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
22
+ steps:
23
+ - name: Build version matrix
24
+ id: set-matrix
25
+ run: |
26
+ if [[ "${{ github.event_name }}" == "schedule" ]]; then
27
+ # Schedule runs daily for both major versions
28
+ echo 'matrix={"include":[{"major_version":"14","target_branch":"main"},{"major_version":"13","target_branch":"v13.x"}]}' >> $GITHUB_OUTPUT
29
+ elif [[ "${{ github.ref_name }}" == "v13.x" ]]; then
30
+ echo 'matrix={"include":[{"major_version":"13","target_branch":"v13.x"}]}' >> $GITHUB_OUTPUT
31
+ else
32
+ echo 'matrix={"include":[{"major_version":"14","target_branch":"main"}]}' >> $GITHUB_OUTPUT
33
+ fi
34
+
35
+ check-and-sync:
36
+ needs: setup
37
+ runs-on: ubuntu-latest
38
+ strategy:
39
+ fail-fast: false
40
+ matrix: ${{ fromJson(needs.setup.outputs.matrix) }}
20
41
  steps:
21
42
  - name: Checkout split repository
22
43
  uses: actions/checkout@v4
23
44
  with:
45
+ ref: ${{ matrix.target_branch }}
24
46
  fetch-depth: 0
25
47
 
26
48
  - name: Check for new TYPO3 tags
27
49
  id: check
28
50
  run: |
29
- # Hole alle Tags vom TYPO3 Repository
51
+ MAJOR="${{ matrix.major_version }}"
52
+
53
+ # Fetch all tags from TYPO3 repository for the target major version
30
54
  git ls-remote --tags https://github.com/TYPO3/typo3.git | \
31
- grep -E 'refs/tags/v13\.[0-9]+\.[0-9]+$' | \
55
+ grep -E "refs/tags/v${MAJOR}\.[0-9]+\.[0-9]+$" | \
32
56
  sed 's/.*refs\/tags\///' | \
33
57
  sort -V > /tmp/typo3_tags.txt
34
-
35
- # Hole den letzten verarbeiteten Tag (falls vorhanden)
58
+
59
+ # Get last synced tag
36
60
  LAST_SYNCED=""
37
61
  if [ -f .last-synced-tag ]; then
38
62
  LAST_SYNCED=$(cat .last-synced-tag)
39
63
  fi
40
-
41
- # Manueller Tag-Input hat Priorität
64
+
65
+ # Manual tag input takes priority
42
66
  if [ -n "${{ github.event.inputs.tag }}" ]; then
43
67
  NEW_TAG="${{ github.event.inputs.tag }}"
44
- echo "Manuell angegebener Tag: $NEW_TAG"
68
+ # Validate that the manual tag matches the expected major version
69
+ if ! echo "$NEW_TAG" | grep -qE "^v${MAJOR}\."; then
70
+ echo "Error: Tag $NEW_TAG does not match expected major version v${MAJOR}.x for this branch"
71
+ echo "has_new_version=false" >> $GITHUB_OUTPUT
72
+ exit 0
73
+ fi
74
+ echo "Manually specified tag: $NEW_TAG"
45
75
  else
46
- # Finde neuesten Tag der noch nicht synced wurde
76
+ # Find newest tag that has not been synced yet
47
77
  NEW_TAG=$(tail -n1 /tmp/typo3_tags.txt)
48
78
  fi
49
-
79
+
50
80
  if [ -z "$NEW_TAG" ]; then
51
- echo "Kein TYPO3 13.x Tag gefunden"
81
+ echo "No TYPO3 v${MAJOR}.x tag found"
52
82
  echo "has_new_version=false" >> $GITHUB_OUTPUT
53
83
  exit 0
54
84
  fi
55
-
85
+
56
86
  if [ "$NEW_TAG" = "$LAST_SYNCED" ]; then
57
- echo "Keine neue Version verfügbar (aktuell: $LAST_SYNCED)"
87
+ echo "No new version available (current: $LAST_SYNCED)"
58
88
  echo "has_new_version=false" >> $GITHUB_OUTPUT
59
89
  else
60
- echo "Neue Version gefunden: $NEW_TAG (alt: $LAST_SYNCED)"
90
+ echo "New version found: $NEW_TAG (previous: $LAST_SYNCED)"
61
91
  echo "has_new_version=true" >> $GITHUB_OUTPUT
62
92
  echo "typo3_version=$NEW_TAG" >> $GITHUB_OUTPUT
63
93
  fi
64
94
 
65
- sync-and-publish:
66
- needs: check-and-sync
67
- if: needs.check-and-sync.outputs.has_new_version == 'true'
68
- runs-on: ubuntu-latest
69
- steps:
70
95
  - name: Setup Git
96
+ if: steps.check.outputs.has_new_version == 'true'
71
97
  run: |
72
98
  git config --global user.name "TYPO3 TypeScript Sync Bot"
73
99
  git config --global user.email "bot@maikschneider.de"
74
100
 
75
101
  - name: Clone TYPO3 repository at specific tag
102
+ if: steps.check.outputs.has_new_version == 'true'
76
103
  run: |
77
- TYPO3_TAG="${{ needs.check-and-sync.outputs.typo3_version }}"
78
- echo "Klone TYPO3 Repository bei Tag: $TYPO3_TAG"
79
-
104
+ TYPO3_TAG="${{ steps.check.outputs.typo3_version }}"
105
+ echo "Cloning TYPO3 repository at tag: $TYPO3_TAG"
106
+
80
107
  git clone --depth 1 --branch "$TYPO3_TAG" \
81
108
  https://github.com/TYPO3/typo3.git typo3-source
82
109
 
83
110
  - name: Extract TypeScript sources
111
+ if: steps.check.outputs.has_new_version == 'true'
84
112
  run: |
85
113
  mkdir -p typescript-split
86
-
87
- # Kopiere TypeScript Quellen
114
+
115
+ # Copy TypeScript sources
88
116
  if [ -d "typo3-source/Build/Sources/TypeScript" ]; then
89
117
  cp -r typo3-source/Build/Sources/TypeScript/* typescript-split/
90
- echo "✓ TypeScript Quellen extrahiert"
118
+ echo "✓ TypeScript sources extracted"
91
119
  else
92
- echo "✗ Fehler: Build/Sources/TypeScript nicht gefunden"
120
+ echo "✗ Error: Build/Sources/TypeScript not found"
93
121
  exit 1
94
122
  fi
95
-
96
- # Kopiere relevante Root-Dateien
123
+
124
+ # Copy relevant root files
97
125
  [ -f "typo3-source/LICENSE.txt" ] && cp typo3-source/LICENSE.txt typescript-split/
98
126
  [ -f "typo3-source/README.md" ] && cp typo3-source/README.md typescript-split/README-TYPO3.md
99
127
 
100
- - name: Checkout split repository
128
+ - name: Checkout split repository for sync
129
+ if: steps.check.outputs.has_new_version == 'true'
101
130
  uses: actions/checkout@v4
102
131
  with:
103
132
  path: split-repo
133
+ ref: ${{ matrix.target_branch }}
104
134
  token: ${{ secrets.PAT_TOKEN }}
105
135
  fetch-depth: 0
106
136
 
107
137
  - name: Sync content to split repository
138
+ if: steps.check.outputs.has_new_version == 'true'
108
139
  run: |
109
- # Lösche alte Inhalte (außer .git, .github, package.json)
140
+ # Delete old contents (except .git, .github, package.json)
110
141
  cd split-repo
111
142
  find . -mindepth 1 -maxdepth 1 \
112
143
  ! -name '.git' \
@@ -117,20 +148,21 @@ jobs:
117
148
  ! -name 'README.md' \
118
149
  ! -name 'node_modules' \
119
150
  -exec rm -rf {} +
120
-
121
- # Kopiere neue Inhalte
151
+
152
+ # Copy new contents
122
153
  cp -r ../typescript-split/* .
123
-
124
- # Speichere synced Tag
125
- echo "${{ needs.check-and-sync.outputs.typo3_version }}" > .last-synced-tag
154
+
155
+ # Save synced tag
156
+ echo "${{ steps.check.outputs.typo3_version }}" > .last-synced-tag
126
157
 
127
158
  - name: Create/Update package.json
159
+ if: steps.check.outputs.has_new_version == 'true'
128
160
  working-directory: split-repo
129
161
  run: |
130
- TYPO3_VERSION="${{ needs.check-and-sync.outputs.typo3_version }}"
131
- # Entferne 'v' Präfix für npm Version
162
+ TYPO3_VERSION="${{ steps.check.outputs.typo3_version }}"
163
+ # Remove 'v' prefix for npm version
132
164
  NPM_VERSION="${TYPO3_VERSION#v}"
133
-
165
+
134
166
  cat > package.json << EOF
135
167
  {
136
168
  "name": "typo3-typescript-sources",
@@ -167,14 +199,15 @@ jobs:
167
199
  }
168
200
  }
169
201
  EOF
170
-
171
- echo "✓ package.json erstellt mit Version $NPM_VERSION"
202
+
203
+ echo "✓ package.json created with version $NPM_VERSION"
172
204
 
173
205
  - name: Create README
206
+ if: steps.check.outputs.has_new_version == 'true'
174
207
  working-directory: split-repo
175
208
  run: |
176
- TYPO3_VERSION="${{ needs.check-and-sync.outputs.typo3_version }}"
177
-
209
+ TYPO3_VERSION="${{ steps.check.outputs.typo3_version }}"
210
+
178
211
  cat > README.md << 'EOF'
179
212
  # TYPO3 TypeScript Sources
180
213
 
@@ -196,6 +229,13 @@ jobs:
196
229
  - **Source Path:** `Build/Sources/TypeScript/`
197
230
  - **Current TYPO3 Version:** `TYPO3_VERSION_PLACEHOLDER`
198
231
 
232
+ ## 🌿 Branches
233
+
234
+ | Branch | TYPO3 Version | npm tag |
235
+ |----------|---------------|-----------|
236
+ | `main` | v14.x | `latest` |
237
+ | `v13.x` | v13.x | `v13` |
238
+
199
239
  ## 📝 License
200
240
 
201
241
  This package maintains the same license as TYPO3 Core: **GPL-2.0-or-later**
@@ -209,61 +249,69 @@ jobs:
209
249
  This is an unofficial split package maintained by [@maikschneider](https://github.com/maikschneider).
210
250
  For official TYPO3 packages, please refer to the [TYPO3 Core repository](https://github.com/TYPO3/typo3).
211
251
  EOF
212
-
213
- # Ersetze Platzhalter
252
+
253
+ # Replace placeholder
214
254
  sed -i "s/TYPO3_VERSION_PLACEHOLDER/${TYPO3_VERSION}/" README.md
215
255
 
216
256
  - name: Commit changes
257
+ if: steps.check.outputs.has_new_version == 'true'
217
258
  working-directory: split-repo
218
259
  run: |
260
+ TARGET_BRANCH="${{ matrix.target_branch }}"
219
261
  git add .
220
-
262
+
221
263
  if git diff --staged --quiet; then
222
- echo "Keine Änderungen zu committen"
264
+ echo "No changes to commit"
223
265
  exit 0
224
266
  fi
225
-
226
- TYPO3_VERSION="${{ needs.check-and-sync.outputs.typo3_version }}"
267
+
268
+ TYPO3_VERSION="${{ steps.check.outputs.typo3_version }}"
227
269
  git commit -m "Sync with TYPO3 ${TYPO3_VERSION}
228
270
 
229
271
  Source: https://github.com/TYPO3/typo3/tree/${TYPO3_VERSION}
230
272
  Path: Build/Sources/TypeScript/"
231
-
232
- # Erstelle Tag (entferne v-Prefix falls vorhanden)
273
+
274
+ # Create tag (remove v-prefix)
233
275
  NPM_VERSION="${TYPO3_VERSION#v}"
234
276
  git tag -a "${NPM_VERSION}" -m "Release ${NPM_VERSION} from TYPO3 ${TYPO3_VERSION}"
235
-
236
- git push origin main
277
+
278
+ git push origin "${TARGET_BRANCH}"
237
279
  git push origin "${NPM_VERSION}"
238
280
 
239
281
  - name: Setup Node.js
282
+ if: steps.check.outputs.has_new_version == 'true'
240
283
  uses: actions/setup-node@v4
241
284
  with:
242
285
  node-version: '20'
243
286
  registry-url: 'https://registry.npmjs.org'
244
287
 
245
288
  - name: Publish to npm
289
+ if: steps.check.outputs.has_new_version == 'true'
246
290
  working-directory: split-repo
247
291
  run: |
248
- # Stelle sicher, dass .npmrc korrekt konfiguriert ist
249
292
  echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc
250
-
251
- # Publish ohne OTP (Automation Token)
252
- npm publish --access public
293
+
294
+ MAJOR="${{ matrix.major_version }}"
295
+ if [ "$MAJOR" = "13" ]; then
296
+ npm publish --access public --tag v13
297
+ else
298
+ npm publish --access public
299
+ fi
253
300
  env:
254
301
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
255
302
 
256
303
  - name: Create GitHub Release
304
+ if: steps.check.outputs.has_new_version == 'true'
257
305
  uses: actions/create-release@v1
258
306
  env:
259
307
  GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
260
308
  with:
261
- tag_name: ${{ needs.check-and-sync.outputs.typo3_version }}
262
- release_name: TYPO3 ${{ needs.check-and-sync.outputs.typo3_version }}
309
+ tag_name: ${{ steps.check.outputs.typo3_version }}
310
+ release_name: TYPO3 ${{ steps.check.outputs.typo3_version }}
263
311
  body: |
264
- Synchronized with TYPO3 Core ${{ needs.check-and-sync.outputs.typo3_version }}
265
-
266
- **Source:** https://github.com/TYPO3/typo3/tree/${{ needs.check-and-sync.outputs.typo3_version }}
312
+ Synchronized with TYPO3 Core ${{ steps.check.outputs.typo3_version }}
313
+
314
+ **Source:** https://github.com/TYPO3/typo3/tree/${{ steps.check.outputs.typo3_version }}
267
315
  **Path:** `Build/Sources/TypeScript/`
268
316
  draft: false
269
- prerelease: false
317
+ prerelease: false
package/.last-synced-tag CHANGED
@@ -1 +1 @@
1
- v13.4.26
1
+ v14.0.0
package/README-TYPO3.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # TYPO3 CMS
2
2
 
3
3
  TYPO3 is an open source PHP based web content management system released
4
- under the GNU GPL. TYPO3 is copyright © 1999-2026 by Kasper Skårhøj.
4
+ under the GNU GPL. TYPO3 is copyright © 1999-2025 by Kasper Skårhøj.
5
5
 
6
6
  This document provides a basic introduction to TYPO3.
7
7
 
package/README.md CHANGED
@@ -16,7 +16,14 @@ npm install typo3-typescript-sources
16
16
 
17
17
  - **Original Repository:** [TYPO3/typo3](https://github.com/TYPO3/typo3)
18
18
  - **Source Path:** `Build/Sources/TypeScript/`
19
- - **Current TYPO3 Version:** `v13.4.26`
19
+ - **Current TYPO3 Version:** `v14.0.0`
20
+
21
+ ## 🌿 Branches
22
+
23
+ | Branch | TYPO3 Version | npm tag |
24
+ |----------|---------------|-----------|
25
+ | `main` | v14.x | `latest` |
26
+ | `v13.x` | v13.x | `v13` |
20
27
 
21
28
  ## 📝 License
22
29
 
@@ -18,6 +18,8 @@ import Icons from '../icons';
18
18
  * Action used when an operation execution time is unknown.
19
19
  */
20
20
  class DeferredAction extends AbstractAction {
21
+ protected override callback: () => Promise<void>;
22
+
21
23
  public async execute(el: HTMLAnchorElement|HTMLButtonElement): Promise<void> {
22
24
  el.dataset.actionLabel = el.innerText;
23
25
  el.classList.add('disabled');
@@ -17,6 +17,8 @@ import { AbstractAction } from './abstract-action';
17
17
  * Action used when an operation is executed immediately.
18
18
  */
19
19
  class ImmediateAction extends AbstractAction {
20
+ protected override callback: () => void;
21
+
20
22
  public execute(): Promise<void> {
21
23
  return this.executeCallback();
22
24
  }
@@ -13,20 +13,12 @@
13
13
 
14
14
  import { BroadcastMessage } from '@typo3/backend/broadcast-message';
15
15
  import AjaxRequest from '@typo3/core/ajax/ajax-request';
16
- import DocumentService from '@typo3/core/document-service';
17
16
  import BroadcastService from '@typo3/backend/broadcast-service';
18
- import Icons from './icons';
19
17
  import Notification from './notification';
20
- import RegularEvent from '@typo3/core/event/regular-event';
21
18
  import { sudoModeInterceptor } from '@typo3/backend/security/sudo-mode-interceptor';
22
19
  import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
23
20
  import type ResponseInterface from './ajax-data-handler/response-interface';
24
21
 
25
- enum Identifiers {
26
- hide = 'button[data-datahandler-action="visibility"]',
27
- icon = '.t3js-icon',
28
- }
29
-
30
22
  interface AfterProcessEventDict {
31
23
  component: string;
32
24
  action: string;
@@ -40,19 +32,6 @@ interface AfterProcessEventDict {
40
32
  * through \TYPO3\CMS\Backend\Controller\SimpleDataHandlerController->processAjaxRequest (record_process route)
41
33
  */
42
34
  class AjaxDataHandler {
43
- constructor() {
44
- DocumentService.ready().then((): void => {
45
- this.initialize();
46
- });
47
- }
48
-
49
- /**
50
- * Refresh the page tree
51
- */
52
- private static refreshPageTree(): void {
53
- top.document.dispatchEvent(new CustomEvent('typo3:pagetree:refresh'));
54
- }
55
-
56
35
  /**
57
36
  * AJAX call to record_process route (SimpleDataHandlerController->processAjaxRequest)
58
37
  * returns a jQuery Promise to work with
@@ -77,7 +56,7 @@ class AjaxDataHandler {
77
56
  * @param {AfterProcessEventDict} eventDict Dictionary used as event detail. This is private API yet.
78
57
  * @returns {Promise<ResponseInterface>}
79
58
  */
80
- public process(parameters: string | object, eventDict?: AfterProcessEventDict): Promise<ResponseInterface> {
59
+ public async process(parameters: string | object, eventDict?: AfterProcessEventDict): Promise<ResponseInterface> {
81
60
  const promise = AjaxDataHandler.call(parameters);
82
61
  return promise.then((result: ResponseInterface): ResponseInterface => {
83
62
  if (result.hasErrors) {
@@ -105,91 +84,6 @@ class AjaxDataHandler {
105
84
  });
106
85
  }
107
86
 
108
- // @todo: Many extensions rely on this behavior but it's misplaced in AjaxDataHandler. Move into recordlist.ts and deprecate in v11.
109
- private initialize(): void {
110
- // HIDE/UNHIDE: click events for all action icons to hide/unhide
111
- new RegularEvent('click', (e: Event, element: HTMLButtonElement): void => {
112
- e.preventDefault();
113
- this.handleVisibilityToggle(element);
114
- }).delegateTo(document, Identifiers.hide);
115
- }
116
-
117
- private handleVisibilityToggle(element: HTMLButtonElement): void
118
- {
119
- const rowElement = element.closest('tr[data-uid]');
120
-
121
- // Show spinner
122
- const iconElement = element.querySelector(Identifiers.icon);
123
- this._showSpinnerIcon(iconElement);
124
-
125
- const isVisible = element.dataset.datahandlerStatus === 'visible';
126
- // Get Settings from element
127
- const settings = {
128
- table: element.dataset.datahandlerTable,
129
- uid: element.dataset.datahandlerUid,
130
- field: element.dataset.datahandlerField,
131
- visible: isVisible,
132
- overlayIcon: isVisible
133
- ? element.dataset.datahandlerRecordHiddenOverlayIcon ?? 'overlay-hidden'
134
- : element.dataset.datahandlerRecordVisibleOverlayIcon ?? null
135
- };
136
-
137
- const params = {
138
- data: {
139
- [settings.table]: {
140
- [settings.uid]: {
141
- [settings.field]: settings.visible
142
- ? element.dataset.datahandlerHiddenValue
143
- : element.dataset.datahandlerVisibleValue
144
- }
145
- }
146
- }
147
- };
148
-
149
- // Submit Data
150
- this.process(params).then((result: ResponseInterface): void => {
151
- if (!result.hasErrors) {
152
- // Inverse current state
153
- settings.visible = !(settings.visible);
154
- element.setAttribute('data-datahandler-status', settings.visible ? 'visible' : 'hidden');
155
-
156
- const elementLabel = settings.visible
157
- ? element.dataset.datahandlerVisibleLabel
158
- : element.dataset.datahandlerHiddenLabel;
159
- element.setAttribute('title', elementLabel);
160
-
161
- const elementIconIdentifier = settings.visible
162
- ? element.dataset.datahandlerVisibleIcon
163
- : element.dataset.datahandlerHiddenIcon;
164
- const iconElement = element.querySelector(Identifiers.icon);
165
- Icons.getIcon(elementIconIdentifier, Icons.sizes.small).then((icon: string): void => {
166
- iconElement.replaceWith(document.createRange().createContextualFragment(icon));
167
- });
168
-
169
- // Set overlay for the record icon
170
- const recordIcon = rowElement.querySelector('.col-icon ' + Identifiers.icon);
171
- recordIcon.querySelector('.icon-overlay')?.remove();
172
- Icons.getIcon('miscellaneous-placeholder', Icons.sizes.small, settings.overlayIcon).then((icon: string): void => {
173
- const iconFragment = document.createRange().createContextualFragment(icon);
174
- recordIcon.append(iconFragment.querySelector('.icon-overlay'));
175
- });
176
-
177
- // Animate row
178
- const animationEvent = new RegularEvent('animationend', (): void => {
179
- rowElement.classList.remove('record-pulse');
180
- animationEvent.release();
181
- });
182
- animationEvent.bindTo(rowElement);
183
- rowElement.classList.add('record-pulse');
184
-
185
- // Refresh Pagetree
186
- if (settings.table === 'pages') {
187
- AjaxDataHandler.refreshPageTree();
188
- }
189
- }
190
- });
191
- }
192
-
193
87
  /**
194
88
  * Handle the errors from result object
195
89
  *
@@ -200,15 +94,6 @@ class AjaxDataHandler {
200
94
  Notification.error(message.title, message.message);
201
95
  }
202
96
  }
203
-
204
- /**
205
- * Replace the given icon with a spinner icon
206
- */
207
- private _showSpinnerIcon(iconElement: Element): void {
208
- Icons.getIcon('spinner-circle', Icons.sizes.small).then((icon: string): void => {
209
- iconElement.replaceWith(document.createRange().createContextualFragment(icon));
210
- });
211
- }
212
97
  }
213
98
 
214
99
  export default new AjaxDataHandler();
@@ -12,10 +12,10 @@
12
12
  */
13
13
 
14
14
  import { html, LitElement, nothing, type TemplateResult } from 'lit';
15
- import { customElement, property } from 'lit/decorators.js';
16
- import { until } from 'lit/directives/until.js';
17
- import { unsafeHTML } from 'lit/directives/unsafe-html.js';
18
- import { classMap } from 'lit/directives/class-map.js';
15
+ import { customElement, property } from 'lit/decorators';
16
+ import { until } from 'lit/directives/until';
17
+ import { unsafeHTML } from 'lit/directives/unsafe-html';
18
+ import { classMap } from 'lit/directives/class-map';
19
19
  import AjaxRequest from '@typo3/core/ajax/ajax-request';
20
20
  import type { AjaxResponse } from '@typo3/core/ajax/ajax-response';
21
21
  import Notification from '@typo3/backend/notification';
@@ -134,7 +134,7 @@ export class ClipboardPanel extends LitElement {
134
134
  ${tab.title}
135
135
  ${tab.info}` : html`
136
136
  <typo3-backend-icon identifier="actions-circle" size="small"></typo3-backend-icon>
137
- <span class="text-body-secondary">
137
+ <span class="text-variant">
138
138
  ${tab.title}
139
139
  ${tab.info}
140
140
  </span>
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { LitElement, html, css, type TemplateResult } from 'lit';
15
- import { customElement, property, state } from 'lit/decorators.js';
15
+ import { customElement, property, state } from 'lit/decorators';
16
16
  import {
17
17
  EditorView,
18
18
  lineNumbers,
@@ -490,7 +490,6 @@ export class TypoScriptStreamParserFactory {
490
490
  'import': kw('import'),
491
491
  'inBranch': B,
492
492
  'inc': kw('inc'),
493
- 'INCLUDE_TYPOSCRIPT': kw('INCLUDE_TYPOSCRIPT'),
494
493
  'includeCSS': kw('includeCSS'),
495
494
  'includeLibrary': kw('includeLibrary'),
496
495
  'includeNotInMenu': kw('includeNotInMenu'),
@@ -523,6 +522,7 @@ export class TypoScriptStreamParserFactory {
523
522
  'itemH': kw('itemH'),
524
523
  'items': kw('items'),
525
524
  'itemsProcFunc': kw('itemsProcFunc'),
525
+ 'itemsProcessors': kw('itemsProcessors'),
526
526
  'iterations': kw('iterations'),
527
527
  'join': kw('join'),
528
528
  'JSwindow': A,
@@ -11,7 +11,7 @@
11
11
  * The TYPO3 project - inspiring people to share!
12
12
  */
13
13
 
14
- import { customElement, property, query } from 'lit/decorators.js';
14
+ import { customElement, property, query } from 'lit/decorators';
15
15
  import { css, html, LitElement, type TemplateResult } from 'lit';
16
16
  import Alwan from 'alwan';
17
17
  import RegularEvent from '@typo3/core/event/regular-event';
@@ -38,6 +38,7 @@ export class Typo3BackendColorPicker extends LitElement {
38
38
  height: var(--typo3-colorpicker-preview-height);
39
39
  top: 50%;
40
40
  inset-inline-start: var(--typo3-input-sm-padding-x);
41
+ z-index: 1;
41
42
  transform: translate(0, -50%);
42
43
  background: var(--typo3-bg-checkerboard-background-color);
43
44
  background-image: linear-gradient(45deg, var(--typo3-bg-checkerboard-background-image-color) 25%, transparent 25%), linear-gradient(135deg, var(--typo3-bg-checkerboard-background-image-color) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--typo3-bg-checkerboard-background-image-color) 75%), linear-gradient(135deg, transparent 75%, var(--typo3-bg-checkerboard-background-image-color) 75%);
@@ -58,7 +59,7 @@ export class Typo3BackendColorPicker extends LitElement {
58
59
 
59
60
  @property({ type: String }) color: string = '';
60
61
  @property({ type: Boolean }) opacity: boolean = false;
61
- @property({ type: Array }) swatches: {label: string, color: string}[] = [];
62
+ @property({ type: String }) swatches: string = '';
62
63
 
63
64
  // Use a reference to the input slot element
64
65
  @query('slot') slotEl!: HTMLSlotElement;
@@ -82,7 +83,7 @@ export class Typo3BackendColorPicker extends LitElement {
82
83
  position: 'bottom-start',
83
84
  format: 'hex',
84
85
  opacity: this.opacity,
85
- swatches: this.swatches,
86
+ swatches: this.swatches ? this.swatches.split(';') : [],
86
87
  preset: false,
87
88
  color: this.color,
88
89
  });
@@ -140,7 +141,7 @@ class LegacyColorPicker {
140
141
  }
141
142
 
142
143
  const colorPicker = document.createElement('typo3-backend-color-picker');
143
- colorPicker.swatches = options.swatches.map((swatch: string) => ({ color: swatch, label: swatch }));
144
+ colorPicker.swatches = options.swatches?.join(';') ?? '';
144
145
  colorPicker.opacity = options.opacity ?? false;
145
146
  element.parentNode.insertBefore(colorPicker, element);
146
147
  colorPicker.appendChild(element);
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { html, LitElement, nothing, type TemplateResult } from 'lit';
15
- import { customElement, property, state } from 'lit/decorators.js';
15
+ import { customElement, property, state } from 'lit/decorators';
16
16
  import AjaxRequest from '@typo3/core/ajax/ajax-request';
17
17
  import '@typo3/backend/element/icon-element';
18
18
  import type { ColorSchemeUpdateEventData, ColorScheme } from '@typo3/backend/user-settings-manager';
@@ -11,7 +11,7 @@
11
11
  * The TYPO3 project - inspiring people to share!
12
12
  */
13
13
 
14
- import { customElement, property } from 'lit/decorators.js';
14
+ import { customElement, property } from 'lit/decorators';
15
15
  import { PseudoButtonLitElement } from '@typo3/backend/element/pseudo-button';
16
16
  import { SeverityEnum } from '@typo3/backend/enum/severity';
17
17
  import { default as Modal, type ModalElement } from '@typo3/backend/modal';
@@ -47,6 +47,7 @@ class ContextMenuActions {
47
47
  top.TYPO3.settings.FormEngine.moduleUrl
48
48
  + '&edit[' + table + '][' + uid + ']=edit'
49
49
  + overrideVals
50
+ + '&module=' + encodeURIComponent(top.TYPO3.ModuleMenu.App.getCurrentModule())
50
51
  + '&returnUrl=' + ContextMenuActions.getReturnUrl(),
51
52
  );
52
53
  }