From 6e42931222b4903cb409ac023a87d5fdf4c64243 Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Tue, 6 Jun 2023 08:57:22 -0500 Subject: [PATCH 1/8] Initial work on archive page import --- composer.json | 2 + composer.lock | 58 ++++++- .../custom/batch-import-example/README.md | 31 ++++ .../batch_import_example.info.yml | 5 + .../batch_import_example.module | 1 + .../batch_import_example.routing.yml | 8 + .../batch-import-example/docs/animals.json | 11 ++ .../docs/batch_example.gif | Bin 0 -> 115779 bytes .../src/Form/ImportForm.php | 141 ++++++++++++++++++ 9 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 web/modules/custom/batch-import-example/README.md create mode 100644 web/modules/custom/batch-import-example/batch_import_example.info.yml create mode 100644 web/modules/custom/batch-import-example/batch_import_example.module create mode 100644 web/modules/custom/batch-import-example/batch_import_example.routing.yml create mode 100644 web/modules/custom/batch-import-example/docs/animals.json create mode 100644 web/modules/custom/batch-import-example/docs/batch_example.gif create mode 100644 web/modules/custom/batch-import-example/src/Form/ImportForm.php diff --git a/composer.json b/composer.json index 6271ee857..faad8b85e 100644 --- a/composer.json +++ b/composer.json @@ -115,6 +115,7 @@ ], "require": { "php": ">=8.1", + "ext-dom": "*", "atomiks/tippyjs": "^5.2", "cferdinandi/tabby": "12.0.3", "composer/installers": "^2.1", @@ -156,6 +157,7 @@ "drupal/image_class": "^2.0", "drupal/image_effects": "^3.3", "drupal/imagemagick": "^3.3", + "drupal/imce": "^3.0", "drupal/inline_block_title_automatic": "^1.1", "drupal/inline_entity_form": "^1.0", "drupal/layout_builder_component_attributes": "^2.1", diff --git a/composer.lock b/composer.lock index da2e0f320..47a2ae11b 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": "b031fc0829c56ea7a9f10c6886619da6", + "content-hash": "095943c4add232e06580fc7aafb756cf", "packages": [ { "name": "arthurkushman/query-path", @@ -4097,6 +4097,59 @@ "source": "https://git.drupalcode.org/project/imagemagick" } }, + { + "name": "drupal/imce", + "version": "3.0.8", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/imce.git", + "reference": "3.0.8" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/imce-3.0.8.zip", + "reference": "3.0.8", + "shasum": "0abd0d0c7f2e01b2cddd9adde014f82e72453285" + }, + "require": { + "drupal/core": "^9.3 || ^10" + }, + "require-dev": { + "drupal/ckeditor": "^1.0" + }, + "type": "drupal-module", + "extra": { + "drupal": { + "version": "3.0.8", + "datestamp": "1683975052", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "See contributors", + "homepage": "https://www.drupal.org/node/2841111/committers", + "role": "Developer" + }, + { + "name": "ufku", + "homepage": "https://www.drupal.org/user/9910" + } + ], + "description": "Provides a file manager supporting personal folders.", + "homepage": "https://drupal.org/project/imce", + "support": { + "source": "https://git.drupalcode.org/project/imce", + "issues": "https://www.drupal.org/project/issues/imce" + } + }, { "name": "drupal/inline_block_title_automatic", "version": "1.1.0", @@ -16865,7 +16918,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.1" + "php": ">=8.1", + "ext-dom": "*" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/web/modules/custom/batch-import-example/README.md b/web/modules/custom/batch-import-example/README.md new file mode 100644 index 000000000..e7bad615b --- /dev/null +++ b/web/modules/custom/batch-import-example/README.md @@ -0,0 +1,31 @@ +# Drupal 8 batch import example with interaction +![alt text](https://github.com/stef-van-looveren/batch-import-example/blob/master/docs/batch_example.gif?raw=true "Drupal 8 batch import example") + +This example module will import 3 dogs from a json file as nodes: +``` +[ + { + "name":"Whiskers" + }, + { + "name":"Woof" + }, + { + "name":"Fluffy" + } +] +``` + +## Batch processing +The form will create a batch process, which runs a small function to create the nodes. Batch processing is important when running imports with higher volumes to prevent the script to timeout. + +## How to +1. Enable the module +2. Clear caches +3. Go to `admin/batch-import-example` and submit the form +4. A batch process will start and give interaction about which dog he is importing. + +## Blog +For a blog on the usage of this module: [Create a batch process with interaction in drupal 8](https://stefvanlooveren.me/blog/create-batch-process-interaction-drupal-8-solved). +## Thanks +This module was built while working for [VITO (Flanders Institue for Technological Research)](https://www.vito.be). \ No newline at end of file diff --git a/web/modules/custom/batch-import-example/batch_import_example.info.yml b/web/modules/custom/batch-import-example/batch_import_example.info.yml new file mode 100644 index 000000000..324b38663 --- /dev/null +++ b/web/modules/custom/batch-import-example/batch_import_example.info.yml @@ -0,0 +1,5 @@ +name: Batch import example +type: module +description: Shows how to batch import with interaction +core_version_requirement: ^9 || ^10 +package: STEFVANLOOVEREN.ME diff --git a/web/modules/custom/batch-import-example/batch_import_example.module b/web/modules/custom/batch-import-example/batch_import_example.module new file mode 100644 index 000000000..b3d9bbc7f --- /dev/null +++ b/web/modules/custom/batch-import-example/batch_import_example.module @@ -0,0 +1 @@ +i^b%?i5JD3a)KCOOO6VO! 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

RupE0i^VRS{^jRZ|UI~Ovz^I4? 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 G!?jn3k?`?Z5)RrnYT)G7@r@gDh+ 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 TE%pD|QvLr+2m8P71;hUbBKQsG literal 0 HcmV?d00001 diff --git a/web/modules/custom/batch-import-example/src/Form/ImportForm.php b/web/modules/custom/batch-import-example/src/Form/ImportForm.php new file mode 100644 index 000000000..ef5058968 --- /dev/null +++ b/web/modules/custom/batch-import-example/src/Form/ImportForm.php @@ -0,0 +1,141 @@ +This example form will import 3 pages from the docs/animals.json example

'; + + $form['actions'] = array( + '#type' => 'actions', + 'submit' => array( + '#type' => 'submit', + '#value' => 'Proceed', + ), + ); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $base_url = 'https://unlcms.unl.edu/'; + $base_url = trim($base_url, '/') . '/'; + + $url = 'https://unlcms.unl.edu/sitemap.xml'; + $request = \Drupal::httpClient()->get($url); + $body = $request->getBody(); + $site_map = simplexml_load_string($body); + + $batch = [ + 'title' => t('Importing animals'), + 'operations' => [], + 'init_message' => t('Import process is starting.'), + 'progress_message' => t('Processed @current out of @total. Estimated time: @estimate.'), + 'error_message' => t('The process has encountered an error.'), + ]; + + foreach ($site_map->url as $item) { + $url = (string)$item->loc; + $alias = substr($url, strlen($base_url)-1); + $batch['operations'][] = [ + ['\Drupal\batch_import_example\Form\ImportForm', 'importPage'], [$url, $alias] + ]; + } + + batch_set($batch); + \Drupal::messenger()->addMessage('Imported ' . count($site_map) . ' animals!'); + + $form_state->setRebuild(TRUE); + } + + /** + * @param $entity + * Deletes an entity + */ + public static function importPage($url, $alias, &$context) { + $request = \Drupal::httpClient()->get($url); + $body = $request->getBody(); + if (!$body) { + $context['message'] = t('The page at ' . $url . ' is empty. Ignoring.'); + return false; + } + + $dom = new DOMDocument(); + if (!@$dom->loadHTML($body)) { + return false; + } + $xpath = new DOMXpath($dom); + + // Check to see if there's a base tag on this page. + $base_tags = $dom->getElementsByTagName('base'); + $page_base = NULL; + if ($base_tags->length > 0) { + $page_base = $base_tags->item(0)->getAttribute('href'); + } + + // Page title. + $title = $url; + $nodes = $xpath->query("//header[@id='dcf-page-title']/h1//text()"); + if ($nodes->length > 0) { + $title = $dom->saveHTML($nodes->item(0)); + } + + // Get the Main Content html for the Body field. + $nodes = $xpath->query("//div[contains(@class, 'dcf-main-content')]"); + if (!$maincontentNode = $nodes->item(0)) { + return false; + } + $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], + iterator_to_array($maincontentNode->childNodes))); + + // Process images. + $imageNodes = $maincontentNode->getElementsByTagName('img'); + foreach ($imageNodes as $imageNode) { + $src = $imageNode->getAttribute('src'); + } + + // Create a node. + $entity = Node::create([ + 'type' => 'archive_page', + 'title' => $title, + 'archive_page_body' => [['value' => $body, 'format' => 'archive']], + 'path' => [ + 'alias' => $alias, + 'pathauto' => PathautoState::SKIP, + ], + ] + ); + $entity->save(); + + $context['results'][] = $url; + $context['message'] = t('Created @title', array('@title' => $url)); + } + +} From 4a2bbf987c0210c3b1e5f2285df266beafffc1f8 Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Fri, 2 Feb 2024 13:56:47 -0600 Subject: [PATCH 2/8] [#408] Rename module to unl_archive_page_import and add config and feature --- ...eld_override.node.archive_page.promote.yml | 24 ++ ...form_display.node.archive_page.default.yml | 92 +++++ ...view_display.node.archive_page.default.yml | 35 ++ ..._view_display.node.archive_page.teaser.yml | 29 ++ config/sync/core.extension.yml | 2 + config/sync/editor.editor.archive.yml | 33 ++ config/sync/editor.editor.webform_default.yml | 2 +- ...ld.node.archive_page.archive_page_body.yml | 30 ++ .../field.storage.node.archive_page_body.yml | 21 ++ config/sync/filter.format.archive.yml | 46 +++ config/sync/filter.format.webform_default.yml | 3 +- config/sync/node.type.archive_page.yml | 20 ++ config/sync/user.role.administrator.yml | 10 + config/sync/user.role.coder.yml | 4 + config/sync/user.role.editor.yml | 10 + config/sync/user.role.site_admin.yml | 10 + config/sync/user.role.viewer.yml | 2 + config/sync/workflows.workflow.editorial.yml | 2 + .../batch_import_example.info.yml | 5 - .../batch_import_example.routing.yml | 8 - ...eld_override.node.archive_page.promote.yml | 21 ++ ...form_display.node.archive_page.default.yml | 89 +++++ ...view_display.node.archive_page.default.yml | 32 ++ ..._view_display.node.archive_page.teaser.yml | 26 ++ .../config/install/editor.editor.archive.yml | 30 ++ ...ld.node.archive_page.archive_page_body.yml | 27 ++ .../field.storage.node.archive_page_body.yml | 18 + .../config/install/filter.format.archive.yml | 43 +++ .../config/install/node.type.archive_page.yml | 17 + .../herbie_archive_page.features.yml | 2 + .../herbie_archive_page.info.yml | 20 ++ .../install/user.role.administrator.yml | 17 +- .../config/install/user.role.coder.yml | 10 +- .../config/install/user.role.editor.yml | 10 + .../config/install/user.role.site_admin.yml | 10 + .../config/install/user.role.viewer.yml | 2 + .../herbie_roles/herbie_roles.info.yml | 3 +- .../README.md | 0 .../docs/animals.json | 0 .../docs/batch_example.gif | Bin .../src/Form/ImportForm-withmediatag.php} | 88 ++++- .../src/Form/ImportForm.php | 325 ++++++++++++++++++ .../unl_archive_page_import.info.yml | 6 + .../unl_archive_page_import.module} | 0 .../unl_archive_page_import.routing.yml | 8 + 45 files changed, 1152 insertions(+), 40 deletions(-) create mode 100644 config/sync/core.base_field_override.node.archive_page.promote.yml create mode 100644 config/sync/core.entity_form_display.node.archive_page.default.yml create mode 100644 config/sync/core.entity_view_display.node.archive_page.default.yml create mode 100644 config/sync/core.entity_view_display.node.archive_page.teaser.yml create mode 100644 config/sync/editor.editor.archive.yml create mode 100644 config/sync/field.field.node.archive_page.archive_page_body.yml create mode 100644 config/sync/field.storage.node.archive_page_body.yml create mode 100644 config/sync/filter.format.archive.yml create mode 100644 config/sync/node.type.archive_page.yml delete mode 100644 web/modules/custom/batch-import-example/batch_import_example.info.yml delete mode 100644 web/modules/custom/batch-import-example/batch_import_example.routing.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/core.base_field_override.node.archive_page.promote.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.default.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.teaser.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/field.field.node.archive_page.archive_page_body.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/field.storage.node.archive_page_body.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml create mode 100644 web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml create mode 100644 web/modules/custom/features/herbie_archive_page/herbie_archive_page.features.yml create mode 100644 web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml rename web/modules/custom/{batch-import-example => unl_archive_page_import}/README.md (100%) rename web/modules/custom/{batch-import-example => unl_archive_page_import}/docs/animals.json (100%) rename web/modules/custom/{batch-import-example => unl_archive_page_import}/docs/batch_example.gif (100%) rename web/modules/custom/{batch-import-example/src/Form/ImportForm.php => unl_archive_page_import/src/Form/ImportForm-withmediatag.php} (57%) create mode 100644 web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php create mode 100644 web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml rename web/modules/custom/{batch-import-example/batch_import_example.module => unl_archive_page_import/unl_archive_page_import.module} (100%) create mode 100644 web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml diff --git a/config/sync/core.base_field_override.node.archive_page.promote.yml b/config/sync/core.base_field_override.node.archive_page.promote.yml new file mode 100644 index 000000000..3e9e4f01a --- /dev/null +++ b/config/sync/core.base_field_override.node.archive_page.promote.yml @@ -0,0 +1,24 @@ +uuid: 6e7d6455-0ff2-485a-9e22-3f9694d245bd +langcode: en +status: true +dependencies: + config: + - node.type.archive_page +_core: + default_config_hash: jTsV1q_CSnQyGyibyGOqPmWOf9edJxhR8ool7jhSO_8 +id: node.archive_page.promote +field_name: promote +entity_type: node +bundle: archive_page +label: 'Promoted to front page' +description: '' +required: false +translatable: true +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/config/sync/core.entity_form_display.node.archive_page.default.yml b/config/sync/core.entity_form_display.node.archive_page.default.yml new file mode 100644 index 000000000..c638ac592 --- /dev/null +++ b/config/sync/core.entity_form_display.node.archive_page.default.yml @@ -0,0 +1,92 @@ +uuid: e8c9d617-4687-402b-b539-5188f3978fa0 +langcode: en +status: true +dependencies: + config: + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + - workflows.workflow.editorial + module: + - content_moderation + - path + - text +_core: + default_config_hash: AfdaqPAfsQDstu5WG6fM7s0HQMmqGJAyP1UDdHr5u08 +id: node.archive_page.default +targetEntityType: node +bundle: archive_page +mode: default +content: + archive_page_body: + type: text_textarea_with_summary + weight: 121 + region: content + settings: + rows: 9 + summary_rows: 3 + placeholder: '' + show_summary: false + third_party_settings: { } + created: + type: datetime_timestamp + weight: 10 + region: content + settings: { } + third_party_settings: { } + moderation_state: + type: moderation_state_default + weight: 100 + region: content + settings: { } + third_party_settings: { } + path: + type: path + weight: 30 + region: content + settings: { } + third_party_settings: { } + promote: + type: boolean_checkbox + weight: 15 + region: content + settings: + display_label: true + third_party_settings: { } + status: + type: boolean_checkbox + weight: 120 + region: content + settings: + display_label: true + third_party_settings: { } + sticky: + type: boolean_checkbox + weight: 16 + region: content + settings: + display_label: true + third_party_settings: { } + title: + type: string_textfield + weight: -5 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 5 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } + url_redirects: + weight: 50 + region: content + settings: { } + third_party_settings: { } +hidden: { } diff --git a/config/sync/core.entity_view_display.node.archive_page.default.yml b/config/sync/core.entity_view_display.node.archive_page.default.yml new file mode 100644 index 000000000..9a025c74b --- /dev/null +++ b/config/sync/core.entity_view_display.node.archive_page.default.yml @@ -0,0 +1,35 @@ +uuid: 104905b8-979f-4c4e-ac1a-678437c3ffe1 +langcode: en +status: true +dependencies: + config: + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + module: + - text + - user +_core: + default_config_hash: Uimh9DMs_BGaasHnExxbwtru0EEM2S29aqv4fRwKCaE +id: node.archive_page.default +targetEntityType: node +bundle: archive_page +mode: default +content: + archive_page_body: + type: text_default + label: hidden + settings: { } + third_party_settings: { } + weight: 101 + region: content + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content + links: + settings: { } + third_party_settings: { } + weight: 100 + region: content +hidden: { } diff --git a/config/sync/core.entity_view_display.node.archive_page.teaser.yml b/config/sync/core.entity_view_display.node.archive_page.teaser.yml new file mode 100644 index 000000000..89411509c --- /dev/null +++ b/config/sync/core.entity_view_display.node.archive_page.teaser.yml @@ -0,0 +1,29 @@ +uuid: e5e73cae-dc5a-4171-acf8-0f903e9c54b1 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.teaser + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + module: + - user +_core: + default_config_hash: S_sCBgKJAl8bDgE50INwDL1Okm_miD6pJzXshZsfFY4 +id: node.archive_page.teaser +targetEntityType: node +bundle: archive_page +mode: teaser +content: + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content + links: + settings: { } + third_party_settings: { } + weight: 100 + region: content +hidden: + archive_page_body: true diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 010f05e0d..b1b662bd6 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -65,6 +65,7 @@ module: filter: 0 google_analytics: 0 heading: 0 + herbie_archive_page: 0 herbie_book: 0 herbie_builder_page: 0 herbie_config: 0 @@ -138,6 +139,7 @@ module: toolbar: 0 twig_tweak: 0 twig_ui: 0 + unl_archive_page_import: 0 unl_blocks: 0 unl_breadcrumbs: 0 unl_cas: 0 diff --git a/config/sync/editor.editor.archive.yml b/config/sync/editor.editor.archive.yml new file mode 100644 index 000000000..c14892949 --- /dev/null +++ b/config/sync/editor.editor.archive.yml @@ -0,0 +1,33 @@ +uuid: 904f7f35-6b3f-41d8-9e2a-ec46ae01881a +langcode: en +status: true +dependencies: + config: + - filter.format.archive + module: + - ckeditor5 +_core: + default_config_hash: PPY3SMEn5dYuSb_zlVwx9afatduehtBPlwlZcREFS6I +format: archive +editor: ckeditor5 +settings: + toolbar: + items: + - heading + - bold + - italic + - drupalMedia + - sourceEditing + plugins: + ckeditor5_heading: + enabled_headings: + - heading2 + - heading3 + - heading4 + - heading5 + - heading6 + ckeditor5_sourceEditing: + allowed_tags: { } + media_media: + allow_view_mode_override: false +image_upload: { } diff --git a/config/sync/editor.editor.webform_default.yml b/config/sync/editor.editor.webform_default.yml index 4368b4aff..124494437 100644 --- a/config/sync/editor.editor.webform_default.yml +++ b/config/sync/editor.editor.webform_default.yml @@ -1,4 +1,4 @@ -uuid: null +uuid: 061533eb-3058-4821-a848-37bae8424321 langcode: en status: true dependencies: diff --git a/config/sync/field.field.node.archive_page.archive_page_body.yml b/config/sync/field.field.node.archive_page.archive_page_body.yml new file mode 100644 index 000000000..74c5a7072 --- /dev/null +++ b/config/sync/field.field.node.archive_page.archive_page_body.yml @@ -0,0 +1,30 @@ +uuid: a39cc45b-676d-4f87-8a47-d9fa5f3ebf2c +langcode: en +status: true +dependencies: + config: + - field.storage.node.archive_page_body + - node.type.archive_page + module: + - allowed_formats + - text +third_party_settings: + allowed_formats: + allowed_formats: + - archive +_core: + default_config_hash: DqzPHr0eUyjJNYN5Bpmd4B70RxzuSHmlasIi_P69G8w +id: node.archive_page.archive_page_body +field_name: archive_page_body +entity_type: node +bundle: archive_page +label: Body +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + display_summary: true + required_summary: false +field_type: text_with_summary diff --git a/config/sync/field.storage.node.archive_page_body.yml b/config/sync/field.storage.node.archive_page_body.yml new file mode 100644 index 000000000..eea63ba05 --- /dev/null +++ b/config/sync/field.storage.node.archive_page_body.yml @@ -0,0 +1,21 @@ +uuid: 10116895-793f-49ab-b3d6-c78f6b01a361 +langcode: en +status: true +dependencies: + module: + - node + - text +_core: + default_config_hash: 3P3Co5OwtdyrsMSmcoVPPvPSXTn9ae77bu1ZGGQvmjw +id: node.archive_page_body +field_name: archive_page_body +entity_type: node +type: text_with_summary +settings: { } +module: text +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/sync/filter.format.archive.yml b/config/sync/filter.format.archive.yml new file mode 100644 index 000000000..ebc24da9e --- /dev/null +++ b/config/sync/filter.format.archive.yml @@ -0,0 +1,46 @@ +uuid: ae302daf-bb4c-4dc7-800f-617a3f5ee440 +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.media.narrow + - core.entity_view_mode.media.wide + module: + - dcf_ckeditor5 + - media +_core: + default_config_hash: rzPzXxWUrXX_M7AOoY7S2IdDNW1fcFWrMiBiR-WHf4Q +name: Archive +format: archive +weight: 0 +filters: + filter_dcfckeditor5: + id: filter_dcfckeditor5 + provider: dcf_ckeditor5 + status: false + weight: 0 + settings: + dcftable: '0' + filter_html: + id: filter_html + provider: filter + status: false + weight: -10 + settings: + allowed_html: '' + filter_html_help: true + filter_html_nofollow: false + media_embed: + id: media_embed + provider: media + status: true + weight: 100 + settings: + default_view_mode: default + allowed_view_modes: + default: default + narrow: narrow + wide: wide + allowed_media_types: + image: image + remote_video: remote_video diff --git a/config/sync/filter.format.webform_default.yml b/config/sync/filter.format.webform_default.yml index 919e2f2fe..38691ef1b 100644 --- a/config/sync/filter.format.webform_default.yml +++ b/config/sync/filter.format.webform_default.yml @@ -1,3 +1,4 @@ +uuid: 0cbc2dfc-b41a-4860-aad6-54bf4d9090b4 langcode: en status: true dependencies: @@ -6,6 +7,4 @@ dependencies: name: 'Webform (Default) - DO NOT EDIT' format: webform_default weight: 100 -roles: - - authenticated filters: { } diff --git a/config/sync/node.type.archive_page.yml b/config/sync/node.type.archive_page.yml new file mode 100644 index 000000000..a1527be32 --- /dev/null +++ b/config/sync/node.type.archive_page.yml @@ -0,0 +1,20 @@ +uuid: d8b2bb1c-4f2d-4dd0-b873-8f189f53b36e +langcode: en +status: true +dependencies: + module: + - menu_ui +third_party_settings: + menu_ui: + available_menus: + - main + parent: 'main:' +_core: + default_config_hash: 0ebIm8b55UCcLLBAIXBkfSIjJ9UnzpXYzdpSVw-lzf0 +name: 'Archive page' +type: archive_page +description: '' +help: '' +new_revision: true +preview_mode: 1 +display_submitted: false diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index abe292e25..97a462dca 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - filter.format.minimal - filter.format.simple @@ -12,6 +13,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -139,6 +141,7 @@ permissions: - 'create users' - 'create webform' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -164,10 +167,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -184,6 +189,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -194,6 +200,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -216,6 +223,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -244,6 +252,7 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - 'use text format minimal' - 'use text format simple' @@ -251,6 +260,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.coder.yml b/config/sync/user.role.coder.yml index cbeaa98e5..79ad4697d 100644 --- a/config/sync/user.role.coder.yml +++ b/config/sync/user.role.coder.yml @@ -2,11 +2,14 @@ uuid: 6ec7535b-c456-4d90-a964-4b4e9f74b019 langcode: en status: true dependencies: + config: + - filter.format.archive module: - asset_injector - contextual - feeds - field_ui + - filter - google_analytics - node - paragraphs @@ -42,4 +45,5 @@ permissions: - 'administer views' - 'load twig templates from file system' - 'replicate entities' + - 'use text format archive' - 'view the administration theme' diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index b70df69d8..254c3629d 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - filter.format.minimal - filter.format.simple @@ -12,6 +13,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -92,6 +94,7 @@ permissions: - 'create timeline block content' - 'create unl_directory_entry external entity' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any card block content' - 'delete any content block content' - 'delete any cta block content' @@ -108,9 +111,11 @@ permissions: - 'delete any tabs block content' - 'delete any tandem block content' - 'delete any timeline block content' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -122,6 +127,7 @@ permissions: - 'delete person revisions' - 'delete unl_directory_entry external entity' - 'delete webform revisions' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -130,6 +136,7 @@ permissions: - 'edit any person content' - 'edit any remote_video media' - 'edit any webform content' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -143,6 +150,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -167,6 +175,7 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - 'use text format minimal' - 'use text format simple' @@ -174,6 +183,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.site_admin.yml b/config/sync/user.role.site_admin.yml index 18dc95f7d..70760f7a6 100644 --- a/config/sync/user.role.site_admin.yml +++ b/config/sync/user.role.site_admin.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - filter.format.minimal - filter.format.simple @@ -12,6 +13,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -118,6 +120,7 @@ permissions: - 'create users' - 'create webform' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -143,10 +146,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -163,6 +168,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -173,6 +179,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -193,6 +200,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -220,6 +228,7 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - 'use text format minimal' - 'use text format simple' @@ -227,6 +236,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.viewer.yml b/config/sync/user.role.viewer.yml index b44484e4a..42a6b0940 100644 --- a/config/sync/user.role.viewer.yml +++ b/config/sync/user.role.viewer.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -33,6 +34,7 @@ permissions: - 'access site in maintenance mode' - 'access toolbar' - 'view any unpublished content' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/workflows.workflow.editorial.yml b/config/sync/workflows.workflow.editorial.yml index 3947e0ba5..ed16e0fa1 100644 --- a/config/sync/workflows.workflow.editorial.yml +++ b/config/sync/workflows.workflow.editorial.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -57,4 +58,5 @@ type_settings: - builder_page - news - person + - archive_page default_moderation_state: published diff --git a/web/modules/custom/batch-import-example/batch_import_example.info.yml b/web/modules/custom/batch-import-example/batch_import_example.info.yml deleted file mode 100644 index 324b38663..000000000 --- a/web/modules/custom/batch-import-example/batch_import_example.info.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Batch import example -type: module -description: Shows how to batch import with interaction -core_version_requirement: ^9 || ^10 -package: STEFVANLOOVEREN.ME diff --git a/web/modules/custom/batch-import-example/batch_import_example.routing.yml b/web/modules/custom/batch-import-example/batch_import_example.routing.yml deleted file mode 100644 index be894b9b9..000000000 --- a/web/modules/custom/batch-import-example/batch_import_example.routing.yml +++ /dev/null @@ -1,8 +0,0 @@ -batch_import_example.examplebatch: - path: '/admin/batch-import-example' - defaults: - _title: 'Import animals' - _form: '\Drupal\batch_import_example\Form\ImportForm' - requirements: - _permission: 'access content' - diff --git a/web/modules/custom/features/herbie_archive_page/config/install/core.base_field_override.node.archive_page.promote.yml b/web/modules/custom/features/herbie_archive_page/config/install/core.base_field_override.node.archive_page.promote.yml new file mode 100644 index 000000000..372c43bb3 --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/core.base_field_override.node.archive_page.promote.yml @@ -0,0 +1,21 @@ +langcode: en +status: true +dependencies: + config: + - node.type.archive_page +id: node.archive_page.promote +field_name: promote +entity_type: node +bundle: archive_page +label: 'Promoted to front page' +description: '' +required: false +translatable: true +default_value: + - + value: 0 +default_value_callback: '' +settings: + on_label: 'On' + off_label: 'Off' +field_type: boolean diff --git a/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml new file mode 100644 index 000000000..6ec5157ea --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml @@ -0,0 +1,89 @@ +langcode: en +status: true +dependencies: + config: + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + - workflows.workflow.editorial + module: + - content_moderation + - path + - text +id: node.archive_page.default +targetEntityType: node +bundle: archive_page +mode: default +content: + archive_page_body: + type: text_textarea_with_summary + weight: 121 + region: content + settings: + rows: 9 + summary_rows: 3 + placeholder: '' + show_summary: false + third_party_settings: { } + created: + type: datetime_timestamp + weight: 10 + region: content + settings: { } + third_party_settings: { } + moderation_state: + type: moderation_state_default + weight: 100 + region: content + settings: { } + third_party_settings: { } + path: + type: path + weight: 30 + region: content + settings: { } + third_party_settings: { } + promote: + type: boolean_checkbox + weight: 15 + region: content + settings: + display_label: true + third_party_settings: { } + status: + type: boolean_checkbox + weight: 120 + region: content + settings: + display_label: true + third_party_settings: { } + sticky: + type: boolean_checkbox + weight: 16 + region: content + settings: + display_label: true + third_party_settings: { } + title: + type: string_textfield + weight: -5 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 5 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } + url_redirects: + weight: 50 + region: content + settings: { } + third_party_settings: { } +hidden: { } diff --git a/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.default.yml b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.default.yml new file mode 100644 index 000000000..55e9f323d --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.default.yml @@ -0,0 +1,32 @@ +langcode: en +status: true +dependencies: + config: + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + module: + - text + - user +id: node.archive_page.default +targetEntityType: node +bundle: archive_page +mode: default +content: + archive_page_body: + type: text_default + label: hidden + settings: { } + third_party_settings: { } + weight: 101 + region: content + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content + links: + settings: { } + third_party_settings: { } + weight: 100 + region: content +hidden: { } diff --git a/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.teaser.yml b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.teaser.yml new file mode 100644 index 000000000..c43734baf --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_view_display.node.archive_page.teaser.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.node.teaser + - field.field.node.archive_page.archive_page_body + - node.type.archive_page + module: + - user +id: node.archive_page.teaser +targetEntityType: node +bundle: archive_page +mode: teaser +content: + content_moderation_control: + settings: { } + third_party_settings: { } + weight: -20 + region: content + links: + settings: { } + third_party_settings: { } + weight: 100 + region: content +hidden: + archive_page_body: true diff --git a/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml b/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml new file mode 100644 index 000000000..20455e6f6 --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml @@ -0,0 +1,30 @@ +langcode: en +status: true +dependencies: + config: + - filter.format.archive + module: + - ckeditor5 +format: archive +editor: ckeditor5 +settings: + toolbar: + items: + - heading + - bold + - italic + - drupalMedia + - sourceEditing + plugins: + ckeditor5_heading: + enabled_headings: + - heading2 + - heading3 + - heading4 + - heading5 + - heading6 + ckeditor5_sourceEditing: + allowed_tags: { } + media_media: + allow_view_mode_override: false +image_upload: { } diff --git a/web/modules/custom/features/herbie_archive_page/config/install/field.field.node.archive_page.archive_page_body.yml b/web/modules/custom/features/herbie_archive_page/config/install/field.field.node.archive_page.archive_page_body.yml new file mode 100644 index 000000000..ee007308b --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/field.field.node.archive_page.archive_page_body.yml @@ -0,0 +1,27 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.node.archive_page_body + - node.type.archive_page + module: + - allowed_formats + - text +third_party_settings: + allowed_formats: + allowed_formats: + - archive +id: node.archive_page.archive_page_body +field_name: archive_page_body +entity_type: node +bundle: archive_page +label: Body +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + display_summary: true + required_summary: false +field_type: text_with_summary diff --git a/web/modules/custom/features/herbie_archive_page/config/install/field.storage.node.archive_page_body.yml b/web/modules/custom/features/herbie_archive_page/config/install/field.storage.node.archive_page_body.yml new file mode 100644 index 000000000..fdfaca37d --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/field.storage.node.archive_page_body.yml @@ -0,0 +1,18 @@ +langcode: en +status: true +dependencies: + module: + - node + - text +id: node.archive_page_body +field_name: archive_page_body +entity_type: node +type: text_with_summary +settings: { } +module: text +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml b/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml new file mode 100644 index 000000000..f5f40c075 --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml @@ -0,0 +1,43 @@ +langcode: en +status: true +dependencies: + config: + - core.entity_view_mode.media.narrow + - core.entity_view_mode.media.wide + module: + - dcf_ckeditor5 + - media +name: Archive +format: archive +weight: 0 +filters: + filter_dcfckeditor5: + id: filter_dcfckeditor5 + provider: dcf_ckeditor5 + status: false + weight: 0 + settings: + dcftable: '0' + filter_html: + id: filter_html + provider: filter + status: false + weight: -10 + settings: + allowed_html: '' + filter_html_help: true + filter_html_nofollow: false + media_embed: + id: media_embed + provider: media + status: true + weight: 100 + settings: + default_view_mode: default + allowed_view_modes: + default: default + narrow: narrow + wide: wide + allowed_media_types: + image: image + remote_video: remote_video diff --git a/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml b/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml new file mode 100644 index 000000000..9a28ec940 --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml @@ -0,0 +1,17 @@ +langcode: en +status: true +dependencies: + module: + - menu_ui +third_party_settings: + menu_ui: + available_menus: + - main + parent: 'main:' +name: 'Archive page' +type: archive_page +description: '' +help: '' +new_revision: true +preview_mode: 1 +display_submitted: false diff --git a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.features.yml b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.features.yml new file mode 100644 index 000000000..c3ef3e002 --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.features.yml @@ -0,0 +1,2 @@ +bundle: herbie +required: true diff --git a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml new file mode 100644 index 000000000..107d5d47a --- /dev/null +++ b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml @@ -0,0 +1,20 @@ +name: 'Archive page' +type: module +core_version_requirement: '^9.4 || ^10' +dependencies: + - allowed_formats + - ckeditor5 + - content_moderation + - dcf_ckeditor5 + - editor + - field + - filter + - herbie_media_types + - media + - menu_ui + - node + - path + - text + - user +version: 1.0.0 +package: Herbie diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml index ada8c7069..79986f829 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml @@ -3,8 +3,8 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - - filter.format.html_code - filter.format.minimal - filter.format.simple - filter.format.standard @@ -12,6 +12,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -30,7 +31,6 @@ dependencies: - entity_usage - external_entities - feeds - - field_css - field_ui - file - file_delete @@ -67,7 +67,6 @@ permissions: - 'access any webform configuration' - 'access content overview' - 'access contextual links' - - 'access css fields' - 'access entity usage statistics' - 'access feed overview' - 'access files overview' @@ -118,7 +117,6 @@ permissions: - 'create cta block content' - 'create file media' - 'create hero block content' - - 'create html_code block content' - 'create icon_links block content' - 'create image media' - 'create logo_cloud block content' @@ -140,6 +138,7 @@ permissions: - 'create users' - 'create webform' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -148,7 +147,6 @@ permissions: - 'delete any file' - 'delete any file media' - 'delete any hero block content' - - 'delete any html_code block content' - 'delete any icon_links block content' - 'delete any image media' - 'delete any logo_cloud block content' @@ -166,10 +164,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -186,6 +186,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -196,6 +197,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -218,6 +220,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -232,7 +235,6 @@ permissions: - 'update any content block content' - 'update any cta block content' - 'update any hero block content' - - 'update any html_code block content' - 'update any icon_links block content' - 'update any logo_cloud block content' - 'update any node_include block content' @@ -247,14 +249,15 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - - 'use text format html_code' - 'use text format minimal' - 'use text format simple' - 'use text format standard' - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml index 5e20fffdd..0d8314ff1 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml @@ -2,13 +2,11 @@ langcode: en status: true dependencies: config: - - filter.format.html_code + - filter.format.archive module: - asset_injector - - block_content_permissions - contextual - feeds - - field_css - field_ui - filter - google_analytics @@ -25,7 +23,6 @@ weight: -5 is_admin: null permissions: - 'access contextual links' - - 'access css fields' - 'access feed overview' - 'access site reports' - 'access taxonomy overview' @@ -43,10 +40,7 @@ permissions: - 'administer taxonomy' - 'administer twig templates' - 'administer views' - - 'create html_code block content' - - 'delete any html_code block content' - 'load twig templates from file system' - 'replicate entities' - - 'update any html_code block content' - - 'use text format html_code' + - 'use text format archive' - 'view the administration theme' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml index 0bfd0081d..07ec1b3ab 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml @@ -3,6 +3,7 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - filter.format.minimal - filter.format.simple @@ -11,6 +12,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -89,6 +91,7 @@ permissions: - 'create timeline block content' - 'create unl_directory_entry external entity' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any card block content' - 'delete any content block content' - 'delete any cta block content' @@ -105,9 +108,11 @@ permissions: - 'delete any tabs block content' - 'delete any tandem block content' - 'delete any timeline block content' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -119,6 +124,7 @@ permissions: - 'delete person revisions' - 'delete unl_directory_entry external entity' - 'delete webform revisions' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -127,6 +133,7 @@ permissions: - 'edit any person content' - 'edit any remote_video media' - 'edit any webform content' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -140,6 +147,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -164,6 +172,7 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - 'use text format minimal' - 'use text format simple' @@ -171,6 +180,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml index e6427064d..c80e589f8 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml @@ -3,6 +3,7 @@ status: true dependencies: config: - core.entity_view_display.node.builder_page.default + - filter.format.archive - filter.format.block_body - filter.format.minimal - filter.format.simple @@ -11,6 +12,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -115,6 +117,7 @@ permissions: - 'create users' - 'create webform' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -140,10 +143,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -160,6 +165,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -170,6 +176,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -190,6 +197,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -217,6 +225,7 @@ permissions: - 'use editorial transition create_new_draft' - 'use editorial transition publish' - 'use editorial transition unpublish' + - 'use text format archive' - 'use text format block_body' - 'use text format minimal' - 'use text format simple' @@ -224,6 +233,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml index 56f55dce3..5eda36205 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml @@ -2,6 +2,7 @@ langcode: en status: true dependencies: config: + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -30,6 +31,7 @@ permissions: - 'access site in maintenance mode' - 'access toolbar' - 'view any unpublished content' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/web/modules/custom/features/herbie_roles/herbie_roles.info.yml b/web/modules/custom/features/herbie_roles/herbie_roles.info.yml index e85bc6720..8ba777f3a 100644 --- a/web/modules/custom/features/herbie_roles/herbie_roles.info.yml +++ b/web/modules/custom/features/herbie_roles/herbie_roles.info.yml @@ -30,6 +30,7 @@ dependencies: - 'field_css:field_css' - 'file_delete:file_delete' - 'google_analytics:google_analytics' + - 'herbie_archive_page:herbie_archive_page' - 'herbie_builder_page:herbie_builder_page' - 'herbie_media_types:herbie_media_types' - 'herbie_news:herbie_news' @@ -50,5 +51,5 @@ dependencies: - 'webform:webform' - 'webform:webform_node' - 'webform:webform_submission_log' -version: 1.3.0 +version: 1.3.1 package: Herbie diff --git a/web/modules/custom/batch-import-example/README.md b/web/modules/custom/unl_archive_page_import/README.md similarity index 100% rename from web/modules/custom/batch-import-example/README.md rename to web/modules/custom/unl_archive_page_import/README.md diff --git a/web/modules/custom/batch-import-example/docs/animals.json b/web/modules/custom/unl_archive_page_import/docs/animals.json similarity index 100% rename from web/modules/custom/batch-import-example/docs/animals.json rename to web/modules/custom/unl_archive_page_import/docs/animals.json diff --git a/web/modules/custom/batch-import-example/docs/batch_example.gif b/web/modules/custom/unl_archive_page_import/docs/batch_example.gif similarity index 100% rename from web/modules/custom/batch-import-example/docs/batch_example.gif rename to web/modules/custom/unl_archive_page_import/docs/batch_example.gif diff --git a/web/modules/custom/batch-import-example/src/Form/ImportForm.php b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php similarity index 57% rename from web/modules/custom/batch-import-example/src/Form/ImportForm.php rename to web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php index ef5058968..cd7045ed4 100644 --- a/web/modules/custom/batch-import-example/src/Form/ImportForm.php +++ b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php @@ -1,19 +1,17 @@ item(0)) { return false; } - $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], - iterator_to_array($maincontentNode->childNodes))); // Process images. $imageNodes = $maincontentNode->getElementsByTagName('img'); foreach ($imageNodes as $imageNode) { $src = $imageNode->getAttribute('src'); + $file_name = explode("/", $src); + $file_name = end($file_name); + $file_name = explode("?", $file_name); + $file_name = $file_name[0]; + + // Check if image already exists. + $file = \Drupal::entityTypeManager() + ->getStorage('file') + ->loadByProperties(['filename' => $file_name]); + + if ($file) { + // Get existing Media entity. + $fileId = array_shift($file)->id(); + $media = \Drupal::entityTypeManager() + ->getStorage('media') + ->loadByProperties(['field_media_image' => $fileId]); + $media = reset($media); + } + else { + // Download the file and create a new Media entity. + if (strpos($src, 'http://') === false && strpos($src, 'https://') === false) { + $src = 'https://unlcms.unl.edu/' . $src; + } + + $file_data = file_get_contents($src); + $file = \Drupal::service('file.repository') + ->writeData($file_data, 'public://media/image/' . $file_name, FileSystemInterface::EXISTS_REPLACE); + + $alt = $imageNode->getAttribute('alt'); + $alt = substr($alt, 0, 500); + if (empty($alt)) { + $alt = ' '; + } + + // Get the ID of the "archive_import" media tag. + $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); + $found_terms = $storage->loadByProperties([ + 'name' => 'archive_import', + 'vid' => 'tags', + ]); + $term = reset($found_terms); + if (!$term) { + $term = Term::create([ + 'name' => 'archive_import', + 'vid' => 'media_tags', + ]); + $term->save(); + } + + $media = Media::create([ + 'bundle' => 'image', + 'uid' => \Drupal::currentUser()->id(), + 'field_media_image' => [ + 'target_id' => $file->id(), + 'alt' => $alt, + ], + 's_m_tags' => [ + 'target_id' => $term->id(), + ], + ]); + $media->setName($file_name) + ->setPublished(TRUE) + ->save(); + } + + // Create a new drupal-media DOM element. + $drupal_media = $dom->createElement('drupal-media'); + $drupal_media->setAttribute('data-entity-type', 'media'); + $drupal_media->setAttribute('data-entity-uuid', $media->uuid()); + + // Replace the imported img tag with the new drupal-media element. + $imageNode->parentNode->replaceChild($drupal_media, $imageNode); } + // Create the Body html source code. + $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], + iterator_to_array($maincontentNode->childNodes))); + // Create a node. $entity = Node::create([ 'type' => 'archive_page', diff --git a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php new file mode 100644 index 000000000..b092c9333 --- /dev/null +++ b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php @@ -0,0 +1,325 @@ +This example form will import 3 pages from the docs/animals.json example

'; + $form['base_url'] = [ + '#type' => 'textfield', + '#title' => $this->t('Base URL of the site being imported from.'), + '#default_value' => 'https://unlcms.unl.edu/', + '#required' => TRUE, + '#description' => $this->t('Put description here.'), + ]; + $form['url'] = [ + '#type' => 'textfield', + '#title' => $this->t('Path to XML sitemap of pages to import.'), + '#default_value' => 'https://unlcms.unl.edu/sitemap.xml', + '#required' => TRUE, + '#description' => $this->t('Put description here.'), + ]; + $form['actions'] = array( + '#type' => 'actions', + 'submit' => array( + '#type' => 'submit', + '#value' => 'Start the import', + ), + ); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + $base_url = $form_state->getValue('base_url'); + $base_url = trim($base_url, '/') . '/'; + $base_url = str_replace('http://', 'https://', $base_url); + + $sitemap = $form_state->getValue('url'); + $request = \Drupal::httpClient()->get($sitemap); + $body = $request->getBody(); + $site_map = simplexml_load_string($body); + + $batch = [ + 'title' => t('Importing pages'), + 'operations' => [], + 'init_message' => t('Import process is starting.'), + 'progress_message' => t('Processed @current out of @total. Estimated time: @estimate.'), + 'error_message' => t('The process has encountered an error.'), + ]; + + foreach ($site_map->url as $item) { + $url = (string)$item->loc; + $alias = substr($url, strlen($base_url)-1); + $batch['operations'][] = [ + ['\Drupal\unl_archive_page_import\Form\ImportForm', 'importPage'], [$url, $alias, $base_url] + ]; + } + + batch_set($batch); + \Drupal::messenger()->addMessage('Imported ' . count($site_map) . ' pages!'); + + $form_state->setRebuild(TRUE); + } + + /** + * @param $entity + * Deletes an entity + */ + public static function importPage($url, $alias, $base_url, &$context) { + $request = \Drupal::httpClient()->get($url); + $body = $request->getBody(); + if (!$body) { + $context['message'] = t('The page at ' . $url . ' is empty. Ignoring.'); + return false; + } + + $dom = new DOMDocument(); + if (!@$dom->loadHTML($body)) { + return false; + } + $xpath = new DOMXpath($dom); + + // Check to see if there's a base tag on this page. +// $base_tags = $dom->getElementsByTagName('base'); +// $page_base = NULL; +// if ($base_tags->length > 0) { +// $page_base = $base_tags->item(0)->getAttribute('href'); +// } + + // Page title. + $title = $url; + $nodes = $xpath->query("//header[@id='dcf-page-title']/h1//text()"); + if ($nodes->length > 0) { + $title = $dom->saveHTML($nodes->item(0)); + } + + // Get the Main Content html for the Body field. + $nodes = $xpath->query("//div[contains(@class, 'dcf-main-content')]"); + if (!$maincontentNode = $nodes->item(0)) { + return false; + } + + /** + * Process links. + */ + $linkNodes = $maincontentNode->getElementsByTagName('a'); + foreach ($linkNodes as $a) { + $href = $a->getAttribute('href'); + $file_name = explode("/", $href); + $file_name = end($file_name); + $file_name = explode("?", $file_name); + $file_name = $file_name[0]; + + // Check if link is local or external and skip if the later. + $base_url_http = str_replace('https://', 'http://', $base_url); + if (strpos($href, 'http://') === false && strpos($href, 'https://') === false) { + // Local link. + $href = $base_url . $href; + } + elseif (strpos($href, $base_url) === false && strpos($href, $base_url_http) === false) { + // This is a URL to an external site so skip touching it. + continue; + } + + $response = \Drupal::httpClient()->head($href, ['http_errors' => false]); + $content_type = $response->getHeader('Content-Type'); + if (strpos($content_type[0], 'html') !== false) { + // Link to an HTML page, skip it. + continue; + } + + // Check if file already exists. + $file = \Drupal::entityTypeManager() + ->getStorage('file') + ->loadByProperties(['filename' => $file_name]); + + if ($file) { + // Get existing Media entity. + $fileId = array_shift($file)->id(); + $media = \Drupal::entityTypeManager() + ->getStorage('media') + ->loadByProperties(['field_media_file' => $fileId]); + $media = reset($media); + } + else { + // Download the file and create a new Media entity. + $file_data = file_get_contents($href); + $destination = 'public://media/file'; + \Drupal::service('file_system')->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY); + $file = \Drupal::service('file.repository') + ->writeData($file_data, 'public://media/file/' . $file_name, FileSystemInterface::EXISTS_REPLACE); + + // Get the ID of the "archive_import" media tag (or create it) that all imported files will be assigned. + $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); + $found_terms = $storage->loadByProperties([ + 'name' => 'archive_import', + 'vid' => 'tags', + ]); + $term = reset($found_terms); + if (!$term) { + $term = Term::create([ + 'name' => 'archive_import', + 'vid' => 'media_tags', + ]); + $term->save(); + } + + $media = Media::create([ + 'bundle' => 'file', + 'uid' => \Drupal::currentUser()->id(), + 'field_media_file' => [ + 'target_id' => $file->id(), + ], + 's_m_tags' => [ + 'target_id' => $term->id(), + ], + ]); + $media->setName($file_name) + ->setPublished(TRUE) + ->save(); + } + + // Get the URL of the media item. + $media_src = $media->field_media_file->entity->getFileUri(); + $media_src = \Drupal::service('file_url_generator')->generateString($media_src); + + // Replace the imported link href with the path to the new media item. + $a->setAttribute('href', $media_src); + + } + + /** + * Process images. + */ + $imageNodes = $maincontentNode->getElementsByTagName('img'); + foreach ($imageNodes as $imageNode) { + $src = $imageNode->getAttribute('src'); + $file_name = explode("/", $src); + $file_name = end($file_name); + $file_name = explode("?", $file_name); + $file_name = $file_name[0]; + + // Check if image is local or external and skip if the later. + $base_url_http = str_replace('https://', 'http://', $base_url); + if (strpos($src, 'http://') === false && strpos($src, 'https://') === false) { + // Local file. + $src = $base_url . $src; + } + elseif (strpos($src, $base_url) === false && strpos($src, $base_url_http) === false) { + // This is a URL to an external site so skip touching it. + continue; + } + + // Check if image already exists. + $file = \Drupal::entityTypeManager() + ->getStorage('file') + ->loadByProperties(['filename' => $file_name]); + + if ($file) { + // Get existing Media entity. + $fileId = array_shift($file)->id(); + $media = \Drupal::entityTypeManager() + ->getStorage('media') + ->loadByProperties(['field_media_image' => $fileId]); + $media = reset($media); + } + else { + // Download the file and create a new Media entity. + $file_data = file_get_contents($src); + $destination = 'public://media/image'; + \Drupal::service('file_system')->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY); + $file = \Drupal::service('file.repository') + ->writeData($file_data, 'public://media/image/' . $file_name, FileSystemInterface::EXISTS_REPLACE); + + $alt = $imageNode->getAttribute('alt'); + $alt = substr($alt, 0, 500); + if (empty($alt)) { + $alt = ' '; + } + + // Get the ID of the "archive_import" media tag (or create it) that all imported files will be assigned. + $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); + $found_terms = $storage->loadByProperties([ + 'name' => 'archive_import', + 'vid' => 'tags', + ]); + $term = reset($found_terms); + if (!$term) { + $term = Term::create([ + 'name' => 'archive_import', + 'vid' => 'media_tags', + ]); + $term->save(); + } + + $media = Media::create([ + 'bundle' => 'image', + 'uid' => \Drupal::currentUser()->id(), + 'field_media_image' => [ + 'target_id' => $file->id(), + 'alt' => $alt, + ], + 's_m_tags' => [ + 'target_id' => $term->id(), + ], + ]); + $media->setName($file_name) + ->setPublished(TRUE) + ->save(); + } + + // Get the URL of the media item. + $media_src = $media->field_media_image->entity->getFileUri(); + $media_src = \Drupal::service('file_url_generator')->generateString($media_src); + + // Replace the imported img tag src with the path to the new media item. + $imageNode->setAttribute('src', $media_src); + } + + // Create the Body html source code. + $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], + iterator_to_array($maincontentNode->childNodes))); + + // Create a node. + $entity = Node::create([ + 'type' => 'archive_page', + 'title' => $title, + 'archive_page_body' => [['value' => $body, 'format' => 'archive']], + 'path' => [ + 'alias' => $alias, + 'pathauto' => PathautoState::SKIP, + ], + ] + ); + $entity->save(); + + $context['results'][] = $url; + $context['message'] = t('Created @title', array('@title' => $url)); + } + +} diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml new file mode 100644 index 000000000..eac972a27 --- /dev/null +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml @@ -0,0 +1,6 @@ +name: Archive page importer tool +package: UNL +type: module +description: Import pages from a Drupal 7 site into Archive Page type. +core_version_requirement: ^9 || ^10 + diff --git a/web/modules/custom/batch-import-example/batch_import_example.module b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.module similarity index 100% rename from web/modules/custom/batch-import-example/batch_import_example.module rename to web/modules/custom/unl_archive_page_import/unl_archive_page_import.module diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml new file mode 100644 index 000000000..8a216e378 --- /dev/null +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml @@ -0,0 +1,8 @@ +unl_archive_page_import.batchimport: + path: '/admin/unl/archive-import' + defaults: + _title: 'Archive page migration tool' + _form: '\Drupal\unl_archive_page_import\Form\ImportForm' + requirements: + _permission: 'access content' + From c2671483c95316f9c004f456de8f9a3cae03835e Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Fri, 2 Feb 2024 17:18:17 -0600 Subject: [PATCH 3/8] [#408] Mark archived import files with entity_usage --- .../install/user.role.administrator.yml | 1 + .../config/install/user.role.editor.yml | 2 +- .../config/install/user.role.site_admin.yml | 1 + .../custom/unl_archive_page_import/README.md | 31 --- .../unl_archive_page_import/docs/animals.json | 11 - .../docs/batch_example.gif | Bin 115779 -> 0 bytes .../src/Form/ImportForm-withmediatag.php | 213 ------------------ .../src/Form/ImportForm.php | 18 +- .../unl_archive_page_import.info.yml | 5 +- .../ContentHubNodeAccessControlHandler.php | 3 +- 10 files changed, 20 insertions(+), 265 deletions(-) delete mode 100644 web/modules/custom/unl_archive_page_import/README.md delete mode 100644 web/modules/custom/unl_archive_page_import/docs/animals.json delete mode 100644 web/modules/custom/unl_archive_page_import/docs/batch_example.gif delete mode 100644 web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml index 79986f829..2138c0bd9 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml @@ -137,6 +137,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' - 'delete any archive_page content' - 'delete any book content' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml index 07ec1b3ab..329ad90da 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml @@ -90,8 +90,8 @@ permissions: - 'create terms in media_tags' - 'create timeline block content' - 'create unl_directory_entry external entity' + - 'create webform content' - 'delete any accordion block content' - - 'delete any archive_page content' - 'delete any card block content' - 'delete any content block content' - 'delete any cta block content' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml index c80e589f8..90289f3c7 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.site_admin.yml @@ -116,6 +116,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' - 'delete any archive_page content' - 'delete any book content' diff --git a/web/modules/custom/unl_archive_page_import/README.md b/web/modules/custom/unl_archive_page_import/README.md deleted file mode 100644 index e7bad615b..000000000 --- a/web/modules/custom/unl_archive_page_import/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Drupal 8 batch import example with interaction -![alt text](https://github.com/stef-van-looveren/batch-import-example/blob/master/docs/batch_example.gif?raw=true "Drupal 8 batch import example") - -This example module will import 3 dogs from a json file as nodes: -``` -[ - { - "name":"Whiskers" - }, - { - "name":"Woof" - }, - { - "name":"Fluffy" - } -] -``` - -## Batch processing -The form will create a batch process, which runs a small function to create the nodes. Batch processing is important when running imports with higher volumes to prevent the script to timeout. - -## How to -1. Enable the module -2. Clear caches -3. Go to `admin/batch-import-example` and submit the form -4. A batch process will start and give interaction about which dog he is importing. - -## Blog -For a blog on the usage of this module: [Create a batch process with interaction in drupal 8](https://stefvanlooveren.me/blog/create-batch-process-interaction-drupal-8-solved). -## Thanks -This module was built while working for [VITO (Flanders Institue for Technological Research)](https://www.vito.be). \ No newline at end of file diff --git a/web/modules/custom/unl_archive_page_import/docs/animals.json b/web/modules/custom/unl_archive_page_import/docs/animals.json deleted file mode 100644 index 8f0f93f4e..000000000 --- a/web/modules/custom/unl_archive_page_import/docs/animals.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - { - "name": "Whiskers" - }, - { - "name": "Woof" - }, - { - "name": "Fluffy" - } -] diff --git a/web/modules/custom/unl_archive_page_import/docs/batch_example.gif b/web/modules/custom/unl_archive_page_import/docs/batch_example.gif deleted file mode 100644 index 8ae81424e4bd76b622be79f9868a6b82d08ef6ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115779 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

RupE0i^VRS{^jRZ|UI~Ovz^I4? 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 G!?jn3k?`?Z5)RrnYT)G7@r@gDh+ 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 TE%pD|QvLr+2m8P71;hUbBKQsG diff --git a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php deleted file mode 100644 index cd7045ed4..000000000 --- a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm-withmediatag.php +++ /dev/null @@ -1,213 +0,0 @@ -This example form will import 3 pages from the docs/animals.json example

