From 78d7f4dfc416e28f2e247ee1d6f880c208470248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Tue, 17 Dec 2024 22:45:23 -0500 Subject: [PATCH 01/41] Implement this --- project_browser.links.task.yml | 3 +-- src/LocalTaskDeriver.php | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/LocalTaskDeriver.php diff --git a/project_browser.links.task.yml b/project_browser.links.task.yml index c808c538c..8a0a105d8 100644 --- a/project_browser.links.task.yml +++ b/project_browser.links.task.yml @@ -1,5 +1,4 @@ project_browser.browse: route_name: project_browser.browse base_route: system.modules_list - title: 'Browse' - weight: 5 + deriver: '\Drupal\project_browser\LocalTaskDeriver' diff --git a/src/LocalTaskDeriver.php b/src/LocalTaskDeriver.php new file mode 100644 index 000000000..6c5604bc9 --- /dev/null +++ b/src/LocalTaskDeriver.php @@ -0,0 +1,47 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\project_browser; + +use Drupal\Component\Plugin\Derivative\DeriverBase; +use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; +use Drupal\Core\Plugin\PluginBase; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Exposes local tasks for all enabled source plugins. + */ +final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInterface { + + public function __construct( + private readonly EnabledSourceHandler $enabledSources, + ) {} + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, $base_plugin_id) { + return new static( + $container->get(EnabledSourceHandler::class), + ); + } + + /** + * {@inheritdoc} + */ + public function getDerivativeDefinitions($base_plugin_definition) { + foreach ($this->enabledSources->getCurrentSources() as $id => $source) { + $plugin_definition = $source->getPluginDefinition(); + $derivative_id = str_replace(PluginBase::DERIVATIVE_SEPARATOR, '__', $id); + $this->derivatives[$derivative_id] = [ + 'route_parameters' => [ + 'source' => $id, + ], + 'title' => $plugin_definition['label'], + ] + $base_plugin_definition; + } + return parent::getDerivativeDefinitions($base_plugin_definition); + } + +} -- GitLab From d14d9e4efcae2e443702b88a3e5699ab8225f1ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Tue, 17 Dec 2024 22:47:47 -0500 Subject: [PATCH 02/41] Restore the previous values since they were clearly intentional --- src/LocalTaskDeriver.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/LocalTaskDeriver.php b/src/LocalTaskDeriver.php index 6c5604bc9..27aa60270 100644 --- a/src/LocalTaskDeriver.php +++ b/src/LocalTaskDeriver.php @@ -7,6 +7,7 @@ namespace Drupal\project_browser; use Drupal\Component\Plugin\Derivative\DeriverBase; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; use Drupal\Core\Plugin\PluginBase; +use Drupal\Core\StringTranslation\StringTranslationTrait; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -14,6 +15,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface; */ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInterface { + use StringTranslationTrait; + public function __construct( private readonly EnabledSourceHandler $enabledSources, ) {} @@ -40,6 +43,11 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte ], 'title' => $plugin_definition['label'], ] + $base_plugin_definition; + + if ($id === 'drupalorg_jsonapi') { + $this->derivatives[$derivative_id]['title'] = $this->t('Browse'); + $this->derivatives[$derivative_id]['weight'] = 5; + } } return parent::getDerivativeDefinitions($base_plugin_definition); } -- GitLab From 65e9f44e4ef0b93a29f1ef2d3aceddb72920d55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Tue, 17 Dec 2024 23:29:37 -0500 Subject: [PATCH 03/41] Allow the plugins to define their local task in their annotation --- project_browser.module | 3 +++ src/Annotation/ProjectBrowserSource.php | 9 +++++++++ src/LocalTaskDeriver.php | 17 +++++------------ .../DrupalDotOrgJsonApi.php | 4 ++++ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/project_browser.module b/project_browser.module index 329bffad7..2301130af 100644 --- a/project_browser.module +++ b/project_browser.module @@ -52,6 +52,9 @@ function project_browser_project_browser_source_info_alter(array &$definitions): 'id' => 'recipes', 'label' => t('Recipes'), 'description' => t('Recipes available in the local code base'), + 'local_task' => [ + 'title' => t('Recipes'), + ], 'class' => Recipes::class, ]; } diff --git a/src/Annotation/ProjectBrowserSource.php b/src/Annotation/ProjectBrowserSource.php index e5852f6c3..aab59a016 100644 --- a/src/Annotation/ProjectBrowserSource.php +++ b/src/Annotation/ProjectBrowserSource.php @@ -48,4 +48,13 @@ class ProjectBrowserSource extends Plugin { */ public $description; + /** + * The local task definition at which this source should be exposed. + * + * If NULL, the source will never be exposed as a local task. + * + * @var array|null + */ + public ?array $local_task = NULL; + } diff --git a/src/LocalTaskDeriver.php b/src/LocalTaskDeriver.php index 27aa60270..505aa7eda 100644 --- a/src/LocalTaskDeriver.php +++ b/src/LocalTaskDeriver.php @@ -34,19 +34,12 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { - foreach ($this->enabledSources->getCurrentSources() as $id => $source) { + foreach ($this->enabledSources->getCurrentSources() as $source) { $plugin_definition = $source->getPluginDefinition(); - $derivative_id = str_replace(PluginBase::DERIVATIVE_SEPARATOR, '__', $id); - $this->derivatives[$derivative_id] = [ - 'route_parameters' => [ - 'source' => $id, - ], - 'title' => $plugin_definition['label'], - ] + $base_plugin_definition; - - if ($id === 'drupalorg_jsonapi') { - $this->derivatives[$derivative_id]['title'] = $this->t('Browse'); - $this->derivatives[$derivative_id]['weight'] = 5; + + if (isset($plugin_definition['local_task'])) { + $id = str_replace(PluginBase::DERIVATIVE_SEPARATOR, '__', $source->getPluginId()); + $this->derivatives[$id] = $plugin_definition['local_task'] + $base_plugin_definition; } } return parent::getDerivativeDefinitions($base_plugin_definition); diff --git a/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php b/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php index b047e3b78..0d7f4e9c3 100644 --- a/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php +++ b/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php @@ -30,6 +30,10 @@ use Symfony\Component\HttpFoundation\Response; * id = "drupalorg_jsonapi", * label = @Translation("Contrib modules"), * description = @Translation("Modules on Drupal.org queried via the JSON:API endpoint"), + * local_task = { + * "title" = @Translation("Browse"), + * "weight" = 5, + * } * ) */ class DrupalDotOrgJsonApi extends ProjectBrowserSourceBase { -- GitLab From aff7e25b8144883cba47029d21a7e0d7ff5d6454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 08:47:12 -0500 Subject: [PATCH 04/41] Fix test --- project_browser.links.task.yml | 2 +- .../Derivative}/LocalTaskDeriver.php | 20 ++++++++++++------- .../ProjectBrowserTestMock.php | 4 ++++ 3 files changed, 18 insertions(+), 8 deletions(-) rename src/{ => Plugin/Derivative}/LocalTaskDeriver.php (62%) diff --git a/project_browser.links.task.yml b/project_browser.links.task.yml index 8a0a105d8..320afe230 100644 --- a/project_browser.links.task.yml +++ b/project_browser.links.task.yml @@ -1,4 +1,4 @@ project_browser.browse: route_name: project_browser.browse base_route: system.modules_list - deriver: '\Drupal\project_browser\LocalTaskDeriver' + deriver: 'Drupal\project_browser\Plugin\Derivative\LocalTaskDeriver' diff --git a/src/LocalTaskDeriver.php b/src/Plugin/Derivative/LocalTaskDeriver.php similarity index 62% rename from src/LocalTaskDeriver.php rename to src/Plugin/Derivative/LocalTaskDeriver.php index 505aa7eda..281187c5a 100644 --- a/src/LocalTaskDeriver.php +++ b/src/Plugin/Derivative/LocalTaskDeriver.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Drupal\project_browser; +namespace Drupal\project_browser\Plugin\Derivative; use Drupal\Component\Plugin\Derivative\DeriverBase; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; -use Drupal\Core\Plugin\PluginBase; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\project_browser\EnabledSourceHandler; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -35,11 +35,17 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte */ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->enabledSources->getCurrentSources() as $source) { - $plugin_definition = $source->getPluginDefinition(); - - if (isset($plugin_definition['local_task'])) { - $id = str_replace(PluginBase::DERIVATIVE_SEPARATOR, '__', $source->getPluginId()); - $this->derivatives[$id] = $plugin_definition['local_task'] + $base_plugin_definition; + $source_definition = $source->getPluginDefinition(); + + if (isset($source_definition['local_task'])) { + $local_task = $base_plugin_definition + $source_definition['local_task']; + $source_id = $source->getPluginId(); + $local_task['route_parameters'] = [ + 'source' => $source_id, + 'id' => NULL, + ]; + $derivative_id = str_replace($source::DERIVATIVE_SEPARATOR, '__', $source_id); + $this->derivatives[$derivative_id] = $local_task; } } return parent::getDerivativeDefinitions($base_plugin_definition); diff --git a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php index 35321cf6c..c60283dea 100644 --- a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php +++ b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php @@ -29,6 +29,10 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * id = "project_browser_test_mock", * label = @Translation("Project Browser Mock Plugin"), * description = @Translation("Gets project and filters information from a database"), + * local_task = { + * "title" = @Translation("Browse"), + * "weight" = 5, + * } * ) */ class ProjectBrowserTestMock extends ProjectBrowserSourceBase { -- GitLab From 02c96ddc2082a3ec60bd188c073cc632f4905474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 09:02:27 -0500 Subject: [PATCH 05/41] Shut cspell up --- .cspell-project-words.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.cspell-project-words.txt b/.cspell-project-words.txt index ec9b40d23..3c907a818 100644 --- a/.cspell-project-words.txt +++ b/.cspell-project-words.txt @@ -10,3 +10,6 @@ tabwise sophron BOLDRED NOCHANGES +CURLOPT +RETURNTRANSFER +varchar -- GitLab From 1f5de1a5ef500aeae2f5c4eb0ef384fd04e41202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 09:58:05 -0500 Subject: [PATCH 06/41] Add default title --- src/Plugin/Derivative/LocalTaskDeriver.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Plugin/Derivative/LocalTaskDeriver.php b/src/Plugin/Derivative/LocalTaskDeriver.php index 281187c5a..210f0f3ac 100644 --- a/src/Plugin/Derivative/LocalTaskDeriver.php +++ b/src/Plugin/Derivative/LocalTaskDeriver.php @@ -39,6 +39,11 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte if (isset($source_definition['local_task'])) { $local_task = $base_plugin_definition + $source_definition['local_task']; + // If no title was provided for the local task, fall back to the + // source's administrative label. + $local_task += [ + 'title' => $source_definition['label'], + ]; $source_id = $source->getPluginId(); $local_task['route_parameters'] = [ 'source' => $source_id, -- GitLab From 7f84bc9803cefe80bcba035b51723e69e9053b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 13:40:00 -0500 Subject: [PATCH 07/41] Put recipes after Browse --- project_browser.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_browser.module b/project_browser.module index 2301130af..bb1f8092d 100644 --- a/project_browser.module +++ b/project_browser.module @@ -53,7 +53,7 @@ function project_browser_project_browser_source_info_alter(array &$definitions): 'label' => t('Recipes'), 'description' => t('Recipes available in the local code base'), 'local_task' => [ - 'title' => t('Recipes'), + 'weight' => $definitions['drupalorg_jsonapi']['local_task']['weight'] + 2, ], 'class' => Recipes::class, ]; -- GitLab From 49bc1e1f3089d413a42d0baa6379534336ed568d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:01:57 -0500 Subject: [PATCH 08/41] Source is now always required --- project_browser.routing.yml | 1 - src/Controller/BrowserController.php | 6 +++--- src/Element/ProjectBrowser.php | 19 ++++++++----------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/project_browser.routing.yml b/project_browser.routing.yml index 3d0b4f96c..206732109 100644 --- a/project_browser.routing.yml +++ b/project_browser.routing.yml @@ -24,7 +24,6 @@ project_browser.browse: _controller: '\Drupal\project_browser\Controller\BrowserController::browse' _title: 'Browse projects' id: null - source: null requirements: _permission: 'administer modules' project_browser.settings: diff --git a/src/Controller/BrowserController.php b/src/Controller/BrowserController.php index 73941c43b..f1a8ae13f 100644 --- a/src/Controller/BrowserController.php +++ b/src/Controller/BrowserController.php @@ -24,8 +24,8 @@ class BrowserController extends ControllerBase { * rendered. For example, 'https//drupal-site/admin/modules/browse/ctools' * will display the details for ctools. * - * @param string|null $source - * If viewing a specific project, the ID of its source plugin. + * @param string $source + * The ID of the source plugin to query for projects. * @param string|null $id * If viewing a specific project, the project's local ID (as known to the * source plugin). @@ -33,7 +33,7 @@ class BrowserController extends ControllerBase { * @return array * A render array. */ - public function browse(?string $source, ?string $id): array { + public function browse(string $source, ?string $id): array { return [ '#type' => 'project_browser', '#source' => $source, diff --git a/src/Element/ProjectBrowser.php b/src/Element/ProjectBrowser.php index 06b284163..c8721509a 100644 --- a/src/Element/ProjectBrowser.php +++ b/src/Element/ProjectBrowser.php @@ -97,7 +97,7 @@ final class ProjectBrowser implements ElementInterface, ContainerFactoryPluginIn */ public function attachProjectBrowserSettings(array $element): array { $element['#attached']['drupalSettings']['project_browser'] = $this->getDrupalSettings( - $element['#source'] ?? NULL, + $element['#source'], $element['#id'] ?? NULL ); return $element; @@ -106,8 +106,8 @@ final class ProjectBrowser implements ElementInterface, ContainerFactoryPluginIn /** * Gets the Drupal settings for the Project Browser. * - * @param string|null $source - * If viewing a specific project, the ID of its source plugin. + * @param string $source + * The ID of the source plugin to query for projects. * @param string|null $id * If viewing a specific project, the project's local ID (as known to the * source plugin). @@ -115,13 +115,10 @@ final class ProjectBrowser implements ElementInterface, ContainerFactoryPluginIn * @return array * An array of Drupal settings. */ - private function getDrupalSettings(?string $source, ?string $id): array { - $current_sources = $this->enabledSourceHandler->getCurrentSources(); - if ($source) { - $current_sources = [ - $source => $current_sources[$source], - ]; - } + private function getDrupalSettings(string $source, ?string $id): array { + $current_sources = [ + $source => $this->enabledSourceHandler->getCurrentSources()[$source], + ]; $package_manager = [ 'available' => (bool) $this->configFactory->get('project_browser.admin_settings')->get('allow_ui_install'), @@ -129,7 +126,7 @@ final class ProjectBrowser implements ElementInterface, ContainerFactoryPluginIn 'warnings' => [], 'status_checked' => FALSE, ]; - if (empty($source) || empty($id)) { + if (empty($id)) { if ($package_manager['available']) { $package_manager = array_merge($package_manager, $this->installReadiness->validatePackageManager()); $package_manager['status_checked'] = TRUE; -- GitLab From 466567a53be39743c65033eee434882fffe073c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:05:13 -0500 Subject: [PATCH 09/41] Don't clear anything on tab change, because the active tab is a constant --- sveltejs/public/build/bundle.js | Bin 305491 -> 304686 bytes sveltejs/public/build/bundle.js.map | Bin 281877 -> 280446 bytes sveltejs/src/ProjectBrowser.svelte | 30 +++++----------------------- sveltejs/src/stores.js | 2 +- 4 files changed, 6 insertions(+), 26 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index af3bd9d38857ecbfc6a3f18998f03c37eabf9225..3eba38c364224d05e9bda89068a4c47c0d021f8a 100644 GIT binary patch delta 288 zcmcb7Nod^}p$*}UlT#byH_vQ*$ke>HrG0G+BM>ufU)#d0GnLU``z=Y9H!Lg$CRS$C z_q=6N*#1h6<v9~j{E{MzD>tL@b_rb;4ptzoXvDITnbCCnX;YSR5bbQq@_?DqY`cmr zi#9J%KER9Rv;dQV#q>Zg7Rl{q(JcR1fTE@eEGyMGN{ey=5{pWTr|<v5EG@2AT$)r| zQk0pOu3@ODS6q;jS)!q?uRcAlmQiy0-$^VI;xP5m#<4mIDv8M@nPsUViAmEH#F)gU z+qSdtE5TIg<)r4Nmt-i|+S)3ZD%dN)#G_57$G5YHPWS6#(dE(OQUC%@&df9gjp++I NSj4yA?qaEs0|1H1Uu^&Y delta 979 zcma)4&rcIU7|ph$v8X}$A##v>L{oMHbOYExgvJmkNzp)TDF$uQEW6V(+V0euX)6g4 zh>g98+UOqj%Ed@L?47H|gZ=^HT`&Ft#;Mza2BU0t^UZ$w-phRNz1Q#CK7DL^b91xX zq&62Ym5j%ua|`Ljd@?>2O{A|ymufo?w6~?rFTR@c^kS=F3R1!g#&Vyg!P?rx#Y%Ot zqR7wZE>`@5&y``f(v7|%S?~3r7Qd`(y(oH83A?)k=)^Hu-wmN{zcT6;!>C-Z-^S3M zUm0^hOrZYLC>*|W+1VIXy4;Rgv~vaxk2U}IZlNDY;y<U+cJO%K5atSYwjQAi!Cz-p zPw9r0Cw5BDQ>&Q6Jf$x)TIM*VtD$~PcQ%5)a}HEdYr6;La1|P-+e6NcD(YO1Wxy;l zhHU}frclTgv&06%!6MvP&S48E1Cjx;B75>Rnj^e`O_CvI3&<xB&~;$6DDVI<oTnuW zTu^3YG2F$g5@lPmpQDBa1=$RFpz(lb1II!TJIg1VYC{BO6Z3N+E|~0-%&IyaotaEt zZ#tEZO*?0wpzfvKNCXa}gTcQ!n+Orx!uRJh>ZN^KHHb)t!6E4_6d1jOO%by|;+>aO z)V0nr=Y-k`Z<Ua@Sxn%(+P6>9r;Rrx2>fH*Gz894wmL&{0<$AxoL!={$B#D5DHBtS zNOEHQ4^ewn=^Q!At?Q(}kv)5HzBcjr)W{*l4<sl{jcGZQqjF)XoRq9?x~kQb?;TF2 kiUwo#JpB=<g8((c*G!fds76)-GK1=YMba-<TC~;k6VW9=Q2+n{ diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 80bae75a083a63eb2e13fc5d7ec756e62fb77ebb..17147bc0532e77a6e62e400e9b363ab576b69d51 100644 GIT binary patch delta 450 zcmYk0T`L4p7{{A)hSrL;UdmGTh_YL!U1BNIq-Vy^w&W$7#kv@4*x9DR&Mb1njoi7@ ziE<%dz=a$>g5)c>Rc<7uM6&B8o{L{k{rf+^=itcyvG3nG7p{l+`;c(;#%~oAto0W1 z*0`Q`9U`-I8wzYkoWg?R=1qG!)D@06tCs18I-(t6DQ%PDwCfqyTsNll1tOE*?p*i$ zPrRC6$r%|pzW6VVScbjqW{E7zBt{1QT0QfmpV$S<`YA`FWQ=X35Uq@S%giMb;twfQ zIBwB$gERw>p(=n%4FKbNTT=km6n^-E`VqT3MLyJ}?vYo-$t!*$*qqi`O|w|f>@Do! zolT<RLz~mw4T}MvFAiFtLNx%OqeU=}M+~yt7vyELH$^;F;IitXPAi#!CIAvln80;a zAekztS&b$ElI+Bb8wFs|Ua_IvQ9xZ+SZfg1v5RNyXZM$=nw@!Z1qC_`5U24HzV4ME mNm3FtYmm+W%zS+!>7Y(>OA-S$D3@e=32|45@v0HgBYXm((TD>8 delta 1566 zcmaJ=-*3}a7?mAwAP{tAPzsFgPV`4CE{UqGRHLil+DR%euuP=cQms>QotyM_jvaiR zwy<nv4-?wU-li)}+WQ{%f`sIWzX1LO{s$gF6E7fj`|KMhP!*ymzWRK=bIv{Am)+k+ zfB$3j&VA)kNjPQY+=%UjY?Ch8Yty=pdcEjjNqO+{XrWjlwW~|3)k^KUS&X&~RX_G_ z+YX&|D*jqh&+a7W?23nyPkv=3Z#UY^gJ;`sbY05fv=;bVoWdcSJFn-l1ncwi*$Mm& z>V#GUEg(tE(dG2??aX)R67ssP+ehc~$Z8^|8wAt~k?rinrcuZ3wwQ+)M-9g9HJ3J! zA0XC5;X2gdYo`$2p$=;@M`{CG;CDlcQ9#>15b@9t>=s4e(_7HwHK6YLb^~>wn3Fw@ z@9_|E8ivek@ePv32KK+GR=&*fFn|}Vc`N&RcB@t)y)qaZB$k~R1dl#mSQrowd8ekN zu=vSP$9HnfYtZdV^OZgwEkNUinRsjxicoeK>(msQV7$Zv9$tmJ=n|r%A5tu*oHO66 z%Dd-e6jn&v+3A6|>Av@I81ue(ai^?|eb}GUn=m8Sl@E5_j*+_D4?;6wAq|+FO20`t z?dS#$Eio5*_}f~><3XoAK{$j8`zvK~J{{~J|8!^wZ9(+@R?hVuJA}L-sCYNBDd0!( zSxvpT7;oNdt0!ZIRqJnQx`J}``dbyR#BgN29*S<))b5|h%~=y)Bjg(P4MKcl-Xi9P z`0uHD=CCYalMpjH@~?VH6(<j5J|AU(V@6Vr!E>d%_2+6-f1Y`U)SLCFJf^LVsGroM zzbCa*BZrnran8UMLMr0%r`iN66H<oWShWSrEi)z}$q%p<U9tNtGkG?~<3&Oilg>m- z{#b-q;>L^2iQ|hKCN9RUV4h%UN+?IP(}H5{*ahI)EJy(K5L_dqh7<9=f3Ti6`j-~> z-pP#5R^s>4N-Acq7jTu3DvovWG9k+e<$Q${XAJBR;)u(4;Xl*AK!uornUp0#A{yt1 zTM$|+32g|S*&oUQ%J)FQMl80MHLaZ)l5X!M6;}>wCr*L0+k4+6Y~ts7=KTZfW}G$= z_jc8f#)bnP(gp?5`!#b~{8P}5>K3s&#w*$Gmyiun7~;w|nUm3zSxtRU?R+hs7PViL LxoESb9aR1Ys&L?% diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 6d733765a..0cbe2b433 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -31,7 +31,6 @@ ACTIVELY_MAINTAINED_ID, COVERED_ID, ALL_VALUES_ID, - DEFAULT_SOURCE_ID, CURRENT_SOURCES_KEYS, BASE_URL, FULL_MODULE_PATH, @@ -184,30 +183,11 @@ if (savedPageSize) { pageSize.set(Number(savedPageSize)); } - const matches = window.location.pathname.match( - /\/admin\/modules\/browse\/(.+)/, - ); - projectId = matches ? matches[1] : null; - // If current active plugin is disabled or if this is a plugin specific - // route, remove storage keys and reload page. - const settingsActiveTab = JSON.stringify(DEFAULT_SOURCE_ID); - if ( - ($activeTab !== settingsActiveTab && - CURRENT_SOURCES_KEYS.indexOf($activeTab) === -1) || - (projectId && $isFirstLoad) - ) { - sessionStorage.removeItem('activeTab'); - sessionStorage.removeItem('categoryFilter'); - sessionStorage.removeItem('categoryCheckedTrack'); - sessionStorage.removeItem('sortCriteria'); - sessionStorage.removeItem('sourceFilters'); - sessionStorage.removeItem('sort'); - sessionStorage.setItem('activeTab', settingsActiveTab); - window.location.reload(); - } - // Only filter by recommended on first page load or if this is a - // plugin specific route. - if (projectId || $isFirstLoad) { + const urlParts = window.location.pathname.substring(1).split('/'); + $activeTab = urlParts[3]; + projectId = urlParts.length === 5 ? urlParts[4] : null; + // Only filter by recommended on first page load. + if ($isFirstLoad) { await filterRecommended(); } diff --git a/sveltejs/src/stores.js b/sveltejs/src/stores.js index 11124f69e..ad760d003 100644 --- a/sveltejs/src/stores.js +++ b/sveltejs/src/stores.js @@ -6,7 +6,7 @@ import { } from './constants'; // Store the selected tab. -const storedActiveTab = JSON.parse(sessionStorage.getItem('activeTab')) || DEFAULT_SOURCE_ID; +const storedActiveTab = DEFAULT_SOURCE_ID; let activeFilters = {}; if (sessionStorage.getItem('sourceFilters')){ activeFilters = JSON.parse(sessionStorage.getItem('sourceFilters')); -- GitLab From e469fb27a1ca9417de03c72bc905bba6f7bc7a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:06:06 -0500 Subject: [PATCH 10/41] Remove Tabs component --- sveltejs/public/build/bundle.js | Bin 304686 -> 292710 bytes sveltejs/public/build/bundle.js.map | Bin 280446 -> 274396 bytes sveltejs/src/ProjectBrowser.svelte | 5 --- sveltejs/src/Tabs.svelte | 55 ---------------------------- 4 files changed, 60 deletions(-) delete mode 100644 sveltejs/src/Tabs.svelte diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 3eba38c364224d05e9bda89068a4c47c0d021f8a..144be08405ce5290a4516b22324ad0e66f04f0f6 100644 GIT binary patch delta 3681 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 delta 8551 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 O<Rjvj{?f-+2L3<o=NY>I diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 17147bc0532e77a6e62e400e9b363ab576b69d51..cf02f3eb1220f51840a2c9a57d1020dfc9ea4063 100644 GIT binary patch delta 359 zcmWO0%`3xU902g1=llKnZOpP_Y^H3?#V%$Nqdfb~%VN{CP*Nyu(ejd)IEWlp4pQQK zog5UUUGyj=H|&C3CvT-)l=5<1_78me<hD(j=aSSh?6z~=W*QP{U@{H-&?MVz{If=e zI{0H<A`|5@6NT6+S+Y<m$KJqQK)*L&lc!mjD^ff@ZDO7pp1?w1DJYcdIk+w7o<Z4b z#v{f$>AM^+$nXb7dYOh|o!9G)cMCB<><_F|y#@{?AX>B@y5EN~TCw7Yyt81ofKp~q z)kRG#XtRELs6Z>N+fku$JD#&BSsmDG=oj<8n9mgy9)FMyexRO`4jiSODo~WTCPLlx z8qK2}22d$!1El>LOvvh5++u8&PMp|EA5Prkfrvb)!)v2HD70Z$Scovay0MIw&$yA2 zO=yvqO?a>B^Y<Y!qfPnbl|UV+;Xc=-5R<fHf>QbJ$0Ej?BlOjY8xYVM<x&^w*gqy8 BcQF6} delta 3887 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 N`s3+8wkyTb{{hF1da3{b diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 0cbe2b433..b8ddba527 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -4,7 +4,6 @@ import ProjectGrid, { Search } from './ProjectGrid.svelte'; import Pagination from './Pagination.svelte'; import Project from './Project/Project.svelte'; - import Tabs from './Tabs.svelte'; import { numberFormatter } from './util'; import ProcessQueueButton from './ProcessQueueButton.svelte'; import { @@ -333,10 +332,6 @@ <MediaQuery query="(min-width: 1200px)" let:matches> <ProjectGrid {toggleView} {loading} {rows} {pageIndex} {$pageSize} let:rows> <div slot="head"> - <!--Show tabs only if there are 2 or more plugins enabled.--> - {#if dataArray.length >= 2 && !projectId} - <Tabs {dataArray} on:tabChange={toggleRows} /> - {/if} <Search bind:this={searchComponent} on:search={onSearch} diff --git a/sveltejs/src/Tabs.svelte b/sveltejs/src/Tabs.svelte deleted file mode 100644 index ea2cbe34b..000000000 --- a/sveltejs/src/Tabs.svelte +++ /dev/null @@ -1,55 +0,0 @@ -<script> - import { createEventDispatcher } from 'svelte'; - import { activeTab } from './stores'; - - const { Drupal } = window; - const dispatch = createEventDispatcher(); - - // eslint-disable-next-line import/no-mutable-exports,import/prefer-default-export - export let dataArray = []; - let tabButtons; -</script> - -<nav class="tabs-wrapper tabs-wrapper--secondary is-horizontal"> - <div - role="tablist" - id="plugin-tabs" - aria-label={Drupal.t('Plugin tabs')} - bind:this={tabButtons} - class="tabs tabs--secondary pb-tabs" - > - {#each dataArray.map( (item) => ({ ...item, isActive: item.pluginId === $activeTab }), ) as { pluginId, pluginLabel, totalResults, isActive }} - <span - class="tabs__tab pb-tabs__tab" - class:is-active={isActive === true} - class:pb-tabs__tab--active={isActive === true} - > - <button - type="button" - role="tab" - aria-selected={isActive ? 'true' : 'false'} - aria-controls={pluginId} - tabindex="0" - id={pluginId} - class="pb-tabs__link tabs__link" - class:is-active={isActive === true} - class:pb-tabs__link--active={isActive === true} - value={pluginId} - on:click={(event) => { - dispatch('tabChange', { - pluginId, - event, - }); - }} - > - {pluginLabel} - <br /> - {Drupal.formatPlural(totalResults, '1 result', '@count results')} - {#if isActive} - <span class="visually-hidden">({Drupal.t('active tab')})</span> - {/if} - </button> - </span> - {/each} - </div> -</nav> -- GitLab From ffe7fd66ad637664a6169d6a853af37b6aadc04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:08:26 -0500 Subject: [PATCH 11/41] Clear local task cache on settings change --- src/Form/SettingsForm.php | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/Form/SettingsForm.php b/src/Form/SettingsForm.php index d2f8023b3..30a5a0e49 100644 --- a/src/Form/SettingsForm.php +++ b/src/Form/SettingsForm.php @@ -2,12 +2,14 @@ namespace Drupal\project_browser\Form; +use Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Config\TypedConfigManagerInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Menu\LocalTaskManagerInterface; use Drupal\project_browser\Plugin\ProjectBrowserSourceManager; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -16,26 +18,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; */ class SettingsForm extends ConfigFormBase { - /** - * Constructor for settings form. - * - * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory - * The config factory interface. - * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager - * The typed config manager. - * @param \Drupal\project_browser\Plugin\ProjectBrowserSourceManager $manager - * The module source manger. - * @param \Drupal\Core\Cache\CacheBackendInterface $cacheBin - * The back end cache. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler - * The module handler. - */ public function __construct( ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config_manager, private readonly ProjectBrowserSourceManager $manager, private readonly CacheBackendInterface $cacheBin, private readonly ModuleHandlerInterface $moduleHandler, + private readonly LocalTaskManagerInterface&CachedDiscoveryInterface $localTaskManager, ) { parent::__construct($config_factory, $typed_config_manager); } @@ -50,6 +39,7 @@ class SettingsForm extends ConfigFormBase { $container->get(ProjectBrowserSourceManager::class), $container->get('cache.project_browser'), $container->get(ModuleHandlerInterface::class), + $container->get(LocalTaskManagerInterface::class), ); } @@ -233,6 +223,7 @@ class SettingsForm extends ConfigFormBase { ->set('allow_ui_install', $form_state->getValue('allow_ui_install')) ->save(); $this->cacheBin->deleteAll(); + $this->localTaskManager->clearCachedDefinitions(); parent::submitForm($form, $form_state); } -- GitLab From 1d570a464e72dee7aac578acce1cbbcd234ce78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:18:54 -0500 Subject: [PATCH 12/41] Remove CURRENT_SOURCES_KEYS and call toggleRows() without an event --- sveltejs/public/build/bundle.js | Bin 292710 -> 293787 bytes sveltejs/public/build/bundle.js.map | Bin 274396 -> 274626 bytes sveltejs/src/ProjectBrowser.svelte | 23 ++++++++--------------- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 144be08405ce5290a4516b22324ad0e66f04f0f6..3e2e698cbd87ad1639823b198b156ab4ee61c69b 100644 GIT binary patch delta 571 zcmaF%PH^^j!G;#b7N#xCnLn5;Ot)wMV1CWQWMMJAE|N)Yd);5=$4pEXCR>wPoVb~c zjJ7Z5W?^AvGB)47R)D39naS8}yQ&DweP$*TlkIF0ELyxQM#feq(;Lhg#kYH_vi#;@ zHMTT@2_zY@{9|D<GTfeI&XUJBJv)<8a{A8<M&a#`U0HIOrytK@w3)spi&1g=98Z>M zBGWydGb>FujAOYVm{^{eS)x#qpPrtR8kApNtg-z^97`M9blxNuem*2&O@->|6Z@IO zr^^Ph<WHZ`&m=JYSuLX%FP8!kaB^m*DQKu9PL^$zo~{<dB5YfnUs{x$>Xw;Pl3G-( zqo9JqSFlxZ^YjUE4GNA{NlY%uEK3bZOo~OQnqCmYA~F5lb7lb!sPUYW6R(L(kFR9p zoLu-oloMz`No7H5e%f?_U>4=+3%4_gF>%_1I7*^09aaj_u{tmgNEa8BqiM|r_DN82 zeo={YQ6|uZnTcS_5nP}J!Tv!Z@%{lJp8kHA&P1pLng$7h<ovwi>3aE$?$b;18TF@Y z#IOiX-<;2As8b8GxHvVjC^^G9Ker%1FEy`3FF!9BETRFC2uZCd*`Alm@<R{+dNi{C delta 164 zcmV;V09*f?_Yvmq5rBjNgaWh!Y4`#;Hn(f|1M36<IhTD|0w=eA{R86y0y#CcV+2AA z0y8tWrwarG1p+iUx2+Hab^`)5H@77e1m6P!H8r;e7z8Q}1T!=`G?#!k0T;JRB?S8n z0yHp}F(m{Vw_-8`{saOuGPhzk1a1zu=|u#91D7*O1T2@WY5^d(#z_R06qkQq1kbl< SUj%&yml}Hk3%9;$1l<u7CNvoU diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index cf02f3eb1220f51840a2c9a57d1020dfc9ea4063..14f3af62519b344f14b341f5ef299c57b3d6f7bc 100644 GIT binary patch delta 499 zcmZvYJxC)#6vvs5jS|%J0)C*Vduh(oK@kLzt=>-7CFoutx|ig%Swip=qb8{MffkC5 zpl9=%6H5yli-Q3R5nEfaQ4qnx((0-!+}(gSH^uPyzu)`uW*#2vub=9-cgP>QY^Yxb zEyU36rmgtu(7VsxiZ@->%f-pbxk9?QQtDKf-|2;>ebd(`=5f=c39NPL7nO18J&BeI z-co*Qtgu?f!z0qPcbui_ILpq?$h1mwuGi7NA2=K1gLvM=xH^sT@lSZ5bB$!N?S-|V z9_QN;7r+&kI*Rk%s>Y%Tc3Omy4FE>J1i5VDNHcH2+GgG!34*l*-lW;rAtMQL#uSzh ziezwwbAFW+DS%YiFiN38<N@-+SK5`91dtV6;zpFWZuu^2Nd^RnMH67r^lSMupx=X! zAqT(_8GuZ%!a_m}|CjQ4FoIK*V3not0KCc$Ie?t_&`H42XBNY&-%QhT{-Y$G*vzT& z<!cFHVcce&#KvKprNaNC119S2ya8+e(rVoQ$D$F#$bi$UI=Xl-C-a!<;X9;H-S+Tm F@&+;wkdXiY delta 590 zcmaKoK}#bs7=}qqSx;I;P{hM$5jtgc=Aa^F7-1|PJm^776}Bs+(^N-dr)Dx05z&Jn zcv3I<4WcIz0v^5YWq-iJs^I>JWd+BMt|($o$;b14@B8NZHvQ{&dT$?H;-;;-3aCd1 zHs;;x-z@&A@8|GED$km%E_1M5u0wqM8W^pKS!I&?+-&e@#jnp)!EqcIqMr1dtVk=d zK)DUnr%(YK>Tn7VsGA}l%)Aodz=w<U-y*(4yNRuxxOzc7l&}qwiWMed=e@QCzhN6x z#Ia*8k(kMQE~v6+%(7sftp`m8lymSR(c(kKnI~Blb|tNZiFqPT?f~XS#KhJ@iwlIy zxsm-wg-=Ibq)s^_Ma0UP@7dgcQ7sVD)LS)-_$Qr7kY>oFE2Z!&kz_{p&4TPO)M$x^ zESG!Dx)9fvt9}^wsQ?Y(#Vv7oF8TS=r&Q|b1oa*~l(2p%wVj=zF@1^&bl}FK`jIAi zo$4aXon+Q6EUBG8ZT;%-9CxT=AVT*JlFcvewrwxEL19g&z7mU|2{mq!eKe}CEYgl1 E0lq)Qv;Y7A diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index b8ddba527..3abc09abc 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -30,7 +30,6 @@ ACTIVELY_MAINTAINED_ID, COVERED_ID, ALL_VALUES_ID, - CURRENT_SOURCES_KEYS, BASE_URL, FULL_MODULE_PATH, SORT_OPTIONS, @@ -184,6 +183,7 @@ } const urlParts = window.location.pathname.substring(1).split('/'); $activeTab = urlParts[3]; + // eslint-disable-next-line projectId = urlParts.length === 5 ? urlParts[4] : null; // Only filter by recommended on first page load. if ($isFirstLoad) { @@ -191,6 +191,7 @@ } await load($page); + await toggleRows(); const focus = element ? document.getElementById(element) : false; if (focus) { focus.focus(); @@ -247,13 +248,9 @@ preferredView.set(val); } - async function toggleRows(event) { - if (event.detail.pluginId === $activeTab) { - return; - } + async function toggleRows() { $categoryCheckedTrack[$activeTab] = $moduleCategoryFilter; $moduleCategoryFilter = []; - $activeTab = event.detail.pluginId; if ($activeTab in FILTERS) { $sourceFilters = FILTERS[$activeTab]; } @@ -266,15 +263,11 @@ if (typeof sortMatch === 'undefined') { $sort = $sortCriteria[0].id; } - searchComponent.onSearch(event); - const { target } = event.detail.event; - const parent = target.parentNode; - // Remove all current selected tabs - parent - .querySelectorAll('[aria-selected="true"]') - .forEach((t) => t.setAttribute('aria-selected', false)); - // Set this tab as selected - target.setAttribute('aria-selected', true); + searchComponent.onSearch({ + detail: { + searchText: '', + } + }); } /** -- GitLab From 9323bb726a23ad7daea3199dad0325af9734f4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:24:14 -0500 Subject: [PATCH 13/41] Remove toggleRows --- sveltejs/public/build/bundle.js | Bin 293787 -> 292678 bytes sveltejs/public/build/bundle.js.map | Bin 274626 -> 273293 bytes sveltejs/src/ProjectBrowser.svelte | 28 +--------------------------- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 3e2e698cbd87ad1639823b198b156ab4ee61c69b..e3bf78cde7311e469f573fa7adc76209fc1ff82f 100644 GIT binary patch delta 481 zcmX|7Pe@a79OwJ{eS8tia<FBYf-AKMW$(Scz4x{lrIf7+3n2s#CEJ{BDq^p#%V-)5 zIz@-5uMl*L4kZNr`GtqNg%E_EqC+Kg>d>Ftk}`T8>h$6Bj}LtAHiNIf1s5CC5KrZe zrm$ST*_2(R^Kw&Or#MfXm6ot$Jo8ij*>)o_9N?%X_o&;OG9r9Qz4#^Xk+5y9kBdH4 z-;$q&u+3)$Owo2D*g-?8RbXkS&~^170JI1ru9n+yMGC{>-Vp9nT)hb)M?Mbh#XAzF zskD7K+6vuBTD<5`yBg_*EqQdE!s^ZuywZeqo^xaJl3I;oLBP@f1@k7hAk9QV<sHmx zI}AN;JGQIdr?4)_;)f^Tz%>#k*OI8I{2&_iKlF77HNl%D3h~J@9p>MsFw83@I<5wX zagO-WG(|+r;J4G1<d3_ki}$DD^2Q8-le2V?7t(0q+$<gA)MK9>%3#vpTzMjUZvFVu z$*URk`L}-0AjP9;M9JoBX;jJKjV!hE?lXw0{t+yRfZN~QQ>c1gajwEf7GeH$8lBIx ssJDf?=e^=o(Hod7Uaol6LZ#}J=Pq*n0@hS%0#`Nes8K+@EaOA)FGRtWumAu6 delta 889 zcmZWmTS!z<6lI^gof^|}aMaR-QLM(YM(>^Gj#E;Zj!h4(nIW)HxlY#{oxC=4wTC$t z^!N%1sVx*iK?J>_$ElzCt002<>G9P-P(LB{5h_u1w5I3zIjptU-g}*O9*)^gkJ}C& zhQsWZbbOpGucYB|sTgFsIxZapmD-vlH}fv1?g{DJRJBCGB63-zIsD|LRKf(s?|zZa z0`qz)*~}L5<X7n}V_x^|2zJ0!hpiB5c{amQE0bk@aTa0*Q&fI62m2+acxZtgFM!IQ z*ii#<FU`l7z}#+bnTw0FQC56zI;cVc->?8Z5_m>Z=k5HI6CYTZr-ihw(r*6Pg+mOh z<+QS0#;+(Taush^vDY%gEz4@9D)ZMh_?&@<F0V#4Ly=XFmj-+|KnLnDlXtJd{qRfr zp%w=iUCV-8>Z`{*y4MM-sXGeuXtGmq=j+kWoqh}frMdyh7lTr!R8eb8$lheZeEQsg zUb-JZ7bx^83MNzBlxl<m8teiWor%FB8VX<rJ&M6fy3z$DLie-_d{lD-O6m4G+#$j* z42TT9bSQu|{L*?HWwWX)9A%NdcwFx>>G~#NtgQj(^W-K>=8&xwpV_oMTGVuy#?GBF zJ!tGnIQgqqJZhoY+i=e8Kj?DD0G$|S1>{e{68g9W>u7YC<<Pr9Sf8Eg5XWkbb~v16 z+DP${B0AZOxwQ$SFCNkT(U_^n6T-+}*iqx~2R4T5gQ4wZTEvX@>tU_E<sTKDyCc#Y zdoSh8{JFzAqP?(F+di<4>`vub#T0X2uWocuDv0@0zOv~YXZg&!>KBuhm+tjBwzpKI z!Bl_dPf)%hbNY3`gb_E_#-qY;RGaql8;Vt-reL_OX>&Nx)cC*a-%2s<M<5ZSCqc^$ yXdu%Nzevq!qnid)RSc#VCv+_y>0E2<>NR@AA1yO_Leq@%M<J~5HF=|s6SnWYGZw@E diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 14f3af62519b344f14b341f5ef299c57b3d6f7bc..24ba019944fc57b8a6ebd1810db37f457960657c 100644 GIT binary patch delta 136 zcmV;30C)ew;Si125P*aMv;wy|x63&KTLG6eI|698uR8)q5)~kDa%E;^axG+Kb98cb zV{~<LX>Mni_DurTx8+U(m<5-ek^u^b{Z<0E{Z<33s{%4qx2ggJ9}WU`RhP>U1UR<^ q5d{7Zw-+G<cL$gLDg*`rYPSU|1TO>vXj7LqF9d@DcDK4O1PB4=nlHEj delta 764 zcmZusPe>F|80Wott`f3t$r_s2%Z%M*Or@Y?Sme#yaan5rusbTH727!4gw5#AsAUC# z*`9)^!*}SAhv?!pm{SG)fsR689qk-+?T}D!W;H$d9UhP0-|u_!E%xC@?BOHy2Kz(s zX$5urpNDV`HH~C1=~}5QL$iYI=5nE=UoRB(Y$0FvT?OZlz-A6_9<D4^ERTB5%*?D= za+chr|0<8y8sJwEx5W0rr|G>(8~Rk7hL39~evPK+#8qX|redsVn(V0<p0#M|l^fKu z=}vcO3KW#~xXwb=Fh{Ie&#bz_y(5{}Gw#Mc5Jm6TP<xD~>iLv<cjruJ8U|E+vg1T5 zMH375lsRqL=2T)=Lg{e8cR%0y-FDV>svfUeqROg>uKmX!P-r-|>%q?&(%?l6^~0AM z>gg3*1be$?rE1*d&h0tJHf`^WW0ylDStoS!jt5Vlp`*3Dj{UqYt*>Ki%>VOOIv&M? zW6&8T7hvGEMEtQR*=~u9GBzq}e!7dSHnuq`%ar60$}q;1bDZ%-6}DSR2fS@1U6BA- zPQ(4Ylo(O6jNejaO$g;|@Pt0`%gP1D3L&AmVS;QhX2>EkQ>Qp%ye{X^7a_+Ck)>66 zpkVU6%GkUr{`^Xy{txV#a*XBVamL1j73R|N#RFAB&y-*s&NPq1%kMZ&f*k>EN%2D= zeOa8qp~$6Nqlj8g%Nl%Dr6kJ0wkj21xRW&C^D1n#lQ=vsNl|!Llp<uD<@)`NQ>33@ QTL;ujR?wio+Dn?yKTYlG1ONa4 diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 3abc09abc..5e6f0c478 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -7,7 +7,6 @@ import { numberFormatter } from './util'; import ProcessQueueButton from './ProcessQueueButton.svelte'; import { - sourceFilters, filters, rowsCount, moduleCategoryFilter, @@ -26,13 +25,11 @@ } from './stores'; import MediaQuery from './MediaQuery.svelte'; import { - FILTERS, ACTIVELY_MAINTAINED_ID, COVERED_ID, ALL_VALUES_ID, BASE_URL, FULL_MODULE_PATH, - SORT_OPTIONS, ACTIVE_PLUGINS, PACKAGE_MANAGER, } from './constants'; @@ -183,7 +180,7 @@ } const urlParts = window.location.pathname.substring(1).split('/'); $activeTab = urlParts[3]; - // eslint-disable-next-line + // eslint-disable-next-line prefer-destructuring projectId = urlParts.length === 5 ? urlParts[4] : null; // Only filter by recommended on first page load. if ($isFirstLoad) { @@ -191,7 +188,6 @@ } await load($page); - await toggleRows(); const focus = element ? document.getElementById(element) : false; if (focus) { focus.focus(); @@ -248,28 +244,6 @@ preferredView.set(val); } - async function toggleRows() { - $categoryCheckedTrack[$activeTab] = $moduleCategoryFilter; - $moduleCategoryFilter = []; - if ($activeTab in FILTERS) { - $sourceFilters = FILTERS[$activeTab]; - } - $moduleCategoryFilter = - typeof $categoryCheckedTrack[$activeTab] !== 'undefined' - ? $categoryCheckedTrack[$activeTab] - : []; - $sortCriteria = SORT_OPTIONS[$activeTab]; - const sortMatch = $sortCriteria.find((option) => option.id === $sort); - if (typeof sortMatch === 'undefined') { - $sort = $sortCriteria[0].id; - } - searchComponent.onSearch({ - detail: { - searchText: '', - } - }); - } - /** * Refreshes the live region after a filter or search completes. */ -- GitLab From 0068ef16d5831b15a34375fada69669ea3488679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 18:46:15 -0500 Subject: [PATCH 14/41] Fix ProjectBrowserMenuTabsTest --- tests/src/Functional/ProjectBrowserMenuTabsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/Functional/ProjectBrowserMenuTabsTest.php b/tests/src/Functional/ProjectBrowserMenuTabsTest.php index 76f485841..58336cea9 100644 --- a/tests/src/Functional/ProjectBrowserMenuTabsTest.php +++ b/tests/src/Functional/ProjectBrowserMenuTabsTest.php @@ -41,7 +41,7 @@ class ProjectBrowserMenuTabsTest extends BrowserTestBase { */ public function testBrowseMenuPosition(): void { $this->drupalPlaceBlock('local_tasks_block'); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); // Assert that the second tab in the nav bar is the Browse tab. // @todo Use elementTextEquals() once support for Drupal <10.3 is dropped. // @see https://www.drupal.org/project/drupal/issues/3424746 -- GitLab From 1f444675280d7708767b6b124b362a4688e87042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 20:11:59 -0500 Subject: [PATCH 15/41] Fix unlock redirect test --- src/Controller/InstallerController.php | 31 ++++++++++++------ sveltejs/public/build/bundle.js | Bin 292678 -> 292699 bytes sveltejs/public/build/bundle.js.map | Bin 273293 -> 273330 bytes sveltejs/src/ProcessQueueButton.svelte | 2 +- .../Functional/InstallerControllerTest.php | 12 ++++--- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/Controller/InstallerController.php b/src/Controller/InstallerController.php index 47f223f16..dcca7a895 100644 --- a/src/Controller/InstallerController.php +++ b/src/Controller/InstallerController.php @@ -201,10 +201,13 @@ class InstallerController extends ControllerBase { /** * Unlocks and destroys the stage. * + * @param \Symfony\Component\HttpFoundation\Request $request + * The current request. + * * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse * Redirects to the main project browser page. */ - public function unlock(): JsonResponse|RedirectResponse { + public function unlock(Request $request): JsonResponse|RedirectResponse { try { // It's possible the unlock url was provided before applying began, but // accessed after. This final check ensures a destroy is not attempted @@ -231,7 +234,11 @@ class InstallerController extends ControllerBase { } $this->installState->deleteAll(); $this->messenger()->addStatus($this->t('Operation complete, you can add a new project again.')); - return $this->redirect('project_browser.browse'); + + $redirect = Url::fromUserInput($this->getRedirectDestination()->get()) + ->setAbsolute() + ->toString(); + return new RedirectResponse($redirect); } /** @@ -264,20 +271,28 @@ class InstallerController extends ControllerBase { /** * Begins requiring by creating a stage. * + * @param \Symfony\Component\HttpFoundation\Request $request + * The current request. + * * @return \Symfony\Component\HttpFoundation\JsonResponse * Status message. */ - public function begin(): JsonResponse { + public function begin(Request $request): JsonResponse { $stage_available = $this->installer->isAvailable(); if (!$stage_available) { + $unlock_url = self::getUrlWithReplacedCsrfTokenPlaceholder( + Url::fromRoute('project_browser.install.unlock'), + ); + $destination = Url::fromRoute('project_browser.browse', [ + 'source' => $request->query->get('source'), + ]); + $unlock_url .= '&destination=' . $destination->toString(); + $updated_time = $this->installState->getFirstUpdatedTime(); if (!$this->installer->lockCameFromProjectBrowserInstaller()) { return $this->lockedResponse($this->t('The process for adding projects was locked by something else outside of Project Browser. Projects can be added again once the process is unlocked. Try again in a few minutes.'), ''); } if (empty($updated_time)) { - $unlock_url = self::getUrlWithReplacedCsrfTokenPlaceholder( - Url::fromRoute('project_browser.install.unlock') - ); $message = t('The process for adding projects is locked, but that lock has expired. Use [+ unlock link] to unlock the process and try to add the project again.'); return $this->lockedResponse($message, $unlock_url); } @@ -302,10 +317,6 @@ class InstallerController extends ControllerBase { $this->t('The process for adding the project was locked @hours hours, @minutes minutes ago. Use [+ unlock link] to unlock the process.', ['@hours' => $hours, '@minutes' => $minutes]); } - - $unlock_url = self::getUrlWithReplacedCsrfTokenPlaceholder( - Url::fromRoute('project_browser.install.unlock') - ); return $this->lockedResponse($message, $unlock_url); } diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index e3bf78cde7311e469f573fa7adc76209fc1ff82f..4ff8d529363cf0fc13a2821789a743df796310fb 100644 GIT binary patch delta 43 zcmX^1PVn|S!G;#b7N#xCYj2C%7w4B2C8ye|RI4N=mt>Zuh9oA{ZeM$wdFE^YqN5Vk delta 44 zcmccpPVm?}!G;#b7N#xCYj3kBSaT@=!SupA%p%k0-C^dKzUw+O|MoApnbT(j0G~7x AasU7T diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 24ba019944fc57b8a6ebd1810db37f457960657c..1c348a20b8b6679fe8f26fb367526536d44d3c90 100644 GIT binary patch delta 111 zcmeCZF0kpkKtl`T7N(slqV~o4rA5i9wkp*siOD6IWvL;FNww`eRhYK#RAH_<ryuF) zZ0e+w>gbrN<L>C_sN)PGTpb;Kbpjn710md87pP#d%k&TG%pz>oKwai;+jBlMD_Q^m Df0862 delta 87 zcmdmVU7+{6Ktl`T7N(sl?dMdOwx3gBt~zJw>F8|gq~q%7=&0ihB2pb4Q$Z|Woj^y& aKpkh0m=TzS6V{QA&gM?rCw^vDv;Y7T85=YJ diff --git a/sveltejs/src/ProcessQueueButton.svelte b/sveltejs/src/ProcessQueueButton.svelte index 44d4a5b9b..af379705a 100644 --- a/sveltejs/src/ProcessQueueButton.svelte +++ b/sveltejs/src/ProcessQueueButton.svelte @@ -110,7 +110,7 @@ * Returns a promise that resolves once the download and activation process is complete. */ async function doRequests(projectIds) { - const beginInstallUrl = `${BASE_URL}admin/modules/project_browser/install-begin`; + const beginInstallUrl = `${BASE_URL}admin/modules/project_browser/install-begin?source=${$activeTab}`; const beginInstallResponse = await fetch(beginInstallUrl); if (!beginInstallResponse.ok) { await handleError(beginInstallResponse); diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index ccba786a5..0c488ff2c 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -487,15 +487,19 @@ class InstallerControllerTest extends BrowserTestBase { $this->doStart(); // Try beginning another install while one is in progress, but not yet in // the applying stage. - $content = $this->drupalGet('admin/modules/project_browser/install-begin'); + $content = $this->drupalGet('admin/modules/project_browser/install-begin', [ + 'query' => [ + 'source' => 'project_browser_test_mock', + ], + ]); $this->assertSession()->statusCodeEquals(418); $this->assertFalse($this->installer->isAvailable()); $this->assertFalse($this->installer->isApplying()); $json = Json::decode($content); $this->assertSame('The process for adding projects is locked, but that lock has expired. Use [+ unlock link] to unlock the process and try to add the project again.', $json['message']); - $path = explode('?', $json['unlock_url'])[0]; - $token = explode('=', $json['unlock_url'])[1]; - $unlock_content = $this->drupalGet($path, ['query' => ['token' => $token]]); + $unlock_url = parse_url($json['unlock_url']); + parse_str($unlock_url['query'], $unlock_url['query']); + $unlock_content = $this->drupalGet($unlock_url['path'], ['query' => $unlock_url['query']]); $this->assertSession()->statusCodeEquals(200); $this->assertTrue($this->installer->isAvailable()); $this->assertStringContainsString('Operation complete, you can add a new project again.', $unlock_content); -- GitLab From 36f0c32906122f57d5f3cc53492eb0d9e81260b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 20:47:00 -0500 Subject: [PATCH 16/41] Fix unlock test --- tests/src/Functional/InstallerControllerTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index 0c488ff2c..59067accf 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -521,9 +521,9 @@ class InstallerControllerTest extends BrowserTestBase { $this->assertFalse($this->installer->isApplying()); $json = Json::decode($content); $this->assertSame('The process for adding projects is locked, but that lock has expired. Use [+ unlock link] to unlock the process and try to add the project again.', $json['message']); - $path = explode('?', $json['unlock_url'])[0]; - $token = explode('=', $json['unlock_url'])[1]; - $unlock_content = $this->drupalGet($path, ['query' => ['token' => $token]]); + $unlock_url = parse_url($json['unlock_url']); + parse_str($unlock_url['query'], $unlock_url['query']); + $unlock_content = $this->drupalGet($path, ['query' => $unlock_url['query']]); $this->assertSession()->statusCodeEquals(200); $this->assertTrue($this->installer->isAvailable()); $this->assertStringContainsString('Operation complete, you can add a new project again.', $unlock_content); -- GitLab From 3296b9f0cc0c7ee97f7d4ea44a1f056fecfad67b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 21:13:17 -0500 Subject: [PATCH 17/41] Fix testInstallUnlockMessage --- .../Functional/InstallerControllerTest.php | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index 59067accf..4ed3355a0 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -439,10 +439,27 @@ class InstallerControllerTest extends BrowserTestBase { $this->doStart(); $this->doRequire(); + $request_options = [ + 'query' => ['source' => 'project_browser_test_mock'], + ]; + + $assert_unlock_response = function (string $response, string $expected_message): void { + $response = Json::decode($response); + $this->assertSame($expected_message, $response['message']); + + if ($response['unlock_url']) { + $this->assertStringStartsWith('/admin/modules/project_browser/install/unlock?', $response['unlock_url']); + $query = parse_url($response['unlock_url'], PHP_URL_QUERY); + parse_str($query, $query); + $this->assertNotEmpty($query['token']); + $this->assertSame('/admin/modules/browse/project_browser_test_mock', $query['destination']); + } + }; + // Check for mid install unlock offer message. - $this->drupalGet('admin/modules/project_browser/install-begin'); + $response = $this->drupalGet('admin/modules/project_browser/install-begin', $request_options); $this->assertSession()->statusCodeEquals(418); - $this->assertMatchesRegularExpression('/{"message":"The process for adding the project that was locked less than 1 minutes ago might still be in progress. Consider waiting a few more minutes before using \[\+unlock link\].","unlock_url":".*admin..modules..project_browser..install..unlock\?token=[a-zA-Z0-9_-]*"}/', $this->getSession()->getPage()->getContent()); + $assert_unlock_response($response, "The process for adding the project that was locked less than 1 minutes ago might still be in progress. Consider waiting a few more minutes before using [+unlock link]."); $expected = [ 'project_browser_test_mock/awesome_module' => [ 'source' => 'project_browser_test_mock', @@ -453,27 +470,27 @@ class InstallerControllerTest extends BrowserTestBase { $this->assertFalse($this->installer->isAvailable()); $this->assertFalse($this->installer->isApplying()); TestTime::setFakeTimeByOffset("+800 seconds"); - $this->drupalGet('admin/modules/project_browser/install-begin'); + $response = $this->drupalGet('admin/modules/project_browser/install-begin', $request_options); $this->assertSession()->statusCodeEquals(418); $this->assertFalse($this->installer->isAvailable()); $this->assertFalse($this->installer->isApplying()); - $this->assertMatchesRegularExpression('/{"message":"The process for adding the project was locked 13 minutes ago. Use \[\+ unlock link\] to unlock the process.","unlock_url":".*admin..modules..project_browser..install..unlock\?token=[a-zA-Z0-9_-]*"}/', $this->getSession()->getPage()->getContent()); + $assert_unlock_response($response, "The process for adding the project was locked 13 minutes ago. Use [+ unlock link] to unlock the process."); $this->doApply(); TestTime::setFakeTimeByOffset('+800 seconds'); - $this->drupalGet('admin/modules/project_browser/install-begin'); + $response = $this->drupalGet('admin/modules/project_browser/install-begin', $request_options); $this->assertSession()->statusCodeEquals(418); $this->assertFalse($this->installer->isAvailable()); $this->assertTrue($this->installer->isApplying()); - $this->assertMatchesRegularExpression('/{"message":"The process for adding the project was locked 13 minutes ago. It should not be unlocked while changes are being applied to the site.","unlock_url":""}/', $this->getSession()->getPage()->getContent()); + $assert_unlock_response($response, "The process for adding the project was locked 13 minutes ago. It should not be unlocked while changes are being applied to the site."); TestTime::setFakeTimeByOffset("+55 minutes"); - $this->drupalGet('admin/modules/project_browser/install-begin'); + $response = $this->drupalGet('admin/modules/project_browser/install-begin', $request_options); $this->assertSession()->statusCodeEquals(418); - $this->assertMatchesRegularExpression('/{"message":"The process for adding the project was locked 55 minutes ago. It should not be unlocked while changes are being applied to the site.","unlock_url":""}/', $this->getSession()->getPage()->getContent()); + $assert_unlock_response($response, "The process for adding the project was locked 55 minutes ago. It should not be unlocked while changes are being applied to the site."); // Unlocking the stage becomes possible after 1 hour regardless of source. TestTime::setFakeTimeByOffset("+75 minutes"); - $this->drupalGet('admin/modules/project_browser/install-begin'); + $response = $this->drupalGet('admin/modules/project_browser/install-begin', $request_options); $this->assertSession()->statusCodeEquals(418); - $this->assertMatchesRegularExpression('/{"message":"The process for adding the project was locked 1 hours, 15 minutes ago. Use \[\+ unlock link\] to unlock the process.","unlock_url":".*admin..modules..project_browser..install..unlock\?token=[a-zA-Z0-9_-]*"}/', $this->getSession()->getPage()->getContent()); + $assert_unlock_response($response, "The process for adding the project was locked 1 hours, 15 minutes ago. Use [+ unlock link] to unlock the process."); } /** -- GitLab From 96e7cbebbfca08658b587579b686259ca0874498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 21:24:47 -0500 Subject: [PATCH 18/41] This should fix InstallerControllerTest --- tests/src/Functional/InstallerControllerTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index 4ed3355a0..ca259635d 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -532,7 +532,9 @@ class InstallerControllerTest extends BrowserTestBase { public function testCanBreakStageWithMissingProjectBrowserLock() { $this->doStart(); $this->container->get(InstallState::class)->deleteAll(); - $content = $this->drupalGet('admin/modules/project_browser/install-begin'); + $content = $this->drupalGet('admin/modules/project_browser/install-begin', [ + 'query' => ['source' => 'project_browser_test_mock'], + ]); $this->assertSession()->statusCodeEquals(418); $this->assertFalse($this->installer->isAvailable()); $this->assertFalse($this->installer->isApplying()); @@ -540,7 +542,7 @@ class InstallerControllerTest extends BrowserTestBase { $this->assertSame('The process for adding projects is locked, but that lock has expired. Use [+ unlock link] to unlock the process and try to add the project again.', $json['message']); $unlock_url = parse_url($json['unlock_url']); parse_str($unlock_url['query'], $unlock_url['query']); - $unlock_content = $this->drupalGet($path, ['query' => $unlock_url['query']]); + $unlock_content = $this->drupalGet($unlock_url['path'], ['query' => $unlock_url['query']]); $this->assertSession()->statusCodeEquals(200); $this->assertTrue($this->installer->isAvailable()); $this->assertStringContainsString('Operation complete, you can add a new project again.', $unlock_content); -- GitLab From 6400500208926b6531628dfb203acd350e7ee0e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 21:42:10 -0500 Subject: [PATCH 19/41] Fix some functional JS tests --- .../Functional/InstallerControllerTest.php | 2 +- .../ProjectBrowserExamplePluginTest.php | 2 +- .../ProjectBrowserInstallerUiTest.php | 26 ++++---- .../ProjectBrowserPluginTest.php | 14 ++--- .../ProjectBrowserUiTest.php | 62 +++++++++---------- .../ProjectBrowserUiTestJsonApi.php | 34 +++++----- .../TranslatedSvelteAppTest.php | 4 +- 7 files changed, 72 insertions(+), 72 deletions(-) diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index ca259635d..9ebbdd3a2 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -448,7 +448,7 @@ class InstallerControllerTest extends BrowserTestBase { $this->assertSame($expected_message, $response['message']); if ($response['unlock_url']) { - $this->assertStringStartsWith('/admin/modules/project_browser/install/unlock?', $response['unlock_url']); + $this->assertStringEndsWith('/admin/modules/project_browser/install/unlock', parse_url($response['unlock_url'], PHP_URL_PATH)); $query = parse_url($response['unlock_url'], PHP_URL_QUERY); parse_str($query, $query); $this->assertNotEmpty($query['token']); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php index c33faf916..cab2cbebb 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php @@ -48,7 +48,7 @@ class ProjectBrowserExamplePluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index cb0008fc9..7d6ced2b7 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -71,7 +71,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testSingleModuleAddAndInstall(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -99,7 +99,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testInstallModuleAlreadyInFilesystem() { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $pinky_brain_selector = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $action_button = $assert_session->waitForElementVisible('css', "$pinky_brain_selector button.project__action_button"); @@ -133,7 +133,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -163,7 +163,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -176,7 +176,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); $this->assertTrue($assert_session->waitForText('The configuration options have been saved.')); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $action_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $this->assertNotEmpty($action_button); @@ -198,7 +198,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { // Start install begin. $this->drupalGet('admin/modules/project_browser/install-begin'); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -240,7 +240,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { // Start install begin. $this->drupalGet('admin/modules/project_browser/install-begin'); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -272,7 +272,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('project_browser_test.simulated_result_severity', SystemManager::REQUIREMENT_ERROR); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $settings = $this->getDrupalSettings(); $this->assertTrue($settings['project_browser']['package_manager']['status_checked']); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); @@ -293,7 +293,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->statusMessageContains("Simulate a warning message for the project browser.", 'warning'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -346,7 +346,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testMultipleModuleAddAndInstall(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $this->svelteInitHelper('text', 'Kangaroo'); $assert_session->buttonNotExists('Install selected projects'); @@ -398,7 +398,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testPluginSpecificQueue() { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $assert_session->buttonNotExists('Install selected projects'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -430,7 +430,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->drupalGet('admin/modules/project_browser/install-begin'); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -450,7 +450,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { */ public function testSelectDeselectToggleInModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->waitForButton('Helvetica')?->click(); // Click select button in modal. diff --git a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php index 43c6508da..281790162 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php @@ -56,7 +56,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -70,7 +70,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); } @@ -85,7 +85,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); // Immediately clear filters so there are enough visible to enable paging. $this->svelteInitHelper('test', 'Clear Filters'); $this->svelteInitHelper('css', '.pager__item--next'); @@ -102,7 +102,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testAdvancedFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Results'); $this->assertEquals('Show projects covered by a security policy', $this->getElementText(self::SECURITY_OPTION_SELECTOR . self::OPTION_CHECKED)); @@ -136,7 +136,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testBrokenImages(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', 'img[src$="images/puzzle-piece-placeholder.svg"]'); // RandomData always give an image URL. Sometimes it is a fake URL on @@ -149,7 +149,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests the not-compatible flag. */ public function testNotCompatibleText(): void { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.project_status-indicator'); $this->assertEquals($this->getElementText('.project_status-indicator .visually-hidden') . ' Not compatible', $this->getElementText('.project_status-indicator')); } @@ -161,7 +161,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); $this->assertTrue($assert_session->waitForText('Results')); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index ed47bea14..6d4824d7c 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -68,7 +68,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#pb-project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -97,7 +97,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } @@ -109,7 +109,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Dancing Queen'); // Click to open module page. @@ -123,7 +123,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText('10 Results')); @@ -196,7 +196,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testTargetBlank(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); } @@ -207,7 +207,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testReadonlyFields(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForElementVisible('css', '.project__action_button'); @@ -235,7 +235,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', '10 Results'); $this->assertProjectsVisible([ @@ -323,7 +323,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->pressWithWait('Clear filters'); $assert_session->waitForText('Modules per page'); @@ -341,7 +341,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Astronaut Simulator'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -450,7 +450,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); $assert_session->elementsCount('css', '#pb-sort option', 4); @@ -542,7 +542,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSearchForSpecialChar(): void { // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', '10 Results'); $this->pressWithWait('Clear filters', '25 Results'); @@ -602,7 +602,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testDetailPage(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -618,7 +618,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testReopenDetailModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -643,7 +643,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testPersistence(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -726,7 +726,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', '25 Results'); $this->pressWithWait('Recommended filters'); @@ -747,7 +747,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Enable module for extra source plugin. $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); // Test categories with multiple plugin enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown__items > div input', 19); @@ -870,7 +870,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -890,7 +890,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Random data'); // Count tabs. $tab_count = $page->findAll('css', '.pb-tabs__link'); @@ -909,7 +909,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Project Browser Mock Plugin'); $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); $this->assertEquals('random_data', $first_tab->getValue()); @@ -924,7 +924,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); @@ -934,7 +934,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } @@ -957,7 +957,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Check visibility of categories in each view. foreach ($view_options as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -978,7 +978,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testPaginationWithFilters(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->pressWithWait('Clear filters'); $this->assertProjectsVisible([ 'Jazz', @@ -1019,7 +1019,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->config('project_browser.admin_settings') ->set('enabled_sources', ['drupal_core']) ->save(TRUE); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->inputSearchField('inline form errors', TRUE); @@ -1059,7 +1059,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testClearKeywordSearch() { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); // Get the original result count. @@ -1086,7 +1086,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSearchClearNoTabIndex(): void { $page = $this->getSession()->getPage(); $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); // Search and confirm clear button has no focus after tabbing. @@ -1111,7 +1111,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -1136,7 +1136,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testActiveInstallVisibility(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); $assert_session->waitForElementVisible('css', '.pb-project'); @@ -1171,7 +1171,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertCount(2, $current_sources); foreach (array_keys($current_sources) as $plugin_id) { - $this->drupalGet("/admin/modules/browse/{$plugin_id}"); + $this->drupalGet("/admin/modules/browse/project_browser_test_mock/{$plugin_id}"); $this->assertNotNull($this->assertSession()->waitForElementVisible('css', '#project-browser .pb-project.pb-project--list')); } } @@ -1182,7 +1182,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testWrenchIcon(): void { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1460, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); // This asserts that status icon is present on the cards. $this->assertNotNull($assert_session->waitForElementVisible('css', '.pb-project__maintenance-icon .pb-project__status-icon-btn')); @@ -1206,7 +1206,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); // Ensure the project list is loaded. $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php index 27d373604..3130dc1c3 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php @@ -59,7 +59,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -86,7 +86,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } @@ -97,7 +97,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testClickableCategory(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); @@ -109,7 +109,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategoryFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText(' Results')); @@ -162,7 +162,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { */ public function testTargetBlank(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -174,7 +174,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', ' Results'); $assert_session->pageTextNotContains(' 0 Results'); $this->assertPagerItems(['1', '2', '3', '4', '5', '…', 'Next', 'Last']); @@ -220,7 +220,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testAdvancedFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Token'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -262,7 +262,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -285,7 +285,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testDetailPage(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -303,7 +303,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', 'Results'); $this->pressWithWait('Recommended filters'); @@ -333,7 +333,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { ->set('enabled_sources', ['recipes', 'project_browser_test_mock']) ->save(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->assertTrue($assert_session->waitForText('Recipes')); $page->pressButton('Recipes'); // Recipes doesn't define any filters so no filters are displayed. @@ -344,7 +344,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $filters_to_define = ['maintenanceStatus', 'securityCoverage']; \Drupal::state()->set('filters_to_define', $filters_to_define); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->assertTrue($assert_session->waitForText('Project Browser Mock Plugin')); $page->pressButton('Project Browser Mock Plugin'); // Drupal.org test mock defines only two filters (actively maintained filter @@ -379,7 +379,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Token'); @@ -398,7 +398,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel']); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $assert_session->waitForElementVisible('css', '.pb-display__button'); // Count tabs. $tab_count = $page->findAll('css', '.pb-tabs__link'); @@ -417,7 +417,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); $this->assertEquals('random_data', $first_tab->getValue()); @@ -432,7 +432,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 20); @@ -442,7 +442,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } diff --git a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php index 3dbf7c367..d9783ff83 100644 --- a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php +++ b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php @@ -70,7 +70,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $translate_to = 'Soorch Foor Moodools'; - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Search'); $this->assertFalse($this->assertSession()->waitForText($translate_to)); @@ -88,7 +88,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $this->submitForm(['string' => 'Search'], 'Filter'); $edit = ['strings[' . $string->lid . '][translations][0]' => $translate_to]; $this->submitForm($edit, 'Save translations'); - $this->drupalGet("/$prefix/admin/modules/browse"); + $this->drupalGet("/$prefix/admin/modules/browse/project_browser_test_mock/project_browser_test_mock"); $this->svelteInitHelper('text', $translate_to); } -- GitLab From 21da7cee09d1b26660954acc14167cbeac5f746b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 21:53:12 -0500 Subject: [PATCH 20/41] Fix more functional JS tests --- .../ProjectBrowserExamplePluginTest.php | 2 +- .../ProjectBrowserInstallerUiTest.php | 11 ++++++----- .../ProjectBrowserPluginTest.php | 16 +++++++--------- .../ProjectBrowserUiTest.php | 6 +++--- .../TranslatedSvelteAppTest.php | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php index cab2cbebb..8265c2911 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php @@ -48,7 +48,7 @@ class ProjectBrowserExamplePluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/project_browser_source_example'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index 7d6ced2b7..b3ad50e25 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -133,7 +133,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/recipes'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -439,10 +439,11 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $download_button->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); $page->pressButton('Install selected projects'); - $this->assertMatchesRegularExpression( - '/.*\/admin\/modules\/project_browser\/install\/unlock\?token=[\w\-]+&destination=.*\/admin\/modules\/browse$/', - urldecode($assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href')) - ); + $unlock_url = parse_url($assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href')); + $this->assertStringEndsWith('/admin/modules/project_browser/install/unlock', $unlock_url['path']); + parse_str($unlock_url['query'], $unlock_url['query']); + $this->assertNotEmpty($unlock_url['query']['token']); + $this->assertStringEndsWith('/admin/modules/browse/project_browser_test_mock', $unlock_url['query']['destination']); } /** diff --git a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php index 281790162..013f583bf 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php @@ -56,7 +56,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -70,7 +70,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); } @@ -85,7 +85,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); // Immediately clear filters so there are enough visible to enable paging. $this->svelteInitHelper('test', 'Clear Filters'); $this->svelteInitHelper('css', '.pager__item--next'); @@ -100,9 +100,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests advanced filtering. */ public function testAdvancedFiltering(): void { - $assert_session = $this->assertSession(); - - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('text', 'Results'); $this->assertEquals('Show projects covered by a security policy', $this->getElementText(self::SECURITY_OPTION_SELECTOR . self::OPTION_CHECKED)); @@ -136,7 +134,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testBrokenImages(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', 'img[src$="images/puzzle-piece-placeholder.svg"]'); // RandomData always give an image URL. Sometimes it is a fake URL on @@ -149,7 +147,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests the not-compatible flag. */ public function testNotCompatibleText(): void { - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.project_status-indicator'); $this->assertEquals($this->getElementText('.project_status-indicator .visually-hidden') . ' Not compatible', $this->getElementText('.project_status-indicator')); } @@ -161,7 +159,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); $this->assertTrue($assert_session->waitForText('Results')); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index 6d4824d7c..cfbc3bb96 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -890,7 +890,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('text', 'Random data'); // Count tabs. $tab_count = $page->findAll('css', '.pb-tabs__link'); @@ -1019,7 +1019,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->config('project_browser.admin_settings') ->set('enabled_sources', ['drupal_core']) ->save(TRUE); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/drupal_core'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->inputSearchField('inline form errors', TRUE); @@ -1111,7 +1111,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/recipes'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); diff --git a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php index d9783ff83..3b46d6b88 100644 --- a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php +++ b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php @@ -88,7 +88,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $this->submitForm(['string' => 'Search'], 'Filter'); $edit = ['strings[' . $string->lid . '][translations][0]' => $translate_to]; $this->submitForm($edit, 'Save translations'); - $this->drupalGet("/$prefix/admin/modules/browse/project_browser_test_mock/project_browser_test_mock"); + $this->drupalGet("/$prefix/admin/modules/browse/project_browser_test_mock"); $this->svelteInitHelper('text', $translate_to); } -- GitLab From 1f0a47211173be6f38fdbcf011affa311fb4f447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 22:13:51 -0500 Subject: [PATCH 21/41] Fix a few more --- .../ProjectBrowserSource/RandomDataPlugin.php | 1 + project_browser.module | 2 +- src/Plugin/Derivative/LocalTaskDeriver.php | 2 + .../DrupalDotOrgJsonApi.php | 1 - .../ProjectBrowserTestMock.php | 1 - .../ProjectBrowserInstallerUiTest.php | 6 +-- .../ProjectBrowserUiTest.php | 47 +++++++++---------- .../TranslatedSvelteAppTest.php | 3 ++ 8 files changed, 31 insertions(+), 32 deletions(-) diff --git a/modules/project_browser_devel/src/Plugin/ProjectBrowserSource/RandomDataPlugin.php b/modules/project_browser_devel/src/Plugin/ProjectBrowserSource/RandomDataPlugin.php index 9e28991b6..7b16a795f 100644 --- a/modules/project_browser_devel/src/Plugin/ProjectBrowserSource/RandomDataPlugin.php +++ b/modules/project_browser_devel/src/Plugin/ProjectBrowserSource/RandomDataPlugin.php @@ -22,6 +22,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * id = "random_data", * label = @Translation("Random data"), * description = @Translation("Gets random project and filters information"), + * local_task = {} * ) */ class RandomDataPlugin extends ProjectBrowserSourceBase { diff --git a/project_browser.module b/project_browser.module index bb1f8092d..a823a5531 100644 --- a/project_browser.module +++ b/project_browser.module @@ -53,7 +53,7 @@ function project_browser_project_browser_source_info_alter(array &$definitions): 'label' => t('Recipes'), 'description' => t('Recipes available in the local code base'), 'local_task' => [ - 'weight' => $definitions['drupalorg_jsonapi']['local_task']['weight'] + 2, + 'weight' => ($definitions['drupalorg_jsonapi']['local_task']['weight'] ?? 5) + 2, ], 'class' => Recipes::class, ]; diff --git a/src/Plugin/Derivative/LocalTaskDeriver.php b/src/Plugin/Derivative/LocalTaskDeriver.php index 210f0f3ac..cb2d31d4a 100644 --- a/src/Plugin/Derivative/LocalTaskDeriver.php +++ b/src/Plugin/Derivative/LocalTaskDeriver.php @@ -34,6 +34,7 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { + $i = 5; foreach ($this->enabledSources->getCurrentSources() as $source) { $source_definition = $source->getPluginDefinition(); @@ -43,6 +44,7 @@ final class LocalTaskDeriver extends DeriverBase implements ContainerDeriverInte // source's administrative label. $local_task += [ 'title' => $source_definition['label'], + 'weight' => $i++, ]; $source_id = $source->getPluginId(); $local_task['route_parameters'] = [ diff --git a/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php b/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php index 0d7f4e9c3..70e1496b7 100644 --- a/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php +++ b/src/Plugin/ProjectBrowserSource/DrupalDotOrgJsonApi.php @@ -32,7 +32,6 @@ use Symfony\Component\HttpFoundation\Response; * description = @Translation("Modules on Drupal.org queried via the JSON:API endpoint"), * local_task = { * "title" = @Translation("Browse"), - * "weight" = 5, * } * ) */ diff --git a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php index c60283dea..081570f20 100644 --- a/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php +++ b/tests/modules/project_browser_test/src/Plugin/ProjectBrowserSource/ProjectBrowserTestMock.php @@ -31,7 +31,6 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * description = @Translation("Gets project and filters information from a database"), * local_task = { * "title" = @Translation("Browse"), - * "weight" = 5, * } * ) */ diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index b3ad50e25..ce047bf37 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -406,7 +406,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button1->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->pressWithWait('random_data'); + $this->drupalGet('/admin/modules/browse/random_data'); $assert_session->buttonNotExists('Install selected projects'); $random_data = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $select_button2 = $assert_session->waitForElementVisible('css', "$random_data button.project__action_button"); @@ -414,11 +414,11 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button2->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->pressWithWait('project_browser_test_mock'); + $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); $select_button1 = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $select_button1->click(); $assert_session->buttonNotExists('Install selected projects'); - $this->pressWithWait('random_data'); + $this->drupalGet('/admin/modules/browse/random_data'); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); } diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index cfbc3bb96..9840a98af 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -39,6 +39,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * {@inheritdoc} */ protected static $modules = [ + 'block', 'project_browser', 'project_browser_test', ]; @@ -752,20 +753,12 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session->elementsCount('css', '.pb-filter__multi-dropdown__items > div input', 19); $this->svelteInitHelper('css', '#project-browser .pb-project'); - // Count tabs. - $tab_count = $page->findAll('css', '.pb-tabs__link'); - $this->assertCount(2, $tab_count); - // Get result count for first tab. $this->assertEquals('10 Results', $this->getElementText('.pb-search-results')); - // Get second tab text. - $second_tab_text = $assert_session->buttonExists('random_data')->getText(); - // Apply filters in project_browser_test_mock(first tab). + // Apply filters in project_browser_test_mock (first source). $assert_session->waitForElement('css', '.views-exposed-form__item input[type="checkbox"]'); $this->pressWithWait('Clear filters', '25 Results'); - // Removing/applying filters will not change second tab results. - $this->assertSame($second_tab_text, $assert_session->buttonExists('random_data')->getText()); // Open category drop-down. $this->clickWithWait('.pb-filter__multi-dropdown', 'E-commerce', TRUE); @@ -782,8 +775,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertSession()->elementExists('css', '.pb-filter__multi-dropdown')->blur(); $this->assertSame('2 categories selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); - // Click other tab. - $this->pressWithWait('random_data'); + // Visit the other source. + $this->drupalGet('/admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown__items > div input', 20); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -811,16 +804,16 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Save the number of results. $results_before = count($page->findAll('css', '#project-browser .pb-project.list')); - // Switch back to first tab. - $this->pressWithWait('project_browser_test_mock'); + // Switch back to first source. + $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); $this->assertSame('2 categories selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); $first_filter_element = $page->find('css', 'p.filter-applied:nth-child(1)'); $this->assertEquals('E-commerce', $first_filter_element->find('css', '.filter-applied__label')->getText()); $second_filter_element = $page->find('css', 'p.filter-applied:nth-child(2)'); $this->assertEquals('Media', $second_filter_element->find('css', '.filter-applied__label')->getText()); - // Again switch to second tab. - $this->pressWithWait('random_data'); + // Again switch to second source. + $this->drupalGet('/admin/modules/browse/random_data'); // Assert that the filters persist. $this->assertEquals($applied_filter, $this->getElementText('p.filter-applied:nth-child(1) .filter-applied__label')); $this->assertSame('1 category selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); @@ -829,8 +822,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $results_after = count($page->findAll('css', '#project-browser .pb-project.list')); $this->assertEquals($results_before, $results_after); - // Switch back to first tab. - $this->pressWithWait('project_browser_test_mock'); + // Switch back to first source. + $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); // Filter by search text. $this->inputSearchField('Number', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -839,11 +832,11 @@ class ProjectBrowserUiTest extends WebDriverTestBase { '9 Starts With a Higher Number', '1 Starts With a Number', ]); - // Again switch to second tab. - $this->pressWithWait('random_data'); + // Again switch to second source. + $this->drupalGet('/admin/modules/browse/random_data'); $this->pressWithWait('Clear filters'); - // Switch back to first tab. - $this->pressWithWait('project_browser_test_mock'); + // Switch back to first source. + $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '#project-browser .pb-project'); // Assert that the filters persist. $this->assertTrue($assert_session->waitForText('2 Results')); @@ -886,19 +879,20 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests tabledrag on configuration page. */ public function testTabledrag(): void { + $this->drupalPlaceBlock('local_tasks_block'); + $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); $this->drupalGet('admin/modules/browse/random_data'); + $local_tasks = $assert_session->elementExists('css', 'h2:contains("Primary tabs") + ul') + ->findAll('css', 'a[href*="/admin/modules/browse/"]'); + $this->assertCount(2, $local_tasks); $this->svelteInitHelper('text', 'Random data'); - // Count tabs. - $tab_count = $page->findAll('css', '.pb-tabs__link'); - $this->assertCount(2, $tab_count); // Verify that the mock plugin is first tab. - $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('project_browser_test_mock', $first_tab->getValue()); + $this->assertStringEndsWith('/project_browser_test_mock', $local_tasks[0]->getAttribute('href')); // Re-order plugins. $this->drupalGet('admin/config/development/project_browser'); @@ -911,6 +905,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Verify that Random data is first tab. $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Project Browser Mock Plugin'); + $this->assertStringEndsWith('/random_data', $local_tasks[0]->getAttribute('href')); $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); $this->assertEquals('random_data', $first_tab->getValue()); diff --git a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php index 3b46d6b88..87ab695ec 100644 --- a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php +++ b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php @@ -45,6 +45,9 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { 'translate interface', 'administer modules', ]); + $this->config('project_browser.admin_settings') + ->set('enabled_sources', ['project_browser_test_mock']) + ->save(); // Add custom language. $this->drupalLogin($admin_user); -- GitLab From 7b8a131b71f8c3beb0d81ef3e26626573204f452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 22:50:37 -0500 Subject: [PATCH 22/41] Fix testTabledrag --- tests/src/FunctionalJavascript/ProjectBrowserUiTest.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index 9840a98af..43807bdab 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -904,10 +904,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Verify that Random data is first tab. $this->drupalGet('admin/modules/browse/project_browser_test_mock'); - $this->svelteInitHelper('text', 'Project Browser Mock Plugin'); $this->assertStringEndsWith('/random_data', $local_tasks[0]->getAttribute('href')); - $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('random_data', $first_tab->getValue()); // Disable the mock plugin. $this->drupalGet('admin/config/development/project_browser'); @@ -919,7 +916,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); -- GitLab From 2e4ca364e1a648911f933348ce54c797d53923c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 22:58:10 -0500 Subject: [PATCH 23/41] Fix bad assertion in InstallerControllerTest --- tests/src/Functional/InstallerControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/Functional/InstallerControllerTest.php b/tests/src/Functional/InstallerControllerTest.php index 9ebbdd3a2..077925545 100644 --- a/tests/src/Functional/InstallerControllerTest.php +++ b/tests/src/Functional/InstallerControllerTest.php @@ -452,7 +452,7 @@ class InstallerControllerTest extends BrowserTestBase { $query = parse_url($response['unlock_url'], PHP_URL_QUERY); parse_str($query, $query); $this->assertNotEmpty($query['token']); - $this->assertSame('/admin/modules/browse/project_browser_test_mock', $query['destination']); + $this->assertStringEndsWith('/admin/modules/browse/project_browser_test_mock', $query['destination']); } }; -- GitLab From fa718d5cb02c5556b85fa95fc4181b5273e35437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Wed, 18 Dec 2024 23:41:30 -0500 Subject: [PATCH 24/41] Restore all functional JS tests to their 2.0.x state for now --- .../ProjectBrowserExamplePluginTest.php | 2 +- .../ProjectBrowserInstallerUiTest.php | 41 ++++--- .../ProjectBrowserPluginTest.php | 16 +-- .../ProjectBrowserUiTest.php | 112 ++++++++++-------- .../ProjectBrowserUiTestJsonApi.php | 34 +++--- .../TranslatedSvelteAppTest.php | 7 +- 6 files changed, 109 insertions(+), 103 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php index 8265c2911..c33faf916 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php @@ -48,7 +48,7 @@ class ProjectBrowserExamplePluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse/project_browser_source_example'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index ce047bf37..cb0008fc9 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -71,7 +71,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testSingleModuleAddAndInstall(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -99,7 +99,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testInstallModuleAlreadyInFilesystem() { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $pinky_brain_selector = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $action_button = $assert_session->waitForElementVisible('css', "$pinky_brain_selector button.project__action_button"); @@ -133,7 +133,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse/recipes'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -163,7 +163,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -176,7 +176,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); $this->assertTrue($assert_session->waitForText('The configuration options have been saved.')); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $action_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $this->assertNotEmpty($action_button); @@ -198,7 +198,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { // Start install begin. $this->drupalGet('admin/modules/project_browser/install-begin'); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -240,7 +240,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { // Start install begin. $this->drupalGet('admin/modules/project_browser/install-begin'); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -272,7 +272,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('project_browser_test.simulated_result_severity', SystemManager::REQUIREMENT_ERROR); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $settings = $this->getDrupalSettings(); $this->assertTrue($settings['project_browser']['package_manager']['status_checked']); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); @@ -293,7 +293,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->statusMessageContains("Simulate a warning message for the project browser.", 'warning'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -346,7 +346,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testMultipleModuleAddAndInstall(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $this->svelteInitHelper('text', 'Kangaroo'); $assert_session->buttonNotExists('Install selected projects'); @@ -398,7 +398,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testPluginSpecificQueue() { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $assert_session->buttonNotExists('Install selected projects'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -406,7 +406,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button1->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->drupalGet('/admin/modules/browse/random_data'); + $this->pressWithWait('random_data'); $assert_session->buttonNotExists('Install selected projects'); $random_data = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $select_button2 = $assert_session->waitForElementVisible('css', "$random_data button.project__action_button"); @@ -414,11 +414,11 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button2->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); + $this->pressWithWait('project_browser_test_mock'); $select_button1 = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $select_button1->click(); $assert_session->buttonNotExists('Install selected projects'); - $this->drupalGet('/admin/modules/browse/random_data'); + $this->pressWithWait('random_data'); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); } @@ -430,7 +430,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->drupalGet('admin/modules/project_browser/install-begin'); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -439,11 +439,10 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $download_button->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); $page->pressButton('Install selected projects'); - $unlock_url = parse_url($assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href')); - $this->assertStringEndsWith('/admin/modules/project_browser/install/unlock', $unlock_url['path']); - parse_str($unlock_url['query'], $unlock_url['query']); - $this->assertNotEmpty($unlock_url['query']['token']); - $this->assertStringEndsWith('/admin/modules/browse/project_browser_test_mock', $unlock_url['query']['destination']); + $this->assertMatchesRegularExpression( + '/.*\/admin\/modules\/project_browser\/install\/unlock\?token=[\w\-]+&destination=.*\/admin\/modules\/browse$/', + urldecode($assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href')) + ); } /** @@ -451,7 +450,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { */ public function testSelectDeselectToggleInModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->waitForButton('Helvetica')?->click(); // Click select button in modal. diff --git a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php index 013f583bf..43c6508da 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php @@ -56,7 +56,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -70,7 +70,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); } @@ -85,7 +85,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); // Immediately clear filters so there are enough visible to enable paging. $this->svelteInitHelper('test', 'Clear Filters'); $this->svelteInitHelper('css', '.pager__item--next'); @@ -100,7 +100,9 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests advanced filtering. */ public function testAdvancedFiltering(): void { - $this->drupalGet('admin/modules/browse/random_data'); + $assert_session = $this->assertSession(); + + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Results'); $this->assertEquals('Show projects covered by a security policy', $this->getElementText(self::SECURITY_OPTION_SELECTOR . self::OPTION_CHECKED)); @@ -134,7 +136,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testBrokenImages(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', 'img[src$="images/puzzle-piece-placeholder.svg"]'); // RandomData always give an image URL. Sometimes it is a fake URL on @@ -147,7 +149,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests the not-compatible flag. */ public function testNotCompatibleText(): void { - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.project_status-indicator'); $this->assertEquals($this->getElementText('.project_status-indicator .visually-hidden') . ' Not compatible', $this->getElementText('.project_status-indicator')); } @@ -159,7 +161,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); $this->assertTrue($assert_session->waitForText('Results')); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index 43807bdab..ed47bea14 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -39,7 +39,6 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * {@inheritdoc} */ protected static $modules = [ - 'block', 'project_browser', 'project_browser_test', ]; @@ -69,7 +68,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#pb-project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -98,7 +97,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } @@ -110,7 +109,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Dancing Queen'); // Click to open module page. @@ -124,7 +123,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText('10 Results')); @@ -197,7 +196,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testTargetBlank(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); } @@ -208,7 +207,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testReadonlyFields(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForElementVisible('css', '.project__action_button'); @@ -236,7 +235,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', '10 Results'); $this->assertProjectsVisible([ @@ -324,7 +323,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->pressWithWait('Clear filters'); $assert_session->waitForText('Modules per page'); @@ -342,7 +341,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Astronaut Simulator'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -451,7 +450,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); $assert_session->elementsCount('css', '#pb-sort option', 4); @@ -543,7 +542,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSearchForSpecialChar(): void { // Clear filters. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', '10 Results'); $this->pressWithWait('Clear filters', '25 Results'); @@ -603,7 +602,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testDetailPage(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -619,7 +618,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testReopenDetailModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -644,7 +643,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testPersistence(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -727,7 +726,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', '25 Results'); $this->pressWithWait('Recommended filters'); @@ -748,17 +747,25 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Enable module for extra source plugin. $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); // Test categories with multiple plugin enabled. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown__items > div input', 19); $this->svelteInitHelper('css', '#project-browser .pb-project'); + // Count tabs. + $tab_count = $page->findAll('css', '.pb-tabs__link'); + $this->assertCount(2, $tab_count); + // Get result count for first tab. $this->assertEquals('10 Results', $this->getElementText('.pb-search-results')); + // Get second tab text. + $second_tab_text = $assert_session->buttonExists('random_data')->getText(); - // Apply filters in project_browser_test_mock (first source). + // Apply filters in project_browser_test_mock(first tab). $assert_session->waitForElement('css', '.views-exposed-form__item input[type="checkbox"]'); $this->pressWithWait('Clear filters', '25 Results'); + // Removing/applying filters will not change second tab results. + $this->assertSame($second_tab_text, $assert_session->buttonExists('random_data')->getText()); // Open category drop-down. $this->clickWithWait('.pb-filter__multi-dropdown', 'E-commerce', TRUE); @@ -775,8 +782,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertSession()->elementExists('css', '.pb-filter__multi-dropdown')->blur(); $this->assertSame('2 categories selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); - // Visit the other source. - $this->drupalGet('/admin/modules/browse/random_data'); + // Click other tab. + $this->pressWithWait('random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown__items > div input', 20); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -804,16 +811,16 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Save the number of results. $results_before = count($page->findAll('css', '#project-browser .pb-project.list')); - // Switch back to first source. - $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); + // Switch back to first tab. + $this->pressWithWait('project_browser_test_mock'); $this->assertSame('2 categories selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); $first_filter_element = $page->find('css', 'p.filter-applied:nth-child(1)'); $this->assertEquals('E-commerce', $first_filter_element->find('css', '.filter-applied__label')->getText()); $second_filter_element = $page->find('css', 'p.filter-applied:nth-child(2)'); $this->assertEquals('Media', $second_filter_element->find('css', '.filter-applied__label')->getText()); - // Again switch to second source. - $this->drupalGet('/admin/modules/browse/random_data'); + // Again switch to second tab. + $this->pressWithWait('random_data'); // Assert that the filters persist. $this->assertEquals($applied_filter, $this->getElementText('p.filter-applied:nth-child(1) .filter-applied__label')); $this->assertSame('1 category selected', $page->find('css', '.pb-filter__multi-dropdown__label')->getText()); @@ -822,8 +829,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $results_after = count($page->findAll('css', '#project-browser .pb-project.list')); $this->assertEquals($results_before, $results_after); - // Switch back to first source. - $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); + // Switch back to first tab. + $this->pressWithWait('project_browser_test_mock'); // Filter by search text. $this->inputSearchField('Number', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -832,11 +839,11 @@ class ProjectBrowserUiTest extends WebDriverTestBase { '9 Starts With a Higher Number', '1 Starts With a Number', ]); - // Again switch to second source. - $this->drupalGet('/admin/modules/browse/random_data'); + // Again switch to second tab. + $this->pressWithWait('random_data'); $this->pressWithWait('Clear filters'); - // Switch back to first source. - $this->drupalGet('/admin/modules/browse/project_browser_test_mock'); + // Switch back to first tab. + $this->pressWithWait('project_browser_test_mock'); $this->svelteInitHelper('css', '#project-browser .pb-project'); // Assert that the filters persist. $this->assertTrue($assert_session->waitForText('2 Results')); @@ -863,7 +870,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -879,20 +886,19 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests tabledrag on configuration page. */ public function testTabledrag(): void { - $this->drupalPlaceBlock('local_tasks_block'); - $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse/random_data'); - $local_tasks = $assert_session->elementExists('css', 'h2:contains("Primary tabs") + ul') - ->findAll('css', 'a[href*="/admin/modules/browse/"]'); - $this->assertCount(2, $local_tasks); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Random data'); + // Count tabs. + $tab_count = $page->findAll('css', '.pb-tabs__link'); + $this->assertCount(2, $tab_count); // Verify that the mock plugin is first tab. - $this->assertStringEndsWith('/project_browser_test_mock', $local_tasks[0]->getAttribute('href')); + $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); + $this->assertEquals('project_browser_test_mock', $first_tab->getValue()); // Re-order plugins. $this->drupalGet('admin/config/development/project_browser'); @@ -903,8 +909,10 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); - $this->assertStringEndsWith('/random_data', $local_tasks[0]->getAttribute('href')); + $this->drupalGet('admin/modules/browse'); + $this->svelteInitHelper('text', 'Project Browser Mock Plugin'); + $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); + $this->assertEquals('random_data', $first_tab->getValue()); // Disable the mock plugin. $this->drupalGet('admin/config/development/project_browser'); @@ -916,7 +924,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse/random_data'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); @@ -926,7 +934,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } @@ -949,7 +957,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Check visibility of categories in each view. foreach ($view_options as $selector) { - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -970,7 +978,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testPaginationWithFilters(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->pressWithWait('Clear filters'); $this->assertProjectsVisible([ 'Jazz', @@ -1011,7 +1019,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->config('project_browser.admin_settings') ->set('enabled_sources', ['drupal_core']) ->save(TRUE); - $this->drupalGet('admin/modules/browse/drupal_core'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->inputSearchField('inline form errors', TRUE); @@ -1051,7 +1059,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testClearKeywordSearch() { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-search-results'); // Get the original result count. @@ -1078,7 +1086,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSearchClearNoTabIndex(): void { $page = $this->getSession()->getPage(); $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-search-results'); // Search and confirm clear button has no focus after tabbing. @@ -1103,7 +1111,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse/recipes'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -1128,7 +1136,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testActiveInstallVisibility(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-search-results'); $assert_session->waitForElementVisible('css', '.pb-project'); @@ -1163,7 +1171,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertCount(2, $current_sources); foreach (array_keys($current_sources) as $plugin_id) { - $this->drupalGet("/admin/modules/browse/project_browser_test_mock/{$plugin_id}"); + $this->drupalGet("/admin/modules/browse/{$plugin_id}"); $this->assertNotNull($this->assertSession()->waitForElementVisible('css', '#project-browser .pb-project.pb-project--list')); } } @@ -1174,7 +1182,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testWrenchIcon(): void { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1460, 960); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Helvetica'); // This asserts that status icon is present on the cards. $this->assertNotNull($assert_session->waitForElementVisible('css', '.pb-project__maintenance-icon .pb-project__status-icon-btn')); @@ -1198,7 +1206,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); // Ensure the project list is loaded. $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php index 3130dc1c3..27d373604 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php @@ -59,7 +59,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -86,7 +86,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } @@ -97,7 +97,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testClickableCategory(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); @@ -109,7 +109,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategoryFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText(' Results')); @@ -162,7 +162,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { */ public function testTargetBlank(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -174,7 +174,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', ' Results'); $assert_session->pageTextNotContains(' 0 Results'); $this->assertPagerItems(['1', '2', '3', '4', '5', '…', 'Next', 'Last']); @@ -220,7 +220,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testAdvancedFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Token'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -262,7 +262,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -285,7 +285,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testDetailPage(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -303,7 +303,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', 'Results'); $this->pressWithWait('Recommended filters'); @@ -333,7 +333,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { ->set('enabled_sources', ['recipes', 'project_browser_test_mock']) ->save(); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->assertTrue($assert_session->waitForText('Recipes')); $page->pressButton('Recipes'); // Recipes doesn't define any filters so no filters are displayed. @@ -344,7 +344,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $filters_to_define = ['maintenanceStatus', 'securityCoverage']; \Drupal::state()->set('filters_to_define', $filters_to_define); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->assertTrue($assert_session->waitForText('Project Browser Mock Plugin')); $page->pressButton('Project Browser Mock Plugin'); // Drupal.org test mock defines only two filters (actively maintained filter @@ -379,7 +379,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Token'); @@ -398,7 +398,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel']); - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $assert_session->waitForElementVisible('css', '.pb-display__button'); // Count tabs. $tab_count = $page->findAll('css', '.pb-tabs__link'); @@ -417,7 +417,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); $this->assertEquals('random_data', $first_tab->getValue()); @@ -432,7 +432,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 20); @@ -442,7 +442,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } diff --git a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php index 87ab695ec..3dbf7c367 100644 --- a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php +++ b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php @@ -45,9 +45,6 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { 'translate interface', 'administer modules', ]); - $this->config('project_browser.admin_settings') - ->set('enabled_sources', ['project_browser_test_mock']) - ->save(); // Add custom language. $this->drupalLogin($admin_user); @@ -73,7 +70,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $translate_to = 'Soorch Foor Moodools'; - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->drupalGet('admin/modules/browse'); $this->svelteInitHelper('text', 'Search'); $this->assertFalse($this->assertSession()->waitForText($translate_to)); @@ -91,7 +88,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $this->submitForm(['string' => 'Search'], 'Filter'); $edit = ['strings[' . $string->lid . '][translations][0]' => $translate_to]; $this->submitForm($edit, 'Save translations'); - $this->drupalGet("/$prefix/admin/modules/browse/project_browser_test_mock"); + $this->drupalGet("/$prefix/admin/modules/browse"); $this->svelteInitHelper('text', $translate_to); } -- GitLab From 393329b37ecdccd4c332cf0dc43296f840543099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 00:06:10 -0500 Subject: [PATCH 25/41] Fix ProjectBowserExampleTest, ProjectBrowserInstallerUiTest, and ProjectBrowserPluginTest. --- .../ProjectBrowserExamplePluginTest.php | 2 +- .../ProjectBrowserInstallerUiTest.php | 58 ++++++++++--------- .../ProjectBrowserPluginTest.php | 16 +++-- 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php index c33faf916..8265c2911 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserExamplePluginTest.php @@ -48,7 +48,7 @@ class ProjectBrowserExamplePluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_source_example'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index cb0008fc9..97c1a7061 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -71,7 +71,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testSingleModuleAddAndInstall(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -99,7 +99,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testInstallModuleAlreadyInFilesystem() { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $pinky_brain_selector = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $action_button = $assert_session->waitForElementVisible('css', "$pinky_brain_selector button.project__action_button"); @@ -133,7 +133,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/recipes'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -163,7 +163,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Pinky and the Brain'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -176,7 +176,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); $this->assertTrue($assert_session->waitForText('The configuration options have been saved.')); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $action_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $this->assertNotEmpty($action_button); @@ -192,13 +192,12 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - // Find a project we can install. - $project_id = $this->chooseProjectToInstall(); - // Start install begin. - $this->drupalGet('admin/modules/project_browser/install-begin'); + $this->drupalGet('admin/modules/project_browser/install-begin', [ + 'query' => ['source' => 'project_browser_test_mock'], + ]); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -221,7 +220,6 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $installed_action = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector .project_status-indicator", 30000); $assert_session->waitForText('✓ Cream cheese on a bagel is Installed'); $this->assertSame('✓ Cream cheese on a bagel is Installed', $installed_action->getText()); - } /** @@ -239,8 +237,10 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $project_id = $this->chooseProjectToInstall(['cream_cheese']); // Start install begin. - $this->drupalGet('admin/modules/project_browser/install-begin'); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/project_browser/install-begin', [ + 'query' => ['source' => 'project_browser_test_mock'], + ]); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); // Try beginning another install while one is in progress, but not yet in // the applying stage. @@ -272,7 +272,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { ->set('project_browser_test.simulated_result_severity', SystemManager::REQUIREMENT_ERROR); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $settings = $this->getDrupalSettings(); $this->assertTrue($settings['project_browser']['package_manager']['status_checked']); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); @@ -293,7 +293,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->statusMessageContains("Simulate a warning message for the project browser.", 'warning'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -346,7 +346,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testMultipleModuleAddAndInstall(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $this->svelteInitHelper('text', 'Kangaroo'); $assert_session->buttonNotExists('Install selected projects'); @@ -398,7 +398,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testPluginSpecificQueue() { $assert_session = $this->assertSession(); $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $assert_session->buttonNotExists('Install selected projects'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; @@ -406,7 +406,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button1->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->pressWithWait('random_data'); + $this->drupalGet('admin/modules/browse/random_data'); $assert_session->buttonNotExists('Install selected projects'); $random_data = '#project-browser .pb-layout__main ul > li:nth-child(2)'; $select_button2 = $assert_session->waitForElementVisible('css', "$random_data button.project__action_button"); @@ -414,11 +414,11 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $select_button2->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - $this->pressWithWait('project_browser_test_mock'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $select_button1 = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); $select_button1->click(); $assert_session->buttonNotExists('Install selected projects'); - $this->pressWithWait('random_data'); + $this->drupalGet('admin/modules/browse/random_data'); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); } @@ -428,9 +428,11 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { public function testUnlockLinkMarkup(): void { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/project_browser/install-begin'); + $this->drupalGet('admin/modules/project_browser/install-begin', [ + 'query' => ['source' => 'project_browser_test_mock'], + ]); $this->installState->deleteAll(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $cream_cheese_module_selector = '#project-browser .pb-layout__main ul > li:nth-child(1)'; $download_button = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); @@ -439,10 +441,12 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $download_button->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); $page->pressButton('Install selected projects'); - $this->assertMatchesRegularExpression( - '/.*\/admin\/modules\/project_browser\/install\/unlock\?token=[\w\-]+&destination=.*\/admin\/modules\/browse$/', - urldecode($assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href')) - ); + $unlock_url = $assert_session->waitForElementVisible('css', "#unlock-link")->getAttribute('href'); + $this->assertStringEndsWith('/admin/modules/project_browser/install/unlock', parse_url($unlock_url, PHP_URL_PATH)); + $query = parse_url($unlock_url, PHP_URL_QUERY); + parse_str($query, $query); + $this->assertNotEmpty($query['token']); + $this->assertStringEndsWith('/admin/modules/browse/project_browser_test_mock', $query['destination']); } /** @@ -450,7 +454,7 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { */ public function testSelectDeselectToggleInModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Cream cheese on a bagel'); $assert_session->waitForButton('Helvetica')?->click(); // Click select button in modal. diff --git a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php index 43c6508da..013f583bf 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserPluginTest.php @@ -56,7 +56,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1280, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '#project-browser .pb-project--grid'); $this->assertEquals('Grid', $this->getElementText('#project-browser .pb-display__button[value="Grid"]')); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); @@ -70,7 +70,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); } @@ -85,7 +85,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); // Immediately clear filters so there are enough visible to enable paging. $this->svelteInitHelper('test', 'Clear Filters'); $this->svelteInitHelper('css', '.pager__item--next'); @@ -100,9 +100,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests advanced filtering. */ public function testAdvancedFiltering(): void { - $assert_session = $this->assertSession(); - - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('text', 'Results'); $this->assertEquals('Show projects covered by a security policy', $this->getElementText(self::SECURITY_OPTION_SELECTOR . self::OPTION_CHECKED)); @@ -136,7 +134,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { public function testBrokenImages(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', 'img[src$="images/puzzle-piece-placeholder.svg"]'); // RandomData always give an image URL. Sometimes it is a fake URL on @@ -149,7 +147,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { * Tests the not-compatible flag. */ public function testNotCompatibleText(): void { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.project_status-indicator'); $this->assertEquals($this->getElementText('.project_status-indicator .visually-hidden') . ' Not compatible', $this->getElementText('.project_status-indicator')); } @@ -161,7 +159,7 @@ class ProjectBrowserPluginTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); $this->assertTrue($assert_session->waitForText('Results')); -- GitLab From ad9c61ec5f291ad3b50be1957c0c4c8b0249ca76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 08:25:11 -0500 Subject: [PATCH 26/41] Mostly fix ProjectBrowserUiTest --- .../ProjectBrowserUiTest.php | 61 ++++++++----------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index ed47bea14..3e6d82f4b 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -68,7 +68,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#pb-project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -97,7 +97,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } @@ -107,9 +107,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testClickableCategory(): void { $assert_session = $this->assertSession(); - $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Dancing Queen'); // Click to open module page. @@ -120,10 +119,9 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests category filtering. */ public function testCategoryFiltering(): void { - $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText('10 Results')); @@ -194,9 +192,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests the Target blank functionality. */ public function testTargetBlank(): void { - $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); } @@ -207,7 +204,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testReadonlyFields(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForElementVisible('css', '.project__action_button'); @@ -235,7 +232,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', '10 Results'); $this->assertProjectsVisible([ @@ -323,7 +320,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->pressWithWait('Clear filters'); $assert_session->waitForText('Modules per page'); @@ -339,9 +336,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testAdvancedFiltering(): void { $page = $this->getSession()->getPage(); - $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Astronaut Simulator'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -450,7 +446,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); $assert_session->elementsCount('css', '#pb-sort option', 4); @@ -540,15 +536,11 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests search with strings that need URI encoding. */ public function testSearchForSpecialChar(): void { - // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', '10 Results'); $this->pressWithWait('Clear filters', '25 Results'); - // Tests for the presence of search bar placeholder text. - $search_field = $this->getSession()->getPage()->find('css', '#pb-text'); - // Fill in the search field. $this->inputSearchField('', TRUE); $this->inputSearchField('&', TRUE); @@ -601,8 +593,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testDetailPage(): void { $assert_session = $this->assertSession(); - $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -618,7 +609,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testReopenDetailModal(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); $assert_session->waitForButton('Helvetica')?->click(); // Check the detail modal displays. @@ -642,8 +633,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testPersistence(): void { $assert_session = $this->assertSession(); - $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -726,7 +716,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', '25 Results'); $this->pressWithWait('Recommended filters'); @@ -870,7 +860,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -878,7 +868,6 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->svelteInitHelper('text', 'Close'); $assert_session->waitForButton('Close')?->click(); $this->assertSession()->elementExists('css', $selector['selector'] . '.pb-display__button--selected'); - } } @@ -957,7 +946,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { // Check visibility of categories in each view. foreach ($view_options as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Helvetica'); @@ -978,7 +967,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testPaginationWithFilters(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->pressWithWait('Clear filters'); $this->assertProjectsVisible([ 'Jazz', @@ -1019,7 +1008,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->config('project_browser.admin_settings') ->set('enabled_sources', ['drupal_core']) ->save(TRUE); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupal_core'); $this->svelteInitHelper('css', '.pb-project.pb-project--list'); $this->inputSearchField('inline form errors', TRUE); @@ -1059,7 +1048,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { */ public function testClearKeywordSearch() { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); // Get the original result count. @@ -1086,7 +1075,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testSearchClearNoTabIndex(): void { $page = $this->getSession()->getPage(); $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); // Search and confirm clear button has no focus after tabbing. @@ -1111,7 +1100,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { ->set('enabled_sources', ['recipes']) ->save(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/recipes'); $this->svelteInitHelper('css', '.pb-projects-list'); $this->inputSearchField('image', TRUE); $assert_session->waitForElementVisible('css', ".search__search-submit")->click(); @@ -1136,7 +1125,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testActiveInstallVisibility(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-search-results'); $assert_session->waitForElementVisible('css', '.pb-project'); @@ -1182,7 +1171,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testWrenchIcon(): void { $assert_session = $this->assertSession(); $this->getSession()->resizeWindow(1460, 960); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Helvetica'); // This asserts that status icon is present on the cards. $this->assertNotNull($assert_session->waitForElementVisible('css', '.pb-project__maintenance-icon .pb-project__status-icon-btn')); @@ -1206,7 +1195,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session = $this->assertSession(); $page = $this->getSession()->getPage(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); // Ensure the project list is loaded. $this->assertNotEmpty($assert_session->waitForElementVisible('css', '#project-browser .pb-project')); -- GitLab From 71f9d5a0b6537036236ece2f69a4720b80b0a515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 08:39:19 -0500 Subject: [PATCH 27/41] Fix testTabledrag() --- .../ProjectBrowserUiTest.php | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index 3e6d82f4b..b29343dc6 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -877,17 +877,18 @@ class ProjectBrowserUiTest extends WebDriverTestBase { public function testTabledrag(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->container->get('module_installer')->install(['project_browser_devel'], TRUE); - - $this->drupalGet('admin/modules/browse'); - $this->svelteInitHelper('text', 'Random data'); - // Count tabs. - $tab_count = $page->findAll('css', '.pb-tabs__link'); - $this->assertCount(2, $tab_count); + $this->container->get('module_installer')->install([ + 'block', + 'project_browser_devel', + ]); + $this->drupalPlaceBlock('local_tasks_block'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $local_tasks = $assert_session->elementExists('css', 'h2:contains("Primary tabs") + ul') + ->findAll('css', 'li a[href*="/admin/modules/browse/"]'); + $this->assertCount(2, $local_tasks); // Verify that the mock plugin is first tab. - $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('project_browser_test_mock', $first_tab->getValue()); + $this->assertSame('Browse', $local_tasks[0]->getText()); // Re-order plugins. $this->drupalGet('admin/config/development/project_browser'); @@ -898,10 +899,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse'); - $this->svelteInitHelper('text', 'Project Browser Mock Plugin'); - $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('random_data', $first_tab->getValue()); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); + $this->assertSame('Random data', $local_tasks[0]->getText()); // Disable the mock plugin. $this->drupalGet('admin/config/development/project_browser'); @@ -913,7 +912,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 20); @@ -923,7 +922,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__checkbox'); $assert_session->elementsCount('css', '.pb-filter__checkbox', 19); } -- GitLab From 76e16e3815813f4701ec83084e80eec2216fb675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 10:18:43 -0500 Subject: [PATCH 28/41] Fix URL path handling --- sveltejs/public/build/bundle.js | Bin 292699 -> 403124 bytes sveltejs/public/build/bundle.js.map | Bin 273330 -> 281473 bytes sveltejs/src/ProjectBrowser.svelte | 15 +++++++++++---- sveltejs/src/constants.js | 2 -- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 4ff8d529363cf0fc13a2821789a743df796310fb..ea178a2961b00d8af6008ca4c6ccd6db13fd2ea7 100644 GIT binary patch literal 403124 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 U{q6vIH_rF|d)7VapZ<^k4=~)~5&!@I delta 18756 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 SBd*iy-HCWG^phxuC;tb2r<w%- diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 1c348a20b8b6679fe8f26fb367526536d44d3c90..f988332d809ef2b286b0c7484a6b8dd68c53f680 100644 GIT binary patch delta 8773 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 bDay^loD;!i@5KjGl+~i?3ByUL%I5zCYUoTc delta 5229 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 diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 5e6f0c478..03ed3df74 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -32,6 +32,7 @@ FULL_MODULE_PATH, ACTIVE_PLUGINS, PACKAGE_MANAGER, + DEFAULT_SOURCE_ID, } from './constants'; // cspell:ignore tabwise @@ -178,10 +179,16 @@ if (savedPageSize) { pageSize.set(Number(savedPageSize)); } - const urlParts = window.location.pathname.substring(1).split('/'); - $activeTab = urlParts[3]; - // eslint-disable-next-line prefer-destructuring - projectId = urlParts.length === 5 ? urlParts[4] : null; + $activeTab = DEFAULT_SOURCE_ID; + + // The project ID, if there is one, will be the last thing in the URL + // path, and we can reasonably expect it to be different than the + // source plugin ID. + projectId = window.location.pathname.substring(1).split('/').pop(); + if (projectId === $activeTab) { + projectId = null; + } + // Only filter by recommended on first page load. if ($isFirstLoad) { await filterRecommended(); diff --git a/sveltejs/src/constants.js b/sveltejs/src/constants.js index 3f5ede078..1dd363397 100644 --- a/sveltejs/src/constants.js +++ b/sveltejs/src/constants.js @@ -12,8 +12,6 @@ export const ALL_VALUES_ID = drupalSettings.project_browser.special_ids.all_values; export const DEFAULT_SOURCE_ID = drupalSettings.project_browser.default_plugin_id; -export const CURRENT_SOURCES_KEYS = - drupalSettings.project_browser.current_sources_keys; export const BASE_URL = `${window.location.protocol}//${window.location.host}${drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix}`; export const FULL_MODULE_PATH = `${BASE_URL}${drupalSettings.project_browser.module_path}`; export const DARK_COLOR_SCHEME = -- GitLab From bb54ecb717b89dec6635d7d17674a47955d2fe0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 10:19:00 -0500 Subject: [PATCH 29/41] Fix URL path handling --- sveltejs/public/build/bundle.js | Bin 403124 -> 292707 bytes sveltejs/public/build/bundle.js.map | Bin 281473 -> 273303 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index ea178a2961b00d8af6008ca4c6ccd6db13fd2ea7..5ff69ebe92c9abfc9602d4967884d81b31ecd5de 100644 GIT binary patch delta 18436 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 literal 403124 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 U{q6vIH_rF|d)7VapZ<^k4=~)~5&!@I diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index f988332d809ef2b286b0c7484a6b8dd68c53f680..e5f27d2fa0687217ad003ed196d307f6ffabae1b 100644 GIT binary patch delta 4869 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 delta 8557 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 X7-a(^5{dW6C~LVQ@k48@a^JrIBiSap -- GitLab From 0bd2297ccf198b0e7a6c779c98c253e89fe672c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 10:27:54 -0500 Subject: [PATCH 30/41] Fix TranslatedSvelteAppTest --- tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php index 3dbf7c367..73f292b4c 100644 --- a/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php +++ b/tests/src/FunctionalJavascript/TranslatedSvelteAppTest.php @@ -70,7 +70,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $translate_to = 'Soorch Foor Moodools'; - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Search'); $this->assertFalse($this->assertSession()->waitForText($translate_to)); @@ -88,7 +88,7 @@ class TranslatedSvelteAppTest extends WebDriverTestBase { $this->submitForm(['string' => 'Search'], 'Filter'); $edit = ['strings[' . $string->lid . '][translations][0]' => $translate_to]; $this->submitForm($edit, 'Save translations'); - $this->drupalGet("/$prefix/admin/modules/browse"); + $this->drupalGet("/$prefix/admin/modules/browse/drupalorg_jsonapi"); $this->svelteInitHelper('text', $translate_to); } -- GitLab From 050a35baeb434b109203013ae21307513613718a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 11:21:25 -0500 Subject: [PATCH 31/41] Fix ProjectBrowserUiTestJsonApi --- sveltejs/public/build/bundle.js | Bin 292707 -> 293724 bytes sveltejs/public/build/bundle.js.map | Bin 273303 -> 274473 bytes sveltejs/src/ProjectBrowser.svelte | 18 ++++++ .../ProjectBrowserUiTest.php | 2 + .../ProjectBrowserUiTestJsonApi.php | 61 +++++++++--------- 5 files changed, 49 insertions(+), 32 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 5ff69ebe92c9abfc9602d4967884d81b31ecd5de..13c33b8c9353215dafe36ca7a02c8aad3d037a54 100644 GIT binary patch delta 831 zcmZWnTS!z<6lI^Y)n-a@OdVg<)wIztbjEpIWqc%Kj+K)-NFf)Q#<6aQ<6|@m?SVo> zM8pVN`sgDFg9wBv4)qa8A4y5+M-&u+J&1(*Oe4y!Z>;lkSnDj-+Iw+6emA`PVYo01 z!|XmkH4icsI(Sx`&8$c+NhPzF=hBNIuA`UrJdvKyb2r$@u)wX%>7)Y-e38it`A@O} z(fyO>Fp$N_FMbnHHkaCI-!~?S=HL7aV@}6|3OoTIN3KtrXfYi!#aF;l9kbZP&{o74 zW-S(%6S1GO5}6<wZ-ZToC8Hm-TbGKjfmt2mgAw<}GmBj$<e`^?jV7icnG(}5Mx4&a zN3qPN&`cgrqsnG}Y?-Hl1k^_=@9d_d{rsW0R*WOSWE*J)>7v|%e~?+MqTGR9v2hl& zxx`jtr`b`yT}-<0G1C$*RiXpU_7W#Gm*RkMRpBtKDaGV|e8%XB8!O48LOPkEJcY*G zxI<tKPBOaT!6L9y_BqI)PabSpns^X0B3W}uG~S_+fetV+E%HhSRM1o{7J!2;Mzzkz zYcY%L9^3;?QatFQ_g7gJ%|-c6@wpD=rJ{Eo##>30tDuq2H)1KhZ9p5n8GuB(Hwbl- zUeb<Er?yM^x&A;{?GO6=$0fB>s_`81xf`3Psv9z^dqaIafnbf=5f1kB7D~CBu=WL3 z#Vs2a%D*Z~S1@PGYMd_Of10c-Tt~C7QgoV4_)J$Y)J_v_Or@y?j8DsUxg=9xXIrpc z?F_b=*7OzYl5Ht#T&dKeY%<iZz7&+{X=VV7zTQwzxVlHxR#5%R(``U4yUE+=YxN%S xdA#*a|Lw7%)ZA7Y3xqm*!xG&MK}GBeMP(r<qJ!OFptB(`(^wP?V!9P0#=pcG`%C}; delta 403 zcmXw#O-NK>6oxtHdsT)gW=u0}lu0aq$hvcN?ssQkW;B?@5feAM2p7`AA6nR^7LgbZ zRErj&a9jmR(l!|7fQ!hTCRDpN5vU7M%B4R<PS-`N7haxc^ZYoB>>Na93RK`_GkHY5 z+^{BEk#I(0>DYwC2TYTEnKdE#de?+y^T^~VA(3O#$<~pcV^d;(L`KKCRUe+1MkZh9 z|Cl!f+mZ65{Wr&S=&#vj_L3`Ej1l>Buh*NUR7+QMkFXG8$Lj1kpp0EtUxx9>up1Yu z!V)F)eHBJ2*w7_>Cw7y%U4yps?D%@&8U~Df`bO0fzKk+`+=A6|87xs&r*5IhY^?-L zt!7-Df*nsY7E|RFaVOzf&zG$Qb5YmR_{h{L&%0pZ$CIuMr|?8G-6+t1Qa5hnGs~|W zT$#@ytMzxV!IH|OH87tQgFIcmh|0S>t_Ni{^GM5!3A)K0o?M-#I&pe&kF2acrMkK3 iex-bP5S%|>akuOjO@og0A$eBqZ9f((b@e_LYyJTOZhdqB diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index e5f27d2fa0687217ad003ed196d307f6ffabae1b..64e59b7061167be1c5bed01ba0855cf8f8350bda 100644 GIT binary patch delta 660 zcmYjN&1(}u6lZqEv^1JV8e`L<ZX}pe2LxNe8e)Ar`C!pxrAbqgs%1?Ri67ZE*%qt> z3KeqlqgZ%1X%8N}6;T%SKk!iT<h4C{@S+FtSZA9S@(#n}z2Dax{NaDU>tB6NJ}RvV ze6U6WPHRHRkTWU$Rz5kE<9F(+tei2GpEGXfbtCJJaPl1qJ3p@}Ljl~+Du|mK<TM5~ z<s#B8GT1+RH`d|Rs_IC@L~oi5U3PUMO>3!9uB2*@?MkDm#??cc*@#)TYs;0qdH;yo zk~aIBWZ2hHQdRruLdB}$)&>biyYXr`9#^AF_4!J*R<F!QkMOEGc>q4%4SuuxFF4k; z8n$TEWQ3Y2Gjt!<jXk`fY}K1KzHE~uUT>32_^3@H?R7(O)(yJ7O|627HwX*hy${rf zuS>M&(-Zdhgy%}(p~f@#y+8->nU95W)lZr8*2li|OQq6T_SrKoAZcs(Yk*yKd$E$h zy)2EUVmb&(P67be-DetL+U<0102l|0SW^;~HC_fN^E5!Zvl0NJ0~a{g!-hjrE7=e( z0{Ef^u&Bvil(>NqV5d%I05W_AV8-=aNbsBPICLTAmgUA1+ypQ?4n=?>?{?UW)4{%? z3@dmJAcud>vp9Yg)Y~J~RuVjkUO`7l8qFQ~3zmoVq9N!wetSWWQQg*@&^h+IPif@Q OJIdC`nDc6s^^*V3%f=W0 delta 103 zcmV-t0GR)&;1HMB5P*aMv;uuOw~;vlO#zofr2!qc96JIU6qh(p0+omGQ3AK{Q3I>6 z0&7*bodN_O4gxn-m%b1LIJfu^1icRdLzlK71iA$~NkK_wx2q!r@CpKSQ<t4C1cL#1 Jw;?YC2myHeBD(+p diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 03ed3df74..5f4e04261 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -8,6 +8,7 @@ import ProcessQueueButton from './ProcessQueueButton.svelte'; import { filters, + sourceFilters, rowsCount, moduleCategoryFilter, isFirstLoad, @@ -25,6 +26,8 @@ } from './stores'; import MediaQuery from './MediaQuery.svelte'; import { + FILTERS, + SORT_OPTIONS, ACTIVELY_MAINTAINED_ID, COVERED_ID, ALL_VALUES_ID, @@ -195,11 +198,26 @@ } await load($page); + const focus = element ? document.getElementById(element) : false; if (focus) { focus.focus(); $focusedElement = ''; } + $categoryCheckedTrack[$activeTab] = $moduleCategoryFilter; + $moduleCategoryFilter = []; + if ($activeTab in FILTERS) { + $sourceFilters = FILTERS[$activeTab]; + } + $moduleCategoryFilter = + typeof $categoryCheckedTrack[$activeTab] !== 'undefined' + ? $categoryCheckedTrack[$activeTab] + : []; + $sortCriteria = SORT_OPTIONS[$activeTab]; + const sortMatch = $sortCriteria.find((option) => option.id === $sort); + if (typeof sortMatch === 'undefined') { + $sort = $sortCriteria[0].id; + } }); function onPageChange(event) { diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index b29343dc6..de838ba07 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -732,6 +732,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests multiple source plugins at once. */ public function testMultiplePlugins(): void { + $this->markTestSkipped('This test is skipped because it needs to be rewritten now that in-app tabbing is removed.'); + $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); // Enable module for extra source plugin. diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php index 27d373604..5d65055a7 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTestJsonApi.php @@ -59,7 +59,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $this->getSession()->resizeWindow(1250, 1000); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('css', '.pb-project.pb-project--grid'); $assert_session->waitForElementVisible('css', '#project-browser .pb-display__button[value="Grid"]'); $grid_text = $this->getElementText('#project-browser .pb-display__button[value="Grid"]'); @@ -86,7 +86,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategories(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } @@ -97,7 +97,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testClickableCategory(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); @@ -109,7 +109,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testCategoryFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown'); // Initial results count on page load. $this->assertTrue($assert_session->waitForText(' Results')); @@ -162,7 +162,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { */ public function testTargetBlank(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -174,7 +174,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', ' Results'); $assert_session->pageTextNotContains(' 0 Results'); $this->assertPagerItems(['1', '2', '3', '4', '5', '…', 'Next', 'Last']); @@ -220,7 +220,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testAdvancedFiltering(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Token'); $this->pressWithWait('Clear filters'); $this->pressWithWait('Recommended filters'); @@ -262,7 +262,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testSortingCriteria(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters'); @@ -285,7 +285,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testDetailPage(): void { $assert_session = $this->assertSession(); - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Token'); $assert_session->waitForButton('Token')->click(); } @@ -303,7 +303,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testRecommendedFilter(): void { $assert_session = $this->assertSession(); // Clear filters. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('text', 'Clear Filters'); $this->pressWithWait('Clear filters', 'Results'); $this->pressWithWait('Recommended filters'); @@ -326,16 +326,13 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->markTestSkipped('This test requires Drupal 10.3 or later.'); } $assert_session = $this->assertSession(); - $page = $this->getSession()->getPage(); // Enable module for extra source plugin. $this->container->get('module_installer')->install(['project_browser_devel']); $this->config('project_browser.admin_settings') ->set('enabled_sources', ['recipes', 'project_browser_test_mock']) ->save(); - $this->drupalGet('admin/modules/browse'); - $this->assertTrue($assert_session->waitForText('Recipes')); - $page->pressButton('Recipes'); + $this->drupalGet('admin/modules/browse/recipes'); // Recipes doesn't define any filters so no filters are displayed. $this->assertNull($assert_session->waitForElementVisible('css', '.search__form-filters-container')); @@ -344,9 +341,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $filters_to_define = ['maintenanceStatus', 'securityCoverage']; \Drupal::state()->set('filters_to_define', $filters_to_define); - $this->drupalGet('admin/modules/browse'); - $this->assertTrue($assert_session->waitForText('Project Browser Mock Plugin')); - $page->pressButton('Project Browser Mock Plugin'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); // Drupal.org test mock defines only two filters (actively maintained filter // and security coverage filter). $assert_session->waitForElementVisible('css', '.search__form-filters-container'); @@ -379,7 +374,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->getSession()->resizeWindow(1300, 1300); foreach ($viewSwitches as $selector) { - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $this->svelteInitHelper('css', $selector['selector']); $this->getSession()->getPage()->pressButton($selector['value']); $this->svelteInitHelper('text', 'Token'); @@ -396,17 +391,19 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { public function testTabledrag(): void { $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); - $this->container->get('module_installer')->install(['project_browser_devel']); - - $this->drupalGet('admin/modules/browse'); + $this->container->get('module_installer')->install([ + 'block', + 'project_browser_devel', + ]); + $this->drupalPlaceBlock('local_tasks_block'); + + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); + $local_tasks = $assert_session->elementExists('css', 'h2:contains("Primary tabs") + ul') + ->findAll('css', 'li a[href*="/admin/modules/browse/"]'); + $this->assertCount(2, $local_tasks); + // Verify that the mocked source is first tab. + $this->assertSame('Browse', $local_tasks[0]->getText()); $assert_session->waitForElementVisible('css', '.pb-display__button'); - // Count tabs. - $tab_count = $page->findAll('css', '.pb-tabs__link'); - $this->assertCount(2, $tab_count); - - // Verify that the mock plugin is first tab. - $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('drupalorg_jsonapi', $first_tab->getValue()); // Re-order plugins. $this->drupalGet('admin/config/development/project_browser'); @@ -417,10 +414,10 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->submitForm([], 'Save'); // Verify that Random data is first tab. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/drupalorg_jsonapi'); $assert_session->waitForElementVisible('css', '#project-browser .pb-project'); $first_tab = $page->find('css', '.pb-tabs__link:nth-child(1)'); - $this->assertEquals('random_data', $first_tab->getValue()); + $this->assertSame('Random data', $local_tasks[0]->getText()); // Disable the mock plugin. $this->drupalGet('admin/config/development/project_browser'); @@ -432,7 +429,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $assert_session->pageTextContains('The configuration options have been saved.'); // Verify that only Random data plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/random_data'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 20); @@ -442,7 +439,7 @@ class ProjectBrowserUiTestJsonApi extends WebDriverTestBase { $this->assertTrue($assert_session->optionExists('edit-enabled-sources-random-data-status', 'disabled')->isSelected()); // Verify that only the mock plugin is enabled. - $this->drupalGet('admin/modules/browse'); + $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('css', '.pb-filter__multi-dropdown input[type="checkbox"]'); $assert_session->elementsCount('css', '.pb-filter__multi-dropdown input[type="checkbox"]', 19); } -- GitLab From 6e07b8f0129ce84dae84128bc1dc5170508c3025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 11:25:35 -0500 Subject: [PATCH 32/41] Fix nightwatch URLs --- tests/src/Nightwatch/Tests/consistentPagination.js | 4 ++-- tests/src/Nightwatch/Tests/keyboardTest.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/src/Nightwatch/Tests/consistentPagination.js b/tests/src/Nightwatch/Tests/consistentPagination.js index 532628b50..4874cac0b 100644 --- a/tests/src/Nightwatch/Tests/consistentPagination.js +++ b/tests/src/Nightwatch/Tests/consistentPagination.js @@ -9,7 +9,7 @@ module.exports = { 'Test pagination consistency across tabs': function (browser) { browser.drupalLoginAsAdmin(() => { browser - .drupalRelativeURL('/admin/modules/browse') + .drupalRelativeURL('/admin/modules/browse/project_browser_test_mock') .waitForElementVisible('h1', 100) .assert.textContains('h1', 'Browse projects') .assert.visible('select.pagination__num-projects') @@ -17,7 +17,7 @@ module.exports = { browser .openNewWindow('tab') - .drupalRelativeURL('/admin/modules/browse') + .drupalRelativeURL('/admin/modules/browse/project_browser_test_mock') .waitForElementVisible('h1', 100) .assert.textContains('h1', 'Browse projects') .assert.visible('select.pagination__num-projects') diff --git a/tests/src/Nightwatch/Tests/keyboardTest.js b/tests/src/Nightwatch/Tests/keyboardTest.js index a6fcaeda2..37795baaf 100644 --- a/tests/src/Nightwatch/Tests/keyboardTest.js +++ b/tests/src/Nightwatch/Tests/keyboardTest.js @@ -64,7 +64,7 @@ module.exports = { // Open project browser. browser - .drupalRelativeURL('/admin/modules/browse') + .drupalRelativeURL('/admin/modules/browse/project_browser_test_mock') .waitForElementVisible('h1', delayInMilliseconds) .assert.textContains('h1', 'Browse projects') .waitForElementVisible(filterDropdownSelector); -- GitLab From 14a342fea0c48c63fb1cac8edad3b31ddfdef0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 12:29:34 -0500 Subject: [PATCH 33/41] revert cspell fix --- .cspell-project-words.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/.cspell-project-words.txt b/.cspell-project-words.txt index 3c907a818..ec9b40d23 100644 --- a/.cspell-project-words.txt +++ b/.cspell-project-words.txt @@ -10,6 +10,3 @@ tabwise sophron BOLDRED NOCHANGES -CURLOPT -RETURNTRANSFER -varchar -- GitLab From 8f8689182ebadf47b6b5cb424ff9ae4f7bf8cbb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 14:25:34 -0500 Subject: [PATCH 34/41] Hah, just visually hide the tabs --- sveltejs/public/build/bundle.js | Bin 293724 -> 304959 bytes sveltejs/public/build/bundle.js.map | Bin 274473 -> 280775 bytes sveltejs/src/ProjectBrowser.svelte | 57 +++++++++++++++++++--------- sveltejs/src/Tabs.svelte | 55 +++++++++++++++++++++++++++ sveltejs/src/constants.js | 2 + 5 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 sveltejs/src/Tabs.svelte diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 13c33b8c9353215dafe36ca7a02c8aad3d037a54..18cdac3448618010f4e5b36c04c3a41607ac5a9a 100644 GIT binary patch delta 8902 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 J$-@^0{~s7Yd)fd1 delta 3879 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 FzX1u-8|DB2 diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 64e59b7061167be1c5bed01ba0855cf8f8350bda..b12c23265e966d0967d7eae58275869441df37d5 100644 GIT binary patch delta 4456 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 I_@z?ee~QRNZ2$lO delta 517 zcmWlUT}YE*9L0J5&-1>UO<K8PYL?=rku5OX{9wd<-e+sQ);2%pBsA@V<s1!bZgkVl zDk2j6DCmD%P()os(8XWsA_*cABE0G*Vltwlk1I*A3wygeobx*z&fCSEkIOrrJ>hqb zfc@GErxng7LUcp1ud6iN0N}+dy->8DpSn;;=VyHQqZjJQC1I3R4<!bZ6N&z$nTQYJ z`|He$vj((a#ei09P;daB8c<6S1#>Q3O#$MkF*rw=Q?Se^GXge^9-M}&Hd@PoYZg?1 z-0M&SEKhBJpz#+vK64M{D!fg{&3C+ko`2_;9J=37XY&e6OMD+LRJcwzxA;dlOsD9K zTRdVcf>m|mC5~-y=iNT;)N)ZN2XSD7*Wvtc?!bO8uhmT1qmE$-`EH!wBSz^<z4)f% zat*iHib@vL#W2cEE4(+(1(utIj+dLo5}U+!k2qePka;6x_+ru@j^W}KKe#O+v*A9= zm<;3npS%gn9?^mAO<dD*O2(tOHf7B}^olv^Y!SB@1XB3AReS(5Nwi-Sx3iOYcpVxs z+bM$fU@$l=V}UR_yF}djGu|a$=zb+51p}vjq8n#I;*b_JrOMLZka)v%OPd9Q_I6v~ s|N4lGWeuuQ!p?02Cwyrs)3|V(?;_t(;b4$YVoy|*xT!kmRaDs7KacFF82|tP diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 5f4e04261..93ad12f53 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -4,11 +4,12 @@ import ProjectGrid, { Search } from './ProjectGrid.svelte'; import Pagination from './Pagination.svelte'; import Project from './Project/Project.svelte'; + import Tabs from './Tabs.svelte'; import { numberFormatter } from './util'; import ProcessQueueButton from './ProcessQueueButton.svelte'; import { - filters, sourceFilters, + filters, rowsCount, moduleCategoryFilter, isFirstLoad, @@ -27,15 +28,16 @@ import MediaQuery from './MediaQuery.svelte'; import { FILTERS, - SORT_OPTIONS, ACTIVELY_MAINTAINED_ID, COVERED_ID, ALL_VALUES_ID, + DEFAULT_SOURCE_ID, + CURRENT_SOURCES_KEYS, BASE_URL, FULL_MODULE_PATH, + SORT_OPTIONS, ACTIVE_PLUGINS, PACKAGE_MANAGER, - DEFAULT_SOURCE_ID, } from './constants'; // cspell:ignore tabwise @@ -198,26 +200,11 @@ } await load($page); - const focus = element ? document.getElementById(element) : false; if (focus) { focus.focus(); $focusedElement = ''; } - $categoryCheckedTrack[$activeTab] = $moduleCategoryFilter; - $moduleCategoryFilter = []; - if ($activeTab in FILTERS) { - $sourceFilters = FILTERS[$activeTab]; - } - $moduleCategoryFilter = - typeof $categoryCheckedTrack[$activeTab] !== 'undefined' - ? $categoryCheckedTrack[$activeTab] - : []; - $sortCriteria = SORT_OPTIONS[$activeTab]; - const sortMatch = $sortCriteria.find((option) => option.id === $sort); - if (typeof sortMatch === 'undefined') { - $sort = $sortCriteria[0].id; - } }); function onPageChange(event) { @@ -269,6 +256,36 @@ preferredView.set(val); } + async function toggleRows(event) { + if (event.detail.pluginId === $activeTab) { + return; + } + $categoryCheckedTrack[$activeTab] = $moduleCategoryFilter; + $moduleCategoryFilter = []; + $activeTab = event.detail.pluginId; + if ($activeTab in FILTERS) { + $sourceFilters = FILTERS[$activeTab]; + } + $moduleCategoryFilter = + typeof $categoryCheckedTrack[$activeTab] !== 'undefined' + ? $categoryCheckedTrack[$activeTab] + : []; + $sortCriteria = SORT_OPTIONS[$activeTab]; + const sortMatch = $sortCriteria.find((option) => option.id === $sort); + if (typeof sortMatch === 'undefined') { + $sort = $sortCriteria[0].id; + } + searchComponent.onSearch(event); + const { target } = event.detail.event; + const parent = target.parentNode; + // Remove all current selected tabs + parent + .querySelectorAll('[aria-selected="true"]') + .forEach((t) => t.setAttribute('aria-selected', false)); + // Set this tab as selected + target.setAttribute('aria-selected', true); + } + /** * Refreshes the live region after a filter or search completes. */ @@ -324,6 +341,10 @@ <MediaQuery query="(min-width: 1200px)" let:matches> <ProjectGrid {toggleView} {loading} {rows} {pageIndex} {$pageSize} let:rows> <div slot="head"> + <!--Show tabs only if there are 2 or more plugins enabled.--> + {#if dataArray.length >= 2 && !projectId} + <Tabs {dataArray} on:tabChange={toggleRows} /> + {/if} <Search bind:this={searchComponent} on:search={onSearch} diff --git a/sveltejs/src/Tabs.svelte b/sveltejs/src/Tabs.svelte new file mode 100644 index 000000000..55346bb0e --- /dev/null +++ b/sveltejs/src/Tabs.svelte @@ -0,0 +1,55 @@ +<script> + import { createEventDispatcher } from 'svelte'; + import { activeTab } from './stores'; + + const { Drupal } = window; + const dispatch = createEventDispatcher(); + + // eslint-disable-next-line import/no-mutable-exports,import/prefer-default-export + export let dataArray = []; + let tabButtons; +</script> + +<nav style="display: none;" class="tabs-wrapper tabs-wrapper--secondary is-horizontal"> + <div + role="tablist" + id="plugin-tabs" + aria-label={Drupal.t('Plugin tabs')} + bind:this={tabButtons} + class="tabs tabs--secondary pb-tabs" + > + {#each dataArray.map( (item) => ({ ...item, isActive: item.pluginId === $activeTab }), ) as { pluginId, pluginLabel, totalResults, isActive }} + <span + class="tabs__tab pb-tabs__tab" + class:is-active={isActive === true} + class:pb-tabs__tab--active={isActive === true} + > + <button + type="button" + role="tab" + aria-selected={isActive ? 'true' : 'false'} + aria-controls={pluginId} + tabindex="0" + id={pluginId} + class="pb-tabs__link tabs__link" + class:is-active={isActive === true} + class:pb-tabs__link--active={isActive === true} + value={pluginId} + on:click={(event) => { + dispatch('tabChange', { + pluginId, + event, + }); + }} + > + {pluginLabel} + <br /> + {Drupal.formatPlural(totalResults, '1 result', '@count results')} + {#if isActive} + <span class="visually-hidden">({Drupal.t('active tab')})</span> + {/if} + </button> + </span> + {/each} + </div> +</nav> diff --git a/sveltejs/src/constants.js b/sveltejs/src/constants.js index 1dd363397..3f5ede078 100644 --- a/sveltejs/src/constants.js +++ b/sveltejs/src/constants.js @@ -12,6 +12,8 @@ export const ALL_VALUES_ID = drupalSettings.project_browser.special_ids.all_values; export const DEFAULT_SOURCE_ID = drupalSettings.project_browser.default_plugin_id; +export const CURRENT_SOURCES_KEYS = + drupalSettings.project_browser.current_sources_keys; export const BASE_URL = `${window.location.protocol}//${window.location.host}${drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix}`; export const FULL_MODULE_PATH = `${BASE_URL}${drupalSettings.project_browser.module_path}`; export const DARK_COLOR_SCHEME = -- GitLab From eba907d224b1324eb3cbed4496e4db2c52cccffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 14:49:33 -0500 Subject: [PATCH 35/41] Unconditionally clear storage --- sveltejs/public/build/bundle.js | Bin 304959 -> 305355 bytes sveltejs/public/build/bundle.js.map | Bin 280775 -> 281416 bytes sveltejs/src/ProjectBrowser.svelte | 8 ++++++++ 3 files changed, 8 insertions(+) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 18cdac3448618010f4e5b36c04c3a41607ac5a9a..d08df237ca8b4b9acc8b6c10e41f1636ea40586b 100644 GIT binary patch delta 490 zcmdmgPU!SSp@tU57N!>FEi8v5nGDUhACY8v&BA14uzjN(3nw#^q1pC5iYzYNOr{3g znRHp$S(!|Yw{sh@tYl`i+`iS6rJR}3V!N&-%Y9}hbF=Mywk%q_ET)E5Ces_t8O65; zd$DX3U@<a*@#Ujg{<8oz$|tZyXw*CBq$U<AB<58r6cnYFW#*R_D-@R`mZU0V=B4Eq z<tCP7=I7}s6ldlo1BFTyauX{RG7`&D6_WFFQx(#R@^gWD^Gh;Pi?|ekfRj^SU!gd^ zv?w`M4=PZcT3ie?Be*2LC^0=%uP8M)zbw_WBsEt<Ju$f?KC>(}Br!={)0&I0`edNH z(({Wd-7<4ZQj0)(Aa>%hV*0^MMv(xblosa~l{gn=0!_|LB%opPf)-INB5Vg42{dYZ JP6x|nIRHE%oWcMA delta 133 zcmX?oQE2};p@tU57N!>FEi8v5nG7tqACY8v&BA18w0)x-3nw#^fyMSciYzYNOeRL# znRHp$S(!{sw{sh@tYl_1+`iS6rJR}3V7sm*%Y9}hGmGtfwk%q_EGEWQCes_t8O65; gd$DX3U@<g<@#Ujg{<8oz$|tZyXl!ThVmToP00)31xc~qF diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index b12c23265e966d0967d7eae58275869441df37d5..aa66ec447d5bcd96d7c48e8ce0dfe9fb612e151e 100644 GIT binary patch delta 615 zcmaivu}i~17{y5%ad1d0v|TzJh_*s#br2DYa5=RU>7q7t5cCXJbI|1E?i#F1I|$+; z=wSX4A+s(z`X_m5DXk*$hU30_zxN*B$5Za}B{#a$UiCfaxoZq-HGp~qbAW>ZxaK6J ztS^9&SQ0>kF5^Cylm!+LG;r0I1U?=B4~GP}%qO7BnXkM|dW4?^KpmARSf9J3I++C# zLM5C?#_<)Ya^ka)G$rvXW$dm>8j@3dSzg~wp`+1}Rw$(s=CM{9rV*1y!MH@6O2R2l z@0{|<CWo}A9O6I2QnFLhpuqdOqsMh8v+}0XPK=Ajxv7Vp_<hZ2X7jr(*zDPs3!!Tv z2$9u>upM0#jDp#Mh@+VjnGczK^mSk?4wbSwr;I%lx3D1;cJhYfOT{B^e-<)_PAg~N m&EJ^>Lh>VV8QuOSqm4LITxi3_mK~ehMkT9zPQ24F9<^^pGQ)=e delta 72 zcmV-O0Js0hmJ!F15rBjNv;sa>hrm|?x4>5eA;ANAS7Ddn83YuUj>7{Lw+$HtH4g$W eSGPnc1W6DCRY6H)w~#pmC=dd8RkylH1dai(M;D_2 diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 93ad12f53..0e203e434 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -193,6 +193,14 @@ if (projectId === $activeTab) { projectId = null; } + // Clear any previous state information, since it may have come from another + // source. + sessionStorage.removeItem('activeTab'); + sessionStorage.removeItem('categoryFilter'); + sessionStorage.removeItem('categoryCheckedTrack'); + sessionStorage.removeItem('sortCriteria'); + sessionStorage.removeItem('sourceFilters'); + sessionStorage.removeItem('sort'); // Only filter by recommended on first page load. if ($isFirstLoad) { -- GitLab From c80fc089a733a53deedc10b79578e802e57ed4b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 14:53:26 -0500 Subject: [PATCH 36/41] Remove CURRENT_SOURCES_KEYS to please eslint --- src/Element/ProjectBrowser.php | 1 - sveltejs/public/build/bundle.js | Bin 305355 -> 305298 bytes sveltejs/public/build/bundle.js.map | Bin 281416 -> 281263 bytes sveltejs/src/ProjectBrowser.svelte | 1 - sveltejs/src/constants.js | 2 -- 5 files changed, 4 deletions(-) diff --git a/src/Element/ProjectBrowser.php b/src/Element/ProjectBrowser.php index c8721509a..7308643c5 100644 --- a/src/Element/ProjectBrowser.php +++ b/src/Element/ProjectBrowser.php @@ -148,7 +148,6 @@ final class ProjectBrowser implements ElementInterface, ContainerFactoryPluginIn 'security_options' => SecurityStatus::asOptions(), 'development_options' => DevelopmentStatus::asOptions(), 'default_plugin_id' => reset($current_sources)->getPluginId(), - 'current_sources_keys' => array_keys($current_sources), 'package_manager' => $package_manager, 'filters' => array_map( fn (ProjectBrowserSourceInterface $source) => $source->getFilterDefinitions(), diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index d08df237ca8b4b9acc8b6c10e41f1636ea40586b..430715c74e72bb641452f5a79de58fa9ac245331 100644 GIT binary patch delta 130 zcmX?oQE1Xdp$*}U%@Z2iCp0nwG1K-5jm*X~7|pgHkz{$z!enT<eWM%;7c-;j_C1O$ zF5FBemfM+hSvXi3jka?ev8-ffwAjAYl%<@R(R{nECCdYlLOxp-ZC+*rE0gIB=8WRo agS}Wb2{0SOxbo2~|5<>#<P%udcmM$S3?}vf delta 153 zcmbPqQRwtVp$*}UlT#byMUqR4ic<4R;*0Z3i;`1|<FivMi<<)*+XEXJftYD~U?a2T z3`X<q-I6S?Sy+q=tjwnCzGYI_K1+_}1rwv$_GU#E7j7m~gY74ESU6Z2jkjMiWLe3~ zXt}+{l%<@R(PH}-3zi4WK!sOrShRT=4YxCTv78oQG?@;hCAU9|V)@SkRQxQSWsL^_ D#?mxH diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index aa66ec447d5bcd96d7c48e8ce0dfe9fb612e151e..935009a4f7c6657745732ee4735d01bfb0011492 100644 GIT binary patch delta 72 zcmV-O0Js0hmJzR&5rDJ-DMPo0Ljgknx8p(rld=LsHMg1d0ullNa)+$<0=KO912rK7 eXINpE;28uImyW{&6}Jr;1TrxJHMc-Y1PB2tt{MdZ delta 171 zcmZ2KRq(_#!G<l2n$E(`p+P~eej)L}{-Ht6uEFu%u94I89T?R_l1qz<Qu9jUi}Op1 zl2eQ0vr{XJw@W%R2K^Voq9=HJiWAeUP0FrWE;`AMj>$UCj*iYcsg91R5LTg+qhq0y zwWp)A{<g17LQEWGPI<1@j*h<58*eg+wHthA+HUZjSwfL9bGxSmOROQI`S#_WEF6pg Da^W|W diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 0e203e434..b13ca0a01 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -32,7 +32,6 @@ COVERED_ID, ALL_VALUES_ID, DEFAULT_SOURCE_ID, - CURRENT_SOURCES_KEYS, BASE_URL, FULL_MODULE_PATH, SORT_OPTIONS, diff --git a/sveltejs/src/constants.js b/sveltejs/src/constants.js index 3f5ede078..1dd363397 100644 --- a/sveltejs/src/constants.js +++ b/sveltejs/src/constants.js @@ -12,8 +12,6 @@ export const ALL_VALUES_ID = drupalSettings.project_browser.special_ids.all_values; export const DEFAULT_SOURCE_ID = drupalSettings.project_browser.default_plugin_id; -export const CURRENT_SOURCES_KEYS = - drupalSettings.project_browser.current_sources_keys; export const BASE_URL = `${window.location.protocol}//${window.location.host}${drupalSettings.path.baseUrl + drupalSettings.path.pathPrefix}`; export const FULL_MODULE_PATH = `${BASE_URL}${drupalSettings.project_browser.module_path}`; export const DARK_COLOR_SCHEME = -- GitLab From 26e8f38ebce558ee8e53aad69d6ccf50e4e1fa3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 15:17:12 -0500 Subject: [PATCH 37/41] Run prettier --- sveltejs/public/build/bundle.js | Bin 305298 -> 305298 bytes sveltejs/public/build/bundle.js.map | Bin 281263 -> 281271 bytes sveltejs/src/Tabs.svelte | 5 ++++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 430715c74e72bb641452f5a79de58fa9ac245331..b1806768a0450a5f86bae8bb7538d3d0ff7e792a 100644 GIT binary patch delta 32 ocmbPqQE1Xdp@tU57N#xC*LN|Q8g9S2i+MF8qsjKxJ<Pms0N`Q`NB{r; delta 32 ocmbPqQE1Xdp@tU57N#xC*LN|QSZu$!i+MF8qv7_}J<Pms0N|z#O8@`> diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 935009a4f7c6657745732ee4735d01bfb0011492..2d27f09f0d9b394cb9c5eb17b5dc3b2a6564d22c 100644 GIT binary patch delta 105 zcmZ2KRdD-M!G;#bElh!8%rSWi(*wnrB*Ba<F(zB4n7sDoVockYi!m48XG(Y8F7=Ih zKRbJXxwDS1quKNaf0_R>=Q%k}H)Li}o6h#1IgK%SdhUPbdrT>=(+zhsOHEHOXXe<N I&*I<(03>W8)Bpeg delta 150 zcmV;H0BQfXl@YI%5rBjNv;t8U86b0Xd2D4pTq0y?b8u{7c{(6&Z*FBfTq2in76Lto zuNDHguNDJw-wQTEa6&9cK|w(*Ntd4`0~nXOC<6+Y-!%gsmynVJ1-Eea191lkN;g9+ zO+he2mx0IwESDAj1JDC#LP3}DCj=*#5B~#Y0aurG{{!9vSVfmm$^#ge&}{<>wRZ$S EN+Yl{(EtDd diff --git a/sveltejs/src/Tabs.svelte b/sveltejs/src/Tabs.svelte index 55346bb0e..5d37ca0c9 100644 --- a/sveltejs/src/Tabs.svelte +++ b/sveltejs/src/Tabs.svelte @@ -10,7 +10,10 @@ let tabButtons; </script> -<nav style="display: none;" class="tabs-wrapper tabs-wrapper--secondary is-horizontal"> +<nav + style="display: none;" + class="tabs-wrapper tabs-wrapper--secondary is-horizontal" +> <div role="tablist" id="plugin-tabs" -- GitLab From 11173352b98b15b92cf732a1f740811b0908d08f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 16:08:27 -0500 Subject: [PATCH 38/41] OMFG --- sveltejs/public/build/bundle.js | Bin 305298 -> 305277 bytes sveltejs/public/build/bundle.js.map | Bin 281271 -> 281504 bytes sveltejs/src/ProjectBrowser.svelte | 30 ++++++++++++++-------------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index b1806768a0450a5f86bae8bb7538d3d0ff7e792a..7e322bfddefa56e63dd269c7068ee6ec48820032 100644 GIT binary patch delta 623 zcmZ`#O=uHA6lP|hZBuE)Ai8Z@nV`}HYucC}O+yYM2nw}_ip4_@)BVw*%Z}ZhCX@>1 zklH5Didk^Li$_nQ2W8IQJSem`4_5FZp1pWc<0dWk5F7^HW4@pFy=m>ne(%I;byUZ7 z?G3!tajqy|=`e;e@}mwLs1RKFlY7w^2BhVR3zFW$DfM;)5;!EPPor?WFKmJ*@5g0( z7{%3vGvJ&=1@){56ovKIG<=AmynMHVPN=;ZXhv{;L4JL%C1vfr)+cLI=$hJ_hxKUx z#Y`rf&lVK3VHbyz5`#-eGKK8roNO<`n)<=uG5W{aT!ONuKD)31^2-)ZsP8_sFwPd$ zg9?0$2JxRmYI_}C<A>L6QnkYCS>(QFRTy9KomJv+zQo+SgbG55$!t5sT|s=l;u+Qi zF&v9}ggVY32~Q+4IZ1rMJ<ALW6&9hcNj%Hp)Jz{R4DR}ZIMf%nna_k}&ULK_E|Xw+ zTfftTjHgP22U=#6<c+!6n`vKoVJK#=CeKnsu!?nyE~ZGLT<$eak+prbY;VH3Alew{ zFC9LVo;F}KP{GhZIHkKnhc+f3HQ-bSI_7gvbQ0{Z7YUYI`b=-c3G)9~hvF)8O<qkq d+@OMSH{JahIn{&_NtzIs(_3&<%{Jlc>A#c2$y@*c delta 585 zcmY+A&ubGw6vvs_*VwHZX%tO=$&@NhP?Kd%vS{!iLh+y|D0s2xB$+jX`y=db0znTs zL`(uIcEJHJ;z2x#7iIA1O{7A5^HRZ!e}HFg98yT@T;{#cyziSY-@hBFwarwgi@Lb0 zeSmjqTr|Y{G%O%fd`rV)WW^V^3vc@~fV85qDrg;N<;PiA#A;A}pNHv$D&pr~mc?)e z&B-%M;2cGke0dHiQum+pu%1FC@p%Isky}?`pySf2`1wl9h|Vc3Avy+Hkz2RmQF33w zG%dq2CAVP{D@mDy1!qmGB(^K?Q2yrd42_3+_u+!JpNA_v2%{@Lt;tUw#ITo$*H7`R z7&c+zKYG0ZdGX^3UX*SKYZw;{iCXY0DQ-(`^6>7$T*#t~O`TBC7ceh}U3i1<Tyhu< z2=&^e5wI5bn;{7!8Zp8>+YekCao;;lLhe-+iik_wq)uCmRDG8bJMdkl^`klqriePa zp3jreZw6JC8v*gP2MZ}$jd+XQq?P4td1}m0#>xI<qCD=)V!a1*v5XIjTp#pNCvNoN z*r>W2`av|-k3PEQIc;KdCt?Aqv`N5}DVKRQRwKTr9#oK|LGLl*s5p20=sLGa=ER<u Xv*f{!b#Y(-OJZUGhh%X8myiDgsCvEZ diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 2d27f09f0d9b394cb9c5eb17b5dc3b2a6564d22c..68ad860b40293cd65612506427527849566066c4 100644 GIT binary patch delta 727 zcmZ`#&ubGw7-eQBwMj7;wP}kKry_15OKK{#i6PQWNJES<#H0y|hi;RNPP^Te-DzVH z`~jliNksV$BIrpE;xB}~iFoU&{sV$XJ%}I(iXNPFH3Y<An8(cfzW3gI?%mJ>2wk~` zUg1x(?$24gxD&q4;V|5);`gvz!?Js)hL51jXG|*A<RmS$X-5~^*6Dd$Ut`v)W2{rd zvX+^7mTH`8w8h$O!JC{q)~emq71}g(&8C`R^kf`v*?NmQT;n>`%oeqE!_rzYub^p} z4yT6Z@H%rC*IWMTmJ&@<2o=%jd>`d8ax~?&vNnwztCmm19Bzw5ti2xDuQfSa(`(vd zluo46{kmRrlwRyM!=XCf3s38KaQhrHxNiRu?Y)n~R2`4Q$UF-Aw(LA6+z<onGC{|( zc`u2GT0vu_f1@h&{{jDggVGK&TUIA#SWS&H%ZzOe2wpev7(A@tT_|;9qk-LxhV*e0 zU4WM|NxGk95(>ie5sCPUYB`yO_%ykX@~}Bg^0<%$BujhX!wd<)(YQE{4~U~OL!Jy2 z)Z%F+2QT8%Fzow*cZ2d62jKQeX%yam7uPR-;u|ihYDr-kRb?3^r>bhItY!_knjm2q zx+w+VO`dE+WvC{|K>?Q%BqHFE2k!(BQGX85FC6x*2$dB;l87Uu{cvwV8tT$EOneiw tT$mz0xoe?hyFRJZDK&3o`n^4(pyrm`14)8*pe2YD$aQqseO4fY=r@hq;$i>* delta 603 zcmYk2&ubGw6vvs_Nv#;NiEWHf5AUERfzZ%HY-0qo2}x;V5Nz6{P?hOs)+}sx!|XN~ zMNkm+;6a7*ya?Vrda>-myB_@mikF`Bq<?@1XG<xW!|;8d@B793h^cTt_4GOULVs7! z*?!ZOesIg<{qU$t?eiA_rr4q{f}F)2U*z$yNf(fB(4ScC&?}+Yp*P4oi`^?0q3#GS zfx8nJNinv)Js<pl2Lf!@^5l>Qw&xbWw_Q`A0ET=513ngDdP4!0^oFX|3kE{&xS*cu z=zDw86pK49zU|UEJlvx31UCbFEINEQo3Bh6^Z0d(>bT!kpUTUhsyJpgNdk*qdS;3p zG>NWF*T?Vro(ztAo{qomIuo#LClC^LCm@B|bST`u=!54fL!Asp{DA;R9Zqc-ZEahS zyF7KfJUosJJlmrXixQr^%=T!Q?P<S$kTE86tc;^0jfJfo(-X0_(J0mN?>Cypo0qg0 z{##>utYx&vH8iiW52S%)nXS@R8SiJc1$?u_=JE9m)A7|Z`=qMZoEm;!VQD<bu%wFX zvL3}(Be`@e)A(nFrAQk|ndKt<@C1L~&=NBh1s<IMr_A&VmCB~ETB;Sc4P(2|Fbt!@ ejrtvY*3~k^4fX4cB*_3%>+A(7h40tdEcp*aZ@ugQ diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index b13ca0a01..2185434a2 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -12,7 +12,6 @@ filters, rowsCount, moduleCategoryFilter, - isFirstLoad, page, sort, focusedElement, @@ -172,7 +171,6 @@ $filters.securityCoverage = COVERED_ID; $filters.developmentStatus = ALL_VALUES_ID; } - isFirstLoad.set(false); } /** @@ -183,8 +181,8 @@ if (savedPageSize) { pageSize.set(Number(savedPageSize)); } - $activeTab = DEFAULT_SOURCE_ID; + $activeTab = DEFAULT_SOURCE_ID; // The project ID, if there is one, will be the last thing in the URL // path, and we can reasonably expect it to be different than the // source plugin ID. @@ -192,20 +190,22 @@ if (projectId === $activeTab) { projectId = null; } - // Clear any previous state information, since it may have come from another - // source. - sessionStorage.removeItem('activeTab'); - sessionStorage.removeItem('categoryFilter'); - sessionStorage.removeItem('categoryCheckedTrack'); - sessionStorage.removeItem('sortCriteria'); - sessionStorage.removeItem('sourceFilters'); - sessionStorage.removeItem('sort'); - - // Only filter by recommended on first page load. - if ($isFirstLoad) { - await filterRecommended(); + + // If we were previously looking at a different source, clear all + // stored state and reload. + const lastVisitedSource = sessionStorage.getItem('lastVisitedSource'); + if (JSON.stringify($activeTab) !== lastVisitedSource) { + sessionStorage.removeItem('categoryFilter'); + sessionStorage.removeItem('categoryCheckedTrack'); + sessionStorage.removeItem('sortCriteria'); + sessionStorage.removeItem('sourceFilters'); + sessionStorage.removeItem('sort'); + sessionStorage.setItem('lastVisitedSource', JSON.stringify($activeTab)); + window.location.reload(); } + await filterRecommended(); + await load($page); const focus = element ? document.getElementById(element) : false; if (focus) { -- GitLab From 96afb89787e61132c87aeda3ac6a9341e1ff11f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 20:25:31 -0500 Subject: [PATCH 39/41] Rip out the sessionStorage persistence layer. --- sveltejs/public/build/bundle.js | Bin 305277 -> 302305 bytes sveltejs/public/build/bundle.js.map | Bin 281504 -> 275613 bytes sveltejs/src/ProjectBrowser.svelte | 13 -------- sveltejs/src/stores.js | 45 ++++++++-------------------- 4 files changed, 13 insertions(+), 45 deletions(-) diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index 7e322bfddefa56e63dd269c7068ee6ec48820032..cebf34dbd399f1f7726ad764abf8a5d923d3f7cd 100644 GIT binary patch delta 287 zcmex+LFnO5p$%azlkc^(O}^AAH2GGm$>h3r>B)(01)B}pH#1I_?)2V#sk4D`@`q-Y z$%lG$Cd>3{O`g$fH2G1p&}54~y~$Jhd?p+92TeZI?+q54IKh0<L^B{$Wb%fII+KMa zS%VEeI7x3h&lDEk$wresfs!(le@@n!95clc$d;ZgGgWPJ$y8&oe&K1WCV!Y_+T1(6 zy>~hz5HoG>ozDEHk;%Y#d$%OZYZev*Gb^*{x^I~jw$GAddCtUSV6?qik;R3Z$=GcB zNgWn;RwiT1?UxK$RxmS}nr^Q#WhnzPOtycqV7brCWM;Jestt=4FO#wPc1ACjQv!^J e)4W)uwm*wv`NzU!Y`XnfJj-tN?R;G<`Emf033P=3 delta 2779 zcmb7G&1)M+6i4exikudL<C3H)VN42IrLu$_OY%q6mN+$W>Nar|+)@X^cz0wkT5Ii@ zm4sWjN?QjbOZH_8f<gl&P)bfMfh?it9(wCPP)g{bh1`1Rtsif8SF*m6><WD`JMaB| z@6CJfH;*0;{qxJv_e(nw%DH9~vZlevDvhsFbKa!ua)cX2rqDS}H!0(hXw=%=IW>DF zd-dJ;24S4a+^5~lAcof`&NtOLwXW^d=fzS7K%5s>xWcp*D$6CJM{(wL+=amVF|(v< z)H<{Ky!H1^EbW6GQA?ztP}PkK!ou6z*2wMp4Z$eq1{;J+m%kWxIB=6`g;g!L<-`)b zfA98#kRNsmG3lzowmR6|++9F|UE`aP(C~B+a-Ht1fvSA};VuhRikzz0G_bNpl|0sR z*j%G{15O{W5sr0(sPNo?G-0AMO4O~mb9#zV;3no!C{&&2a~k930_?>ZH|VFAg?4CA z5oyn4GB`(|9`G9h&4u+eHd&FnrRCCU^ACi|Of$)f4prLCHaasnC$ibLKS)a3%pjj1 zjQS`!kyx+LKCHfaRe+17AgGRu{<UR&UQJ#UK8a##C3>B#1aaIlf?#6S&(*k}fVja- zFQC))v)1rlVp0$g%R#Wket?Zy@9oW=^O48K;?2<TQ4jdbJ+CRmVk`)(<Hia1uf4RN zrpy_NXqdNjx=sttz~x%nZOZ&QI-Pjt$m;arpl{aVNgq*jN|>^ibq0zT`<>crE_Nl4 zPL4hkyWImI%hsQ@abL)AKC{qAlxd`O-0xp*9(D6kklc$SZ`wIYIJO_QYW2~Sk3?)R znxhOx&yq&V9v{1Y@rvNn@hk|T4nvPoVyKr*<Lzy9203CewLcMYFrkOD+DA|8<HoPI z(970QDDlevz42bJJ({~&q(!=*@m7@`q^Q7Zt@nw|8O_jropRg~%a&=R|NMwK_FpU? z>@FXK;3L_~2Lu0oCXJ=+8^_UOgvO?(Q;mOrm$03G5&a=aV@dn^DRk+WG%;m=bq+mu zL`sg^cV+b5fRviF--)3T{7KtCCD3mJQaWjWdjXw)A(U)<y@+12AHRuyI4+G}u<tCQ zlSib9N!wmRKSnBv1fI{~GKDt-DPpvw8AYydffyNikWx%cOt7lupah@^y}LsUD>}3X zsFdzR5e|bNcjChjXelNI6*DRn&6Til*i{RiaC1rHP~2)3?l~2Zx=eQpTQ{Mu%?eEO znL!T_#8Y+-_E7R)X${pV9s!l>F^}SpJ?pS{YL}ap!05VBqV5H(Q@sVID1~siY1Gfg z8E&Aje)hIEqhE`TE8&wsF11G?P@e3)Ri-^jYCJO0iSvi4JPfI<6;z`f*9}MzTwLSs Q`8F1Bp%XUy6d7m#2P-AS4*&oF diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 68ad860b40293cd65612506427527849566066c4..0c6e381619f8783fa23ad8b11e23824c8b378b5a 100644 GIT binary patch delta 676 zcmZXROK4L;7=`&~Zu$sb@~Dtj6LlfdM>LkGi3Y{Fxi*PylhpK@)FPo)G>A$Rsi2#R z7B?a&#Iq1<_7&TLFj93<5V3`V;6iX+5EqKev{dxon}UySX7SHC=R5OH6`m(w-QzE4 zvIl_#O<<xxE_jpFjhjijBZpHoML5z+S^Gvd^wCSg-ZUM>QktR&XDEc(3`HQabO@aW z1@JCQ`;Z!-K71T7eGgAi9BPhYST@Lm*E#CI)<HACMlB3d7d{o4iikmJOQPZQN$P=; zHyu~<6n#{nH~3L7({B%xS3Vvh=bBUt?Cnz&Ys^O_T(7Y+JB5f})nh3U7xoeC7otBn zBE(2AAw<HOUDGhV!tOatWhh>m=G$?&nS14zRd$ZhUS%o^Y530gZcB0FnACqVH~D(U zlK-a~LKwKE@)kN<QF(_gw*vQUGmV!wl(6J>2}}_`K&8qi-dXpcdyV=3LAz}9A0Q^@ zSb&u@{Ni;`S;un+UpI|ua5{LG9kxDyM!Xf(8dKOs{qM{74czatcM>-d7GS@InHt-I zR3rDanX~YQ;-f;0V*VT3Z2n2Ksm{Nk<8u>#fReSZvW8cyX2geP?y{QK-<}EPgven& zrnJa$C*Q@Da^k#>*$8jL4j*s4yQp%xs4B}&b}27sT9u-Uh4a$WuK3-`kVu@8D+d*y Mo0SdeJ+9oR-yfvPZ2$lO delta 4238 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 H@g?+cxI=$` diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 2185434a2..1d8d12ddf 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -191,19 +191,6 @@ projectId = null; } - // If we were previously looking at a different source, clear all - // stored state and reload. - const lastVisitedSource = sessionStorage.getItem('lastVisitedSource'); - if (JSON.stringify($activeTab) !== lastVisitedSource) { - sessionStorage.removeItem('categoryFilter'); - sessionStorage.removeItem('categoryCheckedTrack'); - sessionStorage.removeItem('sortCriteria'); - sessionStorage.removeItem('sourceFilters'); - sessionStorage.removeItem('sort'); - sessionStorage.setItem('lastVisitedSource', JSON.stringify($activeTab)); - window.location.reload(); - } - await filterRecommended(); await load($page); diff --git a/sveltejs/src/stores.js b/sveltejs/src/stores.js index ad760d003..8ec141381 100644 --- a/sveltejs/src/stores.js +++ b/sveltejs/src/stores.js @@ -8,23 +8,18 @@ import { // Store the selected tab. const storedActiveTab = DEFAULT_SOURCE_ID; let activeFilters = {}; -if (sessionStorage.getItem('sourceFilters')){ - activeFilters = JSON.parse(sessionStorage.getItem('sourceFilters')); -} -else if (storedActiveTab in FILTERS) { +if (storedActiveTab in FILTERS) { activeFilters = FILTERS[storedActiveTab]; } export const sourceFilters = writable(activeFilters); -sourceFilters.subscribe((val) => sessionStorage.setItem('sourceFilters', JSON.stringify(val))); // Store for applied advanced filters. -const storedFilters = JSON.parse(sessionStorage.getItem('advancedFilter')) || { +const storedFilters = { developmentStatus: '', maintenanceStatus: '', securityCoverage: '' }; export const filters = writable(storedFilters); -filters.subscribe((val) => sessionStorage.setItem('advancedFilter', JSON.stringify(val))); export const rowsCount = writable(0); @@ -35,9 +30,8 @@ export const filtersVocabularies = writable({ }); // Store for applied category filters. -const storedModuleCategoryFilter = JSON.parse(sessionStorage.getItem('categoryFilter')) || []; +const storedModuleCategoryFilter = []; export const moduleCategoryFilter = writable(storedModuleCategoryFilter); -moduleCategoryFilter.subscribe((val) => sessionStorage.setItem('categoryFilter', JSON.stringify(val))); // Store for module category vocabularies. const storedModuleCategoryVocabularies = JSON.parse(localStorage.getItem('moduleCategoryVocabularies')) || {}; @@ -45,52 +39,42 @@ export const moduleCategoryVocabularies = writable(storedModuleCategoryVocabular moduleCategoryVocabularies.subscribe((val) => localStorage.setItem('moduleCategoryVocabularies', JSON.stringify(val))); // Store used to check if the page has loaded once already. -const storedIsFirstLoad = JSON.parse(sessionStorage.getItem('isFirstLoad')) === false ? JSON.parse(sessionStorage.getItem('isFirstLoad')) : true; +const storedIsFirstLoad = true; export const isFirstLoad = writable(storedIsFirstLoad); -isFirstLoad.subscribe((val) => sessionStorage.setItem('isFirstLoad', JSON.stringify(val))); // Store the page the user is on. -const storedPage = JSON.parse(sessionStorage.getItem('page')) || 0; +const storedPage = 0; export const page = writable(storedPage); -page.subscribe((val) => sessionStorage.setItem('page', JSON.stringify(val))); export const activeTab = writable(storedActiveTab); -activeTab.subscribe((val) => sessionStorage.setItem('activeTab', JSON.stringify(val))); // Store the current sort selected. -const storedSort = JSON.parse(sessionStorage.getItem('sort')) || SORT_OPTIONS[storedActiveTab][0].id; +const storedSort = SORT_OPTIONS[storedActiveTab][0].id; export const sort = writable(storedSort); -sort.subscribe((val) => sessionStorage.setItem('sort', JSON.stringify(val))); // Store tab-wise checked categories. -const storedCategoryCheckedTrack = JSON.parse(sessionStorage.getItem('categoryCheckedTrack')) || {}; +const storedCategoryCheckedTrack = {}; export const categoryCheckedTrack = writable(storedCategoryCheckedTrack); -categoryCheckedTrack.subscribe((val) => sessionStorage.setItem('categoryCheckedTrack', JSON.stringify(val))); // Store the element that was last focused. -const storedFocus = JSON.parse(sessionStorage.getItem('focusedElement')) || ''; +const storedFocus = ''; export const focusedElement = writable(storedFocus); -focusedElement.subscribe((val) => sessionStorage.setItem('focusedElement', JSON.stringify(val))); // Store the search string. -const storedSearchString = JSON.parse(sessionStorage.getItem('searchString')) || ''; +const storedSearchString = ''; export const searchString = writable(storedSearchString); -searchString.subscribe((val) => sessionStorage.setItem('searchString', JSON.stringify(val))); // Store for sort criteria. -const storedSortCriteria = JSON.parse(sessionStorage.getItem('sortCriteria')) || SORT_OPTIONS[storedActiveTab]; +const storedSortCriteria = SORT_OPTIONS[storedActiveTab]; export const sortCriteria = writable(storedSortCriteria); -sortCriteria.subscribe((val) => sessionStorage.setItem('sortCriteria', JSON.stringify(val))); // Store the selected toggle view. -const storedPreferredView = JSON.parse(sessionStorage.getItem('preferredView')) || 'Grid'; +const storedPreferredView = 'Grid'; export const preferredView = writable(storedPreferredView); -preferredView.subscribe((val) => sessionStorage.setItem('preferredView', JSON.stringify(val))); // Store the selected page size. -const storedPageSize = JSON.parse(sessionStorage.getItem('pageSize')) || 12; +const storedPageSize = 12; export const pageSize = writable(storedPageSize); -pageSize.subscribe((val) => sessionStorage.setItem('pageSize', JSON.stringify(val))); // Store the value of media queries. export const mediaQueryValues = writable(new Map()); @@ -98,11 +82,8 @@ export const mediaQueryValues = writable(new Map()); export const updated = writable(0); // Store for the queue list. -const storedQueueList = JSON.parse(sessionStorage.getItem('queueList')) || {}; +const storedQueueList = {}; export const queueList = writable(storedQueueList); -queueList.subscribe((val) => - sessionStorage.setItem('queueList', JSON.stringify(val)), -); export function addToQueue(tabId, project) { queueList.update((currentList) => { -- GitLab From 5ee43c2bf22b108a81c2b7e2e0d91e19497b7f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 20:49:44 -0500 Subject: [PATCH 40/41] Skip another test --- .../FunctionalJavascript/ProjectBrowserInstallerUiTest.php | 7 ------- tests/src/FunctionalJavascript/ProjectBrowserUiTest.php | 4 +++- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php index 97c1a7061..471a786d9 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php @@ -413,13 +413,6 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase { $this->assertNotEmpty($select_button2); $select_button2->click(); $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); - - $this->drupalGet('admin/modules/browse/project_browser_test_mock'); - $select_button1 = $assert_session->waitForElementVisible('css', "$cream_cheese_module_selector button.project__action_button"); - $select_button1->click(); - $assert_session->buttonNotExists('Install selected projects'); - $this->drupalGet('admin/modules/browse/random_data'); - $this->assertNotEmpty($assert_session->waitForButton('Install selected projects')); } /** diff --git a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php index de838ba07..1cb47bf99 100644 --- a/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php +++ b/tests/src/FunctionalJavascript/ProjectBrowserUiTest.php @@ -632,6 +632,8 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests that filtering, sorting, paging persists. */ public function testPersistence(): void { + $this->markTestSkipped('Skipped because the persistence layer has been removed for now and needs to be rewritten.'); + $assert_session = $this->assertSession(); $this->drupalGet('admin/modules/browse/project_browser_test_mock'); $this->svelteInitHelper('text', 'Clear Filters'); @@ -732,7 +734,7 @@ class ProjectBrowserUiTest extends WebDriverTestBase { * Tests multiple source plugins at once. */ public function testMultiplePlugins(): void { - $this->markTestSkipped('This test is skipped because it needs to be rewritten now that in-app tabbing is removed.'); + $this->markTestSkipped('This test is skipped because it needs to be rewritten now that in-app tabbing and persistence is removed.'); $page = $this->getSession()->getPage(); $assert_session = $this->assertSession(); -- GitLab From 23324b71b550179776abdfda25d2410fef82a88c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net> Date: Thu, 19 Dec 2024 20:54:57 -0500 Subject: [PATCH 41/41] Remove Tabs component --- sveltejs/public/build/bundle.js | Bin 302305 -> 290198 bytes sveltejs/public/build/bundle.js.map | Bin 275613 -> 269418 bytes sveltejs/src/ProjectBrowser.svelte | 5 --- sveltejs/src/Tabs.svelte | 58 ---------------------------- 4 files changed, 63 deletions(-) delete mode 100644 sveltejs/src/Tabs.svelte diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js index cebf34dbd399f1f7726ad764abf8a5d923d3f7cd..873722c94ef0d7a31cbcd045e29748890ac6878c 100644 GIT binary patch delta 3470 zcmZ`*dsLLw7GL|EJ-{H3VPF*GsXPSaF%07XYP^hGtrF3zCIRvi6_aqOm6ax$*-Hic zuJg0jx{75eS&DbEQ(2;w_PA2m%kr_J%vwdIUGsL+Ti!E6c3Z7==bvxB^PT<M`|Q1c zzkNP?(ds@K*0X%05&EPRyXH%qXY0lpZ0zjH@{DpHBV%A^sxfl&CZp=8)pKZbd7!bi z+luxbA`IuGFyqud8Dd=jq@5a#j>pn)YNq@cJ*$M(SigM}H6mvVrC_mxpN8cn%E!P= z8IJY<vCz2Bli~TGD@YhGt1*Uu_h#e96FHv#ZjaeW`ZUwi;|XHpwF_fBXVe<G$wL14 zGL#EF&+LCgPy?245TiVs4%o?<eCZ}n%)wxPy=4$hQ}|VMC<^opym_}oRVZ0KEk`Fy z<AIA-W6p^<luadz=f`(v2O7CQJ3VbDwlmC<G7(cpqu}b(M}Oeci4oWrKxxLe7Y4A> zsvR#fQz8CUCY?sv#ZuIjlGXj02Hth?L5Z)+$%{PN80a2}>KiE<15?Rt1oeg*4_t|b zf400G3$2vzS#@cn$qQ#Q3g2i4C6Wsr^)hVVWeO2Us?{-kJC`jOtfg>ODXH2N(VUUc zxTL9mSyS!2CH3=Lnr>Z|)QtLLG6JUq=s_%dmCDr9X4-24uOq8!38h~Io<Bk*YL}JP zhT^RwK4+CE{+K>g%Mz(26dQgdKLmeALF$5o?)O9QIAK%k3+Vj-9J!!DmXy*RL0G#% z|GivJtH@}7EM0A{puNKk+8Tw$ACU#|iE=oejg&E}r<#@tOzffzRZ&ZcanTDh0u%Jl zY&QQn@&#(cO1eD+>NT>W_qaa9Em;(*3f9pSfeSr)@sUuCy?ee4QqOImpNR_8?he{u zL+pM^HTt_)E$E{A%xFAB*%;YFpWvtzR`lN`gHbt01gW^abj6IH14Jsi%pzU2?x!D3 zm}eDZ@bDq}1|8Yb9|tmJAzplye#Od3+Irn#-MWiTM0l%b1U((Btgq8{ftA@ZUwwas zzOZ<$ycP2$u>n6gqzm`NQxqx^DM{Hrp?`+s+Ex*+Mt(=n_`y*i|Hq7sO$$X3;=k8t z`}87}Vek!#khw{@S6T9=YP(3QiE@W15|=1PsN$b!T@W1MI<~6>n@;(^TR>Zk@sSIQ zOyX-zCm*}6n$8gDFDJ8Gk{M4$i=nh7n?;Ek$K!NfHdw`WbfszVfj|mF=TaGhw$~{M z38$qW$_0<Xv+1H)#YTt+{qakVNL78&B2Z$fQ~$jZCw2s)YK3NYM<=V7(?m%Cvet+U zMDL(HRp$`l0v|ji9O@~j_&5aDuNPL;K1p;2lSA33iHJBXKIc8yB;l`WTE(wHSh+)k z%{dW*yH|)-jWM`FO!CL<T^h6KtV~k(tP!(J$lI&E|K}kwMPk)!!p~TLG02;p9Ap;= zKSa5N4WH}~F^F@ENOf|(cp?h>UmnWfT1_*p6$#3<Q;e24eOTORRJd8~+$GvgxUNqF z*X|X`ew!@1a5^dRJ`SsXB?cMa_YFm7oZ1|WZ|{;8<5YLBw{NXjQNkfA`4y2&+R_hC zndKOx_vA<v70Dpf?bJQlJB@-7UB=1k)B*7%`?k5ZP`H;vF?i^p2*;i&GS;0+#m0&c zL(%cMD8Wasi!tsqVgky$WGw2=h)UdeSZqZ1hayW2J0d3dBkiOv<gI<84e>0k&%YzO z{c$W!W~t*Jis>eVX3A7G?WBm0KwGO!P#xz)o5ja%Z=Uzr<vEG^LTOV@mJhIZkDt3m z6JzVWI`Guhas=8|3KPx;$UXRXq0CfA&GIK7mUmycIu$41HzB1&MyWTGq}hbqO11AR zY0@Gg%Va8ao$Q#ODJ!tIOqQW0kb*R|ISf%*@^N%Np|h1=pnbKireLp3Vt<ZI8PZAT z961AP?xP5GHd`(bm^{bFy>{GOFDI+~TzSca8I8J7KGMg$C(Y{S0_ktUfxF~T8|hIr z4C@NzBCn$WtY0lh!~PeJRk|);k#{jl6_rRAVMn*jP}@pngMjGKVUI17Ytiwx&V+Z& zD6RH|k*GSN0}6@eT6YGS)VFiw+vMFdsJ7Kh4<X<=ISPZ1i4<fyIauv%l*J}=nq`I& zb1>TYbYq<R7m<spH^>R<m1a3n`pD|;)e4u{BBu*HZR0R+Ra9rI{F^^c?v++G^$yu8 zao1t}SD$j9KRLYQS9?~=AL2EQw(0!&BcxAeK+9o-`l?$-`(etlp~MHm*`rIg^_YCA zQ05loquRo!$*IPN@i!!LTu2FL2i~pXM9#50oN84#zeO@<ybHgc5ec}(#)bGkm91*O zjom^c<Y7i6_eJK`q-Lil)i*9{zP)KieM5S7LgTXKRjwM;1!y53xIjs|l7XnTkO^&3 z971;09>udsI8t%!EF~+Q!(^d-I_>Dp(bHo}EQjk&^|72l(&bFUKqQxp_&;uNI*xA^ zE+>9)%Oq%p3`Or~nPh}MWfip!<Iv&Z#=*lOzOm%hPhH&M=~RvW)0C;UjN;2g<M4PQ zZ`Tv0IEn8iIWEV6!^vF21vP1DxOb+A#)?=DP+2LwRETkQOv&K8DGx`pI9uk`q~Y{j zF%~15M2srU<e55Sj(nr@r&y>gj`(dK>wRfP|4#{s&*tsIS%AaY{0O<!G&|RmRw4aN zQpa<+kHok<)s@RHFga11&$YThz4>}wzpfwed;M-af3D|(acEBjzL>~k^%u)Eyv&s2 zN=QjTSRqH_E!{@wxrWpAx0BcKectMpye8wZs*qhnz{7F0kW+s%y0_@6Q9_Z==!T*{ z7@aHf8Ko5SE*<KYX&i;YVovj0+El-!ae;AcbENlP80XW!VY#{hXG(Yp<zQARSCIpM zFXcRK_f08h=#eyH5*NWXiASJi5|0&mHIMd2<L4VR<~x)4d9==yCOmvC-vY~7eT6J8 z<5*M#$`M}DpuLP&p*NBeP%%qW`Q0D2dMuA38>+A47f|<^uwc<-PRAEbS_ax4(qgiE zGH=7>Su_l{9@OJjn+4<Za*jZ6otTL7RDIvE+`#{kIR!3n??o#eNu@xiNhHI5NR0Nj z5q6hzB(yNZ!rmgENAFZ_#I+T?5?@wuq(0!43LUOJk%M7rm7}H8KF*t@<GS_(zfc_h zI-Tw8tVx@IN2c>gd_JAW=$`98ODRgL&t6}{;ENe-r#xkw$=kf8R<rm^{n&C7CymOj z`TgExUebEU((wt|>E7pWM9Z<`%uPH2rkllZIA?P?*|DvX$NET&YbteR`(|_TpI00I zxS;wgxz(ouB~`v!pD&~6VT)Sp=QiIuU;D|2ULTHqRXYBXGKv}Yn}4rP41Ef!W}8OT zb}=Zd=3&w?PPd%bsG*wU@P3sZ!{@KnH;*mVJl&Rb+v2(U>N+<g;VMvGey+0Au*np1 z^_zC<usac2!+ENyfsYH!Y~oA0kt*i#9G%-e^SA-$B_+Z#k7H0VpS1*H@qBL5ccz2) z>jvwrqZ*m(%)n=@G~D=Rz=j^F!*exKvdkTqfo%=?UVUi+kJg~E&AM0fac46(YV6a^ zT#x=WTJ>rda+|ueP$xx~BWDqJ>P_!0;ySHQxh?#lpj`EGD_8pI_u;qmWubFmy_1`D z2<_)(6x?fggnH&q4r62u%1HdMlH+KCT6hoN<EH_?Uc<%eqlftsf87xckLnPdIPfSh Z*QC!g_!)wGH;q!ZO}aPKO>TbJ@4pQ6p^g9m delta 8982 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 B!U+HX diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map index 0c6e381619f8783fa23ad8b11e23824c8b378b5a..b8782dc1ba8789c34f7cb2ce08f3e933eadff1f4 100644 GIT binary patch delta 363 zcmWm9O(?@*9Ki9O=lA>X|F`LHEJ<NCa?qw`^7c=8_DtKnMxvEkb|ED%;pQ-sB1O{g z;JuV`;`AuWkyf&ci}F&W%w2L}yMOD`ckk1gxp1DH!d5FcmQt{i0;W>HGln{Lab87b z@64xu8u?@O%6gou^*E#_$(@2qmAr=<8?`7XQ#TJV?a=CjGBHCVPf)5hzTmCI-ZVJk z4GR(WN=hz+M;!nzFxF1x8eY=w2bh%R;M69vO+RgZfQQ=bkWa4_U}{m(EF(014#jHU zhEk`tU#{zOQq0P!5G4cPrZp2U@<*lUi{zBvoRR<+B?{2z=oK@;v7onG)Q9NEfEv0j zz&K6ifu>DJ(G#XaC!VN|LR@8Ro*s&@iA)!6^XLGb|7Fc*7dDtIMpqf`rk!hUr(qBJ zb<2v0PJc*!dr;|lmSqizNjV-=FSTd@@9UzwNcNuBp@Xq8G6T2>QR!FP0W{b@8P0Si delta 4080 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 diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte index 1d8d12ddf..e5168987a 100644 --- a/sveltejs/src/ProjectBrowser.svelte +++ b/sveltejs/src/ProjectBrowser.svelte @@ -4,7 +4,6 @@ import ProjectGrid, { Search } from './ProjectGrid.svelte'; import Pagination from './Pagination.svelte'; import Project from './Project/Project.svelte'; - import Tabs from './Tabs.svelte'; import { numberFormatter } from './util'; import ProcessQueueButton from './ProcessQueueButton.svelte'; import { @@ -335,10 +334,6 @@ <MediaQuery query="(min-width: 1200px)" let:matches> <ProjectGrid {toggleView} {loading} {rows} {pageIndex} {$pageSize} let:rows> <div slot="head"> - <!--Show tabs only if there are 2 or more plugins enabled.--> - {#if dataArray.length >= 2 && !projectId} - <Tabs {dataArray} on:tabChange={toggleRows} /> - {/if} <Search bind:this={searchComponent} on:search={onSearch} diff --git a/sveltejs/src/Tabs.svelte b/sveltejs/src/Tabs.svelte deleted file mode 100644 index 5d37ca0c9..000000000 --- a/sveltejs/src/Tabs.svelte +++ /dev/null @@ -1,58 +0,0 @@ -<script> - import { createEventDispatcher } from 'svelte'; - import { activeTab } from './stores'; - - const { Drupal } = window; - const dispatch = createEventDispatcher(); - - // eslint-disable-next-line import/no-mutable-exports,import/prefer-default-export - export let dataArray = []; - let tabButtons; -</script> - -<nav - style="display: none;" - class="tabs-wrapper tabs-wrapper--secondary is-horizontal" -> - <div - role="tablist" - id="plugin-tabs" - aria-label={Drupal.t('Plugin tabs')} - bind:this={tabButtons} - class="tabs tabs--secondary pb-tabs" - > - {#each dataArray.map( (item) => ({ ...item, isActive: item.pluginId === $activeTab }), ) as { pluginId, pluginLabel, totalResults, isActive }} - <span - class="tabs__tab pb-tabs__tab" - class:is-active={isActive === true} - class:pb-tabs__tab--active={isActive === true} - > - <button - type="button" - role="tab" - aria-selected={isActive ? 'true' : 'false'} - aria-controls={pluginId} - tabindex="0" - id={pluginId} - class="pb-tabs__link tabs__link" - class:is-active={isActive === true} - class:pb-tabs__link--active={isActive === true} - value={pluginId} - on:click={(event) => { - dispatch('tabChange', { - pluginId, - event, - }); - }} - > - {pluginLabel} - <br /> - {Drupal.formatPlural(totalResults, '1 result', '@count results')} - {#if isActive} - <span class="visually-hidden">({Drupal.t('active tab')})</span> - {/if} - </button> - </span> - {/each} - </div> -</nav> -- GitLab