diff --git a/changelogs/DP-44225.yml b/changelogs/DP-44225.yml new file mode 100644 index 0000000000..ce5bdf57ed --- /dev/null +++ b/changelogs/DP-44225.yml @@ -0,0 +1,3 @@ +Added: + - description: Field to Document media entity for authors to select accessibility state designation. + issue: DP-44225 diff --git a/conf/drupal/config/core.entity_form_display.media.document.default.yml b/conf/drupal/config/core.entity_form_display.media.document.default.yml index 75edfae1fd..66399be12c 100644 --- a/conf/drupal/config/core.entity_form_display.media.document.default.yml +++ b/conf/drupal/config/core.entity_form_display.media.document.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -26,6 +27,7 @@ dependencies: - entity_reference_tree - field_group - file + - mass_fields - path third_party_settings: field_group: @@ -74,6 +76,7 @@ third_party_settings: - field_description - field_document_listing_desc - field_upload_file + - field_accessibility_self_rpt - field_category - field_organizations - langcode @@ -99,15 +102,21 @@ targetEntityType: media bundle: document mode: default content: + field_accessibility_self_rpt: + type: list_long_label_document_self_reported_accessibility_status_widget + weight: 6 + region: content + settings: { } + third_party_settings: { } field_category: type: options_select - weight: 6 + weight: 7 region: content settings: { } third_party_settings: { } field_collections: type: entity_reference_tree - weight: 18 + weight: 12 region: content settings: theme: default @@ -133,7 +142,7 @@ content: third_party_settings: { } field_document_label: type: entity_reference_autocomplete - weight: 17 + weight: 11 region: content settings: match_operator: CONTAINS @@ -151,7 +160,7 @@ content: third_party_settings: { } field_internal_notes: type: string_textarea - weight: 20 + weight: 13 region: content settings: rows: 1 @@ -159,7 +168,7 @@ content: third_party_settings: { } field_media_english_version: type: entity_reference_autocomplete - weight: 9 + weight: 10 region: content settings: match_operator: CONTAINS @@ -187,7 +196,7 @@ content: selector: '' field_organizations: type: entity_reference_autocomplete - weight: 7 + weight: 8 region: content settings: match_operator: CONTAINS @@ -218,7 +227,7 @@ content: third_party_settings: { } langcode: type: language_select - weight: 8 + weight: 9 region: content settings: include_locked: false @@ -249,14 +258,14 @@ content: third_party_settings: { } search: type: boolean_checkbox - weight: 6 + weight: 7 region: content settings: display_label: true third_party_settings: { } display_label: true simple_sitemap: - weight: 5 + weight: 6 region: content settings: { } third_party_settings: { } diff --git a/conf/drupal/config/core.entity_view_display.media.document.default.yml b/conf/drupal/config/core.entity_view_display.media.document.default.yml index f0e69e5234..b909d40b80 100644 --- a/conf/drupal/config/core.entity_view_display.media.document.default.yml +++ b/conf/drupal/config/core.entity_view_display.media.document.default.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -138,6 +139,7 @@ content: region: content hidden: computed_manual_description: true + field_accessibility_self_rpt: true field_description: true field_document_label: true field_document_type: true diff --git a/conf/drupal/config/core.entity_view_display.media.document.linked_desc.yml b/conf/drupal/config/core.entity_view_display.media.document.linked_desc.yml index e13ce535f0..c3497800cb 100644 --- a/conf/drupal/config/core.entity_view_display.media.document.linked_desc.yml +++ b/conf/drupal/config/core.entity_view_display.media.document.linked_desc.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.media.linked_desc + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -81,6 +82,7 @@ content: hidden: computed_manual_description: true created: true + field_accessibility_self_rpt: true field_category: true field_collections: true field_contributing_agency: true diff --git a/conf/drupal/config/core.entity_view_display.media.document.listing.yml b/conf/drupal/config/core.entity_view_display.media.document.listing.yml index f79306b345..fddee9ffbf 100644 --- a/conf/drupal/config/core.entity_view_display.media.document.listing.yml +++ b/conf/drupal/config/core.entity_view_display.media.document.listing.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.media.listing + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -129,6 +130,7 @@ content: hidden: computed_manual_description: true content_moderation_control: true + field_accessibility_self_rpt: true field_category: true field_collections: true field_description: true diff --git a/conf/drupal/config/core.entity_view_display.media.document.manual_desc.yml b/conf/drupal/config/core.entity_view_display.media.document.manual_desc.yml index 9667f3cab6..500406669e 100644 --- a/conf/drupal/config/core.entity_view_display.media.document.manual_desc.yml +++ b/conf/drupal/config/core.entity_view_display.media.document.manual_desc.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.media.manual_desc + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -73,6 +74,7 @@ content: hidden: computed_manual_description: true created: true + field_accessibility_self_rpt: true field_category: true field_collections: true field_contributing_agency: true diff --git a/conf/drupal/config/core.entity_view_display.media.document.media_download_link.yml b/conf/drupal/config/core.entity_view_display.media.document.media_download_link.yml index a3399afcba..c7d5cbebb9 100644 --- a/conf/drupal/config/core.entity_view_display.media.document.media_download_link.yml +++ b/conf/drupal/config/core.entity_view_display.media.document.media_download_link.yml @@ -4,6 +4,7 @@ status: true dependencies: config: - core.entity_view_mode.media.media_download_link + - field.field.media.document.field_accessibility_self_rpt - field.field.media.document.field_category - field.field.media.document.field_collections - field.field.media.document.field_description @@ -68,6 +69,7 @@ content: hidden: content_moderation_control: true created: true + field_accessibility_self_rpt: true field_category: true field_collections: true field_description: true diff --git a/conf/drupal/config/field.field.media.document.field_accessibility_self_rpt.yml b/conf/drupal/config/field.field.media.document.field_accessibility_self_rpt.yml new file mode 100644 index 0000000000..a6b68e97cc --- /dev/null +++ b/conf/drupal/config/field.field.media.document.field_accessibility_self_rpt.yml @@ -0,0 +1,25 @@ +uuid: eeb03c2f-6a77-4dae-a032-cw29s4a36c68 +langcode: en +status: true +dependencies: + config: + - field.storage.media.field_accessibility_self_rpt + - media.type.document + module: + - mass_fields + - require_on_publish +third_party_settings: + require_on_publish: + require_on_publish: true +id: media.document.field_accessibility_self_rpt +field_name: field_accessibility_self_rpt +entity_type: media +bundle: document +label: 'Accessibility Status (self-reported)' +description: 'All Mass.gov documents are required to meet digital accessibility standards. Report if this document is accessible. This will be used for reporting purposes. If you’re unsure how to create, test, or remediate a document to make it accessible, visit the accessibility training resource center. Questions? Sign-up for ACCESS Office Hours.' +required: false +translatable: false +default_value: { } +default_value_callback: '' +settings: { } +field_type: list_long_label diff --git a/conf/drupal/config/field.storage.media.field_accessibility_self_rpt.yml b/conf/drupal/config/field.storage.media.field_accessibility_self_rpt.yml new file mode 100644 index 0000000000..536e0e16f4 --- /dev/null +++ b/conf/drupal/config/field.storage.media.field_accessibility_self_rpt.yml @@ -0,0 +1,30 @@ +uuid: 7fbaa67a-839d-4018-ae19-fe613bf87c82 +langcode: en +status: true +dependencies: + module: + - mass_fields + - media +id: media.field_accessibility_self_rpt +field_name: field_accessibility_self_rpt +entity_type: media +type: list_long_label +settings: + allowed_values: + - + value: verified_accessible + label: 'Verified accessible:
My organization or a third-party vendor has checked the document and it passes automated and manual accessibility checks.
' + - + value: not_tested + label: 'Unverified or not accessible yet:
The document is not accessible or hasn’t been checked for accessibility yet. I understand that my organization needs to replace this document with an accessible version as soon as possible.
' + - + value: exception + label: 'Exception:
I went through the Exception Request Process (Executive Department only) and this type of document has been approved as an exception as part of a set of documents. I understand that my organization must provide this document in an accessible format upon request.
' + allowed_values_function: '' +module: mass_fields +locked: false +cardinality: 1 +translatable: true +indexes: { } +persist_with_no_fields: false +custom_storage: false diff --git a/conf/drupal/config/views.view.all_documents.yml b/conf/drupal/config/views.view.all_documents.yml index 838a6854de..3bed3b88ba 100644 --- a/conf/drupal/config/views.view.all_documents.yml +++ b/conf/drupal/config/views.view.all_documents.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.storage.media.field_accessibility_self_rpt - field.storage.media.field_collections - field.storage.media.field_document_label - field.storage.media.field_document_listing_desc @@ -16,12 +17,13 @@ dependencies: - taxonomy.vocabulary.label - workflows.workflow.media_states module: + - better_exposed_filters - content_moderation - csv_serialization - - datetime - file - mass_views - media + - options - rest - serialization - taxonomy @@ -1461,6 +1463,72 @@ display: title: Unpublished operator: '=' value: '0' + field_accessibility_self_rpt_value: + id: field_accessibility_self_rpt_value + table: media__field_accessibility_self_rpt + field: field_accessibility_self_rpt_value + relationship: none + group_type: group + admin_label: '' + plugin_id: string + operator: '=' + value: '' + group: 1 + exposed: true + expose: + operator_id: field_accessibility_self_rpt_value_op + label: 'Accessibility Status (self-reported)' + description: '' + use_operator: false + operator: field_accessibility_self_rpt_value_op + operator_limit_selection: false + operator_list: { } + identifier: field_accessibility_self_rpt_value + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + author: '0' + editor: '0' + emergency_alert_publisher: '0' + executive_orders: '0' + redirect_creators: '0' + content_team: '0' + developer: '0' + administrator: '0' + tester: '0' + doc_deletion: '0' + d2d_redirect_manager: '0' + data_administrator: '0' + collection_administrator: '0' + prototype_design_access: '0' + mmg_editor: '0' + viewer: '0' + bulk_edit: '0' + placeholder: '' + autocomplete_filter: 1 + autocomplete_min_chars: '0' + autocomplete_items: '10' + autocomplete_field: '' + autocomplete_raw_suggestion: 1 + autocomplete_raw_dropdown: 1 + autocomplete_dependent: 0 + autocomplete_contextual: 0 + autocomplete_autosubmit: 0 + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } filter_groups: operator: AND groups: @@ -4517,6 +4585,68 @@ display: multi_type: separator separator: ', ' field_api_classes: false + field_accessibility_self_rpt: + id: field_accessibility_self_rpt + table: media__field_accessibility_self_rpt + field: field_accessibility_self_rpt + relationship: none + group_type: group + admin_label: '' + plugin_id: field + label: 'Accessibility Status (self-reported)' + exclude: false + alter: + alter_text: true + text: '{{ field_accessibility_self_rpt__value }}' + 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: list_default + settings: { } + 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 style: type: data_export options: @@ -4570,6 +4700,7 @@ display: - url - user.permissions tags: + - 'config:field.storage.media.field_accessibility_self_rpt' - 'config:field.storage.media.field_collections' - 'config:field.storage.media.field_document_label' - 'config:field.storage.media.field_document_listing_desc' @@ -5194,17 +5325,137 @@ display: hide_alter_empty: true destination: false exposed_form: - type: input_required_on_request + type: bef options: submit_button: Filter - reset_button: 1 + reset_button: true reset_button_label: Reset exposed_sorts_label: 'Sort by' - expose_sort_order: 1 + expose_sort_order: true sort_asc_label: Asc sort_desc_label: Desc text_input_required: 'Select any filter and click on Apply to see results' text_input_required_format: basic_html + bef: + general: + autosubmit: false + autosubmit_exclude_textfield: false + autosubmit_textfield_delay: 500 + autosubmit_hide: false + input_required: true + allow_secondary: false + secondary_label: 'Advanced options' + secondary_open: false + reset_button_always_show: false + pager: + plugin_id: default + advanced: + is_secondary: false + filter: + field_title_value: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + filename: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + mid: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + status: + plugin_id: default + advanced: + sort_options: false + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + uid: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + media_org_filter: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + langcode: + plugin_id: default + advanced: + sort_options: false + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_document_label_target_id: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + changed: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_collections_target_id: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + search: + plugin_id: default + advanced: + sort_options: false + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_accessibility_self_rpt_value: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false filters: bundle: id: bundle @@ -5908,6 +6159,89 @@ display: default_group: All default_group_multiple: { } group_items: { } + field_accessibility_self_rpt_value: + id: field_accessibility_self_rpt_value + table: media__field_accessibility_self_rpt + field: field_accessibility_self_rpt_value + relationship: none + group_type: group + admin_label: '' + plugin_id: string + operator: '=' + value: '' + group: 1 + exposed: true + expose: + operator_id: field_accessibility_self_rpt_value_op + label: 'Accessibility Status (self-reported)' + description: '' + use_operator: false + operator: field_accessibility_self_rpt_value_op + operator_limit_selection: false + operator_list: { } + identifier: field_accessibility_self_rpt_value + required: false + remember: false + multiple: true + remember_roles: + authenticated: authenticated + anonymous: '0' + author: '0' + editor: '0' + emergency_alert_publisher: '0' + executive_orders: '0' + redirect_creators: '0' + content_team: '0' + developer: '0' + administrator: '0' + tester: '0' + doc_deletion: '0' + d2d_redirect_manager: '0' + data_administrator: '0' + collection_administrator: '0' + prototype_design_access: '0' + mmg_editor: '0' + viewer: '0' + bulk_edit: '0' + placeholder: '' + autocomplete_filter: 0 + autocomplete_min_chars: '0' + autocomplete_items: '10' + autocomplete_field: '' + autocomplete_raw_suggestion: 1 + autocomplete_raw_dropdown: 1 + autocomplete_dependent: 0 + autocomplete_contextual: 0 + autocomplete_autosubmit: 0 + is_grouped: true + group_info: + label: 'Accessibility Status (self-reported)' + description: '' + identifier: field_accessibility_self_rpt_value + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: + 1: 1 + group_items: + 1: + title: 'Verified accessible' + operator: '=' + value: verified_accessible + 2: + title: 'Unverified or not accessible yet' + operator: '=' + value: not_tested + 3: + title: Exception + operator: '=' + value: exception + 4: + title: blank + operator: empty + value: '' filter_groups: operator: AND groups: diff --git a/conf/drupal/config/views.view.all_documents_latest_rev.yml b/conf/drupal/config/views.view.all_documents_latest_rev.yml index 8c18d630e8..868df89b58 100644 --- a/conf/drupal/config/views.view.all_documents_latest_rev.yml +++ b/conf/drupal/config/views.view.all_documents_latest_rev.yml @@ -3,6 +3,7 @@ langcode: en status: true dependencies: config: + - field.storage.media.field_accessibility_self_rpt - field.storage.media.field_category - field.storage.media.field_collections - field.storage.media.field_description @@ -21,6 +22,7 @@ dependencies: - taxonomy.vocabulary.label - taxonomy.vocabulary.language module: + - better_exposed_filters - content_moderation - csv_serialization - file @@ -28,6 +30,7 @@ dependencies: - media - media_entity_download - node + - options - rest - serialization - taxonomy @@ -921,7 +924,7 @@ display: offset: false offset_label: Offset exposed_form: - type: basic + type: bef options: submit_button: Apply reset_button: false @@ -930,6 +933,169 @@ display: expose_sort_order: true sort_asc_label: Asc sort_desc_label: Desc + text_input_required: 'Select any filter and click on Apply to see results' + text_input_required_format: basic_html + bef: + general: + autosubmit: false + autosubmit_exclude_textfield: false + autosubmit_textfield_delay: 500 + autosubmit_hide: false + input_required: true + allow_secondary: false + secondary_label: 'Advanced options' + secondary_open: false + reset_button_always_show: false + filter: + field_title_value: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + mid: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + status: + plugin_id: default + advanced: + sort_options: false + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + moderation_state: + plugin_id: default + advanced: + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + name: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + node_org_filter: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + node_parent_org_top_filter: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + uid: + plugin_id: default + advanced: + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + changed: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + search: + plugin_id: default + advanced: + sort_options: false + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + uid_1: + plugin_id: default + advanced: + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_document_label_target_id: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_collections_target_id: + plugin_id: default + advanced: + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + filesize: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_language_target_id_1: + plugin_id: default + advanced: + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_category_target_id: + plugin_id: default + advanced: + placeholder_text: '' + rewrite: + filter_rewrite_values: '' + filter_rewrite_values_key: false + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + filemime: + plugin_id: default + advanced: + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false + field_accessibility_self_rpt_value: + plugin_id: default + advanced: + placeholder_text: '' + collapsible: false + collapsible_disable_automatic_open: false + is_secondary: false access: type: perm options: @@ -2122,6 +2288,88 @@ display: default_group: All default_group_multiple: { } group_items: { } + field_accessibility_self_rpt_value: + id: field_accessibility_self_rpt_value + table: media__field_accessibility_self_rpt + field: field_accessibility_self_rpt_value + relationship: mid + group_type: group + admin_label: '' + plugin_id: string + operator: '=' + value: '' + group: 1 + exposed: true + expose: + operator_id: field_accessibility_self_rpt_value_op + label: 'Accessibility Status (self-reported)' + description: '' + use_operator: false + operator: field_accessibility_self_rpt_value_op + operator_limit_selection: false + operator_list: { } + identifier: field_accessibility_self_rpt_value + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + author: '0' + editor: '0' + emergency_alert_publisher: '0' + executive_orders: '0' + redirect_creators: '0' + content_team: '0' + developer: '0' + administrator: '0' + tester: '0' + doc_deletion: '0' + d2d_redirect_manager: '0' + data_administrator: '0' + collection_administrator: '0' + prototype_design_access: '0' + mmg_editor: '0' + viewer: '0' + bulk_edit: '0' + placeholder: '' + autocomplete_filter: 0 + autocomplete_min_chars: '0' + autocomplete_items: '10' + autocomplete_field: '' + autocomplete_raw_suggestion: 1 + autocomplete_raw_dropdown: 1 + autocomplete_dependent: 0 + autocomplete_contextual: 0 + autocomplete_autosubmit: 0 + is_grouped: true + group_info: + label: 'Accessibility Status (self-reported)' + description: '' + identifier: field_accessibility_self_rpt_value + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: + 1: + title: 'Verified accessible' + operator: '=' + value: verified_accessible + 2: + title: 'Unverified or not accessible yet' + operator: '=' + value: not_tested + 3: + title: Exception + operator: '=' + value: exception + 4: + title: blank + operator: empty + value: '' filter_groups: operator: AND groups: @@ -4227,6 +4475,68 @@ display: multi_type: separator separator: ', ' field_api_classes: false + field_accessibility_self_rpt: + id: field_accessibility_self_rpt + table: media__field_accessibility_self_rpt + field: field_accessibility_self_rpt + relationship: mid + group_type: group + admin_label: '' + plugin_id: field + label: 'Accessibility Status (self-reported)' + exclude: false + alter: + alter_text: true + text: '{{ field_accessibility_self_rpt__value }}' + 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: list_default + settings: { } + 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 style: type: data_export options: @@ -4268,6 +4578,7 @@ display: - url - user.permissions tags: + - 'config:field.storage.media.field_accessibility_self_rpt' - 'config:field.storage.media.field_category' - 'config:field.storage.media.field_collections' - 'config:field.storage.media.field_description' diff --git a/docroot/modules/custom/mass_fields/js/accessibility-status-reset.js b/docroot/modules/custom/mass_fields/js/accessibility-status-reset.js new file mode 100644 index 0000000000..9825cd52a3 --- /dev/null +++ b/docroot/modules/custom/mass_fields/js/accessibility-status-reset.js @@ -0,0 +1,74 @@ +/** + * @file + * Reset the accessibility status field when a document file is removed or replaced. + */ + +(function ($, Drupal, once) { + 'use strict'; + + /** + * Hides the TBD (_none) option and resets to it on file change. + * + * The _none (TBD) radio is kept in the DOM but hidden. When a file is + * uploaded or removed, JS selects the hidden _none radio — effectively + * resetting the field to the empty state. An aria-live region announces + * the reset to screen reader users. The require_on_publish constraint + * blocks publishing until the author picks a real option. + */ + Drupal.behaviors.accessibilityStatusReset = { + attach: function (context, settings) { + const fidsSelector = 'input[data-drupal-selector="edit-field-upload-file-0-fids"]'; + const noneSelector = 'input[name="field_accessibility_self_rpt"][value="_none"], input[name="media[document][field_accessibility_self_rpt]"][value="_none"]'; + const liveRegionId = 'accessibility-status-reset-announcement'; + + // Inject an aria-live region once (for screen reader announcements). + once('accessibility-status-live-region', 'body').forEach(function (body) { + $(body).append( + '
' + ); + }); + + // Hide the _none (TBD) radio and its wrapper on every attach + // (including after AJAX re-renders). + $(noneSelector, context).closest('.js-form-item').hide(); + + // Track fids to detect file changes. + let lastFids = $(fidsSelector).val() || ''; + + $(document).on('ajaxSuccess', function (event, xhr, ajaxSettings) { + setTimeout(function () { + const $fidsField = $(fidsSelector); + if (!$fidsField.length) { + return; + } + + const currentFids = $fidsField.val() || ''; + + if (currentFids !== lastFids) { + lastFids = currentFids; + + const $form = $fidsField.closest('form'); + const $noneRadio = $form.find(noneSelector); + const $otherRadios = $form.find('input[name="field_accessibility_self_rpt"]').not(noneSelector); + + // Uncheck visible radios (attribute + property). + $otherRadios.removeAttr('checked').prop('checked', false); + + // Check the hidden _none radio to reset the field to an empty state. + $noneRadio.attr('checked', 'checked').prop('checked', true); + + // Announce the reset to screen reader users. + $('#' + liveRegionId).text( + Drupal.t('File accessibility status has been reset. Please make a new selection.') + ); + } + + // Re-hide _none after every AJAX update (Drupal may re-render it). + $(noneSelector).closest('.js-form-item').hide(); + }, 100); + }); + } + }; + +})(jQuery, Drupal, once); diff --git a/docroot/modules/custom/mass_fields/mass_fields.libraries.yml b/docroot/modules/custom/mass_fields/mass_fields.libraries.yml index 3cd0c29a38..ca44b3f089 100644 --- a/docroot/modules/custom/mass_fields/mass_fields.libraries.yml +++ b/docroot/modules/custom/mass_fields/mass_fields.libraries.yml @@ -2,3 +2,11 @@ reference.field: css: theme: css/reference-field.css: {} + +accessibility_status_reset: + js: + js/accessibility-status-reset.js: {} + dependencies: + - core/jquery + - core/drupal + - core/once diff --git a/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldType/ListLongLabelItem.php b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldType/ListLongLabelItem.php new file mode 100644 index 0000000000..bce08e6a59 --- /dev/null +++ b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldType/ListLongLabelItem.php @@ -0,0 +1,62 @@ +' . $this->t('The label can contain formatted text and HTML.'); + $description .= '
' . $this->t('The key is automatically generated as a machine name from the label and will be the stored value.'); + $description .= '