'; - - $form['actions'] = array( - '#type' => 'actions', - 'submit' => array( - '#type' => 'submit', - '#value' => 'Proceed', - ), - ); - - return $form; - } - - /** - * {@inheritdoc} - */ - public function submitForm(array &$form, FormStateInterface $form_state) { - $base_url = 'https://unlcms.unl.edu/'; - $base_url = trim($base_url, '/') . '/'; - - $url = 'https://unlcms.unl.edu/sitemap.xml'; - $request = \Drupal::httpClient()->get($url); - $body = $request->getBody(); - $site_map = simplexml_load_string($body); - - $batch = [ - 'title' => t('Importing animals'), - 'operations' => [], - 'init_message' => t('Import process is starting.'), - 'progress_message' => t('Processed @current out of @total. Estimated time: @estimate.'), - 'error_message' => t('The process has encountered an error.'), - ]; - - foreach ($site_map->url as $item) { - $url = (string)$item->loc; - $alias = substr($url, strlen($base_url)-1); - $batch['operations'][] = [ - ['\Drupal\batch_import_example\Form\ImportForm', 'importPage'], [$url, $alias] - ]; - } - - batch_set($batch); - \Drupal::messenger()->addMessage('Imported ' . count($site_map) . ' animals!'); - - $form_state->setRebuild(TRUE); - } - - /** - * @param $entity - * Deletes an entity - */ - public static function importPage($url, $alias, &$context) { - $request = \Drupal::httpClient()->get($url); - $body = $request->getBody(); - if (!$body) { - $context['message'] = t('The page at ' . $url . ' is empty. Ignoring.'); - return false; - } - - $dom = new DOMDocument(); - if (!@$dom->loadHTML($body)) { - return false; - } - $xpath = new DOMXpath($dom); - - // Check to see if there's a base tag on this page. - $base_tags = $dom->getElementsByTagName('base'); - $page_base = NULL; - if ($base_tags->length > 0) { - $page_base = $base_tags->item(0)->getAttribute('href'); - } - - // Page title. - $title = $url; - $nodes = $xpath->query("//header[@id='dcf-page-title']/h1//text()"); - if ($nodes->length > 0) { - $title = $dom->saveHTML($nodes->item(0)); - } - - // Get the Main Content html for the Body field. - $nodes = $xpath->query("//div[contains(@class, 'dcf-main-content')]"); - if (!$maincontentNode = $nodes->item(0)) { - return false; - } - - // Process images. - $imageNodes = $maincontentNode->getElementsByTagName('img'); - foreach ($imageNodes as $imageNode) { - $src = $imageNode->getAttribute('src'); - $file_name = explode("/", $src); - $file_name = end($file_name); - $file_name = explode("?", $file_name); - $file_name = $file_name[0]; - - // Check if image already exists. - $file = \Drupal::entityTypeManager() - ->getStorage('file') - ->loadByProperties(['filename' => $file_name]); - - if ($file) { - // Get existing Media entity. - $fileId = array_shift($file)->id(); - $media = \Drupal::entityTypeManager() - ->getStorage('media') - ->loadByProperties(['field_media_image' => $fileId]); - $media = reset($media); - } - else { - // Download the file and create a new Media entity. - if (strpos($src, 'http://') === false && strpos($src, 'https://') === false) { - $src = 'https://unlcms.unl.edu/' . $src; - } - - $file_data = file_get_contents($src); - $file = \Drupal::service('file.repository') - ->writeData($file_data, 'public://media/image/' . $file_name, FileSystemInterface::EXISTS_REPLACE); - - $alt = $imageNode->getAttribute('alt'); - $alt = substr($alt, 0, 500); - if (empty($alt)) { - $alt = ' '; - } - - // Get the ID of the "archive_import" media tag. - $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); - $found_terms = $storage->loadByProperties([ - 'name' => 'archive_import', - 'vid' => 'tags', - ]); - $term = reset($found_terms); - if (!$term) { - $term = Term::create([ - 'name' => 'archive_import', - 'vid' => 'media_tags', - ]); - $term->save(); - } - - $media = Media::create([ - 'bundle' => 'image', - 'uid' => \Drupal::currentUser()->id(), - 'field_media_image' => [ - 'target_id' => $file->id(), - 'alt' => $alt, - ], - 's_m_tags' => [ - 'target_id' => $term->id(), - ], - ]); - $media->setName($file_name) - ->setPublished(TRUE) - ->save(); - } - - // Create a new drupal-media DOM element. - $drupal_media = $dom->createElement('drupal-media'); - $drupal_media->setAttribute('data-entity-type', 'media'); - $drupal_media->setAttribute('data-entity-uuid', $media->uuid()); - - // Replace the imported img tag with the new drupal-media element. - $imageNode->parentNode->replaceChild($drupal_media, $imageNode); - } - - // Create the Body html source code. - $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], - iterator_to_array($maincontentNode->childNodes))); - - // Create a node. - $entity = Node::create([ - 'type' => 'archive_page', - 'title' => $title, - 'archive_page_body' => [['value' => $body, 'format' => 'archive']], - 'path' => [ - 'alias' => $alias, - 'pathauto' => PathautoState::SKIP, - ], - ] - ); - $entity->save(); - - $context['results'][] = $url; - $context['message'] = t('Created @title', array('@title' => $url)); - } - -} diff --git a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php index b092c9333..8b709ce57 100644 --- a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php +++ b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php @@ -91,6 +91,8 @@ public function submitForm(array &$form, FormStateInterface $form_state) { * Deletes an entity */ public static function importPage($url, $alias, $base_url, &$context) { + $media_added = []; + $request = \Drupal::httpClient()->get($url); $body = $request->getBody(); if (!$body) { @@ -178,7 +180,7 @@ public static function importPage($url, $alias, $base_url, &$context) { $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); $found_terms = $storage->loadByProperties([ 'name' => 'archive_import', - 'vid' => 'tags', + 'vid' => 'media_tags', ]); $term = reset($found_terms); if (!$term) { @@ -210,7 +212,7 @@ public static function importPage($url, $alias, $base_url, &$context) { // Replace the imported link href with the path to the new media item. $a->setAttribute('href', $media_src); - + $media_added[] = $media; } /** @@ -258,15 +260,12 @@ public static function importPage($url, $alias, $base_url, &$context) { $alt = $imageNode->getAttribute('alt'); $alt = substr($alt, 0, 500); - if (empty($alt)) { - $alt = ' '; - } // Get the ID of the "archive_import" media tag (or create it) that all imported files will be assigned. $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); $found_terms = $storage->loadByProperties([ 'name' => 'archive_import', - 'vid' => 'tags', + 'vid' => 'media_tags', ]); $term = reset($found_terms); if (!$term) { @@ -299,6 +298,7 @@ public static function importPage($url, $alias, $base_url, &$context) { // Replace the imported img tag src with the path to the new media item. $imageNode->setAttribute('src', $media_src); + $media_added[] = $media; } // Create the Body html source code. @@ -318,8 +318,12 @@ public static function importPage($url, $alias, $base_url, &$context) { ); $entity->save(); + foreach ($media_added as $media) { + \Drupal::service('entity_usage.usage')->registerUsage($media->id(), $media->getEntityTypeId(), $entity->id(), $entity->getEntityTypeId(), 'en', 1, 'entity_reference', 'archive_page_body'); + } + $context['results'][] = $url; - $context['message'] = t('Created @title', array('@title' => $url)); + $context['message'] = t('Imported @title', array('@title' => $url)); } } diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml index eac972a27..50a16b38d 100644 --- a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml @@ -3,4 +3,7 @@ package: UNL type: module description: Import pages from a Drupal 7 site into Archive Page type. core_version_requirement: ^9 || ^10 - +dependencies: + - drupal:media + - drupal:node + - entity_usage:entity_usage diff --git a/web/modules/custom/unl_contenthub/src/ContentHubNodeAccessControlHandler.php b/web/modules/custom/unl_contenthub/src/ContentHubNodeAccessControlHandler.php index 3fb5896ba..31dfeca0c 100644 --- a/web/modules/custom/unl_contenthub/src/ContentHubNodeAccessControlHandler.php +++ b/web/modules/custom/unl_contenthub/src/ContentHubNodeAccessControlHandler.php @@ -46,7 +46,8 @@ protected function checkCreateAccess(AccountInterface $account, array $context, // at the Content Hub site. return AccessResult::forbidden(); } - elseif ($account->hasPermission('create builder_page content')) { + elseif ($entity_bundle !== 'archive_page' && + $account->hasPermission('create builder_page content')) { // Using 'create builder_page content' as the base permission for any // custom content type that may get created. Because all permissions are // being managed with the herbie_roles feature, if a site creates a content From 8fbc8b5126af60909e898c93e6ed3a9039544e7b Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Fri, 2 Feb 2024 17:28:47 -0600 Subject: [PATCH 4/8] [#408] Permission config updates --- config/sync/user.role.administrator.yml | 1 + config/sync/user.role.editor.yml | 2 +- config/sync/user.role.site_admin.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 97a462dca..1130b3505 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -140,6 +140,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' - 'delete any archive_page content' - 'delete any book content' diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index 254c3629d..edd56ef3a 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -93,8 +93,8 @@ permissions: - 'create terms in media_tags' - 'create timeline block content' - 'create unl_directory_entry external entity' + - 'create webform content' - 'delete any accordion block content' - - 'delete any archive_page content' - 'delete any card block content' - 'delete any content block content' - 'delete any cta block content' diff --git a/config/sync/user.role.site_admin.yml b/config/sync/user.role.site_admin.yml index 70760f7a6..22fc0c5aa 100644 --- a/config/sync/user.role.site_admin.yml +++ b/config/sync/user.role.site_admin.yml @@ -119,6 +119,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' - 'delete any archive_page content' - 'delete any book content' From f06e2274cfdbf0d06340e9b37287d58816a1fc2f Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Wed, 14 Feb 2024 18:28:54 -0600 Subject: [PATCH 5/8] [#408] Process images first before files If an image is also linked to with an anchor tag, we want it created as an Image Media item instead of a File --- ...eld_override.node.archive_page.promote.yml | 2 +- ...orm_display.block_content.hero.default.yml | 2 +- ...splay.block_content.photo_hero.default.yml | 2 +- ...form_display.node.archive_page.default.yml | 3 +- ...iew_display.block_content.hero.default.yml | 2 +- ...splay.block_content.photo_hero.default.yml | 2 +- ...view_display.node.archive_page.default.yml | 2 +- ..._view_display.node.archive_page.teaser.yml | 2 +- ...view_display.node.builder_page.default.yml | 4 + config/sync/core.extension.yml | 1 + config/sync/editor.editor.archive.yml | 67 ++++++- config/sync/editor.editor.webform_default.yml | 2 +- ...d.field.block_content.card.b_card_body.yml | 2 +- ....block_content.hero.b_hero_img_obj_pos.yml | 4 +- ...ent.photo_hero.b_photohero_img_obj_pos.yml | 4 +- ...ld.node.archive_page.archive_page_body.yml | 2 +- ...orage.block_content.b_hero_img_obj_pos.yml | 4 +- ....block_content.b_photohero_img_obj_pos.yml | 4 +- .../field.storage.node.archive_page_body.yml | 2 +- config/sync/filter.format.archive.yml | 81 +++++++- config/sync/filter.format.webform_default.yml | 3 +- ...tern_diagonal_gradient_multi_staggered.yml | 6 +- config/sync/node.type.archive_page.yml | 6 +- config/sync/replicate_ui.settings.yml | 2 +- config/sync/user.role.administrator.yml | 18 +- config/sync/user.role.coder.yml | 12 +- config/sync/user.role.editor.yml | 10 +- config/sync/user.role.site_admin.yml | 11 +- config/sync/user.role.viewer.yml | 2 - config/sync/webform.settings.yml | 8 + config/sync/workflows.workflow.editorial.yml | 2 - ...form_display.node.archive_page.default.yml | 1 - .../config/install/editor.editor.archive.yml | 65 ++++++- .../config/install/filter.format.archive.yml | 79 +++++++- .../config/install/node.type.archive_page.yml | 4 +- .../herbie_archive_page.info.yml | 30 +-- .../src/Form/ImportForm.php | 184 +++++++++++------- .../unl_archive_page_import.info.yml | 4 +- .../unl_archive_page_import.links.menu.yml | 6 + .../unl_archive_page_import.routing.yml | 4 +- 40 files changed, 484 insertions(+), 167 deletions(-) create mode 100644 web/modules/custom/unl_archive_page_import/unl_archive_page_import.links.menu.yml diff --git a/config/sync/core.base_field_override.node.archive_page.promote.yml b/config/sync/core.base_field_override.node.archive_page.promote.yml index 3e9e4f01a..8abf389f7 100644 --- a/config/sync/core.base_field_override.node.archive_page.promote.yml +++ b/config/sync/core.base_field_override.node.archive_page.promote.yml @@ -1,4 +1,4 @@ -uuid: 6e7d6455-0ff2-485a-9e22-3f9694d245bd +uuid: b5c27490-886a-476c-80ee-71502142dc9f langcode: en status: true dependencies: diff --git a/config/sync/core.entity_form_display.block_content.hero.default.yml b/config/sync/core.entity_form_display.block_content.hero.default.yml index 4dbd71992..cb62f2289 100644 --- a/config/sync/core.entity_form_display.block_content.hero.default.yml +++ b/config/sync/core.entity_form_display.block_content.hero.default.yml @@ -13,7 +13,7 @@ dependencies: module: - media_library _core: - default_config_hash: 0IPTFQ4QsaaIvhHetksXjUvt9XGV68RXjDAdjPi0Ef4 + default_config_hash: MmM4GbBNi4ZJggCE5w1JPBIE_peT1Gm9PQNw5o3ydZg id: block_content.hero.default targetEntityType: block_content bundle: hero diff --git a/config/sync/core.entity_form_display.block_content.photo_hero.default.yml b/config/sync/core.entity_form_display.block_content.photo_hero.default.yml index 6060a497b..092ce4325 100644 --- a/config/sync/core.entity_form_display.block_content.photo_hero.default.yml +++ b/config/sync/core.entity_form_display.block_content.photo_hero.default.yml @@ -16,7 +16,7 @@ dependencies: - media_library - text _core: - default_config_hash: s-CeHQ1Po1MxiTd9nQlZJDoZWhzqE4ziQ7hrfcy42qU + default_config_hash: Mg7tzBxSVavlDgHB6lTsJYqJHD9NiA7tiYabsVYWIHM id: block_content.photo_hero.default targetEntityType: block_content bundle: photo_hero diff --git a/config/sync/core.entity_form_display.node.archive_page.default.yml b/config/sync/core.entity_form_display.node.archive_page.default.yml index c638ac592..087c86406 100644 --- a/config/sync/core.entity_form_display.node.archive_page.default.yml +++ b/config/sync/core.entity_form_display.node.archive_page.default.yml @@ -1,11 +1,10 @@ -uuid: e8c9d617-4687-402b-b539-5188f3978fa0 +uuid: ccc9b485-012f-40f2-bd6f-4a901f3dd772 langcode: en status: true dependencies: config: - field.field.node.archive_page.archive_page_body - node.type.archive_page - - workflows.workflow.editorial module: - content_moderation - path diff --git a/config/sync/core.entity_view_display.block_content.hero.default.yml b/config/sync/core.entity_view_display.block_content.hero.default.yml index 39615ccc3..8cbf78502 100644 --- a/config/sync/core.entity_view_display.block_content.hero.default.yml +++ b/config/sync/core.entity_view_display.block_content.hero.default.yml @@ -13,7 +13,7 @@ dependencies: module: - options _core: - default_config_hash: L7BvHdUygi_6iGD7fBH0oUIrY428nU3apsmHDftoXuU + default_config_hash: ohc_5Ak4jZ5mZAF-n-zBjp6PW9XMOIugeVx7aY2IHHE id: block_content.hero.default targetEntityType: block_content bundle: hero diff --git a/config/sync/core.entity_view_display.block_content.photo_hero.default.yml b/config/sync/core.entity_view_display.block_content.photo_hero.default.yml index 9678811e7..3c5f993ba 100644 --- a/config/sync/core.entity_view_display.block_content.photo_hero.default.yml +++ b/config/sync/core.entity_view_display.block_content.photo_hero.default.yml @@ -16,7 +16,7 @@ dependencies: - options - text _core: - default_config_hash: kOcB0UwCNvu1Ol-UWJSiVl_tbQL0Fdx-8G6eCknX830 + default_config_hash: xXRvIhC6oeKtkTe4UXEi7HcNMQvZz2WrENldpaU8nw4 id: block_content.photo_hero.default targetEntityType: block_content bundle: photo_hero diff --git a/config/sync/core.entity_view_display.node.archive_page.default.yml b/config/sync/core.entity_view_display.node.archive_page.default.yml index 9a025c74b..b247a1c34 100644 --- a/config/sync/core.entity_view_display.node.archive_page.default.yml +++ b/config/sync/core.entity_view_display.node.archive_page.default.yml @@ -1,4 +1,4 @@ -uuid: 104905b8-979f-4c4e-ac1a-678437c3ffe1 +uuid: 21f9b652-578f-4912-98ea-a0c04010548c langcode: en status: true dependencies: diff --git a/config/sync/core.entity_view_display.node.archive_page.teaser.yml b/config/sync/core.entity_view_display.node.archive_page.teaser.yml index 89411509c..421fe33dc 100644 --- a/config/sync/core.entity_view_display.node.archive_page.teaser.yml +++ b/config/sync/core.entity_view_display.node.archive_page.teaser.yml @@ -1,4 +1,4 @@ -uuid: e5e73cae-dc5a-4171-acf8-0f903e9c54b1 +uuid: 7b2790a5-5715-4ed6-b8f4-d2382702bd82 langcode: en status: true dependencies: diff --git a/config/sync/core.entity_view_display.node.builder_page.default.yml b/config/sync/core.entity_view_display.node.builder_page.default.yml index 15fcabb54..52b1a0e1f 100644 --- a/config/sync/core.entity_view_display.node.builder_page.default.yml +++ b/config/sync/core.entity_view_display.node.builder_page.default.yml @@ -105,6 +105,7 @@ third_party_settings: - 'inline_block:accordion' - 'inline_block:cta' - 'inline_block:card' + - 'inline_block:html_code' - 'inline_block:node_include' - 'inline_block:proofpoint' - 'inline_block:social_media_links' @@ -131,6 +132,7 @@ third_party_settings: - 'inline_block:accordion' - 'inline_block:cta' - 'inline_block:photo_hero' + - 'inline_block:html_code' - 'inline_block:icon_links' - 'inline_block:logo_cloud' - 'inline_block:node_include' @@ -160,6 +162,7 @@ third_party_settings: - 'inline_block:cta' - 'inline_block:card' - 'inline_block:photo_hero' + - 'inline_block:html_code' - 'inline_block:node_include' - 'inline_block:proofpoint' - 'inline_block:social_media_links' @@ -185,6 +188,7 @@ third_party_settings: - 'inline_block:cta' - 'inline_block:card' - 'inline_block:photo_hero' + - 'inline_block:html_code' - 'inline_block:logo_cloud' - 'inline_block:proofpoint' - 'inline_block:slideshow' diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index b1b662bd6..00c4eb7d1 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -150,6 +150,7 @@ module: unl_layout_builder_custom: 0 unl_media: 0 unl_menu: 0 + unl_multisite: 0 unl_news: 0 unl_pathauto: 0 unl_person: 0 diff --git a/config/sync/editor.editor.archive.yml b/config/sync/editor.editor.archive.yml index c14892949..fcc3e6930 100644 --- a/config/sync/editor.editor.archive.yml +++ b/config/sync/editor.editor.archive.yml @@ -1,4 +1,4 @@ -uuid: 904f7f35-6b3f-41d8-9e2a-ec46ae01881a +uuid: c921609f-3711-431c-8ad1-aaa9e97e5a5f langcode: en status: true dependencies: @@ -13,12 +13,36 @@ editor: ckeditor5 settings: toolbar: items: - - heading + - sourceEditing + - '|' - bold - italic + - strikethrough + - alignment + - '|' + - link + - '|' + - bulletedList + - numberedList + - '|' - drupalMedia - - sourceEditing + - blockQuote + - insertTable + - '|' + - heading + - '|' + - superscript + - subscript + - specialCharacters + - '|' + - horizontalLine + - '|' + - style plugins: + ckeditor5_alignment: + enabled_alignments: + - center + - left ckeditor5_heading: enabled_headings: - heading2 @@ -26,8 +50,43 @@ settings: - heading4 - heading5 - heading6 + ckeditor5_list: + reversed: false + startIndex: true ckeditor5_sourceEditing: allowed_tags: { } + ckeditor5_style: + styles: + - + label: 'Extra small' + element: '

