Account created on 24 November 2009, over 15 years ago
#

Merge Requests

Recent comments

🇺🇸United States cboyden

Patch is attached. One potential issue is that none of the core patches still apply to the current version of Drupal core, 10.4.5 I've included a list of them here:

"Issue #2010132: Forum term canonical links": "https://www.drupal.org/files/issues/2020-10-24/2010132-132.patch",
"Issue #2999235: Image Formatter Links When No Access": "https://www.drupal.org/files/issues/2019-05-02/drupal-image_formatter_links-2999235-7.patch",
"Issue #2922569: Filtering incorrectly on 'Summary or Trimmed' fields": "https://www.drupal.org/files/issues/2024-06-21/issue-2922569-103-no-test.patch",
"Issue #2653938: Views filter default values overridden": "https://www.drupal.org/files/issues/2021-02-01/drupal-views-filter-default-all-2653938-22.patch"
🇺🇸United States cboyden

I think this needs reopening, the patch is not fixing the issue.

/**
 * Implements hook_modules_installed().
 */
function panopoly_wysiwyg_modules_installed(array $modules) {

  user_role_grant_permissions('anonymous', [
    'use text format restricted_html',
  ]);
  user_role_grant_permissions('authenticated', [
    'use text format restricted_html',
    'use text format panopoly_wysiwyg_basic',
  ]);
  user_role_grant_permissions('editor', [
    'use text format restricted_html',
    'use text format panopoly_wysiwyg_basic',
  ]);

}

Unfortunately this is not how hook_modules_installed works. The hook for panopoly_wysiwyg doesn't run when panopoly_wysiwyg is installed, it runs when any module is installed after panopoly_wysiwyg.

Instead the hook should probably be moved to panopoly.install and specifically look for panopoly_wysiwyg. If anyone's using the module without the install profile, they can grant the permissions in some other way. New patch forthcoming.

🇺🇸United States cboyden

Here are the available updates:

ctools: 4.1.0
layout_builder_modal: 2.0.0
image_widget_crop: 3.0.0
dropzonejs: 8.x-2.11
entity_embed: 8.x-1.7
inline_entity_form: 3.0.0-rc20
facets: 3.0.0
linkit: 7.0.3

🇺🇸United States cboyden

The MR adds a simple check for a non-empty vid from the latest revision. If it's empty, the condition is treated the same as if the node object was empty.

🇺🇸United States cboyden

I've created an issue fork from 11.x and ported the changes from patch #20. Still needs updated tests.

🇺🇸United States cboyden

The placeholder labels still cause an issue when trying to style the LB interface. Is the approach in this ticket still being considered, or are there other proposed solutions?

🇺🇸United States cboyden

I'm testing the latest dev of the 2.0.x branch, including this commit, and it's still outputting aria-label inappropriately.

To reproduce:

  1. Install Drupal core 10.3.6 using the standard profile.
  2. Require extlink at 2.0.x-dev via composer.
  3. Log in as an administrator.
  4. Enable the extlink module.
  5. In the extlink settings, check the checkbox for "Use Font Awesome icons instead of images" and save the configuration.
  6. Rebuild the site cache.
  7. View the automatically-generated home page content of the standard profile, which includes external links.
  8. Using the browser code inspector, view the code for the "Drupal community" link:
<a href="https://www.drupal.org/community" class="ext" data-extlink="" rel="noreferrer">Drupal 
  <span class="extlink-nobreak" aria-label="(link is external)">community
    <span class="fa-ext extlink" role="img" aria-hidden="false">
      <i class="fa fa-external-link" data-extlink-placement="append">
      </i>
      <span class="visually-hidden"></span>
    </span>
  </span>
</a>

First, the aria-label attribute is being output on a nested span tag. The attribute isn't intended for use on elements with a generic role, including the HTML div and span tags. Most assistive technologies will ignore aria-label on generic tags.

