Vue.component('tt-table-crud', { //language=Vue template: `
`, props: { crudConfig: {type: Object, required: false, default: () => (window['TT_CONFIG']['CRUD_CONFIG'])}, emitEdit: {type: Boolean, required: false, default: false} }, data() { return { crudModal: false, crudModalData: {}, crudModalColumnVisibility: {}, crudModalColumnVisibilityCheck: {}, window: window } }, methods: { openCrudModal(row = null) { if (this.emitEdit) { this.$emit('edit', row) return } this.crudModalData = row ? JSON.parse(JSON.stringify(row)) : {}; this.crudModal = true; }, resetCrudModalData() { this.crudModalData = {}; this.crudModal = false; }, async submitCrudModal() { delete this.crudModalData.isTrusted; for (const column of this.modalConfig.headers) { if (column.type === 'autocomplete' && this.crudModalData[column.key] === '') { delete this.crudModalData[column.key]; } } const response = await axios.post(this.crudModalData.id ? window['TT_CONFIG']['UPDATE_URL'] : window['TT_CONFIG']['CREATE_URL'], this.crudModalData); if (response.data.success) { this.window.notify('success', response.data.message || 'Erfolgreich gespeichert'); if (this.crudConfig.reopenOnCreate && !this.crudModalData.id) { this.resetCrudModalData(); const getByIdUrl = window['TT_CONFIG']['GET_BY_ID_URL'] || `${window['TT_CONFIG']['BASE_PATH']}/${this.crudConfig.key}/getById`; const getByIdResponse = await axios.get(getByIdUrl, {params: {id: response.data.id}}); this.crudModalData = getByIdResponse.data; this.crudModal = true; } else { this.resetCrudModalData(); this.$refs.table.refreshTable(); } } else { this.window.notify('error', response.data.errors ? Object.values(response.data.errors).join('
') : response.data.message || 'Ein Fehler ist aufgetreten'); } }, async deleteCrudModal() { const response = await axios.post(window['TT_CONFIG']['DELETE_URL'], {id: this.crudModalData.id}); if (response.data.success) { this.$refs.table.refreshTable(); this.resetCrudModalData(); } this.window.notify(response.data.success ? 'success' : 'error', response.data.message); }, async checkCrudModalColumnVisibility(val, oldVal) { const crudModalColumnVisibility = {} for (const column of this.modalConfig.headers) { if (!column?.visible?.reference || typeof column.visible.reference !== 'string') { crudModalColumnVisibility[column.key] = true continue; } const localId = this.crudModalData[column.visible.use.split('=')[0]] if (this.crudModalColumnVisibilityCheck[column.key] && this.crudModalColumnVisibilityCheck[column.key][column.visible.reference] === localId) { crudModalColumnVisibility[column.key] = this.crudModalColumnVisibilityCheck[column.key]['visibility'] continue; } if (!localId) { crudModalColumnVisibility[column.key] = false continue; } const reference = column.visible.reference let referenceData = await axios.get(window['TT_CONFIG']['BASE_PATH'] + `/${reference}/getById?id=${localId}`) referenceData = referenceData.data // noinspection EqualityComparisonWithCoercionJS crudModalColumnVisibility[column.key] = referenceData[column.visible.key] == column.visible.value this.crudModalColumnVisibilityCheck[column.key] = { [column.visible.reference]: localId, visibility: crudModalColumnVisibility[column.key] } } this.$set(this, 'crudModalColumnVisibility', crudModalColumnVisibility) }, calculateMinActionsWidth(row) { // Base width for the edit action let minWidth = 19; // Check additional actions if (this.crudConfig && this.crudConfig.additionalActions) { this.crudConfig.additionalActions.forEach(action => { // Add width if action is visible (no condition or condition is true) if (!action.condition || action.condition(row)) { minWidth += 19; } }); } return `${minWidth}px`; } }, computed: { tableConfig() { return { key: this.crudConfig.key, customRowClass: this.crudConfig.customRowClass, tableHeader: this.crudConfig.tableHeader, headers: this.crudConfig.columns.filter(column => column.table !== false).map(column => { return {text: column.text, key: column.key, ...column.table, filterOptions: column?.table?.filterOptions ?? column?.modal?.items ?? [], priority: column.priority} }) } }, modalConfig() { return { key: this.crudConfig.key, headers: this.crudConfig.columns.filter(column => column.modal !== false).map(column => { const type = column.modal?.type || "text" return {text: column.text, key: column.key, type, ...column.modal} }), } } }, watch: { crudModalData: { handler: async function (val, oldVal) { if (!val) return await this.checkCrudModalColumnVisibility(val, oldVal) }, deep: true } } })