' + - + label: Small + element: '

' + - + label: Large + element: '

' + - + label: 'Primary Button' + element: '' + - + label: 'Secondary Button' + element: '' + - + label: 'Tertiary Button' + element: '' + - + label: 'Inverse Primary Button' + element: '' + - + label: 'Inverse Secondary Button' + element: '' + - + label: 'Inverse Tertiary Button' + element: '' + linkit_extension: + linkit_enabled: true + linkit_profile: standard media_media: - allow_view_mode_override: false + allow_view_mode_override: true image_upload: { } diff --git a/config/sync/editor.editor.webform_default.yml b/config/sync/editor.editor.webform_default.yml index 124494437..4368b4aff 100644 --- a/config/sync/editor.editor.webform_default.yml +++ b/config/sync/editor.editor.webform_default.yml @@ -1,4 +1,4 @@ -uuid: 061533eb-3058-4821-a848-37bae8424321 +uuid: null langcode: en status: true dependencies: diff --git a/config/sync/field.field.block_content.card.b_card_body.yml b/config/sync/field.field.block_content.card.b_card_body.yml index e7b47be3f..30a1498ad 100644 --- a/config/sync/field.field.block_content.card.b_card_body.yml +++ b/config/sync/field.field.block_content.card.b_card_body.yml @@ -13,7 +13,7 @@ third_party_settings: allowed_formats: - block_body _core: - default_config_hash: SJKDfUOfV8qMV5nSvuEu9oU7CrpF4GgSdeRFImiK7lM + default_config_hash: lyhW_AA4yA60diwSE2MEk7Ai4WEv4Oo9Z7ZfonHo8uM id: block_content.card.b_card_body field_name: b_card_body entity_type: block_content diff --git a/config/sync/field.field.block_content.hero.b_hero_img_obj_pos.yml b/config/sync/field.field.block_content.hero.b_hero_img_obj_pos.yml index 61ed872e3..a3b7ca167 100644 --- a/config/sync/field.field.block_content.hero.b_hero_img_obj_pos.yml +++ b/config/sync/field.field.block_content.hero.b_hero_img_obj_pos.yml @@ -1,4 +1,4 @@ -uuid: 855ee02f-73d6-4710-9ade-34f23e479571 +uuid: 8d6b8de8-d8fb-4a63-8868-f4011e80eb00 langcode: en status: true dependencies: @@ -7,6 +7,8 @@ dependencies: - field.storage.block_content.b_hero_img_obj_pos module: - options +_core: + default_config_hash: UAb1A2wcDNyO6Rko-KyNmJw0d9h99W4IhEzZrvDhJ2I id: block_content.hero.b_hero_img_obj_pos field_name: b_hero_img_obj_pos entity_type: block_content diff --git a/config/sync/field.field.block_content.photo_hero.b_photohero_img_obj_pos.yml b/config/sync/field.field.block_content.photo_hero.b_photohero_img_obj_pos.yml index 4fe54b820..7ccba1ffb 100644 --- a/config/sync/field.field.block_content.photo_hero.b_photohero_img_obj_pos.yml +++ b/config/sync/field.field.block_content.photo_hero.b_photohero_img_obj_pos.yml @@ -1,4 +1,4 @@ -uuid: f766a032-4938-45c3-b85a-f440940b7739 +uuid: 583ae732-c8a5-4f1c-b1b6-b78254d4d152 langcode: en status: true dependencies: @@ -7,6 +7,8 @@ dependencies: - field.storage.block_content.b_photohero_img_obj_pos module: - options +_core: + default_config_hash: 9YQVq03TIu-XirdIiRgNhWfngwg3-Ftzn1b3WpC5C9Y id: block_content.photo_hero.b_photohero_img_obj_pos field_name: b_photohero_img_obj_pos entity_type: block_content diff --git a/config/sync/field.field.node.archive_page.archive_page_body.yml b/config/sync/field.field.node.archive_page.archive_page_body.yml index 74c5a7072..907972c1d 100644 --- a/config/sync/field.field.node.archive_page.archive_page_body.yml +++ b/config/sync/field.field.node.archive_page.archive_page_body.yml @@ -1,4 +1,4 @@ -uuid: a39cc45b-676d-4f87-8a47-d9fa5f3ebf2c +uuid: 9f8d2626-1324-41b8-8c43-6be226ed7640 langcode: en status: true dependencies: diff --git a/config/sync/field.storage.block_content.b_hero_img_obj_pos.yml b/config/sync/field.storage.block_content.b_hero_img_obj_pos.yml index 8c9ab949f..4c7ef04ad 100644 --- a/config/sync/field.storage.block_content.b_hero_img_obj_pos.yml +++ b/config/sync/field.storage.block_content.b_hero_img_obj_pos.yml @@ -1,10 +1,12 @@ -uuid: 967157e6-c54a-4c43-9edf-bed02a28059d +uuid: 00312cf5-ef11-46b2-b528-bf31fad16b2c langcode: en status: true dependencies: module: - block_content - options +_core: + default_config_hash: wBusup56H7cs_qvxmjVfzn2MKOpuUvdYBqMzO9QlJ1M id: block_content.b_hero_img_obj_pos field_name: b_hero_img_obj_pos entity_type: block_content diff --git a/config/sync/field.storage.block_content.b_photohero_img_obj_pos.yml b/config/sync/field.storage.block_content.b_photohero_img_obj_pos.yml index e9199c124..b33491006 100644 --- a/config/sync/field.storage.block_content.b_photohero_img_obj_pos.yml +++ b/config/sync/field.storage.block_content.b_photohero_img_obj_pos.yml @@ -1,10 +1,12 @@ -uuid: c85522af-fca3-46d0-975a-7ae2fd90d9f6 +uuid: b1269961-a57c-4718-a82a-2fcbd297b17b langcode: en status: true dependencies: module: - block_content - options +_core: + default_config_hash: LaY7DirhFoVc9EDWTQ5aXPpE9flWKZ2jE04aDYo5Jaw id: block_content.b_photohero_img_obj_pos field_name: b_photohero_img_obj_pos entity_type: block_content diff --git a/config/sync/field.storage.node.archive_page_body.yml b/config/sync/field.storage.node.archive_page_body.yml index eea63ba05..0642dbf81 100644 --- a/config/sync/field.storage.node.archive_page_body.yml +++ b/config/sync/field.storage.node.archive_page_body.yml @@ -1,4 +1,4 @@ -uuid: 10116895-793f-49ab-b3d6-c78f6b01a361 +uuid: a1a80849-09dd-4808-bebb-171169ab9e4f langcode: en status: true dependencies: diff --git a/config/sync/filter.format.archive.yml b/config/sync/filter.format.archive.yml index ebc24da9e..ff7a1f8bf 100644 --- a/config/sync/filter.format.archive.yml +++ b/config/sync/filter.format.archive.yml @@ -1,4 +1,4 @@ -uuid: ae302daf-bb4c-4dc7-800f-617a3f5ee440 +uuid: 079c1aa9-97a9-4bd8-96ba-185006a0c182 langcode: en status: true dependencies: @@ -6,7 +6,10 @@ dependencies: - core.entity_view_mode.media.narrow - core.entity_view_mode.media.wide module: + - codemirror_editor - dcf_ckeditor5 + - editor + - linkit - media _core: default_config_hash: rzPzXxWUrXX_M7AOoY7S2IdDNW1fcFWrMiBiR-WHf4Q @@ -18,29 +21,95 @@ filters: id: filter_dcfckeditor5 provider: dcf_ckeditor5 status: false - weight: 0 + weight: -43 settings: dcftable: '0' filter_html: id: filter_html provider: filter status: false - weight: -10 + weight: -46 settings: - allowed_html: '' + allowed_html: '