Second, the aria-hidden attribute doesn't need to be added if the value is "false." See aria-hidden where the Note says "At the time of this writing, aria-hidden="false" is known to work inconsistently in browsers. As future implementations improve, use caution and test thoroughly before relying on this approach." In the proposed draft for ARIA 1.3, the "false" value is supposed to be handled the same as if it's undefined (i.e. attribute is not present).

Third, the span containing the FA icon markup has a role of "img" and is not hidden from assistive technology, which means it should have something in the way of alt text, but the markup inside that span doesn't contain any text.

🇺🇸United States cboyden

Re-rolled patch to apply to latest release.

🇺🇸United States cboyden

Thanks, the patch is working and not creating any PHP notices. There is some extra stuff in it though, there are some panopoly_media files included in the patch.

🇺🇸United States cboyden

Also, there are a bunch of PHP warnings in the log.

For example:

Warning: Undefined array key "created_op" in Drupal\views\Plugin\views\filter\Date->acceptExposedInput() (line 144 of /var/www/html/web/core/modules/views/src/Plugin/views/filter/Date.php)
#0 /var/www/html/web/core/includes/bootstrap.inc(166): _drupal_error_handler_real(2, 'Undefined array...', '/var/www/html/w...', 144)
#1 /var/www/html/web/core/modules/views/src/Plugin/views/filter/Date.php(144): _drupal_error_handler(2, 'Undefined array...', '/var/www/html/w...', 144)
#2 /var/www/html/web/profiles/contrib/panopoly/modules/panopoly/panopoly_magic/src/Plugin/views/display/MagicBlock.php(626): Drupal\views\Plugin\views\filter\Date->acceptExposedInput(Array)
#3 /var/www/html/web/profiles/contrib/panopoly/modules/panopoly/panopoly_magic/src/Plugin/Block/MagicViewsBlock.php(21): Drupal\panopoly_magic\Plugin\views\display\MagicBlock->preBlockBuild(Object(Drupal\panopoly_magic\Plugin\Block\MagicViewsBlock))
#4 /var/www/html/web/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php(106): Drupal\panopoly_magic\Plugin\Block\MagicViewsBlock->build()
#5 [internal function]: Drupal\layout_builder\EventSubscriber\BlockComponentRenderArray->onBuildRender(Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#6 /var/www/html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(111): call_user_func(Array, Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#7 /var/www/html/web/core/modules/layout_builder/src/SectionComponent.php(90): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...')
#8 /var/www/html/web/modules/contrib/page_manager/src/Plugin/DisplayVariant/LayoutBuilderDisplayVariant.php(107): Drupal\layout_builder\SectionComponent->toRenderArray(Array, false)
#9 /var/www/html/web/modules/contrib/page_manager/src/Entity/PageVariantViewBuilder.php(29): Drupal\page_manager\Plugin\DisplayVariant\LayoutBuilderDisplayVariant->build()
#10 /var/www/html/web/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php(134): Drupal\page_manager\Entity\PageVariantViewBuilder->view(Object(Drupal\page_manager\Entity\PageVariant), 'full')
#11 [internal function]: Drupal\Core\Entity\Controller\EntityViewController->view(Object(Drupal\page_manager\Entity\PageVariant), 'full')
#12 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#13 /var/www/html/web/core/lib/Drupal/Core/Render/Renderer.php(638): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#14 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#15 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
#16 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(181): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#17 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#18 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(53): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#19 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#20 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ContentLength.php(28): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#21 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#22 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#23 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#24 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#25 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/AjaxPageState.php(36): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#26 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\AjaxPageState->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#27 /var/www/html/web/core/lib/Drupal/Core/DrupalKernel.php(741): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#28 /var/www/html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#29 {main}

There are 4 other PHP warnings about the same function Drupal\views\Plugin\views\filter\Date->acceptExposedInput(), and then there's a deprecated function notice:

