TYPO3 v15 dev-main snapshot ()

This commit is contained in:
wappler committed 2026-08-10 22:31:00 +02:00
commit f9941541b7
1178 files changed
+135377

No files matched your search

@@ -0,0 +1,13 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
import{Collapse as d}from"bootstrap";import p from"@typo3/core/security-utility.js";import f from"@typo3/backend/modal.js";import s from"@typo3/core/event/regular-event.js";import u from"@typo3/backend/severity.js";import g from"@typo3/backend/storage/client.js";import m from"@typo3/backend/form-engine.js";import C from"~labels/core.core";import a from"~labels/backend.alt_doc";var n;(function(r){r.actionFieldSelector=".t3js-flex-control-action",r.sectionContentContainerSelector=".t3js-flex-section-content",r.sectionContainerLabelSelector=".t3js-formengine-label",r.deleteContainerButtonSelector=".t3js-delete",r.contentPreviewSelector=".content-preview"})(n||(n={}));class l{constructor(e,t){this.securityUtility=new p,this.parentContainer=e,this.container=t,this.containerContent=t.querySelector(n.sectionContentContainerSelector),this.containerId=t.dataset.flexformContainerId,this.toggleKeyInLocalStorage=`formengine-flex-${e.getSectionContainer().id}-${this.containerId}-collapse`,this.panelButton=t.querySelector(":scope > .panel-heading .panel-button"),this.panelHeading=this.panelButton.closest(".panel-heading"),this.registerEvents()}static getCollapseInstance(e,t){return d.getInstance(e)??new d(e,{toggle:t})}getCollapseContent(){return this.containerContent}getStatus(){return{id:this.containerId,collapsed:this.panelButton.getAttribute("aria-expanded")==="false"}}async registerEvents(){this.parentContainer.isRestructuringAllowed()&&this.registerDelete(),this.registerPanelToggle(),await this.registerToggle(),this.registerPreviewUpdate()}registerDelete(){new s("click",()=>{const e=a.get("flexform.section.delete.title"),t=a.get("flexform.section.delete.message"),i=f.confirm(e,t,u.warning,[{text:a.get("buttons.confirm.delete_record.no"),active:!0,btnClass:"btn-default",name:"no"},{text:a.get("buttons.confirm.delete_record.yes"),btnClass:"btn-warning",name:"yes"}]);i.addEventListener("button.clicked",o=>{if(o.target.name==="yes"){const c=this.container.querySelector(n.actionFieldSelector);c.value="DELETE",this.container.appendChild(c),this.container.classList.add("t3-flex-section--deleted"),this.container.closest(".t3-form-field-container.t3-form-flex")?.querySelector(n.sectionContainerLabelSelector)?.classList.add("has-change"),new s("transitionend",()=>{this.container.classList.add("hidden");const h=new CustomEvent("formengine:flexform:container-deleted",{detail:{containerId:this.containerId}});this.parentContainer.getContainer().dispatchEvent(h)}).bindTo(this.container)}i.hideModal()})}).bindTo(this.container.querySelector(n.deleteContainerButtonSelector))}async registerToggle(){const e=(g.get(this.toggleKeyInLocalStorage)??"1")==="1";l.getCollapseInstance(this.containerContent,!e),await m.ready(),this.generatePreview()}registerPanelToggle(){["hide.bs.collapse","show.bs.collapse"].forEach(e=>{new s(e,t=>{if(t.target!==this.containerContent)return;const i=t.type==="hide.bs.collapse";g.set(this.toggleKeyInLocalStorage,i?"1":"0")}).bindTo(this.containerContent)})}registerPreviewUpdate(){["input","change"].forEach(e=>{new s(e,()=>{this.generatePreview()}).delegateTo(this.containerContent,'input[type="text"], textarea')})}generatePreview(){let e="";const t=this.containerContent.querySelectorAll('input[type="text"], textarea');for(const i of t){let o=this.securityUtility.stripHtml(i.value);o.length>50&&(o=o.substring(0,50)+"..."),e+=(e?" / ":"")+o}e===""&&(e="["+C.get("labels.no_title")+"]"),this.panelHeading.querySelector(n.contentPreviewSelector).textContent=e}}export{l as default};
@@ -0,0 +1,13 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
import{Collapse as h}from"bootstrap";import C from"sortablejs";import g from"@typo3/core/ajax/ajax-request.js";import u from"@typo3/core/document-service.js";import m from"@typo3/backend/form-engine/container/flex-form-container-container.js";import l from"@typo3/backend/form-engine.js";import f from"@typo3/core/event/regular-event.js";import{JavaScriptItemProcessor as p}from"@typo3/core/java-script-item-processor.js";var o;(function(r){r.toggleAllSelector=".t3-form-flexsection-toggle",r.addContainerSelector=".t3js-flex-container-add",r.actionFieldSelector=".t3js-flex-control-action",r.sectionContainerSelector=".t3js-flex-section",r.sectionContentContainerSelector=".t3js-flex-section-content",r.sectionContainerLabelSelector=".t3js-formengine-label",r.sortContainerButtonSelector=".t3js-sortable-handle"})(o||(o={}));class c{constructor(e){this.allowRestructure=!1,this.flexformContainerContainers=[],this.updateSorting=t=>{this.container.querySelectorAll(o.actionFieldSelector).forEach((i,s)=>{i.value=s.toString()}),this.flexformContainerContainers.splice(t.newIndex,0,this.flexformContainerContainers.splice(t.oldIndex,1)[0])},u.ready().then(t=>{this.container=t.getElementById(e),this.sectionContainer=this.container.querySelector(this.container.dataset.section),this.allowRestructure=this.sectionContainer.dataset.t3FlexAllowRestructure==="1",this.registerEvents(),this.registerContainers()})}static getCollapseInstance(e){return h.getInstance(e)??new h(e,{toggle:!1})}getContainer(){return this.container}getSectionContainer(){return this.sectionContainer}isRestructuringAllowed(){return this.allowRestructure}registerEvents(){this.allowRestructure&&(this.registerSortable(),this.registerContainerDeleted()),this.registerToggleAll(),this.registerCreateNewContainer()}registerContainers(){const e=this.container.querySelectorAll(o.sectionContainerSelector);for(const t of e)this.flexformContainerContainers.push(new m(this,t))}getToggleAllButton(){return this.container.querySelector(o.toggleAllSelector)}registerSortable(){new C(this.sectionContainer,{group:this.sectionContainer.id,handle:o.sortContainerButtonSelector,onSort:this.updateSorting})}registerToggleAll(){new f("click",()=>{const e=this.flexformContainerContainers.some(t=>t.getStatus().collapsed);for(const t of this.flexformContainerContainers){const n=t.getCollapseContent();n!==null&&(e?c.getCollapseInstance(n).show():c.getCollapseInstance(n).hide())}}).bindTo(this.getToggleAllButton())}registerCreateNewContainer(){new f("click",(e,t)=>{e.preventDefault(),this.createNewContainer(t.dataset)}).delegateTo(this.container,o.addContainerSelector)}createNewContainer(e){new g(TYPO3.settings.ajaxUrls.record_flex_container_add).post({vanillaUid:e.vanillauid,databaseRowUid:e.databaserowuid,command:e.command,tableName:e.tablename,fieldName:e.fieldname,recordTypeValue:e.recordtypevalue,flexFormSheetName:e.flexformsheetname,flexFormFieldName:e.flexformfieldname,flexFormContainerName:e.flexformcontainername}).then(async t=>{const n=await t.resolve(),i=new DOMParser().parseFromString(n.html,"text/html").body.firstElementChild;this.flexformContainerContainers.push(new m(this,i));const s=document.querySelector(e.target);if(s.insertAdjacentElement("beforeend",i),n.scriptItems instanceof Array&&n.scriptItems.length>0&&new p().processItems(n.scriptItems),n.stylesheetFiles&&n.stylesheetFiles.length>0)for(const d of n.stylesheetFiles){const a=document.createElement("link");a.rel="stylesheet",a.type="text/css",a.href=d,document.head.appendChild(a)}l.reinitialize(),l.Validation.initializeInputFields(),l.Validation.validate(s),this.container.querySelector(o.sectionContainerLabelSelector)?.classList.add("has-change")})}registerContainerDeleted(){new f("formengine:flexform:container-deleted",e=>{const t=e.detail.containerId;this.flexformContainerContainers=this.flexformContainerContainers.filter(n=>n.getStatus().id!==t),l.Validation.validate(this.container)}).bindTo(this.container)}}export{c as default};
@@ -0,0 +1,13 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
import{MessageUtility as R}from"@typo3/backend/utility/message-utility.js";import{Collapse as x}from"bootstrap";import{AjaxDispatcher as w}from"@typo3/backend/form-engine/inline-relation/ajax-dispatcher.js";import F from"@typo3/core/document-service.js";import"@typo3/backend/element/progress-bar-element.js";import E from"sortablejs";import j from"@typo3/backend/form-engine.js";import v from"@typo3/backend/form-engine-validation.js";import S from"@typo3/backend/icons.js";import B from"@typo3/backend/info-window.js";import O from"@typo3/backend/modal.js";import D from"@typo3/backend/notification.js";import h from"@typo3/core/event/regular-event.js";import U from"@typo3/backend/severity.js";import g from"@typo3/backend/utility.js";import{selector as p}from"@typo3/core/literals.js";import C from"~labels/backend.alt_doc";import G from"~labels/core.core";var f;(function(c){c.controlSectionSelector=".t3js-formengine-irre-control",c.createNewRecordButtonSelector=".t3js-create-new-button",c.createNewRecordBySelectorSelector=".t3js-create-new-selector",c.createNewRecordByPresetSelector=".t3js-create-new-preset",c.deleteRecordButtonSelector=".t3js-editform-delete-inline-record",c.enableDisableRecordButtonSelector=".t3js-toggle-visibility-button",c.infoWindowButton='[data-action="infowindow"]',c.synchronizeLocalizeRecordButtonSelector=".t3js-synchronizelocalize-button",c.uniqueValueSelectors="select.t3js-inline-unique",c.revertUniqueness=".t3js-revert-unique",c.controlContainer=".t3js-inline-controls"})(f||(f={}));var q;(function(c){c.new="inlineIsNewRecord",c.notLoaded="t3js-not-loaded"})(q||(q={}));var m;(function(c){c.structureSeparator="-"})(m||(m={}));var b;(function(c){c.DOWN="down",c.UP="up"})(b||(b={}));class d extends HTMLElement{constructor(){super(...arguments),this.ajaxDispatcher=null,this.recordsContainer=null,this.requestQueue={},this.progressQueue={},this.noTitleString=G.get("labels.no_title"),this.handlePostMessage=e=>{if(!R.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if(e.data.actionName==="typo3:foreignRelation:insert"){if(typeof e.data.objectGroup>"u")throw"No object group defined for message";if(e.data.objectGroup!==this.objectGroup)return;if(this.isUniqueElementUsed(parseInt(e.data.uid,10),e.data.table)){D.error("There is already a relation to the selected element");return}this.importRecord([e.data.objectGroup,e.data.uid]).then(()=>{if(e.source){const t={actionName:"typo3:foreignRelation:inserted",objectGroup:e.data.objectId,table:e.data.table,uid:e.data.uid};R.send(t,e.source)}})}if(e.data.actionName==="typo3:foreignRelation:delete"){if(e.data.objectGroup!==this.objectGroup)return;const t=e.data.directRemoval||!1,o=[e.data.objectGroup,e.data.uid].join("-");this.deleteRecord(o,t)}}}get objectGroup(){return this.dataset.objectGroup}get formField(){return this.dataset.formField}get expandSingle(){return this.dataset.expandSingle==="true"}get sortable(){return this.dataset.sortable==="true"}get min(){return parseInt(this.dataset.min,10)||0}get max(){return parseInt(this.dataset.max,10)||0}get type(){const e=this.dataset.type;return e==="file"||e==="language"?e:"record"}get endpoints(){switch(this.type){case"file":return{create:"file_reference_create",details:"file_reference_details",synchronizelocalize:"file_reference_synchronizelocalize",expandcollapse:"file_reference_expandcollapse"};case"language":return{create:"site_configuration_inline_create",details:"site_configuration_inline_details",synchronizelocalize:null,expandcollapse:null};default:return{create:"record_inline_create",details:"record_inline_details",synchronizelocalize:"record_inline_synchronizelocalize",expandcollapse:"record_inline_expandcollapse"}}}static getValuesFromHashMap(e){return Object.keys(e).map(t=>e[t])}static selectOptionValueExists(e,t){return e.querySelector(p`option[value="${t}"]`)!==null}static removeSelectOptionByValue(e,t){const o=e.querySelector(p`option[value="${t}"]`);o!==null&&o.remove()}static reAddSelectOption(e,t,o){if(d.selectOptionValueExists(e,t))return;const i=e.querySelectorAll("option");let n=-1;for(const a of Object.keys(o.possible)){if(a===t)break;for(let s=0;s<i.length;++s)if(i[s].value===a){n=s;break}}n===-1?n=0:n<i.length&&n++;const r=document.createElement("option");r.text=o.possible[t],r.value=t,e.insertBefore(r,e.options[n])}connectedCallback(){this.ajaxDispatcher=new w(this.objectGroup),this.recordsContainer=this.querySelector(p`[id="${this.id}_records"]`),this.registerEvents()}getRecordContainer(e){return this.querySelector(p`[data-object-id="${e}"]`)}getCollapseContent(e){return this.querySelector(p`[id="${e}_fields"]`)}collapseElement(e){x.getOrCreateInstance(this.getCollapseContent(e)).hide()}isNewRecord(e){return this.getRecordContainer(e).classList.contains(q.new)}updateExpandedCollapsedStateLocally(e,t){const o=this.getRecordContainer(e),i=this.querySelectorAll('[name="uc[inlineView]['+o.dataset.topmostParentTable+"]["+o.dataset.topmostParentUid+"]"+o.dataset.fieldName+'Line truncated