' filter_html_help: true filter_html_nofollow: false media_embed: id: media_embed provider: media status: true - weight: 100 + weight: -47 settings: - default_view_mode: default + default_view_mode: narrow allowed_view_modes: default: default narrow: narrow wide: wide allowed_media_types: image: image + instagram: instagram remote_video: remote_video + codemirror_editor: + id: codemirror_editor + provider: codemirror_editor + status: false + weight: -44 + settings: + lineWrapping: false + lineNumbers: true + foldGutter: false + filter_url: + id: filter_url + provider: filter + status: false + weight: -40 + settings: + filter_url_length: 72 + linkit: + id: linkit + provider: linkit + status: true + weight: -48 + settings: + title: false + filter_align: + id: filter_align + provider: filter + status: true + weight: -50 + settings: { } + filter_caption: + id: filter_caption + provider: filter + status: true + weight: -49 + settings: { } + editor_file_reference: + id: editor_file_reference + provider: editor + status: false + weight: -42 + settings: { } + filter_html_image_secure: + id: filter_html_image_secure + provider: filter + status: false + weight: -39 + settings: { } + filter_autop: + id: filter_autop + provider: filter + status: false + weight: -41 + settings: { } + filter_htmlcorrector: + id: filter_htmlcorrector + provider: filter + status: false + weight: -38 + settings: { } + filter_html_escape: + id: filter_html_escape + provider: filter + status: false + weight: -45 + settings: { } diff --git a/config/sync/filter.format.webform_default.yml b/config/sync/filter.format.webform_default.yml index 38691ef1b..919e2f2fe 100644 --- a/config/sync/filter.format.webform_default.yml +++ b/config/sync/filter.format.webform_default.yml @@ -1,4 +1,3 @@ -uuid: 0cbc2dfc-b41a-4860-aad6-54bf4d9090b4 langcode: en status: true dependencies: @@ -7,4 +6,6 @@ dependencies: name: 'Webform (Default) - DO NOT EDIT' format: webform_default weight: 100 +roles: + - authenticated filters: { } diff --git a/config/sync/layout_builder_styles.style.section_background_pattern_diagonal_gradient_multi_staggered.yml b/config/sync/layout_builder_styles.style.section_background_pattern_diagonal_gradient_multi_staggered.yml index dbf80cc8f..b6889fe25 100644 --- a/config/sync/layout_builder_styles.style.section_background_pattern_diagonal_gradient_multi_staggered.yml +++ b/config/sync/layout_builder_styles.style.section_background_pattern_diagonal_gradient_multi_staggered.yml @@ -1,12 +1,14 @@ -uuid: 72dd3824-e4f9-4f66-bf24-3d5b2a8ed73b +uuid: 6d0cf94c-dfb9-4791-9bbb-cb788dce22bd langcode: en status: true dependencies: { } +_core: + default_config_hash: Tjk4vVFBO64NYQAj8Prg-tVQ5AeQhm4uQ1lHzfODEhU id: section_background_pattern_diagonal_gradient_multi_staggered label: 'Diagonal Gradient – Multi Staggered' classes: "unl-bg-diagonal-gradients\r\nunl-bg-soft-light" type: section group: background_pattern +weight: 0 block_restrictions: { } layout_restrictions: { } -weight: 0 diff --git a/config/sync/node.type.archive_page.yml b/config/sync/node.type.archive_page.yml index a1527be32..1792eb6cb 100644 --- a/config/sync/node.type.archive_page.yml +++ b/config/sync/node.type.archive_page.yml @@ -1,4 +1,4 @@ -uuid: d8b2bb1c-4f2d-4dd0-b873-8f189f53b36e +uuid: d360fdfc-729f-43c8-8b9f-228c1d9f9eb3 langcode: en status: true dependencies: @@ -11,9 +11,9 @@ third_party_settings: parent: 'main:' _core: default_config_hash: 0ebIm8b55UCcLLBAIXBkfSIjJ9UnzpXYzdpSVw-lzf0 -name: 'Archive page' +name: 'Temporary transition page' type: archive_page -description: '' +description: 'A page of HTML markup that has been imported from a Drupal 7 site.' help: '' new_revision: true preview_mode: 1 diff --git a/config/sync/replicate_ui.settings.yml b/config/sync/replicate_ui.settings.yml index 1a950da6d..581c29a93 100644 --- a/config/sync/replicate_ui.settings.yml +++ b/config/sync/replicate_ui.settings.yml @@ -1,5 +1,5 @@ _core: - default_config_hash: kTj4VrfBBlmTowM6GEcqnV6rS5DvkIeeWJSGHyda1e4 + default_config_hash: 5XLrcRJwJXP7isux6rFxcWcJ7Rc_z3ltCO3wWadIVpw entity_types: - node check_edit_access: true diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index 1130b3505..cdd5b43f2 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -6,6 +6,7 @@ dependencies: - core.entity_view_display.node.builder_page.default - filter.format.archive - filter.format.block_body + - filter.format.html_code - filter.format.minimal - filter.format.simple - filter.format.standard @@ -13,7 +14,6 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video - - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -32,6 +32,7 @@ dependencies: - entity_usage - external_entities - feeds + - field_css - field_ui - file - file_delete @@ -60,7 +61,7 @@ dependencies: - webform_node - webform_submission_log _core: - default_config_hash: _AH43AtkhyIHwSNiL8xiiBcFzTS9PTNgkYYktiBPiz0 + default_config_hash: T1V6teTaabSg8mcwVxJNLuKutyLpqt2SSqo1ObubVUk id: administrator label: Administrator weight: -4 @@ -70,6 +71,7 @@ permissions: - 'access any webform configuration' - 'access content overview' - 'access contextual links' + - 'access css fields' - 'access entity usage statistics' - 'access feed overview' - 'access files overview' @@ -120,6 +122,7 @@ permissions: - 'create cta block content' - 'create file media' - 'create hero block content' + - 'create html_code block content' - 'create icon_links block content' - 'create image media' - 'create logo_cloud block content' @@ -140,9 +143,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' - - 'create webform content' - 'delete any accordion block content' - - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -151,6 +152,7 @@ permissions: - 'delete any file' - 'delete any file media' - 'delete any hero block content' + - 'delete any html_code block content' - 'delete any icon_links block content' - 'delete any image media' - 'delete any logo_cloud block content' @@ -168,12 +170,10 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' - - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' - - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -190,7 +190,6 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' - - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -201,7 +200,6 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' - - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -224,7 +222,6 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' - - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -239,6 +236,7 @@ permissions: - 'update any content block content' - 'update any cta block content' - 'update any hero block content' + - 'update any html_code block content' - 'update any icon_links block content' - 'update any logo_cloud block content' - 'update any node_include block content' @@ -255,13 +253,13 @@ permissions: - 'use editorial transition unpublish' - 'use text format archive' - 'use text format block_body' + - 'use text format html_code' - 'use text format minimal' - 'use text format simple' - 'use text format standard' - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' - - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.coder.yml b/config/sync/user.role.coder.yml index 79ad4697d..e113ca382 100644 --- a/config/sync/user.role.coder.yml +++ b/config/sync/user.role.coder.yml @@ -3,11 +3,13 @@ langcode: en status: true dependencies: config: - - filter.format.archive + - filter.format.html_code module: - asset_injector + - block_content_permissions - contextual - feeds + - field_css - field_ui - filter - google_analytics @@ -19,13 +21,14 @@ dependencies: - twig_ui - views_ui _core: - default_config_hash: e_wgK3u6DJXex7VJ7NgqcpN53OnF52HfNNaK18TNPwA + default_config_hash: pjZngoP_kq80I1xBCMa6k4sk--mrzHRIpBC2HjNgftE id: coder label: Developer weight: -5 is_admin: null permissions: - 'access contextual links' + - 'access css fields' - 'access feed overview' - 'access site reports' - 'access taxonomy overview' @@ -43,7 +46,10 @@ permissions: - 'administer taxonomy' - 'administer twig templates' - 'administer views' + - 'create html_code block content' + - 'delete any html_code block content' - 'load twig templates from file system' - 'replicate entities' - - 'use text format archive' + - 'update any html_code block content' + - 'use text format html_code' - 'view the administration theme' diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index edd56ef3a..90c000fbe 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -13,7 +13,6 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video - - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -46,7 +45,7 @@ dependencies: - webform - webform_node _core: - default_config_hash: V5wvbRBDf_qpE6ZtYmzxyrgjxAnbcL_YB2HL-HulvmI + default_config_hash: fcuTxoPomW4e0Okydp0pxd85B93DHRfyNYVk9D0kdsM id: editor label: Editor weight: -7 @@ -93,7 +92,6 @@ permissions: - 'create terms in media_tags' - 'create timeline block content' - 'create unl_directory_entry external entity' - - 'create webform content' - 'delete any accordion block content' - 'delete any card block content' - 'delete any content block content' @@ -111,11 +109,9 @@ permissions: - 'delete any tabs block content' - 'delete any tandem block content' - 'delete any timeline block content' - - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete news revisions' - - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -127,7 +123,6 @@ permissions: - 'delete person revisions' - 'delete unl_directory_entry external entity' - 'delete webform revisions' - - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -136,7 +131,6 @@ permissions: - 'edit any person content' - 'edit any remote_video media' - 'edit any webform content' - - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -150,7 +144,6 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' - - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -183,7 +176,6 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' - - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.site_admin.yml b/config/sync/user.role.site_admin.yml index 22fc0c5aa..cd77bfadd 100644 --- a/config/sync/user.role.site_admin.yml +++ b/config/sync/user.role.site_admin.yml @@ -13,7 +13,6 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video - - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -55,7 +54,7 @@ dependencies: - webform_node - webform_submission_log _core: - default_config_hash: RYtaIhRvKsuvKIHP_VucmBHavcyaPPuKOZU9jnMjIAs + default_config_hash: t9Snbb4MC_KirnQlJczWXGnePYD5xGG8c7g2B4kuu-Y id: site_admin label: 'Site admin' weight: -6 @@ -119,9 +118,7 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' - - 'create webform content' - 'delete any accordion block content' - - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -147,12 +144,10 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' - - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' - - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -169,7 +164,6 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' - - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -180,7 +174,6 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' - - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -201,7 +194,6 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' - - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -237,7 +229,6 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' - - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.viewer.yml b/config/sync/user.role.viewer.yml index 42a6b0940..b44484e4a 100644 --- a/config/sync/user.role.viewer.yml +++ b/config/sync/user.role.viewer.yml @@ -3,7 +3,6 @@ langcode: en status: true dependencies: config: - - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -34,7 +33,6 @@ permissions: - 'access site in maintenance mode' - 'access toolbar' - 'view any unpublished content' - - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/webform.settings.yml b/config/sync/webform.settings.yml index e81198d97..d5e2ce8f3 100644 --- a/config/sync/webform.settings.yml +++ b/config/sync/webform.settings.yml @@ -3,6 +3,7 @@ _core: langcode: en settings: default_status: open + default_categories: { } default_page: true default_page_base_path: /form default_ajax: true @@ -46,6 +47,7 @@ settings: default_draft_pending_multiple_message: '