Deprecated function: strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated in Drupal\views\Plugin\views\filter\Date->opSimple() (line 185 of /var/www/html/web/core/modules/views/src/Plugin/views/filter/Date.php)
#0 /var/www/html/web/core/includes/bootstrap.inc(166): _drupal_error_handler_real(8192, 'strtotime(): Pa...', '/var/www/html/w...', 185)
#1 [internal function]: _drupal_error_handler(8192, 'strtotime(): Pa...', '/var/www/html/w...', 185)
#2 /var/www/html/web/core/modules/views/src/Plugin/views/filter/Date.php(185): strtotime(NULL, 0)
#3 /var/www/html/web/core/modules/views/src/Plugin/views/filter/NumericFilter.php(339): Drupal\views\Plugin\views\filter\Date->opSimple('node_field_data...')
#4 /var/www/html/web/core/modules/views/src/ViewExecutable.php(1432): Drupal\views\Plugin\views\filter\NumericFilter->query(false)
#5 /var/www/html/web/core/modules/views/src/ViewExecutable.php(1321): Drupal\views\ViewExecutable->_build('filter')
#6 /var/www/html/web/core/modules/views/src/ViewExecutable.php(1450): Drupal\views\ViewExecutable->build(NULL)
#7 /var/www/html/web/core/modules/views/src/ViewExecutable.php(1513): Drupal\views\ViewExecutable->execute(NULL)
#8 /var/www/html/web/core/modules/views/src/Plugin/views/display/Block.php(133): Drupal\views\ViewExecutable->render()
#9 /var/www/html/web/core/modules/views/src/ViewExecutable.php(1689): Drupal\views\Plugin\views\display\Block->execute()
#10 /var/www/html/web/core/modules/views/src/Element/View.php(81): Drupal\views\ViewExecutable->executeDisplay('demo_listing', Array)
#11 /var/www/html/web/profiles/contrib/panopoly/modules/panopoly/panopoly_magic/src/Plugin/Block/MagicViewsBlock.php(78): Drupal\views\Element\View::preRenderViewElement(Array)
#12 /var/www/html/web/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php(106): Drupal\panopoly_magic\Plugin\Block\MagicViewsBlock->build()
#13 [internal function]: Drupal\layout_builder\EventSubscriber\BlockComponentRenderArray->onBuildRender(Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#14 /var/www/html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(111): call_user_func(Array, Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#15 /var/www/html/web/core/modules/layout_builder/src/SectionComponent.php(90): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent), 'section_compone...')
#16 /var/www/html/web/modules/contrib/page_manager/src/Plugin/DisplayVariant/LayoutBuilderDisplayVariant.php(107): Drupal\layout_builder\SectionComponent->toRenderArray(Array, false)
#17 /var/www/html/web/modules/contrib/page_manager/src/Entity/PageVariantViewBuilder.php(29): Drupal\page_manager\Plugin\DisplayVariant\LayoutBuilderDisplayVariant->build()
#18 /var/www/html/web/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php(134): Drupal\page_manager\Entity\PageVariantViewBuilder->view(Object(Drupal\page_manager\Entity\PageVariant), 'full')
#19 [internal function]: Drupal\Core\Entity\Controller\EntityViewController->view(Object(Drupal\page_manager\Entity\PageVariant), 'full')
#20 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#21 /var/www/html/web/core/lib/Drupal/Core/Render/Renderer.php(638): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#22 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#23 /var/www/html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
#24 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(181): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#25 /var/www/html/vendor/symfony/http-kernel/HttpKernel.php(76): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#26 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(53): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#27 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(48): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#28 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ContentLength.php(28): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#29 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\ContentLength->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#30 /var/www/html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#31 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(48): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#32 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(51): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#33 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/AjaxPageState.php(36): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#34 /var/www/html/web/core/lib/Drupal/Core/StackMiddleware/StackedHttpKernel.php(51): Drupal\Core\StackMiddleware\AjaxPageState->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#35 /var/www/html/web/core/lib/Drupal/Core/DrupalKernel.php(741): Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#36 /var/www/html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#37 {main}
🇺🇸United States cboyden

