Vue.component('tt-table-crud', {
//language=Vue
template: `
{{crudConfig.createText || 'Erstellen'}}
{{column.modal.items.find(item => item.value == row[column.key]).text}}
Select not found for column {{column.key}} and value {{row[column.key]}} {{typeof row[column.key]}}
`, 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
}
}
})