You have pending drafts for this webform. View your pending drafts.

' default_confirmation_message: '

New submission added to [webform:title].

' default_confirmation_back_label: 'Back to form' + default_confirmation_noindex: true default_limit_total_message: '

No more submissions are permitted.

' default_limit_user_message: '

No more submissions are permitted.

' default_submission_label: '[webform_submission:submitted-to]: Submission #[webform_submission:serial]' @@ -257,9 +259,15 @@ export: header_prefix: true header_prefix_key_delimiter: __ header_prefix_label_delimiter: ': ' + entity_reference_items: + - id + - title + - url options_single_format: compact options_multiple_format: compact options_item_format: label + likert_answers_format: label + signature_format: status composite_element_item_format: label excluded_exporters: { } handler: diff --git a/config/sync/workflows.workflow.editorial.yml b/config/sync/workflows.workflow.editorial.yml index ed16e0fa1..3947e0ba5 100644 --- a/config/sync/workflows.workflow.editorial.yml +++ b/config/sync/workflows.workflow.editorial.yml @@ -3,7 +3,6 @@ langcode: en status: true dependencies: config: - - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -58,5 +57,4 @@ type_settings: - builder_page - news - person - - archive_page default_moderation_state: published diff --git a/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml index 6ec5157ea..722a74698 100644 --- a/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml +++ b/web/modules/custom/features/herbie_archive_page/config/install/core.entity_form_display.node.archive_page.default.yml @@ -4,7 +4,6 @@ dependencies: config: - field.field.node.archive_page.archive_page_body - node.type.archive_page - - workflows.workflow.editorial module: - content_moderation - path diff --git a/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml b/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml index 20455e6f6..08c7f11d0 100644 --- a/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml +++ b/web/modules/custom/features/herbie_archive_page/config/install/editor.editor.archive.yml @@ -10,12 +10,36 @@ editor: ckeditor5 settings: toolbar: items: - - heading + - sourceEditing + - '|' - bold - italic + - strikethrough + - alignment + - '|' + - link + - '|' + - bulletedList + - numberedList + - '|' - drupalMedia - - sourceEditing + - blockQuote + - insertTable + - '|' + - heading + - '|' + - superscript + - subscript + - specialCharacters + - '|' + - horizontalLine + - '|' + - style plugins: + ckeditor5_alignment: + enabled_alignments: + - center + - left ckeditor5_heading: enabled_headings: - heading2 @@ -23,8 +47,43 @@ settings: - heading4 - heading5 - heading6 + ckeditor5_list: + reversed: false + startIndex: true ckeditor5_sourceEditing: allowed_tags: { } + ckeditor5_style: + styles: + - + label: 'Extra small' + element: '

