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.
- package/.github/workflows/sync-and-publish.yml +114 -66
- package/.last-synced-tag +1 -1
- package/README-TYPO3.md +1 -1
- package/README.md +8 -1
- package/backend/action-button/deferred-action.ts +2 -0
- package/backend/action-button/immediate-action.ts +2 -0
- package/backend/ajax-data-handler.ts +1 -116
- package/backend/clipboard-panel.ts +5 -5
- package/backend/code-editor/element/code-mirror-element.ts +1 -1
- package/backend/code-editor/stream-parser/typoscript.ts +1 -1
- package/backend/color-picker.ts +5 -4
- package/backend/color-scheme-switch.ts +1 -1
- package/backend/column-selector-button.ts +1 -1
- package/backend/context-menu-actions.ts +1 -0
- package/backend/context-menu.ts +3 -3
- package/backend/copy-to-clipboard.ts +1 -1
- package/backend/date-time-picker.ts +10 -16
- package/backend/drag-tooltip.ts +1 -1
- package/backend/drag-uploader.ts +34 -36
- package/backend/element/alert-element.ts +2 -2
- package/backend/element/breadcrumb.ts +306 -0
- package/backend/element/combobox-element.ts +712 -0
- package/backend/element/dispatch-modal-button.ts +1 -1
- package/backend/element/draggable-resizable-element.ts +1 -1
- package/backend/element/editable-page-title.ts +6 -5
- package/backend/element/icon-element.ts +2 -2
- package/backend/element/pagination.ts +4 -4
- package/backend/element/progress-bar-element.ts +2 -2
- package/backend/element/progress-tracker-element.ts +2 -2
- package/backend/element/pseudo-button.ts +1 -1
- package/backend/element/qrcode-element.ts +129 -0
- package/backend/element/spinner-element.ts +1 -1
- package/backend/element/thumbnail-element.ts +3 -0
- package/backend/form-engine/container/files-control-container.ts +4 -4
- package/backend/form-engine/container/flex-form-section-container.ts +0 -1
- package/backend/form-engine/container/inline-control-container.ts +4 -4
- package/backend/form-engine/container/site-language-container.ts +2 -2
- package/backend/form-engine/element/abstract-sortable-select-items.ts +2 -2
- package/backend/form-engine/element/color-element.ts +2 -1
- package/backend/form-engine/element/datetime-element.ts +2 -1
- package/backend/form-engine/element/extra/char-counter.ts +1 -1
- package/backend/form-engine/element/online-media-form-element.ts +1 -1
- package/backend/form-engine/element/select-country-element.ts +82 -0
- package/backend/form-engine/element/select-tree-toolbar.ts +20 -18
- package/backend/form-engine/element/select-tree.ts +6 -1
- package/backend/form-engine/element/suggest/result-container.ts +1 -1
- package/backend/form-engine/element/suggest/result-item.ts +1 -1
- package/backend/form-engine/element/table-wizard-element.ts +1 -1
- package/backend/form-engine/field-control/password-generator.ts +2 -1
- package/backend/form-engine/field-wizard/value-picker.ts +7 -34
- package/backend/form-engine/inline-relation/inline-response-interface.ts +0 -1
- package/backend/form-engine-link-browser-adapter.ts +1 -5
- package/backend/form-engine-review.ts +2 -2
- package/backend/form-engine-suggest.ts +1 -1
- package/backend/form-engine-validation.ts +19 -80
- package/backend/form-engine.ts +40 -42
- package/backend/grid-editor.ts +4 -4
- package/backend/hotkeys/hotkey-storage.ts +18 -3
- package/backend/hotkeys.ts +46 -27
- package/backend/image-manipulation.ts +4 -4
- package/backend/layout-module/drag-drop.ts +1 -1
- package/backend/link-browser.ts +1 -11
- package/backend/live-search/element/backend-search.ts +1 -1
- package/backend/live-search/element/hint.ts +1 -1
- package/backend/live-search/element/provider/default-result-item.ts +1 -1
- package/backend/live-search/element/provider/page-provider-result-item.ts +1 -1
- package/backend/live-search/element/result/item/action/action-container.ts +1 -1
- package/backend/live-search/element/result/item/action/action.ts +2 -2
- package/backend/live-search/element/result/item/item-container.ts +2 -2
- package/backend/live-search/element/result/item/item.ts +1 -1
- package/backend/live-search/element/result/result-container.ts +1 -6
- package/backend/live-search/element/result/result-detail-container.ts +1 -1
- package/backend/live-search/element/result/result-pagination.ts +2 -3
- package/backend/live-search/element/search-option-item.ts +1 -1
- package/backend/live-search/live-search-shortcut.ts +14 -1
- package/backend/localization/finisher/noop-finisher.ts +48 -0
- package/backend/localization/finisher/redirect-finisher.ts +55 -0
- package/backend/localization/finisher/reload-finisher.ts +45 -0
- package/backend/localization/localization-button.ts +52 -0
- package/backend/localization/localization-finisher.ts +50 -0
- package/backend/localization/localization-wizard.ts +451 -0
- package/backend/localization/steps/confirm-step.ts +61 -0
- package/backend/localization/steps/content-record-selection-step.ts +389 -0
- package/backend/localization/steps/finisher-step.ts +179 -0
- package/backend/localization/steps/handler-selection-step.ts +200 -0
- package/backend/localization/steps/mode-step.ts +199 -0
- package/backend/localization/steps/source-language-step.ts +187 -0
- package/backend/localization/steps/target-language-step.ts +195 -0
- package/backend/localization.ts +2 -377
- package/backend/login/pasted-password-checker.ts +22 -0
- package/backend/login-refresh.ts +1 -1
- package/backend/login.ts +32 -5
- package/backend/modal.ts +108 -81
- package/backend/module/iframe.ts +1 -1
- package/backend/module/router.ts +12 -18
- package/backend/module-menu.ts +7 -2
- package/backend/multi-record-selection-edit-action.ts +1 -0
- package/backend/multi-step-wizard.ts +50 -50
- package/backend/new-content-element-wizard-button.ts +1 -1
- package/backend/new-record-wizard.ts +102 -9
- package/backend/notification.ts +3 -3
- package/backend/pagetsconfig/pagetsconfig-includes.ts +1 -1
- package/backend/record-download-button.ts +2 -3
- package/backend/record-usage/record-usage-store.ts +65 -0
- package/backend/recordlist.ts +70 -0
- package/backend/resource/resource.ts +4 -0
- package/backend/security/element/csp-reports.ts +7 -85
- package/backend/security/element/sudo-mode.ts +1 -1
- package/backend/settings/editor/editable-setting.ts +2 -1
- package/backend/settings/editor.ts +18 -6
- package/backend/settings/type/base.ts +1 -1
- package/backend/settings/type/bool.ts +1 -1
- package/backend/settings/type/color.ts +1 -1
- package/backend/settings/type/int.ts +2 -2
- package/backend/settings/type/number.ts +2 -2
- package/backend/settings/type/page.ts +1 -1
- package/backend/settings/type/string.ts +2 -2
- package/backend/settings/type/stringlist.ts +1 -1
- package/backend/settings/type/url.ts +43 -0
- package/backend/storage/abstract-client-storage.ts +1 -1
- package/backend/storage/module-state-storage.ts +5 -0
- package/backend/switch-user.ts +1 -1
- package/backend/tests/form-engine-validation-test.ts +12 -12
- package/backend/tests/login/pasted-password-checker-test.ts +43 -0
- package/backend/toolbar/live-search.ts +2 -7
- package/backend/tree/file-storage-browser.ts +1 -1
- package/backend/tree/file-storage-tree-container.ts +9 -5
- package/backend/tree/file-storage-tree.ts +13 -1
- package/backend/tree/page-browser.ts +3 -3
- package/backend/tree/page-tree-element.ts +11 -8
- package/backend/tree/tree-module-state.ts +1 -1
- package/backend/tree/tree-node-toggle.ts +1 -1
- package/backend/tree/tree-toolbar.ts +4 -3
- package/backend/tree/tree.ts +5 -5
- package/backend/user-settings-manager.ts +25 -1
- package/backend/utility/dom-helper.ts +11 -1
- package/backend/utility/format-utility.ts +30 -0
- package/backend/utility.ts +0 -21
- package/backend/viewport/content-container.ts +4 -1
- package/backend/viewport/resizable-navigation.ts +3 -3
- package/backend/wizard/move-content-element.ts +2 -2
- package/core/ajax/ajax-request.ts +5 -2
- package/core/authentication/mfa-provider/totp.ts +1 -1
- package/core/directive/markdown.ts +2 -2
- package/core/event/throttle-event.ts +1 -1
- package/core/factory/url-factory.ts +73 -0
- package/core/lit-helper.ts +2 -2
- package/core/tests/factory/url-factory-test.ts +105 -0
- package/dashboard/dashboard.ts +100 -5
- package/extensionmanager/distribution-image.ts +1 -1
- package/filelist/context-menu-actions.ts +21 -16
- package/filelist/file-delete.ts +1 -1
- package/filelist/file-list-actions.ts +9 -1
- package/filelist/file-list-rename-handler.ts +7 -4
- package/filelist/file-list-replace-handler.ts +141 -0
- package/filelist/file-list.ts +1 -0
- package/filelist/{create-folder.ts → resource-creation.ts} +2 -2
- package/form/backend/form-editor/component/property-grid-editor.ts +4 -4
- package/form/backend/form-editor/core.ts +1 -2
- package/form/backend/form-manager/view-model.ts +28 -67
- package/install/installer.ts +4 -4
- package/install/module/maintenance/reference-index.ts +154 -0
- package/install/renderable/flash-message.ts +1 -1
- package/install/renderable/info-box.ts +1 -1
- package/install/renderable/language-packs.ts +3 -3
- package/install/renderable/offset-group.ts +1 -1
- package/install/renderable/wrap-group.ts +1 -1
- package/install/router.ts +2 -1
- package/package.json +2 -2
- package/rte-ckeditor/ckeditor5.ts +3 -3
- package/rte-ckeditor/plugin/typo3-link.ts +2 -33
- package/rte-ckeditor/rte-link-browser.ts +1 -0
- package/scheduler/form-engine/element/timing-options-element.ts +74 -0
- package/scheduler/new-scheduler-task-wizard-button.ts +51 -0
- package/scheduler/scheduler-add-group.ts +28 -0
- package/scheduler/scheduler.ts +3 -359
- package/scheduler/setup-check-button.ts +50 -0
- package/styleguide/element/theme-switcher-element.ts +2 -1
- package/sys-note/element/delete-button.ts +1 -1
- package/tstemplate/template-analyzer.ts +1 -1
- package/viewpage/main.ts +5 -3
- package/workspaces/backend.ts +34 -31
- package/workspaces/preview.ts +6 -8
- package/workspaces/renderable/comment-view.ts +3 -3
- package/workspaces/renderable/diff-view.ts +3 -3
- package/workspaces/renderable/history-view.ts +3 -3
- package/workspaces/renderable/record-information.ts +2 -2
- package/workspaces/renderable/record-table.ts +26 -6
- package/workspaces/renderable/send-to-stage-form.ts +1 -9
- package/workspaces/toolbar/workspaces-menu.ts +5 -3
- package/workspaces/workspaces.ts +1 -36
- package/backend/document-save-actions.ts +0 -159
- package/backend/hotkeys/events.ts +0 -47
- package/backend/hotkeys/hotkey-struct.ts +0 -58
- package/backend/hotkeys/negotiator.ts +0 -53
- package/backend/wizard.ts +0 -331
- package/filelist/file-replace.ts +0 -37
- package/lowlevel/reference-index.ts +0 -44
- 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
|
-
#
|
|
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: '
|
|
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
|
-
|
|
18
|
+
setup:
|
|
16
19
|
runs-on: ubuntu-latest
|
|
17
20
|
outputs:
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
#
|
|
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 "
|
|
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 "
|
|
87
|
+
echo "No new version available (current: $LAST_SYNCED)"
|
|
58
88
|
echo "has_new_version=false" >> $GITHUB_OUTPUT
|
|
59
89
|
else
|
|
60
|
-
echo "
|
|
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="${{
|
|
78
|
-
echo "
|
|
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
|
-
#
|
|
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
|
|
118
|
+
echo "✓ TypeScript sources extracted"
|
|
91
119
|
else
|
|
92
|
-
echo "✗
|
|
120
|
+
echo "✗ Error: Build/Sources/TypeScript not found"
|
|
93
121
|
exit 1
|
|
94
122
|
fi
|
|
95
|
-
|
|
96
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
151
|
+
|
|
152
|
+
# Copy new contents
|
|
122
153
|
cp -r ../typescript-split/* .
|
|
123
|
-
|
|
124
|
-
#
|
|
125
|
-
echo "${{
|
|
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="${{
|
|
131
|
-
#
|
|
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
|
|
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="${{
|
|
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
|
-
#
|
|
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 "
|
|
264
|
+
echo "No changes to commit"
|
|
223
265
|
exit 0
|
|
224
266
|
fi
|
|
225
|
-
|
|
226
|
-
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
|
-
#
|
|
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
|
|
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
|
-
|
|
252
|
-
|
|
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: ${{
|
|
262
|
-
release_name: TYPO3 ${{
|
|
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 ${{
|
|
265
|
-
|
|
266
|
-
**Source:** https://github.com/TYPO3/typo3/tree/${{
|
|
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
|
-
|
|
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-
|
|
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:** `
|
|
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
|
|
16
|
-
import { until } from 'lit/directives/until
|
|
17
|
-
import { unsafeHTML } from 'lit/directives/unsafe-html
|
|
18
|
-
import { classMap } from 'lit/directives/class-map
|
|
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-
|
|
137
|
+
<span class="text-variant">
|
|
138
138
|
${tab.title}
|
|
139
139
|
${tab.info}
|
|
140
140
|
</span>
|
|
@@ -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,
|
package/backend/color-picker.ts
CHANGED
|
@@ -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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|