2022-08-13 21:07:07 +12:00
|
|
|
(function (window) {
|
2022-08-10 22:23:53 +12:00
|
|
|
document.addEventListener('alpine:init', () => {
|
2022-08-12 01:22:39 +12:00
|
|
|
Alpine.data('permissionsMatrix', () => ({
|
|
|
|
permissions: [],
|
|
|
|
rawPermissions: [],
|
|
|
|
load(permissions) {
|
2022-08-13 18:33:11 +12:00
|
|
|
if (permissions === undefined) {
|
|
|
|
return;
|
|
|
|
}
|
2022-08-13 21:07:07 +12:00
|
|
|
|
2022-08-12 01:22:39 +12:00
|
|
|
this.rawPermissions = permissions;
|
|
|
|
|
|
|
|
permissions.map(p => {
|
2022-08-13 21:07:07 +12:00
|
|
|
let {type, role} = this.parsePermission(p);
|
2022-08-12 23:44:47 +12:00
|
|
|
type = this.parseInputPermission(type);
|
|
|
|
|
2022-08-12 22:37:52 +12:00
|
|
|
let index = -1;
|
|
|
|
let existing = this.permissions.find((p, idx) => {
|
|
|
|
if (p.role === role) {
|
|
|
|
index = idx;
|
|
|
|
return true;
|
2022-08-12 01:22:39 +12:00
|
|
|
}
|
2022-08-12 22:37:52 +12:00
|
|
|
})
|
|
|
|
if (existing === undefined) {
|
2022-09-13 16:14:37 +12:00
|
|
|
let newPermission = {
|
2022-08-12 22:37:52 +12:00
|
|
|
role,
|
2022-09-13 16:14:37 +12:00
|
|
|
create: false,
|
|
|
|
read: false,
|
|
|
|
update: false,
|
|
|
|
xdelete: false,
|
|
|
|
};
|
|
|
|
newPermission[type] = true;
|
|
|
|
this.permissions.push(newPermission);
|
2022-08-12 22:37:52 +12:00
|
|
|
}
|
|
|
|
if (index !== -1) {
|
|
|
|
existing[type] = true;
|
|
|
|
this.permissions[index] = existing;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
2022-09-12 15:54:55 +12:00
|
|
|
addPermission(formId) {
|
|
|
|
if (this.permissions.length > 0
|
|
|
|
&& !this.validate(formId, this.permissions.length - 1)) {
|
|
|
|
return;
|
|
|
|
}
|
2022-09-13 16:14:37 +12:00
|
|
|
this.permissions.push({
|
|
|
|
role: '',
|
|
|
|
create: false,
|
|
|
|
read: false,
|
|
|
|
update: false,
|
|
|
|
xdelete: false,
|
|
|
|
});
|
2022-08-12 22:37:52 +12:00
|
|
|
},
|
|
|
|
updatePermission(index) {
|
|
|
|
// Because the x-model does not update before the click event,
|
|
|
|
// we setTimeout to give Alpine enough time to update the model.
|
|
|
|
setTimeout(() => {
|
|
|
|
const permission = this.permissions[index];
|
2022-08-13 21:07:07 +12:00
|
|
|
|
|
|
|
Object.keys(permission).forEach(key => {
|
2022-08-12 22:37:52 +12:00
|
|
|
if (key === 'role') {
|
2022-08-13 21:07:07 +12:00
|
|
|
return;
|
2022-08-12 22:37:52 +12:00
|
|
|
}
|
2022-08-12 23:44:47 +12:00
|
|
|
const parsedKey = this.parseOutputPermission(key);
|
2022-08-15 13:04:14 +12:00
|
|
|
const permissionString = this.buildPermission(parsedKey, permission.role);
|
2022-09-12 14:02:23 +12:00
|
|
|
if (permission[key]) {
|
|
|
|
if (!this.rawPermissions.includes(permissionString)) {
|
|
|
|
this.rawPermissions.push(permissionString);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
this.rawPermissions = this.rawPermissions.filter(p => {
|
|
|
|
return !p.includes(permissionString);
|
|
|
|
});
|
|
|
|
}
|
2022-08-13 21:07:07 +12:00
|
|
|
});
|
2022-08-12 22:37:52 +12:00
|
|
|
});
|
2022-08-10 22:23:53 +12:00
|
|
|
},
|
2022-08-12 01:22:39 +12:00
|
|
|
removePermission(index) {
|
|
|
|
let row = this.permissions.splice(index, 1);
|
2022-08-12 12:26:58 +12:00
|
|
|
if (row.length === 1) {
|
|
|
|
this.rawPermissions = this.rawPermissions.filter(p => !p.includes(row[0].role));
|
|
|
|
}
|
2022-08-12 22:37:52 +12:00
|
|
|
},
|
2022-08-12 23:44:47 +12:00
|
|
|
parsePermission(permission) {
|
|
|
|
let parts = permission.split('(');
|
|
|
|
let type = parts[0];
|
2022-08-15 13:04:14 +12:00
|
|
|
let role = parts[1]
|
|
|
|
.replace(')', '')
|
|
|
|
.replace(' ', '')
|
|
|
|
.replaceAll('"', '');
|
2022-08-13 21:07:07 +12:00
|
|
|
return {type, role};
|
2022-08-12 23:44:47 +12:00
|
|
|
},
|
2022-08-15 13:04:14 +12:00
|
|
|
buildPermission(type, role) {
|
|
|
|
return `${type}("${role}")`
|
|
|
|
},
|
2022-08-12 23:44:47 +12:00
|
|
|
parseInputPermission(key) {
|
|
|
|
// Can't bind to a property named delete
|
|
|
|
if (key === 'delete') {
|
|
|
|
return 'xdelete';
|
|
|
|
}
|
|
|
|
return key;
|
|
|
|
},
|
|
|
|
parseOutputPermission(key) {
|
|
|
|
// Can't bind to a property named delete
|
2022-08-12 22:37:52 +12:00
|
|
|
if (key === 'xdelete') {
|
|
|
|
return 'delete';
|
|
|
|
}
|
|
|
|
return key;
|
2022-08-29 22:27:54 +12:00
|
|
|
},
|
2022-09-12 15:55:58 +12:00
|
|
|
validate(formId, index) {
|
2022-08-29 22:27:54 +12:00
|
|
|
const form = document.getElementById(formId);
|
2022-09-12 15:55:58 +12:00
|
|
|
const input = document.getElementById(`${formId}Input${index}`);
|
|
|
|
const permission = this.permissions[index];
|
2022-08-29 22:27:54 +12:00
|
|
|
|
|
|
|
input.setCustomValidity('');
|
|
|
|
|
2022-09-12 15:55:58 +12:00
|
|
|
if (permission.role === '') {
|
|
|
|
input.setCustomValidity('Role is required');
|
|
|
|
} else if (!Object.entries(permission).some(([k, v]) => !k.includes('role') && v)) {
|
2022-08-29 22:27:54 +12:00
|
|
|
input.setCustomValidity('No permissions selected');
|
2022-09-12 15:55:58 +12:00
|
|
|
} else if (this.permissions.some(p => p.role === permission.role && p !== permission)) {
|
2022-08-29 22:27:54 +12:00
|
|
|
input.setCustomValidity('Role entry already exists');
|
|
|
|
}
|
2022-09-12 15:55:58 +12:00
|
|
|
|
2022-08-29 22:27:54 +12:00
|
|
|
return form.reportValidity();
|
2022-09-08 15:02:34 +12:00
|
|
|
},
|
|
|
|
prevent(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
event.stopPropagation();
|
2022-08-12 01:22:39 +12:00
|
|
|
}
|
|
|
|
}));
|
2022-08-10 22:23:53 +12:00
|
|
|
});
|
|
|
|
})(window);
|