' + - + label: Small + element: '

' + - + label: Large + element: '

' + - + label: 'Primary Button' + element: '' + - + label: 'Secondary Button' + element: '' + - + label: 'Tertiary Button' + element: '' + - + label: 'Inverse Primary Button' + element: '' + - + label: 'Inverse Secondary Button' + element: '' + - + label: 'Inverse Tertiary Button' + element: '' + linkit_extension: + linkit_enabled: true + linkit_profile: standard media_media: - allow_view_mode_override: false + allow_view_mode_override: true image_upload: { } diff --git a/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml b/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml index f5f40c075..67686ef8c 100644 --- a/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml +++ b/web/modules/custom/features/herbie_archive_page/config/install/filter.format.archive.yml @@ -5,7 +5,10 @@ dependencies: - core.entity_view_mode.media.narrow - core.entity_view_mode.media.wide module: + - codemirror_editor - dcf_ckeditor5 + - editor + - linkit - media name: Archive format: archive @@ -15,29 +18,95 @@ filters: id: filter_dcfckeditor5 provider: dcf_ckeditor5 status: false - weight: 0 + weight: -43 settings: dcftable: '0' filter_html: id: filter_html provider: filter status: false - weight: -10 + weight: -46 settings: - allowed_html: '' + allowed_html: '

