Skip to content
Snippets Groups Projects
Commit d4350e2b authored by catch's avatar catch
Browse files

Issue #2962110 by samuel.mortenson, drpal, andrewmacpherson, ckrina,...

Issue #2962110 by samuel.mortenson, drpal, andrewmacpherson, ckrina, phenaproxima, yoroy, webchick, amateescu, chr.fritsch, starshaped, lauriii, webflo, Dennis Cohn, dawehner, seanB, rfmarcelino, DyanneNova, benjifisher, jan.stoeckler, danbohea, John Pitcairn: Add the Media Library module to Drupal core
parent 4dc2f4ae
No related branches found
No related tags found
2 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!789Issue #3210310: Adjust Database API to remove deprecated Drupal 9 code in Drupal 10
Showing
with 1208 additions and 0 deletions
...@@ -133,6 +133,7 @@ ...@@ -133,6 +133,7 @@
"drupal/locale": "self.version", "drupal/locale": "self.version",
"drupal/minimal": "self.version", "drupal/minimal": "self.version",
"drupal/media": "self.version", "drupal/media": "self.version",
"drupal/media_library": "self.version",
"drupal/menu_link_content": "self.version", "drupal/menu_link_content": "self.version",
"drupal/menu_ui": "self.version", "drupal/menu_ui": "self.version",
"drupal/migrate": "self.version", "drupal/migrate": "self.version",
......
langcode: en
status: true
dependencies:
enforced:
module:
- media_library
module:
- media
id: media.media_library
label: 'Media library'
targetEntityType: media
cache: true
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.media_library
enforced:
module:
- media_library
module:
- media
- user
id: media_library
label: 'Media library'
module: views
description: ''
tag: ''
base_table: media_field_data
base_field: mid
core: 8.x
display:
default:
display_plugin: default
id: default
display_title: Master
position: 0
display_options:
access:
type: perm
options:
perm: 'access media overview'
cache:
type: tag
options: { }
query:
type: views_query
options:
disable_sql_rewrite: false
distinct: false
replica: false
query_comment: ''
query_tags: { }
exposed_form:
type: basic
options:
submit_button: 'Apply Filters'
reset_button: false
reset_button_label: Reset
exposed_sorts_label: 'Sort by'
expose_sort_order: false
sort_asc_label: Asc
sort_desc_label: Desc
pager:
type: mini
options:
items_per_page: 25
offset: 0
id: 0
total_pages: null
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
tags:
previous: ‹‹
next: ››
style:
type: default
options:
grouping: { }
row_class: 'media-library-item js-click-to-select'
default_row_class: true
row:
type: fields
options:
default_field_elements: true
inline: { }
separator: ''
hide_empty: false
fields:
media_bulk_form:
id: media_bulk_form
table: media
field: media_bulk_form
relationship: none
group_type: group
admin_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: js-click-to-select__checkbox
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
action_title: Action
include_exclude: exclude
selected_actions: { }
entity_type: media
plugin_id: bulk_form
rendered_entity:
id: rendered_entity
table: media
field: rendered_entity
relationship: none
group_type: group
admin_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: media-library-item__content
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
view_mode: media_library
entity_type: media
plugin_id: rendered_entity
filters:
status:
id: status
table: media_field_data
field: status
relationship: none
group_type: group
admin_label: ''
operator: '='
value: '1'
group: 1
exposed: true
expose:
operator_id: ''
label: 'Publishing status'
description: null
use_operator: false
operator: status_op
identifier: status
required: true
remember: false
multiple: false
remember_roles:
authenticated: authenticated
is_grouped: true
group_info:
label: Published
description: ''
identifier: status
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items:
1:
title: Published
operator: '='
value: '1'
2:
title: Unpublished
operator: '='
value: '0'
plugin_id: boolean
entity_type: media
entity_field: status
name:
id: name
table: media_field_data
field: name
relationship: none
group_type: group
admin_label: ''
operator: contains
value: ''
group: 1
exposed: true
expose:
operator_id: name_op
label: Name
description: ''
use_operator: false
operator: name_op
identifier: name
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '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: { }
entity_type: media
entity_field: name
plugin_id: string
bundle:
id: bundle
table: media_field_data
field: bundle
relationship: none
group_type: group
admin_label: ''
operator: in
value: { }
group: 1
exposed: true
expose:
operator_id: bundle_op
label: 'Media type'
description: ''
use_operator: false
operator: bundle_op
identifier: type
required: false
remember: false
multiple: false
remember_roles:
authenticated: authenticated
anonymous: '0'
administrator: '0'
reduce: false
is_grouped: false
group_info:
label: 'Media type'
description: null
identifier: bundle
optional: true
widget: select
multiple: false
remember: false
default_group: All
default_group_multiple: { }
group_items:
1: { }
2: { }
3: { }
entity_type: media
entity_field: bundle
plugin_id: bundle
sorts:
created:
id: created
table: media_field_data
field: created
relationship: none
group_type: group
admin_label: ''
order: DESC
exposed: true
expose:
label: 'Newest first'
granularity: second
entity_type: media
entity_field: created
plugin_id: date
name:
id: name
table: media_field_data
field: name
relationship: none
group_type: group
admin_label: ''
order: ASC
exposed: true
expose:
label: 'Name (A-Z)'
entity_type: media
entity_field: name
plugin_id: standard
name_1:
id: name_1
table: media_field_data
field: name
relationship: none
group_type: group
admin_label: ''
order: DESC
exposed: true
expose:
label: 'Name (Z-A)'
entity_type: media
entity_field: name
plugin_id: standard
title: Media
header: { }
footer: { }
empty: { }
relationships: { }
arguments:
bundle:
id: bundle
table: media_field_data
field: bundle
relationship: none
group_type: group
admin_label: ''
default_action: ignore
exception:
value: all
title_enable: false
title: All
title_enable: false
title: ''
default_argument_type: fixed
default_argument_options:
argument: ''
default_argument_skip_url: false
summary_options:
base_path: ''
count: true
items_per_page: 25
override: false
summary:
sort_order: asc
number_of_records: 0
format: default_summary
specify_validation: false
validate:
type: none
fail: 'not found'
validate_options: { }
glossary: false
limit: 0
case: none
path_case: none
transform_dash: false
break_phrase: false
entity_type: media
entity_field: bundle
plugin_id: string
display_extenders: { }
use_ajax: true
css_class: media-library-view
cache_metadata:
max-age: 0
contexts:
- 'languages:language_interface'
- url
- url.query_args
- 'url.query_args:sort_by'
- user.permissions
tags: { }
page:
display_plugin: page
id: page
display_title: Page
position: 1
display_options:
display_extenders: { }
path: admin/content/media
menu:
type: tab
title: Media
description: 'Allows users to browse and administer media items'
expanded: false
parent: system.admin_content
weight: 5
context: '0'
menu_name: admin
cache_metadata:
max-age: 0
contexts:
- 'languages:language_interface'
- url
- url.query_args
- 'url.query_args:sort_by'
- user.permissions
tags: { }
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.media_library
- field.field.media.audio.field_media_audio_file
- image.style.thumbnail
- media.type.audio
module:
- image
id: media.audio.media_library
targetEntityType: media
bundle: audio
mode: media_library
content:
thumbnail:
type: image
weight: 0
region: content
label: hidden
settings:
image_style: thumbnail
image_link: ''
third_party_settings: { }
hidden:
created: true
field_media_audio_file: true
name: true
uid: true
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.media_library
- field.field.media.file.field_media_file
- image.style.thumbnail
- media.type.file
module:
- image
id: media.file.media_library
targetEntityType: media
bundle: file
mode: media_library
content:
thumbnail:
type: image
weight: 0
region: content
label: hidden
settings:
image_style: thumbnail
image_link: ''
third_party_settings: { }
hidden:
created: true
field_media_file: true
name: true
uid: true
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.media_library
- field.field.media.image.field_media_image
- image.style.medium
- media.type.image
module:
- image
id: media.image.media_library
targetEntityType: media
bundle: image
mode: media_library
content:
thumbnail:
type: image
weight: 0
region: content
label: hidden
settings:
image_style: medium
image_link: ''
third_party_settings: { }
hidden:
created: true
field_media_image: true
name: true
uid: true
langcode: en
status: true
dependencies:
config:
- core.entity_view_mode.media.media_library
- field.field.media.video.field_media_video_file
- image.style.thumbnail
- media.type.video
module:
- image
id: media.video.media_library
targetEntityType: media
bundle: video
mode: media_library
content:
thumbnail:
type: image
weight: 0
region: content
label: hidden
settings:
image_style: thumbnail
image_link: ''
third_party_settings: { }
hidden:
created: true
field_media_video_file: true
name: true
uid: true
/**
* @file media_library.module.css
*/
.media-library-page-form {
display: flex;
flex-wrap: wrap;
}
.media-library-page-form > .form-actions {
flex-basis: 100%;
}
.media-library-page-form__header > div,
.media-library-view .form--inline {
display: flex;
flex-wrap: wrap;
}
.media-library-page-form__header {
flex-basis: 100%;
}
.media-library-item {
position: relative;
}
.media-library-item .js-click-to-select__trigger {
overflow: hidden;
cursor: pointer;
}
.media-library-view .form-actions {
align-self: flex-end;
}
.media-library-item .js-click-to-select__checkbox {
position: absolute;
display: block;
z-index: 1;
top: 5px;
right: 0;
}
.media-library-item__status {
position: absolute;
top: 10px;
left: 2px;
pointer-events: none;
}
.media-library-select-all {
flex-basis: 100%;
}
@media screen and (max-width: 600px) {
.media-library-view .form-actions {
flex-basis: 100%;
}
}
/**
* @file media_library.theme.css
*
* @todo Move into the Seven theme when this module is marked as stable.
* @see https://www.drupal.org/project/drupal/issues/2980769
*/
.media-library-page-form__header .form-item {
margin-right: 8px;
}
#drupal-modal .view-header {
margin: 16px 0;
}
.media-library-item {
justify-content: center;
vertical-align: top;
padding: 2px;
border: 1px solid #ebebeb;
margin: 16px 16px 2px 2px;
width: 180px;
background: #fff;
transition: border-color 0.2s, color 0.2s, background 0.2s;
}
.media-library-view .form-actions {
margin: 0.75em 0;
}
.media-library-item .field--name-thumbnail {
background-color: #ebebeb;
margin: 2px;
overflow: hidden;
text-align: center;
}
.media-library-item .field--name-thumbnail img {
height: 180px;
object-fit: contain;
object-position: center center;
}
.media-library-item.is-hover,
.media-library-item.checked,
.media-library-item.is-focus {
border-color: #40b6ff;
border-width: 3px;
border-radius: 3px;
margin: 14px 14px 0 0;
}
.media-library-item.checked {
border-color: #0076c0;
}
.media-library-item .js-click-to-select__checkbox input {
width: 30px;
height: 30px;
}
.media-library-item .js-click-to-select__checkbox .form-item {
margin: 0;
}
.media-library-item__preview {
padding-bottom: 44px;
}
.media-library-item__status {
color: #e4e4e4;
font-style: italic;
background: #666;
padding: 5px 10px;
font-size: 12px;
}
.media-library-item .views-field-operations {
height: 30px;
}
.media-library-item .views-field-operations .dropbutton-wrapper {
display: inline-block;
position: absolute;
right: 5px;
bottom: 5px;
}
.media-library-item__attributes {
position: absolute;
bottom: 0;
display: block;
padding: 10px;
max-width: calc(100% - 20px);
max-height: calc(100% - 60px);
overflow: hidden;
background: white;
}
.media-library-item__name {
font-size: 14px;
}
.media-library-item__name a {
display: block;
text-decoration: underline;
margin: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.media-library-item__attributes:hover .media-library-item__name a,
.media-library-item__name a:focus,
.media-library-item.is-focus .media-library-item__name a,
.media-library-item.checked .media-library-item__name a {
white-space: normal;
}
.media-library-item__name a:focus {
border: 2px solid;
margin: 0;
}
.media-library-item__type {
font-size: 12px;
color: #696969;
}
.media-library-select-all {
margin: 10px 0 10px 0;
}
.media-library-select-all input {
margin-right: 10px;
}
@media screen and (max-width: 600px) {
.media-library-item {
width: 150px;
}
.media-library-item .field--name-thumbnail img {
height: 150px;
width: 150px;
}
.media-library-item .views-field-operations .dropbutton-wrapper {
position: relative;
right: 0;
border: 0;
}
}
/**
* @file media_library.click_to_select.es6.js
*/
(($, Drupal) => {
/**
* Allows users to select an element which checks a hidden checkbox.
*/
Drupal.behaviors.ClickToSelect = {
attach(context) {
$('.js-click-to-select__trigger', context)
.once('media-library-click-to-select')
.on('click', (event) => {
// Links inside the trigger should not be click-able.
event.preventDefault();
// Click the hidden checkbox when the trigger is clicked.
const $input = $(event.currentTarget)
.closest('.js-click-to-select')
.find('.js-click-to-select__checkbox input');
$input.prop('checked', !$input.prop('checked')).trigger('change');
});
$('.js-click-to-select__checkbox input', context)
.once('media-library-click-to-select')
.on('change', ({ currentTarget }) => {
$(currentTarget)
.closest('.js-click-to-select')
.toggleClass('checked', $(currentTarget).prop('checked'));
});
},
};
})(jQuery, Drupal);
/**
* DO NOT EDIT THIS FILE.
* See the following change record for more information,
* https://www.drupal.org/node/2815083
* @preserve
**/
(function ($, Drupal) {
Drupal.behaviors.ClickToSelect = {
attach: function attach(context) {
$('.js-click-to-select__trigger', context).once('media-library-click-to-select').on('click', function (event) {
event.preventDefault();
var $input = $(event.currentTarget).closest('.js-click-to-select').find('.js-click-to-select__checkbox input');
$input.prop('checked', !$input.prop('checked')).trigger('change');
});
$('.js-click-to-select__checkbox input', context).once('media-library-click-to-select').on('change', function (_ref) {
var currentTarget = _ref.currentTarget;
$(currentTarget).closest('.js-click-to-select').toggleClass('checked', $(currentTarget).prop('checked'));
});
}
};
})(jQuery, Drupal);
\ No newline at end of file
/**
* @file media_library.view.es6.js
*/
(($, Drupal) => {
/**
* Adds hover effect to media items.
*/
Drupal.behaviors.MediaLibraryHover = {
attach(context) {
$('.media-library-item .js-click-to-select__trigger,.media-library-item .js-click-to-select__checkbox', context).once('media-library-item-hover')
.on('mouseover mouseout', ({ currentTarget, type }) => {
$(currentTarget).closest('.media-library-item').toggleClass('is-hover', type === 'mouseover');
});
},
};
/**
* Adds focus effect to media items.
*/
Drupal.behaviors.MediaLibraryFocus = {
attach(context) {
$('.media-library-item .js-click-to-select__checkbox input', context).once('media-library-item-focus')
.on('focus blur', ({ currentTarget, type }) => {
$(currentTarget).closest('.media-library-item').toggleClass('is-focus', type === 'focus');
});
},
};
/**
* Adds checkbox to select all items in the library.
*/
Drupal.behaviors.MediaLibrarySelectAll = {
attach(context) {
const $view = $('.media-library-view', context).once('media-library-select-all');
if ($view.length && $view.find('.media-library-item').length) {
const $checkbox = $('<input type="checkbox" class="form-checkbox" />')
.on('click', ({ currentTarget }) => {
// Toggle all checkboxes.
const $checkboxes = $(currentTarget)
.closest('.media-library-view')
.find('.media-library-item input[type="checkbox"]');
$checkboxes
.prop('checked', $(currentTarget).prop('checked'))
.trigger('change');
// Announce the selection.
const announcement = $(currentTarget).prop('checked') ?
Drupal.t('Zero items selected') :
Drupal.t('All @count items selected', { '@count': $checkboxes.length });
Drupal.announce(announcement);
});
const $label = $('<label class="media-library-select-all"></label>')
.text(Drupal.t('Select all media'));
$label.prepend($checkbox);
$view.find('.media-library-item').first().before($label);
}
},
};
})(jQuery, Drupal);
/**
* DO NOT EDIT THIS FILE.
* See the following change record for more information,
* https://www.drupal.org/node/2815083
* @preserve
**/
(function ($, Drupal) {
Drupal.behaviors.MediaLibraryHover = {
attach: function attach(context) {
$('.media-library-item .js-click-to-select__trigger,.media-library-item .js-click-to-select__checkbox', context).once('media-library-item-hover').on('mouseover mouseout', function (_ref) {
var currentTarget = _ref.currentTarget,
type = _ref.type;
$(currentTarget).closest('.media-library-item').toggleClass('is-hover', type === 'mouseover');
});
}
};
Drupal.behaviors.MediaLibraryFocus = {
attach: function attach(context) {
$('.media-library-item .js-click-to-select__checkbox input', context).once('media-library-item-focus').on('focus blur', function (_ref2) {
var currentTarget = _ref2.currentTarget,
type = _ref2.type;
$(currentTarget).closest('.media-library-item').toggleClass('is-focus', type === 'focus');
});
}
};
Drupal.behaviors.MediaLibrarySelectAll = {
attach: function attach(context) {
var $view = $('.media-library-view', context).once('media-library-select-all');
if ($view.length && $view.find('.media-library-item').length) {
var $checkbox = $('<input type="checkbox" class="form-checkbox" />').on('click', function (_ref3) {
var currentTarget = _ref3.currentTarget;
var $checkboxes = $(currentTarget).closest('.media-library-view').find('.media-library-item input[type="checkbox"]');
$checkboxes.prop('checked', $(currentTarget).prop('checked')).trigger('change');
var announcement = $(currentTarget).prop('checked') ? Drupal.t('Zero items selected') : Drupal.t('All @count items selected', { '@count': $checkboxes.length });
Drupal.announce(announcement);
});
var $label = $('<label class="media-library-select-all"></label>').text(Drupal.t('Select all media'));
$label.prepend($checkbox);
$view.find('.media-library-item').first().before($label);
}
}
};
})(jQuery, Drupal);
\ No newline at end of file
name: 'Media library'
type: module
description: 'Provides a library for re-using Media Items.'
package: Core (Experimental)
version: VERSION
core: 8.x
dependencies:
- drupal:media
- drupal:views
- drupal:user
<?php
/**
* @file
* Install, update and uninstall functions for the media_library module.
*/
use Drupal\views\Entity\View;
/**
* Implements hook_install().
*/
function media_library_install() {
// Change the path to the original media view.
/** @var \Drupal\views\Entity\View $view */
if ($view = View::load('media')) {
$display = &$view->getDisplay('media_page_list');
if (!empty($display)) {
$display['display_options']['path'] = 'admin/content/media-table';
unset($display['display_options']['menu']);
$view->trustData()->save();
}
}
}
/**
* Implements hook_uninstall().
*/
function media_library_uninstall() {
// Restore the path to the original media view.
/** @var \Drupal\views\Entity\View $view */
if ($view = View::load('media')) {
$display = &$view->getDisplay('media_page_list');
if (!empty($display)) {
$display['display_options']['path'] = 'admin/content/media';
$display['display_options']['menu'] = [
'type' => 'tab',
'title' => 'Media',
'description' => '',
'expanded' => FALSE,
'parent' => '',
'weight' => 0,
'context' => '0',
'menu_name' => 'main',
];
$view->trustData()->save();
}
}
}
style:
version: VERSION
css:
component:
css/media_library.module.css: {}
theme:
css/media_library.theme.css: {}
click_to_select:
version: VERSION
js:
js/media_library.click_to_select.js: {}
dependencies:
- core/drupal
- core/jquery.once
view:
version: VERSION
js:
js/media_library.view.js: {}
dependencies:
- media_library/style
- media_library/click_to_select
- core/drupal.announce
- core/jquery.once
media_library.add:
route_name: entity.media.add_page
title: 'Add media'
appears_on:
- view.media_library.page
media_library.grid:
title: 'Grid'
parent_id: entity.media.collection
route_name: entity.media.collection
weight: 10
media_library.table:
title: 'Table'
parent_id: entity.media.collection
route_name: view.media.media_page_list
weight: 20
<?php
/**
* @file
* Contains hook implementations for the media_library module.
*/
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\views\Plugin\views\cache\CachePluginBase;
use Drupal\views\ViewExecutable;
use Drupal\Core\Template\Attribute;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
/**
* Implements hook_help().
*
* @todo Update in https://www.drupal.org/project/drupal/issues/2964789
*/
function media_library_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.media_library':
$output = '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The Media library module overrides the /admin/content/media view to provide a rich visual interface for performing administrative operations on media. For more information, see the <a href=":media">online documentation for the Media library module</a>.', [':media' => 'https://www.drupal.org/docs/8/core/modules/media']) . '</p>';
return $output;
}
}
/**
* Implements hook_theme().
*/
function media_library_theme() {
return [
'media__media_library' => [
'base hook' => 'media',
],
];
}
/**
* Implements hook_views_post_render().
*/
function media_library_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) {
if ($view->id() === 'media_library') {
$output['#attached']['library'][] = 'media_library/view';
}
}
/**
* Implements hook_preprocess_media().
*/
function media_library_preprocess_media(&$variables) {
if ($variables['view_mode'] === 'media_library') {
/** @var \Drupal\media\MediaInterface $media */
$media = $variables['media'];
$variables['#cache']['contexts'][] = 'user.permissions';
$rel = $media->access('edit') ? 'edit-form' : 'canonical';
$variables['url'] = $media->toUrl($rel, [
'language' => $media->language(),
]);
$variables['preview_attributes'] = new Attribute();
$variables['preview_attributes']->addClass('media-library-item__preview', 'js-click-to-select__trigger');
$variables['metadata_attributes'] = new Attribute();
$variables['metadata_attributes']->addClass('media-library-item__attributes');
$variables['status'] = $media->isPublished();
}
}
/**
* Alter the bulk form to add a more accessible label.
*
* @param array $form
* An associative array containing the structure of the form.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
*
* @todo Remove in https://www.drupal.org/project/drupal/issues/2969660
*/
function media_library_form_views_form_media_library_page_alter(array &$form, FormStateInterface $form_state) {
if (isset($form['media_bulk_form']) && isset($form['output'])) {
$form['#attributes']['class'][] = 'media-library-page-form';
$form['header']['#attributes']['class'][] = 'media-library-page-form__header';
/** @var \Drupal\views\ViewExecutable $view */
$view = $form['output'][0]['#view'];
foreach (Element::getVisibleChildren($form['media_bulk_form']) as $key) {
if (isset($view->result[$key])) {
$media = $view->field['media_bulk_form']->getEntity($view->result[$key]);
$form['media_bulk_form'][$key]['#title'] = t('Select @label', [
'@label' => $media->label(),
]);
}
}
}
}
/**
* Implements hook_local_tasks_alter().
*
* Removes tasks for the Media library if the view display no longer exists.
*/
function media_library_local_tasks_alter(&$local_tasks) {
/** @var \Symfony\Component\Routing\RouteCollection $route_collection */
$route_collection = \Drupal::service('router')->getRouteCollection();
foreach (['media_library.grid', 'media_library.table'] as $key) {
if (isset($local_tasks[$key]) && !$route_collection->get($local_tasks[$key]['route_name'])) {
unset($local_tasks[$key]);
}
}
}
{#
/**
* @file
* Default theme implementation to present a media entity in the media library.
*
* Available variables:
* - media: The entity with limited access to object properties and methods.
* Only method names starting with "get", "has", or "is" and a few common
* methods such as "id", "label", and "bundle" are available. For example:
* - entity.getEntityTypeId() will return the entity type ID.
* - entity.hasField('field_example') returns TRUE if the entity includes
* field_example. (This does not indicate the presence of a value in this
* field.)
* Calling other methods, such as entity.delete(), will result in an exception.
* See \Drupal\Core\Entity\EntityInterface for a full list of methods.
* - name: Name of the media.
* - content: Media content.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
* - view_mode: View mode; for example, "teaser" or "full".
* - attributes: HTML attributes for the containing element.
* - title_attributes: Same as attributes, except applied to the main title
* tag that appears in the template.
* - url: Direct URL of the media.
* - preview_attributes: HTML attributes for the preview wrapper.
* - metadata_attributes: HTML attributes for the expandable metadata area.
* - status: Whether or not the Media is published.
*
* @see template_preprocess_media()
*
* @ingroup themeable
*/
#}
<article{{ attributes }}>
{% if content %}
<div{{ preview_attributes }}>
{{ content|without('name') }}
</div>
{% if not status %}
<div class="media-library-item__status">{{ "unpublished" | t }}</div>
{% endif %}
<div{{ metadata_attributes }}>
<div class="media-library-item__name">
<a href="{{ url }}" rel="bookmark">{{ name }}</a>
</div>
</div>
{% endif %}
</article>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment