Releases: mxmsmnv/Collections
Releases · mxmsmnv/Collections
1.9.5
1.9.4
Added
- User-definable collection groups: the Group control in Configure is now a text input with suggestions for content, taxonomy, custom, plus any custom groups already used by existing collections. Custom group names are sanitized with ProcessWire's name sanitizer and fall back to content when empty.
Changed
- README updated for current collection settings, including custom groups, group name rules, per-collection export toggle, order, related-page search, and the current REST API capability summary.
v1.9.3
1.9.3 — 2026-05-08
Fixed
- Collection default sort direction ignored —
$params->sortDirdefaults to'asc'(a non-empty string), so$params->sortDir ?: $collection->sortDiralways resolved to'asc', never falling through to the configured direction. Fixed by checking$input->get('sort')to distinguish an explicit URL sort from the default, and using collectionsortBy/sortDiras a pair when no URL sort is present. - View icon shown for pages without a template view file — the View action was displayed for any page with a non-empty URL, even when no frontend template file existed, resulting in a 404 on click. Now gated behind
$page->viewable(). - Add button shown when template disallows new pages — the "Add" button appeared regardless of the template's
noParentssetting. AddedcanAddNew()toCollectionwhich returnsfalsewhennoParents = 1(no new pages) ornoParents = -1and a page with that template already exists (singleton).
Added
- Sort indicator in selector note — the
Selector:details block now shows the active sort field and direction inline (e.g.· Sort: created DESC), reflecting either the URL override or the collection default.
v1.9.2
1.9.2 — 2026-05-03
Fixed
FieldtypeDatetime/FieldtypeDateshowing unix timestamp — date fields were only formatted when the column type was explicitly set todatein collection settings. Now auto-detected by$ftNameso any datetime field renders correctly with the configured date format without manual override.created/modifiedsystem fields showing unix timestamp — PW system fieldscreatedandmodifiedwere not handled inrenderCellValue()and fell through to the generic scalar renderer, outputting a raw integer. Now explicitly caught before field lookup and passed throughformatDate().- Filter dropdowns not applying —
fetchTable()incollections.jsusednew URLSearchParams(params).toString()which percent-encodes[and]as%5B%5D. PHP's array parsing requires literal brackets infilter[field]=value, so$input->get('filter')returnednullinstead of an array. Query string is now built manually to keep brackets unencoded. - API log growing unbounded in production — every API request and API key authentication wrote a line to the
collectionslog regardless of environment. Bothlog->save()calls are now gated behind$this->wire('config')->debug, so logs are only written when Tracy / debug mode is active. - Apply button not appearing when typing in search field — the Apply button was only rendered inside the
if (!empty($filterOptions))block, so it was absent from the DOM on collections without filter dropdowns, makingshowApplyBtn()a no-op. Button is now rendered unconditionally (always hidden by default) outside the filters block. - Search input
inputevent never firing —getElementById('collections-search-input')and other direct DOM lookups ran at script parse time, before the DOM was ready (script loaded via$config->scripts->add()in<head>). All DOM-dependent initialisation is now wrapped inDOMContentLoadedhandlers. - Pressing Enter in search field losing active filters — the search form submitted natively, discarding filter dropdown values that were applied via AJAX (hidden inputs in the form are server-rendered and not updated on the client). Form submit is now intercepted and routed through
fetchTable, identical to clicking Apply. - Clear button absent when filters restored from localStorage — the Clear button was PHP-rendered only when
$paramshad active filters, so on a clean page load it was missing from the DOM entirely. It is now always rendered (hidden by default) and shown/hidden via JS alongside the Apply button. - Apply button not shown after localStorage restore —
restoreFilterState()restored UI controls and calledfetchTablebut never calledshowApplyBtn(), leaving the button hidden despite active filters being present.
Added
- Persistent filter state per collection — search query and filter dropdown values are saved to
localStorageundercollections_filters_{col}after every successful table fetch. On page load, if the URL carries no active filters, the saved state is restored and the table is re-fetched automatically. Clicking Clear wipes the saved state so nothing is restored on the next visit.
v1.9.1 — ProFields deep rendering, dot-notation, thumbnail settings
1.9.1 — 2026-04-25
Added
- Thumbnail size setting — Global Settings now has a Width × Height input (32–128 px) for preview thumbnails. Previously hardcoded to 32×32. Value stored in
collections_globalasthumb_width/thumb_height. matrixTypeName()helper — safe internal method for reading the matrix type name from aRepeaterMatrixPage. Falls back to readingrepeater_matrix_typeinteger from the field config when thematrix()hook method is unavailable in the current context.matrixTypeN()helper — companion tomatrixTypeName(), returns the matrix type integer index.resolveRepeater()helper — normalises a Repeater field value that PW returns as an integer page ID into aRepeaterPageArrayby loading the container page and calling->children().- Matrix → Repeater → subfield path — dot-notation now resolves three-segment paths where the middle segment is a Repeater field on a Matrix item rather than a type name (e.g.
media.property_photos.photos). - Combo Checkboxes array support in dot-notation —
renderDotNotationnow resolves array values (multi-select Checkboxes subfields) throughresolveComboOptionLabel()and joins them with,.
Fixed
RepeaterMatrixPageArrayintercepted byinstanceof PageArray—FieldtypeRepeaterMatrixdispatch was placed after the genericPageArraycheck, so matrix fields were rendered as plain page-reference arrays. Matrix branch is now checked first.matrix()hook not callable —method_exists()andhasMethod()both fail for thematrix()hook method onRepeaterMatrixPagein the renderer context. Replaced withmatrixTypeName()helper that catches exceptions and falls back togetUnformatted('repeater_matrix_type').getUnformatted()on RepeaterMatrix returns raw IDs —renderCellValue()andrenderDotNotation()now use$page->get()(formatted) forFieldtypeRepeaterMatrixandFieldtypeRepeaterfields.Pageimagescast to string showing filenames —renderScalarOrObject()now uses fully-qualified\ProcessWire\Pageimage/\ProcessWire\Pageimagesclass names and adds anis_object()trap as final guard.SelectableOptionArrayrendering1instead of label — now explicitly dispatched torenderOptions()before theWireArraycheck.- Array to string warning from non-searchable ProField columns — all non-searchable types (
FieldtypeTable,FieldtypeRepeaterMatrix,FieldtypeCombo, etc.) now excluded frombuildSelector().
Changed
- Sidebar group order — groups now render in fixed order: Content → Taxonomy → Custom. Applies to both the sidebar nav and the dashboard grid.
renderScalarOrObject()— allinstanceofchecks now use fully-qualified\ProcessWire\*class names.
v1.9.0
v1.8.2
Changelog
1.8.2 — 2026-04-09
Changed
- CSS fully migrated to UIkit design system variables — all hardcoded colors replaced with
--pw-*CSS custom properties from AdminThemeUikit. Dark mode now works automatically. Affected variables:--pw-blocks-background,--pw-inputs-background,--pw-border-color,--pw-muted-color,--pw-text-color,--pw-main-background,--pw-error-inline-text-color. All fallback values preserved for environments where variables are not defined.
1.8.1 — 2026-04-07
Fixed
- Default sort not applied on first load —
sortBy/sortDirfrom collection settings were only applied whenper_pagewas absent from URL. Now always applied as fallback when not explicitly set in request params. - Default sort direction ignored —
QueryParams::fromInputreturned'asc'as hardcoded default fordir, preventing collection'ssortDirfrom taking effect. Now returns empty string so collection default wins. - Filter dropdowns not firing — used
querySelectorAllat script load time before DOM was ready. Replaced withdocument.addEventListener('change')event delegation. - Export ignores active filters — export links now include all current
filter[]andqparams. Export links also update dynamically after AJAX table refresh. - Array to string warning —
PageArray::each('id')returns array in PW 3.0.240+. Now explicitly converted to pipe-separated string.
Added
- "Search in related page titles" option per collection — controls whether Page reference columns are automatically included in search. Enabled by default (existing behavior preserved). Can be disabled per collection in Configure.
1.8 — 2026-04-05
Fixed
- Admin hooks not firing —
addCollectionLinkandaddPageListActionhooks moved frominit()toready(), where$pageis fully resolved. Caused "View in Collection" buttons to disappear after module update. - Bulk actions failing with WireCSRFException —
submitBulk()now posts tolocation.pathname + location.searchpreserving?col=key, which was silently dropped before, causing the server to lose collection context. - CSRF token mismatch on bulk/delete — replaced double
getTokenName()/getTokenValue()calls (which could reset the token) with a singlerenderInput()call; token name and value now extracted once server-side and passed to JS. - Quick delete JSON parse error — row-level delete was calling the REST API without auth headers, receiving an HTML 401 response instead of JSON. Now uses the same form POST mechanism as bulk actions.
- API tab redirect after key create/delete — was redirecting to
?configure=1(Collections tab); now redirects to?configure=1#tab-api.
Changed
- Action icons replaced — all FontAwesome icons in the table action column replaced with inline SVG (Heroicons solid + Bootstrap Icons): pencil for edit, eye for view, check-circle/x-circle for status toggle, trash for delete. Fixes invisible icons caused by FontAwesome CSS overriding SVG dimensions.
- Thead styled with
--pw-main-color— table header background uses a 15% tint of the ProcessWire theme color; text and icons use the full theme color. Adapts automatically to any AdminThemeUikit color scheme. - Clickable rows — clicking anywhere on a table row toggles its checkbox. Interactive elements (links, buttons, inputs) are excluded.
- Row selection highlight — selected rows get a
color-mixtint of--pw-main-colorat 8%; hover on selected rows at 13%. sticky_headersetting removed — the sticky header feature was unreliable due to ProcessWire AdminTheme's scroll container blocking CSSposition: sticky. Setting removed from Global Settings UI and defaults.- Configure page icons — View/Edit/Delete text buttons in the collection list replaced with Heroicons SVG icons. API key delete button also updated.
Added
getCsrf()helper incollections.js— reads CSRF token from#collections-csrfhidden input at submit time, used by both bulk form and quick delete.row-selectedCSS class — toggled on<tr>when checkbox is checked/unchecked, including select-all and cancel actions.
1.7 — 2026-03-28
Initial release.
- Configurable collections backed by custom MySQL tables
- Table UI with sortable columns, live search, pagination
- Inline status toggle via AJAX
- Bulk publish / unpublish / delete
- CSV and JSON export
- REST API: list, show, create, update, delete, bulk, schema, export
- API key management with SHA-256 hashing and expiration
- Role-based permissions matrix (global and per-collection)
- Collapsible sidebar with persistent state
- Configuration export / import
- Supports: Text, Textarea, Image, File, Page reference, Options, Checkbox, Color, URL, Email, MapMarker, Profields Table/Textareas/Multiplier
- Integration hooks on page edit and page list
- Cache invalidation on page save/delete
v1.8.1
Changelog
1.8.1 — 2026-04-07
Fixed
- Default sort not applied on first load —
sortBy/sortDirfrom collection settings were only applied whenper_pagewas absent from URL. Now always applied as fallback when not explicitly set in request params. - Default sort direction ignored —
QueryParams::fromInputreturned'asc'as hardcoded default fordir, preventing collection'ssortDirfrom taking effect. Now returns empty string so collection default wins. - Filter dropdowns not firing — used
querySelectorAllat script load time before DOM was ready. Replaced withdocument.addEventListener('change')event delegation. - Export ignores active filters — export links now include all current
filter[]andqparams. Export links also update dynamically after AJAX table refresh. - Array to string warning —
PageArray::each('id')returns array in PW 3.0.240+. Now explicitly converted to pipe-separated string.
Added
- "Search in related page titles" option per collection — controls whether Page reference columns are automatically included in search. Enabled by default (existing behavior preserved). Can be disabled per collection in Configure.
1.8 — 2026-04-05
Fixed
- Admin hooks not firing —
addCollectionLinkandaddPageListActionhooks moved frominit()toready(), where$pageis fully resolved. Caused "View in Collection" buttons to disappear after module update. - Bulk actions failing with WireCSRFException —
submitBulk()now posts tolocation.pathname + location.searchpreserving?col=key, which was silently dropped before, causing the server to lose collection context. - CSRF token mismatch on bulk/delete — replaced double
getTokenName()/getTokenValue()calls (which could reset the token) with a singlerenderInput()call; token name and value now extracted once server-side and passed to JS. - Quick delete JSON parse error — row-level delete was calling the REST API without auth headers, receiving an HTML 401 response instead of JSON. Now uses the same form POST mechanism as bulk actions.
- API tab redirect after key create/delete — was redirecting to
?configure=1(Collections tab); now redirects to?configure=1#tab-api.
Changed
- Action icons replaced — all FontAwesome icons in the table action column replaced with inline SVG (Heroicons solid + Bootstrap Icons): pencil for edit, eye for view, check-circle/x-circle for status toggle, trash for delete. Fixes invisible icons caused by FontAwesome CSS overriding SVG dimensions.
- Thead styled with
--pw-main-color— table header background uses a 15% tint of the ProcessWire theme color; text and icons use the full theme color. Adapts automatically to any AdminThemeUikit color scheme. - Clickable rows — clicking anywhere on a table row toggles its checkbox. Interactive elements (links, buttons, inputs) are excluded.
- Row selection highlight — selected rows get a
color-mixtint of--pw-main-colorat 8%; hover on selected rows at 13%. sticky_headersetting removed — the sticky header feature was unreliable due to ProcessWire AdminTheme's scroll container blocking CSSposition: sticky. Setting removed from Global Settings UI and defaults.- Configure page icons — View/Edit/Delete text buttons in the collection list replaced with Heroicons SVG icons. API key delete button also updated.
Added
getCsrf()helper incollections.js— reads CSRF token from#collections-csrfhidden input at submit time, used by both bulk form and quick delete.row-selectedCSS class — toggled on<tr>when checkbox is checked/unchecked, including select-all and cancel actions.
1.7 — 2026-03-28
Initial release.
- Configurable collections backed by custom MySQL tables
- Table UI with sortable columns, live search, pagination
- Inline status toggle via AJAX
- Bulk publish / unpublish / delete
- CSV and JSON export
- REST API: list, show, create, update, delete, bulk, schema, export
- API key management with SHA-256 hashing and expiration
- Role-based permissions matrix (global and per-collection)
- Collapsible sidebar with persistent state
- Configuration export / import
- Supports: Text, Textarea, Image, File, Page reference, Options, Checkbox, Color, URL, Email, MapMarker, Profields Table/Textareas/Multiplier
- Integration hooks on page edit and page list
- Cache invalidation on page save/delete
v1.8
Changelog
1.8 — 2026-04-05
Fixed
- Admin hooks not firing —
addCollectionLinkandaddPageListActionhooks moved frominit()toready(), where$pageis fully resolved. Caused "View in Collection" buttons to disappear after module update. - Bulk actions failing with WireCSRFException —
submitBulk()now posts tolocation.pathname + location.searchpreserving?col=key, which was silently dropped before, causing the server to lose collection context. - CSRF token mismatch on bulk/delete — replaced double
getTokenName()/getTokenValue()calls (which could reset the token) with a singlerenderInput()call; token name and value now extracted once server-side and passed to JS. - Quick delete JSON parse error — row-level delete was calling the REST API without auth headers, receiving an HTML 401 response instead of JSON. Now uses the same form POST mechanism as bulk actions.
- API tab redirect after key create/delete — was redirecting to
?configure=1(Collections tab); now redirects to?configure=1#tab-api.
Changed
- Action icons replaced — all FontAwesome icons in the table action column replaced with inline SVG (Heroicons solid + Bootstrap Icons): pencil for edit, eye for view, check-circle/x-circle for status toggle, trash for delete. Fixes invisible icons caused by FontAwesome CSS overriding SVG dimensions.
- Thead styled with
--pw-main-color— table header background uses a 15% tint of the ProcessWire theme color; text and icons use the full theme color. Adapts automatically to any AdminThemeUikit color scheme. - Clickable rows — clicking anywhere on a table row toggles its checkbox. Interactive elements (links, buttons, inputs) are excluded.
- Row selection highlight — selected rows get a
color-mixtint of--pw-main-colorat 8%; hover on selected rows at 13%. sticky_headersetting removed — the sticky header feature was unreliable due to ProcessWire AdminTheme's scroll container blocking CSSposition: sticky. Setting removed from Global Settings UI and defaults.- Configure page icons — View/Edit/Delete text buttons in the collection list replaced with Heroicons SVG icons. API key delete button also updated.
Added
getCsrf()helper incollections.js— reads CSRF token from#collections-csrfhidden input at submit time, used by both bulk form and quick delete.row-selectedCSS class — toggled on<tr>when checkbox is checked/unchecked, including select-all and cancel actions.
1.7 — 2026-03-28
Initial release.
- Configurable collections backed by custom MySQL tables
- Table UI with sortable columns, live search, pagination
- Inline status toggle via AJAX
- Bulk publish / unpublish / delete
- CSV and JSON export
- REST API: list, show, create, update, delete, bulk, schema, export
- API key management with SHA-256 hashing and expiration
- Role-based permissions matrix (global and per-collection)
- Collapsible sidebar with persistent state
- Configuration export / import
- Supports: Text, Textarea, Image, File, Page reference, Options, Checkbox, Color, URL, Email, MapMarker, Profields Table/Textareas/Multiplier
- Integration hooks on page edit and page list
- Cache invalidation on page save/delete