BookStackApp/BookStack

View on GitHub
resources/js/components/entity-permissions.js

Summary

Maintainability
A
3 hrs
Test Coverage
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.setupListeners();
    }

    setupListeners() {
        // "Everyone Else" inherit toggle
        this.everyoneInheritToggle.addEventListener('change', event => {
            const inherit = event.target.checked;
            const permissions = document.querySelectorAll('input[name^="permissions[0]["]');
            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.roleId) {
                this.removeRowOnButtonClick(button);
            }
        });

        // Role select change
        this.roleSelect.addEventListener('change', () => {
            const roleId = this.roleSelect.value;
            if (roleId) {
                this.addRoleRow(roleId);
            }
        });
    }

    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/form-row/${this.entityType}/${roleId}`);
        const row = htmlToDom(resp.data);
        this.roleContainer.append(row);

        this.roleSelect.disabled = false;
    }

    removeRowOnButtonClick(button) {
        const row = button.closest('.item-list-row');
        const {roleId} = button.dataset;
        const {roleName} = button.dataset;

        const option = document.createElement('option');
        option.value = roleId;
        option.textContent = roleName;

        this.roleSelect.append(option);
        row.remove();
    }

}