Vue.component('UserPermissionTemplate', { template: `

Berechtigungsvorlagen

Keine Vorlagen gefunden.

{{ groupName }}
`, data() { // Helper function to get a fresh permissions object. It's defined here to avoid relying on `this`. const getFreshPermissions = (config) => { const permissions = {}; if (!config) return permissions; Object.values(config).forEach(group => { Object.keys(group).forEach(key => { permissions[key] = false; }); }); return permissions; }; return { loading: true, templates: [], showModal: false, isSaving: false, editableTemplate: { id: null, name: '', permissions: getFreshPermissions(window.TT_CONFIG.PERMISSIONS_CONFIG) // Initialize correctly }, modalKey: Date.now(), } }, computed: { permissionsConfig() { return window.TT_CONFIG.PERMISSIONS_CONFIG; }, modalTitle() { return this.editableTemplate && this.editableTemplate.id ? 'Vorlage bearbeiten' : 'Neue Vorlage erstellen'; } }, methods: { fetchTemplates() { this.loading = true; axios.get('/UserEdit/getPermissionTemplates') .then(response => { this.templates = response.data; }) .catch(e => window.notify('error', 'Vorlagen konnten nicht geladen werden.')) .finally(() => this.loading = false); }, openModal(template = null) { this.modalKey = Date.now(); // Ensure unique IDs for checkboxes in modal if (template) { this.editableTemplate = JSON.parse(JSON.stringify(template)); // Deep copy const permissions = this.freshPermissions(); // Ensure all keys from config exist on the loaded template's permissions for (const key in permissions) { if (this.editableTemplate.permissions.hasOwnProperty(key)) { permissions[key] = this.editableTemplate.permissions[key]; } } this.editableTemplate.permissions = permissions; } else { this.editableTemplate = { id: null, name: '', permissions: this.freshPermissions() }; } this.showModal = true; }, freshPermissions() { const permissions = {}; Object.values(this.permissionsConfig).forEach(group => { Object.keys(group).forEach(key => { permissions[key] = false; }); }); return permissions; }, async saveTemplate() { if (!this.editableTemplate.name) { return window.notify('error', 'Bitte einen Namen für die Vorlage eingeben.'); } this.isSaving = true; try { const response = await axios.post('/UserEdit/savePermissionTemplate', this.editableTemplate); if(response.data.success) { window.notify('success', response.data.message); this.showModal = false; this.fetchTemplates(); // Refresh list } else { window.notify('error', response.data.message || 'Fehler beim Speichern.'); } } catch (e) { window.notify('error', 'Ein Netzwerkfehler ist aufgetreten.'); } finally { this.isSaving = false; } }, async deleteTemplate(template) { if (!confirm(`Soll die Vorlage "${template.name}" wirklich gelöscht werden?`)) return; try { const response = await axios.post('/UserEdit/deletePermissionTemplate', { id: template.id }); if(response.data.success) { window.notify('success', response.data.message); this.fetchTemplates(); // Refresh list } else { window.notify('error', response.data.message || 'Fehler beim Löschen.'); } } catch (e) { window.notify('error', 'Ein Netzwerkfehler ist aufgetreten.'); } } }, mounted() { this.fetchTemplates(); } });