export const DynamicForm = { name: 'DynamicForm', // Static method for direct rendering renderComponent(container, props, app) { console.log('🔍 [DEBUG] DynamicForm.renderComponent() aangeroepen'); if (!container) { console.error('Container element niet gevonden voor DynamicForm'); return null; } console.log('🔍 [DEBUG] DynamicForm container gevonden, Vue app aanmaken'); try { // Maak een nieuwe Vue app instantie met dit component const instance = app.mount(container); console.log('🔍 [DEBUG] DynamicForm component succesvol gemount'); return instance; } catch (error) { console.error('🚨 [ERROR] Fout bij mounten DynamicForm component:', error); return null; } }, created() { // Zorg ervoor dat het icoon geladen wordt als iconManager beschikbaar is if (window.iconManager && this.formData && this.formData.icon) { window.iconManager.loadIcon(this.formData.icon); } }, props: { formData: { type: Object, required: true, validator: (formData) => { // Controleer eerst of formData een geldig object is if (!formData || typeof formData !== 'object') { console.error('FormData is niet een geldig object'); return false; } // Controleer of er een titel of naam is if (!formData.title && !formData.name) { console.error('FormData heeft geen title of name'); return false; } // Controleer of er velden zijn if (!formData.fields) { console.error('FormData heeft geen fields eigenschap'); return false; } // Controleer of velden een array of object zijn if (!Array.isArray(formData.fields) && typeof formData.fields !== 'object') { console.error('FormData.fields is geen array of object'); return false; } console.log('FormData is geldig:', formData); return true; } }, formValues: { type: Object, default: () => ({}) }, isSubmitting: { type: Boolean, default: false }, readOnly: { type: Boolean, default: false }, hideActions: { type: Boolean, default: false } }, emits: ['submit', 'cancel', 'update:formValues'], data() { return { localFormValues: { ...this.formValues } }; }, watch: { formValues: { handler(newValues) { // Gebruik een vlag om recursieve updates te voorkomen if (JSON.stringify(newValues) !== JSON.stringify(this.localFormValues)) { this.localFormValues = JSON.parse(JSON.stringify(newValues)); } }, deep: true }, localFormValues: { handler(newValues) { // Gebruik een vlag om recursieve updates te voorkomen if (JSON.stringify(newValues) !== JSON.stringify(this.formValues)) { this.$emit('update:formValues', JSON.parse(JSON.stringify(newValues))); } }, deep: true }, 'formData.icon': { handler(newIcon) { if (newIcon && window.iconManager) { window.iconManager.loadIcon(newIcon); } }, immediate: true } }, methods: { handleSubmit() { // Basic validation const missingFields = []; if (Array.isArray(this.formData.fields)) { // Valideer array-gebaseerde velden this.formData.fields.forEach(field => { const fieldId = field.id || field.name; if (field.required) { const value = this.localFormValues[fieldId]; if (value === undefined || value === null || (typeof value === 'string' && !value.trim()) || (Array.isArray(value) && value.length === 0)) { missingFields.push(field.name); } } }); } else { // Valideer object-gebaseerde velden Object.entries(this.formData.fields).forEach(([fieldId, field]) => { if (field.required) { const value = this.localFormValues[fieldId]; if (value === undefined || value === null || (typeof value === 'string' && !value.trim()) || (Array.isArray(value) && value.length === 0)) { missingFields.push(field.name); } } }); }; if (missingFields.length > 0) { const fieldNames = missingFields.join(', '); alert(`De volgende velden zijn verplicht: ${fieldNames}`); return; } this.$emit('submit', this.localFormValues); }, handleCancel() { this.$emit('cancel'); }, updateFieldValue(fieldId, value) { this.localFormValues[fieldId] = value; } }, template: `