diff --git a/Build/Sources/TypeScript/beuser/Resources/Public/TypeScript/Permissions.ts b/Build/Sources/TypeScript/beuser/Resources/Public/TypeScript/Permissions.ts index 7e1645957dc5a20ee2927345051d03375f07c8c3..05a22c1451f65d439932ccbec47b4434a784b1cc 100644 --- a/Build/Sources/TypeScript/beuser/Resources/Public/TypeScript/Permissions.ts +++ b/Build/Sources/TypeScript/beuser/Resources/Public/TypeScript/Permissions.ts @@ -43,13 +43,14 @@ class Permissions { let span = document.createElement('span'); span.id = `o_${page}`; - let aSelector = document.createElement('a'); - aSelector.classList.add('ug_selector', 'changeowner'); - aSelector.setAttribute('data-page', page); - aSelector.setAttribute('data-owner', element.dataset.owner); - aSelector.setAttribute('data-username', username); - aSelector.innerHTML = usernameHtml; - span.appendChild(aSelector); + let buttonSelector = document.createElement('button'); + buttonSelector.classList.add('ug_selector', 'changeowner', 'btn', 'btn-link'); + buttonSelector.setAttribute('type', 'button'); + buttonSelector.setAttribute('data-page', page); + buttonSelector.setAttribute('data-owner', element.dataset.owner); + buttonSelector.setAttribute('data-username', username); + buttonSelector.innerHTML = usernameHtml; + span.appendChild(buttonSelector); // Replace content const container = document.getElementById('o_' + page); @@ -74,13 +75,14 @@ class Permissions { let span = document.createElement('span'); span.id = `g_${page}`; - let aSelector = document.createElement('a'); - aSelector.classList.add('ug_selector', 'changegroup'); - aSelector.setAttribute('data-page', page); - aSelector.setAttribute('data-group-id', element.dataset.groupId); - aSelector.setAttribute('data-groupname', groupname); - aSelector.innerHTML = groupnameHtml; - span.appendChild(aSelector); + let buttonSelector = document.createElement('button'); + buttonSelector.classList.add('ug_selector', 'changegroup', 'btn', 'btn-link'); + buttonSelector.setAttribute('type', 'button'); + buttonSelector.setAttribute('data-page', page); + buttonSelector.setAttribute('data-group-id', element.dataset.groupId); + buttonSelector.setAttribute('data-groupname', groupname); + buttonSelector.innerHTML = groupnameHtml; + span.appendChild(buttonSelector); // Replace content const container = document.getElementById('g_' + page); diff --git a/typo3/sysext/beuser/Classes/Controller/PermissionAjaxController.php b/typo3/sysext/beuser/Classes/Controller/PermissionAjaxController.php index f8eace3fa86bcb51d031359f844b1f5246dae003..6d803a80db8256322c052da74eecda0d5aa6131c 100644 --- a/typo3/sysext/beuser/Classes/Controller/PermissionAjaxController.php +++ b/typo3/sysext/beuser/Classes/Controller/PermissionAjaxController.php @@ -201,16 +201,16 @@ class PermissionAjaxController $elementId = 'o_' . $page; $options = '<option value="0"></option>' . $options; $selector = '<select name="new_page_owner" id="new_page_owner">' . $options . '</select>'; - $saveButton = '<a class="saveowner btn btn-default" data-page="' . $page . '" data-owner="' . $ownerUid - . '" data-element-id="' . $elementId . '" title="Change owner">' + $saveButton = '<button class="saveowner btn btn-default" data-page="' . $page . '" data-owner="' . $ownerUid + . '" data-element-id="' . $elementId . '" title="Change owner" type="button">' . $this->iconFactory->getIcon('actions-document-save', Icon::SIZE_SMALL)->render() - . '</a>'; - $cancelButton = '<a class="restoreowner btn btn-default" data-page="' . $page . '" data-owner="' . $ownerUid + . '</button>'; + $cancelButton = '<button class="restoreowner btn btn-default" data-page="' . $page . '" data-owner="' . $ownerUid . '" data-element-id="' . $elementId . '"' . (!empty($username) ? ' data-username="' . htmlspecialchars($username) . '"' : '') - . ' title="Cancel">' + . ' title="Cancel" type="button">' . $this->iconFactory->getIcon('actions-close', Icon::SIZE_SMALL)->render() - . '</a>'; + . '</button>'; return '<span id="' . $elementId . '">' . $selector . '<span class="btn-group">' @@ -258,16 +258,16 @@ class PermissionAjaxController $elementId = 'g_' . $page; $options = '<option value="0"></option>' . $options; $selector = '<select name="new_page_group" id="new_page_group">' . $options . '</select>'; - $saveButton = '<a class="savegroup btn btn-default" data-page="' . $page . '" data-group-id="' . $groupUid - . '" data-element-id="' . $elementId . '" title="Change group">' + $saveButton = '<button class="savegroup btn btn-default" data-page="' . $page . '" data-group-id="' . $groupUid + . '" data-element-id="' . $elementId . '" title="Change group" type="button">' . $this->iconFactory->getIcon('actions-document-save', Icon::SIZE_SMALL)->render() - . '</a>'; - $cancelButton = '<a class="restoregroup btn btn-default" data-page="' . $page . '" data-group-id="' . $groupUid + . '</button>'; + $cancelButton = '<button class="restoregroup btn btn-default" data-page="' . $page . '" data-group-id="' . $groupUid . '" data-element-id="' . $elementId . '"' . (!empty($groupname) ? ' data-groupname="' . htmlspecialchars($groupname) . '"' : '') - . ' title="Cancel">' + . ' title="Cancel" type="button">' . $this->iconFactory->getIcon('actions-close', Icon::SIZE_SMALL)->render() - . '</a>'; + . '</button>'; return '<span id="' . $elementId . '">' . $selector . '<span class="btn-group">' @@ -288,13 +288,13 @@ class PermissionAjaxController { $page = (int)$page; if ($editLockState === 1) { - $ret = '<span id="el_' . $page . '"><a class="editlock btn btn-default" data-page="' . $page + $ret = '<span id="el_' . $page . '"><button type="button" class="editlock btn btn-default" data-page="' . $page . '" data-lockstate="1" title="The page and all content is locked for editing by all non-Admin users.">' - . $this->iconFactory->getIcon('actions-lock', Icon::SIZE_SMALL)->render() . '</a></span>'; + . $this->iconFactory->getIcon('actions-lock', Icon::SIZE_SMALL)->render() . '</button></span>'; } else { - $ret = '<span id="el_' . $page . '"><a class="editlock btn btn-default" data-page="' . $page . + $ret = '<span id="el_' . $page . '"><button type="button" class="editlock btn btn-default" data-page="' . $page . '" data-lockstate="0" title="Enable the »Admin-only« edit lock for this page">' - . $this->iconFactory->getIcon('actions-unlock', Icon::SIZE_SMALL)->render() . '</a></span>'; + . $this->iconFactory->getIcon('actions-unlock', Icon::SIZE_SMALL)->render() . '</button></span>'; } return $ret; } diff --git a/typo3/sysext/beuser/Resources/Private/Partials/Permission/Groupname.html b/typo3/sysext/beuser/Resources/Private/Partials/Permission/Groupname.html index a85c84bbbaa1ecfd2e31b2464a77ac26bb7e6f08..0a444c6cad311e802de7587cf00c90c4dcf451b5 100644 --- a/typo3/sysext/beuser/Resources/Private/Partials/Permission/Groupname.html +++ b/typo3/sysext/beuser/Resources/Private/Partials/Permission/Groupname.html @@ -1,6 +1,7 @@ <span id="g_{pageId}"> - <a - class="ug_selector changegroup" + <button + type="button" + class="ug_selector changegroup btn btn-link" data-page="{pageId}" data-group-id="{groupId}" data-groupname="{groupname}" @@ -34,5 +35,5 @@ </f:if> </f:else> </f:if> - </a> + </button> </span> diff --git a/typo3/sysext/beuser/Resources/Private/Partials/Permission/Ownername.html b/typo3/sysext/beuser/Resources/Private/Partials/Permission/Ownername.html index 5e1c044aa0dc0b856ab3c33072f2c4c4125fbbf6..687e343c33a97441e1496250776e8bd93df9dc77 100644 --- a/typo3/sysext/beuser/Resources/Private/Partials/Permission/Ownername.html +++ b/typo3/sysext/beuser/Resources/Private/Partials/Permission/Ownername.html @@ -1,7 +1,8 @@ {namespace be=TYPO3\CMS\Backend\ViewHelpers} <span id="o_{pageId}"> - <a - class="ug_selector changeowner" + <button + type="button" + class="ug_selector changeowner btn btn-link" data-page="{pageId}" data-owner="{userId}" data-username="{username}" @@ -35,5 +36,5 @@ </f:if> </f:else> </f:if> - </a> + </button> </span> diff --git a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html index 0704877c2fad2d102a3dbd3cfb606633e966f014..1778d773bc0bbe57992320d5b686d8d5ccb962ec 100644 --- a/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html +++ b/typo3/sysext/beuser/Resources/Private/Templates/Permission/Index.html @@ -91,24 +91,26 @@ <span id="el_{data.row.uid}"> <f:if condition="{data.row.editlock}"> <f:then> - <a + <button + type="button" class="editlock btn btn-default" data-page="{data.row.uid}" data-lockstate="1" title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr')}" > <core:icon identifier="actions-lock" /> - </a> + </button> </f:then> <f:else> - <a + <button + type="button" class="editlock btn btn-default" data-page="{data.row.uid}" data-lockstate="0" title="{f:translate(key: 'LLL:EXT:beuser/Resources/Private/Language/locallang_mod_permission.xlf:EditLock_descr2')}" > <core:icon identifier="actions-unlock" /> - </a> + </button> </f:else> </f:if> </span> diff --git a/typo3/sysext/beuser/Resources/Public/JavaScript/Permissions.js b/typo3/sysext/beuser/Resources/Public/JavaScript/Permissions.js index 5b9a1fc35569f16242cff5cfb0166f21df995491..7d52476e9623a11485cf8d65cb7a4aca8389e015 100644 --- a/typo3/sysext/beuser/Resources/Public/JavaScript/Permissions.js +++ b/typo3/sysext/beuser/Resources/Public/JavaScript/Permissions.js @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Backend/Tooltip"],(function(e,t,a,o,s){"use strict";a=__importDefault(a);class n{constructor(){this.options={containerSelector:"#typo3-permissionList",editControllerSelector:"#PermissionControllerEdit"},this.ajaxUrl=TYPO3.settings.ajaxUrls.user_access_permissions,this.initializeCheckboxGroups(),this.initializeEvents()}static restoreOwner(e){let t=e.dataset.page,a=e.dataset.username,o=a;void 0===a&&(a="[not set]",o=`<span class="not_set">${a}</span>`);let s=document.createElement("span");s.id="o_"+t;let n=document.createElement("a");n.classList.add("ug_selector","changeowner"),n.setAttribute("data-page",t),n.setAttribute("data-owner",e.dataset.owner),n.setAttribute("data-username",a),n.innerHTML=o,s.appendChild(n);const r=document.getElementById("o_"+t);for(;r.firstChild;)r.firstChild.remove();r.appendChild(s)}static restoreGroup(e){let t=e.dataset.page,a=e.dataset.groupname,o=a;void 0===a&&(a="[not set]",o=`<span class="not_set">${a}</span>`);let s=document.createElement("span");s.id="g_"+t;let n=document.createElement("a");n.classList.add("ug_selector","changegroup"),n.setAttribute("data-page",t),n.setAttribute("data-group-id",e.dataset.groupId),n.setAttribute("data-groupname",a),n.innerHTML=o,s.appendChild(n);const r=document.getElementById("g_"+t);for(;r.firstChild;)r.firstChild.remove();r.appendChild(s)}static setPermissionCheckboxes(e,t){const a=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]`);for(let e of a){const a=parseInt(e.value,10);e.checked=(t&a)===a}}static updatePermissionValue(e,t){let a=0;const o=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]:checked`);for(let e of o)a|=parseInt(e.value,10);document.forms.namedItem("editform")[t].value=a|("tx_beuser_system_beusertxpermission[check][perms_user]"===e?1:0)}setPermissions(e){let t=e.dataset.page,a=e.dataset.who;new o(this.ajaxUrl).post({page:t,who:a,permissions:e.dataset.permissions,mode:e.dataset.mode,bits:e.dataset.bits}).then(async e=>{const o=await e.resolve();document.getElementById(t+"_"+a).outerHTML=o,s.initialize('[data-bs-toggle="tooltip"]')})}toggleEditLock(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"toggle_edit_lock",page:t,editLockState:e.dataset.lockstate}).then(async e=>{document.getElementById("el_"+t).outerHTML=await e.resolve()})}changeOwner(e){let t=e.dataset.page;const a=document.getElementById("o_"+t);new o(this.ajaxUrl).post({action:"change_owner",page:t,ownerUid:e.dataset.owner,newOwnerUid:a.getElementsByTagName("select")[0].value}).then(async e=>{a.outerHTML=await e.resolve()})}showChangeOwnerSelector(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"show_change_owner_selector",page:t,ownerUid:e.dataset.owner,username:e.dataset.username}).then(async e=>{document.getElementById("o_"+t).outerHTML=await e.resolve()})}changeGroup(e){let t=e.dataset.page;const a=document.getElementById("g_"+t);new o(this.ajaxUrl).post({action:"change_group",page:t,groupUid:e.dataset.groupId,newGroupUid:a.getElementsByTagName("select")[0].value}).then(async e=>{a.outerHTML=await e.resolve()})}showChangeGroupSelector(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"show_change_group_selector",page:t,groupUid:e.dataset.groupId,groupname:e.dataset.groupname}).then(async e=>{document.getElementById("g_"+t).outerHTML=await e.resolve()})}initializeCheckboxGroups(){document.querySelectorAll("[data-checkbox-group]").forEach(e=>{const t=e.dataset.checkboxGroup,a=parseInt(e.value,10);n.setPermissionCheckboxes(t,a)})}initializeEvents(){const e=document.querySelector(this.options.containerSelector),t=document.querySelector(this.options.editControllerSelector);null!==e&&(new a.default("click",(e,t)=>{e.preventDefault(),this.setPermissions(t)}).delegateTo(e,".change-permission"),new a.default("click",(e,t)=>{e.preventDefault(),this.toggleEditLock(t)}).delegateTo(e,".editlock"),new a.default("click",(e,t)=>{e.preventDefault(),this.showChangeOwnerSelector(t)}).delegateTo(e,".changeowner"),new a.default("click",(e,t)=>{e.preventDefault(),this.showChangeGroupSelector(t)}).delegateTo(e,".changegroup"),new a.default("click",(e,t)=>{e.preventDefault(),n.restoreOwner(t)}).delegateTo(e,".restoreowner"),new a.default("click",(e,t)=>{e.preventDefault(),this.changeOwner(t)}).delegateTo(e,".saveowner"),new a.default("click",(e,t)=>{e.preventDefault(),n.restoreGroup(t)}).delegateTo(e,".restoregroup"),new a.default("click",(e,t)=>{e.preventDefault(),this.changeGroup(t)}).delegateTo(e,".savegroup")),null!==t&&new a.default("click",(e,t)=>{const a=t.dataset.checkChangePermissions.split(",").map(e=>e.trim());n.updatePermissionValue.apply(this,a)}).delegateTo(t,"[data-check-change-permissions]")}}return new n})); \ No newline at end of file +var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};define(["require","exports","TYPO3/CMS/Core/Event/RegularEvent","TYPO3/CMS/Core/Ajax/AjaxRequest","TYPO3/CMS/Backend/Tooltip"],(function(e,t,a,o,s){"use strict";a=__importDefault(a);class n{constructor(){this.options={containerSelector:"#typo3-permissionList",editControllerSelector:"#PermissionControllerEdit"},this.ajaxUrl=TYPO3.settings.ajaxUrls.user_access_permissions,this.initializeCheckboxGroups(),this.initializeEvents()}static restoreOwner(e){let t=e.dataset.page,a=e.dataset.username,o=a;void 0===a&&(a="[not set]",o=`<span class="not_set">${a}</span>`);let s=document.createElement("span");s.id="o_"+t;let n=document.createElement("button");n.classList.add("ug_selector","changeowner","btn","btn-link"),n.setAttribute("type","button"),n.setAttribute("data-page",t),n.setAttribute("data-owner",e.dataset.owner),n.setAttribute("data-username",a),n.innerHTML=o,s.appendChild(n);const r=document.getElementById("o_"+t);for(;r.firstChild;)r.firstChild.remove();r.appendChild(s)}static restoreGroup(e){let t=e.dataset.page,a=e.dataset.groupname,o=a;void 0===a&&(a="[not set]",o=`<span class="not_set">${a}</span>`);let s=document.createElement("span");s.id="g_"+t;let n=document.createElement("button");n.classList.add("ug_selector","changegroup","btn","btn-link"),n.setAttribute("type","button"),n.setAttribute("data-page",t),n.setAttribute("data-group-id",e.dataset.groupId),n.setAttribute("data-groupname",a),n.innerHTML=o,s.appendChild(n);const r=document.getElementById("g_"+t);for(;r.firstChild;)r.firstChild.remove();r.appendChild(s)}static setPermissionCheckboxes(e,t){const a=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]`);for(let e of a){const a=parseInt(e.value,10);e.checked=(t&a)===a}}static updatePermissionValue(e,t){let a=0;const o=document.querySelectorAll(`input[type="checkbox"][name^="${e}"]:checked`);for(let e of o)a|=parseInt(e.value,10);document.forms.namedItem("editform")[t].value=a|("tx_beuser_system_beusertxpermission[check][perms_user]"===e?1:0)}setPermissions(e){let t=e.dataset.page,a=e.dataset.who;new o(this.ajaxUrl).post({page:t,who:a,permissions:e.dataset.permissions,mode:e.dataset.mode,bits:e.dataset.bits}).then(async e=>{const o=await e.resolve();document.getElementById(t+"_"+a).outerHTML=o,s.initialize('[data-bs-toggle="tooltip"]')})}toggleEditLock(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"toggle_edit_lock",page:t,editLockState:e.dataset.lockstate}).then(async e=>{document.getElementById("el_"+t).outerHTML=await e.resolve()})}changeOwner(e){let t=e.dataset.page;const a=document.getElementById("o_"+t);new o(this.ajaxUrl).post({action:"change_owner",page:t,ownerUid:e.dataset.owner,newOwnerUid:a.getElementsByTagName("select")[0].value}).then(async e=>{a.outerHTML=await e.resolve()})}showChangeOwnerSelector(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"show_change_owner_selector",page:t,ownerUid:e.dataset.owner,username:e.dataset.username}).then(async e=>{document.getElementById("o_"+t).outerHTML=await e.resolve()})}changeGroup(e){let t=e.dataset.page;const a=document.getElementById("g_"+t);new o(this.ajaxUrl).post({action:"change_group",page:t,groupUid:e.dataset.groupId,newGroupUid:a.getElementsByTagName("select")[0].value}).then(async e=>{a.outerHTML=await e.resolve()})}showChangeGroupSelector(e){let t=e.dataset.page;new o(this.ajaxUrl).post({action:"show_change_group_selector",page:t,groupUid:e.dataset.groupId,groupname:e.dataset.groupname}).then(async e=>{document.getElementById("g_"+t).outerHTML=await e.resolve()})}initializeCheckboxGroups(){document.querySelectorAll("[data-checkbox-group]").forEach(e=>{const t=e.dataset.checkboxGroup,a=parseInt(e.value,10);n.setPermissionCheckboxes(t,a)})}initializeEvents(){const e=document.querySelector(this.options.containerSelector),t=document.querySelector(this.options.editControllerSelector);null!==e&&(new a.default("click",(e,t)=>{e.preventDefault(),this.setPermissions(t)}).delegateTo(e,".change-permission"),new a.default("click",(e,t)=>{e.preventDefault(),this.toggleEditLock(t)}).delegateTo(e,".editlock"),new a.default("click",(e,t)=>{e.preventDefault(),this.showChangeOwnerSelector(t)}).delegateTo(e,".changeowner"),new a.default("click",(e,t)=>{e.preventDefault(),this.showChangeGroupSelector(t)}).delegateTo(e,".changegroup"),new a.default("click",(e,t)=>{e.preventDefault(),n.restoreOwner(t)}).delegateTo(e,".restoreowner"),new a.default("click",(e,t)=>{e.preventDefault(),this.changeOwner(t)}).delegateTo(e,".saveowner"),new a.default("click",(e,t)=>{e.preventDefault(),n.restoreGroup(t)}).delegateTo(e,".restoregroup"),new a.default("click",(e,t)=>{e.preventDefault(),this.changeGroup(t)}).delegateTo(e,".savegroup")),null!==t&&new a.default("click",(e,t)=>{const a=t.dataset.checkChangePermissions.split(",").map(e=>e.trim());n.updatePermissionValue.apply(this,a)}).delegateTo(t,"[data-check-change-permissions]")}}return new n})); \ No newline at end of file