From 38da7e890ff70eb9b358e2e21707e9d2aace3c46 Mon Sep 17 00:00:00 2001 From: Benjamin Rasmussen Date: Thu, 18 Jan 2024 20:57:49 +0100 Subject: [PATCH 01/94] 'Card grid automatic' paragraph, to embed a filtered view. DDFFORM-127 This is an addition to the 'card grid manual' paragraph, where the editor chooses 1-6 contents. This paragraph allows the editor to choose a content type, to display the latest 6 items. In the future, we will also introduce a tagging system. Ontop of that, the view and preprocess functionality has been made general enough to easily add other view styles and filters. --- ....paragraph.card_grid_automatic.default.yml | 30 ++++ ....paragraph.card_grid_automatic.default.yml | 17 ++ ....paragraph.card_grid_automatic.preview.yml | 32 ++++ config/sync/core.extension.yml | 1 + ...d_automatic.field_filter_content_types.yml | 26 +++ ...agraph.card_grid_automatic.field_title.yml | 19 ++ ...e.paragraph.field_filter_content_types.yml | 20 +++ ...hs.paragraphs_type.card_grid_automatic.yml | 12 ++ config/sync/views.view.content_paragraphs.yml | 168 ++++++++++++++++++ .../dpl_filter_paragraphs.info.yml | 5 + .../dpl_filter_paragraphs.module | 115 ++++++++++++ ...d--content-paragraphs--card-grid.html.twig | 6 + 12 files changed, 451 insertions(+) create mode 100644 config/sync/core.entity_form_display.paragraph.card_grid_automatic.default.yml create mode 100644 config/sync/core.entity_view_display.paragraph.card_grid_automatic.default.yml create mode 100644 config/sync/core.entity_view_display.paragraph.card_grid_automatic.preview.yml create mode 100644 config/sync/field.field.paragraph.card_grid_automatic.field_filter_content_types.yml create mode 100644 config/sync/field.field.paragraph.card_grid_automatic.field_title.yml create mode 100644 config/sync/field.storage.paragraph.field_filter_content_types.yml create mode 100644 config/sync/paragraphs.paragraphs_type.card_grid_automatic.yml create mode 100644 config/sync/views.view.content_paragraphs.yml create mode 100644 web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.info.yml create mode 100644 web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.module create mode 100644 web/themes/custom/novel/templates/views/views-view-unformatted--content-paragraphs--card-grid.html.twig diff --git a/config/sync/core.entity_form_display.paragraph.card_grid_automatic.default.yml b/config/sync/core.entity_form_display.paragraph.card_grid_automatic.default.yml new file mode 100644 index 000000000..c7dff7df3 --- /dev/null +++ b/config/sync/core.entity_form_display.paragraph.card_grid_automatic.default.yml @@ -0,0 +1,30 @@ +uuid: 23a6b999-5184-4d4e-beb1-29752b66ce08 +langcode: en +status: true +dependencies: + config: + - field.field.paragraph.card_grid_automatic.field_filter_content_types + - field.field.paragraph.card_grid_automatic.field_title + - paragraphs.paragraphs_type.card_grid_automatic +id: paragraph.card_grid_automatic.default +targetEntityType: paragraph +bundle: card_grid_automatic +mode: default +content: + field_filter_content_types: + type: options_buttons + weight: 1 + region: content + settings: { } + third_party_settings: { } + field_title: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } +hidden: + created: true + status: true diff --git a/config/sync/core.entity_view_display.paragraph.card_grid_automatic.default.yml b/config/sync/core.entity_view_display.paragraph.card_grid_automatic.default.yml new file mode 100644 index 000000000..6c61b547b --- /dev/null +++ b/config/sync/core.entity_view_display.paragraph.card_grid_automatic.default.yml @@ -0,0 +1,17 @@ +uuid: ed5598e5-ef61-49bc-a7cc-31031cdb5662 +langcode: en +status: true +dependencies: + config: + - field.field.paragraph.card_grid_automatic.field_filter_content_types + - field.field.paragraph.card_grid_automatic.field_title + - paragraphs.paragraphs_type.card_grid_automatic +id: paragraph.card_grid_automatic.default +targetEntityType: paragraph +bundle: card_grid_automatic +mode: default +content: { } +hidden: + field_filter_content_types: true + field_title: true + search_api_excerpt: true diff --git a/config/sync/core.entity_view_display.paragraph.card_grid_automatic.preview.yml b/config/sync/core.entity_view_display.paragraph.card_grid_automatic.preview.yml new file mode 100644 index 000000000..a50ef1b75 --- /dev/null +++ b/config/sync/core.entity_view_display.paragraph.card_grid_automatic.preview.yml @@ -0,0 +1,32 @@ +uuid: 880f303e-0fe4-4b17-b679-d3938dd672b6 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.paragraph.preview + - field.field.paragraph.card_grid_automatic.field_filter_content_types + - field.field.paragraph.card_grid_automatic.field_title + - paragraphs.paragraphs_type.card_grid_automatic +id: paragraph.card_grid_automatic.preview +targetEntityType: paragraph +bundle: card_grid_automatic +mode: preview +content: + field_filter_content_types: + type: entity_reference_label + label: above + settings: + link: false + third_party_settings: { } + weight: 1 + region: content + field_title: + type: string + label: above + settings: + link_to_entity: false + third_party_settings: { } + weight: 0 + region: content +hidden: + search_api_excerpt: true diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 94701d651..4763d4bd1 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -22,6 +22,7 @@ module: dpl_favorites_list_material_component: 0 dpl_fbs: 0 dpl_fees: 0 + dpl_filter_paragraphs: 0 dpl_instant_loan: 0 dpl_library_agency: 0 dpl_library_token: 0 diff --git a/config/sync/field.field.paragraph.card_grid_automatic.field_filter_content_types.yml b/config/sync/field.field.paragraph.card_grid_automatic.field_filter_content_types.yml new file mode 100644 index 000000000..dfefab630 --- /dev/null +++ b/config/sync/field.field.paragraph.card_grid_automatic.field_filter_content_types.yml @@ -0,0 +1,26 @@ +uuid: 070e2d4f-36f1-43e2-b129-56afe6699df1 +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_filter_content_types + - node.type.article + - paragraphs.paragraphs_type.card_grid_automatic +id: paragraph.card_grid_automatic.field_filter_content_types +field_name: field_filter_content_types +entity_type: paragraph +bundle: card_grid_automatic +label: 'Filter: Content types' +description: '' +required: false +translatable: false +default_value: + - + target_uuid: 75ad5a84-0836-49cf-be2e-e4d2cdd3916a +default_value_callback: '' +settings: + handler: 'default:node_type' + handler_settings: + target_bundles: null + auto_create: false +field_type: entity_reference diff --git a/config/sync/field.field.paragraph.card_grid_automatic.field_title.yml b/config/sync/field.field.paragraph.card_grid_automatic.field_title.yml new file mode 100644 index 000000000..7d2320186 --- /dev/null +++ b/config/sync/field.field.paragraph.card_grid_automatic.field_title.yml @@ -0,0 +1,19 @@ +uuid: df3f14cc-21a3-489f-be24-455ddb85f99d +langcode: en +status: true +dependencies: + config: + - field.storage.paragraph.field_title + - paragraphs.paragraphs_type.card_grid_automatic +id: paragraph.card_grid_automatic.field_title +field_name: field_title +entity_type: paragraph +bundle: card_grid_automatic +label: Title +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: string diff --git a/config/sync/field.storage.paragraph.field_filter_content_types.yml b/config/sync/field.storage.paragraph.field_filter_content_types.yml new file mode 100644 index 000000000..22e06f50c --- /dev/null +++ b/config/sync/field.storage.paragraph.field_filter_content_types.yml @@ -0,0 +1,20 @@ +uuid: ada606b2-ee0b-411e-b9b4-0c9216d0a19a +langcode: en +status: true +dependencies: + module: + - node + - paragraphs +id: paragraph.field_filter_content_types +field_name: field_filter_content_types +entity_type: paragraph +type: entity_reference +settings: + target_type: node_type +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/paragraphs.paragraphs_type.card_grid_automatic.yml b/config/sync/paragraphs.paragraphs_type.card_grid_automatic.yml new file mode 100644 index 000000000..cd8c9707f --- /dev/null +++ b/config/sync/paragraphs.paragraphs_type.card_grid_automatic.yml @@ -0,0 +1,12 @@ +uuid: 2659faf8-0efb-4e50-8c52-34888e65a944 +langcode: en +status: true +dependencies: + content: + - 'file:file:400e6cd7-b548-4e63-bae4-15beeaeaa76a' +id: card_grid_automatic +label: 'Card grid - automatic' +icon_uuid: 400e6cd7-b548-4e63-bae4-15beeaeaa76a +icon_default: 'data:image/jpeg;base64,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' +description: '' +behavior_plugins: { } diff --git a/config/sync/views.view.content_paragraphs.yml b/config/sync/views.view.content_paragraphs.yml new file mode 100644 index 000000000..5b6df4c3d --- /dev/null +++ b/config/sync/views.view.content_paragraphs.yml @@ -0,0 +1,168 @@ +uuid: 66163bca-af6b-4db4-b820-3579418763ea +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.card + module: + - node + - user +id: content_paragraphs +label: 'Content lists, embedded in Paragraphs' +module: views +description: 'Lists for displaying content, through embedded views in paragraphs. Also allows the editor to set filter options in the paragraphs, that will be sent along using contextual filters. See dpl_filter_paragraphs.module' +tag: '' +base_table: node_field_data +base_field: nid +display: + default: + id: default + display_title: Default + display_plugin: default + position: 0 + display_options: + title: '' + fields: + title: + id: title + table: node_field_data + field: title + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: title + plugin_id: field + label: '' + exclude: false + alter: + alter_text: false + make_link: false + absolute: false + word_boundary: false + ellipsis: false + strip_tags: false + trim: false + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + pager: + type: some + options: + offset: 0 + items_per_page: 6 + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + options: { } + empty: { } + sorts: + created: + id: created + table: node_field_data + field: created + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: created + plugin_id: date + order: DESC + expose: + label: '' + field_identifier: '' + exposed: false + granularity: second + arguments: { } + filters: + status: + id: status + table: node_field_data + field: status + entity_type: node + entity_field: status + plugin_id: boolean + value: '1' + group: 1 + expose: + operator: '' + style: + type: default + row: + type: 'entity:node' + options: + relationship: none + view_mode: card + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + relationships: { } + header: { } + footer: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - 'user.node_grants:view' + - user.permissions + tags: { } + card_grid: + id: card_grid + display_title: 'Card grid' + display_plugin: block + position: 1 + display_options: + display_description: '' + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - 'user.node_grants:view' + - user.permissions + tags: { } diff --git a/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.info.yml b/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.info.yml new file mode 100644 index 000000000..80cd10804 --- /dev/null +++ b/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.info.yml @@ -0,0 +1,5 @@ +name: "DPL Filtered Paragraphs" +type: module +description: "Filtered paragraphs, embedding views." +package: "DPL" +core_version_requirement: ^10 diff --git a/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.module b/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.module new file mode 100644 index 000000000..b32f7ab99 --- /dev/null +++ b/web/modules/custom/dpl_filter_paragraphs/dpl_filter_paragraphs.module @@ -0,0 +1,115 @@ + $variables + * See the $variables in theme_preprocess_paragraph__NAME(). + * + * @return array + * See the $variables in theme_preprocess_paragraph__NAME(). + */ +function _dpl_filter_paragraphs_prepare_filter_view(array $variables, string $item_view_mode): array { + // In the preview (AKA backend view), we don't want to load in the whole view. + if ($variables['view_mode'] === 'preview') { + return $variables; + } + + // Drupal will cache the whole paragraph, as it does not know that it is + // embedding a view. We'll add a simple cache tag to the paragraph, so it + // be invalidated if any nodes have been updated - e.g. the same kind of + // cache tag that the view has. + $variables['#cache']['tags'][] = 'node_list'; + + $paragraph = $variables['paragraph'] ?? NULL; + + if (!($paragraph instanceof Paragraph)) { + return $variables; + } + + $view = Views::getView('content_paragraphs'); + if (!$view instanceof ViewExecutable) { + return $variables; + } + + $view->setDisplay($item_view_mode); + + // The order of this list must be identical to the order of the contextual + // filters in the view! + $filters = [ + 'field_filter_content_types', + ]; + + $arguments = []; + + // Looping through our paragraph field filters, and setting any values + // as contextual values for the view. + foreach ($filters as $filter_name) { + // If the paragraph has no matching field, we'll just set the value to + // all. THIS IS IMPORTANT, as otherwise there will be a mismatch between + // the contextual filters and the keys. + if (!$paragraph->hasField($filter_name)) { + $arguments[] = 'all'; + + continue; + } + + $field = $paragraph->get($filter_name); + $filter_value = $field->getString(); + $filter_value = !empty($filter_value) ? $filter_value : 'all'; + + // getString() gets values as comma seperated. + // We want it to be seperated with + instead, to show view that it's + // OR instead of AND. + $filter_value = str_replace(', ', '+', $filter_value); + + $arguments[] = $filter_value; + } + + // Argument = Contextual filters. + $view->setArguments($arguments); + + // Making a unique cache key, based on the chosen arguments. + // We need a unique cache key, as the view is getting embedded, and Drupal + // does not understand that different contextual filters should result in + // different caching. + $cache_key = "filter_paragraphs_{$item_view_mode}:" . md5(serialize($arguments)); + + $view->element['#cache'] = NestedArray::mergeDeep($view->element['#cache'], [ + 'keys' => [$cache_key], + ]); + + $view->execute(); + + if ($paragraph->hasField('field_title')) { + // Replacing the view title with our custom paragraph field_title. + $paragraph_title = $paragraph->get('field_title')->getString(); + + $view->setTitle($paragraph_title); + } + + $variables['content']['view'] = $view->buildRenderable($item_view_mode); + + return $variables; +} diff --git a/web/themes/custom/novel/templates/views/views-view-unformatted--content-paragraphs--card-grid.html.twig b/web/themes/custom/novel/templates/views/views-view-unformatted--content-paragraphs--card-grid.html.twig new file mode 100644 index 000000000..c1458867f --- /dev/null +++ b/web/themes/custom/novel/templates/views/views-view-unformatted--content-paragraphs--card-grid.html.twig @@ -0,0 +1,6 @@ +{% include '@novel/components/card-grid.html.twig' + with { + 'attributes': attributes, + 'title': view.getTitle(), + 'items': rows, +} only %} From ccfe2593557929488638c40b24528d9a59036e4a Mon Sep 17 00:00:00 2001 From: Benjamin Rasmussen Date: Mon, 22 Jan 2024 18:57:35 +0100 Subject: [PATCH 02/94] Set start date as a default date for end date input fields. DDFFORM-171 --- .../custom/dpl_admin/assets/dpl_admin.js | 39 +++++++++++++++++++ .../custom/dpl_admin/dpl_admin.libraries.yml | 2 + 2 files changed, 41 insertions(+) create mode 100644 web/modules/custom/dpl_admin/assets/dpl_admin.js diff --git a/web/modules/custom/dpl_admin/assets/dpl_admin.js b/web/modules/custom/dpl_admin/assets/dpl_admin.js new file mode 100644 index 000000000..d83052fbf --- /dev/null +++ b/web/modules/custom/dpl_admin/assets/dpl_admin.js @@ -0,0 +1,39 @@ +Drupal.behaviors.dpl_admin = { + // eslint-disable-next-line no-unused-vars + attach(context, settings) { + const that = this; + + const dateTimeFields = context.querySelectorAll( + '[type="date"][name$="[value][date]"]:not(.is-dpl-admin-range-initialized),' + + '[type="time"][name$="[value][time]"]:not(.is-dpl-admin-range-initialized)' + ); + + dateTimeFields.forEach((input) => { + input.classList.add("is-dpl-admin-range-initialized"); + that.dateRangeInit(input, context); + }); + }, + + // Set the start date as a default date for end date input fields. + dateRangeInit(input, context) { + const name = input.getAttribute("name"); + + if (!name) { + return; + } + + // Create the name of the end date element based on the name of the start date element + const endValueName = name.replace("[value]", "[end_value]"); + input.addEventListener("change", () => { + // Recurring events/Drupal appears to insert the end value input using + // AJAX after altering the start value, despite the input already + // existing. We cant really listen for that, so we'll do a poor-mans + // event listener: waiting a second, and then looking up for the end + // value input. + setTimeout(() => { + const endValueInput = context.querySelector(`[name="${endValueName}"]`); + endValueInput.value = endValueInput.value || input.value; + }, 1000); + }); + }, +}; diff --git a/web/modules/custom/dpl_admin/dpl_admin.libraries.yml b/web/modules/custom/dpl_admin/dpl_admin.libraries.yml index edb945b7b..920cc83ae 100644 --- a/web/modules/custom/dpl_admin/dpl_admin.libraries.yml +++ b/web/modules/custom/dpl_admin/dpl_admin.libraries.yml @@ -2,3 +2,5 @@ base: css: theme: assets/dpl_admin.css: {} + js: + assets/dpl_admin.js: {} From 14279a084fb7a5a8f58307404d4eb5ea82b0c2cd Mon Sep 17 00:00:00 2001 From: Benjamin Rasmussen Date: Mon, 22 Jan 2024 19:03:07 +0100 Subject: [PATCH 03/94] Fix PHPCS issues. --- .../custom/dpl_fees/src/Form/FeesListSettingsForm.php | 2 ++ .../dpl_library_agency/src/Form/ListSizeSettingsForm.php | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/web/modules/custom/dpl_fees/src/Form/FeesListSettingsForm.php b/web/modules/custom/dpl_fees/src/Form/FeesListSettingsForm.php index 734c0d311..19b7d56cd 100644 --- a/web/modules/custom/dpl_fees/src/Form/FeesListSettingsForm.php +++ b/web/modules/custom/dpl_fees/src/Form/FeesListSettingsForm.php @@ -21,6 +21,8 @@ class FeesListSettingsForm extends ConfigFormBase { * The factory for configuration objects. * @param \Drupal\dpl_react\DplReactConfigInterface $configService * The instant loan config service. + * @param \Drupal\dpl_fees\DplFeesSettings $feesSettings + * The DPL fee settings. */ public function __construct( ConfigFactoryInterface $config_factory, diff --git a/web/modules/custom/dpl_library_agency/src/Form/ListSizeSettingsForm.php b/web/modules/custom/dpl_library_agency/src/Form/ListSizeSettingsForm.php index f3eaf2d8d..6151d39ce 100644 --- a/web/modules/custom/dpl_library_agency/src/Form/ListSizeSettingsForm.php +++ b/web/modules/custom/dpl_library_agency/src/Form/ListSizeSettingsForm.php @@ -54,13 +54,6 @@ public function getFormId(): string { return 'dpl_library_agency_list_size_settings_form'; } - /** - * {@inheritdoc} - */ - public function buildForm(array $form, FormStateInterface $form_state): array { - return parent::buildForm($form, $form_state); - } - /** * {@inheritdoc} */ @@ -70,4 +63,3 @@ public function submitForm(array &$form, FormStateInterface $form_state): void { } } - From 0787b5cd1df1a2ecc7d4cf67c745fb40646f6b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Tue, 23 Jan 2024 09:00:40 +0100 Subject: [PATCH 04/94] Use release 2024.6.0 branch of design system and react components --- composer.json | 12 ++++++------ composer.lock | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index 91f0ddf66..251f0c56e 100644 --- a/composer.json +++ b/composer.json @@ -36,10 +36,10 @@ "type": "package", "package": { "name": "danskernesdigitalebibliotek/dpl-react", - "version": "2024.4.0", + "version": "2024.6.0-rc1", "type": "drupal-library", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.4.0/dist-2024-4-0-78d8f3aa13df3978fbf234e421fb3c79a97efa97.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip", "type": "zip" }, "require": { @@ -52,9 +52,9 @@ "package": { "name": "danskernesdigitalebibliotek/dpl-design-system", "type": "drupal-library", - "version": "2024.4.0", + "version": "2024.6.0-rc1", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.4.0/dist-2024-4-0-174d424951b2cc03e92bd2522b707f59226e8f12.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip", "type": "zip" } } @@ -74,8 +74,8 @@ "brick/math": "^0.12.1", "composer/installers": "1.12.0", "cweagans/composer-patches": "1.7.3", - "danskernesdigitalebibliotek/dpl-design-system": "2024.4.0", - "danskernesdigitalebibliotek/dpl-react": "2024.4.0", + "danskernesdigitalebibliotek/dpl-design-system": "2024.6.0-rc1", + "danskernesdigitalebibliotek/dpl-react": "2024.6.0-rc1", "danskernesdigitalebibliotek/fbs-client": "*", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", "deoliveiralucas/array-keys-case-transform": "^1.1", diff --git a/composer.lock b/composer.lock index c7d1dfb58..b56209027 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "31a5bcdd96dc9a1258df9e764844e132", + "content-hash": "c73dcf69315148852dd966cab6a96793", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -1099,19 +1099,19 @@ }, { "name": "danskernesdigitalebibliotek/dpl-design-system", - "version": "2024.4.0", + "version": "2024.6.0-rc1", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/2024.4.0/dist-2024-4-0-174d424951b2cc03e92bd2522b707f59226e8f12.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip" }, "type": "drupal-library" }, { "name": "danskernesdigitalebibliotek/dpl-react", - "version": "2024.4.0", + "version": "2024.6.0-rc1", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/2024.4.0/dist-2024-4-0-78d8f3aa13df3978fbf234e421fb3c79a97efa97.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-react/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip" }, "require": { "composer/installers": "^1.2.0" From 1a8f7012eec6fdb0a0cc9364a4c4296ee27a9f13 Mon Sep 17 00:00:00 2001 From: Kasper Birch Date: Tue, 23 Jan 2024 09:28:40 +0100 Subject: [PATCH 05/94] Correct variable name for ticket price in 'event' The variable for ticket price in the 'event' was incorrectly named. --- .../custom/novel/templates/layout/eventinstance--full.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig index 3d43c6af0..0d0fb5c3c 100644 --- a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig @@ -6,7 +6,7 @@ }, { label: "Price"|trans, - value: content.ticket_categories.0 ? content.ticket_categories : null + value: content.event_ticket_categories.0 ? content.event_ticket_categories : null }, { label: "Place"|trans, From 896cb9d976dbe0daff9e9d89f1d28e355a6a993e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 13:35:03 +0100 Subject: [PATCH 06/94] Add categories taxonomy This it the result of enabling the taxonomy module and creating a new Categories taxonomy. Default settings are used except for the fact that language is set to Danish for the taxonomy and terms. This should mirror settings on content types as well. --- ...re.entity_view_mode.taxonomy_term.full.yml | 12 + config/sync/core.extension.yml | 1 + ...tent_settings.taxonomy_term.categories.yml | 11 + ...re.entity_view_mode.taxonomy_term.full.yml | 1 + ...em.action.taxonomy_term_publish_action.yml | 1 + ....action.taxonomy_term_unpublish_action.yml | 1 + config/sync/language/da/views.view.files.yml | 2 + .../language/da/views.view.taxonomy_term.yml | 31 ++ .../da/views.view.user_admin_people.yml | 3 + ...em.action.taxonomy_term_publish_action.yml | 13 + ....action.taxonomy_term_unpublish_action.yml | 13 + config/sync/taxonomy.settings.yml | 5 + .../sync/taxonomy.vocabulary.categories.yml | 8 + config/sync/views.view.taxonomy_term.yml | 319 ++++++++++++++++++ 14 files changed, 421 insertions(+) create mode 100644 config/sync/core.entity_view_mode.taxonomy_term.full.yml create mode 100644 config/sync/language.content_settings.taxonomy_term.categories.yml create mode 100644 config/sync/language/da/core.entity_view_mode.taxonomy_term.full.yml create mode 100644 config/sync/language/da/system.action.taxonomy_term_publish_action.yml create mode 100644 config/sync/language/da/system.action.taxonomy_term_unpublish_action.yml create mode 100644 config/sync/language/da/views.view.taxonomy_term.yml create mode 100644 config/sync/system.action.taxonomy_term_publish_action.yml create mode 100644 config/sync/system.action.taxonomy_term_unpublish_action.yml create mode 100644 config/sync/taxonomy.settings.yml create mode 100644 config/sync/taxonomy.vocabulary.categories.yml create mode 100644 config/sync/views.view.taxonomy_term.yml diff --git a/config/sync/core.entity_view_mode.taxonomy_term.full.yml b/config/sync/core.entity_view_mode.taxonomy_term.full.yml new file mode 100644 index 000000000..10b5d4246 --- /dev/null +++ b/config/sync/core.entity_view_mode.taxonomy_term.full.yml @@ -0,0 +1,12 @@ +uuid: 74546f26-4349-474c-9c4b-51da95efac42 +langcode: en +status: true +dependencies: + module: + - taxonomy +_core: + default_config_hash: '-PPKjsNQPvoIDjOuUAvlLocYD976MNjb9Zpgyz5_BWE' +id: taxonomy_term.full +label: 'Taxonomy term page' +targetEntityType: taxonomy_term +cache: true diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 4763d4bd1..5eb5fe587 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -91,6 +91,7 @@ module: search_api_db: 0 serialization: 0 system: 0 + taxonomy: 0 text: 0 token: 0 toolbar: 0 diff --git a/config/sync/language.content_settings.taxonomy_term.categories.yml b/config/sync/language.content_settings.taxonomy_term.categories.yml new file mode 100644 index 000000000..75425a948 --- /dev/null +++ b/config/sync/language.content_settings.taxonomy_term.categories.yml @@ -0,0 +1,11 @@ +uuid: 6b95d1de-4ed2-413a-8acc-b4dfae14b83a +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.categories +id: taxonomy_term.categories +target_entity_type_id: taxonomy_term +target_bundle: categories +default_langcode: da +language_alterable: false diff --git a/config/sync/language/da/core.entity_view_mode.taxonomy_term.full.yml b/config/sync/language/da/core.entity_view_mode.taxonomy_term.full.yml new file mode 100644 index 000000000..cf47df22a --- /dev/null +++ b/config/sync/language/da/core.entity_view_mode.taxonomy_term.full.yml @@ -0,0 +1 @@ +label: Termside diff --git a/config/sync/language/da/system.action.taxonomy_term_publish_action.yml b/config/sync/language/da/system.action.taxonomy_term_publish_action.yml new file mode 100644 index 000000000..4f414fd64 --- /dev/null +++ b/config/sync/language/da/system.action.taxonomy_term_publish_action.yml @@ -0,0 +1 @@ +label: 'Publicér taksonomiterm' diff --git a/config/sync/language/da/system.action.taxonomy_term_unpublish_action.yml b/config/sync/language/da/system.action.taxonomy_term_unpublish_action.yml new file mode 100644 index 000000000..3531faf7b --- /dev/null +++ b/config/sync/language/da/system.action.taxonomy_term_unpublish_action.yml @@ -0,0 +1 @@ +label: 'Afpublicér taksonomiterm' diff --git a/config/sync/language/da/views.view.files.yml b/config/sync/language/da/views.view.files.yml index dc8d5af6a..7340b01b0 100644 --- a/config/sync/language/da/views.view.files.yml +++ b/config/sync/language/da/views.view.files.yml @@ -26,6 +26,8 @@ display: label: Ændringsdato count: label: 'Brugt i' + alter: + path: 'admin/content/files/usage/{{ fid }}' pager: options: tags: diff --git a/config/sync/language/da/views.view.taxonomy_term.yml b/config/sync/language/da/views.view.taxonomy_term.yml new file mode 100644 index 000000000..afc2da253 --- /dev/null +++ b/config/sync/language/da/views.view.taxonomy_term.yml @@ -0,0 +1,31 @@ +label: 'Ord i ordforråd' +description: 'Indhold som er knyttet til en bestemt term.' +display: + default: + display_title: Standard + display_options: + pager: + options: + tags: + next: ›› + previous: ‹‹ + expose: + items_per_page_label: 'Antal elementer' + items_per_page_options_all_label: '- Alle -' + offset_label: Forskydning + exposed_form: + options: + submit_button: Udfør + reset_button_label: Gendan + exposed_sorts_label: 'Sortér efter' + sort_asc_label: Stigende + sort_desc_label: Faldende + arguments: + tid: + exception: + title: Alle + title: '{{ arguments.tid }}' + feed_1: + display_title: Feed + page_1: + display_title: Side diff --git a/config/sync/language/da/views.view.user_admin_people.yml b/config/sync/language/da/views.view.user_admin_people.yml index ac915a165..b0fc53896 100644 --- a/config/sync/language/da/views.view.user_admin_people.yml +++ b/config/sync/language/da/views.view.user_admin_people.yml @@ -19,6 +19,9 @@ display: label: Roller created: label: 'Medlem i' + settings: + future_format: '@interval' + past_format: '@interval' access: label: 'Seneste tilgang' settings: diff --git a/config/sync/system.action.taxonomy_term_publish_action.yml b/config/sync/system.action.taxonomy_term_publish_action.yml new file mode 100644 index 000000000..95943cff8 --- /dev/null +++ b/config/sync/system.action.taxonomy_term_publish_action.yml @@ -0,0 +1,13 @@ +uuid: 5b13b8a5-89fc-40ae-b5ca-3f13f8143df0 +langcode: en +status: true +dependencies: + module: + - taxonomy +_core: + default_config_hash: DoVt_VGgVLcDD4XmVbSFzr0K17SJy9imFiYusKkJBgY +id: taxonomy_term_publish_action +label: 'Publish taxonomy term' +type: taxonomy_term +plugin: 'entity:publish_action:taxonomy_term' +configuration: { } diff --git a/config/sync/system.action.taxonomy_term_unpublish_action.yml b/config/sync/system.action.taxonomy_term_unpublish_action.yml new file mode 100644 index 000000000..e2fb240ef --- /dev/null +++ b/config/sync/system.action.taxonomy_term_unpublish_action.yml @@ -0,0 +1,13 @@ +uuid: 86663dc2-6f75-4b6a-b87d-039c0e495ced +langcode: en +status: true +dependencies: + module: + - taxonomy +_core: + default_config_hash: z2sNRM3ECa7FPCGnSNje_9SmZJQgwhD_6fG_L4Mr8zI +id: taxonomy_term_unpublish_action +label: 'Unpublish taxonomy term' +type: taxonomy_term +plugin: 'entity:unpublish_action:taxonomy_term' +configuration: { } diff --git a/config/sync/taxonomy.settings.yml b/config/sync/taxonomy.settings.yml new file mode 100644 index 000000000..0e3837de0 --- /dev/null +++ b/config/sync/taxonomy.settings.yml @@ -0,0 +1,5 @@ +_core: + default_config_hash: zKpaWT6cJc1tVQQaTqatGELaCqU_oyRym6zTl27Yias +maintain_index_table: true +override_selector: false +terms_per_page_admin: 100 diff --git a/config/sync/taxonomy.vocabulary.categories.yml b/config/sync/taxonomy.vocabulary.categories.yml new file mode 100644 index 000000000..4e1d0f257 --- /dev/null +++ b/config/sync/taxonomy.vocabulary.categories.yml @@ -0,0 +1,8 @@ +uuid: 6385cad1-f8f0-49b8-aaaa-37071747d8b3 +langcode: da +status: true +dependencies: { } +name: Categories +vid: categories +description: '' +weight: 0 diff --git a/config/sync/views.view.taxonomy_term.yml b/config/sync/views.view.taxonomy_term.yml new file mode 100644 index 000000000..fa13afacb --- /dev/null +++ b/config/sync/views.view.taxonomy_term.yml @@ -0,0 +1,319 @@ +uuid: 9b29782a-38f2-4315-a98f-ef2411a98425 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.teaser + module: + - node + - taxonomy + - user +_core: + default_config_hash: YKgw0f77GEmCu6_6Om9Mbig0mON9JdfVuMxTtd0WQaI +id: taxonomy_term +label: 'Taxonomy term' +module: taxonomy +description: 'Content belonging to a certain taxonomy term.' +tag: default +base_table: node_field_data +base_field: nid +display: + default: + id: default + display_title: Default + display_plugin: default + position: 0 + display_options: + fields: { } + pager: + type: mini + options: + offset: 0 + items_per_page: 10 + total_pages: 0 + id: 0 + tags: + next: ›› + previous: ‹‹ + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + exposed_form: + type: basic + options: + submit_button: Apply + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + options: { } + empty: { } + sorts: + sticky: + id: sticky + table: taxonomy_index + field: sticky + relationship: none + group_type: group + admin_label: '' + plugin_id: standard + order: DESC + expose: + label: '' + field_identifier: sticky + exposed: false + created: + id: created + table: taxonomy_index + field: created + relationship: none + group_type: group + admin_label: '' + plugin_id: date + order: DESC + expose: + label: '' + field_identifier: created + exposed: false + granularity: second + arguments: + tid: + id: tid + table: taxonomy_index + field: tid + relationship: none + group_type: group + admin_label: '' + plugin_id: taxonomy_index_tid + default_action: 'not found' + exception: + value: '' + title_enable: false + title: All + title_enable: true + title: '{{ arguments.tid }}' + default_argument_type: fixed + default_argument_options: + argument: '' + default_argument_skip_url: false + summary_options: + base_path: '' + count: true + override: false + items_per_page: 25 + summary: + sort_order: asc + number_of_records: 0 + format: default_summary + specify_validation: true + validate: + type: 'entity:taxonomy_term' + fail: 'not found' + validate_options: + bundles: { } + access: true + operation: view + multiple: 0 + break_phrase: false + add_table: false + require_value: false + reduce_duplicates: false + filters: + langcode: + id: langcode + table: node_field_data + field: langcode + relationship: none + group_type: group + admin_label: '' + entity_type: node + entity_field: langcode + plugin_id: language + operator: in + value: + '***LANGUAGE_language_content***': '***LANGUAGE_language_content***' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + status: + id: status + table: taxonomy_index + field: status + relationship: none + group_type: group + admin_label: '' + plugin_id: boolean + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + operator_limit_selection: false + operator_list: { } + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: 'entity:node' + options: + view_mode: teaser + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + relationships: { } + link_display: page_1 + link_url: '' + header: + entity_taxonomy_term: + id: entity_taxonomy_term + table: views + field: entity_taxonomy_term + relationship: none + group_type: group + admin_label: '' + plugin_id: entity + empty: true + target: '{{ raw_arguments.tid }}' + view_mode: full + tokenize: true + bypass_access: false + footer: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } + feed_1: + id: feed_1 + display_title: Feed + display_plugin: feed + position: 2 + display_options: + pager: + type: some + options: + offset: 0 + items_per_page: 10 + style: + type: rss + options: + grouping: { } + uses_fields: false + description: '' + row: + type: node_rss + options: + relationship: none + view_mode: default + query: + type: views_query + options: { } + display_extenders: { } + path: taxonomy/term/%/feed + displays: + page_1: page_1 + default: '0' + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_interface' + - url + - 'user.node_grants:view' + - user.permissions + tags: { } + page_1: + id: page_1 + display_title: Page + display_plugin: page + position: 1 + display_options: + query: + type: views_query + options: { } + display_extenders: { } + path: taxonomy/term/% + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + tags: { } From 4877f06c04d3283e89a594aae82a410c763298b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 14:08:39 +0100 Subject: [PATCH 07/94] Allow all administrators and editors to manage categories It seems like a reasonable set of permissions. We do not want everybody to be able to add new categories because it might create a mess in the category structure. --- config/sync/user.role.administrator.yml | 5 +++++ config/sync/user.role.editor.yml | 5 +++++ config/sync/user.role.local_administrator.yml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 8b2d0920e..3b5d5fd4f 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -7,6 +7,7 @@ dependencies: - media.type.image - node.type.article - node.type.campaign + - taxonomy.vocabulary.categories module: - block - dpl_instant_loan @@ -23,6 +24,7 @@ dependencies: - openid_connect - recurring_events - system + - taxonomy - toolbar - update id: administrator @@ -55,6 +57,7 @@ permissions: - 'create article content' - 'create campaign content' - 'create image media' + - 'create terms in categories' - 'delete any article content' - 'delete any campaign content' - 'delete any image media' @@ -67,6 +70,7 @@ permissions: - 'delete own eventseries entity' - 'delete own files' - 'delete own image media' + - 'delete terms in categories' - 'edit any article content' - 'edit any campaign content' - 'edit any image media' @@ -77,6 +81,7 @@ permissions: - 'edit own eventinstance entity' - 'edit own eventseries entity' - 'edit own image media' + - 'edit terms in categories' - 'revert all eventinstance revisions' - 'revert all eventseries revisions' - 'translate interface' diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index 5572130af..865ce77ca 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -7,6 +7,7 @@ dependencies: - media.type.image - node.type.article - node.type.campaign + - taxonomy.vocabulary.categories module: - file - filter @@ -14,6 +15,7 @@ dependencies: - node - recurring_events - system + - taxonomy - toolbar id: editor label: Editor @@ -30,6 +32,7 @@ permissions: - 'create article content' - 'create campaign content' - 'create image media' + - 'create terms in categories' - 'delete any article content' - 'delete any campaign content' - 'delete eventinstance entity' @@ -40,6 +43,7 @@ permissions: - 'delete own eventseries entity' - 'delete own files' - 'delete own image media' + - 'delete terms in categories' - 'edit any article content' - 'edit any campaign content' - 'edit any image media' @@ -50,6 +54,7 @@ permissions: - 'edit own eventinstance entity' - 'edit own eventseries entity' - 'edit own image media' + - 'edit terms in categories' - 'revert all eventinstance revisions' - 'revert all eventseries revisions' - 'use text format basic' diff --git a/config/sync/user.role.local_administrator.yml b/config/sync/user.role.local_administrator.yml index 4961a6f3f..bbb771d64 100644 --- a/config/sync/user.role.local_administrator.yml +++ b/config/sync/user.role.local_administrator.yml @@ -7,6 +7,7 @@ dependencies: - media.type.image - node.type.article - node.type.campaign + - taxonomy.vocabulary.categories module: - dpl_instant_loan - dpl_library_agency @@ -17,6 +18,7 @@ dependencies: - node - recurring_events - system + - taxonomy - toolbar id: local_administrator label: 'Local Administrator' @@ -36,6 +38,7 @@ permissions: - 'create article content' - 'create campaign content' - 'create image media' + - 'create terms in categories' - 'delete any article content' - 'delete any campaign content' - 'delete any image media' @@ -47,6 +50,7 @@ permissions: - 'delete own eventseries entity' - 'delete own files' - 'delete own image media' + - 'delete terms in categories' - 'edit any article content' - 'edit any campaign content' - 'edit any image media' @@ -57,6 +61,7 @@ permissions: - 'edit own eventinstance entity' - 'edit own eventseries entity' - 'edit own image media' + - 'edit terms in categories' - 'revert all eventinstance revisions' - 'revert all eventseries revisions' - 'use text format basic' From f41ad95c92fb18ec0b003a2c9cf8485ec07dbc21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 14:12:44 +0100 Subject: [PATCH 08/94] Add a categories field to event series It is only displayed in the default view and only with the label as text. For now we do not have any place to link to. --- ...rm_display.eventseries.default.default.yml | 11 +++++++ ..._view_display.eventseries.default.card.yml | 2 ++ ...ew_display.eventseries.default.default.yml | 9 ++++++ ..._view_display.eventseries.default.list.yml | 2 ++ ...d.eventseries.default.field_categories.yml | 29 +++++++++++++++++++ ...d.storage.eventseries.field_categories.yml | 20 +++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 config/sync/field.field.eventseries.default.field_categories.yml create mode 100644 config/sync/field.storage.eventseries.field_categories.yml diff --git a/config/sync/core.entity_form_display.eventseries.default.default.yml b/config/sync/core.entity_form_display.eventseries.default.default.yml index fb646c9f0..4e98508e3 100644 --- a/config/sync/core.entity_form_display.eventseries.default.default.yml +++ b/config/sync/core.entity_form_display.eventseries.default.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.eventseries.default.field_categories - field.field.eventseries.default.field_event_address - field.field.eventseries.default.field_event_description - field.field.eventseries.default.field_event_image @@ -68,6 +69,16 @@ content: region: content settings: { } third_party_settings: { } + field_categories: + type: entity_reference_autocomplete + weight: 26 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } field_event_address: type: address_default weight: 14 diff --git a/config/sync/core.entity_view_display.eventseries.default.card.yml b/config/sync/core.entity_view_display.eventseries.default.card.yml index c3e549cdd..d79a19754 100644 --- a/config/sync/core.entity_view_display.eventseries.default.card.yml +++ b/config/sync/core.entity_view_display.eventseries.default.card.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.eventseries.card + - field.field.eventseries.default.field_categories - field.field.eventseries.default.field_event_address - field.field.eventseries.default.field_event_description - field.field.eventseries.default.field_event_image @@ -64,6 +65,7 @@ hidden: daily_recurring_date: true event_instances: true event_registration: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/core.entity_view_display.eventseries.default.default.yml b/config/sync/core.entity_view_display.eventseries.default.default.yml index 9e5776cf8..1f9014f51 100644 --- a/config/sync/core.entity_view_display.eventseries.default.default.yml +++ b/config/sync/core.entity_view_display.eventseries.default.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.eventseries.default.field_categories - field.field.eventseries.default.field_event_address - field.field.eventseries.default.field_event_description - field.field.eventseries.default.field_event_image @@ -37,6 +38,14 @@ content: third_party_settings: { } weight: 2 region: content + field_categories: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 13 + region: content field_event_address: type: address_default label: hidden diff --git a/config/sync/core.entity_view_display.eventseries.default.list.yml b/config/sync/core.entity_view_display.eventseries.default.list.yml index ddda71cc6..5fc4db412 100644 --- a/config/sync/core.entity_view_display.eventseries.default.list.yml +++ b/config/sync/core.entity_view_display.eventseries.default.list.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.eventseries.list + - field.field.eventseries.default.field_categories - field.field.eventseries.default.field_event_address - field.field.eventseries.default.field_event_description - field.field.eventseries.default.field_event_image @@ -47,6 +48,7 @@ hidden: daily_recurring_date: true event_instances: true event_registration: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/field.field.eventseries.default.field_categories.yml b/config/sync/field.field.eventseries.default.field_categories.yml new file mode 100644 index 000000000..877de282e --- /dev/null +++ b/config/sync/field.field.eventseries.default.field_categories.yml @@ -0,0 +1,29 @@ +uuid: 4e10dab0-b170-4ec9-a55d-338d03a4d95c +langcode: en +status: true +dependencies: + config: + - field.storage.eventseries.field_categories + - recurring_events.eventseries_type.default + - taxonomy.vocabulary.categories +id: eventseries.default.field_categories +field_name: field_categories +entity_type: eventseries +bundle: default +label: Categories +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + categories: categories + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.eventseries.field_categories.yml b/config/sync/field.storage.eventseries.field_categories.yml new file mode 100644 index 000000000..4475e12e4 --- /dev/null +++ b/config/sync/field.storage.eventseries.field_categories.yml @@ -0,0 +1,20 @@ +uuid: 1ea5e926-1b6f-4da1-9dc2-06b0a3310cb1 +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventseries.field_categories +field_name: field_categories +entity_type: eventseries +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false From 6e8a162a375b7a38c566ba6c795edcaf2d51f81b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 14:15:28 +0100 Subject: [PATCH 09/94] Add a categories field to event instances This mirrors the setup for event series. --- ..._display.eventinstance.default.default.yml | 11 +++++++ ...iew_display.eventinstance.default.card.yml | 2 ++ ..._display.eventinstance.default.default.yml | 9 ++++++ ...iew_display.eventinstance.default.list.yml | 2 ++ ...play.eventinstance.default.list_teaser.yml | 4 +++ ...eventinstance.default.field_categories.yml | 29 +++++++++++++++++++ ...storage.eventinstance.field_categories.yml | 20 +++++++++++++ 7 files changed, 77 insertions(+) create mode 100644 config/sync/field.field.eventinstance.default.field_categories.yml create mode 100644 config/sync/field.storage.eventinstance.field_categories.yml diff --git a/config/sync/core.entity_form_display.eventinstance.default.default.yml b/config/sync/core.entity_form_display.eventinstance.default.default.yml index 7810a72a0..5bb001327 100644 --- a/config/sync/core.entity_form_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_form_display.eventinstance.default.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.eventinstance.default.field_categories - field.field.eventinstance.default.field_event_address - field.field.eventinstance.default.field_event_description - field.field.eventinstance.default.field_event_image @@ -52,6 +53,16 @@ content: region: content settings: { } third_party_settings: { } + field_categories: + type: entity_reference_autocomplete + weight: 26 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } field_event_address: type: address_default weight: 6 diff --git a/config/sync/core.entity_view_display.eventinstance.default.card.yml b/config/sync/core.entity_view_display.eventinstance.default.card.yml index eb9576db6..c0aa8dd97 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.card.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.card.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.eventinstance.card + - field.field.eventinstance.default.field_categories - field.field.eventinstance.default.field_event_address - field.field.eventinstance.default.field_event_description - field.field.eventinstance.default.field_event_image @@ -83,6 +84,7 @@ hidden: event_place: true event_state: true event_ticket_categories: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.default.yml b/config/sync/core.entity_view_display.eventinstance.default.default.yml index 8ad932f65..5b4eb63ab 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.eventinstance.default.field_categories - field.field.eventinstance.default.field_event_address - field.field.eventinstance.default.field_event_description - field.field.eventinstance.default.field_event_image @@ -135,6 +136,14 @@ content: third_party_settings: { } weight: 8 region: content + field_categories: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 12 + region: content title: type: string label: hidden diff --git a/config/sync/core.entity_view_display.eventinstance.default.list.yml b/config/sync/core.entity_view_display.eventinstance.default.list.yml index 7189eaf70..960e44850 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.eventinstance.list + - field.field.eventinstance.default.field_categories - field.field.eventinstance.default.field_event_address - field.field.eventinstance.default.field_event_description - field.field.eventinstance.default.field_event_image @@ -149,6 +150,7 @@ content: region: content hidden: body: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml index ccbf755a0..93621a3ba 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.eventinstance.list_teaser + - field.field.eventinstance.default.field_categories - field.field.eventinstance.default.field_event_address - field.field.eventinstance.default.field_event_description - field.field.eventinstance.default.field_event_image @@ -12,6 +13,8 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_teaser_image + - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories - recurring_events.eventinstance_type.default module: @@ -145,6 +148,7 @@ hidden: body: true description: true event_state: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/field.field.eventinstance.default.field_categories.yml b/config/sync/field.field.eventinstance.default.field_categories.yml new file mode 100644 index 000000000..b9f68658e --- /dev/null +++ b/config/sync/field.field.eventinstance.default.field_categories.yml @@ -0,0 +1,29 @@ +uuid: 2a99cbbe-7e49-477c-a49f-5a402152597a +langcode: en +status: true +dependencies: + config: + - field.storage.eventinstance.field_categories + - recurring_events.eventinstance_type.default + - taxonomy.vocabulary.categories +id: eventinstance.default.field_categories +field_name: field_categories +entity_type: eventinstance +bundle: default +label: Categories +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + categories: categories + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.eventinstance.field_categories.yml b/config/sync/field.storage.eventinstance.field_categories.yml new file mode 100644 index 000000000..e05aa06b6 --- /dev/null +++ b/config/sync/field.storage.eventinstance.field_categories.yml @@ -0,0 +1,20 @@ +uuid: da47383d-eb2e-4943-8cf8-7f7919fa7def +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventinstance.field_categories +field_name: field_categories +entity_type: eventinstance +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false From e78f125397cad9a161f738cc9fb26a19a7c9dff6 Mon Sep 17 00:00:00 2001 From: Kasper Birch Date: Fri, 19 Jan 2024 12:01:11 +0100 Subject: [PATCH 10/94] Add `show-more` functionality / display `categories` in `full-event.html.twig` Refer to dpl-design-system `src/stories/utils/show-more.md` for documentation --- web/themes/custom/novel/novel.libraries.yml | 4 ++++ .../templates/components/full-event.html.twig | 6 ++--- .../fields/field--field-categories.html.twig | 22 +++++++++++++++++++ .../layout/eventinstance--full.html.twig | 3 ++- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 web/themes/custom/novel/templates/fields/field--field-categories.html.twig diff --git a/web/themes/custom/novel/novel.libraries.yml b/web/themes/custom/novel/novel.libraries.yml index 381413739..1e93599fa 100644 --- a/web/themes/custom/novel/novel.libraries.yml +++ b/web/themes/custom/novel/novel.libraries.yml @@ -29,3 +29,7 @@ swiper: theme: "https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css": { type: external } + +show-more: + js: + assets/dpl-design-system/js/show-more.js: {} diff --git a/web/themes/custom/novel/templates/components/full-event.html.twig b/web/themes/custom/novel/templates/components/full-event.html.twig index a090176b7..0b154bb4e 100644 --- a/web/themes/custom/novel/templates/components/full-event.html.twig +++ b/web/themes/custom/novel/templates/components/full-event.html.twig @@ -1,14 +1,14 @@
- - +
+ {{ categories }} +
{% if date %} {% endif %} -

{{ label }}

{{ event_link }}
diff --git a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig new file mode 100644 index 000000000..71f803c76 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig @@ -0,0 +1,22 @@ +{{ attach_library('novel/show-more') }} +{% set show_more_text = '...'|t %} +{% set show_less_text = 'Show less'|t %} + +{% if items|length > 1 %} +
    + {% for item in items %} +
  • + {{ item.content|raw }} +
  • + {% endfor %} + +
+{% else %} + {% for item in items %} + + {{ item.content|raw }} + + {% endfor %} +{% endif %} diff --git a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig index 0d0fb5c3c..5037c8b14 100644 --- a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig @@ -29,5 +29,6 @@ 'paragraphs': content.event_paragraphs, 'date': content.date, 'description': content.event_description, - 'description_items': description_items + 'description_items': description_items, + 'categories': content.field_categories, } only %} From a7738d78bd345c91fb742462e933ce12ec326d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 14:36:42 +0100 Subject: [PATCH 11/94] Implement field inheritance for categories on events Make instances fall back on series for categories. To show this we update the display to use the inheritance field and update the templates to use this field instead. As the field name on event instances is different we also have to add a new template file. --- ...ew_display.eventinstance.default.default.yml | 17 +++++++++-------- ...e.eventinstance_default_event_categories.yml | 14 ++++++++++++++ ...d--eventinstance--event-categories.html.twig | 2 ++ .../layout/eventinstance--full.html.twig | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 config/sync/field_inheritance.field_inheritance.eventinstance_default_event_categories.yml create mode 100644 web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig diff --git a/config/sync/core.entity_view_display.eventinstance.default.default.yml b/config/sync/core.entity_view_display.eventinstance.default.default.yml index 5b4eb63ab..428315640 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.default.yml @@ -57,6 +57,14 @@ content: third_party_settings: { } weight: 2 region: content + event_categories: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 12 + region: content event_description: type: text_default label: hidden @@ -136,14 +144,6 @@ content: third_party_settings: { } weight: 8 region: content - field_categories: - type: entity_reference_label - label: hidden - settings: - link: false - third_party_settings: { } - weight: 12 - region: content title: type: string label: hidden @@ -156,6 +156,7 @@ hidden: body: true description: true event_state: true + field_categories: true field_event_address: true field_event_description: true field_event_image: true diff --git a/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_categories.yml b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_categories.yml new file mode 100644 index 000000000..690c2fa0f --- /dev/null +++ b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_categories.yml @@ -0,0 +1,14 @@ +uuid: 572336b9-66cf-4919-8d77-aac055afd6ea +langcode: en +status: true +dependencies: { } +id: eventinstance_default_event_categories +label: 'Event categories' +type: fallback +sourceEntityType: eventseries +sourceEntityBundle: default +sourceField: field_categories +destinationEntityType: eventinstance +destinationEntityBundle: default +destinationField: field_categories +plugin: entity_reference_inheritance diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig new file mode 100644 index 000000000..9afea88b1 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig @@ -0,0 +1,2 @@ +{# Reuse event field template #} +{{ include('field--field-categories.html.twig') }} diff --git a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig index 5037c8b14..ad1e13ee9 100644 --- a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig @@ -30,5 +30,5 @@ 'date': content.date, 'description': content.event_description, 'description_items': description_items, - 'categories': content.field_categories, + 'categories': content.event_categories, } only %} From dbf56679d96923b86f8a2a2133d362a91be87801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 14:39:58 +0100 Subject: [PATCH 12/94] Add event categories to list teaser view --- ...ity_view_display.eventinstance.default.list_teaser.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml index 93621a3ba..421a6d40a 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml @@ -58,6 +58,14 @@ content: third_party_settings: { } weight: 2 region: content + event_categories: + type: entity_reference_label + label: visually_hidden + settings: + link: false + third_party_settings: { } + weight: 10 + region: content event_description: type: text_default label: hidden From d309989fedc2d166331139ca46b71b94e9024f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 16:35:41 +0100 Subject: [PATCH 13/94] Hide teaser fields on event list item view mode They are not to be used in this view mode so hide them. --- ...splay.eventinstance.default.list_teaser.yml | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml index 421a6d40a..7ad482dc5 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml @@ -119,22 +119,6 @@ content: third_party_settings: { } weight: 7 region: content - event_teaser_image: - type: entity_reference_label - label: visible - settings: - link: true - third_party_settings: { } - weight: 59 - region: content - event_teaser_text: - type: string - label: visible - settings: - link_to_entity: false - third_party_settings: { } - weight: 60 - region: content event_ticket_categories: type: entity_reference_revisions_entity_view label: hidden @@ -156,6 +140,8 @@ hidden: body: true description: true event_state: true + event_teaser_image: true + event_teaser_text: true field_categories: true field_event_address: true field_event_description: true From b0113bc6bfe239ea5ad4017c74155dea2dbdc187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 17:26:33 +0100 Subject: [PATCH 14/94] Render categories on even series pages We need to remap the field naming to match instances for this to work. This is similar to what we do for other fields on series. --- .../custom/novel/templates/layout/eventseries--full.html.twig | 1 + 1 file changed, 1 insertion(+) diff --git a/web/themes/custom/novel/templates/layout/eventseries--full.html.twig b/web/themes/custom/novel/templates/layout/eventseries--full.html.twig index 82fdd829c..52dbd6038 100644 --- a/web/themes/custom/novel/templates/layout/eventseries--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventseries--full.html.twig @@ -7,6 +7,7 @@ set instancelike_content = { "date": formatted_date, "event_address": content.field_event_address, + "event_categories": content.field_categories, "event_description": content.field_event_description, "event_image": content.field_event_image, "event_link": content.field_event_link, From 334ffb993263b61c9eb79956eba5c522cd497139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 17:28:20 +0100 Subject: [PATCH 15/94] Hide description field for Categories taxonomy This is a default field for taxonomies but we do not need it so hide it in the editing form to avoid cluttering the admin UI. --- ...splay.taxonomy_term.categories.default.yml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 config/sync/core.entity_form_display.taxonomy_term.categories.default.yml diff --git a/config/sync/core.entity_form_display.taxonomy_term.categories.default.yml b/config/sync/core.entity_form_display.taxonomy_term.categories.default.yml new file mode 100644 index 000000000..b23a094a8 --- /dev/null +++ b/config/sync/core.entity_form_display.taxonomy_term.categories.default.yml @@ -0,0 +1,35 @@ +uuid: 85fc4e91-0814-4569-8f2b-b35a1870042b +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.categories +id: taxonomy_term.categories.default +targetEntityType: taxonomy_term +bundle: categories +mode: default +content: + langcode: + type: language_select + weight: 1 + region: content + settings: + include_locked: true + third_party_settings: { } + name: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + status: + type: boolean_checkbox + weight: 2 + region: content + settings: + display_label: true + third_party_settings: { } +hidden: + description: true From 0dd4ff095938036cea22db6d2096c642dd979b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 17:35:11 +0100 Subject: [PATCH 16/94] Add and enable the Twig Template Suggester Drupal module This module provides theme suggestions per view mode. We need to add additional classes to categories in the list view. By adding this module we can add new templates for this situation and through these templates add more classes. We could achieve the same thing by implementing theme suggestions in the Novel theme: https://drupal.stackexchange.com/a/274661/113033. Using twigsuggest provides a nice community approach which may also help us in other circumstances such as menu theming. --- composer.json | 1 + composer.lock | 5 +++-- config/sync/core.extension.yml | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 251f0c56e..da9ca6fca 100644 --- a/composer.json +++ b/composer.json @@ -115,6 +115,7 @@ "drupal/restui": "^1.21", "drupal/search_api": "^1.31", "drupal/twig_tweak": "^3.2.1", + "drupal/twigsuggest": "^1.0@RC", "drupal/upgrade_status": "^4.0", "drupal/uuid_url": "^1.3", "drupal/varnish_purge": "^2.2", diff --git a/composer.lock b/composer.lock index b56209027..619dc372d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c73dcf69315148852dd966cab6a96793", + "content-hash": "28e0f8e9791d9923695cb30afbedd9f8", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -15380,7 +15380,8 @@ "drupal/gin_toolbar": 5, "drupal/openapi_rest": 5, "drupal/potion": 20, - "drupal/recurring_events": 5 + "drupal/recurring_events": 5, + "drupal/twigsuggest": 5 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 5eb5fe587..e924d54e2 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -103,6 +103,7 @@ module: views: 10 paragraphs: 11 paragraphs_ee: 15 + twigsuggest: 100 dpl_cms: 1000 theme: claro: 0 From 1d87d1848d05976f09eeb72525345e21a9d300ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 17:39:27 +0100 Subject: [PATCH 17/94] Display event categories in list Replace the hardcoded value with the value of the new field. To ensure that the class specific to the event list is added we add support for passing in item attributes to the categories field. Through the field template enabled by Twig Template Suggester we can implement a new template which passes the class to the categories field. --- ...tinstance--event-categories--list-teaser.html.twig | 3 +++ .../fields/field--field-categories.html.twig | 11 +++++++++-- .../views/eventinstance--list-teaser.html.twig | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig new file mode 100644 index 000000000..060d884e6 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig @@ -0,0 +1,3 @@ +{% include 'field--field-categories.html.twig' with { + item_attributes: create_attribute().addClass('event-list-item__tag') +} %} diff --git a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig index 71f803c76..2a9a5047f 100644 --- a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig +++ b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig @@ -2,10 +2,17 @@ {% set show_more_text = '...'|t %} {% set show_less_text = 'Show less'|t %} +{% set item_attributes = item_attributes ?? create_attribute() %} +{% set item_classes = [ + 'tag', + 'tag--fill', + 'tag--small' + ] %} + {% if items|length > 1 %}
    {% for item in items %} -
  • + {{ item.content|raw }}
  • {% endfor %} @@ -15,7 +22,7 @@
{% else %} {% for item in items %} - + {{ item.content|raw }} {% endfor %} diff --git a/web/themes/custom/novel/templates/views/eventinstance--list-teaser.html.twig b/web/themes/custom/novel/templates/views/eventinstance--list-teaser.html.twig index e48dc33c9..cfd73b70b 100644 --- a/web/themes/custom/novel/templates/views/eventinstance--list-teaser.html.twig +++ b/web/themes/custom/novel/templates/views/eventinstance--list-teaser.html.twig @@ -5,7 +5,7 @@ {% endif %}
-
foredrag
+ {{ content.event_categories }}
{{ content.date }}
From f6e6c475f89083c568066babbaad8874c4aa4f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 17:51:45 +0100 Subject: [PATCH 18/94] Add category to exported events The actual value is taken from the example in Figma. --- .../c8177097-1438-493e-8177-e8ef968cc133.yml | 4 +++ .../f457c4c2-dc28-45cd-9b6e-fda4248d9d45.yml | 33 +++++++++++++++++++ .../dpl_example_content.info.yml | 3 ++ 3 files changed, 40 insertions(+) create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/f457c4c2-dc28-45cd-9b6e-fda4248d9d45.yml diff --git a/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml b/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml index b851a6e43..72282886f 100644 --- a/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml +++ b/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml @@ -6,6 +6,7 @@ _meta: default_langcode: en depends: a3a4aa80-7380-4a87-aa02-a0ba240410ba: eventinstance + f457c4c2-dc28-45cd-9b6e-fda4248d9d45: taxonomy_term 618e176a-a45a-4c36-a197-664230aa0a34: media dc33677f-8894-4717-b34b-d985f6ad875f: media 65432ee1-43f1-4130-9565-5683467d4b5a: media @@ -102,6 +103,9 @@ default: event_instances: - entity: a3a4aa80-7380-4a87-aa02-a0ba240410ba + field_categories: + - + entity: f457c4c2-dc28-45cd-9b6e-fda4248d9d45 field_event_address: - langcode: en diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/f457c4c2-dc28-45cd-9b6e-fda4248d9d45.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/f457c4c2-dc28-45cd-9b6e-fda4248d9d45.yml new file mode 100644 index 000000000..53c82382d --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/f457c4c2-dc28-45cd-9b6e-fda4248d9d45.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: f457c4c2-dc28-45cd-9b6e-fda4248d9d45 + bundle: categories + default_langcode: da +default: + status: + - + value: true + name: + - + value: 'Design & Teknologi' + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'Design & Teknologi | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/1' diff --git a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml index 0d5d99337..0a1edef64 100644 --- a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml +++ b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml @@ -39,3 +39,6 @@ default_content: - 6d5e9b4c-389d-4735-a8a3-82883f64aeb0 # PDF used in article 1 and eventseries 1 - 3403d0ba-cbdc-425d-93f4-6cdabb5378b1 + taxonomy_term: + # Category used by eventseries 1 + - f457c4c2-dc28-45cd-9b6e-fda4248d9d45 From 20deb6552b85d2597dbb718c3b4e3753a3aa4bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 18:14:49 +0100 Subject: [PATCH 19/94] Configure eventinstance categories in additional view modes In card mode we add it. It is not rendered at the moment but should be so in the future. In list mode we add it - but I do not know when that view mode is actually used. --- ...ore.entity_view_display.eventinstance.default.card.yml | 8 ++++++++ ...ore.entity_view_display.eventinstance.default.list.yml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/config/sync/core.entity_view_display.eventinstance.default.card.yml b/config/sync/core.entity_view_display.eventinstance.default.card.yml index c0aa8dd97..7d5149c64 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.card.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.card.yml @@ -47,6 +47,14 @@ content: third_party_settings: { } weight: 2 region: content + event_categories: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 52 + region: content event_teaser_image: type: entity_reference_entity_view label: hidden diff --git a/config/sync/core.entity_view_display.eventinstance.default.list.yml b/config/sync/core.entity_view_display.eventinstance.default.list.yml index 960e44850..7f1748d3d 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list.yml @@ -56,6 +56,14 @@ content: third_party_settings: { } weight: 51 region: content + event_categories: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 52 + region: content event_description: type: text_default label: visible From 34a30ef3df2f3f11dceaf2b10e4879337dbff42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 19 Jan 2024 18:15:41 +0100 Subject: [PATCH 20/94] Do not include taxonomy terms in existing entity reference fields --- ...eld.field.paragraph.card_grid_manual.field_grid_content.yml | 3 +++ ...field.paragraph.content_slider.field_content_references.yml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/config/sync/field.field.paragraph.card_grid_manual.field_grid_content.yml b/config/sync/field.field.paragraph.card_grid_manual.field_grid_content.yml index 466b3af59..b285127ca 100644 --- a/config/sync/field.field.paragraph.card_grid_manual.field_grid_content.yml +++ b/config/sync/field.field.paragraph.card_grid_manual.field_grid_content.yml @@ -66,4 +66,7 @@ settings: user: handler: 'default:user' handler_settings: { } + taxonomy_term: + handler: 'default:taxonomy_term' + handler_settings: { } field_type: dynamic_entity_reference diff --git a/config/sync/field.field.paragraph.content_slider.field_content_references.yml b/config/sync/field.field.paragraph.content_slider.field_content_references.yml index 8d80846eb..1adea09c0 100644 --- a/config/sync/field.field.paragraph.content_slider.field_content_references.yml +++ b/config/sync/field.field.paragraph.content_slider.field_content_references.yml @@ -66,4 +66,7 @@ settings: user: handler: 'default:user' handler_settings: { } + taxonomy_term: + handler: 'default:taxonomy_term' + handler_settings: { } field_type: dynamic_entity_reference From 20e8df9caccaf6388cbb60a08a4376ebd0c80727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Sun, 21 Jan 2024 21:26:33 +0100 Subject: [PATCH 21/94] Replace twigsuggest module with a hook implementation in Novel theme Twigsuggest does not have a stable release and adds additional complexity that we do not need at the moment. Update PHPStan configuration to drop DocBlock requirements for hook_theme_suggestions arrays. --- composer.json | 1 - composer.lock | 5 ++--- config/sync/core.extension.yml | 1 - phpstan.neon.dist | 2 ++ web/themes/custom/novel/novel.theme | 15 +++++++++++++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index da9ca6fca..251f0c56e 100644 --- a/composer.json +++ b/composer.json @@ -115,7 +115,6 @@ "drupal/restui": "^1.21", "drupal/search_api": "^1.31", "drupal/twig_tweak": "^3.2.1", - "drupal/twigsuggest": "^1.0@RC", "drupal/upgrade_status": "^4.0", "drupal/uuid_url": "^1.3", "drupal/varnish_purge": "^2.2", diff --git a/composer.lock b/composer.lock index 619dc372d..b56209027 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "28e0f8e9791d9923695cb30afbedd9f8", + "content-hash": "c73dcf69315148852dd966cab6a96793", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -15380,8 +15380,7 @@ "drupal/gin_toolbar": 5, "drupal/openapi_rest": 5, "drupal/potion": 20, - "drupal/recurring_events": 5, - "drupal/twigsuggest": 5 + "drupal/recurring_events": 5 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index e924d54e2..5eb5fe587 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -103,7 +103,6 @@ module: views: 10 paragraphs: 11 paragraphs_ee: 15 - twigsuggest: 100 dpl_cms: 1000 theme: claro: 0 diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 381c37e17..34b4bf75f 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -13,6 +13,8 @@ parameters: - '#_form_alter\(\) has parameter \$form with no value type specified in iterable type array\.#' # Drupal preprocess functions uses variables array which we cannot provide more detailed typing of. - '#Function .*_preprocess_.*\(\) has parameter \$variables with no value type specified in iterable type array\.#' + # Drupal theme suggestions uses arrays which we cannot provide more detailed typing of. + - '#Function .*_theme_suggestions_.*\(\) has parameter .* with no value type specified in iterable type array\.#' # Drupal hook_page_attachments functions uses page array which we cannot provide more detailed typing of. - '#Function .*_page_attachments\(\) has parameter \$page with no value type specified in iterable type array\.#' # Drupal hook_requirements() implementation returns array which we cannot provide more detailed typing of. diff --git a/web/themes/custom/novel/novel.theme b/web/themes/custom/novel/novel.theme index 3d4059f00..4fba22c5e 100644 --- a/web/themes/custom/novel/novel.theme +++ b/web/themes/custom/novel/novel.theme @@ -227,3 +227,18 @@ function novel_attach_identity_color_styles(array &$variables, Hsl $hslColor): v 'novel_custom_identity_color', ]; } + +/** + * Implements hook_theme_suggestions_field_alter(). + */ +function novel_theme_suggestions_field_alter(array &$suggestions, array $variables) : void { + $element = $variables['element']; + + // Add theme suggestions per view mode... + $suggestions[] = 'field__' . $element['#entity_type'] . '__' . + $element['#field_name'] . '__' . $element['#view_mode']; + // ... per bundle and view mode. + $suggestions[] = 'field__' . $element['#entity_type'] . '__' . + $element['#field_name'] . '__' . $element['#bundle'] . '__' . + $element['#view_mode']; +} From 6701ac70b8b94bdc4925e5cb16491da66bea12e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Sun, 21 Jan 2024 21:30:54 +0100 Subject: [PATCH 22/94] Use select list instead of autocomplete for category selection This is easier for editors to understand. --- ....entity_form_display.eventinstance.default.default.yml | 8 ++------ ...re.entity_form_display.eventseries.default.default.yml | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/config/sync/core.entity_form_display.eventinstance.default.default.yml b/config/sync/core.entity_form_display.eventinstance.default.default.yml index 5bb001327..e155de753 100644 --- a/config/sync/core.entity_form_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_form_display.eventinstance.default.default.yml @@ -54,14 +54,10 @@ content: settings: { } third_party_settings: { } field_categories: - type: entity_reference_autocomplete + type: options_select weight: 26 region: content - settings: - match_operator: CONTAINS - match_limit: 10 - size: 60 - placeholder: '' + settings: { } third_party_settings: { } field_event_address: type: address_default diff --git a/config/sync/core.entity_form_display.eventseries.default.default.yml b/config/sync/core.entity_form_display.eventseries.default.default.yml index 4e98508e3..36eea4de5 100644 --- a/config/sync/core.entity_form_display.eventseries.default.default.yml +++ b/config/sync/core.entity_form_display.eventseries.default.default.yml @@ -70,14 +70,10 @@ content: settings: { } third_party_settings: { } field_categories: - type: entity_reference_autocomplete + type: options_select weight: 26 region: content - settings: - match_operator: CONTAINS - match_limit: 10 - size: 60 - placeholder: '' + settings: { } third_party_settings: { } field_event_address: type: address_default From f416f90d99bff520b1501e671c40def6bf175a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Sun, 21 Jan 2024 21:40:01 +0100 Subject: [PATCH 23/94] Replace ?? with default filter in twig template --- .../novel/templates/fields/field--field-categories.html.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig index 2a9a5047f..9740bbdb5 100644 --- a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig +++ b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig @@ -2,7 +2,7 @@ {% set show_more_text = '...'|t %} {% set show_less_text = 'Show less'|t %} -{% set item_attributes = item_attributes ?? create_attribute() %} +{% set item_attributes = item_attributes|default(create_attribute()) %} {% set item_classes = [ 'tag', 'tag--fill', From 7199985d16bf828fd1a19fdac6493648ca9fff35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Sun, 21 Jan 2024 22:25:38 +0100 Subject: [PATCH 24/94] Replace custom event categories field attributes with item.attributes We should use what already exists. Adding a class to an entry in an array in Twig is not possible out of the box. Instead you have to recreate the value. Here we do it by merging in the updated attributes. --- ...-eventinstance--event-categories--list-teaser.html.twig | 7 ++++--- .../templates/fields/field--field-categories.html.twig | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig index 060d884e6..77fc2793c 100644 --- a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig @@ -1,3 +1,4 @@ -{% include 'field--field-categories.html.twig' with { - item_attributes: create_attribute().addClass('event-list-item__tag') -} %} +{% for item in items %} + {% set item = item|merge({'attributes': item.attributes.addClass('event-list-item__tag')}) %} +{% endfor %} +{% include 'field--field-categories.html.twig' %} diff --git a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig index 9740bbdb5..d837bbd2c 100644 --- a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig +++ b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig @@ -2,7 +2,6 @@ {% set show_more_text = '...'|t %} {% set show_less_text = 'Show less'|t %} -{% set item_attributes = item_attributes|default(create_attribute()) %} {% set item_classes = [ 'tag', 'tag--fill', @@ -12,7 +11,7 @@ {% if items|length > 1 %}
    {% for item in items %} - + {{ item.content|raw }} {% endfor %} @@ -22,7 +21,7 @@
{% else %} {% for item in items %} - + {{ item.content|raw }} {% endfor %} From 7465b2620812e3f1a30f1b1d0f8941f903a9f698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Mon, 22 Jan 2024 15:26:34 +0100 Subject: [PATCH 25/94] Change cardinality for categories to 1 This is in accordance with the latest agreements regarding taxonomy and its relationship to url structure and breadcrumbs. --- config/sync/field.storage.eventinstance.field_categories.yml | 2 +- config/sync/field.storage.eventseries.field_categories.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/sync/field.storage.eventinstance.field_categories.yml b/config/sync/field.storage.eventinstance.field_categories.yml index e05aa06b6..f1a9fc9eb 100644 --- a/config/sync/field.storage.eventinstance.field_categories.yml +++ b/config/sync/field.storage.eventinstance.field_categories.yml @@ -13,7 +13,7 @@ settings: target_type: taxonomy_term module: core locked: false -cardinality: -1 +cardinality: 1 translatable: true indexes: { } persist_with_no_fields: false diff --git a/config/sync/field.storage.eventseries.field_categories.yml b/config/sync/field.storage.eventseries.field_categories.yml index 4475e12e4..739a36fd7 100644 --- a/config/sync/field.storage.eventseries.field_categories.yml +++ b/config/sync/field.storage.eventseries.field_categories.yml @@ -13,7 +13,7 @@ settings: target_type: taxonomy_term module: core locked: false -cardinality: -1 +cardinality: 1 translatable: true indexes: { } persist_with_no_fields: false From 95cf4c383efb58ccd4fdc1dba8e5f8e544f6c912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:21:36 +0100 Subject: [PATCH 26/94] Add categories field to articles This allows editors to add categories to article nodes. The configuration mimics the setup we currently use for events: 1 category oer value expoed through a select list and shown on the full page. --- ...tity_form_display.node.article.default.yml | 7 +++++ ....entity_view_display.node.article.card.yml | 2 ++ ...tity_view_display.node.article.default.yml | 9 ++++++ ....entity_view_display.node.article.full.yml | 14 +++++++-- ...ntity_view_display.node.article.teaser.yml | 2 ++ ...ld.field.node.article.field_categories.yml | 29 +++++++++++++++++++ .../field.storage.node.field_categories.yml | 20 +++++++++++++ 7 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 config/sync/field.field.node.article.field_categories.yml create mode 100644 config/sync/field.storage.node.field_categories.yml diff --git a/config/sync/core.entity_form_display.node.article.default.yml b/config/sync/core.entity_form_display.node.article.default.yml index 0fe37ed2a..4781469ab 100644 --- a/config/sync/core.entity_form_display.node.article.default.yml +++ b/config/sync/core.entity_form_display.node.article.default.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - field.field.node.article.field_canonical_url + - field.field.node.article.field_categories - field.field.node.article.field_override_author - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author @@ -67,6 +68,12 @@ content: placeholder_url: '' placeholder_title: '' third_party_settings: { } + field_categories: + type: options_select + weight: 26 + region: content + settings: { } + third_party_settings: { } field_override_author: type: string_textfield weight: 5 diff --git a/config/sync/core.entity_view_display.node.article.card.yml b/config/sync/core.entity_view_display.node.article.card.yml index 675d8e214..915fee2eb 100644 --- a/config/sync/core.entity_view_display.node.article.card.yml +++ b/config/sync/core.entity_view_display.node.article.card.yml @@ -5,6 +5,7 @@ dependencies: config: - core.entity_view_mode.node.card - field.field.node.article.field_canonical_url + - field.field.node.article.field_categories - field.field.node.article.field_override_author - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author @@ -45,6 +46,7 @@ content: region: content hidden: field_canonical_url: true + field_categories: true field_override_author: true field_paragraphs: true field_show_override_author: true diff --git a/config/sync/core.entity_view_display.node.article.default.yml b/config/sync/core.entity_view_display.node.article.default.yml index 32c54032d..488c39fef 100644 --- a/config/sync/core.entity_view_display.node.article.default.yml +++ b/config/sync/core.entity_view_display.node.article.default.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - field.field.node.article.field_canonical_url + - field.field.node.article.field_categories - field.field.node.article.field_override_author - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author @@ -18,6 +19,14 @@ targetEntityType: node bundle: article mode: default content: + field_categories: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 110 + region: content field_override_author: type: string label: above diff --git a/config/sync/core.entity_view_display.node.article.full.yml b/config/sync/core.entity_view_display.node.article.full.yml index b4d123ba9..5b2d5102d 100644 --- a/config/sync/core.entity_view_display.node.article.full.yml +++ b/config/sync/core.entity_view_display.node.article.full.yml @@ -5,6 +5,7 @@ dependencies: config: - core.entity_view_mode.node.full - field.field.node.article.field_canonical_url + - field.field.node.article.field_categories - field.field.node.article.field_override_author - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author @@ -20,6 +21,14 @@ targetEntityType: node bundle: article mode: full content: + field_categories: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 1 + region: content field_paragraphs: type: entity_reference_revisions_entity_view label: hidden @@ -27,7 +36,7 @@ content: view_mode: default link: '' third_party_settings: { } - weight: 0 + weight: 2 region: content field_subtitle: type: basic_string @@ -39,7 +48,7 @@ content: links: settings: { } third_party_settings: { } - weight: 1 + weight: 3 region: content hidden: field_canonical_url: true @@ -48,5 +57,4 @@ hidden: field_teaser_image: true field_teaser_text: true langcode: true - links: true search_api_excerpt: true diff --git a/config/sync/core.entity_view_display.node.article.teaser.yml b/config/sync/core.entity_view_display.node.article.teaser.yml index 077368f6a..32f56b04b 100644 --- a/config/sync/core.entity_view_display.node.article.teaser.yml +++ b/config/sync/core.entity_view_display.node.article.teaser.yml @@ -5,6 +5,7 @@ dependencies: config: - core.entity_view_mode.node.teaser - field.field.node.article.field_canonical_url + - field.field.node.article.field_categories - field.field.node.article.field_override_author - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author @@ -26,6 +27,7 @@ content: region: content hidden: field_canonical_url: true + field_categories: true field_override_author: true field_paragraphs: true field_show_override_author: true diff --git a/config/sync/field.field.node.article.field_categories.yml b/config/sync/field.field.node.article.field_categories.yml new file mode 100644 index 000000000..fac401c25 --- /dev/null +++ b/config/sync/field.field.node.article.field_categories.yml @@ -0,0 +1,29 @@ +uuid: b7e901e0-5368-4092-ad15-3b52e5902503 +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_categories + - node.type.article + - taxonomy.vocabulary.categories +id: node.article.field_categories +field_name: field_categories +entity_type: node +bundle: article +label: Categories +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + categories: categories + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.node.field_categories.yml b/config/sync/field.storage.node.field_categories.yml new file mode 100644 index 000000000..315f6e308 --- /dev/null +++ b/config/sync/field.storage.node.field_categories.yml @@ -0,0 +1,20 @@ +uuid: 606b481a-f890-4c7d-90ca-4da2dacfb068 +langcode: en +status: true +dependencies: + module: + - node + - taxonomy +id: node.field_categories +field_name: field_categories +entity_type: node +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false From da530a2f12961700c6706d76ba3bc765aec17932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:29:29 +0100 Subject: [PATCH 27/94] Show categories on event page --- .../novel/templates/layout/node--article--full.html.twig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/themes/custom/novel/templates/layout/node--article--full.html.twig b/web/themes/custom/novel/templates/layout/node--article--full.html.twig index 3fbae2099..fbcebfeab 100644 --- a/web/themes/custom/novel/templates/layout/node--article--full.html.twig +++ b/web/themes/custom/novel/templates/layout/node--article--full.html.twig @@ -1,5 +1,10 @@
+ {% if (content.field_categories.0) %} +
+ {{ content.field_categories }} +
+ {% endif %}

{{ label }}

{{ content.field_subtitle }} From c77f6712cdf80c67010649523e6dcd38231df046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:33:19 +0100 Subject: [PATCH 28/94] Fix size of category tags Tags should be large everywhere except for on the event list Remove the current default of small and set sizes on individual templates instead. Articles, event series and event instance display use large size. Event instances in the list uses small size. --- .../field--eventinstance--event-categories--full.html.twig | 4 ++++ ...ld--eventinstance--event-categories--list-teaser.html.twig | 2 +- .../fields/field--eventinstance--event-categories.html.twig | 2 -- .../field--eventseries--field-categories--full.html.twig | 4 ++++ .../novel/templates/fields/field--field-categories.html.twig | 1 - .../fields/field--node--field-categories--full.html.twig | 4 ++++ 6 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--full.html.twig delete mode 100644 web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig create mode 100644 web/themes/custom/novel/templates/fields/field--eventseries--field-categories--full.html.twig create mode 100644 web/themes/custom/novel/templates/fields/field--node--field-categories--full.html.twig diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--full.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--full.html.twig new file mode 100644 index 000000000..966221f80 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--full.html.twig @@ -0,0 +1,4 @@ +{% for item in items %} + {% set item = item|merge({'attributes': item.attributes.addClass('tag--large')}) %} +{% endfor %} +{{ include('field--field-categories.html.twig') }} diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig index 77fc2793c..3f8e924f8 100644 --- a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories--list-teaser.html.twig @@ -1,4 +1,4 @@ {% for item in items %} - {% set item = item|merge({'attributes': item.attributes.addClass('event-list-item__tag')}) %} + {% set item = item|merge({'attributes': item.attributes.addClass('tag--small').addClass('event-list-item__tag')}) %} {% endfor %} {% include 'field--field-categories.html.twig' %} diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig deleted file mode 100644 index 9afea88b1..000000000 --- a/web/themes/custom/novel/templates/fields/field--eventinstance--event-categories.html.twig +++ /dev/null @@ -1,2 +0,0 @@ -{# Reuse event field template #} -{{ include('field--field-categories.html.twig') }} diff --git a/web/themes/custom/novel/templates/fields/field--eventseries--field-categories--full.html.twig b/web/themes/custom/novel/templates/fields/field--eventseries--field-categories--full.html.twig new file mode 100644 index 000000000..966221f80 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--eventseries--field-categories--full.html.twig @@ -0,0 +1,4 @@ +{% for item in items %} + {% set item = item|merge({'attributes': item.attributes.addClass('tag--large')}) %} +{% endfor %} +{{ include('field--field-categories.html.twig') }} diff --git a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig index d837bbd2c..647ab8635 100644 --- a/web/themes/custom/novel/templates/fields/field--field-categories.html.twig +++ b/web/themes/custom/novel/templates/fields/field--field-categories.html.twig @@ -5,7 +5,6 @@ {% set item_classes = [ 'tag', 'tag--fill', - 'tag--small' ] %} {% if items|length > 1 %} diff --git a/web/themes/custom/novel/templates/fields/field--node--field-categories--full.html.twig b/web/themes/custom/novel/templates/fields/field--node--field-categories--full.html.twig new file mode 100644 index 000000000..730e6405e --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--node--field-categories--full.html.twig @@ -0,0 +1,4 @@ +{% for item in items %} + {% set item = item|merge({'attributes': item.attributes.addClass('tag--large')}) %} +{% endfor %} +{% include 'field--field-categories.html.twig' %} From 5dcd5b8e911a1b73c092e8f1a6e10fe319a909ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:33:48 +0100 Subject: [PATCH 29/94] Configuration update This was added during configuration export for whatever reason. --- config/sync/language/da/core.date_format.short.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/config/sync/language/da/core.date_format.short.yml b/config/sync/language/da/core.date_format.short.yml index 548d9c9f5..0617b7e73 100644 --- a/config/sync/language/da/core.date_format.short.yml +++ b/config/sync/language/da/core.date_format.short.yml @@ -1,2 +1 @@ label: 'Standard kort dato' -pattern: 'm/d/Y - H:i' From 98967a8cf45bb6b8c1ce57f85b21b521a977b36c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:42:02 +0100 Subject: [PATCH 30/94] Update article in example content with a category term --- .../2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml | 4 +++ .../92033694-15ac-4d9e-b275-ddfd18e48d9f.yml | 33 +++++++++++++++++++ .../dpl_example_content.info.yml | 1 + 3 files changed, 38 insertions(+) create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/92033694-15ac-4d9e-b275-ddfd18e48d9f.yml diff --git a/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml b/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml index 2f18556b5..b9ee62a04 100644 --- a/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml +++ b/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml @@ -5,6 +5,7 @@ _meta: bundle: article default_langcode: da depends: + 92033694-15ac-4d9e-b275-ddfd18e48d9f: taxonomy_term aba3cea8-cee5-42c1-a152-e30c2ab135e2: media d97a25fd-a6ae-48b9-9a1a-7aec5372688e: media eef50571-39dc-461a-96ff-b6b7180ade61: media @@ -41,6 +42,9 @@ default: attributes: name: title content: 'Jesper Stein vinder Læsernes Bogpris for Rampen | DPL CMS' + field_categories: + - + entity: 92033694-15ac-4d9e-b275-ddfd18e48d9f field_override_author: - value: 'Lene Kuhlmann Frandsen ' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/92033694-15ac-4d9e-b275-ddfd18e48d9f.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/92033694-15ac-4d9e-b275-ddfd18e48d9f.yml new file mode 100644 index 000000000..84dc13a7e --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/92033694-15ac-4d9e-b275-ddfd18e48d9f.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 92033694-15ac-4d9e-b275-ddfd18e48d9f + bundle: categories + default_langcode: da +default: + status: + - + value: true + name: + - + value: Netmedier + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'Netmedier | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/2' diff --git a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml index 0a1edef64..8e5db9a68 100644 --- a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml +++ b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml @@ -42,3 +42,4 @@ default_content: taxonomy_term: # Category used by eventseries 1 - f457c4c2-dc28-45cd-9b6e-fda4248d9d45 + - 92033694-15ac-4d9e-b275-ddfd18e48d9f From 14524cb1600693022da6b804d6cc9da99319aca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:42:56 +0100 Subject: [PATCH 31/94] Add task for updating example content I always have to look it up in the documentation. Having a task for it should make it easier. --- Taskfile.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Taskfile.yml b/Taskfile.yml index 72c2c50fc..fc07e78d7 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -274,6 +274,11 @@ tasks: -i https://raw.githubusercontent.com/danskernesdigitalebibliotek/dpl-react/main/src/core/fbs/fbs-adapter.yaml \ -g php -o /local/packages/fbs-client -c /openapi-generator.config.fbs.yaml + dev:example-content:update: + desc: Update the example content module with data from the current site + cmds: + - cmd: task dev:cli -- drush default-content:export-module dpl_example_content + ci:reset: desc: Create CI setup in a clean state cmds: From 289d4b22385679b2dd52df8278881d9604397aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:43:58 +0100 Subject: [PATCH 32/94] Create a new taxonomy for tags This is set up in the same way as the current Categories taxonomy. --- .../language.content_settings.taxonomy_term.tags.yml | 11 +++++++++++ config/sync/taxonomy.vocabulary.tags.yml | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 config/sync/language.content_settings.taxonomy_term.tags.yml create mode 100644 config/sync/taxonomy.vocabulary.tags.yml diff --git a/config/sync/language.content_settings.taxonomy_term.tags.yml b/config/sync/language.content_settings.taxonomy_term.tags.yml new file mode 100644 index 000000000..3a01214f2 --- /dev/null +++ b/config/sync/language.content_settings.taxonomy_term.tags.yml @@ -0,0 +1,11 @@ +uuid: 0b56acc2-af89-486e-936f-3e557a4ea03e +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.tags +id: taxonomy_term.tags +target_entity_type_id: taxonomy_term +target_bundle: tags +default_langcode: da +language_alterable: false diff --git a/config/sync/taxonomy.vocabulary.tags.yml b/config/sync/taxonomy.vocabulary.tags.yml new file mode 100644 index 000000000..3357f2188 --- /dev/null +++ b/config/sync/taxonomy.vocabulary.tags.yml @@ -0,0 +1,8 @@ +uuid: 32b05c42-513c-470f-95b4-c1518e6b91bb +langcode: da +status: true +dependencies: { } +name: Tags +vid: tags +description: '' +weight: 0 From 43f6d350c7af98478325b164a4e3db33e8a0003a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:45:38 +0100 Subject: [PATCH 33/94] Setup form mode for tags taxonomy We hide the description field by default. We do not use it at the moment. Removing it cleans up the admin UX. --- ...orm_display.taxonomy_term.tags.default.yml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 config/sync/core.entity_form_display.taxonomy_term.tags.default.yml diff --git a/config/sync/core.entity_form_display.taxonomy_term.tags.default.yml b/config/sync/core.entity_form_display.taxonomy_term.tags.default.yml new file mode 100644 index 000000000..c88c80938 --- /dev/null +++ b/config/sync/core.entity_form_display.taxonomy_term.tags.default.yml @@ -0,0 +1,35 @@ +uuid: 6151cf14-ab6f-4478-a6f1-7bc945379aa6 +langcode: en +status: true +dependencies: + config: + - taxonomy.vocabulary.tags +id: taxonomy_term.tags.default +targetEntityType: taxonomy_term +bundle: tags +mode: default +content: + langcode: + type: language_select + weight: 1 + region: content + settings: + include_locked: true + third_party_settings: { } + name: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + status: + type: boolean_checkbox + weight: 2 + region: content + settings: + display_label: true + third_party_settings: { } +hidden: + description: true From f4f1dcebc109b9e88f659d32198ac603c4226e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 13:49:56 +0100 Subject: [PATCH 34/94] Add tags support to articles Add an entity reference field with the following configuration to behave like tagging: - Unlimited cardinality - Autocomplete using contains - Create new entities --- ...tity_form_display.node.article.default.yml | 11 +++++++ ....entity_view_display.node.article.card.yml | 2 ++ ...tity_view_display.node.article.default.yml | 9 ++++++ ....entity_view_display.node.article.full.yml | 2 ++ ...ntity_view_display.node.article.teaser.yml | 2 ++ .../field.field.node.article.field_tags.yml | 29 +++++++++++++++++++ config/sync/field.storage.node.field_tags.yml | 20 +++++++++++++ 7 files changed, 75 insertions(+) create mode 100644 config/sync/field.field.node.article.field_tags.yml create mode 100644 config/sync/field.storage.node.field_tags.yml diff --git a/config/sync/core.entity_form_display.node.article.default.yml b/config/sync/core.entity_form_display.node.article.default.yml index 4781469ab..029e0526e 100644 --- a/config/sync/core.entity_form_display.node.article.default.yml +++ b/config/sync/core.entity_form_display.node.article.default.yml @@ -9,6 +9,7 @@ dependencies: - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author - field.field.node.article.field_subtitle + - field.field.node.article.field_tags - field.field.node.article.field_teaser_image - field.field.node.article.field_teaser_text - node.type.article @@ -125,6 +126,16 @@ content: rows: 3 placeholder: '' third_party_settings: { } + field_tags: + type: entity_reference_autocomplete_tags + weight: 27 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } field_teaser_image: type: media_library_widget weight: 9 diff --git a/config/sync/core.entity_view_display.node.article.card.yml b/config/sync/core.entity_view_display.node.article.card.yml index 915fee2eb..5e8a67b06 100644 --- a/config/sync/core.entity_view_display.node.article.card.yml +++ b/config/sync/core.entity_view_display.node.article.card.yml @@ -10,6 +10,7 @@ dependencies: - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author - field.field.node.article.field_subtitle + - field.field.node.article.field_tags - field.field.node.article.field_teaser_image - field.field.node.article.field_teaser_text - node.type.article @@ -50,6 +51,7 @@ hidden: field_override_author: true field_paragraphs: true field_show_override_author: true + field_tags: true langcode: true links: true search_api_excerpt: true diff --git a/config/sync/core.entity_view_display.node.article.default.yml b/config/sync/core.entity_view_display.node.article.default.yml index 488c39fef..ed0bfdcca 100644 --- a/config/sync/core.entity_view_display.node.article.default.yml +++ b/config/sync/core.entity_view_display.node.article.default.yml @@ -9,6 +9,7 @@ dependencies: - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author - field.field.node.article.field_subtitle + - field.field.node.article.field_tags - field.field.node.article.field_teaser_image - field.field.node.article.field_teaser_text - node.type.article @@ -52,6 +53,14 @@ content: third_party_settings: { } weight: 101 region: content + field_tags: + type: entity_reference_label + label: above + settings: + link: true + third_party_settings: { } + weight: 111 + region: content field_teaser_image: type: entity_reference_label label: above diff --git a/config/sync/core.entity_view_display.node.article.full.yml b/config/sync/core.entity_view_display.node.article.full.yml index 5b2d5102d..1e0f990c7 100644 --- a/config/sync/core.entity_view_display.node.article.full.yml +++ b/config/sync/core.entity_view_display.node.article.full.yml @@ -10,6 +10,7 @@ dependencies: - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author - field.field.node.article.field_subtitle + - field.field.node.article.field_tags - field.field.node.article.field_teaser_image - field.field.node.article.field_teaser_text - node.type.article @@ -54,6 +55,7 @@ hidden: field_canonical_url: true field_override_author: true field_show_override_author: true + field_tags: true field_teaser_image: true field_teaser_text: true langcode: true diff --git a/config/sync/core.entity_view_display.node.article.teaser.yml b/config/sync/core.entity_view_display.node.article.teaser.yml index 32f56b04b..d54bb8499 100644 --- a/config/sync/core.entity_view_display.node.article.teaser.yml +++ b/config/sync/core.entity_view_display.node.article.teaser.yml @@ -10,6 +10,7 @@ dependencies: - field.field.node.article.field_paragraphs - field.field.node.article.field_show_override_author - field.field.node.article.field_subtitle + - field.field.node.article.field_tags - field.field.node.article.field_teaser_image - field.field.node.article.field_teaser_text - node.type.article @@ -32,6 +33,7 @@ hidden: field_paragraphs: true field_show_override_author: true field_subtitle: true + field_tags: true field_teaser_image: true field_teaser_text: true langcode: true diff --git a/config/sync/field.field.node.article.field_tags.yml b/config/sync/field.field.node.article.field_tags.yml new file mode 100644 index 000000000..e0342a1d6 --- /dev/null +++ b/config/sync/field.field.node.article.field_tags.yml @@ -0,0 +1,29 @@ +uuid: 7517705a-3d86-45c1-a036-d1efb903ca3f +langcode: en +status: true +dependencies: + config: + - field.storage.node.field_tags + - node.type.article + - taxonomy.vocabulary.tags +id: node.article.field_tags +field_name: field_tags +entity_type: node +bundle: article +label: Tags +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + tags: tags + sort: + field: name + direction: asc + auto_create: true + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.node.field_tags.yml b/config/sync/field.storage.node.field_tags.yml new file mode 100644 index 000000000..46e6fb29a --- /dev/null +++ b/config/sync/field.storage.node.field_tags.yml @@ -0,0 +1,20 @@ +uuid: f1c64683-d0d1-474e-9514-50396365f45d +langcode: en +status: true +dependencies: + module: + - node + - taxonomy +id: node.field_tags +field_name: field_tags +entity_type: node +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false From c4811e737df03c3f2b39b8e1cde623a2d80bf306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 15:36:53 +0100 Subject: [PATCH 35/94] Render tags as a part of articles Add the field to the display mode, render it in the template and add a field template which matches the design system. --- .../core.entity_view_display.node.article.full.yml | 13 ++++++++++--- .../templates/fields/field--field-tags.html.twig | 10 ++++++++++ .../templates/layout/node--article--full.html.twig | 5 +++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 web/themes/custom/novel/templates/fields/field--field-tags.html.twig diff --git a/config/sync/core.entity_view_display.node.article.full.yml b/config/sync/core.entity_view_display.node.article.full.yml index 1e0f990c7..63662e941 100644 --- a/config/sync/core.entity_view_display.node.article.full.yml +++ b/config/sync/core.entity_view_display.node.article.full.yml @@ -37,7 +37,7 @@ content: view_mode: default link: '' third_party_settings: { } - weight: 2 + weight: 3 region: content field_subtitle: type: basic_string @@ -46,16 +46,23 @@ content: third_party_settings: { } weight: 0 region: content + field_tags: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 2 + region: content links: settings: { } third_party_settings: { } - weight: 3 + weight: 4 region: content hidden: field_canonical_url: true field_override_author: true field_show_override_author: true - field_tags: true field_teaser_image: true field_teaser_text: true langcode: true diff --git a/web/themes/custom/novel/templates/fields/field--field-tags.html.twig b/web/themes/custom/novel/templates/fields/field--field-tags.html.twig new file mode 100644 index 000000000..52f6121f8 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--field-tags.html.twig @@ -0,0 +1,10 @@ +
+

+ {{ "Tags"|trans({}, {"context": "Tags"}) }} +

+ {% for item in items %} + + {{ item.content }} + + {% endfor %} +
diff --git a/web/themes/custom/novel/templates/layout/node--article--full.html.twig b/web/themes/custom/novel/templates/layout/node--article--full.html.twig index fbcebfeab..def501cdc 100644 --- a/web/themes/custom/novel/templates/layout/node--article--full.html.twig +++ b/web/themes/custom/novel/templates/layout/node--article--full.html.twig @@ -16,6 +16,11 @@ {{ node.created.value|format_date('date_full_month') }}

+ {% if (content.field_tags.0) %} +
+ {{ content.field_tags }} +
+ {% endif %}
{{ content.field_paragraphs }} From 4dc9bacc20ba4b72afd890f6f4ab73d7dac9dcac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 16:54:09 +0100 Subject: [PATCH 36/94] Configure tags field on event series and event instances This field is configured the same way as on articles. --- ..._display.eventinstance.default.default.yml | 11 +++++++ ...rm_display.eventseries.default.default.yml | 11 +++++++ ...iew_display.eventinstance.default.card.yml | 10 +++++++ ..._display.eventinstance.default.default.yml | 10 +++++++ ...iew_display.eventinstance.default.list.yml | 10 +++++++ ...play.eventinstance.default.list_teaser.yml | 10 +++++++ ..._view_display.eventseries.default.card.yml | 2 ++ ...ew_display.eventseries.default.default.yml | 9 ++++++ ..._view_display.eventseries.default.list.yml | 2 ++ ...field.eventinstance.default.field_tags.yml | 29 +++++++++++++++++++ ...d.field.eventseries.default.field_tags.yml | 29 +++++++++++++++++++ ...field.storage.eventinstance.field_tags.yml | 20 +++++++++++++ .../field.storage.eventseries.field_tags.yml | 20 +++++++++++++ ...tance.eventinstance_default_event_tags.yml | 14 +++++++++ 14 files changed, 187 insertions(+) create mode 100644 config/sync/field.field.eventinstance.default.field_tags.yml create mode 100644 config/sync/field.field.eventseries.default.field_tags.yml create mode 100644 config/sync/field.storage.eventinstance.field_tags.yml create mode 100644 config/sync/field.storage.eventseries.field_tags.yml create mode 100644 config/sync/field_inheritance.field_inheritance.eventinstance_default_event_tags.yml diff --git a/config/sync/core.entity_form_display.eventinstance.default.default.yml b/config/sync/core.entity_form_display.eventinstance.default.default.yml index e155de753..aa7542510 100644 --- a/config/sync/core.entity_form_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_form_display.eventinstance.default.default.yml @@ -12,6 +12,7 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories @@ -130,6 +131,16 @@ content: region: content settings: { } third_party_settings: { } + field_tags: + type: entity_reference_autocomplete_tags + weight: 27 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } field_teaser_image: type: media_library_widget weight: 13 diff --git a/config/sync/core.entity_form_display.eventseries.default.default.yml b/config/sync/core.entity_form_display.eventseries.default.default.yml index 36eea4de5..ffc93af13 100644 --- a/config/sync/core.entity_form_display.eventseries.default.default.yml +++ b/config/sync/core.entity_form_display.eventseries.default.default.yml @@ -12,6 +12,7 @@ dependencies: - field.field.eventseries.default.field_event_partners - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state + - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text - field.field.eventseries.default.field_ticket_categories @@ -154,6 +155,16 @@ content: region: content settings: { } third_party_settings: { } + field_tags: + type: entity_reference_autocomplete_tags + weight: 27 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } field_teaser_image: type: media_library_widget weight: 22 diff --git a/config/sync/core.entity_view_display.eventinstance.default.card.yml b/config/sync/core.entity_view_display.eventinstance.default.card.yml index 7d5149c64..5c312ab42 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.card.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.card.yml @@ -13,6 +13,7 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories @@ -55,6 +56,14 @@ content: third_party_settings: { } weight: 52 region: content + event_tags: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_teaser_image: type: entity_reference_entity_view label: hidden @@ -101,6 +110,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_teaser_image: true field_teaser_text: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.default.yml b/config/sync/core.entity_view_display.eventinstance.default.default.yml index 428315640..955937475 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.default.yml @@ -12,6 +12,7 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories @@ -118,6 +119,14 @@ content: third_party_settings: { } weight: 7 region: content + event_tags: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 13 + region: content event_teaser_image: type: entity_reference_entity_view label: hidden @@ -165,6 +174,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_teaser_image: true field_teaser_text: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list.yml b/config/sync/core.entity_view_display.eventinstance.default.list.yml index 7f1748d3d..2e80e8a5e 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list.yml @@ -13,6 +13,7 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories @@ -123,6 +124,14 @@ content: third_party_settings: { } weight: 57 region: content + event_tags: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_teaser_image: type: entity_reference_label label: visible @@ -167,6 +176,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_teaser_image: true field_teaser_text: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml index 7ad482dc5..90f43d2a3 100644 --- a/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml +++ b/config/sync/core.entity_view_display.eventinstance.default.list_teaser.yml @@ -13,6 +13,7 @@ dependencies: - field.field.eventinstance.default.field_event_partners - field.field.eventinstance.default.field_event_place - field.field.eventinstance.default.field_event_state + - field.field.eventinstance.default.field_tags - field.field.eventinstance.default.field_teaser_image - field.field.eventinstance.default.field_teaser_text - field.field.eventinstance.default.field_ticket_categories @@ -119,6 +120,14 @@ content: third_party_settings: { } weight: 7 region: content + event_tags: + type: entity_reference_label + label: visible + settings: + link: true + third_party_settings: { } + weight: 60 + region: content event_ticket_categories: type: entity_reference_revisions_entity_view label: hidden @@ -151,6 +160,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_teaser_image: true field_teaser_text: true field_ticket_categories: true diff --git a/config/sync/core.entity_view_display.eventseries.default.card.yml b/config/sync/core.entity_view_display.eventseries.default.card.yml index d79a19754..4aa53bd77 100644 --- a/config/sync/core.entity_view_display.eventseries.default.card.yml +++ b/config/sync/core.entity_view_display.eventseries.default.card.yml @@ -13,6 +13,7 @@ dependencies: - field.field.eventseries.default.field_event_partners - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state + - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text - field.field.eventseries.default.field_ticket_categories @@ -74,6 +75,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_ticket_categories: true monthly_recurring_date: true search_api_excerpt: true diff --git a/config/sync/core.entity_view_display.eventseries.default.default.yml b/config/sync/core.entity_view_display.eventseries.default.default.yml index 1f9014f51..3b6661de1 100644 --- a/config/sync/core.entity_view_display.eventseries.default.default.yml +++ b/config/sync/core.entity_view_display.eventseries.default.default.yml @@ -12,6 +12,7 @@ dependencies: - field.field.eventseries.default.field_event_partners - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state + - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text - field.field.eventseries.default.field_ticket_categories @@ -106,6 +107,14 @@ content: third_party_settings: { } weight: 7 region: content + field_tags: + type: entity_reference_label + label: hidden + settings: + link: false + third_party_settings: { } + weight: 14 + region: content field_teaser_image: type: entity_reference_entity_view label: hidden diff --git a/config/sync/core.entity_view_display.eventseries.default.list.yml b/config/sync/core.entity_view_display.eventseries.default.list.yml index 5fc4db412..f0daa7c3c 100644 --- a/config/sync/core.entity_view_display.eventseries.default.list.yml +++ b/config/sync/core.entity_view_display.eventseries.default.list.yml @@ -13,6 +13,7 @@ dependencies: - field.field.eventseries.default.field_event_partners - field.field.eventseries.default.field_event_place - field.field.eventseries.default.field_event_state + - field.field.eventseries.default.field_tags - field.field.eventseries.default.field_teaser_image - field.field.eventseries.default.field_teaser_text - field.field.eventseries.default.field_ticket_categories @@ -57,6 +58,7 @@ hidden: field_event_partners: true field_event_place: true field_event_state: true + field_tags: true field_teaser_image: true field_teaser_text: true field_ticket_categories: true diff --git a/config/sync/field.field.eventinstance.default.field_tags.yml b/config/sync/field.field.eventinstance.default.field_tags.yml new file mode 100644 index 000000000..451e14af6 --- /dev/null +++ b/config/sync/field.field.eventinstance.default.field_tags.yml @@ -0,0 +1,29 @@ +uuid: 2e81bf76-23e4-4fe2-8877-4eac3f1bad3b +langcode: en +status: true +dependencies: + config: + - field.storage.eventinstance.field_tags + - recurring_events.eventinstance_type.default + - taxonomy.vocabulary.categories +id: eventinstance.default.field_tags +field_name: field_tags +entity_type: eventinstance +bundle: default +label: Tags +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + categories: categories + sort: + field: name + direction: asc + auto_create: true + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.field.eventseries.default.field_tags.yml b/config/sync/field.field.eventseries.default.field_tags.yml new file mode 100644 index 000000000..b5a0dc9de --- /dev/null +++ b/config/sync/field.field.eventseries.default.field_tags.yml @@ -0,0 +1,29 @@ +uuid: ed2b3cf7-f4d1-4167-94d0-50dbe95bdec4 +langcode: en +status: true +dependencies: + config: + - field.storage.eventseries.field_tags + - recurring_events.eventseries_type.default + - taxonomy.vocabulary.tags +id: eventseries.default.field_tags +field_name: field_tags +entity_type: eventseries +bundle: default +label: Tags +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + tags: tags + sort: + field: name + direction: asc + auto_create: true + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/sync/field.storage.eventinstance.field_tags.yml b/config/sync/field.storage.eventinstance.field_tags.yml new file mode 100644 index 000000000..09f4afa66 --- /dev/null +++ b/config/sync/field.storage.eventinstance.field_tags.yml @@ -0,0 +1,20 @@ +uuid: a88eba08-fb9d-45b3-b770-020dfac9aaf8 +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventinstance.field_tags +field_name: field_tags +entity_type: eventinstance +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field.storage.eventseries.field_tags.yml b/config/sync/field.storage.eventseries.field_tags.yml new file mode 100644 index 000000000..2696c6fd4 --- /dev/null +++ b/config/sync/field.storage.eventseries.field_tags.yml @@ -0,0 +1,20 @@ +uuid: 918716d3-6683-4c08-be44-c9ca9600392e +langcode: en +status: true +dependencies: + module: + - recurring_events + - taxonomy +id: eventseries.field_tags +field_name: field_tags +entity_type: eventseries +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: -1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_tags.yml b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_tags.yml new file mode 100644 index 000000000..2ab575ecc --- /dev/null +++ b/config/sync/field_inheritance.field_inheritance.eventinstance_default_event_tags.yml @@ -0,0 +1,14 @@ +uuid: 9ec22a66-5c83-4616-a931-b4843559c7ac +langcode: en +status: true +dependencies: { } +id: eventinstance_default_event_tags +label: 'Event tags' +type: fallback +sourceEntityType: eventseries +sourceEntityBundle: default +sourceField: field_tags +destinationEntityType: eventinstance +destinationEntityBundle: default +destinationField: field_tags +plugin: entity_reference_inheritance From c82ef8f2f03233013892b5d3d187bb82b4127905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Thu, 25 Jan 2024 16:58:57 +0100 Subject: [PATCH 37/94] Display tags on event series and instances Include the fields in layouts and add a field template. --- .../custom/novel/templates/components/full-event.html.twig | 4 +++- .../fields/field--eventinstance--event-tags.html.twig | 2 ++ .../novel/templates/layout/eventinstance--full.html.twig | 1 + .../custom/novel/templates/layout/eventseries--full.html.twig | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 web/themes/custom/novel/templates/fields/field--eventinstance--event-tags.html.twig diff --git a/web/themes/custom/novel/templates/components/full-event.html.twig b/web/themes/custom/novel/templates/components/full-event.html.twig index 0b154bb4e..4b969d0a9 100644 --- a/web/themes/custom/novel/templates/components/full-event.html.twig +++ b/web/themes/custom/novel/templates/components/full-event.html.twig @@ -26,7 +26,9 @@
{{ description }}
diff --git a/web/themes/custom/novel/templates/fields/field--eventinstance--event-tags.html.twig b/web/themes/custom/novel/templates/fields/field--eventinstance--event-tags.html.twig new file mode 100644 index 000000000..ac5e84c30 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--eventinstance--event-tags.html.twig @@ -0,0 +1,2 @@ +{# Reuse event field template #} +{{ include('field--field-tags.html.twig') }} diff --git a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig index ad1e13ee9..0b5c02903 100644 --- a/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventinstance--full.html.twig @@ -31,4 +31,5 @@ 'description': content.event_description, 'description_items': description_items, 'categories': content.event_categories, + 'tags': content.event_tags, } only %} diff --git a/web/themes/custom/novel/templates/layout/eventseries--full.html.twig b/web/themes/custom/novel/templates/layout/eventseries--full.html.twig index 52dbd6038..67837777b 100644 --- a/web/themes/custom/novel/templates/layout/eventseries--full.html.twig +++ b/web/themes/custom/novel/templates/layout/eventseries--full.html.twig @@ -14,7 +14,8 @@ "event_paragraphs": content.field_event_paragraphs, "event_place": content.field_event_place, "event_state": content.field_event_state, - "event_ticket_categories": content.field_ticket_categories + "event_ticket_categories": content.field_ticket_categories, + "event_tags": content.field_tags, } %} {% include '@novel/layout/eventinstance--full.html.twig' with { From ddd275ffa38a55a1e93c2f0bf250b61f8d6ff1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 26 Jan 2024 09:06:28 +0100 Subject: [PATCH 38/94] Use an appropriate HTML heading level Full view for articles requires H2 while events use H3. Introduce a horizontal term line component similar to the design system with a configurable heading and use this from field templates accordingly. --- .../components/horizontal-term-line.html.twig | 12 ++++++++++++ .../templates/fields/field--field-tags.html.twig | 14 ++++---------- ...ield--node--field-tags--article--full.html.twig | 5 +++++ 3 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 web/themes/custom/novel/templates/components/horizontal-term-line.html.twig create mode 100644 web/themes/custom/novel/templates/fields/field--node--field-tags--article--full.html.twig diff --git a/web/themes/custom/novel/templates/components/horizontal-term-line.html.twig b/web/themes/custom/novel/templates/components/horizontal-term-line.html.twig new file mode 100644 index 000000000..6f2b4ddff --- /dev/null +++ b/web/themes/custom/novel/templates/components/horizontal-term-line.html.twig @@ -0,0 +1,12 @@ +{% set heading = heading|default('h3') %} + +
+ <{{ heading }} class="text-label-bold"> + {{ title }} + + {% for item in items %} + + {{ item.content }} + + {% endfor %} +
diff --git a/web/themes/custom/novel/templates/fields/field--field-tags.html.twig b/web/themes/custom/novel/templates/fields/field--field-tags.html.twig index 52f6121f8..a7272f217 100644 --- a/web/themes/custom/novel/templates/fields/field--field-tags.html.twig +++ b/web/themes/custom/novel/templates/fields/field--field-tags.html.twig @@ -1,10 +1,4 @@ -
-

- {{ "Tags"|trans({}, {"context": "Tags"}) }} -

- {% for item in items %} - - {{ item.content }} - - {% endfor %} -
+{% include '@novel/components/horizontal-term-line.html.twig' with { + 'title': "Tags"|trans({}, {"context": "Tags"}), + 'items': items, +} only %} diff --git a/web/themes/custom/novel/templates/fields/field--node--field-tags--article--full.html.twig b/web/themes/custom/novel/templates/fields/field--node--field-tags--article--full.html.twig new file mode 100644 index 000000000..526d06702 --- /dev/null +++ b/web/themes/custom/novel/templates/fields/field--node--field-tags--article--full.html.twig @@ -0,0 +1,5 @@ +{% include '@novel/components/horizontal-term-line.html.twig' with { + 'title': "Tags"|trans({}, {"context": "Tags"}), + 'heading': "h2", + 'items': items, +} only %} From 30f96e8d41c177c8d97d0fe4dff6ed770149e01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 26 Jan 2024 10:05:20 +0100 Subject: [PATCH 39/94] Add tags to example content This replicates the terms used for the content in Figma. --- .../c8177097-1438-493e-8177-e8ef968cc133.yml | 19 +++++++++++ .../2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml | 19 +++++++++++ .../0502836d-0f7b-4b21-9371-c40ae9e01495.yml | 33 +++++++++++++++++++ .../1006441f-bb39-43b5-8c08-1a79344abf8b.yml | 33 +++++++++++++++++++ .../190beb00-d5af-4c9a-be8d-65a646b37bbb.yml | 33 +++++++++++++++++++ .../53133c2e-1023-43a9-baf2-64a5081eea0f.yml | 33 +++++++++++++++++++ .../725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4.yml | 33 +++++++++++++++++++ .../ec76c707-898d-4dfd-8cd2-e258aef1d6dd.yml | 33 +++++++++++++++++++ .../dpl_example_content.info.yml | 6 ++++ 9 files changed, 242 insertions(+) create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/0502836d-0f7b-4b21-9371-c40ae9e01495.yml create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/1006441f-bb39-43b5-8c08-1a79344abf8b.yml create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/190beb00-d5af-4c9a-be8d-65a646b37bbb.yml create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/53133c2e-1023-43a9-baf2-64a5081eea0f.yml create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4.yml create mode 100644 web/modules/custom/dpl_example_content/content/taxonomy_term/ec76c707-898d-4dfd-8cd2-e258aef1d6dd.yml diff --git a/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml b/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml index 72282886f..93a82b0da 100644 --- a/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml +++ b/web/modules/custom/dpl_example_content/content/eventseries/c8177097-1438-493e-8177-e8ef968cc133.yml @@ -10,6 +10,12 @@ _meta: 618e176a-a45a-4c36-a197-664230aa0a34: media dc33677f-8894-4717-b34b-d985f6ad875f: media 65432ee1-43f1-4130-9565-5683467d4b5a: media + 1006441f-bb39-43b5-8c08-1a79344abf8b: taxonomy_term + 53133c2e-1023-43a9-baf2-64a5081eea0f: taxonomy_term + 190beb00-d5af-4c9a-be8d-65a646b37bbb: taxonomy_term + 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4: taxonomy_term + ec76c707-898d-4dfd-8cd2-e258aef1d6dd: taxonomy_term + 0502836d-0f7b-4b21-9371-c40ae9e01495: taxonomy_term default: revision_uid: - @@ -267,6 +273,19 @@ default: field_event_state: - value: Active + field_tags: + - + entity: 1006441f-bb39-43b5-8c08-1a79344abf8b + - + entity: 53133c2e-1023-43a9-baf2-64a5081eea0f + - + entity: 190beb00-d5af-4c9a-be8d-65a646b37bbb + - + entity: 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4 + - + entity: ec76c707-898d-4dfd-8cd2-e258aef1d6dd + - + entity: 0502836d-0f7b-4b21-9371-c40ae9e01495 field_ticket_categories: - entity: diff --git a/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml b/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml index b9ee62a04..ffd8bd98e 100644 --- a/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml +++ b/web/modules/custom/dpl_example_content/content/node/2cd0fe5e-4159-4452-86aa-e1a1ac8db4a1.yml @@ -11,6 +11,12 @@ _meta: eef50571-39dc-461a-96ff-b6b7180ade61: media dc33677f-8894-4717-b34b-d985f6ad875f: media f0204f0b-1f63-4c76-bb67-e3f7489ee392: media + 1006441f-bb39-43b5-8c08-1a79344abf8b: taxonomy_term + 53133c2e-1023-43a9-baf2-64a5081eea0f: taxonomy_term + 190beb00-d5af-4c9a-be8d-65a646b37bbb: taxonomy_term + 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4: taxonomy_term + ec76c707-898d-4dfd-8cd2-e258aef1d6dd: taxonomy_term + 0502836d-0f7b-4b21-9371-c40ae9e01495: taxonomy_term default: revision_uid: - @@ -343,3 +349,16 @@ default: field_subtitle: - value: 'Jesper Stein har begået en hudløst ærlig og tankevækkende skildring af en skilsmisseramt familie. En selvbiografisk roman, som har ramt læserne i hjertet.' + field_tags: + - + entity: 1006441f-bb39-43b5-8c08-1a79344abf8b + - + entity: 53133c2e-1023-43a9-baf2-64a5081eea0f + - + entity: 190beb00-d5af-4c9a-be8d-65a646b37bbb + - + entity: 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4 + - + entity: ec76c707-898d-4dfd-8cd2-e258aef1d6dd + - + entity: 0502836d-0f7b-4b21-9371-c40ae9e01495 diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/0502836d-0f7b-4b21-9371-c40ae9e01495.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/0502836d-0f7b-4b21-9371-c40ae9e01495.yml new file mode 100644 index 000000000..dd5d8a994 --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/0502836d-0f7b-4b21-9371-c40ae9e01495.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 0502836d-0f7b-4b21-9371-c40ae9e01495 + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: '3-8 årige' + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: '3-8 årige | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/8' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/1006441f-bb39-43b5-8c08-1a79344abf8b.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/1006441f-bb39-43b5-8c08-1a79344abf8b.yml new file mode 100644 index 000000000..c3a8be079 --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/1006441f-bb39-43b5-8c08-1a79344abf8b.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 1006441f-bb39-43b5-8c08-1a79344abf8b + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: dans + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'dans | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/3' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/190beb00-d5af-4c9a-be8d-65a646b37bbb.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/190beb00-d5af-4c9a-be8d-65a646b37bbb.yml new file mode 100644 index 000000000..6cbdfb5cc --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/190beb00-d5af-4c9a-be8d-65a646b37bbb.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 190beb00-d5af-4c9a-be8d-65a646b37bbb + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: modern + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'modern | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/5' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/53133c2e-1023-43a9-baf2-64a5081eea0f.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/53133c2e-1023-43a9-baf2-64a5081eea0f.yml new file mode 100644 index 000000000..cab992910 --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/53133c2e-1023-43a9-baf2-64a5081eea0f.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 53133c2e-1023-43a9-baf2-64a5081eea0f + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: contemporary + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'contemporary | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/4' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4.yml new file mode 100644 index 000000000..c2cdf8033 --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4 + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: scenekunst + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'scenekunst | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/6' diff --git a/web/modules/custom/dpl_example_content/content/taxonomy_term/ec76c707-898d-4dfd-8cd2-e258aef1d6dd.yml b/web/modules/custom/dpl_example_content/content/taxonomy_term/ec76c707-898d-4dfd-8cd2-e258aef1d6dd.yml new file mode 100644 index 000000000..a7161d2ed --- /dev/null +++ b/web/modules/custom/dpl_example_content/content/taxonomy_term/ec76c707-898d-4dfd-8cd2-e258aef1d6dd.yml @@ -0,0 +1,33 @@ +_meta: + version: '1.0' + entity_type: taxonomy_term + uuid: ec76c707-898d-4dfd-8cd2-e258aef1d6dd + bundle: tags + default_langcode: da +default: + status: + - + value: true + name: + - + value: digt + weight: + - + value: 0 + parent: + - + target_id: 0 + revision_translation_affected: + - + value: true + metatag: + - + tag: meta + attributes: + name: title + content: 'digt | DPL CMS' + - + tag: link + attributes: + rel: canonical + href: 'http://dapple-cms.docker/taxonomy/term/7' diff --git a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml index 8e5db9a68..18c97b66b 100644 --- a/web/modules/custom/dpl_example_content/dpl_example_content.info.yml +++ b/web/modules/custom/dpl_example_content/dpl_example_content.info.yml @@ -43,3 +43,9 @@ default_content: # Category used by eventseries 1 - f457c4c2-dc28-45cd-9b6e-fda4248d9d45 - 92033694-15ac-4d9e-b275-ddfd18e48d9f + - 1006441f-bb39-43b5-8c08-1a79344abf8b + - 53133c2e-1023-43a9-baf2-64a5081eea0f + - 190beb00-d5af-4c9a-be8d-65a646b37bbb + - 725e0059-9c5d-4c4e-8e3d-6d8cf2042fa4 + - ec76c707-898d-4dfd-8cd2-e258aef1d6dd + - 0502836d-0f7b-4b21-9371-c40ae9e01495 From 36c59e931334ac612907effa9909b47ee49bce85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 26 Jan 2024 10:35:21 +0100 Subject: [PATCH 40/94] Rearrange category and tag fields on articles and events Place these fields near the top of the form close to where they are currently rendered in the UI. --- ..._display.eventinstance.default.default.yml | 20 +++++------ ...rm_display.eventseries.default.default.yml | 36 +++++++++---------- ...tity_form_display.node.article.default.yml | 16 ++++----- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/config/sync/core.entity_form_display.eventinstance.default.default.yml b/config/sync/core.entity_form_display.eventinstance.default.default.yml index aa7542510..978784e2b 100644 --- a/config/sync/core.entity_form_display.eventinstance.default.default.yml +++ b/config/sync/core.entity_form_display.eventinstance.default.default.yml @@ -33,7 +33,7 @@ third_party_settings: label: 'Teaser card' region: content parent_name: '' - weight: 11 + weight: 12 format_type: details_sidebar format_settings: classes: '' @@ -56,26 +56,26 @@ content: third_party_settings: { } field_categories: type: options_select - weight: 26 + weight: 3 region: content settings: { } third_party_settings: { } field_event_address: type: address_default - weight: 6 + weight: 7 region: content settings: { } third_party_settings: { } field_event_image: type: media_library_widget - weight: 9 + weight: 10 region: content settings: media_types: { } third_party_settings: { } field_event_link: type: link_default - weight: 5 + weight: 6 region: content settings: placeholder_url: '' @@ -83,7 +83,7 @@ content: third_party_settings: { } field_event_paragraphs: type: paragraphs - weight: 10 + weight: 11 region: content settings: title: Paragraph @@ -111,7 +111,7 @@ content: dialog_style: tiles field_event_partners: type: string_textfield - weight: 8 + weight: 9 region: content settings: size: 60 @@ -119,7 +119,7 @@ content: third_party_settings: { } field_event_place: type: string_textfield - weight: 7 + weight: 8 region: content settings: size: 60 @@ -133,7 +133,7 @@ content: third_party_settings: { } field_tags: type: entity_reference_autocomplete_tags - weight: 27 + weight: 4 region: content settings: match_operator: CONTAINS @@ -158,7 +158,7 @@ content: third_party_settings: { } field_ticket_categories: type: paragraphs - weight: 4 + weight: 5 region: content settings: title: Paragraph diff --git a/config/sync/core.entity_form_display.eventseries.default.default.yml b/config/sync/core.entity_form_display.eventseries.default.default.yml index ffc93af13..1555e706f 100644 --- a/config/sync/core.entity_form_display.eventseries.default.default.yml +++ b/config/sync/core.entity_form_display.eventseries.default.default.yml @@ -35,7 +35,7 @@ third_party_settings: label: 'Teaser card' region: content parent_name: '' - weight: 19 + weight: 20 format_type: details_sidebar format_settings: classes: '' @@ -60,31 +60,31 @@ content: third_party_settings: { } custom_date: type: daterange_default - weight: 4 + weight: 9 region: content settings: { } third_party_settings: { } daily_recurring_date: type: daily_recurring_date - weight: 4 + weight: 5 region: content settings: { } third_party_settings: { } field_categories: type: options_select - weight: 26 + weight: 10 region: content settings: { } third_party_settings: { } field_event_address: type: address_default - weight: 14 + weight: 15 region: content settings: { } third_party_settings: { } field_event_description: type: text_textarea - weight: 11 + weight: 12 region: content settings: rows: 5 @@ -92,14 +92,14 @@ content: third_party_settings: { } field_event_image: type: media_library_widget - weight: 17 + weight: 18 region: content settings: media_types: { } third_party_settings: { } field_event_link: type: link_default - weight: 13 + weight: 14 region: content settings: placeholder_url: '' @@ -107,7 +107,7 @@ content: third_party_settings: { } field_event_paragraphs: type: paragraphs - weight: 18 + weight: 19 region: content settings: title: Paragraph @@ -135,7 +135,7 @@ content: dialog_style: tiles field_event_partners: type: string_textfield - weight: 16 + weight: 17 region: content settings: size: 60 @@ -143,7 +143,7 @@ content: third_party_settings: { } field_event_place: type: string_textfield - weight: 15 + weight: 16 region: content settings: size: 60 @@ -151,13 +151,13 @@ content: third_party_settings: { } field_event_state: type: options_select - weight: 2 + weight: 3 region: content settings: { } third_party_settings: { } field_tags: type: entity_reference_autocomplete_tags - weight: 27 + weight: 11 region: content settings: match_operator: CONTAINS @@ -182,7 +182,7 @@ content: third_party_settings: { } field_ticket_categories: type: paragraphs - weight: 12 + weight: 13 region: content settings: title: Paragraph @@ -200,7 +200,7 @@ content: third_party_settings: { } monthly_recurring_date: type: monthly_recurring_date - weight: 4 + weight: 7 region: content settings: { } third_party_settings: { } @@ -212,7 +212,7 @@ content: third_party_settings: { } status: type: boolean_checkbox - weight: 1 + weight: 0 region: content settings: display_label: true @@ -237,13 +237,13 @@ content: third_party_settings: { } weekly_recurring_date: type: weekly_recurring_date - weight: 4 + weight: 6 region: content settings: { } third_party_settings: { } yearly_recurring_date: type: yearly_recurring_date - weight: 4 + weight: 8 region: content settings: { } third_party_settings: { } diff --git a/config/sync/core.entity_form_display.node.article.default.yml b/config/sync/core.entity_form_display.node.article.default.yml index 029e0526e..6237b2d3a 100644 --- a/config/sync/core.entity_form_display.node.article.default.yml +++ b/config/sync/core.entity_form_display.node.article.default.yml @@ -29,7 +29,7 @@ third_party_settings: label: 'Meta tags' region: content parent_name: '' - weight: 6 + weight: 8 format_type: details_sidebar format_settings: classes: '' @@ -46,7 +46,7 @@ third_party_settings: label: 'Teaser card' region: content parent_name: '' - weight: 7 + weight: 9 format_type: details_sidebar format_settings: classes: '' @@ -71,13 +71,13 @@ content: third_party_settings: { } field_categories: type: options_select - weight: 26 + weight: 2 region: content settings: { } third_party_settings: { } field_override_author: type: string_textfield - weight: 5 + weight: 7 region: content settings: size: 60 @@ -85,7 +85,7 @@ content: third_party_settings: { } field_paragraphs: type: paragraphs - weight: 2 + weight: 4 region: content settings: title: Paragraph @@ -113,7 +113,7 @@ content: show_drag_and_drop: true field_show_override_author: type: boolean_checkbox - weight: 4 + weight: 6 region: content settings: display_label: true @@ -128,7 +128,7 @@ content: third_party_settings: { } field_tags: type: entity_reference_autocomplete_tags - weight: 27 + weight: 3 region: content settings: match_operator: CONTAINS @@ -155,7 +155,7 @@ content: third_party_settings: { } status: type: boolean_checkbox - weight: 3 + weight: 5 region: content settings: display_label: true From 574600bda1fac037093222f816870bffc6b475bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 26 Jan 2024 12:27:36 +0100 Subject: [PATCH 41/94] Update composer.json to use design system with taxonomy This is a temporary commit to show the solution in Lagoon. It should be reverted before this is merged. --- composer.json | 6 +++--- composer.lock | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 251f0c56e..db1ace684 100644 --- a/composer.json +++ b/composer.json @@ -52,9 +52,9 @@ "package": { "name": "danskernesdigitalebibliotek/dpl-design-system", "type": "drupal-library", - "version": "2024.6.0-rc1", + "version": "0.0.0-dev", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-taxonomy_categories/dist-taxonomy-categories.zip", "type": "zip" } } @@ -74,7 +74,7 @@ "brick/math": "^0.12.1", "composer/installers": "1.12.0", "cweagans/composer-patches": "1.7.3", - "danskernesdigitalebibliotek/dpl-design-system": "2024.6.0-rc1", + "danskernesdigitalebibliotek/dpl-design-system": "0.0.0-dev", "danskernesdigitalebibliotek/dpl-react": "2024.6.0-rc1", "danskernesdigitalebibliotek/fbs-client": "*", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", diff --git a/composer.lock b/composer.lock index b56209027..d6a9f9de2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c73dcf69315148852dd966cab6a96793", + "content-hash": "48359da25f1633c551d2b5cc76b37b5a", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -1099,10 +1099,10 @@ }, { "name": "danskernesdigitalebibliotek/dpl-design-system", - "version": "2024.6.0-rc1", + "version": "0.0.0-dev", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-taxonomy_categories/dist-taxonomy-categories.zip" }, "type": "drupal-library" }, @@ -15374,6 +15374,7 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { + "danskernesdigitalebibliotek/dpl-design-system": 20, "drupal/customerror": 10, "drupal/default_content": 15, "drupal/gin": 5, From ce4c05020a503e7f139275fdefaf2fc8f80d976c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Garn=C3=A6s?= Date: Fri, 26 Jan 2024 17:04:49 +0100 Subject: [PATCH 42/94] Revert "Update composer.json to use design system with taxonomy" This reverts commit 574600bda1fac037093222f816870bffc6b475bd. --- composer.json | 6 +++--- composer.lock | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/composer.json b/composer.json index db1ace684..251f0c56e 100644 --- a/composer.json +++ b/composer.json @@ -52,9 +52,9 @@ "package": { "name": "danskernesdigitalebibliotek/dpl-design-system", "type": "drupal-library", - "version": "0.0.0-dev", + "version": "2024.6.0-rc1", "dist": { - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-taxonomy_categories/dist-taxonomy-categories.zip", + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip", "type": "zip" } } @@ -74,7 +74,7 @@ "brick/math": "^0.12.1", "composer/installers": "1.12.0", "cweagans/composer-patches": "1.7.3", - "danskernesdigitalebibliotek/dpl-design-system": "0.0.0-dev", + "danskernesdigitalebibliotek/dpl-design-system": "2024.6.0-rc1", "danskernesdigitalebibliotek/dpl-react": "2024.6.0-rc1", "danskernesdigitalebibliotek/fbs-client": "*", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", diff --git a/composer.lock b/composer.lock index d6a9f9de2..b56209027 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "48359da25f1633c551d2b5cc76b37b5a", + "content-hash": "c73dcf69315148852dd966cab6a96793", "packages": [ { "name": "amazeeio/drupal_integrations", @@ -1099,10 +1099,10 @@ }, { "name": "danskernesdigitalebibliotek/dpl-design-system", - "version": "0.0.0-dev", + "version": "2024.6.0-rc1", "dist": { "type": "zip", - "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-taxonomy_categories/dist-taxonomy-categories.zip" + "url": "https://github.com/danskernesdigitalebibliotek/dpl-design-system/releases/download/branch-release%2F2024-6-0/dist-release-2024-6-0.zip" }, "type": "drupal-library" }, @@ -15374,7 +15374,6 @@ "aliases": [], "minimum-stability": "dev", "stability-flags": { - "danskernesdigitalebibliotek/dpl-design-system": 20, "drupal/customerror": 10, "drupal/default_content": 15, "drupal/gin": 5, From 75c2b5791a63a216f4d4bf84dc5b305bd8a7299d Mon Sep 17 00:00:00 2001 From: Benjamin Rasmussen Date: Mon, 22 Jan 2024 18:00:25 +0100 Subject: [PATCH 43/94] Remove pointless event description title. DDFFORM-173 --- .../custom/novel/templates/components/full-event.html.twig | 1 - .../novel/templates/components/horizontal-term-line.html.twig | 2 +- .../fields/field--node--field-tags--article--full.html.twig | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/web/themes/custom/novel/templates/components/full-event.html.twig b/web/themes/custom/novel/templates/components/full-event.html.twig index 4b969d0a9..886fe95c7 100644 --- a/web/themes/custom/novel/templates/components/full-event.html.twig +++ b/web/themes/custom/novel/templates/components/full-event.html.twig @@ -22,7 +22,6 @@
-

{{ "Description"|trans }}

{{ description }}