From f74af75ec81b2f4492a668217aad1eb927d792fd Mon Sep 17 00:00:00 2001 From: pjaudiomv Date: Mon, 11 May 2026 18:44:01 -0400 Subject: [PATCH] columns --- CHANGELOG.md | 5 +++ README.md | 3 +- packages/module/language/en-GB/mod_crumb.ini | 3 ++ packages/module/mod_crumb.xml | 11 ++++- packages/module/src/Helper/CrumbHelper.php | 5 +++ packages/plugin/crumb.xml | 11 ++++- .../language/en-GB/plg_content_crumb.ini | 3 ++ packages/plugin/src/Extension/Crumb.php | 1 + packages/plugin/src/Helper/CrumbRenderer.php | 4 ++ pkg_crumb.xml | 2 +- tests/Unit/CrumbRendererTest.php | 43 +++++++++++++++++++ 11 files changed, 87 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb2db5..39a92b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +## 0.5.0 (May 11, 2026) + +### Added +- **Columns** field on the content plugin and site module — comma-separated list of columns to show in list view (e.g. `time,name,location,address,service_body`). Omit a name to hide that column. Can be overridden per shortcode on the content plugin via `columns="…"`. + ## 0.4.0 (May 10, 2026) ### Added diff --git a/README.md b/README.md index 83d78dc..d362990 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ By default, the plugin reads its settings (server URL, service body IDs, etc.) f {crumb server="https://bmlt.example.org/main_server" service_body="42" view="map"} ``` -Recognised shortcode args: `server`, `service_body`, `format_ids`, `view` (`list`/`map`), `geolocation` (`true`/`false`), `geolocation_radius`, `update_url`. +Recognised shortcode args: `server`, `service_body`, `format_ids`, `view` (`list`/`map`), `geolocation` (`true`/`false`), `geolocation_radius`, `update_url`, `columns`. ### In a module position (module) @@ -57,6 +57,7 @@ Both the plugin and the module expose the same fields: | **CSS Template** | `Full Width` or `Full Width (Force Viewport)` for breaking out of narrow content areas. | | **Base Path for Pretty URLs** | e.g. `meetings` → `/meetings/monday-night-meeting-42` (History API routing). Empty = hash-based routing. | | **Update Meeting URL** | Optional. URL template for the "Update Meeting Info" link on the meeting detail panel. Tokens: `{meeting_id}`, `{meeting_name}`, `{server_url}`, `{return_url}`. Works with bmlt-workflow, hosted forms, or `mailto:` URLs. | +| **Columns** | Optional. Comma-separated list of columns to show in list view (e.g. `time,name,location,address,service_body`). Omit a name to hide that column. Empty = widget default. | | **Widget Configuration (JSON)** | Advanced. JSON for `CrumbWidgetConfig`. See the [widget docs](https://crumb.bmlt.app/) for the full schema (`darkMode`, `geolocation`, `nowOffset`, `columns`, etc.). | ## Local development diff --git a/packages/module/language/en-GB/mod_crumb.ini b/packages/module/language/en-GB/mod_crumb.ini index a9ed3d1..24915d6 100644 --- a/packages/module/language/en-GB/mod_crumb.ini +++ b/packages/module/language/en-GB/mod_crumb.ini @@ -34,5 +34,8 @@ MOD_CRUMB_FIELD_BASE_PATH_DESC="Optional. The path where the widget lives (e.g. MOD_CRUMB_FIELD_UPDATE_URL_LABEL="Update Meeting URL" MOD_CRUMB_FIELD_UPDATE_URL_DESC="Optional. URL template for the "Update Meeting Info" link shown at the bottom of the meeting detail panel. Supported tokens (URL-encoded on substitution): {meeting_id}, {meeting_name}, {server_url}, {return_url}. Works with bmlt-workflow, any hosted form, or a mailto: URL. Leave empty to hide the link." +MOD_CRUMB_FIELD_COLUMNS_LABEL="Columns" +MOD_CRUMB_FIELD_COLUMNS_DESC="Optional. Comma-separated list of columns to show in list view (e.g. time,name,location,address,service_body). Omit a name to hide that column. Leave empty to use the widget default." + MOD_CRUMB_FIELD_WIDGET_CONFIG_LABEL="Widget Configuration (JSON)" MOD_CRUMB_FIELD_WIDGET_CONFIG_DESC="Optional. CrumbWidgetConfig in JSON format. See https://crumb.bmlt.app/ for available options." diff --git a/packages/module/mod_crumb.xml b/packages/module/mod_crumb.xml index b0f29d9..817f704 100644 --- a/packages/module/mod_crumb.xml +++ b/packages/module/mod_crumb.xml @@ -7,7 +7,7 @@ GPL v2 or later bmlt-enabled@googlegroups.com https://github.com/bmlt-enabled/crumb-joomla - 0.4.0 + 0.5.0 MOD_CRUMB_XML_DESCRIPTION BmltEnabled\Module\Crumb\Site @@ -101,6 +101,15 @@ filter="raw" default="" /> +
(string) $params->get('base_path', ''), 'geolocation_radius' => (string) $params->get('geolocation_radius', ''), 'update_url' => (string) $params->get('update_url', ''), + 'columns' => (string) $params->get('columns', ''), 'widget_config' => (string) $params->get('widget_config', ''), ]; } @@ -61,6 +62,7 @@ public function render(array $settings): string $basePath = trim((string) ($settings['base_path'] ?? ''), '/'); $template = (string) ($settings['css_template'] ?? ''); $updateUrl = trim((string) ($settings['update_url'] ?? '')); + $columns = trim((string) ($settings['columns'] ?? '')); $widgetConf = trim((string) ($settings['widget_config'] ?? '')); $attrs = [ @@ -82,6 +84,9 @@ public function render(array $settings): string if ($updateUrl !== '') { $attrs['data-update-url'] = $updateUrl; } + if ($columns !== '') { + $attrs['data-columns'] = $columns; + } $attrString = ''; foreach ($attrs as $k => $v) { diff --git a/packages/plugin/crumb.xml b/packages/plugin/crumb.xml index 015d5c4..f2692a8 100644 --- a/packages/plugin/crumb.xml +++ b/packages/plugin/crumb.xml @@ -7,7 +7,7 @@ GPL v2 or later bmlt-enabled@googlegroups.com https://github.com/bmlt-enabled/crumb-joomla - 0.4.0 + 0.5.0 PLG_CONTENT_CRUMB_XML_DESCRIPTION BmltEnabled\Plugin\Content\Crumb @@ -100,6 +100,15 @@ filter="raw" default="" /> +
(string) $this->params->get('base_path', ''), 'geolocation_radius' => (string) $this->params->get('geolocation_radius', ''), 'update_url' => (string) $this->params->get('update_url', ''), + 'columns' => (string) $this->params->get('columns', ''), 'widget_config' => (string) $this->params->get('widget_config', ''), ]; diff --git a/packages/plugin/src/Helper/CrumbRenderer.php b/packages/plugin/src/Helper/CrumbRenderer.php index 75e2e88..6fee7c9 100644 --- a/packages/plugin/src/Helper/CrumbRenderer.php +++ b/packages/plugin/src/Helper/CrumbRenderer.php @@ -45,6 +45,7 @@ public static function render(array $settings, array $overrides = []): string $basePath = trim((string) ($settings['base_path'] ?? ''), '/'); $template = (string) ($settings['css_template'] ?? ''); $updateUrl = trim((string) ($overrides['update_url'] ?? $settings['update_url'] ?? '')); + $columns = trim((string) ($overrides['columns'] ?? $settings['columns'] ?? '')); $widgetConf = trim((string) ($settings['widget_config'] ?? '')); $attrs = [ @@ -66,6 +67,9 @@ public static function render(array $settings, array $overrides = []): string if ($updateUrl !== '') { $attrs['data-update-url'] = $updateUrl; } + if ($columns !== '') { + $attrs['data-columns'] = $columns; + } if (isset($overrides['geolocation']) && $overrides['geolocation'] !== null) { $geo = filter_var($overrides['geolocation'], FILTER_VALIDATE_BOOLEAN); $attrs['data-geolocation'] = $geo ? 'true' : 'false'; diff --git a/pkg_crumb.xml b/pkg_crumb.xml index fef8ddd..eb65845 100644 --- a/pkg_crumb.xml +++ b/pkg_crumb.xml @@ -8,7 +8,7 @@ bmlt-enabled@googlegroups.com https://github.com/bmlt-enabled/crumb-joomla crumb - 0.4.0 + 0.5.0 https://github.com/bmlt-enabled/crumb-joomla bmlt-enabled https://github.com/bmlt-enabled diff --git a/tests/Unit/CrumbRendererTest.php b/tests/Unit/CrumbRendererTest.php index cf79099..9875490 100644 --- a/tests/Unit/CrumbRendererTest.php +++ b/tests/Unit/CrumbRendererTest.php @@ -73,6 +73,49 @@ public function testEmptyFormatIdsOverrideOmitsAttribute(): void $this->assertStringNotContainsString('data-format-ids', $output); } + public function testColumnsAttributeEmittedFromSettings(): void + { + $output = CrumbRenderer::render([ + 'server' => 'https://x/main_server', + 'columns' => 'time,name,location,address,service_body', + ]); + $this->assertStringContainsString('data-columns="time,name,location,address,service_body"', $output); + } + + public function testColumnsAttributeOmittedWhenEmpty(): void + { + $output = CrumbRenderer::render(['server' => 'https://x/main_server']); + $this->assertStringNotContainsString('data-columns', $output); + } + + public function testColumnsOverrideBeatsSavedSetting(): void + { + $output = CrumbRenderer::render( + ['server' => 'https://x/main_server', 'columns' => 'time,name'], + ['columns' => 'name,location'] + ); + $this->assertStringContainsString('data-columns="name,location"', $output); + $this->assertStringNotContainsString('data-columns="time,name"', $output); + } + + public function testColumnsOverrideTrimmed(): void + { + $output = CrumbRenderer::render( + ['server' => 'https://x/main_server'], + ['columns' => ' time,name '] + ); + $this->assertStringContainsString('data-columns="time,name"', $output); + } + + public function testEmptyColumnsOverrideOmitsAttribute(): void + { + $output = CrumbRenderer::render( + ['server' => 'https://x/main_server', 'columns' => 'time,name'], + ['columns' => ''] + ); + $this->assertStringNotContainsString('data-columns', $output); + } + public function testInvalidViewIsDroppedNotPassedThrough(): void { $output = CrumbRenderer::render([