From 181938ea32cf2c11d10d56018df22586adff7860 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 11 Jan 2026 17:07:14 +0000
Subject: [PATCH] =CRUD.js cleanup, DataStore.js filtering optimization

---
 assets/js/concise/TaxonomySelector.js |   67 +++++++++++++++++++++++++++++++--
 1 files changed, 63 insertions(+), 4 deletions(-)

diff --git a/assets/js/concise/TaxonomySelector.js b/assets/js/concise/TaxonomySelector.js
index 1d84d93..5244f02 100644
--- a/assets/js/concise/TaxonomySelector.js
+++ b/assets/js/concise/TaxonomySelector.js
@@ -411,16 +411,74 @@
 		this.a11y.announce(message);
 	}
 
+	openEmpty(taxonomy, singular, plural, onComplete) {
+		// Store the callback for when modal closes
+		this.emptyCallback = onComplete;
+
+		// Create a temporary "field" for bulk operations
+		const bulkFieldId = `empty-${taxonomy}-${Date.now()}`;
+
+		if (!this.fields.has(bulkFieldId)) {
+			this.fields.set(bulkFieldId, {
+				id: bulkFieldId,
+				taxonomy: taxonomy,
+				singular: singular,
+				plural: plural,
+				canSearch: true,
+				canCreate:  false,
+				hasAutocomplete: false,
+				isFilter: false,
+				isEmpty: true,
+				limit: 0,
+				ui: {},
+				element: null,
+				value: null,
+				toggle: null,
+				checked: true
+			});
+			this.selectedTerms.set(bulkFieldId, new Set());
+		}
+
+		this.setField(bulkFieldId);
+		this.ui.modal.title.textContent = `Add to ${plural}`;
+
+		if (this.ui.search?.container) {
+			this.ui.search.container.hidden = false;
+		}
+
+		window.removeChildren(this.ui.selected);
+		window.removeChildren(this.ui.terms.list);
+
+		this.modal.handleOpen();
+	}
+
 	closeModal() {
 		const field = this.fields.get(this.activeField);
 		if (!field) return;
 		this.observer.unobserve(this.ui.terms.sentinel);
 		window.removeChildren(this.ui.terms.list);
 
-		this.notify('selected-terms', {
-			terms: this.selectedTerms.get(this.activeField),
-			taxonomy: field.taxonomy
-		});
+		if (field.isEmpty  && this.emptyCallback) {
+			const selectedTermIds = Array.from(this.selectedTerms.get(this.activeField) || []);
+			const selectedTerms = selectedTermIds.map(id => this.store.get(id)).filter(Boolean);
+
+			this.emptyCallback({
+				taxonomy: field.taxonomy,
+				termIds: selectedTermIds,
+				terms: selectedTerms
+			});
+
+			// Cleanup temporary bulk field
+			this.fields.delete(this.activeField);
+			this.selectedTerms.delete(this.activeField);
+			this.emptyCallback = null;
+			this.bulkAssignmentTaxonomy = null;
+		} else {
+			this.notify('selected-terms', {
+				terms: this.selectedTerms.get(this.activeField),
+				taxonomy: field.taxonomy
+			});
+		}
 
 		this.activeField = null;
 
@@ -675,6 +733,7 @@
 			.some(term=>term.taxonomy === taxonomy);
 
 		fields.forEach(field => {
+			if (!field.toggle) return;
 			field.toggle.disabled = !hasItems && !field.canCreate;
 			field.toggle.title = !hasItems
 				? `No ${field.singular} available`

--
Gitblit v1.10.0