I think this is almost there. When following the steps in #6 while using the previous patch, the initial preview in the choose block dialog and in the configure dialog doesn't show any items. When you make any change to the config that causes preview to fire again, the items display as expected.

Starting just after step 10 above:

  1. Click the Layout tab.
  2. Click Add block.
  3. Select the Demo category.
  4. Click List of demo items, to show the preview in the "Choose a block" dialog.
  5. Note there are no items displayed.
  6. Click Add.
  7. In the Configure dialog preview, note there are no items displayed.
  8. Select the "Featured" radio button from the "View mode" section.
  9. Note there are three items displayed in the preview.
🇺🇸United States cboyden

The latest patch fixes the states and the JS error, but there's one more thing. Depending on which operator is chosen, the view is filtered, but I wouldn't expect any filter to take effect until you enter a date.

Steps to reproduce:

  1. Download the latest version of Panopoly 3.0.x and apply the latest patch.
  2. Install the site with demo content.
  3. Log in as an administrator.
  4. Edit the Panopoly Demo view to add an exposed date filter: Filter on the Authored On date of the content item. Choose the operator "Is less than" as the default. Also expose the operator.
  5. Save the view.
  6. In the Views UI preview, note that there are three items displayed.
  7. Change the operator in the Views UI preview to "Is between" and click Apply.
  8. Note that there are still three items displayed. This is the expected behavior; you haven't entered a date for the filter, so all content is still showing.
  9. Clear caches.
  10. Create a new Landing page.
  11. Customize the page, adding the Demo view to the layout.
  12. Make sure the operator dropdown shows "Is less than."
  13. Note the preview shows no items.
  14. Change the operator to "Is greater than."
  15. Note the preview shows 3 items.
  16. Change the operator to "Is less than or equal to."
  17. Note the preview shows no items.
  18. Save the block and save the layout.
  19. Note there are no items displayed in the view.

Expected behavior: Regardless of the operator dropdown, the block preview should show all otherwise-unfiltered items until the editor puts in their date(s).

🇺🇸United States cboyden

See screenshot of fieldset with three date fields where only one should be available:

🇺🇸United States cboyden

The patch fixes things when the operator is not exposed, but if it's exposed, there are JS errors in the console. It looks like the states that control the appearance of the single date field vs. the min/max fields used for Between operators are broken.

