From 9f86429a1252b45c95b7c62fbaa1b82de3723997 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Mon, 05 Jan 2026 18:16:07 +0000
Subject: [PATCH] =Complete TaxonomySelector.js and TaxonomyCreator.js refactor

---
 assets/js/concise/PopulateForm.js |  219 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 215 insertions(+), 4 deletions(-)

diff --git a/assets/js/concise/PopulateForm.js b/assets/js/concise/PopulateForm.js
index 98fcc33..74dda58 100644
--- a/assets/js/concise/PopulateForm.js
+++ b/assets/js/concise/PopulateForm.js
@@ -388,9 +388,6 @@
 		}
 	}
 
-	// ... rest of the methods stay the same (populateTextField, populateTextareaField, etc.)
-	// I'll include the key ones that might need updating
-
 	populateTextField(fieldWrapper, fieldName, fieldValue) {
 		const input = fieldWrapper.querySelector(`[name="${fieldName}"], input, textarea`);
 		if (input && input.type !== 'file') {
@@ -485,7 +482,221 @@
 		return 'text';
 	}
 
-	// Include all other existing methods...
+	/**
+	 * Populate number fields
+	 */
+	populateNumberField(fieldWrapper, fieldName, fieldValue) {
+		const input = fieldWrapper.querySelector(`[name="${fieldName}"], input[type="number"]`);
+		if (input) {
+			input.value = Number(fieldValue) || 0;
+		}
+	}
+
+	/**
+	 * Populate boolean/true_false fields
+	 */
+	populateBooleanField(fieldWrapper, fieldName, fieldValue) {
+		const input = fieldWrapper.querySelector(`[name="${fieldName}"], input[type="checkbox"]`);
+		if (input) {
+			input.checked = Boolean(fieldValue);
+		}
+	}
+
+	/**
+	 * Populate select/radio fields
+	 */
+	populateSelectField(fieldWrapper, fieldName, fieldValue) {
+		const value = String(fieldValue || '');
+
+		// Try select first
+		const select = fieldWrapper.querySelector(`select[name="${fieldName}"]`);
+		if (select) {
+			select.value = value;
+			return;
+		}
+
+		// Try radio buttons
+		const radio = fieldWrapper.querySelector(`input[type="radio"][name="${fieldName}"][value="${value}"]`);
+		if (radio) {
+			radio.checked = true;
+		}
+	}
+
+	/**
+	 * Populate set/checkbox fields (multiple selections)
+	 */
+	populateSetField(fieldWrapper, fieldName, fieldValue) {
+		// Parse value if it's a string
+		let values = fieldValue;
+		if (typeof fieldValue === 'string') {
+			try {
+				values = JSON.parse(fieldValue);
+			} catch (e) {
+				values = fieldValue.split(',').map(v => v.trim());
+			}
+		}
+
+		if (!Array.isArray(values)) {
+			values = [String(values)];
+		}
+
+		// Update checkboxes
+		fieldWrapper.querySelectorAll(`input[type="checkbox"][name*="${fieldName}"]`).forEach(checkbox => {
+			checkbox.checked = values.includes(checkbox.value);
+		});
+	}
+
+	/**
+	 * Populate date/time fields
+	 */
+	populateDateField(fieldWrapper, fieldName, fieldValue) {
+		const input = fieldWrapper.querySelector(`[name="${fieldName}"], input`);
+		if (input && fieldValue) {
+			// Handle different date formats
+			let dateValue = fieldValue;
+			if (typeof fieldValue === 'object' && fieldValue.date) {
+				dateValue = fieldValue.date;
+			}
+
+			// Convert to appropriate format for input type
+			try {
+				const date = new Date(dateValue);
+				if (!isNaN(date.getTime())) {
+					switch (input.type) {
+						case 'date':
+							input.value = date.toISOString().split('T')[0];
+							break;
+						case 'time':
+							input.value = date.toTimeString().slice(0, 5);
+							break;
+						case 'datetime-local':
+							input.value = date.toISOString().slice(0, 16);
+							break;
+						default:
+							input.value = dateValue;
+					}
+				}
+			} catch (e) {
+				input.value = dateValue;
+			}
+		}
+	}
+
+	/**
+	 * Populate location fields
+	 */
+	populateLocationField(fieldWrapper, fieldName, fieldValue) {
+		if (!fieldValue || typeof fieldValue !== 'object') {
+			return;
+		}
+
+		// Location fields typically have sub-fields
+		const subFields = ['address', 'lat', 'lng', 'street', 'city', 'province', 'postal_code', 'country'];
+
+		subFields.forEach(subField => {
+			if (fieldValue[subField] !== undefined) {
+				const input = fieldWrapper.querySelector(`[name="${fieldName}_${subField}"], [name="${subField}"]`);
+				if (input) {
+					input.value = String(fieldValue[subField] || '');
+				}
+			}
+		});
+	}
+
+
+	/**
+	 * Populate user fields (similar to taxonomy)
+	 */
+	populateUserField(fieldWrapper, fieldName, fieldValue) {
+		// Similar logic to taxonomy fields
+		this.populateTaxonomyField(fieldWrapper, fieldName, fieldValue);
+	}
+
+	/**
+	 * Populate repeater fields
+	 */
+	populateRepeaterField(fieldWrapper, fieldName, fieldValue) {
+		if (!fieldValue || !Array.isArray(fieldValue)) {
+			return;
+		}
+
+		const container = fieldWrapper.querySelector('.repeater-items');
+		const template = fieldWrapper.querySelector('template');
+
+		if (!container || !template) {
+			console.warn(`Repeater field ${fieldName}: missing container or template`);
+			return;
+		}
+
+		// Clear existing rows
+		window.removeChildren(container);
+
+		// Create rows for each data item
+		fieldValue.forEach((rowData, index) => {
+			if (!rowData || typeof rowData !== 'object') {
+				return;
+			}
+
+			const row = window.getTemplate(template.className);
+			if (!row) {
+				console.warn(`Repeater field ${fieldName}: template not found`);
+				return;
+			}
+
+			// Set row ID and update row number
+			row.id = `${fieldWrapper.closest('form').id}-${fieldName}-row-${index}`;
+			row.dataset.index = index;
+
+			const rowNumber = row.querySelector('.row-number');
+			if (rowNumber) {
+				rowNumber.textContent = `#${index + 1}`;
+			}
+
+			// Update field names and populate values
+			row.querySelectorAll('input, select, textarea').forEach(field => {
+				const originalName = field.name;
+				const newName = `${fieldName}:${index}:${originalName}`;
+				const newId = `${fieldName}-${index}-${originalName}-${field.value}`;
+
+				// Update field identifiers
+				field.name = newName;
+				field.id = newId;
+
+				// Update label
+				const label = field.nextElementSibling;
+				if (label && label.tagName === 'LABEL') {
+					label.htmlFor = newId;
+				}
+
+				// Populate field value
+				if (rowData[originalName] !== undefined) {
+					this.populateRepeaterFieldValue(field, originalName, rowData[originalName]);
+				}
+			});
+
+			container.appendChild(row);
+		});
+	}
+
+	/**
+	 * Populate individual repeater field value
+	 */
+	populateRepeaterFieldValue(field, fieldName, fieldValue) {
+		switch (field.type) {
+			case 'checkbox':
+				field.checked = Boolean(fieldValue);
+				break;
+			case 'radio':
+				field.checked = field.value === String(fieldValue);
+				break;
+			case 'select-one':
+			case 'select-multiple':
+				field.value = String(fieldValue || '');
+				break;
+			default:
+				field.value = String(fieldValue || '');
+		}
+	}
 }
 
 // Make available globally

--
Gitblit v1.10.0