From 4089ba01e0881c89a72332e13bc3a80b6bddec2a Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Mon, 29 Jun 2026 22:15:55 +0000
Subject: [PATCH] =DashboardManager overhaul. A bit easier to modify the output of pages. Still have to get the account pages to work as expected, as well as verify the integrations and others are working - but registrar/content pages work as expected. Also fixed up the table generation in CRUD.js and CRUDSkeleton.php

---
 assets/js/concise/CRUD.js |   83 ++++++++++++++++++++---------------------
 1 files changed, 40 insertions(+), 43 deletions(-)

diff --git a/assets/js/concise/CRUD.js b/assets/js/concise/CRUD.js
index 7ee64ff..03ebd98 100644
--- a/assets/js/concise/CRUD.js
+++ b/assets/js/concise/CRUD.js
@@ -131,17 +131,17 @@
 			setup({ el, refs, manyRefs, data }) {
 				baseSetup(el, refs, data);
 
-				manyRefs?.inputs?.forEach(el => {
-					let wrapper = el.closest('[data-field]');
-					window.prefixInput(el, `${data.id}-`, wrapper);
-				});
+				data.prefix = `${data.id}-`;
 
-				manyRefs?.status?.forEach(el => {
-					if (el.value === data.status) {
-						el.checked = true;
-					}
-				});
+				window.jvbPopulate.populate(el, data);
 
+				//
+				// manyRefs?.status?.forEach(el => {
+				// 	if (el.value === data.status) {
+				// 		el.checked = true;
+				// 	}
+				// });
+				//
 				if (crud.isTimeline) {
 					if (refs.sharedRow) {
 						refs.sharedRow.querySelectorAll('input,select,textarea').forEach(input => {
@@ -287,18 +287,20 @@
 					month: 'dialog.date-range .month-select',
 				}
 			},
+			wrap: '#item-wrap',
 			grid: `.${this.content}.item-grid`,
 			table: {
 				nav: '#vertical',
 				form: 'form.table',
 				table: 'form.table table',
-				body: 'form.table body',
+				body: 'form.table tbody',
 				head: 'form.table thead',
 				foot: 'form.table tfoot',
 				selectedColumns: '.all-filters .multi-select',
 				columns: 'thead th',
 			},
 			bulk: {
+				hasEdit: '.bulk-action-select [value="edit"]',
 				action: '.bulk-action-select',
 				count: '.bulk-controls .selected-count',
 				control: '.bulk-controls .bulk-actions',
@@ -479,12 +481,12 @@
 				span: '.bulk-select label span'
 			},
 			wrapper: {
-				wrapper: '.wrap'
+				wrapper: this.selectors.wrap,
 			},
 			item: {
 				idAttribute: 'itemId'
 			}
-		});
+		}, this.ui.views.table !== null);
 		this.selectionHandler.subscribe((event, data) => {
 			this.selected = new Set([...data.selectedItems].map(id => parseInt(id)));
 			this.ui.bulk.control.hidden = this.selected.size === 0;
@@ -619,6 +621,10 @@
 		//current view (defaults to grid)
 		let defaultView = this.container.dataset.view??'grid'
 		this.view = this.cache.get('view')??defaultView;
+
+		if (!this.view) {
+			this.view = defaultView;
+		}
 		if (this.view !== defaultView) {
 			this.ui.views[this.view].checked = true;
 		}
@@ -655,6 +661,7 @@
 		if (this.ui.table.nav && tabDirection === 'vertical') {
 			this.ui.table.nav.checked = true;
 		}
+		this.tabNav = tabDirection !== 'horizontal';
 
 
 
@@ -772,6 +779,9 @@
 		const isBulkAction = e.target.matches('.bulk-action-select');
 		const isView = e.target.matches('[data-view]');
 
+		if (this.view === 'table') {
+			this.handleTableChange(e);
+		}
 		if (!inItem && !isFilter && !isBulkAction && !isView) return;
 
 		if (!this.isPopulating && inItem && !e.target.closest('[data-ignore], .select-item')) {
@@ -795,19 +805,21 @@
 			return;
 		}
 
-		// Table-specific handlers
-		if (this.view === 'table') {
-			if (e.target.matches('details.multi-select')) {
-				this.toggleColumn(e.target.id, e.target.checked);
-				return;
-			}
+	}
+		handleTableChange(e) {
+			// Table-specific handlers
+			if (this.view === 'table') {
+				if (e.target.matches('details.multi-select')) {
+					this.toggleColumn(e.target.id, e.target.checked);
+					return;
+				}
 
-			if (e.target.matches(this.selectors.table.nav)) {
-				this.tabNav = e.target.checked;
-				this.cache.set('tabNav', e.target.checked ? 'vertical' : 'horizontal');
+				if (e.target.matches(this.selectors.table.nav)) {
+					this.tabNav = e.target.checked;
+					this.cache.set('tabNav', e.target.checked ? 'vertical' : 'horizontal');
+				}
 			}
 		}
-	}
 		handleBulkAction(bulkAction) {
 			if (bulkAction.value.startsWith('tax-')) {
 				const selectedOption = bulkAction.options[bulkAction.selectedIndex];
@@ -1218,7 +1230,7 @@
 			// For regular tables, use all rows in tbody
 			if (!this.ui.table.body) return null;
 
-			const rows = Array.from(this.ui.table.body.querySelectorAll('tr'))
+			const rows = Array.from(this.ui.table.body.children)
 				.filter(row => this.isEditableRow(row));
 
 			return goBackward ? rows[rows.length - 1] : rows[0];
@@ -1387,6 +1399,7 @@
 		let operation = {
 			endpoint: this.endpoint,
 			headers: {
+				'X-WP-Nonce': window.auth.getNonce(),
 				'X-Action-Nonce': window.auth.getNonce('dash'),
 			},
 			data: {
@@ -1525,7 +1538,7 @@
 
 		if (on && !this.ui.table.form) {
 			let table = window.jvbTemplates.create('contentTable');
-			this.container.append(table);
+			this.ui.wrap.append(table);
 			this.ui.table = window.uiFromSelectors(this.selectors.table);
 			this.ui.table.columns = this.container.querySelectorAll(this.selectors.table.columns);
 		}
@@ -1579,15 +1592,12 @@
 		this.toggleTable();
 		window.removeChildren(this.ui.grid);
 
+
 		await window.chunkIt(
 			items,
 			(item) => this.renderTableItem(item),
 			(fragment) => {
-				if (this.ui.table.body) {
-					this.ui.table.body.append(fragment);
-				} else {
-					this.ui.table.table.insertBefore(fragment, this.ui.table.foot);
-				}
+				this.ui.table.body.append(fragment);
 			},
 			5
 		);
@@ -1825,20 +1835,7 @@
 	 CLEANUP
 	***************************************************************/
 	resetForm(form) {
-		// Clear text inputs, textareas
-		form.querySelectorAll('input[type="hidden"], input[type="text"], input[type="number"], input[type="email"], input[type="url"], textarea').forEach(input => {
-			input.value = '';
-		});
-
-		// Uncheck checkboxes and radios
-		form.querySelectorAll('input[type="checkbox"], input[type="radio"]').forEach(input => {
-			input.checked = false;
-		});
-
-		// Reset selects to first option
-		form.querySelectorAll('select').forEach(select => {
-			select.selectedIndex = 0;
-		});
+		form.reset();
 
 		// Clear any selected items displays
 		form.querySelectorAll('.selected-items').forEach(container => {

--
Gitblit v1.10.0