Steps to reproduce:

  1. Download the latest version of Panopoly 3.0.x and apply the patch.
  2. Install the site with demo content.
  3. Log in as an administrator.
  4. Create a new Content page.
  5. Edit the Panopoly Demo view to add an exposed date filter: Filter on the Authored On date of the content item. Choose the operator "greater or equal" as the default. Also expose the operator.
  6. Save the view.
  7. In the Views UI preview, set the exposed sorts to Post date, Desc. You should see your new content item at the top of the list, followed by 2 of the 3 demo items.
  8. Change the operator in the Views UI preview to "Is between."
  9. Note the single date field disappears and is replaced by a set of Min and Max fields.
  10. In the Min filter field, enter the date "2024-06-01"; in the Max filter field, enter "2024-08-01" (or a date later than today's) and click Apply.
  11. Because the authored on dates of the demo content are quite old (2012), you will only see the item you just created in the preview. This is the expected behavior.
  12. Save the View.
  13. Clear caches.
  14. Create a new Landing page.
  15. Customize the page, adding the Demo view to the layout.
  16. Make sure the operator dropdown shows "Is greater than"
  17. Note the "Authored on" fieldset shows the operator dropdown and also three fields: one unlabeled, one labeled Min, and one labeled Max.
  18. Open the browser's JS console.
  19. In the block config, change the Sort order control back and forth between Ascending and Descending a few times.
  20. Note there is a JS error in the console each time you change the sort order.
  21. Change the operator to "Is between."
  22. Clear the browser JS console.
  23. In the block config, change the Sort order control back and forth between Ascending and Descending a few times.
  24. Note there are no JS errors this time.
  25. Note there is no content displayed in the Preview.
  26. In the Min filter field, enter the date "2024-06-01"; in the Max filter field, enter "2024-08-01" (or a date later than today's) and click Preview.
  27. Note there is still no content displayed in the Preview.

The JS error is:

message: 
"An AJAX HTTP error occurred.
HTTP Result Code: 200
Debugging information follows.
Path: /layout_builder/add/block/overrides/node.6/0/contentmain/views_block%3Apanopoly_demo-demo_listing?_wrapper_format=drupal_dialog&ajax_form=1
StatusText: parsererror
ResponseText: TypeError: strtotime(): Argument #1 ($datetime) must be of type string, array given in strtotime() (line 185 of /var/www/html/web/core/modules/views/src/Plugin/views/filter/Date.php)."
name: "AjaxError"
stack: "Error
at https://panopoly.localhost/core/misc/ajax.js?v=10.3.0:196:32
at https://panopoly.localhost/core/misc/ajax.js?v=10.3.0:1921:3"
🇺🇸United States cboyden

See MR and attached patch. This works locally in my testing.

🇺🇸United States cboyden

Here's a minimal patch that should keep Views blocks without an entity base table from being able to change display type. I wasn't able to figure out a way to hide the option in the Views UI, so Views can still be configured to allow changing display type, but the options won't be available on the block config if there's no base table.

🇺🇸United States cboyden

This new patch is a total kludge but it does manage to get the correct view modes for a Search API view that uses a single datasource.

🇺🇸United States cboyden

As it turns out Search API can have multiple types of entities as data sources in the same index, so it's not feasible to just assume that everything is a node. And if there are multiple data sources, they won't necessarily all have the same view modes configured. Maybe there's a way to query the search index to see if there are multiple data sources (in which case, switching view modes maybe shouldn't be allowed) or only one (in which case we need the entity type just as if it were a regular view).

🇺🇸United States cboyden

Here's a patch with a proof of concept that is working on a Panopoly child distribution

🇺🇸United States cboyden

Yes, this looks good. Part of the issue was that on a small screen, the fields that appear after you click the Reusable checkbox were below the fold. But it's working as expected now.

🇺🇸United States cboyden

Tested on a child distribution and it's working as expected.

🇺🇸United States cboyden

See 🐛 RuntimeException while trying to render item Active for some avenues to investigate. Looks like it may be related to views exposed filters.

🇺🇸United States cboyden

Unsupported D7 projects/branches can't be marked as supported again on drupal.org. I work with a distribution that includes this module. In order to make sure it is supported while we migrate existing sites, I'm planning to follow the unofficial D7 Security Group process to fork it and create a supported release.

🇺🇸United States cboyden

Reroll of patch #6 that removes frameborder attribute.

🇺🇸United States cboyden

The work-in-progress MR does these things:

Provides a Media-fied version of the File and Image widgets, and hides the plain versions of them from the Add Content dialog.
Adds more entity browser plugins to handle different field types.
Removes the Type exposed filter on the Media Browser view so it only shows up if more than one type is allowed for the field.
Adds a view to supersede the built-in admin Media view. The Panopoly view includes an exposed Tags filter.

This could use some review as to approach.

🇺🇸United States cboyden

We've been using this on a child distribution and it's working fine.

🇺🇸United States cboyden

The 10.0/10.1 patch still applies manually to 10.2.x with a bunch of offsets. I've uploaded a new version that should apply to 10.2.x cleanly.

🇺🇸United States cboyden

Updated the patch from #33 to apply cleanly to the latest version.

🇺🇸United States cboyden

There are additional patches for PHP compatibility in Views and CTools.

🇺🇸United States cboyden

There are some additional patches - mostly authored or reviewed by @dsnopek - for Tablefield, File Entity, and Menu Block. We've been using these on a child distribution for a while.

🇺🇸United States cboyden

Removed Date patch that only affected module tests.

🇺🇸United States cboyden

Updated patch is attached.

🇺🇸United States cboyden

There's a new release of Search API which fixes the bug. Also there are updates to Facet API, Search API DB, and Search API Solr which fix some bugs and improve compatibility with PHP 8.2.

Updated patch includes:

🇺🇸United States cboyden

There are some more contrib updates and some patches that are needed for Panopoly to run on PHP 8.2:

Updated patch is attached.

🇺🇸United States cboyden

This is still an issue with the latest versions of Media and File Entity 2.x. I've updated the patch so it applies to the latest version of Media.

🇺🇸United States cboyden

@Luke.Leber because all we're doing is adding the aria-current attribute in places where core is already adding the is-active class, I would hope that the ActiveLinkResponseFilter class would do the right thing with menus that contain anchor links. If core is not already adding the is-active class where it needs adding, or if it's adding the class to multiple anchor links in the same menu, it might be best to fix that in a separate issue.

🇺🇸United States cboyden

Here's a patch that works in my testing. The broken revision comparison no longer causes a type error. It seems pretty unlikely that the data passed to the function will be an object, but if it's important to consider that case, I can update the patch to account for that.

🇺🇸United States cboyden

Thanks for the review @smustgrave. I took a look at the admin toolbar on the standard install and noted that aria-current is being set to "page" for the active link in the toolbar. To reproduce:

  1. Install the latest version of Drupal from this issue MR using the standard profile.
  2. Log in as an administrator.
  3. In the Manage menu, click Appearance.
  4. While on the Appearance page, inspect the code for the Appearance link.
  5. Note the is-active class is set and the aria-current attribute is set.
  6. Click the Settings tab/link.
  7. While on the Settings page, inspect the code for the Settings tab/link.
  8. Note the is-active class is set and the aria-current attribute is set.
  9. While still on the Settings page, inspect the code for the Appearance tab/link.
  10. Note the is-active class is set, but the aria-current attribute is NOT set.
  11. Click the Olivero tab/link.
  12. While on the Olivero page, inspect the code for the Olivero tab/link.
  13. Note the is-active class is set and the aria-current attribute is set.
  14. While still on the Olivero page, inspect the code for the Settings tab/link.
  15. Note the is-active class is set, but the aria-current attribute is NOT set.

This seems like the appropriate behavior to me - the links in the hierarchy above where you are have the visual styling, but only the actual current page has the aria-current attribute.

🇺🇸United States cboyden

I've updated the MR to include a fix for ActiveLinkResponseFilterTest. I'm also attaching new patches for 9.5.x and 10.1.x/10.0.x.

🇺🇸United States cboyden

I've created a new MR with the approach of adding the aria-current="page" attribute everywhere (that I can find) that the is-active class is being added to a menu link. I've also created two patches, one for 10.1.x/10.0.x, and one for 9.5.x, in case anyone wants to use them.

According to the ARIA spec for the aria-current attribute, it should be added to a set of navigation links to programmatically indicate the current page among that set of links. It needs to be added to the link, not the list item or other element. And if the current item is not a link, the aria-current attribute is not needed. For reference see https://www.w3.org/TR/wai-aria-1.2/#aria-current and https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attribut....

🇺🇸United States cboyden

Rather than each theme needing to implement this, would it be possible to do as Luke.Leber suggests and have the attribute added more globally? It should probably be done anywhere the is-active class is applied to a menu link. For example, in the JS file /core/misc/active-link.es6.js and in the ActiveLinkResponseFilter.php class.

🇺🇸United States cboyden

Updated patch and issue summary to include Views 3.29 and Entity Reference 1.9.

🇺🇸United States cboyden

We've tested this patch with a screenreader user and it works as expected.

🇺🇸United States cboyden

I updated BlockFilterTest to account for the reduced number of filter results.

Production build 0.71.5 2024