' filter_html_help: true filter_html_nofollow: false media_embed: id: media_embed provider: media status: true - weight: 100 + weight: -47 settings: - default_view_mode: default + default_view_mode: narrow allowed_view_modes: default: default narrow: narrow wide: wide allowed_media_types: image: image + instagram: instagram remote_video: remote_video + codemirror_editor: + id: codemirror_editor + provider: codemirror_editor + status: false + weight: -44 + settings: + lineWrapping: false + lineNumbers: true + foldGutter: false + filter_url: + id: filter_url + provider: filter + status: false + weight: -40 + settings: + filter_url_length: 72 + linkit: + id: linkit + provider: linkit + status: true + weight: -48 + settings: + title: false + filter_align: + id: filter_align + provider: filter + status: true + weight: -50 + settings: { } + filter_caption: + id: filter_caption + provider: filter + status: true + weight: -49 + settings: { } + editor_file_reference: + id: editor_file_reference + provider: editor + status: false + weight: -42 + settings: { } + filter_html_image_secure: + id: filter_html_image_secure + provider: filter + status: false + weight: -39 + settings: { } + filter_autop: + id: filter_autop + provider: filter + status: false + weight: -41 + settings: { } + filter_htmlcorrector: + id: filter_htmlcorrector + provider: filter + status: false + weight: -38 + settings: { } + filter_html_escape: + id: filter_html_escape + provider: filter + status: false + weight: -45 + settings: { } diff --git a/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml b/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml index 9a28ec940..498cfd079 100644 --- a/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml +++ b/web/modules/custom/features/herbie_archive_page/config/install/node.type.archive_page.yml @@ -8,9 +8,9 @@ third_party_settings: available_menus: - main parent: 'main:' -name: 'Archive page' +name: 'Temporary transition page' type: archive_page -description: '' +description: 'A page of HTML markup that has been imported from a Drupal 7 site.' help: '' new_revision: true preview_mode: 1 diff --git a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml index 107d5d47a..50a3acb8d 100644 --- a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml +++ b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml @@ -2,19 +2,21 @@ name: 'Archive page' type: module core_version_requirement: '^9.4 || ^10' dependencies: - - allowed_formats - - ckeditor5 - - content_moderation - - dcf_ckeditor5 - - editor - - field - - filter - - herbie_media_types - - media - - menu_ui - - node - - path - - text - - user + - 'allowed_formats:allowed_formats' + - 'codemirror_editor:codemirror_editor' + - 'dcf_ckeditor5:dcf_ckeditor5' + - 'drupal:ckeditor5' + - 'drupal:content_moderation' + - 'drupal:editor' + - 'drupal:field' + - 'drupal:filter' + - 'drupal:media' + - 'drupal:menu_ui' + - 'drupal:node' + - 'drupal:path' + - 'drupal:text' + - 'drupal:user' + - 'herbie_media_types:herbie_media_types' + - 'linkit:linkit' version: 1.0.0 package: Herbie diff --git a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php index 8b709ce57..4fd004f55 100644 --- a/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php +++ b/web/modules/custom/unl_archive_page_import/src/Form/ImportForm.php @@ -25,20 +25,24 @@ public function getFormId() : string { * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { - $form['#prefix'] = '

This example form will import 3 pages from the docs/animals.json example

'; + $form['#prefix'] = '

This tool imports pages from a sunsetting Drupal 7 site into this site. Instructions available at cms-docs.unl.edu.

