From 7c54101e76623f80df5a8635a118d0f56e2c04a0 Mon Sep 17 00:00:00 2001 From: Md Nadim Hossain Date: Thu, 10 Oct 2024 11:04:02 +1100 Subject: [PATCH 1/3] Feature/sdp 247 secure file media type (#518) * Added secure file type as a submodule. --- composer.json | 4 +- config/install/user.role.approver.yml | 10 +- config/install/user.role.contributor.yml | 18 +++- config/install/user.role.editor.yml | 16 ++- config/install/user.role.site_admin.yml | 16 ++- .../modules/tide_media_secure_files/README.md | 5 + ...form_display.media.secure_file.default.yml | 55 +++++++++++ ...view_display.media.secure_file.default.yml | 26 +++++ ...eld.media.secure_file.field_media_site.yml | 23 +++++ ...ld.media.secure_file.field_secure_file.yml | 26 +++++ .../field.storage.media.field_secure_file.yml | 26 +++++ .../config/install/media.type.secure_file.yml | 12 +++ .../install/pfdp.pfdp_directory.secure.yml | 24 +++++ ....user_add_role_action.secure_file_user.yml | 13 +++ ...er_remove_role_action.secure_file_user.yml | 13 +++ .../install/user.role.secure_file_user.yml | 26 +++++ .../tide_media_secure_files.info.yml | 19 ++++ .../tide_media_secure_files.install | 74 ++++++++++++++ modules/tide_media/src/TideOperation.php | 98 +++++++++++++++++++ modules/tide_media/tide_media.install | 8 ++ modules/tide_media/tide_media.permissions.yml | 6 ++ 21 files changed, 501 insertions(+), 17 deletions(-) create mode 100644 modules/tide_media/modules/tide_media_secure_files/README.md create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_form_display.media.secure_file.default.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_view_display.media.secure_file.default.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_media_site.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_secure_file.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/field.storage.media.field_secure_file.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/media.type.secure_file.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/pfdp.pfdp_directory.secure.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_add_role_action.secure_file_user.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_remove_role_action.secure_file_user.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/config/install/user.role.secure_file_user.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.info.yml create mode 100644 modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.install diff --git a/composer.json b/composer.json index 412b399c3..5976ffb16 100644 --- a/composer.json +++ b/composer.json @@ -78,6 +78,7 @@ "drupal/quick_node_clone": "^1.16", "drupal/content_lock": "^2.3", "drupal/inline_entity_form": "^1.0@RC", + "drupal/private_files_download_permission": "^3.1", "drupal/jquery_ui_touch_punch": "^1.1", "drupal/admin_audit_trail": "^1.0", "drupal/block_inactive_users": "^2.1", @@ -436,8 +437,7 @@ "Support views data export using drush - https://www.drupal.org/project/views_data_export/issues/2887450#comment-15199879": "https://www.drupal.org/files/issues/2023-11-29/vde-drush-with-output-location-2887450-91.patch" }, "drupal/jsonapi_extras": { - "Make max value of page[limit] configurable per entity/bundle - https://www.drupal.org/project/jsonapi_extras/issues/2884292#comment-14794882": "https://www.drupal.org/files/issues/2022-11-21/max_page_limit_configuration-2884292-33.patch", - "Issue #3473990: Fix PHP Fatal error on Declaration of the normalize function must be compatible with normalize function return type after Schemata 8.x-1.0 was released": "https://git.drupalcode.org/project/jsonapi_extras/-/commit/d7ab37658999b5fae74769ade4155ec7310aa468.diff" + "Make max value of page[limit] configurable per entity/bundle - https://www.drupal.org/project/jsonapi_extras/issues/2884292#comment-14794882": "https://www.drupal.org/files/issues/2022-11-21/max_page_limit_configuration-2884292-33.patch" }, "drupal/jsonapi_menu_items": { "Allow filtering of response payload - https://www.drupal.org/project/jsonapi_menu_items/issues/3350524#comment-15577964": "https://www.drupal.org/files/issues/2024-05-02/3350524-filter_fields-6.patch" diff --git a/config/install/user.role.approver.yml b/config/install/user.role.approver.yml index 02d1f24b9..bdb3c74ff 100644 --- a/config/install/user.role.approver.yml +++ b/config/install/user.role.approver.yml @@ -33,15 +33,19 @@ permissions: - 'administer redirects' - 'administer url aliases' - 'break content lock' - - 'create media' + - 'create document media' + - 'create file media' + - 'create image media' - 'create url aliases' - 'delete all revisions' - - 'delete any media' - 'delete media' + - 'edit any audio media' + - 'edit any document media' + - 'edit any file media' + - 'edit any image media' - 'import tablefield' - 'rebuild tablefield' - 'revert all revisions' - - 'update any media' - 'update media' - 'use editorial transition archive' - 'use editorial transition archived_draft' diff --git a/config/install/user.role.contributor.yml b/config/install/user.role.contributor.yml index b68debfa6..250e93651 100644 --- a/config/install/user.role.contributor.yml +++ b/config/install/user.role.contributor.yml @@ -4,6 +4,11 @@ dependencies: config: - filter.format.rich_text - filter.format.summary_text + - media.type.audio + - media.type.document + - media.type.embedded_video + - media.type.file + - media.type.image module: - block - content_moderation @@ -28,16 +33,19 @@ permissions: - 'administer blocks' - 'administer menu' - 'administer url aliases' - - 'create media' + - 'create document media' + - 'create file media' + - 'create image media' - 'create url aliases' - - 'delete all revisions' - - 'delete any media' - - 'delete media' + - 'edit any audio media' + - 'edit any document media' + - 'edit any file media' + - 'edit any image media' - 'enter all revision log entry' + - 'delete media' - 'import tablefield' - 'rebuild tablefield' - 'revert all revisions' - - 'update any media' - 'update media' - 'use editorial transition create_new_draft' - 'use editorial transition needs_review_draft' diff --git a/config/install/user.role.editor.yml b/config/install/user.role.editor.yml index e6ea3dd8a..731cde255 100644 --- a/config/install/user.role.editor.yml +++ b/config/install/user.role.editor.yml @@ -4,6 +4,11 @@ dependencies: config: - filter.format.rich_text - filter.format.summary_text + - media.type.audio + - media.type.document + - media.type.embedded_video + - media.type.file + - media.type.image - workflows.workflow.editorial module: - block @@ -28,15 +33,18 @@ permissions: - 'addrow tablefield' - 'administer menu' - 'administer url aliases' - - 'create media' + - 'create document media' + - 'create file media' + - 'create image media' - 'create url aliases' - - 'delete all revisions' - - 'delete any media' + - 'edit any audio media' + - 'edit any document media' + - 'edit any file media' + - 'edit any image media' - 'delete media' - 'rebuild tablefield' - 'revert all revisions' - 'revert all revisions' - - 'update any media' - 'update media' - 'use editorial transition archive_pending' - 'use editorial transition create_archive_pending' diff --git a/config/install/user.role.site_admin.yml b/config/install/user.role.site_admin.yml index 395917a5f..172555c3f 100644 --- a/config/install/user.role.site_admin.yml +++ b/config/install/user.role.site_admin.yml @@ -5,6 +5,11 @@ dependencies: - filter.format.admin_text - filter.format.rich_text - filter.format.summary_text + - media.type.audio + - media.type.document + - media.type.embedded_video + - media.type.file + - media.type.image - taxonomy.vocabulary.audience - taxonomy.vocabulary.department - taxonomy.vocabulary.location @@ -58,7 +63,9 @@ permissions: - 'create field_business_contact_number' - 'create field_business_name' - 'create field_notes' - - 'create media' + - 'create document media' + - 'create file media' + - 'create image media' - 'create terms in audience' - 'create terms in department' - 'create terms in location' @@ -66,7 +73,11 @@ permissions: - 'create terms in topic' - 'create url aliases' - 'delete all revisions' - - 'delete any media' + - 'delete any audio media' + - 'delete any document media' + - 'delete any embedded_video media' + - 'delete any file media' + - 'delete any image media' - 'delete media' - 'delete terms in audience' - 'delete terms in department' @@ -84,7 +95,6 @@ permissions: - 'import tablefield' - 'rebuild tablefield' - 'revert all revisions' - - 'update any media' - 'update media' - 'use editorial transition archive' - 'use editorial transition archived_draft' diff --git a/modules/tide_media/modules/tide_media_secure_files/README.md b/modules/tide_media/modules/tide_media_secure_files/README.md new file mode 100644 index 000000000..a262842af --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/README.md @@ -0,0 +1,5 @@ +# tide_media_secure_files +Allows author to create secure private files + +## Purpose +- media diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_form_display.media.secure_file.default.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_form_display.media.secure_file.default.yml new file mode 100644 index 000000000..f7463bff1 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_form_display.media.secure_file.default.yml @@ -0,0 +1,55 @@ +langcode: en +status: true +dependencies: + config: + - field.field.media.secure_file.field_media_site + - field.field.media.secure_file.field_secure_file + - media.type.secure_file + module: + - file +id: media.secure_file.default +targetEntityType: media +bundle: secure_file +mode: default +content: + created: + type: datetime_timestamp + weight: 4 + region: content + settings: { } + third_party_settings: { } + field_media_site: + type: options_buttons + weight: 2 + region: content + settings: { } + third_party_settings: { } + field_name: field_media_site + field_secure_file: + type: file_generic + weight: 1 + region: content + settings: + progress_indicator: throbber + third_party_settings: { } + name: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + uid: + type: entity_reference_autocomplete + weight: 3 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } +hidden: + path: true + status: true diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_view_display.media.secure_file.default.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_view_display.media.secure_file.default.yml new file mode 100644 index 000000000..d7bafe9e7 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/core.entity_view_display.media.secure_file.default.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - field.field.media.secure_file.field_secure_file + - media.type.secure_file + module: + - file +id: media.secure_file.default +targetEntityType: media +bundle: secure_file +mode: default +content: + field_secure_file: + type: file_default + label: visually_hidden + settings: + use_description_as_link_text: true + third_party_settings: { } + weight: 0 + region: content +hidden: + created: true + name: true + thumbnail: true + uid: true diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_media_site.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_media_site.yml new file mode 100644 index 000000000..f54162ce1 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_media_site.yml @@ -0,0 +1,23 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.media.field_media_site + - media.type.secure_file + - taxonomy.vocabulary.sites +id: media.secure_file.field_media_site +field_name: field_media_site +entity_type: media +bundle: secure_file +label: Site +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + sites: sites +field_type: entity_reference diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_secure_file.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_secure_file.yml new file mode 100644 index 000000000..d7afcfe04 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/field.field.media.secure_file.field_secure_file.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.media.field_secure_file + - media.type.secure_file + module: + - file +id: media.secure_file.field_secure_file +field_name: field_secure_file +entity_type: media +bundle: secure_file +label: File +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:file' + handler_settings: { } + file_directory: 'secure/[date:custom:Y]-[date:custom:m]' + file_extensions: 'xls xlsx csv xlsm doc docx dotx pdf ppt pptx' + max_filesize: '' + description_field: true +field_type: file diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/field.storage.media.field_secure_file.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/field.storage.media.field_secure_file.yml new file mode 100644 index 000000000..e4aac0e3d --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/field.storage.media.field_secure_file.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + module: + - field_permissions + - file + - media +third_party_settings: + field_permissions: + permission_type: custom +id: media.field_secure_file +field_name: field_secure_file +entity_type: media +type: file +settings: + target_type: file + display_field: false + display_default: false + uri_scheme: private +module: file +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/media.type.secure_file.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/media.type.secure_file.yml new file mode 100644 index 000000000..fb3449fbc --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/media.type.secure_file.yml @@ -0,0 +1,12 @@ +langcode: en +status: true +dependencies: { } +id: secure_file +label: 'Secure File' +description: '' +source: file +queue_thumbnail_downloads: false +new_revision: false +source_configuration: + source_field: field_secure_file +field_map: { } diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/pfdp.pfdp_directory.secure.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/pfdp.pfdp_directory.secure.yml new file mode 100644 index 000000000..e76428dbd --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/pfdp.pfdp_directory.secure.yml @@ -0,0 +1,24 @@ +langcode: en +status: true +dependencies: { } +id: secure +path: /secure +bypass: false +grant_file_owners: false +users: { } +roles: + administrator: administrator + secure_file_user: secure_file_user + site_admin: '0' + approver: '0' + editor: '0' + contributor: '0' + previewer: '0' + anonymous: '0' + authenticated: '0' + grant_author: '0' + html_editor: '0' + emergency_recovery_resource: '0' + data_importer: '0' + site_auditor: '0' + jobs_editor: '0' diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_add_role_action.secure_file_user.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_add_role_action.secure_file_user.yml new file mode 100644 index 000000000..c5985f60d --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_add_role_action.secure_file_user.yml @@ -0,0 +1,13 @@ +langcode: en +status: true +dependencies: + config: + - user.role.secure_file_user + module: + - user +id: user_add_role_action.secure_file_user +label: 'Add the Secure File User role to the selected user(s)' +type: user +plugin: user_add_role_action +configuration: + rid: secure_file_user diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_remove_role_action.secure_file_user.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_remove_role_action.secure_file_user.yml new file mode 100644 index 000000000..e82405631 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/system.action.user_remove_role_action.secure_file_user.yml @@ -0,0 +1,13 @@ +langcode: en +status: true +dependencies: + config: + - user.role.secure_file_user + module: + - user +id: user_remove_role_action.secure_file_user +label: 'Remove the Secure File User role from the selected user(s)' +type: user +plugin: user_remove_role_action +configuration: + rid: secure_file_user diff --git a/modules/tide_media/modules/tide_media_secure_files/config/install/user.role.secure_file_user.yml b/modules/tide_media/modules/tide_media_secure_files/config/install/user.role.secure_file_user.yml new file mode 100644 index 000000000..7436e00ff --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/config/install/user.role.secure_file_user.yml @@ -0,0 +1,26 @@ +langcode: en +status: true +dependencies: + config: + - media.type.secure_file + module: + - field_permissions + - media +id: secure_file_user +label: 'Secure File User' +weight: 102 +is_admin: null +permissions: + - 'create field_secure_file' + - 'create secure_file media' + - 'delete any secure_file media' + - 'delete any secure_file media revisions' + - 'delete own secure_file media' + - 'edit any secure_file media' + - 'edit field_secure_file' + - 'edit own field_secure_file' + - 'edit own secure_file media' + - 'revert any secure_file media revisions' + - 'view any secure_file media revisions' + - 'view field_secure_file' + - 'view own field_secure_file' diff --git a/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.info.yml b/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.info.yml new file mode 100644 index 000000000..2ae618b32 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.info.yml @@ -0,0 +1,19 @@ +name: 'Tide Media Secure Files' +description: 'Gives the author option to create secure files.' +type: module +package: Tide +core_version_requirement: ^9 || ^10 +dependencies: + - dpc-sdp:tide_core + - dpc-sdp:tide_media + - pfdp:pfdp +config_devel: + install: + - core.entity_form_display.media.secure_file.default + - core.entity_view_display.media.secure_file.default + - field.field.media.secure_file.field_secure_file + - field.storage.media.field_secure_file + - media.type.secure_file + - pfdp.pfdp_directory.secure + - user.role.dtf_secure_file_user + optional: { } diff --git a/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.install b/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.install new file mode 100644 index 000000000..ccf9536a8 --- /dev/null +++ b/modules/tide_media/modules/tide_media_secure_files/tide_media_secure_files.install @@ -0,0 +1,74 @@ +getEditable('pfdp.pfdp_directory.secure')->delete(); + + $secure_file_media_type = 'secure_file'; + $ids = \Drupal::entityQuery('media') + ->condition('bundle', $secure_file_media_type) + ->accessCheck(FALSE) + ->execute(); + $storageHandler = \Drupal::entityTypeManager()->getStorage('media'); + $entities = $storageHandler->loadMultiple($ids); + if ($entities) { + foreach ($entities as $entity) { + $entity->delete(); + } + } + + $media_type = \Drupal::entityTypeManager() + ->getStorage('media_type') + ->load($secure_file_media_type); + if ($media_type) { + $media_type->delete(); + } + + $secure_file_user_role = 'secure_file_user'; + $secure_file_users = \Drupal::entityTypeManager()->getStorage('user')->loadByProperties(['roles' => 'secure_file_user']); + if ($secure_file_users) { + foreach ($secure_file_users as $user) { + $user->removeRole($secure_file_user_role); + $user->save(); + } + } + + $role = Role::load($secure_file_user_role); + if ($role) { + $role->delete(); + } + + drupal_flush_all_caches(); + + \Drupal::service('module_installer')->uninstall(['pfdp']); +} + +/** + * Implements hook_install(). + */ +function tide_media_secure_files_install() { + if (!\Drupal::moduleHandler()->moduleExists('pfdp')) { + /** @var \Drupal\Core\Extension\ModuleInstallerInterface $module_installer */ + $module_installer = \Drupal::service('module_installer'); + $module_installer->install(['pfdp']); + } + // Add 'view field_secure_file' permission. + // To the 'anonymous' and 'authenticated' roles. + $roles = ['anonymous', 'authenticated']; + + foreach ($roles as $role_name) { + $role = Role::load($role_name); + if ($role) { + user_role_grant_permissions($role->id(), ['view field_secure_file']); + } + } +} diff --git a/modules/tide_media/src/TideOperation.php b/modules/tide_media/src/TideOperation.php index e11c5c71d..d56768fcb 100644 --- a/modules/tide_media/src/TideOperation.php +++ b/modules/tide_media/src/TideOperation.php @@ -142,4 +142,102 @@ public static function createLicenseTypeTerms() { } } + /** + * Add media type permissions. + */ + public static function addMediaTypePermissions() { + // Define permissions to be added and removed for each role. + $role_permissions_add = [ + 'approver' => [ + 'create document media', + 'create embedded_video media', + 'create file media', + 'create image media', + 'edit any audio media', + 'edit any document media', + 'edit any embedded_video media', + 'edit any file media', + 'edit any image media', + ], + 'contributor' => [ + 'create document media', + 'create embedded_video media', + 'create file media', + 'create image media', + 'edit any audio media', + 'edit any document media', + 'edit any embedded_video media', + 'edit any file media', + 'edit any image media', + ], + 'editor' => [ + 'create document media', + 'create embedded_video media', + 'create file media', + 'create image media', + 'edit any audio media', + 'edit any document media', + 'edit any embedded_video media', + 'edit any file media', + 'edit any image media', + ], + 'site_admin' => [ + 'create document media', + 'create embedded_video media', + 'create file media', + 'create image media', + 'delete any audio media', + 'delete any document media', + 'delete any embedded_video media', + 'delete any file media', + 'delete any image media', + 'delete own audio media', + 'delete own document media', + 'delete own embedded_video media', + 'delete own file media', + 'delete own image media', + 'edit any audio media', + 'edit any document media', + 'edit any embedded_video media', + 'edit any file media', + 'edit any image media', + ], + ]; + + $role_permissions_remove = [ + 'approver' => [ + 'create media', + 'delete any media', + 'update any media', + ], + 'contributor' => [ + 'create media', + 'update any media', + ], + 'editor' => [ + 'create media', + 'update any media', + ], + 'site_admin' => [ + 'create media', + 'delete any media', + 'update any media', + ], + ]; + + // Grant the permissions. + foreach ($role_permissions_add as $role => $permissions) { + if ($role_object = Role::load($role)) { + user_role_grant_permissions($role_object->id(), $permissions); + } + } + + // Revoke the permissions. + foreach ($role_permissions_remove as $role => $permissions) { + if ($role_object = Role::load($role)) { + user_role_revoke_permissions($role_object->id(), $permissions); + } + } + } + } diff --git a/modules/tide_media/tide_media.install b/modules/tide_media/tide_media.install index ed59aa1bf..d703334ff 100644 --- a/modules/tide_media/tide_media.install +++ b/modules/tide_media/tide_media.install @@ -16,6 +16,7 @@ function tide_media_install() { TideOperation::entityUsageDefaultSettings(); TideOperation::assignNecessaryPermissions(); TideOperation::createLicenseTypeTerms(); + TideOperation::addMediaTypePermissions(); } @@ -60,3 +61,10 @@ function tide_media_update_10003() { $config = $config_factory->getEditable('embed.button.tide_media'); $config->set('icon', [])->save(); } + +/** + * Update media permissions. + */ +function tide_media_update_10004() { + TideOperation::addMediaTypePermissions(); +} diff --git a/modules/tide_media/tide_media.permissions.yml b/modules/tide_media/tide_media.permissions.yml index 9c3edd77f..c4c410da6 100644 --- a/modules/tide_media/tide_media.permissions.yml +++ b/modules/tide_media/tide_media.permissions.yml @@ -13,3 +13,9 @@ 'access tide_media_browser_iframe entity browser pages': title: 'Access tide_media_browser_iframe entity browser pages' description: 'Allow user to access tide_media_browser_iframe entity browser pages' +'create embedded_video media': + title: 'Create embedded_video media' + description: 'Allow user to create embedded_video media' +'edit any embedded_video media': + title: 'Edit embedded_video media' + description: 'Allow user to Edit embedded_video media' From 39b00706920f0d133005ced8f29083adf1e7129b Mon Sep 17 00:00:00 2001 From: Md Nadim Hossain Date: Thu, 10 Oct 2024 12:24:58 +1100 Subject: [PATCH 2/3] Added code clean up and remove tfa enable with hook. (#520) --- .../tide_landing_page/tide_landing_page.module | 5 ----- tide_core.install | 15 +-------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/modules/tide_landing_page/tide_landing_page.module b/modules/tide_landing_page/tide_landing_page.module index 5dee1ecfc..1cd98a751 100644 --- a/modules/tide_landing_page/tide_landing_page.module +++ b/modules/tide_landing_page/tide_landing_page.module @@ -109,11 +109,6 @@ function tide_landing_page_form_node_form_alter(&$form, FormStateInterface $form } } - // Adding custom states from webform js. - if (\Drupal::moduleHandler()->moduleExists('webform')) { - $form['#attached']['library'][] = 'webform/webform.states'; - } - // Hide the field Show Acknowledgement to Country if tide_site is missing. if (!\Drupal::moduleHandler()->moduleExists('tide_site')) { $form['field_show_ack_of_country']['#attributes']['class'][] = 'hidden'; diff --git a/tide_core.install b/tide_core.install index 15ecc8d6b..55f9d9706 100644 --- a/tide_core.install +++ b/tide_core.install @@ -54,9 +54,6 @@ function tide_core_install() { // Changes the diff modules general_settings.revision_pager_limit to 16. $tideCoreOperation->changeDiffSettings(); - - // Enable Tide TFA. - $tideCoreOperation->enabledTideTfa(); } /** @@ -227,20 +224,10 @@ function _tide_core_replace_attribute_in_tag($array, $tagName, $attribute, $newA return $array; } -/** - * Enable Tide TFA. - */ -function tide_core_update_10007() { - $tideCoreOperation = new TideCoreOperation(); - - // Enable Tide TFA. - $tideCoreOperation->enabledTideTfa(); -} - /** * Installs tide_times sensor. */ -function tide_core_update_10008() { +function tide_core_update_10007() { \Drupal::moduleHandler()->loadInclude('tide_core', 'inc', 'includes/helpers'); $config_location = [\Drupal::service('extension.list.module')->getPath('tide_core') . '/config/install']; $config_read = _tide_read_config('monitoring.sensor_config.tide_times', $config_location, TRUE); From 7aa5c30159a976336ea2cb7cefa166f787eefba5 Mon Sep 17 00:00:00 2001 From: vincent-gao Date: Thu, 10 Oct 2024 13:23:49 +1100 Subject: [PATCH 3/3] [SD-197] Enable reusable paragraph type (#519) Updates 1. add configMergeDeep function to TideEntityUpdateHelper 2. add icon to reusable paragraph 3. update to display sites and departments to reusable paragraph 4. add reusable paragraph to landing_page , publication and publication page content type Update 1. update dependencies 2. restructures update hooks. updates 1. move basic_text paragraph type to tide_core 2. update paragraphs_libraries to only have accordion and basic_text options 3. update permissions. --- ...m_display.paragraph.basic_text.default.yml | 0 ...agraph.basic_text.field_paragraph_body.yml | 0 ...ragraphs_library_item.field_department.yml | 29 + ...tem.paragraphs_library_item.field_site.yml | 29 + ...ragraphs_library_item.field_department.yml | 19 + ...age.paragraphs_library_item.field_site.yml | 19 + .../paragraphs.paragraphs_type.basic_text.yml | 0 config/install/user.role.approver.yml | 6 + config/install/user.role.contributor.yml | 7 + config/install/user.role.editor.yml | 7 + config/install/user.role.site_admin.yml | 6 + ...y_item.paragraphs_library_item.default.yml | 71 ++ ...aragraphs.paragraphs_type.from_library.yml | 17 + .../views.view.paragraphs_library.yml | 1130 +++++++++++++++++ .../views.view.paragraphs_library_browser.yml | 931 ++++++++++++++ ...ding_page.field_landing_page_component.yml | 5 + ...tem.paragraphs_library_item.paragraphs.yml | 166 +++ .../tide_landing_page.install | 18 + modules/tide_media/src/TideOperation.php | 1 + modules/tide_media/tide_media.info.yml | 1 + modules/tide_media/tide_media.install | 13 + ...blication.field_landing_page_component.yml | 5 + ...tion_page.field_landing_page_component.yml | 5 + .../tide_publication.info.yml | 2 +- .../tide_publication/tide_publication.install | 14 + modules/tide_site/tide_site.info.yml | 2 + src/TideCoreOperation.php | 27 + src/TideEntityUpdateHelper.php | 183 ++- tide_core.info.yml | 1 + tide_core.install | 56 + tide_core.services.yml | 10 +- 31 files changed, 2767 insertions(+), 13 deletions(-) rename {modules/tide_landing_page/config => config}/install/core.entity_form_display.paragraph.basic_text.default.yml (100%) rename {modules/tide_landing_page/config => config}/install/field.field.paragraph.basic_text.field_paragraph_body.yml (100%) create mode 100644 config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_department.yml create mode 100644 config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_site.yml create mode 100644 config/install/field.storage.paragraphs_library_item.field_department.yml create mode 100644 config/install/field.storage.paragraphs_library_item.field_site.yml rename {modules/tide_landing_page/config => config}/install/paragraphs.paragraphs_type.basic_text.yml (100%) create mode 100644 config/optional/core.entity_form_display.paragraphs_library_item.paragraphs_library_item.default.yml create mode 100644 config/optional/paragraphs.paragraphs_type.from_library.yml create mode 100644 config/optional/views.view.paragraphs_library.yml create mode 100644 config/optional/views.view.paragraphs_library_browser.yml create mode 100644 modules/tide_landing_page/config/optional/core.base_field_override.paragraphs_library_item.paragraphs_library_item.paragraphs.yml diff --git a/modules/tide_landing_page/config/install/core.entity_form_display.paragraph.basic_text.default.yml b/config/install/core.entity_form_display.paragraph.basic_text.default.yml similarity index 100% rename from modules/tide_landing_page/config/install/core.entity_form_display.paragraph.basic_text.default.yml rename to config/install/core.entity_form_display.paragraph.basic_text.default.yml diff --git a/modules/tide_landing_page/config/install/field.field.paragraph.basic_text.field_paragraph_body.yml b/config/install/field.field.paragraph.basic_text.field_paragraph_body.yml similarity index 100% rename from modules/tide_landing_page/config/install/field.field.paragraph.basic_text.field_paragraph_body.yml rename to config/install/field.field.paragraph.basic_text.field_paragraph_body.yml diff --git a/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_department.yml b/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_department.yml new file mode 100644 index 000000000..01891cd83 --- /dev/null +++ b/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_department.yml @@ -0,0 +1,29 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.paragraphs_library_item.field_department + - taxonomy.vocabulary.department + module: + - paragraphs_library +id: paragraphs_library_item.paragraphs_library_item.field_department +field_name: field_department +entity_type: paragraphs_library_item +bundle: paragraphs_library_item +label: Department +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + department: department + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_site.yml b/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_site.yml new file mode 100644 index 000000000..66b001be7 --- /dev/null +++ b/config/install/field.field.paragraphs_library_item.paragraphs_library_item.field_site.yml @@ -0,0 +1,29 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.paragraphs_library_item.field_site + - taxonomy.vocabulary.sites + module: + - paragraphs_library +id: paragraphs_library_item.paragraphs_library_item.field_site +field_name: field_site +entity_type: paragraphs_library_item +bundle: paragraphs_library_item +label: Site +description: '' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: + handler: 'default:taxonomy_term' + handler_settings: + target_bundles: + sites: sites + sort: + field: name + direction: asc + auto_create: false + auto_create_bundle: '' +field_type: entity_reference diff --git a/config/install/field.storage.paragraphs_library_item.field_department.yml b/config/install/field.storage.paragraphs_library_item.field_department.yml new file mode 100644 index 000000000..56cf4b1d4 --- /dev/null +++ b/config/install/field.storage.paragraphs_library_item.field_department.yml @@ -0,0 +1,19 @@ +langcode: en +status: true +dependencies: + module: + - paragraphs_library + - taxonomy +id: paragraphs_library_item.field_department +field_name: field_department +entity_type: paragraphs_library_item +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/config/install/field.storage.paragraphs_library_item.field_site.yml b/config/install/field.storage.paragraphs_library_item.field_site.yml new file mode 100644 index 000000000..c747fca70 --- /dev/null +++ b/config/install/field.storage.paragraphs_library_item.field_site.yml @@ -0,0 +1,19 @@ +langcode: en +status: true +dependencies: + module: + - paragraphs_library + - taxonomy +id: paragraphs_library_item.field_site +field_name: field_site +entity_type: paragraphs_library_item +type: entity_reference +settings: + target_type: taxonomy_term +module: core +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/modules/tide_landing_page/config/install/paragraphs.paragraphs_type.basic_text.yml b/config/install/paragraphs.paragraphs_type.basic_text.yml similarity index 100% rename from modules/tide_landing_page/config/install/paragraphs.paragraphs_type.basic_text.yml rename to config/install/paragraphs.paragraphs_type.basic_text.yml diff --git a/config/install/user.role.approver.yml b/config/install/user.role.approver.yml index bdb3c74ff..891698aa3 100644 --- a/config/install/user.role.approver.yml +++ b/config/install/user.role.approver.yml @@ -2,6 +2,7 @@ langcode: en status: true dependencies: config: + - entity_browser.browser.paragraphs_library_items - filter.format.admin_text - filter.format.rich_text - filter.format.summary_text @@ -9,6 +10,7 @@ dependencies: - block - content_lock - content_moderation + - entity_browser - filter - media - node @@ -16,6 +18,7 @@ dependencies: - redirect - scheduled_transitions - system + - paragraphs_library - tide_core - toolbar id: approver @@ -26,6 +29,7 @@ permissions: - 'access administration pages' - 'access content overview' - 'access media overview' + - 'access paragraphs_library_items entity browser pages' - 'access toolbar' - 'administer blocks' - 'addrow tablefield' @@ -37,6 +41,8 @@ permissions: - 'create file media' - 'create image media' - 'create url aliases' + - 'create paragraph library item' + - 'edit paragraph library item' - 'delete all revisions' - 'delete media' - 'edit any audio media' diff --git a/config/install/user.role.contributor.yml b/config/install/user.role.contributor.yml index 250e93651..7f667d241 100644 --- a/config/install/user.role.contributor.yml +++ b/config/install/user.role.contributor.yml @@ -2,6 +2,7 @@ langcode: en status: true dependencies: config: + - entity_browser.browser.paragraphs_library_items - filter.format.rich_text - filter.format.summary_text - media.type.audio @@ -14,9 +15,11 @@ dependencies: - content_moderation - filter - media + - entity_browser - node - override_node_options - system + - paragraphs_library - tablefield - tide_core - toolbar @@ -27,6 +30,7 @@ is_admin: null permissions: - 'access administration pages' - 'access content overview' + - 'access paragraphs_library_items entity browser pages' - 'access media overview' - 'access toolbar' - 'addrow tablefield' @@ -36,6 +40,9 @@ permissions: - 'create document media' - 'create file media' - 'create image media' + - 'create paragraph library item' + - 'edit paragraph library item' + - 'create media' - 'create url aliases' - 'edit any audio media' - 'edit any document media' diff --git a/config/install/user.role.editor.yml b/config/install/user.role.editor.yml index 731cde255..b9120abc2 100644 --- a/config/install/user.role.editor.yml +++ b/config/install/user.role.editor.yml @@ -2,6 +2,7 @@ langcode: en status: true dependencies: config: + - entity_browser.browser.paragraphs_library_items - filter.format.rich_text - filter.format.summary_text - media.type.audio @@ -12,9 +13,11 @@ dependencies: - workflows.workflow.editorial module: - block + - paragraphs_library - content_moderation - filter - media + - entity_browser - node - path - system @@ -26,6 +29,8 @@ weight: 4 is_admin: null permissions: - 'access administration pages' + - 'access paragraphs_library_items entity browser pages' + - 'edit paragraph library item' - 'access content overview' - 'access media overview' - 'access toolbar' @@ -36,6 +41,8 @@ permissions: - 'create document media' - 'create file media' - 'create image media' + - 'create paragraph library item' + - 'create media' - 'create url aliases' - 'edit any audio media' - 'edit any document media' diff --git a/config/install/user.role.site_admin.yml b/config/install/user.role.site_admin.yml index 172555c3f..e35916f5d 100644 --- a/config/install/user.role.site_admin.yml +++ b/config/install/user.role.site_admin.yml @@ -2,6 +2,7 @@ langcode: en status: true dependencies: config: + - entity_browser.browser.paragraphs_library_items - filter.format.admin_text - filter.format.rich_text - filter.format.summary_text @@ -20,6 +21,8 @@ dependencies: - admin_audit_trail - block - content_moderation + - entity_browser + - paragraphs_library - file - filter - media @@ -40,8 +43,11 @@ permissions: - 'access admin audit trail' - 'access administration pages' - 'access content overview' + - 'access paragraphs_library_items entity browser pages' - 'access files overview' + - 'create paragraph library item' - 'access media overview' + - 'edit paragraph library item' - 'access taxonomy overview' - 'access toolbar' - 'administer blocks' diff --git a/config/optional/core.entity_form_display.paragraphs_library_item.paragraphs_library_item.default.yml b/config/optional/core.entity_form_display.paragraphs_library_item.paragraphs_library_item.default.yml new file mode 100644 index 000000000..ad7216d75 --- /dev/null +++ b/config/optional/core.entity_form_display.paragraphs_library_item.paragraphs_library_item.default.yml @@ -0,0 +1,71 @@ +langcode: en +status: true +dependencies: + config: + - field.field.paragraphs_library_item.paragraphs_library_item.field_department + - field.field.paragraphs_library_item.paragraphs_library_item.field_site + module: + - paragraphs + - paragraphs_library +id: paragraphs_library_item.paragraphs_library_item.default +targetEntityType: paragraphs_library_item +bundle: paragraphs_library_item +mode: default +content: + field_department: + type: entity_reference_autocomplete + weight: 2 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } + field_site: + type: entity_reference_autocomplete + weight: 3 + region: content + settings: + match_operator: CONTAINS + match_limit: 10 + size: 60 + placeholder: '' + third_party_settings: { } + label: + type: string_textfield + weight: 0 + region: content + settings: + size: 60 + placeholder: '' + third_party_settings: { } + paragraphs: + type: paragraphs + weight: 1 + region: content + settings: + title: Paragraph + title_plural: Paragraphs + edit_mode: open + closed_mode: summary + autocollapse: none + closed_mode_threshold: 0 + add_mode: dropdown + form_display_mode: default + default_paragraph_type: '' + default_paragraph_count: 1 + features: + collapse_edit_all: collapse_edit_all + duplicate: duplicate + third_party_settings: { } + status: + type: boolean_checkbox + weight: 4 + region: content + settings: + display_label: true + third_party_settings: { } +hidden: + created: true + uid: true diff --git a/config/optional/paragraphs.paragraphs_type.from_library.yml b/config/optional/paragraphs.paragraphs_type.from_library.yml new file mode 100644 index 000000000..85a269fc7 --- /dev/null +++ b/config/optional/paragraphs.paragraphs_type.from_library.yml @@ -0,0 +1,17 @@ +uuid: 65901f51-c5e6-44eb-b4ad-56191dce90cc +langcode: en +status: true +dependencies: + content: + - 'file:file:b6a014c0-da0b-43ae-b2f9-19c6cf5a9902' + enforced: + module: + - paragraphs_library +_core: + default_config_hash: RGSkW7xbQQkzNrGunBWMSKS6lacu7KsgZjVWGVUF0xY +id: from_library +label: 'Reusable content item' +icon_uuid: b6a014c0-da0b-43ae-b2f9-19c6cf5a9902 +icon_default: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjgiIGhlaWdodD0iNzciIHZpZXdCb3g9IjAgMCA2OCA3NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE0MzdfNjc5KSI+CjxyZWN0IHdpZHRoPSI2OCIgaGVpZ2h0PSI3NyIgZmlsbD0id2hpdGUiLz4KPHJlY3QgeD0iMjEiIHk9IjQxIiB3aWR0aD0iMzEiIGhlaWdodD0iMyIgZmlsbD0iI0M0QzRDNCIvPgo8cmVjdCB4PSIyMSIgeT0iNDciIHdpZHRoPSIyNSIgaGVpZ2h0PSIzIiBmaWxsPSIjQzRDNEM0Ii8+CjxyZWN0IHg9IjIxIiB5PSIzNSIgd2lkdGg9IjI4IiBoZWlnaHQ9IjMiIGZpbGw9IiNDNEM0QzQiLz4KPHJlY3QgeD0iMjEiIHk9IjI2IiB3aWR0aD0iMTkiIGhlaWdodD0iNiIgZmlsbD0iI0ExQTFBMSIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDFfMTQzN182NzkpIj4KPHBhdGggZD0iTTE3LjA4ODQgMjAuMjMzN0MyNS4xMTE3IDExLjkyNTMgMzcuNDM5NCA5Ljk1NjI3IDQ3LjU3MjggMTUuMTY4NEwzOC43MTk1IDE3LjY1NjdMMzkuMjkyNCAxOS42ODM1TDUxLjQzMjIgMTYuMjY3OUw0Ny4xNDQ2IDQuNDEyMDNMNDUuMTYyNyA1LjEyNTU1TDQ4LjAyMzUgMTMuMDMxOEMzNy4xNjcgNy43MTkxNSAyNC4xMTUxIDkuOTM0MjQgMTUuNTc3OCAxOC43NzQ5QzUuOTk4NDEgMjguNjk0NiA1LjA5ODc2IDQ0LjQxMDUgMTMuNTAwMSA1NS4zMzE3TDE1LjE2OCA1NC4wNTA5QzcuNDAzMzYgNDMuOTUzIDguMjM4NjcgMjkuNDEyMiAxNy4wOTU2IDIwLjI0MDdMMTcuMDg4NCAyMC4yMzM3WiIgZmlsbD0iI0M0QzRDNCIvPgo8cGF0aCBkPSJNNTUuOTMyNyA1Ny43NDUyQzY1LjUxMjEgNDcuODI1NSA2Ni40MTE3IDMyLjEwOTcgNTguMDEwMyAyMS4xODg0TDU2LjM0MjUgMjIuNDY5M0M2NC4xMDcxIDMyLjU2NzIgNjMuMjcxOCA0Ny4xMDc5IDU0LjQxNDkgNTYuMjc5NUM0Ni4zOTE2IDY0LjU4NzkgMzQuMDYzOSA2Ni41NTcgMjMuOTMwNSA2MS4zNDQ5TDMyLjc4MzggNTguODU2NUwzMi4yMTA5IDU2LjgyOTdMMjAuMDcxMSA2MC4yNDUzTDI0LjM1MTcgNzIuMTA4NEwyNi4zMzM2IDcxLjM5NDlMMjMuNDcyOSA2My40ODg2QzM0LjMyOTQgNjguODAxMyA0Ny4zODEzIDY2LjU4NjIgNTUuOTE4NiA1Ny43NDU1TDU1LjkzMjcgNTcuNzQ1MloiIGZpbGw9IiNDNEM0QzQiLz4KPC9nPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzE0MzdfNjc5Ij4KPHJlY3Qgd2lkdGg9IjY4IiBoZWlnaHQ9Ijc3IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8Y2xpcFBhdGggaWQ9ImNsaXAxXzE0MzdfNjc5Ij4KPHJlY3Qgd2lkdGg9IjU2LjEiIGhlaWdodD0iNjQuNTIiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzNy45ODc0IC00LjQzMDk3KSByb3RhdGUoNDQpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==' +description: 'Embed an existing reusable content item. ' +behavior_plugins: { } diff --git a/config/optional/views.view.paragraphs_library.yml b/config/optional/views.view.paragraphs_library.yml new file mode 100644 index 000000000..8f6e1d948 --- /dev/null +++ b/config/optional/views.view.paragraphs_library.yml @@ -0,0 +1,1130 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.paragraphs_library_item.field_department + - field.storage.paragraphs_library_item.field_site + - paragraphs.paragraphs_type.accordion + - paragraphs.paragraphs_type.basic_text + - taxonomy.vocabulary.department + - taxonomy.vocabulary.sites + module: + - entity_usage + - paragraphs + - paragraphs_library + - taxonomy + - user +id: paragraphs_library +label: 'Paragraphs library' +module: views +description: '' +tag: '' +base_table: paragraphs_library_item_field_data +base_field: id +display: + default: + id: default + display_title: Master + display_plugin: default + position: 0 + display_options: + title: 'Paragraphs library' + fields: + label: + id: label + table: paragraphs_library_item_field_data + field: label + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: label + plugin_id: field + label: Label + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: true + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + type: + id: type + table: paragraphs_item_field_data + field: type + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: type + plugin_id: field + label: Type + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + paragraphs__target_id: + id: paragraphs__target_id + table: paragraphs_library_item_field_data + field: paragraphs__target_id + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: paragraphs + plugin_id: field + label: Paragraphs + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: paragraph_summary + settings: { } + group_column: entity_id + group_columns: + target_id: target_id + target_revision_id: target_revision_id + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + langcode: + id: langcode + table: paragraphs_library_item_field_data + field: langcode + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: langcode + plugin_id: field + label: Language + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: language + settings: + link_to_entity: false + native_language: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + id: + id: id + table: paragraphs_library_item_field_data + field: id + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: id + plugin_id: field + label: ID + exclude: true + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: number_integer + settings: + thousand_separator: '' + prefix_suffix: true + group_column: entity_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + count: + id: count + table: entity_usage + field: count + relationship: paragraphs_library_item_to_usage_entity + group_type: count + admin_label: '' + plugin_id: numeric + label: Used + exclude: false + alter: + alter_text: false + text: '' + make_link: true + path: 'admin/content/entity-usage/paragraphs_library_item/{{ id }}' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + set_precision: false + precision: 0 + decimal: . + separator: ',' + format_plural: false + format_plural_string: !!binary MSBwbGFjZQNAY291bnQgcGxhY2Vz + prefix: '' + suffix: '' + changed: + id: changed + table: paragraphs_library_item_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: changed + plugin_id: field + label: Changed + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: short + custom_date_format: '' + timezone: '' + tooltip: + date_format: '' + custom_date_format: '' + time_diff: + enabled: false + future_format: '@interval hence' + past_format: '@interval ago' + granularity: 2 + refresh: 60 + group_column: entity_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + operations: + id: operations + table: paragraphs_library_item + field: operations + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + plugin_id: entity_operations + label: Operations + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + destination: true + field_department: + id: field_department + table: paragraphs_library_item__field_department + field: field_department + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Department + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_site: + id: field_site + table: paragraphs_library_item__field_site + field: field_site + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Site + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + pager: + type: mini + options: + offset: 0 + pagination_heading_level: h4 + items_per_page: 50 + total_pages: null + id: 0 + tags: + next: ›› + previous: ‹‹ + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + exposed_form: + type: basic + options: + submit_button: Filter + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + access: + type: perm + options: + perm: 'access content overview' + cache: + type: tag + options: { } + empty: + area_text_custom: + id: area_text_custom + table: views + field: area_text_custom + relationship: none + group_type: group + admin_label: '' + plugin_id: text_custom + empty: true + content: 'No library items available.' + tokenize: false + sorts: { } + arguments: { } + filters: + label: + id: label + table: paragraphs_library_item_field_data + field: label + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: label + plugin_id: string + operator: contains + value: '' + group: 1 + exposed: true + expose: + operator_id: label_op + label: Label + description: '' + use_operator: false + operator: label_op + identifier: label + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + is_grouped: false + group_info: + label: Label + description: null + identifier: label + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: + 1: { } + 2: { } + 3: { } + type: + id: type + table: paragraphs_item_field_data + field: type + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: type + plugin_id: bundle + operator: in + value: + accordion: accordion + basic_text: basic_text + group: 1 + exposed: true + expose: + operator_id: type_op + label: Type + description: '' + use_operator: false + operator: type_op + operator_limit_selection: false + operator_list: { } + identifier: type + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + approver: '0' + site_admin: '0' + editor: '0' + previewer: '0' + contributor: '0' + site_auditor: '0' + reduce: true + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + default_langcode: + id: default_langcode + table: paragraphs_library_item_field_data + field: default_langcode + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: default_langcode + plugin_id: boolean + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + default_langcode_1: + id: default_langcode_1 + table: paragraphs_item_field_data + field: default_langcode + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: default_langcode + plugin_id: boolean + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + field_site_target_id: + id: field_site_target_id + table: paragraphs_library_item__field_site + field: field_site_target_id + relationship: none + group_type: group + admin_label: '' + plugin_id: taxonomy_index_tid + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: field_site_target_id_op + label: Site + description: '' + use_operator: false + operator: field_site_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_site_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + administrator: '0' + site_admin: '0' + approver: '0' + editor: '0' + contributor: '0' + previewer: '0' + anonymous: '0' + grant_author: '0' + html_editor: '0' + emergency_recovery_resource: '0' + data_importer: '0' + site_auditor: '0' + jobs_editor: '0' + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: false + vid: sites + type: select + hierarchy: false + limit: true + error_message: true + field_department_target_id: + id: field_department_target_id + table: paragraphs_library_item__field_department + field: field_department_target_id + relationship: none + group_type: group + admin_label: '' + plugin_id: taxonomy_index_tid + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: field_department_target_id_op + label: Department + description: '' + use_operator: false + operator: field_department_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_department_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + administrator: '0' + site_admin: '0' + approver: '0' + editor: '0' + contributor: '0' + previewer: '0' + anonymous: '0' + grant_author: '0' + html_editor: '0' + emergency_recovery_resource: '0' + data_importer: '0' + site_auditor: '0' + jobs_editor: '0' + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: false + vid: department + type: select + hierarchy: false + limit: true + error_message: true + filter_groups: + operator: AND + groups: + 1: AND + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + columns: + label: label + type: type + id: id + count: count + operations: operations + default: '-1' + info: + label: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + type: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + id: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + count: + sortable: false + default_sort_order: asc + align: views-align-right + separator: '' + empty_column: false + responsive: '' + operations: + align: '' + separator: '' + empty_column: false + responsive: '' + override: true + sticky: false + summary: '' + empty_table: true + caption: '' + description: '' + row: + type: fields + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + relationships: + paragraphs__target_id: + id: paragraphs__target_id + table: paragraphs_library_item_field_data + field: paragraphs__target_id + relationship: none + group_type: group + admin_label: Paragraphs + entity_type: paragraphs_library_item + entity_field: paragraphs + plugin_id: standard + required: true + paragraphs_library_item_to_usage_entity: + id: paragraphs_library_item_to_usage_entity + table: paragraphs_library_item + field: paragraphs_library_item_to_usage_entity + relationship: none + group_type: group + admin_label: 'Usage information (Paragraphs library item)' + entity_type: paragraphs_library_item + plugin_id: standard + required: false + group_by: true + header: { } + footer: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - user.permissions + tags: + - 'config:field.storage.paragraphs_library_item.field_department' + - 'config:field.storage.paragraphs_library_item.field_site' + page_1: + id: page_1 + display_title: Page + display_plugin: page + position: 1 + display_options: + display_extenders: { } + path: admin/content/paragraphs + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - user.permissions + tags: + - 'config:field.storage.paragraphs_library_item.field_department' + - 'config:field.storage.paragraphs_library_item.field_site' diff --git a/config/optional/views.view.paragraphs_library_browser.yml b/config/optional/views.view.paragraphs_library_browser.yml new file mode 100644 index 000000000..cd4fa05ca --- /dev/null +++ b/config/optional/views.view.paragraphs_library_browser.yml @@ -0,0 +1,931 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.paragraphs_library_item.field_department + - field.storage.paragraphs_library_item.field_site + - paragraphs.paragraphs_type.accordion + - paragraphs.paragraphs_type.basic_text + - taxonomy.vocabulary.department + - taxonomy.vocabulary.sites + module: + - entity_browser + - paragraphs + - paragraphs_library + - taxonomy + - user +id: paragraphs_library_browser +label: 'Paragraphs library browser' +module: views +description: '' +tag: '' +base_table: paragraphs_library_item_field_data +base_field: id +display: + default: + id: default + display_title: Master + display_plugin: default + position: 0 + display_options: + title: 'Paragraphs library' + fields: + entity_browser_select: + id: entity_browser_select + table: paragraphs_library_item + field: entity_browser_select + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + plugin_id: entity_browser_select + label: Select + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + use_field_cardinality: true + label: + id: label + table: paragraphs_library_item_field_data + field: label + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: label + plugin_id: field + label: Label + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: string + settings: + link_to_entity: false + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + type: + id: type + table: paragraphs_item_field_data + field: type + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: type + plugin_id: field + label: Type + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: false + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + paragraphs__target_id: + id: paragraphs__target_id + table: paragraphs_library_item_field_data + field: paragraphs__target_id + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: paragraphs + plugin_id: field + label: Paragraphs + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: paragraph_summary + settings: { } + group_column: entity_id + group_columns: + target_id: target_id + target_revision_id: target_revision_id + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + changed: + id: changed + table: paragraphs_library_item_field_data + field: changed + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: changed + plugin_id: field + label: Changed + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: timestamp + settings: + date_format: medium + custom_date_format: '' + timezone: '' + tooltip: + date_format: '' + custom_date_format: '' + time_diff: + enabled: false + future_format: '@interval hence' + past_format: '@interval ago' + granularity: 2 + refresh: 60 + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_site: + id: field_site + table: paragraphs_library_item__field_site + field: field_site + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Site + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + field_department: + id: field_department + table: paragraphs_library_item__field_department + field: field_department + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: Department + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: target_id + type: entity_reference_label + settings: + link: true + group_column: target_id + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + pager: + type: mini + options: + offset: 0 + pagination_heading_level: h4 + items_per_page: 10 + total_pages: null + id: 0 + tags: + next: ›› + previous: ‹‹ + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '5, 10, 25, 50' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + exposed_form: + type: basic + options: + submit_button: Filter + reset_button: false + reset_button_label: Reset + exposed_sorts_label: 'Sort by' + expose_sort_order: true + sort_asc_label: Asc + sort_desc_label: Desc + access: + type: perm + options: + perm: 'access content overview' + cache: + type: tag + options: { } + empty: + area_text_custom: + id: area_text_custom + table: views + field: area_text_custom + relationship: none + group_type: group + admin_label: '' + plugin_id: text_custom + empty: true + content: 'No library items available.' + tokenize: false + sorts: { } + arguments: { } + filters: + label: + id: label + table: paragraphs_library_item_field_data + field: label + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: label + plugin_id: string + operator: contains + value: '' + group: 1 + exposed: true + expose: + operator_id: label_op + label: Label + description: '' + use_operator: false + operator: label_op + identifier: label + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + is_grouped: false + group_info: + label: Label + description: null + identifier: label + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: + 1: { } + 2: { } + 3: { } + type: + id: type + table: paragraphs_item_field_data + field: type + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: type + plugin_id: bundle + operator: in + value: + accordion: accordion + basic_text: basic_text + group: 1 + exposed: true + expose: + operator_id: type_op + label: Type + description: '' + use_operator: false + operator: type_op + operator_limit_selection: false + operator_list: { } + identifier: type + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + approver: '0' + site_admin: '0' + editor: '0' + previewer: '0' + contributor: '0' + site_auditor: '0' + reduce: true + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + default_langcode: + id: default_langcode + table: paragraphs_library_item_field_data + field: default_langcode + relationship: none + group_type: group + admin_label: '' + entity_type: paragraphs_library_item + entity_field: default_langcode + plugin_id: boolean + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + default_langcode_1: + id: default_langcode_1 + table: paragraphs_item_field_data + field: default_langcode + relationship: paragraphs__target_id + group_type: group + admin_label: '' + entity_type: paragraph + entity_field: default_langcode + plugin_id: boolean + operator: '=' + value: '1' + group: 1 + exposed: false + expose: + operator_id: '' + label: '' + description: '' + use_operator: false + operator: '' + identifier: '' + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + field_department_target_id: + id: field_department_target_id + table: paragraphs_library_item__field_department + field: field_department_target_id + relationship: none + group_type: group + admin_label: '' + plugin_id: taxonomy_index_tid + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: field_department_target_id_op + label: Department + description: '' + use_operator: false + operator: field_department_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_department_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + administrator: '0' + site_admin: '0' + approver: '0' + editor: '0' + contributor: '0' + previewer: '0' + anonymous: '0' + grant_author: '0' + html_editor: '0' + emergency_recovery_resource: '0' + data_importer: '0' + site_auditor: '0' + jobs_editor: '0' + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: false + vid: department + type: select + hierarchy: false + limit: true + error_message: true + field_site_target_id: + id: field_site_target_id + table: paragraphs_library_item__field_site + field: field_site_target_id + relationship: none + group_type: group + admin_label: '' + plugin_id: taxonomy_index_tid + operator: or + value: { } + group: 1 + exposed: true + expose: + operator_id: field_site_target_id_op + label: Site + description: '' + use_operator: false + operator: field_site_target_id_op + operator_limit_selection: false + operator_list: { } + identifier: field_site_target_id + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + administrator: '0' + site_admin: '0' + approver: '0' + editor: '0' + contributor: '0' + previewer: '0' + anonymous: '0' + grant_author: '0' + html_editor: '0' + emergency_recovery_resource: '0' + data_importer: '0' + site_auditor: '0' + jobs_editor: '0' + reduce: false + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + reduce_duplicates: false + vid: sites + type: select + hierarchy: false + limit: true + error_message: true + filter_groups: + operator: AND + groups: + 1: AND + style: + type: table + options: + grouping: { } + row_class: '' + default_row_class: true + columns: + label: label + type: type + id: id + count: count + operations: operations + default: '-1' + info: + label: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + type: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + id: + sortable: false + default_sort_order: asc + align: '' + separator: '' + empty_column: false + responsive: '' + count: + sortable: false + default_sort_order: asc + align: views-align-right + separator: '' + empty_column: false + responsive: '' + operations: + align: '' + separator: '' + empty_column: false + responsive: '' + override: true + sticky: false + summary: '' + empty_table: true + caption: '' + description: '' + row: + type: fields + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + relationships: + paragraphs__target_id: + id: paragraphs__target_id + table: paragraphs_library_item_field_data + field: paragraphs__target_id + relationship: none + group_type: group + admin_label: Paragraphs + entity_type: paragraphs_library_item + entity_field: paragraphs + plugin_id: standard + required: true + use_ajax: true + group_by: false + header: { } + footer: { } + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_content' + - 'languages:language_interface' + - url + - url.query_args + - user.permissions + tags: + - 'config:field.storage.paragraphs_library_item.field_department' + - 'config:field.storage.paragraphs_library_item.field_site' + entity_browser: + id: entity_browser + display_title: 'Entity browser' + display_plugin: entity_browser + position: 2 + display_options: + rendering_language: '***LANGUAGE_language_interface***' + display_extenders: { } + cache_metadata: + max-age: -1 + contexts: + - 'languages:language_interface' + - url + - url.query_args + - user.permissions + tags: + - 'config:field.storage.paragraphs_library_item.field_department' + - 'config:field.storage.paragraphs_library_item.field_site' diff --git a/modules/tide_landing_page/config/install/field.field.node.landing_page.field_landing_page_component.yml b/modules/tide_landing_page/config/install/field.field.node.landing_page.field_landing_page_component.yml index bf7315a9c..af5f28134 100644 --- a/modules/tide_landing_page/config/install/field.field.node.landing_page.field_landing_page_component.yml +++ b/modules/tide_landing_page/config/install/field.field.node.landing_page.field_landing_page_component.yml @@ -15,6 +15,7 @@ dependencies: - paragraphs.paragraphs_type.complex_image - paragraphs.paragraphs_type.data_table - paragraphs.paragraphs_type.form_embed_openforms + - paragraphs.paragraphs_type.from_library - paragraphs.paragraphs_type.media_gallery - paragraphs.paragraphs_type.navigation_card - paragraphs.paragraphs_type.promotion_card @@ -46,6 +47,7 @@ settings: call_to_action: call_to_action embedded_webform: embedded_webform form_embed_openforms: form_embed_openforms + from_library: from_library media_gallery: media_gallery complex_image: complex_image timelines: timelines @@ -101,6 +103,9 @@ settings: form_embed_openforms: enabled: true weight: -78 + from_library: + weight: 71 + enabled: true media_gallery: enabled: true weight: -77 diff --git a/modules/tide_landing_page/config/optional/core.base_field_override.paragraphs_library_item.paragraphs_library_item.paragraphs.yml b/modules/tide_landing_page/config/optional/core.base_field_override.paragraphs_library_item.paragraphs_library_item.paragraphs.yml new file mode 100644 index 000000000..b31fde46d --- /dev/null +++ b/modules/tide_landing_page/config/optional/core.base_field_override.paragraphs_library_item.paragraphs_library_item.paragraphs.yml @@ -0,0 +1,166 @@ +langcode: en +status: true +dependencies: + config: + - paragraphs.paragraphs_type.accordion + - paragraphs.paragraphs_type.basic_text + module: + - entity_reference_revisions + - paragraphs_library +id: paragraphs_library_item.paragraphs_library_item.paragraphs +field_name: paragraphs +entity_type: paragraphs_library_item +bundle: paragraphs_library_item +label: Paragraphs +description: '' +required: true +translatable: true +default_value: { } +default_value_callback: '' +settings: + handler: 'default:paragraph' + handler_settings: + target_bundles: + accordion: accordion + basic_text: basic_text + negate: 0 + target_bundles_drag_drop: + accordion: + weight: 47 + enabled: true + accordion_content: + weight: 48 + enabled: false + banner: + weight: 49 + enabled: false + basic_text: + weight: 50 + enabled: true + call_to_action: + weight: 51 + enabled: false + call_to_action_image: + weight: 52 + enabled: false + card_carousel: + weight: 53 + enabled: false + card_event: + weight: 54 + enabled: false + card_event_auto: + weight: 55 + enabled: false + card_keydates: + weight: 56 + enabled: false + card_promotion: + weight: 57 + enabled: false + card_promotion_auto: + weight: 58 + enabled: false + compact_card: + weight: 59 + enabled: false + compact_card_collection: + weight: 60 + enabled: false + complex_image: + weight: 61 + enabled: false + contact_us: + weight: 62 + enabled: false + content_collection: + weight: 63 + enabled: false + content_collection_enhanced: + weight: 64 + enabled: false + data_driven_component: + weight: 65 + enabled: false + data_table: + weight: 66 + enabled: false + embedded_search_form: + weight: 67 + enabled: false + embedded_webform: + weight: 68 + enabled: false + event_details: + weight: 69 + enabled: false + form_embed_openforms: + weight: 70 + enabled: false + from_library: + weight: 71 + enabled: false + hero_banner_with_cta: + weight: 72 + enabled: false + introduction_banner: + weight: 73 + enabled: false + key_journeys: + weight: 75 + enabled: false + keydates: + weight: 74 + enabled: false + links: + weight: 76 + enabled: false + listing_content_type: + weight: 77 + enabled: false + listing_custom_filter: + weight: 78 + enabled: false + listing_site: + weight: 79 + enabled: false + listing_user_custom_filter: + weight: 80 + enabled: false + media_gallery: + weight: 81 + enabled: false + navigation_card: + weight: 82 + enabled: false + phone: + weight: 83 + enabled: false + promotion_card: + weight: 84 + enabled: false + related_links: + weight: 85 + enabled: false + search_listing_header_component: + weight: 87 + enabled: false + searchable_fields: + weight: 86 + enabled: false + social_link: + weight: 88 + enabled: false + statistic_block: + weight: 90 + enabled: false + statistics_grid: + weight: 89 + enabled: false + timeline: + weight: 91 + enabled: false + timelines: + weight: 92 + enabled: false +field_type: entity_reference_revisions diff --git a/modules/tide_landing_page/tide_landing_page.install b/modules/tide_landing_page/tide_landing_page.install index b890acf77..cc5ffe1c1 100644 --- a/modules/tide_landing_page/tide_landing_page.install +++ b/modules/tide_landing_page/tide_landing_page.install @@ -8,6 +8,7 @@ use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\paragraphs\Entity\Paragraph; +use Drupal\tide_core\TideEntityUpdateHelper; use Drupal\tide_landing_page\TideLandingPageOperation; /** @@ -175,3 +176,20 @@ function tide_landing_page_update_10105() { ]); $field_storage->save(); } + +/** + * Update field_landing_page_component configs. + */ +function tide_landing_page_update_10106() { + $form_configs = [ + 'field.field.node.landing_page.field_landing_page_component', + ]; + /** @var \Drupal\tide_core\TideEntityUpdateHelper $s */ + $tide_update_helper = \Drupal::service('tide_core.entity_update_helper'); + $tide_update_helper->configMergeDeep('tide_landing_page', TideEntityUpdateHelper::INSTALL_DIR, $form_configs); + $result = $tide_update_helper->updateFromOptional('base_field_override', 'paragraphs_library_item.paragraphs_library_item.paragraphs'); + if (!$result) { + $tide_update_helper->import('base_field_override', 'paragraphs_library_item.paragraphs_library_item.paragraphs'); + } + +} diff --git a/modules/tide_media/src/TideOperation.php b/modules/tide_media/src/TideOperation.php index d56768fcb..2e667e162 100644 --- a/modules/tide_media/src/TideOperation.php +++ b/modules/tide_media/src/TideOperation.php @@ -59,6 +59,7 @@ public static function entityUsageDefaultSettings() { ]; $entity_types = [ 'media', + 'paragraphs_library_item', ]; // Set where it will check for media items use. $source = [ diff --git a/modules/tide_media/tide_media.info.yml b/modules/tide_media/tide_media.info.yml index 7ee0d5b3c..85df071a7 100644 --- a/modules/tide_media/tide_media.info.yml +++ b/modules/tide_media/tide_media.info.yml @@ -11,6 +11,7 @@ dependencies: - drupal:text - drupal:user - drupal:datetime + - tide_core:tide_core - field_group:field_group - inline_entity_form:inline_entity_form - embed:embed diff --git a/modules/tide_media/tide_media.install b/modules/tide_media/tide_media.install index d703334ff..dc5a250da 100644 --- a/modules/tide_media/tide_media.install +++ b/modules/tide_media/tide_media.install @@ -68,3 +68,16 @@ function tide_media_update_10003() { function tide_media_update_10004() { TideOperation::addMediaTypePermissions(); } + +/** + * Adds paragraphs_library_item to track_enabled_target_entity_types. + */ +function tide_media_update_10005() { + // Update entity_usage. + $config_factory = \Drupal::configFactory(); + $config = $config_factory->getEditable('entity_usage.settings'); + $result = $config->get('track_enabled_target_entity_types'); + array_push($result, 'paragraphs_library_item'); + $config->set('track_enabled_target_entity_types', $result); + $config->save(); +} diff --git a/modules/tide_publication/config/install/field.field.node.publication.field_landing_page_component.yml b/modules/tide_publication/config/install/field.field.node.publication.field_landing_page_component.yml index 471d44228..8e11202c4 100644 --- a/modules/tide_publication/config/install/field.field.node.publication.field_landing_page_component.yml +++ b/modules/tide_publication/config/install/field.field.node.publication.field_landing_page_component.yml @@ -7,6 +7,7 @@ dependencies: - paragraphs.paragraphs_type.accordion - paragraphs.paragraphs_type.basic_text - paragraphs.paragraphs_type.complex_image + - paragraphs.paragraphs_type.from_library - paragraphs.paragraphs_type.statistics_grid module: - entity_reference_revisions @@ -27,6 +28,7 @@ settings: target_bundles: accordion: accordion basic_text: basic_text + from_library: from_library complex_image: complex_image statistics_grid: statistics_grid target_bundles_drag_drop: @@ -45,4 +47,7 @@ settings: statistics_grid: enabled: true weight: 152 + from_library: + weight: 71 + enabled: true field_type: entity_reference_revisions diff --git a/modules/tide_publication/config/install/field.field.node.publication_page.field_landing_page_component.yml b/modules/tide_publication/config/install/field.field.node.publication_page.field_landing_page_component.yml index 25f5d38ac..2a06283b1 100644 --- a/modules/tide_publication/config/install/field.field.node.publication_page.field_landing_page_component.yml +++ b/modules/tide_publication/config/install/field.field.node.publication_page.field_landing_page_component.yml @@ -10,6 +10,7 @@ dependencies: - paragraphs.paragraphs_type.card_carousel - paragraphs.paragraphs_type.card_keydates - paragraphs.paragraphs_type.complex_image + - paragraphs.paragraphs_type.from_library - paragraphs.paragraphs_type.latest_events - paragraphs.paragraphs_type.media_gallery - paragraphs.paragraphs_type.navigation_card @@ -35,6 +36,7 @@ settings: negate: 0 target_bundles: basic_text: basic_text + from_library: from_library accordion: accordion promotion_card: promotion_card navigation_card: navigation_card @@ -106,4 +108,7 @@ settings: timelines: enabled: true weight: -23 + from_library: + weight: 71 + enabled: true field_type: entity_reference_revisions diff --git a/modules/tide_publication/tide_publication.info.yml b/modules/tide_publication/tide_publication.info.yml index 7e26f4f41..58ecf1edb 100644 --- a/modules/tide_publication/tide_publication.info.yml +++ b/modules/tide_publication/tide_publication.info.yml @@ -4,7 +4,7 @@ description: 'Provides Publication content type and related configuration. ' package: Tide core_version_requirement: ^9 || ^10 dependencies: - - tide_landing_page:tide_landing_page + - tide_core:tide_landing_page - tide_core:tide_media - entity_hierarchy:entity_hierarchy - inline_entity_form:inline_entity_form diff --git a/modules/tide_publication/tide_publication.install b/modules/tide_publication/tide_publication.install index 05755da0e..6bb3fb8db 100644 --- a/modules/tide_publication/tide_publication.install +++ b/modules/tide_publication/tide_publication.install @@ -7,6 +7,7 @@ use Drupal\field\Entity\FieldConfig; use Drupal\taxonomy\Entity\Vocabulary; +use Drupal\tide_core\TideEntityUpdateHelper; use Drupal\tide_publication\TidePublicationOperation; /** @@ -116,3 +117,16 @@ function tide_publication_update_10003() { \Drupal::moduleHandler()->loadInclude('tide_core', 'inc', 'includes/updates'); _tide_core_content_category_form_display('publication'); } + +/** + * Update field_landing_page_component configs. + */ +function tide_publication_update_10004() { + $form_configs = [ + 'field.field.node.publication.field_landing_page_component', + 'field.field.node.publication_page.field_landing_page_component', + ]; + /** @var \Drupal\tide_core\TideEntityUpdateHelper $s */ + $tide_update_helper = \Drupal::service('tide_core.entity_update_helper'); + $tide_update_helper->configMergeDeep('tide_landing_page', TideEntityUpdateHelper::INSTALL_DIR, $form_configs); +} diff --git a/modules/tide_site/tide_site.info.yml b/modules/tide_site/tide_site.info.yml index 042b289fd..8bd64888a 100644 --- a/modules/tide_site/tide_site.info.yml +++ b/modules/tide_site/tide_site.info.yml @@ -12,6 +12,8 @@ dependencies: - drupal:text - drupal:user - drupal:path_alias + - tide_core:tide_core + - tide_core:tide_media - key_value_field:key_value_field - pathauto:pathauto - entity_browser:entity_browser diff --git a/src/TideCoreOperation.php b/src/TideCoreOperation.php index e291a7137..fbf7b78f5 100644 --- a/src/TideCoreOperation.php +++ b/src/TideCoreOperation.php @@ -258,4 +258,31 @@ public function enabledTideTfa() { } } + /** + * Enables paragraphs_library. + */ + public function alterParagraphsLibrary() { + // Enabled paragraphs_library module. + if (!\Drupal::moduleHandler()->moduleExists('paragraphs_library')) { + /** @var \Drupal\Core\Extension\ModuleInstallerInterface $module_installer */ + $module_installer = \Drupal::service('module_installer'); + $module_installer->install(['paragraphs_library']); + } + + // Overwrites paragraphs_library. + $entity_update_items = [ + 'from_library' => 'paragraphs_type', + 'paragraphs_library' => 'view', + 'paragraphs_library_browser' => 'view', + 'paragraphs_library_item.paragraphs_library_item.default' => 'entity_form_display', + ]; + $update_service = \Drupal::service('tide_core.entity_update_helper'); + foreach ($entity_update_items as $name => $type) { + $result = $update_service->updateFromOptional($type, $name); + if (!$result) { + $update_service->import($type, $name); + } + } + } + } diff --git a/src/TideEntityUpdateHelper.php b/src/TideEntityUpdateHelper.php index 8aa45e20d..9c9adee78 100644 --- a/src/TideEntityUpdateHelper.php +++ b/src/TideEntityUpdateHelper.php @@ -2,26 +2,72 @@ namespace Drupal\tide_core; +use Drupal\Component\Utility\NestedArray; +use Drupal\config_update\ConfigPreRevertEvent; +use Drupal\config_update\ConfigReverter; +use Drupal\config_update\ConfigRevertEvent; +use Drupal\config_update\ConfigRevertInterface; +use Drupal\Core\Config\ConfigFactoryInterface; +use Drupal\Core\Config\StorageInterface; use Drupal\Core\Entity\EntityFieldManager; use Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Sql\SqlEntityStorageInterface; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Field\FieldStorageDefinitionListenerInterface; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Provides helper function for entity updates. * * @package Drupal\tide_core */ -class TideEntityUpdateHelper { +class TideEntityUpdateHelper extends ConfigReverter { + + const INSTALL_DIR = '/config/install'; + const OPTIONAL_DIR = '/config/optional'; /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ - protected $entityTypeManager; + protected $entityManager; + + /** + * The active config storage. + * + * @var \Drupal\Core\Config\StorageInterface + */ + protected $activeConfigStorage; + + /** + * The extension config storage for config/install config items. + * + * @var \Drupal\Core\Config\StorageInterface + */ + protected $extensionConfigStorage; + + /** + * The extension config storage for config/optional config items. + * + * @var \Drupal\Core\Config\ExtensionInstallStorage + */ + protected $extensionOptionalConfigStorage; + + /** + * The config factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface + */ + protected $configFactory; + + /** + * The event dispatcher. + * + * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + protected $dispatcher; /** * The entity field manager. @@ -47,8 +93,18 @@ class TideEntityUpdateHelper { /** * TideEntityUpdateHelper constructor. * - * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager - * EntityTypeManagerInterface. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_manager + * The entity manager. + * @param \Drupal\Core\Config\StorageInterface $active_config_storage + * The active config storage. + * @param \Drupal\Core\Config\StorageInterface $extension_config_storage + * The extension config storage. + * @param \Drupal\Core\Config\StorageInterface $extension_optional_config_storage + * The extension config storage for optional config items. + * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory. + * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher + * The event dispatcher. * @param \Drupal\Core\Entity\EntityFieldManager $entity_field_manager * EntityFieldManager. * @param \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $entity_last_installed_schema_repository @@ -56,8 +112,13 @@ class TideEntityUpdateHelper { * @param \Drupal\Core\Field\FieldStorageDefinitionListenerInterface $definition_listener * FieldStorageDefinitionListenerInterface. */ - public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManager $entity_field_manager, EntityLastInstalledSchemaRepositoryInterface $entity_last_installed_schema_repository, FieldStorageDefinitionListenerInterface $definition_listener) { - $this->entityTypeManager = $entity_type_manager; + public function __construct(EntityTypeManagerInterface $entity_manager, StorageInterface $active_config_storage, StorageInterface $extension_config_storage, StorageInterface $extension_optional_config_storage, ConfigFactoryInterface $config_factory, EventDispatcherInterface $dispatcher, EntityFieldManager $entity_field_manager, EntityLastInstalledSchemaRepositoryInterface $entity_last_installed_schema_repository, FieldStorageDefinitionListenerInterface $definition_listener) { + $this->entityManager = $entity_manager; + $this->activeConfigStorage = $active_config_storage; + $this->extensionConfigStorage = $extension_config_storage; + $this->extensionOptionalConfigStorage = $extension_optional_config_storage; + $this->configFactory = $config_factory; + $this->dispatcher = $dispatcher; $this->entityFieldManager = $entity_field_manager; $this->lastInstalledSchema = $entity_last_installed_schema_repository; $this->fieldStorageDefinitionListener = $definition_listener; @@ -73,11 +134,11 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Ent * Returns an entity storage object. */ public function getStorageObject(string $entity_type_id) { - $all_ids = array_keys($this->entityTypeManager->getDefinitions()); + $all_ids = array_keys($this->entityManager->getDefinitions()); if (!in_array($entity_type_id, $all_ids)) { return NULL; } - return $this->entityTypeManager->getStorage($entity_type_id); + return $this->entityManager->getStorage($entity_type_id); } /** @@ -95,14 +156,14 @@ public function getStorageObject(string $entity_type_id) { * Returns an array or null. */ public function getEntitySchemaData(SqlEntityStorageInterface $storage, string $entity_type_id) { - $all_ids = array_keys($this->entityTypeManager->getDefinitions()); + $all_ids = array_keys($this->entityManager->getDefinitions()); if (!in_array($entity_type_id, $all_ids)) { return NULL; } $r_get_storage_schema = new \ReflectionMethod($storage, 'getStorageSchema'); $r_get_storage_schema->setAccessible(TRUE); $storage_schema = $r_get_storage_schema->invoke($storage); - $entity_type_definition = $this->entityTypeManager + $entity_type_definition = $this->entityManager ->getDefinition($entity_type_id); $r_getEntitySchema = new \ReflectionMethod($storage_schema, 'getEntitySchema'); $r_getEntitySchema->setAccessible(TRUE); @@ -165,7 +226,7 @@ public function installFieldTable(BaseFieldDefinition $fieldDefinition) { * ['nid'=> BaseFieldDefinition .. ] */ public function getFieldStorageDefinitions(string $entity_type_id) { - $all_ids = array_keys($this->entityTypeManager->getDefinitions()); + $all_ids = array_keys($this->entityManager->getDefinitions()); if (!in_array($entity_type_id, $all_ids)) { return NULL; } @@ -222,4 +283,104 @@ public function updateFieldTable(string $entity_type_id, string $field_name) { } } + /** + * {@inheritdoc} + */ + public function updateFromOptional($type, $name) { + // Read the config from the file. Note: Do not call getFromExtension() here + // because we need $full_name below. + $value = FALSE; + $full_name = $this->getFullName($type, $name); + if ($full_name) { + $value = $this->extensionOptionalConfigStorage->read($full_name); + } + if (!$value) { + return FALSE; + } + + // Make sure the configuration exists currently in active storage. + $active_value = $this->activeConfigStorage->read($full_name); + if (!$active_value) { + return FALSE; + } + + // Trigger an event to modify the active configuration value. + $event = new ConfigPreRevertEvent($type, $name, $value, $active_value); + $this->dispatcher->dispatch($event, ConfigRevertInterface::PRE_REVERT); + $value = $event->getValue(); + + // Load the current config and replace the value, retaining the config + // hash (which is part of the _core config key's value). + if ($type === 'system.simple') { + $config = $this->configFactory->getEditable($full_name); + $core = $config->get('_core'); + $config + ->setData($value) + ->set('_core', $core) + ->save(); + } + else { + $definition = $this->entityManager->getDefinition($type); + $id_key = $definition->getKey('id'); + $id = $value[$id_key]; + $entity_storage = $this->entityManager->getStorage($type); + $entity = $entity_storage->load($id); + $core = $entity->get('_core'); + $entity = $entity_storage->updateFromStorageRecord($entity, $value); + $entity->set('_core', $core); + $entity->save(); + } + + // Trigger an event notifying of this change. + $event = new ConfigRevertEvent($type, $name); + $this->dispatcher->dispatch($event, ConfigRevertInterface::REVERT); + + return TRUE; + } + + /** + * Rewrites configuration entities based on a module config file. + * + * @param string $module_name + * The name of the module. + * @param string $config_directory + * The directory where the config files are stored (e.g., + * 'TideEntityUpdateHelper::INSTALL_DIR' or + * 'TideEntityUpdateHelper::OPTIONAL_DIR'). + * @param array $form_configs + * An array of configuration entity names to be processed. + */ + public function configMergeDeep($module_name, $config_directory, array $form_configs) { + // Construct the config file location path. + \Drupal::moduleHandler()->loadInclude('tide_core', 'inc', 'includes/helpers'); + $config_location = [\Drupal::service('extension.list.module')->getPath($module_name) . $config_directory]; + + foreach ($form_configs as $form_config) { + // Read the config file from the specified location. + $rewrite = _tide_read_config($form_config, $config_location, FALSE); + + // Get the current configuration entity. + $config_entity = \Drupal::configFactory()->getEditable($form_config); + $original_config = $config_entity->getRawData(); + + // Merge the original config with the rewritten config. + $rewritten_config = NestedArray::mergeDeep($original_config, $rewrite); + + // Ensure dependencies are unique and sorted. + if (!empty($rewritten_config['dependencies'])) { + $dependencies = $rewritten_config['dependencies']; + foreach ($dependencies as $type => $items) { + $uniqueItems = array_unique($items); + sort($uniqueItems); + $dependencies[$type] = $uniqueItems; + } + $rewritten_config['dependencies'] = $dependencies; + } + + // Save the updated configuration. + $config_entity->setData($rewritten_config); + $config_entity->save(); + } + } + } diff --git a/tide_core.info.yml b/tide_core.info.yml index 7439fb10a..5cfa966e7 100644 --- a/tide_core.info.yml +++ b/tide_core.info.yml @@ -64,6 +64,7 @@ dependencies: - metatag:metatag_open_graph - override_node_options:override_node_options - paragraphs:paragraphs + - paragraphs:paragraphs_library - password_policy:password_policy - password_strength:password_strength - pathauto:pathauto diff --git a/tide_core.install b/tide_core.install index 55f9d9706..b249beb52 100644 --- a/tide_core.install +++ b/tide_core.install @@ -54,6 +54,12 @@ function tide_core_install() { // Changes the diff modules general_settings.revision_pager_limit to 16. $tideCoreOperation->changeDiffSettings(); + + // Enable Tide TFA. + $tideCoreOperation->enabledTideTfa(); + + // Enables paragraphs_library. + $tideCoreOperation->alterParagraphsLibrary(); } /** @@ -238,3 +244,53 @@ function tide_core_update_10007() { $config_entity->save(); } } + +/** + * Enables paragraphs_library. + */ +function tide_core_update_10009() { + // Enabled paragraphs_library module. + if (!\Drupal::moduleHandler()->moduleExists('paragraphs_library')) { + /** @var \Drupal\Core\Extension\ModuleInstallerInterface $module_installer */ + $module_installer = \Drupal::service('module_installer'); + $module_installer->install(['paragraphs_library']); + } + + // Import extra fields. + $config_update_items = [ + 'paragraphs_library_item.field_department' => 'field_storage_config', + 'paragraphs_library_item.field_site' => 'field_storage_config', + 'paragraphs_library_item.paragraphs_library_item.field_department' => 'field_config', + 'paragraphs_library_item.paragraphs_library_item.field_site' => 'field_config', + ]; + /** @var \Drupal\config_update\ConfigReverter $config_update */ + $config_update = \Drupal::service('config_update.config_update'); + foreach ($config_update_items as $name => $type) { + $config_update->import($type, $name); + } + + $tideCoreOperation = new TideCoreOperation(); + $tideCoreOperation->alterParagraphsLibrary(); + + // Update permissions. + $roles = [ + 'approver', + 'contributor', + 'editor', + 'site_admin', + ]; + $permissions = [ + 'access paragraphs_library_items entity browser pages', + 'create paragraph library item', + 'edit paragraph library item', + ]; + foreach ($roles as $role_name) { + $role = Role::load($role_name); + if ($role) { + foreach ($permissions as $permission) { + $role->grantPermission($permission); + } + $role->save(); + } + } +} diff --git a/tide_core.services.yml b/tide_core.services.yml index bb0c8bf1f..c332995ba 100644 --- a/tide_core.services.yml +++ b/tide_core.services.yml @@ -6,7 +6,15 @@ services: tide_core.entity_update_helper: class: Drupal\tide_core\TideEntityUpdateHelper arguments: - [ '@entity_type.manager', '@entity_field.manager', '@entity.last_installed_schema.repository', '@field_storage_definition.listener' ] + - '@entity_type.manager' + - '@config.storage' + - '@config_update.extension_storage' + - '@config_update.extension_optional_storage' + - '@config.factory' + - '@event_dispatcher' + - '@entity_field.manager' + - '@entity.last_installed_schema.repository' + - '@field_storage_definition.listener' tide_core.route_subscriber: class: Drupal\tide_core\Routing\AutocompleteRouteSubscriber tags: