1
0
Fork 0
mirror of synced 2024-07-12 18:05:55 +12:00
appwrite/public/scripts/permissions-matrix.js

142 lines
5.5 KiB
JavaScript
Raw Normal View History

2022-08-13 21:07:07 +12:00
(function (window) {
2022-08-10 22:23:53 +12:00
document.addEventListener('alpine:init', () => {
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
this.rawPermissions = permissions;
permissions.map(p => {
2022-08-13 21:07:07 +12:00
let {type, role} = this.parsePermission(p);
type = this.parseInputPermission(type);
let index = -1;
let existing = this.permissions.find((p, idx) => {
if (p.role === role) {
index = idx;
return true;
}
})
if (existing === undefined) {
let newPermission = {
role,
create: false,
read: false,
update: false,
xdelete: false,
};
newPermission[type] = true;
this.permissions.push(newPermission);
}
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;
}
this.permissions.push({
role: '',
create: false,
read: false,
update: false,
xdelete: false,
});
},
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 => {
if (key === 'role') {
2022-08-13 21:07:07 +12:00
return;
}
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-10 22:23:53 +12:00
},
clearPermission(index) {
let currentRole = this.permissions[index].role;
this.rawPermissions = this.rawPermissions.filter(p => {
let {type, role} = this.parsePermission(p);
return role !== currentRole;
});
},
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));
}
},
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-15 13:04:14 +12:00
buildPermission(type, role) {
return `${type}("${role}")`
},
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
if (key === 'xdelete') {
return 'delete';
}
return key;
},
2022-09-12 15:55:58 +12:00
validate(formId, index) {
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];
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)) {
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)) {
input.setCustomValidity('Role entry already exists');
}
2022-09-12 15:55:58 +12:00
return form.reportValidity();
},
prevent(event) {
event.preventDefault();
event.stopPropagation();
}
}));
2022-08-10 22:23:53 +12:00
});
})(window);