'; $form['base_url'] = [ '#type' => 'textfield', '#title' => $this->t('Base URL of the site being imported from.'), - '#default_value' => 'https://unlcms.unl.edu/', '#required' => TRUE, - '#description' => $this->t('Put description here.'), + '#description' => $this->t('Example: https://example.unl.edu/'), + ]; + $form['sitemap'] = [ + '#type' => 'textfield', + '#title' => $this->t('Option #1: Path to XML sitemap of pages to import.'), + '#required' => FALSE, + '#description' => $this->t('Example: https://example.unl.edu/sitemap.xml'), ]; $form['url'] = [ '#type' => 'textfield', - '#title' => $this->t('Path to XML sitemap of pages to import.'), - '#default_value' => 'https://unlcms.unl.edu/sitemap.xml', - '#required' => TRUE, - '#description' => $this->t('Put description here.'), + '#title' => $this->t('Option #2: Single URL of a page to import.'), + '#required' => FALSE, + '#description' => $this->t('Example: https://example.unl.edu/sample-page'), ]; $form['actions'] = array( '#type' => 'actions', @@ -59,11 +63,6 @@ public function submitForm(array &$form, FormStateInterface $form_state) { $base_url = trim($base_url, '/') . '/'; $base_url = str_replace('http://', 'https://', $base_url); - $sitemap = $form_state->getValue('url'); - $request = \Drupal::httpClient()->get($sitemap); - $body = $request->getBody(); - $site_map = simplexml_load_string($body); - $batch = [ 'title' => t('Importing pages'), 'operations' => [], @@ -72,16 +71,35 @@ public function submitForm(array &$form, FormStateInterface $form_state) { 'error_message' => t('The process has encountered an error.'), ]; - foreach ($site_map->url as $item) { - $url = (string)$item->loc; - $alias = substr($url, strlen($base_url)-1); + $sitemap = $form_state->getValue('sitemap'); + if ($sitemap) { + $request = \Drupal::httpClient()->get($sitemap); + $body = $request->getBody(); + $site_map = simplexml_load_string($body); + + foreach ($site_map->url as $item) { + $url = (string) $item->loc; + $alias = substr($url, strlen($base_url) - 1); + $batch['operations'][] = [ + ['\Drupal\unl_archive_page_import\Form\ImportForm', 'importPage'], + [$url, $alias, $base_url] + ]; + } + } + elseif ($url = $form_state->getValue('url')) { + $alias = substr($url, strlen($base_url) - 1); $batch['operations'][] = [ - ['\Drupal\unl_archive_page_import\Form\ImportForm', 'importPage'], [$url, $alias, $base_url] + ['\Drupal\unl_archive_page_import\Form\ImportForm', 'importPage'], + [$url, $alias, $base_url] ]; } + else { + // @TODO Display a message to the user that they need to enter something. + return; + } batch_set($batch); - \Drupal::messenger()->addMessage('Imported ' . count($site_map) . ' pages!'); + \Drupal::messenger()->addMessage('Success!'); $form_state->setRebuild(TRUE); } @@ -126,36 +144,32 @@ public static function importPage($url, $alias, $base_url, &$context) { return false; } + + + /** - * Process links. + * Process images. */ - $linkNodes = $maincontentNode->getElementsByTagName('a'); - foreach ($linkNodes as $a) { - $href = $a->getAttribute('href'); - $file_name = explode("/", $href); + $imageNodes = $maincontentNode->getElementsByTagName('img'); + foreach ($imageNodes as $imageNode) { + $src = $imageNode->getAttribute('src'); + $file_name = explode("/", $src); $file_name = end($file_name); $file_name = explode("?", $file_name); $file_name = $file_name[0]; - // Check if link is local or external and skip if the later. + // Check if image is local or external and skip if the later. $base_url_http = str_replace('https://', 'http://', $base_url); - if (strpos($href, 'http://') === false && strpos($href, 'https://') === false) { - // Local link. - $href = $base_url . $href; + if (strpos($src, 'http://') === false && strpos($src, 'https://') === false) { + // Local file. + $src = $base_url . $src; } - elseif (strpos($href, $base_url) === false && strpos($href, $base_url_http) === false) { + elseif (strpos($src, $base_url) === false && strpos($src, $base_url_http) === false) { // This is a URL to an external site so skip touching it. continue; } - $response = \Drupal::httpClient()->head($href, ['http_errors' => false]); - $content_type = $response->getHeader('Content-Type'); - if (strpos($content_type[0], 'html') !== false) { - // Link to an HTML page, skip it. - continue; - } - - // Check if file already exists. + // Check if image already exists. $file = \Drupal::entityTypeManager() ->getStorage('file') ->loadByProperties(['filename' => $file_name]); @@ -165,16 +179,24 @@ public static function importPage($url, $alias, $base_url, &$context) { $fileId = array_shift($file)->id(); $media = \Drupal::entityTypeManager() ->getStorage('media') - ->loadByProperties(['field_media_file' => $fileId]); + ->loadByProperties(['field_media_image' => $fileId]); + if (!$media) { + $media = \Drupal::entityTypeManager() + ->getStorage('media') + ->loadByProperties(['field_media_file' => $fileId]); + } $media = reset($media); } else { // Download the file and create a new Media entity. - $file_data = file_get_contents($href); - $destination = 'public://media/file'; + $file_data = file_get_contents($src); + $destination = 'public://media/image'; \Drupal::service('file_system')->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY); $file = \Drupal::service('file.repository') - ->writeData($file_data, 'public://media/file/' . $file_name, FileSystemInterface::EXISTS_REPLACE); + ->writeData($file_data, 'public://media/image/' . $file_name, FileSystemInterface::EXISTS_REPLACE); + + $alt = $imageNode->getAttribute('alt'); + $alt = substr($alt, 0, 500); // Get the ID of the "archive_import" media tag (or create it) that all imported files will be assigned. $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); @@ -192,10 +214,11 @@ public static function importPage($url, $alias, $base_url, &$context) { } $media = Media::create([ - 'bundle' => 'file', + 'bundle' => 'image', 'uid' => \Drupal::currentUser()->id(), - 'field_media_file' => [ + 'field_media_image' => [ 'target_id' => $file->id(), + 'alt' => $alt, ], 's_m_tags' => [ 'target_id' => $term->id(), @@ -207,37 +230,52 @@ public static function importPage($url, $alias, $base_url, &$context) { } // Get the URL of the media item. - $media_src = $media->field_media_file->entity->getFileUri(); + if ($media->field_media_image) { + $media_src = $media->field_media_image->entity->getFileUri(); + } + else { + $media_src = $media->field_media_file->entity->getFileUri(); + } $media_src = \Drupal::service('file_url_generator')->generateString($media_src); - // Replace the imported link href with the path to the new media item. - $a->setAttribute('href', $media_src); + // Replace the imported img tag src with the path to the new media item. + $imageNode->setAttribute('src', $media_src); $media_added[] = $media; } + + + /** - * Process images. + * Process links to files. */ - $imageNodes = $maincontentNode->getElementsByTagName('img'); - foreach ($imageNodes as $imageNode) { - $src = $imageNode->getAttribute('src'); - $file_name = explode("/", $src); + $linkNodes = $maincontentNode->getElementsByTagName('a'); + foreach ($linkNodes as $a) { + $href = $a->getAttribute('href'); + $file_name = explode("/", $href); $file_name = end($file_name); $file_name = explode("?", $file_name); $file_name = $file_name[0]; - // Check if image is local or external and skip if the later. + // Check if link is local or external and skip if the later. $base_url_http = str_replace('https://', 'http://', $base_url); - if (strpos($src, 'http://') === false && strpos($src, 'https://') === false) { - // Local file. - $src = $base_url . $src; + if (strpos($href, 'http://') === false && strpos($href, 'https://') === false) { + // Local link. + $href = $base_url . $href; } - elseif (strpos($src, $base_url) === false && strpos($src, $base_url_http) === false) { + elseif (strpos($href, $base_url) === false && strpos($href, $base_url_http) === false) { // This is a URL to an external site so skip touching it. continue; } - // Check if image already exists. + $response = \Drupal::httpClient()->head($href, ['http_errors' => false]); + $content_type = $response->getHeader('Content-Type'); + if (strpos($content_type[0], 'html') !== false) { + // Link to an HTML page, skip it. + continue; + } + + // Check if file already exists. $file = \Drupal::entityTypeManager() ->getStorage('file') ->loadByProperties(['filename' => $file_name]); @@ -247,19 +285,21 @@ public static function importPage($url, $alias, $base_url, &$context) { $fileId = array_shift($file)->id(); $media = \Drupal::entityTypeManager() ->getStorage('media') - ->loadByProperties(['field_media_image' => $fileId]); + ->loadByProperties(['field_media_file' => $fileId]); + if (!$media) { + $media = \Drupal::entityTypeManager() + ->getStorage('media') + ->loadByProperties(['field_media_image' => $fileId]); + } $media = reset($media); } else { // Download the file and create a new Media entity. - $file_data = file_get_contents($src); - $destination = 'public://media/image'; + $file_data = file_get_contents($href); + $destination = 'public://media/file'; \Drupal::service('file_system')->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY); $file = \Drupal::service('file.repository') - ->writeData($file_data, 'public://media/image/' . $file_name, FileSystemInterface::EXISTS_REPLACE); - - $alt = $imageNode->getAttribute('alt'); - $alt = substr($alt, 0, 500); + ->writeData($file_data, 'public://media/file/' . $file_name, FileSystemInterface::EXISTS_REPLACE); // Get the ID of the "archive_import" media tag (or create it) that all imported files will be assigned. $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term'); @@ -277,11 +317,10 @@ public static function importPage($url, $alias, $base_url, &$context) { } $media = Media::create([ - 'bundle' => 'image', + 'bundle' => 'file', 'uid' => \Drupal::currentUser()->id(), - 'field_media_image' => [ + 'field_media_file' => [ 'target_id' => $file->id(), - 'alt' => $alt, ], 's_m_tags' => [ 'target_id' => $term->id(), @@ -293,14 +332,23 @@ public static function importPage($url, $alias, $base_url, &$context) { } // Get the URL of the media item. - $media_src = $media->field_media_image->entity->getFileUri(); + if ($media->field_media_file) { + $media_src = $media->field_media_file->entity->getFileUri(); + } + else { + $media_src = $media->field_media_image->entity->getFileUri(); + } $media_src = \Drupal::service('file_url_generator')->generateString($media_src); - // Replace the imported img tag src with the path to the new media item. - $imageNode->setAttribute('src', $media_src); + // Replace the imported link href with the path to the new media item. + $a->setAttribute('href', $media_src); $media_added[] = $media; } + + + + // Create the Body html source code. $body = implode(array_map([$maincontentNode->ownerDocument,"saveHTML"], iterator_to_array($maincontentNode->childNodes))); diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml index 50a16b38d..c64e27f63 100644 --- a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.info.yml @@ -1,7 +1,7 @@ -name: Archive page importer tool +name: 'Archive page importer' package: UNL type: module -description: Import pages from a Drupal 7 site into Archive Page type. +description: 'Import pages from a Drupal 7 site into Temporary transition page type.' core_version_requirement: ^9 || ^10 dependencies: - drupal:media diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.links.menu.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.links.menu.yml new file mode 100644 index 000000000..92d997b45 --- /dev/null +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.links.menu.yml @@ -0,0 +1,6 @@ +unl_archive_page_import.batchimport: + title: 'UNL Transition page import' + parent: system.admin_config_development + description: 'Import pages from a Drupal 7 UNLcms website.' + route_name: unl_archive_page_import.batchimport + weight: 30 diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml index 8a216e378..d1272b9f5 100644 --- a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml @@ -1,7 +1,7 @@ unl_archive_page_import.batchimport: - path: '/admin/unl/archive-import' + path: '/admin/config/unl/archive-import' defaults: - _title: 'Archive page migration tool' + _title: 'Transition page import tool' _form: '\Drupal\unl_archive_page_import\Form\ImportForm' requirements: _permission: 'access content' From 49faf4234aefdec499db1d2a2237962f6a4c739a Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Wed, 14 Feb 2024 18:37:20 -0600 Subject: [PATCH 6/8] [#408] Add description to Feature --- .../features/herbie_archive_page/herbie_archive_page.info.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml index 50a3acb8d..dfa5987e7 100644 --- a/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml +++ b/web/modules/custom/features/herbie_archive_page/herbie_archive_page.info.yml @@ -20,3 +20,4 @@ dependencies: - 'linkit:linkit' version: 1.0.0 package: Herbie +description: 'Provides Temporary transition page (Archive page) content type and related configuration. ' From b7d0a138b7fe39d5be301b08e09fbb386e836ed6 Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Wed, 14 Feb 2024 18:46:30 -0600 Subject: [PATCH 7/8] [#408] Cleanup --- composer.json | 1 - composer.lock | 55 +------------------ config/sync/core.extension.yml | 1 - config/sync/user.role.administrator.yml | 9 +++ config/sync/user.role.editor.yml | 7 +++ config/sync/user.role.site_admin.yml | 9 +++ config/sync/user.role.viewer.yml | 4 ++ .../install/user.role.administrator.yml | 7 +++ .../config/install/user.role.coder.yml | 10 +++- .../config/install/user.role.editor.yml | 1 - .../config/install/user.role.viewer.yml | 2 + .../herbie_roles/herbie_roles.info.yml | 2 +- 12 files changed, 48 insertions(+), 60 deletions(-) diff --git a/composer.json b/composer.json index 2c0c1de4d..e57f33e5b 100644 --- a/composer.json +++ b/composer.json @@ -157,7 +157,6 @@ "drupal/image_class": "^2.0", "drupal/image_effects": "^3.3", "drupal/imagemagick": "^3.3", - "drupal/imce": "^3.0", "drupal/inline_block_title_automatic": "^1.1", "drupal/inline_entity_form": "^1.0", "drupal/jsonapi_image_styles": "^3.0", diff --git a/composer.lock b/composer.lock index 4511114bc..68af74ee0 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": "5573852d8f2490dcaf4df2b0d01d6322", + "content-hash": "3175b05c6352203f593748269f7b3407", "packages": [ { "name": "arthurkushman/query-path", @@ -4107,59 +4107,6 @@ "source": "https://git.drupalcode.org/project/imagemagick" } }, - { - "name": "drupal/imce", - "version": "3.0.8", - "source": { - "type": "git", - "url": "https://git.drupalcode.org/project/imce.git", - "reference": "3.0.8" - }, - "dist": { - "type": "zip", - "url": "https://ftp.drupal.org/files/projects/imce-3.0.8.zip", - "reference": "3.0.8", - "shasum": "0abd0d0c7f2e01b2cddd9adde014f82e72453285" - }, - "require": { - "drupal/core": "^9.3 || ^10" - }, - "require-dev": { - "drupal/ckeditor": "^1.0" - }, - "type": "drupal-module", - "extra": { - "drupal": { - "version": "3.0.8", - "datestamp": "1683975052", - "security-coverage": { - "status": "covered", - "message": "Covered by Drupal's security advisory policy" - } - } - }, - "notification-url": "https://packages.drupal.org/8/downloads", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "See contributors", - "homepage": "https://www.drupal.org/node/2841111/committers", - "role": "Developer" - }, - { - "name": "ufku", - "homepage": "https://www.drupal.org/user/9910" - } - ], - "description": "Provides a file manager supporting personal folders.", - "homepage": "https://drupal.org/project/imce", - "support": { - "source": "https://git.drupalcode.org/project/imce", - "issues": "https://www.drupal.org/project/issues/imce" - } - }, { "name": "drupal/inline_block_title_automatic", "version": "1.1.0", diff --git a/config/sync/core.extension.yml b/config/sync/core.extension.yml index 00c4eb7d1..b1b662bd6 100644 --- a/config/sync/core.extension.yml +++ b/config/sync/core.extension.yml @@ -150,7 +150,6 @@ module: unl_layout_builder_custom: 0 unl_media: 0 unl_menu: 0 - unl_multisite: 0 unl_news: 0 unl_pathauto: 0 unl_person: 0 diff --git a/config/sync/user.role.administrator.yml b/config/sync/user.role.administrator.yml index cdd5b43f2..e0d371ddd 100644 --- a/config/sync/user.role.administrator.yml +++ b/config/sync/user.role.administrator.yml @@ -14,6 +14,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -143,7 +144,9 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -170,10 +173,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -190,6 +195,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -200,6 +206,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -222,6 +229,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -260,6 +268,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.editor.yml b/config/sync/user.role.editor.yml index 90c000fbe..ef9390d6f 100644 --- a/config/sync/user.role.editor.yml +++ b/config/sync/user.role.editor.yml @@ -13,6 +13,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -109,9 +110,11 @@ permissions: - 'delete any tabs block content' - 'delete any tandem block content' - 'delete any timeline block content' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -123,6 +126,7 @@ permissions: - 'delete person revisions' - 'delete unl_directory_entry external entity' - 'delete webform revisions' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -131,6 +135,7 @@ permissions: - 'edit any person content' - 'edit any remote_video media' - 'edit any webform content' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -144,6 +149,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -176,6 +182,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.site_admin.yml b/config/sync/user.role.site_admin.yml index cd77bfadd..5fa6910c5 100644 --- a/config/sync/user.role.site_admin.yml +++ b/config/sync/user.role.site_admin.yml @@ -13,6 +13,7 @@ dependencies: - media.type.file - media.type.image - media.type.remote_video + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news @@ -118,7 +119,9 @@ permissions: - 'create url aliases' - 'create users' - 'create webform' + - 'create webform content' - 'delete any accordion block content' + - 'delete any archive_page content' - 'delete any book content' - 'delete any builder_page content' - 'delete any card block content' @@ -144,10 +147,12 @@ permissions: - 'delete any webform' - 'delete any webform content' - 'delete any webform submission' + - 'delete archive_page revisions' - 'delete book revisions' - 'delete builder_page revisions' - 'delete files' - 'delete news revisions' + - 'delete own archive_page content' - 'delete own book content' - 'delete own builder_page content' - 'delete own file media' @@ -164,6 +169,7 @@ permissions: - 'delete webform revisions' - 'delete webform submissions any node' - 'delete webform submissions own node' + - 'edit any archive_page content' - 'edit any book content' - 'edit any builder_page content' - 'edit any file media' @@ -174,6 +180,7 @@ permissions: - 'edit any webform' - 'edit any webform content' - 'edit any webform submission' + - 'edit own archive_page content' - 'edit own book content' - 'edit own builder_page content' - 'edit own file media' @@ -194,6 +201,7 @@ permissions: - 'perform search only' - 'rabbit hole bypass media' - 'replicate entities' + - 'revert archive_page revisions' - 'revert book revisions' - 'revert builder_page revisions' - 'revert news revisions' @@ -229,6 +237,7 @@ permissions: - 'use text format webform' - 'view any unpublished content' - 'view any webform submission' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' diff --git a/config/sync/user.role.viewer.yml b/config/sync/user.role.viewer.yml index b44484e4a..1780adcd7 100644 --- a/config/sync/user.role.viewer.yml +++ b/config/sync/user.role.viewer.yml @@ -3,10 +3,12 @@ langcode: en status: true dependencies: config: + - node.type.archive_page - node.type.book - node.type.builder_page - node.type.news - node.type.person + - node.type.webform module: - content_moderation - contextual @@ -33,6 +35,7 @@ permissions: - 'access site in maintenance mode' - 'access toolbar' - 'view any unpublished content' + - 'view archive_page revisions' - 'view book revisions' - 'view builder_page revisions' - 'view latest version' @@ -42,5 +45,6 @@ permissions: - 'view person revisions' - 'view the administration theme' - 'view unpublished paragraphs' + - 'view webform revisions' - 'view webform submissions any node' - 'view webform submissions own node' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml index 2138c0bd9..14c7af88f 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.administrator.yml @@ -5,6 +5,7 @@ dependencies: - core.entity_view_display.node.builder_page.default - filter.format.archive - filter.format.block_body + - filter.format.html_code - filter.format.minimal - filter.format.simple - filter.format.standard @@ -31,6 +32,7 @@ dependencies: - entity_usage - external_entities - feeds + - field_css - field_ui - file - file_delete @@ -67,6 +69,7 @@ permissions: - 'access any webform configuration' - 'access content overview' - 'access contextual links' + - 'access css fields' - 'access entity usage statistics' - 'access feed overview' - 'access files overview' @@ -117,6 +120,7 @@ permissions: - 'create cta block content' - 'create file media' - 'create hero block content' + - 'create html_code block content' - 'create icon_links block content' - 'create image media' - 'create logo_cloud block content' @@ -148,6 +152,7 @@ permissions: - 'delete any file' - 'delete any file media' - 'delete any hero block content' + - 'delete any html_code block content' - 'delete any icon_links block content' - 'delete any image media' - 'delete any logo_cloud block content' @@ -236,6 +241,7 @@ permissions: - 'update any content block content' - 'update any cta block content' - 'update any hero block content' + - 'update any html_code block content' - 'update any icon_links block content' - 'update any logo_cloud block content' - 'update any node_include block content' @@ -252,6 +258,7 @@ permissions: - 'use editorial transition unpublish' - 'use text format archive' - 'use text format block_body' + - 'use text format html_code' - 'use text format minimal' - 'use text format simple' - 'use text format standard' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml index 0d8314ff1..5e20fffdd 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.coder.yml @@ -2,11 +2,13 @@ langcode: en status: true dependencies: config: - - filter.format.archive + - filter.format.html_code module: - asset_injector + - block_content_permissions - contextual - feeds + - field_css - field_ui - filter - google_analytics @@ -23,6 +25,7 @@ weight: -5 is_admin: null permissions: - 'access contextual links' + - 'access css fields' - 'access feed overview' - 'access site reports' - 'access taxonomy overview' @@ -40,7 +43,10 @@ permissions: - 'administer taxonomy' - 'administer twig templates' - 'administer views' + - 'create html_code block content' + - 'delete any html_code block content' - 'load twig templates from file system' - 'replicate entities' - - 'use text format archive' + - 'update any html_code block content' + - 'use text format html_code' - 'view the administration theme' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml index 329ad90da..525cf267a 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.editor.yml @@ -90,7 +90,6 @@ permissions: - 'create terms in media_tags' - 'create timeline block content' - 'create unl_directory_entry external entity' - - 'create webform content' - 'delete any accordion block content' - 'delete any card block content' - 'delete any content block content' diff --git a/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml b/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml index 5eda36205..dd5c611db 100644 --- a/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml +++ b/web/modules/custom/features/herbie_roles/config/install/user.role.viewer.yml @@ -7,6 +7,7 @@ dependencies: - node.type.builder_page - node.type.news - node.type.person + - node.type.webform module: - content_moderation - contextual @@ -41,5 +42,6 @@ permissions: - 'view person revisions' - 'view the administration theme' - 'view unpublished paragraphs' + - 'view webform revisions' - 'view webform submissions any node' - 'view webform submissions own node' diff --git a/web/modules/custom/features/herbie_roles/herbie_roles.info.yml b/web/modules/custom/features/herbie_roles/herbie_roles.info.yml index 8ba777f3a..be8ba58b9 100644 --- a/web/modules/custom/features/herbie_roles/herbie_roles.info.yml +++ b/web/modules/custom/features/herbie_roles/herbie_roles.info.yml @@ -51,5 +51,5 @@ dependencies: - 'webform:webform' - 'webform:webform_node' - 'webform:webform_submission_log' -version: 1.3.1 +version: 1.3.2 package: Herbie From 75f5b6c6d711f0aa3b4a414aab102a438de1863f Mon Sep 17 00:00:00 2001 From: Eric Rasmussen Date: Wed, 14 Feb 2024 18:58:21 -0600 Subject: [PATCH 8/8] [#408] Set a more restrictive permission --- .../unl_archive_page_import/unl_archive_page_import.routing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml index d1272b9f5..0fbb7f5d6 100644 --- a/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml +++ b/web/modules/custom/unl_archive_page_import/unl_archive_page_import.routing.yml @@ -4,5 +4,5 @@ unl_archive_page_import.batchimport: _title: 'Transition page import tool' _form: '\Drupal\unl_archive_page_import\Form\ImportForm' requirements: - _permission: 'access content' + _permission: 'create builder page content'