| | |
| | | && ['image_upload', 'video_upload', 'document_upload'].includes(operation.type)) { |
| | | let uploadIds = []; |
| | | |
| | | console.log('upload operation complete', operation); |
| | | |
| | | if (operation.data) { |
| | | // Handle FormData |
| | | if (operation.data instanceof FormData) { |
| | |
| | | |
| | | if (isUpload) { |
| | | data.append('mode', field.config.mode); |
| | | data.append('field_name', field.config.name); |
| | | |
| | | data.append('field_name', field.config.repeaterPath || field.config.name); |
| | | data.append('fieldId', field.id); |
| | | data.append('field_type', field.config.type); |
| | | data.append('subtype', field.config.subtype); |
| | |
| | | } |
| | | |
| | | extractFieldConfig(fieldElement, autoUpload, imageMeta) { |
| | | return { |
| | | const config = { |
| | | autoUpload: autoUpload, |
| | | showMeta: imageMeta, |
| | | destination: fieldElement.dataset.destination || 'meta', //TODO: why do we need this? |
| | | destination: fieldElement.dataset.destination || 'meta', |
| | | content: this.extractFieldContent(fieldElement), |
| | | mode: fieldElement.dataset.mode || 'direct', |
| | | type: fieldElement.dataset.type || 'single', |
| | | name: fieldElement.dataset.field, |
| | | itemID: this.extractFieldItemId(fieldElement)??0, |
| | | maxFiles: parseInt(fieldElement.dataset.maxFiles)??25, |
| | | subType: fieldElement.dataset.subtype?? 'image' |
| | | itemID: this.extractFieldItemId(fieldElement) ?? 0, |
| | | maxFiles: parseInt(fieldElement.dataset.maxFiles) ?? 25, |
| | | subType: fieldElement.dataset.subtype ?? 'image', |
| | | repeaterPath: null |
| | | }; |
| | | |
| | | const repeaterRow = fieldElement.closest('[data-index]'); |
| | | const repeater = repeaterRow?.closest('[data-field][data-repeater-id]'); |
| | | if (repeater && repeaterRow) { |
| | | config.repeaterPath = `${repeater.dataset.field}:${repeaterRow.dataset.index}:${config.name}`; |
| | | } |
| | | |
| | | return config; |
| | | } |
| | | |
| | | extractFieldContent(fieldElement) { |
| | |
| | | determineFieldId(fieldElement) { |
| | | let content = this.extractFieldContent(fieldElement); |
| | | content = (content === null) ? '' : content+'_'; |
| | | |
| | | let itemID = this.extractFieldItemId(fieldElement); |
| | | itemID = (itemID === null) ? '' : itemID+'_'; |
| | | |
| | | const field = fieldElement.dataset.field || ''; |
| | | |
| | | // If inside a repeater row, include repeater name + index for uniqueness |
| | | const repeaterRow = fieldElement.closest('[data-index]'); |
| | | const repeater = repeaterRow?.closest('[data-field][data-repeater-id]'); |
| | | if (repeater && repeaterRow) { |
| | | return `${content}${itemID}${repeater.dataset.field}_${repeaterRow.dataset.index}_${field}`; |
| | | } |
| | | |
| | | return `${content}${itemID}${field}`; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | getSubtypeFromURL(url) { |
| | | if (!url || url === '') { |
| | | return ''; |
| | | } |
| | | const imgs = ['.webp', '.jpg', '.jpeg', '.png', '.gif', '.svg']; |
| | | const videos = ['.mp4', '.ogg', '.mov', '.webm', '.avi']; |
| | | |
| | |
| | | .map(el => el.dataset.id || el.dataset.uploadId) |
| | | .filter(Boolean); |
| | | |
| | | field.ui.hidden.value = remaining.join(','); |
| | | const newValue = remaining.join(','); |
| | | if (field.ui.hidden.value === newValue) return; |
| | | |
| | | field.ui.hidden.value = newValue; |
| | | field.ui.hidden.dispatchEvent(new Event('change', { bubbles: true })); |
| | | } |
| | | async setBulkUpload(uploads, key, value) { |