import { CoreFetchCmpt } from '../Fetch.js'; import FormInput from '../Form/Input.js'; import ApiUdf from '../../api/udf.js'; export default { name: 'CoreUdfCmpt', components: { CoreFetchCmpt, FormInput }, emits: [ 'update:modelValue', 'load' ], props: { // CodeIgniter model (eg: crm/prestudent) ciModel: { type: String, required: true }, // Primarykey(s) of the record (eg: {prestudent_id: 12345}) pk: { type: Object, required: true }, // The values as associative array modelValue: Object, // Show only fields with a name that exists in the filter filter: [String, Array], readonly: true }, data() { return { fields: [], backupModelValue: {} }; }, computed: { isPkValid() { // If the provided pk is _not_ valid return !Object.keys(this.pk).every(key => !this.pk[key]); }, getReadonly() { return this.readonly; }, filterArray() { if (!this.filter || Array.isArray(this.filter)) return this.filter; return [this.filter]; }, filteredFields() { if (!this.filterArray) return this.fields; return this.fields.filter(el => this.filterArray.includes(el.name)); }, filteredValues() { return this.filteredFields.reduce((r,e) => (r[e.name] = this.internModelValue[e.name], r), {}); }, internModelValue: { get() { return this.modelValue || this.backupModelValue; }, set(value) { this.backupModelValue = value; this.$emit('update:modelValue', value); this.originalValues } } }, watch: { pk(n, o) { // If the provided pk is _not_ valid if (Object.keys(n).every(key => !n[key])) return; if (!this.$refs.fetch) return; // NOTE(chris): no initial load yet if (Object.keys(o).length == Object.keys(n).length && Object.keys(o).every(key => n.hasOwnProperty(key) && o[key] === n[key])) return; // NOTE(chris): old and new are the same this.$nextTick(this.$refs.fetch.fetchData); } }, methods: { loadF(params) { return this.$api.call(ApiUdf.load(params)); }, init(result) { const fields = result.map(el => { switch (el.type) { case 'textfield': el.type = 'text'; break; case 'date': el.type = 'Datepicker'; el.clearable = el.hasOwnProperty('clearable') ? el.clearable : false el.autoApply = el.hasOwnProperty('autoApply') ? el.autoApply : true el.enableTimePicker = el.hasOwnProperty('enableTimePicker') ? el.enableTimePicker : false el.format = el.hasOwnProperty('format') ? el.format : "dd.MM.yyyy" el.previewFormat = el.hasOwnProperty('previewFormat') ? el.previewFormat : "dd.MM.yyyy" el.teleport = el.hasOwnProperty('teleport') ? el.teleport : true break; case 'multipledropdown': el.multiple = true; case 'dropdown': el.type = 'select'; el.options = el.options.map(item => { if (Array.isArray(item)) return { id: item[0], description: item[1] }; if (typeof item === 'object') return item; return { id: item, description: item }; }); break; } return el; }); const values = fields.reduce((a,c) => { a[c.name] = c.value; return a; }, {}); this.internModelValue = {...this.internModelValue, ...values}; this.fields = fields; this.$emit('load', values); } }, template: `
` }