| | |
| | | if (!value || !Array.isArray(value)) return; |
| | | |
| | | const container = field.querySelector('.repeater-items'); |
| | | let template = field.querySelector('template')?.className??false; |
| | | let template = field.querySelector('template')?.className ?? false; |
| | | if (!container || !template) return; |
| | | |
| | | window.removeChildren(container); |
| | |
| | | value.forEach((data, index) => { |
| | | data.index = index; |
| | | const row = this.templates.create(template, data); |
| | | let fields = row.querySelectorAll('.field'); |
| | | this.populate(fields, data); |
| | | if (!row) return; |
| | | |
| | | for (let [fieldName, fieldValue] of Object.entries(data)) { |
| | | if (fieldName === 'index') continue; |
| | | let subField = row.querySelector(`[data-field="${fieldName}"]`); |
| | | if (subField) { |
| | | this.populateField(subField, fieldName, fieldValue); |
| | | } |
| | | } |
| | | |
| | | container.append(row); |
| | | }); |
| | | } |
| | |
| | | if (!value || !Array.isArray(value)) return; |
| | | |
| | | const container = field.querySelector('.tag-items'); |
| | | let template = field.querySelector('template')?.className??false; |
| | | let template = field.querySelector('template')?.className ?? false; |
| | | if (!container || !template) return; |
| | | |
| | | window.removeChildren(container); |
| | | |
| | | value.forEach((data, index) => { |
| | | data.index = index; |
| | | const row = this.templates.create(template, data); |
| | | let fields = row.querySelectorAll('.field'); |
| | | this.populate(fields, data); |
| | | const row = this.templates.create(template, { |
| | | label: this.getTagLabel(data, field.dataset.tagFormat ?? 'first_field'), |
| | | fieldName: name, |
| | | ...data |
| | | }); |
| | | if (!row) return; |
| | | |
| | | // Set hidden input values directly |
| | | row.querySelectorAll('input[type="hidden"]').forEach(input => { |
| | | const key = input.dataset.field; |
| | | if (key && data[key] !== undefined) { |
| | | input.value = data[key]; |
| | | } |
| | | }); |
| | | |
| | | container.append(row); |
| | | }); |
| | | } |
| | | /** |
| | | * Build tag label from data - mirrors addTagListItem logic |
| | | */ |
| | | getTagLabel(data, format) { |
| | | const values = Object.values(data).filter(v => !this.isEmptyValue(v)); |
| | | switch (format) { |
| | | case 'first_field': |
| | | return values[0] ?? 'New Item'; |
| | | case 'all_fields': |
| | | return values.join(', ') || 'New Item'; |
| | | default: |
| | | if (format.includes('{')) { |
| | | let label = format; |
| | | for (const [key, value] of Object.entries(data)) { |
| | | label = label.replace(`{${key}}`, value); |
| | | } |
| | | return label; |
| | | } |
| | | return data[format] ?? values[0] ?? 'New Item'; |
| | | } |
| | | } |
| | | |
| | | populateLocation(field, name, value) { |
| | | const subFields = ['address', 'lat', 'lng', 'street', 'city', 'province', 'postal_code', 'country']; |
| | | subFields.forEach(subField => { |
| | |
| | | } |
| | | |
| | | const grid = field.querySelector('.item-grid'); |
| | | let uploadContainer = field.querySelector('.file-upload-container'); |
| | | let uploadContainer = field.querySelector('.file-upload-wrapper'); |
| | | uploadContainer.hidden = ids.length > 0; |
| | | field.querySelector('.progress')?.remove(); |
| | | if (grid) { |
| | |
| | | if (!value || !Array.isArray(value) || value.length === 0) return; |
| | | |
| | | let grid = field.querySelector('.item-grid'); |
| | | let uploadContainer = field.querySelector('.file-upload-container'); |
| | | let uploadContainer = field.querySelector('.file-upload-wrapper'); |
| | | uploadContainer.hidden = value.length > 0; |
| | | if (grid) { |
| | | window.removeChildren(grid); |