'; + return $description; + } + + /** + * {@inheritdoc} + */ + public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) { + // Get the parent form with machine name functionality. + $element = parent::storageSettingsForm($form, $form_state, $has_data); + + // Only change: replace textfield with textarea for long HTML labels. + foreach (Element::children($element['allowed_values']['table']) as $delta => $row) { + if (isset($element['allowed_values']['table'][$delta]['item']['label'])) { + $element['allowed_values']['table'][$delta]['item']['label']['#type'] = 'textarea'; + $element['allowed_values']['table'][$delta]['item']['label']['#rows'] = 5; + $element['allowed_values']['table'][$delta]['item']['label']['#title'] = $this->t('Label (HTML allowed)'); + $element['allowed_values']['table'][$delta]['item']['label']['#description'] = $this->t('Enter the option label. HTML tags allowed: <strong>, <em>, <p>, <br>, <a>, <ul>, <ol>, <li>, <span>, <small>.'); + } + } + + return $element; + } + +} diff --git a/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelDocumentSelfReportedAccessibilityStatusWidget.php b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelDocumentSelfReportedAccessibilityStatusWidget.php new file mode 100644 index 0000000000..669e3e6c2d --- /dev/null +++ b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelDocumentSelfReportedAccessibilityStatusWidget.php @@ -0,0 +1,67 @@ +getOptions($items->getEntity()); + $selected = $this->getSelectedOptions($items); + + // If required and there is one single option, preselect it. + if ($this->required && count($options) == 1) { + $selected = [array_key_first($options)]; + } + + // Move "_none" item to the bottom. + $none = array_shift($options); + $options['_none'] = $none; + + $element['#type'] = 'radios'; + $element['#options'] = $options; + $element['#default_value'] = $selected ? reset($selected) : '_none'; + + // Attach JavaScript library to reset accessibility status when file is removed. + $element['#attached']['library'][] = 'mass_fields/accessibility_status_reset'; + + return $element; + } + + /** + * {@inheritdoc} + */ + protected function getEmptyLabel() { + if (!$this->required && !$this->multiple) { + return new FormattableMarkup('TBD:
You can\'t publish this document unless you choose one of the other states.
', []); + } + } + +} diff --git a/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelWidget.php b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelWidget.php new file mode 100644 index 0000000000..16f56b9b34 --- /dev/null +++ b/docroot/modules/custom/mass_fields/src/Plugin/Field/FieldWidget/ListLongLabelWidget.php @@ -0,0 +1,66 @@ + $label) { + // Filter HTML to only allow specific tags, then mark as safe. + $filtered_label = Xss::filter($label, $allowed_tags); + $processed[$key] = new FormattableMarkup($filtered_label, []); + } + + return $processed; + } + + /** + * {@inheritdoc} + */ + protected function getEmptyLabel() { + if (!$this->required && !$this->multiple) { + return $this->t('N/A'); + } + + return NULL; + } + +}