From de05a713943e6e030036cba8084bbf166f258e96 Mon Sep 17 00:00:00 2001
From: Adam G-H <32250-phenaproxima@users.noreply.drupalcode.org>
Date: Thu, 27 Feb 2025 14:19:01 +0000
Subject: [PATCH] Issue #3509242: [Svelte] Remove the $updated key

---
 sveltejs/public/build/bundle.js               | Bin 279138 -> 277231 bytes
 sveltejs/public/build/bundle.js.map           | Bin 258613 -> 257725 bytes
 sveltejs/src/InstallListProcessor.js          |   2 --
 sveltejs/src/ProcessInstallListButton.svelte  |   4 ----
 sveltejs/src/Project/ActionButton.svelte      |  10 +---------
 sveltejs/src/ProjectBrowser.svelte            |  10 ++++------
 .../ProjectBrowserInstallerUiTest.php         |  13 +++++++------
 7 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/sveltejs/public/build/bundle.js b/sveltejs/public/build/bundle.js
index cecd5d94d1a117891778ff9a5cfcbc6634c4108f..6af82f77ce69a6f9fc2858cf348000869371da8f 100644
GIT binary patch
delta 1284
zcmZWpZA{f=6yG_|0eK59aJg`S;L3}FF!<m9eZLgJMy?mLHqBai6KsoBC?cdJh#;hH
zZOw73Gf5Z)mChU>#bY8HuGQGw0_j7jyJ09Bt1PjR9}4QZ#8$57%Q<Ji^PKZL=Q-z@
zZIAtR(J*kJZRliMAP;Oq2l|_VTu!f@i%($AP}X22@DmS;$f4us9HBz<>i(vFGbe0?
ztf7!E78CprOcd}_-(mL9#fbv&JFb-ZJ-@{A8!pN_JT*K8pMOeLuU+HXVaSlzoADMJ
zteS4mwKPUp)CpIIKRApgPCbHQ@^&lE0ogrXoh=!n$e%SB&$pX#jIU*gXnD6CpBEt>
zm)B+s#<R#h$Iu(b1tXBmOGzSK-aL*w0c}2RJqSs>qXSK#^S%x&1DhP_z(b*^>AdGO
z=E<rPIEbW}ICxi|XqP=FaTlP+Ee+kcQ3L^d5cqibLnK7a#@bhyB-8qEPJkxq6ut&v
zl`2%jN)*?Bqd0Xra~8M#FFZNiUN@JFqDhvW!>3p9l`O02xnw_(BCPtJ%g0(o98dJ2
z#^0aEopRs;wu4k^IFRPGJO8Oa@&alCT{ijfC{`;)U!logj^SOfarGrkmXnw8MS)J6
zR0Y%uba;X;iJWo@Gi6{LI}jbZti6nnM8-V6yRN>nx_Z+qb@dxxudepPgg5xI7x}rX
z7{i0pxP?8NA(kty;x-=dg=iUb4c)-67Ndb{MntGQeH|Nt%ST1JKV&K<%BKJO%p5k2
zTlw8yh(SG{E2q)JmBpCDr2$;WM*@mcRRGhEb_Gy&1q32ExMxN<)WF$!dPdv>hn&12
z(h!|?UYHfR%1*f{x`0Q15=VLImUt7K+%_lj6)-R-`Z3szv?`Ip2j@kkaQceaAkZxP
z=0&35u{)vyTypJ#Xa#Vwl5fd^-^AH)m3HAVF!G&0MIJhR9Y2=%TNcxJW>$pp_GJ;x
ze=Um$`Tml~Ak=+4;3hLq1EpHrzWmjJuB+KwU+1+HZdg$^6k1-YZz%V00#Z5HxfV%B
ztA{^AdI&W&sVt0q59x&<RtiS>vY=r?yN^rHh#Y_6xaGYk!OS-{iFnx&M)RQj0{b9?
zyCSGw*i?7aCM3$dNQzQx>&q?T<w#2AXQOC6x_y55ESo3ILX+P{(IHYT+7e6MN<_tz
zs?W}rIF<Q6GlhRoq8$D?j?z~FB^u4t#Lu+g8a5b-<XAj)Lh$-v0-3ljfsD%M2P36$
zZvwp?zPDz7ovPbo<ws4F8EUn8bf;bJHqjMS>`Tn#BDd9}%O*2@0-?&&s=MxU-JU|1
zk<WiEQdhnf-jPWm+>%BX`9~Vn0BAhW2`1TUp=>~1jdUj@$+5N66I{y5Ofn%jWkWXU
jpw{5bI;sG-j9O2n2K5hYc2Nn)ZZ{R8vcB=sJ8S+1;ar;V

delta 2238
zcmbVNd2Ezb5YNne+k<ZDLFv+i_A3<ZmQB0g9^dY^0woecl&gY-BTKuKwQ0KT_N1th
z5L;6WiC7mqo=Auh<ZP+>nur|HU^qfcj9@6$a)=^{C;^Rt=-cfHLH_9GOLpeHIes&5
zjvKdQFEz!rz1Wyi;;*c&Q|hbMc<Q`sl<7)CO<A31wa=SnHg?oDUYQ1tj%EAT130OD
zH<&tDdoiFxrE&o|fwnJs2OZFdfvw}CPFrI5fR(_h(|JR5TvxI|RZU9fu#3#hwH{x+
z*GP*r$fWM?a7xFtt{fn3KEzoD#2!$n^foB7CB7_UPN}zUNm+%Yh6MtJ-SbAPO9f6y
zYTVZ?_H{$w9&m}xFJmO*HnU43bsLTo`#0b{K)XZieFfL@Fx70&vs!6kIVfUoGv-C0
zW*1GH@f`pQrL|x#SZP5E&PI!yW*mX%#I+VQhH=%L=M0>0%Mvr*#se5M?+BW2B3~Um
zLv1D&PEiNg6Le%Z-eRg*6F<L?bNXQjDYpwzRYmW1{D*O8o@%AO?U*2LevC_ixdtp(
z@5BWm%dY>mtaC^hY7qP+(X$8D#{;<ynqci%8j=cS<B@RDWfz{$(9OUp4tL^WhE7!^
z97LZa%p@^Spmz`B&0s=uD_D})aRgVfU<C!QMEcjboT26jat4wSO%|VigKr|8PGn(X
z-U-Z)iWsb%hsr7~{xKDGkV?<vVqK`X>EwBIK|b9$i;48!SzJ8oVricbN%ZeoTsmqC
zZ~O|0qU0PpfjUimG}TTS7bJ+HY7C>zoh(`$`W`EROc!7x-T#8cP=1e0WLXcU)3cIl
z-q?d;V-G_FjW+c%J5%#C`l^@xCHV{=q)<@<#E74MV7Gv&7AN)eF{6BV-9`2R(4k%y
zsW11wFx0$MxDyj2<w?<MpTDG>`kEk-x^6-=<zHsC;Gq4NnMtR)bIR6`=T(>~(yuTd
zGS#ZlQHCjFYy1th*||zd-MW<ycRn4_VUp;&$_$LQUt-PXsv7UwGJkz-QPAgfB{zHU
z=?8Q)cm5bf{vv(eIz`G*wHdQhhu}z+k{Yj^6G8m}gl8(4kp)FBcHy`X;R(P~A>wcb
znnT1N8MvIP1nQ{jDvKx_;Z(CJQ>QAmp69(qmHxUSZ*{%Lmo*ZlNg2sK8ncmFypT#V
z&Inr33NeNubS6a(M)_6x{Z+<%s#?et!*F&V2#4B%j~@zzmbZf5SXP-e(v)!^IgydW
zHgYP0B2-|-<d8D7f+4WtSX__^^z}}pl-F^7=%(6+iw22gD*hJCfepLjhm=Bu*@r2#
z%`fZk>NQp@SHkh@Y!kT}nK{t5w>gwOsto7RwDmg6mh(VfJIA2rrh;OaLQh9PjJ`-6
zcuR}JO)bT+DyS7t8~PX*;!kGcXm!(cl_$~tJ1iAkv}Y-#p=zeQyKE)csr4?ipv6ol
z?y@IQb(4Av66o|D*$tEKu_aQVN*;(!_t@uLGVS4*M5)N5-|Axvg#i8w$kT0%w}QR(
zj+{n|IM)Yvn_I_cqsvWaHnJ>=oyc;;-#WgY%Zgq%hHsUBA4c(Mp$0h>#bwh(@tF@D
zt{%y^#PgS^;72*ul{n66UM$y(-}L<T{vKODmS;=pqw8Q?f6mgwxsHyH<*y|S)}Bcj
zXcdd<q8SN%a+t;8w9EbsEhUQKhfoHxG@d(js%CZCg!H%rVuzQa%(BI9AE_!z6ZlEg
z2U};*3l(ZGIkbS$Y7LmWGH96wsSm7fZP=u&$HC2Q3>0^br*l4>B#s&QEC7{$kCBrt
zEs0M7w3?|!g9)Uh%CO6l`4+hx#r+hXh~N<8)3^n|Msw47vD~+xr1M#^U=!DKc>xTE
a-{0nu!6eYEgUlf2s5}9s+)69o68;}_>gI<4

diff --git a/sveltejs/public/build/bundle.js.map b/sveltejs/public/build/bundle.js.map
index a012e1af66e538537ad02c48022de757983f9f89..884c12113d3c1018ac865a155f7cc3f08e8f14f4 100644
GIT binary patch
delta 437
zcmWkoPe@Y%80Y)G+SCyWA!1>3t0?M84nb{8>w9nG`Djjaf#4-m2i7Ljp+QNxEP_BG
zNcavB9ivO9?Ca8@E_DrIP`V__Ao4I)%b<*&zr&B;;rDO(OYO^IZT=b5Bs7!&IiQ6M
zgi-!7R!MgjuIuM4oWCUBGf=IG_wWetP*}<z;Ecpq;etHA0d?|e6_Pr%1_wcwiV)CB
z5xSBZ31N1>yozH`HsWY_W>2Ipj*jc$UOaVMm)_z1hFzh=aZCI}jnW(>ub%yeWrVbL
zZ{j(x$KjmSX34+T<d^3^@V6%t8D)Dwwtix;I^v>_$1a-^_=S7rY6WK?rKJkC0^~HX
zh2?8i$!XI_F{cE!v0g(t>exerJS~|y8s6=2-(*aDd9vMJhwUr!AWuE69%Q>sjGOed
z$?7nTw8@+{jTkc<mP<Rk4tGZ55}v04n3TnNn)U7EW5$H*wPkINj>^|A@_QUBZDyh}
ze3$CA^A?Tt(@f8lJY1n;Fr{x-s0G{?<56396Zgrz0xe7P2>H}1&>t_f>*<el2k>OC
SyjiCsT3V+Ub^4@43-BKrikh_m

delta 1062
zcma)3OHWfl6wb`h2N*ySDzT_sfy7p>(8LfVSJAn*rL>jSg2DKRQsF{tOIv8M6;d9F
zD-se}=)p%^xy4sBllVyd2ND;?Kvjq)CPWrO5Zs{m7Q~%&7Lz&OobR0PeCPGY!slNL
zN1mZPce$L5M*8AhM<g7JbN$gyUtI3wj&X^;K-_mZB%3T|rg5Wt`*fRs>`n+#yr1JL
z|0Rdz1ZP!<CUbSS96ufCQC{#qjK(T1ggNE>H<g`_ptFHo?r(GU=mVNUnv5X0ID<}r
zvj-XB{tUWQwoR#9w^0e?&!X1tdYag|S!6~q5k>|WO{0oBjtfP6oq=$-GJBUV6qAJw
z>DzQ<chjh`RljKk&*o}yw6rKFU)!2FrPcwb3!5P7!qvqbH&`S4I{X=24U}Z|z=e-q
z*LwJ7N}FN+3o$^!XQGG5B-UvtmBJEBzr|3JQ|qphZqAe4?8Z0z3!@ktTfkl&v{#ZG
zlw_ZNU?VbBiB#(1y_9-+JEfF&Q0h@H2X9kDiBdc7Q81WCq*N<(P<vd2^(9<xR+u)w
zm@QQ=2!e-R5$mDoIN1da%Q%LEB73@wEr<+=wcs5jdtqt?J7MHI&SPyWcz7T;AjU;r
zrc{QaC^4|52&v203TJ4Y-2>iN#0X6(V%;e?sOzdt)k;-QC`=C%lTJ`zN1qiYQpB!`
zmFlw=t5vA#oC>uBex`^e!>`GjuTdo02Y??U4;yTCA|Dhf4T@WiQlVR-wq(}jGNT-^
zw!!KUX+ej<IZOtjeUcb74k;qmvppjud1^<Zsb5leXy+y9{f*1=6~|-B5}Pt0j2<M1
zU~QVLYI-GVZG<Q5*Z^;4NwFrVkXkn4C`T&b@gmj|zx5=HFJL1pct>99NtNUVx`vC{
Z+zg2#>~}*;njBz>G<mU;Sr*AS`UCn_Q-uHk

diff --git a/sveltejs/src/InstallListProcessor.js b/sveltejs/src/InstallListProcessor.js
index 67025be16..3a8cc026c 100644
--- a/sveltejs/src/InstallListProcessor.js
+++ b/sveltejs/src/InstallListProcessor.js
@@ -4,8 +4,6 @@ import { BASE_URL, CURRENT_PATH } from './constants';
 
 const { Drupal } = window;
 
-export const updated = writable(0);
-
 // Store for the install list.
 export const installList = writable([]);
 
diff --git a/sveltejs/src/ProcessInstallListButton.svelte b/sveltejs/src/ProcessInstallListButton.svelte
index 74b85d3ec..c0c756481 100644
--- a/sveltejs/src/ProcessInstallListButton.svelte
+++ b/sveltejs/src/ProcessInstallListButton.svelte
@@ -2,7 +2,6 @@
   import {
     processInstallList,
     installList,
-    updated,
     clearInstallList,
   } from './InstallListProcessor';
   import Loading from './Loading.svelte';
@@ -23,15 +22,12 @@
     loading = true;
     await processInstallList();
     loading = false;
-    $updated = new Date().getTime();
   };
 
   function clearSelection() {
     projectsToDownloadAndActivate = [];
     projectsToActivate = [];
     clearInstallList();
-
-    $updated = new Date().getTime();
   }
   $: {
     // @see css/pb.css
diff --git a/sveltejs/src/Project/ActionButton.svelte b/sveltejs/src/Project/ActionButton.svelte
index 26c5b4c34..01f7429a5 100644
--- a/sveltejs/src/Project/ActionButton.svelte
+++ b/sveltejs/src/Project/ActionButton.svelte
@@ -10,7 +10,6 @@
     addToInstallList,
     installList,
     removeFromInstallList,
-    updated,
   } from '../InstallListProcessor';
 
   // eslint-disable-next-line import/no-mutable-exports,import/prefer-default-export
@@ -22,18 +21,14 @@
   $: isInInstallList = $installList.some((item) => item.id === project.id);
 
   // If MAX_SELECTIONS is null (no limit), then the install list is never full.
-  const InstallListFull = $installList.length === MAX_SELECTIONS;
-
-  let loading = false;
+  $: InstallListFull = $installList.length === MAX_SELECTIONS;
 
   function handleAddToInstallListClick(singleProject) {
     addToInstallList(singleProject);
-    $updated = new Date().getTime();
   }
 
   function handleRemoveFromInstallList(projectId) {
     removeFromInstallList(projectId);
-    $updated = new Date().getTime();
   }
 
   const onClick = async () => {
@@ -45,10 +40,7 @@
       }
     } else {
       handleAddToInstallListClick(project);
-      loading = true;
       await processInstallList();
-      loading = false;
-      $updated = new Date().getTime();
     }
   };
 </script>
diff --git a/sveltejs/src/ProjectBrowser.svelte b/sveltejs/src/ProjectBrowser.svelte
index d126cd6d1..3a0ccc9d3 100644
--- a/sveltejs/src/ProjectBrowser.svelte
+++ b/sveltejs/src/ProjectBrowser.svelte
@@ -6,7 +6,7 @@
   import Pagination from './Pagination.svelte';
   import Project from './Project/Project.svelte';
   import { numberFormatter } from './util';
-  import { updated, installList } from './InstallListProcessor';
+  import { installList } from './InstallListProcessor';
   import MediaQuery from './MediaQuery.svelte';
   import { FULL_MODULE_PATH, MAX_SELECTIONS } from './constants';
   import QueryManager from './QueryManager';
@@ -247,11 +247,9 @@
         {/if}
       </div>
     </div>
-    {#key $updated}
-      {#each rows as row (row.id)}
-        <Project {toggleView} project={row} />
-      {/each}
-    {/key}
+    {#each rows as row (row.id)}
+      <Project {toggleView} project={row} />
+    {/each}
     <div slot="bottom">
       <Pagination
         page={$page}
diff --git a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php
index f5afc262a..cf5fc99e2 100644
--- a/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php
+++ b/tests/src/FunctionalJavascript/ProjectBrowserInstallerUiTest.php
@@ -267,20 +267,21 @@ class ProjectBrowserInstallerUiTest extends WebDriverTestBase {
 
     $cream_cheese = $this->waitForProject('Cream cheese on a bagel');
     $cream_cheese->pressButton('Select Cream cheese on a bagel');
-    $was_selected = $cream_cheese->waitFor(10, fn ($card) => $card->hasButton('Deselect Cream cheese on a bagel'));
-    $this->assertTrue($was_selected);
+    $this->assertTrue(
+      $cream_cheese->waitFor(10, fn ($card) => $card->hasButton('Deselect Cream cheese on a bagel'))
+    );
 
-    $dancing_queen_button = $page->find('css', '#project-browser .pb-layout__main ul > li:nth-child(3) button');
+    $dancing_queen_button = $this->waitForProject('Dancing Queen')
+      ->findButton('Select');
     $this->assertFalse($dancing_queen_button?->hasAttribute('disabled'));
 
     $this->assertNotEmpty($assert_session->waitForButton('Install selected projects'));
 
     $kangaroo = $this->waitForProject('Kangaroo');
     $kangaroo->pressButton('Select Kangaroo');
-    $was_deselected = $kangaroo->waitFor(10, fn ($card) => $card->hasButton('Deselect Kangaroo'));
-    $this->assertTrue($was_deselected);
+    $this->assertTrue($kangaroo->waitFor(10, fn ($card) => $card->hasButton('Deselect Kangaroo')));
     // Select button gets disabled on reaching maximum limit.
-    $assert_session->elementAttributeExists('css', '#project-browser .pb-layout__main ul > li:nth-child(3) button.pb__action_button', 'disabled');
+    $this->assertTrue($dancing_queen_button->hasAttribute('disabled'));
 
     $this->assertNotEmpty($assert_session->waitForButton('Install selected projects'));
     $page->pressButton('Install selected projects');
-- 
GitLab