mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-03-25 16:05:12 +08:00
112 lines
3.7 KiB
JavaScript
112 lines
3.7 KiB
JavaScript
import {htmlToDom} from "../services/dom";
|
|
import {Component} from "./component";
|
|
|
|
export class EntityPermissions extends Component {
|
|
|
|
setup() {
|
|
this.container = this.$el;
|
|
this.entityType = this.$opts.entityType;
|
|
|
|
this.everyoneInheritToggle = this.$refs.everyoneInherit;
|
|
this.roleSelect = this.$refs.roleSelect;
|
|
this.roleContainer = this.$refs.roleContainer;
|
|
this.userContainer = this.$refs.userContainer;
|
|
this.userSelectContainer = this.$refs.userSelectContainer;
|
|
|
|
this.setupListeners();
|
|
}
|
|
|
|
setupListeners() {
|
|
// "Everyone Else" inherit toggle
|
|
this.everyoneInheritToggle.addEventListener('change', event => {
|
|
const inherit = event.target.checked;
|
|
const permissions = document.querySelectorAll('input[name^="permissions[fallback]"]');
|
|
for (const permission of permissions) {
|
|
permission.disabled = inherit;
|
|
permission.checked = false;
|
|
}
|
|
});
|
|
|
|
// Remove role row button click
|
|
this.container.addEventListener('click', event => {
|
|
const button = event.target.closest('button');
|
|
if (button && button.dataset.modelType) {
|
|
this.removeRowOnButtonClick(button)
|
|
}
|
|
});
|
|
|
|
// Role select change
|
|
this.roleSelect.addEventListener('change', event => {
|
|
const roleId = this.roleSelect.value;
|
|
if (roleId) {
|
|
this.addRoleRow(roleId);
|
|
}
|
|
});
|
|
|
|
// User select change
|
|
this.userSelectContainer.querySelector('input[name="user_select"]').addEventListener('change', event => {
|
|
const userId = event.target.value;
|
|
if (userId) {
|
|
this.addUserRow(userId);
|
|
}
|
|
});
|
|
}
|
|
|
|
async addRoleRow(roleId) {
|
|
this.roleSelect.disabled = true;
|
|
|
|
// Remove option from select
|
|
const option = this.roleSelect.querySelector(`option[value="${roleId}"]`);
|
|
if (option) {
|
|
option.remove();
|
|
}
|
|
|
|
// Get and insert new row
|
|
const resp = await window.$http.get(`/permissions/role-form-row/${this.entityType}/${roleId}`);
|
|
const row = htmlToDom(resp.data);
|
|
this.roleContainer.append(row);
|
|
|
|
this.roleSelect.disabled = false;
|
|
}
|
|
|
|
async addUserRow(userId) {
|
|
const exists = this.userContainer.querySelector(`[name^="permissions[user][${userId}]"]`) !== null;
|
|
if (exists) {
|
|
return;
|
|
}
|
|
|
|
const toggle = this.userSelectContainer.querySelector('.dropdown-search-toggle-select');
|
|
toggle.classList.add('disabled');
|
|
this.userContainer.style.pointerEvents = 'none';
|
|
|
|
// Get and insert new row
|
|
const resp = await window.$http.get(`/permissions/user-form-row/${this.entityType}/${userId}`);
|
|
const row = htmlToDom(resp.data);
|
|
this.userContainer.append(row);
|
|
|
|
toggle.classList.remove('disabled');
|
|
this.userContainer.style.pointerEvents = null;
|
|
|
|
/** @var {UserSelect} **/
|
|
const userSelect = window.$components.firstOnElement(this.userSelectContainer.querySelector('.dropdown-search'), 'user-select');
|
|
userSelect.reset();
|
|
}
|
|
|
|
removeRowOnButtonClick(button) {
|
|
const row = button.closest('.item-list-row');
|
|
const modelId = button.dataset.modelId;
|
|
const modelName = button.dataset.modelName;
|
|
const modelType = button.dataset.modelType;
|
|
|
|
const option = document.createElement('option');
|
|
option.value = modelId;
|
|
option.textContent = modelName;
|
|
|
|
if (modelType === 'role') {
|
|
this.roleSelect.append(option);
|
|
}
|
|
|
|
row.remove();
|
|
}
|
|
|
|
} |