Working permission row addition and removal
This commit is contained in:
parent
531247deb4
commit
a5e6c04cb0
5 changed files with 106 additions and 46 deletions
|
@ -528,8 +528,6 @@ $logs = $this->getParam('logs', null);
|
||||||
data-failure-param-alert-text="Failed to update collection"
|
data-failure-param-alert-text="Failed to update collection"
|
||||||
data-failure-param-alert-classname="error">
|
data-failure-param-alert-classname="error">
|
||||||
|
|
||||||
<label> </label>
|
|
||||||
|
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<label for="collection-name">Name</label>
|
<label for="collection-name">Name</label>
|
||||||
<input name="name" id="collection-name" type="text" autocomplete="off" data-ls-bind="{{project-collection.name}}" data-forms-text-direction required placeholder="Collection Name" maxlength="128" />
|
<input name="name" id="collection-name" type="text" autocomplete="off" data-ls-bind="{{project-collection.name}}" data-forms-text-direction required placeholder="Collection Name" maxlength="128" />
|
||||||
|
@ -544,11 +542,10 @@ $logs = $this->getParam('logs', null);
|
||||||
|
|
||||||
<hr class="margin-top-small" />
|
<hr class="margin-top-small" />
|
||||||
|
|
||||||
<div
|
<div class="permissions-matrix margin-bottom-large" x-data="permissionsMatrix">
|
||||||
class="permissions-matrix margin-bottom-large"
|
<input type="hidden" data-ls-bind="{{project-collection.$permissions}}" :value="rawPermissions"/>
|
||||||
data-ls-attrs="x-init=console.log({{project-collection}})"
|
|
||||||
x-data="{permissions: []}">
|
<table data-ls-attrs="x-init=load({{project-collection.$permissions}})">
|
||||||
<table>
|
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th style="width: 100px;">Role</th>
|
<th style="width: 100px;">Role</th>
|
||||||
|
@ -560,53 +557,51 @@ $logs = $this->getParam('logs', null);
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<template x-for="permission in permissions">
|
<template x-for="(permission, index) in permissions">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label></label>
|
<p x-text="permission.role"></p>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" name="read" id="read" value="1"/>
|
<input type="checkbox" name="read" x-model="permission.read"/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" name="create" id="create" value="1"/>
|
<input type="checkbox" name="create" x-model="permission.create"/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" name="update" id="update" value="1"/>
|
<input type="checkbox" name="update" x-model="permission.update"/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" name="delete" id="delete" value="1"/>
|
<input type="checkbox" name="delete" x-model="permission.xdelete"/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" @click="deleteRow(index)"></button>
|
<button type="button" @click="removePermission(index)"></button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</template>
|
</template>
|
||||||
<tr>
|
<tr x-data="permissionsRow" x-on:addrow.window="addPermission(role,read,create,update,xdelete)">
|
||||||
<td style="vertical-align: middle">
|
|
||||||
<input type="text" name="permission" id="permission" />
|
|
||||||
</td>
|
|
||||||
<td style="text-align: center">
|
|
||||||
<input type="checkbox" name="read" id="read" value="1"/>
|
|
||||||
</td>
|
|
||||||
<td style="text-align: center">
|
|
||||||
<input type="checkbox" name="create" id="create" value="1"/>
|
|
||||||
</td>
|
|
||||||
<td style="text-align: center">
|
|
||||||
<input type="checkbox" name="update" id="update" value="1"/>
|
|
||||||
</td>
|
|
||||||
<td style="text-align: center">
|
|
||||||
<input type="checkbox" name="delete" id="delete" value="1"/>
|
|
||||||
</td>
|
|
||||||
<td>
|
<td>
|
||||||
<button type="button" class="icon-trash"></button>
|
<input style="display:block; vertical-align: middle" type="text" name="role" x-model="role" />
|
||||||
</td>
|
</td>
|
||||||
|
<td style="text-align: center">
|
||||||
|
<input type="checkbox" name="read" x-model="read" />
|
||||||
|
</td>
|
||||||
|
<td style="text-align: center">
|
||||||
|
<input type="checkbox" name="create" x-model="create"/>
|
||||||
|
</td>
|
||||||
|
<td style="text-align: center">
|
||||||
|
<input type="checkbox" name="update" x-model="update" />
|
||||||
|
</td>
|
||||||
|
<td style="text-align: center">
|
||||||
|
<input type="checkbox" name="delete" x-model="xdelete" />
|
||||||
|
</td>
|
||||||
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td colspan="6">
|
||||||
<button type="button" class="btn btn-primary" @click="addRow()">Add</button>
|
<button type="button" class="btn btn-primary" @click="$dispatch('addrow')">Add</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
|
|
|
@ -35,6 +35,7 @@ const configApp = {
|
||||||
'public/scripts/app.js',
|
'public/scripts/app.js',
|
||||||
'public/scripts/upload-modal.js',
|
'public/scripts/upload-modal.js',
|
||||||
'public/scripts/events.js',
|
'public/scripts/events.js',
|
||||||
|
'public/scripts/permissions-matrix.js',
|
||||||
|
|
||||||
'public/scripts/views/service.js',
|
'public/scripts/views/service.js',
|
||||||
|
|
||||||
|
|
8
public/dist/scripts/app-all.js
vendored
8
public/dist/scripts/app-all.js
vendored
|
@ -4041,7 +4041,11 @@ this.action=action;},showModal(modal){document.documentElement.classList.add("mo
|
||||||
if(this.hasSubSubResource){event+=`.${this.subSubType}.${this.subSubResource ? this.subSubResource : '*'}`;}
|
if(this.hasSubSubResource){event+=`.${this.subSubType}.${this.subSubResource ? this.subSubResource : '*'}`;}
|
||||||
if(this.action){event+=`.${this.action}`;}
|
if(this.action){event+=`.${this.action}`;}
|
||||||
if(this.attribute){event+=`.${this.attribute}`;}
|
if(this.attribute){event+=`.${this.attribute}`;}
|
||||||
this.events.add(event);this.reset();},removeEvent(value){this.events.delete(value);}}));});})(window);(function(window){"use strict";window.ls.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||null;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
this.events.add(event);this.reset();},removeEvent(value){this.events.delete(value);}}));});})(window);(function(window){document.addEventListener('alpine:init',()=>{Alpine.data('permissionsMatrix',()=>({permissions:[],rawPermissions:[],load(permissions){this.rawPermissions=permissions;permissions.map(p=>{let parts=p.split('(')
|
||||||
|
let type=parts[0];let roles=parts[1].replace(')','').replace(' ','').split(',');roles.map(role=>{let index=-1
|
||||||
|
let existing=this.permissions.find((p,idx)=>{if(p.role===role){index=idx;return true;}})
|
||||||
|
if(existing===undefined){this.permissions.push({role,[type]:true,})}
|
||||||
|
existing[type]=true;this.permissions[index]=existing;});})},addPermission(role,read,create,update,xdelete){if(read)this.rawPermissions.push(`read(${role})`);if(create)this.rawPermissions.push(`create(${role})`);if(update)this.rawPermissions.push(`update(${role})`);if(xdelete)this.rawPermissions.push(`delete(${role})`);console.log(this.rawPermissions);this.permissions.push({role,read,create,update,xdelete});this.reset()},removePermission(index){let row=this.permissions.splice(index,1);this.rawPermissions=this.rawPermissions.filter(p=>!p.includes(row.role));}}));Alpine.data('permissionsRow',()=>({role:'',read:false,create:false,update:false,xdelete:false,reset(){this.role='';this.read=this.create=this.update=this.xdelete=false;}}));});})(window);(function(window){"use strict";window.ls.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||null;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||||
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},6000);};},redirect:function(url){return function(router){if(url==="/console"){window.location=url;return;}
|
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},6000);};},redirect:function(url){return function(router){if(url==="/console"){window.location=url;return;}
|
||||||
router.change(url||"/");};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
router.change(url||"/");};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||||
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||||
|
@ -4101,7 +4105,7 @@ if(observer){observer.disconnect();}else{observer=new MutationObserver(populateC
|
||||||
populateChart();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);element.style.display='none';div.className="ide";div.dataset['langLabel']=element.dataset["langLabel"]||'JSON';div.dataset['lang']=element.dataset["lang"]||'json';pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.textContent="Click Here to Copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(code);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
populateChart();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);element.style.display='none';div.className="ide";div.dataset['langLabel']=element.dataset["langLabel"]||'JSON';div.dataset['lang']=element.dataset["lang"]||'json';pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.textContent="Click Here to Copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(code);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||||
window.getSelection().removeAllRanges();});let check=function(){if(!element.value){return;}
|
window.getSelection().removeAllRanges();});let check=function(){if(!element.value){return;}
|
||||||
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
||||||
code.innerHTML=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
code.textContent=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
||||||
function syncA(){element.value=picker.value;update();}
|
function syncA(){element.value=picker.value;update();}
|
||||||
function syncB(){picker.value=element.value;}
|
function syncB(){picker.value=element.value;}
|
||||||
element.parentNode.insertBefore(preview,element);update();syncB();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-copy",controller:function(element,alerts,document,window){var button=window.document.createElement("i");button.type="button";button.className="icon-docs note copy";button.style.cursor="pointer";element.parentNode.insertBefore(button,element.nextSibling);var copy=function(event){let disabled=element.disabled;element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
element.parentNode.insertBefore(preview,element);update();syncB();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-copy",controller:function(element,alerts,document,window){var button=window.document.createElement("i");button.type="button";button.className="icon-docs note copy";button.style.cursor="pointer";element.parentNode.insertBefore(button,element.nextSibling);var copy=function(event){let disabled=element.disabled;element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||||
|
|
8
public/dist/scripts/app.js
vendored
8
public/dist/scripts/app.js
vendored
|
@ -706,7 +706,11 @@ this.action=action;},showModal(modal){document.documentElement.classList.add("mo
|
||||||
if(this.hasSubSubResource){event+=`.${this.subSubType}.${this.subSubResource ? this.subSubResource : '*'}`;}
|
if(this.hasSubSubResource){event+=`.${this.subSubType}.${this.subSubResource ? this.subSubResource : '*'}`;}
|
||||||
if(this.action){event+=`.${this.action}`;}
|
if(this.action){event+=`.${this.action}`;}
|
||||||
if(this.attribute){event+=`.${this.attribute}`;}
|
if(this.attribute){event+=`.${this.attribute}`;}
|
||||||
this.events.add(event);this.reset();},removeEvent(value){this.events.delete(value);}}));});})(window);(function(window){"use strict";window.ls.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||null;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
this.events.add(event);this.reset();},removeEvent(value){this.events.delete(value);}}));});})(window);(function(window){document.addEventListener('alpine:init',()=>{Alpine.data('permissionsMatrix',()=>({permissions:[],rawPermissions:[],load(permissions){this.rawPermissions=permissions;permissions.map(p=>{let parts=p.split('(')
|
||||||
|
let type=parts[0];let roles=parts[1].replace(')','').replace(' ','').split(',');roles.map(role=>{let index=-1
|
||||||
|
let existing=this.permissions.find((p,idx)=>{if(p.role===role){index=idx;return true;}})
|
||||||
|
if(existing===undefined){this.permissions.push({role,[type]:true,})}
|
||||||
|
existing[type]=true;this.permissions[index]=existing;});})},addPermission(role,read,create,update,xdelete){if(read)this.rawPermissions.push(`read(${role})`);if(create)this.rawPermissions.push(`create(${role})`);if(update)this.rawPermissions.push(`update(${role})`);if(xdelete)this.rawPermissions.push(`delete(${role})`);console.log(this.rawPermissions);this.permissions.push({role,read,create,update,xdelete});this.reset()},removePermission(index){let row=this.permissions.splice(index,1);this.rawPermissions=this.rawPermissions.filter(p=>!p.includes(row.role));}}));Alpine.data('permissionsRow',()=>({role:'',read:false,create:false,update:false,xdelete:false,reset(){this.role='';this.read=this.create=this.update=this.xdelete=false;}}));});})(window);(function(window){"use strict";window.ls.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||null;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||||
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},6000);};},redirect:function(url){return function(router){if(url==="/console"){window.location=url;return;}
|
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},6000);};},redirect:function(url){return function(router){if(url==="/console"){window.location=url;return;}
|
||||||
router.change(url||"/");};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
router.change(url||"/");};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||||
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||||
|
@ -766,7 +770,7 @@ if(observer){observer.disconnect();}else{observer=new MutationObserver(populateC
|
||||||
populateChart();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);element.style.display='none';div.className="ide";div.dataset['langLabel']=element.dataset["langLabel"]||'JSON';div.dataset['lang']=element.dataset["lang"]||'json';pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.textContent="Click Here to Copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(code);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
populateChart();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);element.style.display='none';div.className="ide";div.dataset['langLabel']=element.dataset["langLabel"]||'JSON';div.dataset['lang']=element.dataset["lang"]||'json';pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.textContent="Click Here to Copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(code);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||||
window.getSelection().removeAllRanges();});let check=function(){if(!element.value){return;}
|
window.getSelection().removeAllRanges();});let check=function(){if(!element.value){return;}
|
||||||
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
||||||
code.innerHTML=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
code.textContent=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
||||||
function syncA(){element.value=picker.value;update();}
|
function syncA(){element.value=picker.value;update();}
|
||||||
function syncB(){picker.value=element.value;}
|
function syncB(){picker.value=element.value;}
|
||||||
element.parentNode.insertBefore(preview,element);update();syncB();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-copy",controller:function(element,alerts,document,window){var button=window.document.createElement("i");button.type="button";button.className="icon-docs note copy";button.style.cursor="pointer";element.parentNode.insertBefore(button,element.nextSibling);var copy=function(event){let disabled=element.disabled;element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
element.parentNode.insertBefore(preview,element);update();syncB();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-copy",controller:function(element,alerts,document,window){var button=window.document.createElement("i");button.type="button";button.className="icon-docs note copy";button.style.cursor="pointer";element.parentNode.insertBefore(button,element.nextSibling);var copy=function(event){let disabled=element.disabled;element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||||
|
|
|
@ -1,16 +1,72 @@
|
||||||
(function(window){
|
(function(window){
|
||||||
document.addEventListener('alpine:init', () => {
|
document.addEventListener('alpine:init', () => {
|
||||||
Alpine.store('permissions', {
|
Alpine.data('permissionsMatrix', () => ({
|
||||||
_permissions: [],
|
permissions: [],
|
||||||
permissions() {
|
rawPermissions: [],
|
||||||
return (this._permissions ?? []);
|
load(permissions) {
|
||||||
},
|
this.rawPermissions = permissions;
|
||||||
addRow() {
|
|
||||||
|
|
||||||
},
|
permissions.map(p => {
|
||||||
deleteRow(index) {
|
let parts = p.split('(')
|
||||||
|
let type = parts[0];
|
||||||
|
let roles = parts[1]
|
||||||
|
.replace(')', '')
|
||||||
|
.replace(' ', '')
|
||||||
|
.split(',');
|
||||||
|
|
||||||
|
roles.map(role => {
|
||||||
|
let index = -1
|
||||||
|
let existing = this.permissions.find((p, idx) => {
|
||||||
|
if (p.role === role) {
|
||||||
|
index = idx;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
if (existing === undefined) {
|
||||||
|
this.permissions.push({
|
||||||
|
role,
|
||||||
|
[type]: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
existing[type] = true;
|
||||||
|
this.permissions[index] = existing;
|
||||||
});
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
addPermission(role, read, create, update, xdelete) {
|
||||||
|
if (read) this.rawPermissions.push(`read(${role})`);
|
||||||
|
if (create) this.rawPermissions.push(`create(${role})`);
|
||||||
|
if (update) this.rawPermissions.push(`update(${role})`);
|
||||||
|
if (xdelete) this.rawPermissions.push(`delete(${role})`);
|
||||||
|
|
||||||
|
console.log(this.rawPermissions);
|
||||||
|
|
||||||
|
this.permissions.push({
|
||||||
|
role,
|
||||||
|
read,
|
||||||
|
create,
|
||||||
|
update,
|
||||||
|
xdelete
|
||||||
|
});
|
||||||
|
|
||||||
|
this.reset()
|
||||||
|
},
|
||||||
|
removePermission(index) {
|
||||||
|
let row = this.permissions.splice(index, 1);
|
||||||
|
this.rawPermissions = this.rawPermissions.filter(p => !p.includes(row.role));
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
Alpine.data('permissionsRow', () => ({
|
||||||
|
role: '',
|
||||||
|
read: false,
|
||||||
|
create: false,
|
||||||
|
update: false,
|
||||||
|
xdelete: false,
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
this.role = '';
|
||||||
|
this.read = this.create = this.update = this.xdelete = false;
|
||||||
|
}
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
})(window);
|
})(window);
|
||||||
|
|
Loading…
Reference in a new issue