]> BookStack Code Mirror - bookstack/blob - resources/js/components/entity-permissions.js
Fixed toggle controls on added content permission role rows
[bookstack] / resources / js / components / entity-permissions.js
1 /**
2  * @extends {Component}
3  */
4 import {htmlToDom} from "../services/dom";
5
6 class EntityPermissions {
7
8     setup() {
9         this.container = this.$el;
10         this.entityType = this.$opts.entityType;
11
12         this.everyoneInheritToggle = this.$refs.everyoneInherit;
13         this.roleSelect = this.$refs.roleSelect;
14         this.roleContainer = this.$refs.roleContainer;
15
16         this.setupListeners();
17     }
18
19     setupListeners() {
20         // "Everyone Else" inherit toggle
21         this.everyoneInheritToggle.addEventListener('change', event => {
22             const inherit = event.target.checked;
23             const permissions = document.querySelectorAll('input[name^="permissions[0]["]');
24             for (const permission of permissions) {
25                 permission.disabled = inherit;
26                 permission.checked = false;
27             }
28         });
29
30         // Remove role row button click
31         this.container.addEventListener('click', event => {
32             const button = event.target.closest('button');
33             if (button && button.dataset.roleId) {
34                 this.removeRowOnButtonClick(button)
35             }
36         });
37
38         // Role select change
39         this.roleSelect.addEventListener('change', event => {
40             const roleId = this.roleSelect.value;
41             if (roleId) {
42                 this.addRoleRow(roleId);
43             }
44         });
45     }
46
47     async addRoleRow(roleId) {
48         this.roleSelect.disabled = true;
49
50         // Remove option from select
51         const option = this.roleSelect.querySelector(`option[value="${roleId}"]`);
52         if (option) {
53             option.remove();
54         }
55
56         // Get and insert new row
57         const resp = await window.$http.get(`/permissions/form-row/${this.entityType}/${roleId}`);
58         const row = htmlToDom(resp.data);
59         this.roleContainer.append(row);
60
61         this.roleSelect.disabled = false;
62     }
63
64     removeRowOnButtonClick(button) {
65         const row = button.closest('.content-permissions-row');
66         const roleId = button.dataset.roleId;
67         const roleName = button.dataset.roleName;
68
69         const option = document.createElement('option');
70         option.value = roleId;
71         option.textContent = roleName;
72
73         this.roleSelect.append(option);
74         row.remove();
75     }
76
77 }
78
79 export default EntityPermissions;