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