From 12596ffcad162be829e53847ecb21b958ff98d19 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Wed, 15 May 2024 18:00:39 +0300 Subject: [PATCH 01/15] feat: added live search in the degree programs overview form --- fau-degree-program-output.php | 2 + ...e_DE-94a0a682fe40fcfda002d6f12990a493.json | 1 + ...e_DE-a56b7b8716b68171f352ac40372a87d0.json | 1 + languages/fau-degree-program-output-de_DE.mo | Bin 13885 -> 13062 bytes languages/fau-degree-program-output-de_DE.po | 80 ++++------- ...rmal-94a0a682fe40fcfda002d6f12990a493.json | 1 + ...rmal-a56b7b8716b68171f352ac40372a87d0.json | 1 + .../fau-degree-program-output-de_DE_formal.mo | Bin 13889 -> 13063 bytes .../fau-degree-program-output-de_DE_formal.po | 77 +++------- languages/fau-degree-program-output.pot | 48 +++++-- .../search/filters/_active-filters.scss | 5 + .../degree-program-overview.ts | 79 +++++++++++ .../degree-program-overview/degree-program.ts | 133 ++++++++++++++++++ resources/ts/filters/active-filter-label.ts | 33 +++++ resources/ts/filters/active-filters.ts | 117 +++++++++++++++ resources/ts/filters/filters-count.ts | 35 +++++ resources/ts/filters/filters-handler.ts | 61 +++++++- resources/ts/filters/filters-reset.ts | 11 ++ resources/ts/filters/index.ts | 1 + resources/ts/form/form-handler.ts | 59 +++++++- resources/ts/form/input-handler.ts | 44 +++++- resources/ts/utils/data-fetcher.ts | 32 +++++ resources/ts/utils/settings.ts | 12 ++ src/Infrastructure/Assets/AssetsLoader.php | 37 ++++- .../Component/ActiveFilters.php | 4 - .../Component/DegreeProgramsCollection.php | 4 - src/Infrastructure/RestApi/RestApiModule.php | 42 ++++++ templates/search/collection.php | 6 + templates/search/filter/active-filters.php | 4 +- 29 files changed, 783 insertions(+), 147 deletions(-) create mode 100644 languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json create mode 100644 languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json create mode 100644 languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json create mode 100644 languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json create mode 100644 resources/ts/degree-program-overview/degree-program-overview.ts create mode 100644 resources/ts/degree-program-overview/degree-program.ts create mode 100644 resources/ts/filters/active-filter-label.ts create mode 100644 resources/ts/filters/active-filters.ts create mode 100644 resources/ts/filters/filters-count.ts create mode 100644 resources/ts/filters/filters-reset.ts create mode 100644 resources/ts/utils/data-fetcher.ts create mode 100644 resources/ts/utils/settings.ts create mode 100644 src/Infrastructure/RestApi/RestApiModule.php diff --git a/fau-degree-program-output.php b/fau-degree-program-output.php index 0ba59b7..c1482a0 100644 --- a/fau-degree-program-output.php +++ b/fau-degree-program-output.php @@ -38,6 +38,7 @@ use Fau\DegreeProgram\Output\Infrastructure\Query\QueryModule; use Fau\DegreeProgram\Output\Infrastructure\QueueModule; use Fau\DegreeProgram\Output\Infrastructure\Repository\RepositoryModule; +use Fau\DegreeProgram\Output\Infrastructure\RestApi\RestApiModule; use Fau\DegreeProgram\Output\Infrastructure\Rewrite\RewriteModule; use Fau\DegreeProgram\Output\Infrastructure\Search\SearchModule; use Fau\DegreeProgram\Output\Infrastructure\Shortcode\ShortcodeModule; @@ -155,6 +156,7 @@ function initialize(): void ->addModule(new StructuredDataModule()) ->addModule(new EditorModule()) ->addModule(new BlockModule(__DIR__ . '/resources/ts/blocks')) + ->addModule(new RestApiModule()) ->boot(); } catch (Throwable $throwable) { handleException($throwable); diff --git a/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json new file mode 100644 index 0000000..ee6d305 --- /dev/null +++ b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-05-15 11:05+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang w\u00e4hlen"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json new file mode 100644 index 0000000..b369ed8 --- /dev/null +++ b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-05-15 11:05+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE.mo b/languages/fau-degree-program-output-de_DE.mo index aca530ad5e39f568089b927e97bde656ab5ba8e6..0205a88f5d6d8da4b5927fb97f8ecc0a265f9b29 100644 GIT binary patch delta 2677 zcmZwHe@vBC9LMpa7cPM)Kl}mKwR=^(Dt6%k0p)^dMAifUJB82qIWHe znrY-sS5E)2)%>y5=tk=g%3rf3)v~qatTaoeZLP84kHXY?e|FEGu{&PRInVQ)^F815 zJ4R7HROk~*)VFRka4K-i{wW7nQ zfO=7Z{EWP6{y=5+Z&YTJxtWDI5iYdSa-58{sED6Me&#LfyQmjFLIv87?1uRs_5LN) zM1xq4cQFx5iBemz05$$&r~o&hwkYxj7mBDC%kVr-$5g^q3X5#f?cn}>thlO|tOE5s1W?~ZtnBVN-qJoY-tipS!B3j6XE5c6n;$hTQoko7< z7yc>m8<>w{C?EwsAAPtUwc;-8QPgu^VFCVwGnn55#>Zb=fwQ==1GU0qs0<8XF;1Fb zOf@#326`Kn>MyN{?2p=&_&i2%KK_NuYzdXD@!GKvkK-Jjzsp=`#SPWpiCW23)C8V~;{hx|y>|drGv~1!hi$ur*_GinsIA)NCI9!hh|!_q z>G8z}ykgB@1NC4fs%oD?72BIwf_Cka{6?OdfqN?;0)D~Q^_uVwoX{RIK7Bd;sFo3MV%tICDYU^{z_M4ZH zGBJlx$Mj?5Q(#U->;vDTCccgeWE9KgqiDus1^Q5_51|`(qEfvJ704-M`^`6~fq%y& zyp8pE9~F2V=~R0yst6-JTC)70B`x{a3@36j(3giH4 zA-$-DoIt)wrXR=S#dv?j4053d@1O=wAn$r13su!qFcI6(jhm6WGo7ftKY*I>Yh(y> z9kuuA6pALyMasjJqPAuw>issHs`I~_3l?p9kdtUGA_u?>q4q9~l2s8+M-5zs8elc@ z4KdqL?{%YU;3%p%&!LJRw=tD=LLk0?42&qH`CMqg5>zT{t*!VZ?VYH|uc8JRM6Kv9 zjzpbZ1?)min2Fl59Mp5UsKE13dtZv0w=R$TbF$0|I>@%!hO_Z~RO)`T4&!Lr*?b0d z3jCL0;b~- z>bSVLsX$6F39B&;Yw!}TLS-_@!y0cH>iIA#1D&?rg_*SXP2@sFbp(0WoW=~iSs1&P z8g$2=7<QF~>&{yab76qK*Ktb_xXHKwqZm`Ii>5TZS5Vc g&F#%$UpTaGgJRuKa4Xt9JvpJJH5`tuD*V;;AEZk$Q~&?~ delta 3561 zcmZA3d2EzL7{~D`g+dWnu2$t-wm_jR?LyJQaur*UO9jfI975?X+uCKfY_}FDvdB^H zvw#XJMnqyX7+8#dpoB1XXcsbeW7;o z`+=QZqnC^^FDCQB@l88pI^wt34gavFv^SiJc9l33rxZ` z9pc|RkUx{gM`s+;!9-04jd65z#R}_s?8Nzgybs?(4N#A*@iV+1Z()D@)AqX@@c}Y$ z82!UB4a2C3>_Zp6gu2gZN7R@eG|tk|25(y%a3be-kUuk)v^;{-usa?^^`AuD@EmGI z4X6nvFni`?1|Uf^dB|6$5S7`PcrR8&Y4B$@^3ezPqh|ab>IOHhKcFtSi<)REqiNTA zBVA@7YM>D~5+`6QT#s7$7S#QBqb7I)wMEgZG&G|G@;elJ;0T9`G*%6D)8HefE^ z%YF^V$v6tvqqg!4W@7_pVb2um1}EVVticEIC=O(NbDPE>IvlCS(tnXNV!fN_+D4fxF1eM{haTwzp7t2s;=3*Xh zM-A{H4#mGvD<9l5KG1CI2F$1bT^x(Q;S}`rif_pVYdwykKasTYXA1bx)|6mWsoqIL z16{^BnCy&Cz>C_`{ivDOqpH0nc~mCSQG2@(HSjLf#IK_=*_9uU#8Ig86{w6JLS^`( zi~Rph;|?9#<6kL#-LNlj8#xp8!&+3;9z{*)6MPVr7HwS~>M1D07ZTV~WOqyo7n5a^ zgL(=kBgrt+txMCR@yBc@9eSJ&q8`6Dkm@uSkb9Xs_WPbJqa)|(cn=Oky$1@BjNzDE^lJ6;Ydx&qX|i!c$N#(NmwtWX1MQG2%A zp6^H9_;u`nCsCRD$a)!-sq3f-ev9of!5!~+pw7FYGCKhEl#HmN38chB*;2t`7 zq|E`$z|)wE-=R|1n^KjdQBT2qR3=tqN8F4``2o~cp2RtL1ND0kH`9XVBS|t>+VI69qr97Lu-zL=W52IEd zv*)LT|*hHu{^iEhs zj3!hQiNrI+Y@%`fDx~JeHcs@|ls4;JN_!76mKaCOBz6;%iD^U%QB5=*^Ju8@mk|>P zC((4Yq_KeLLp0{Un8w3|p6N-%Tw*(+V`rSke{9s8Pb?-LC$fmW#B|~@;{S)*gN zO82Wtb@S4?wRh(_2M_fOac8=7-R`>Mt~AG#;-J5(*zfaj^@752b(dZ9VtdnSk}_w7 z!j&bZfntB92J$(}L%|>f%SuWkPQNcu?DYkm)xI#q92p&3bSa8ddCPo3KR0w%pLwk` Vz!$x;eod(Bm;H0Bf6mRse*rI)e!2hv diff --git a/languages/fau-degree-program-output-de_DE.po b/languages/fau-degree-program-output-de_DE.po index 1018f40..a1bd4aa 100644 --- a/languages/fau-degree-program-output-de_DE.po +++ b/languages/fau-degree-program-output-de_DE.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "Project-Id-Version: FAU Degree Program Output 0.0.4\n" "Report-Msgid-Bugs-To: https://github.com/RRZE-Webteam/FAU-Studium-Embed\n" -"POT-Creation-Date: 2024-05-03T11:17:44+00:00\n" -"PO-Revision-Date: 2024-05-03 14:20+0300\n" "Last-Translator: \n" "Language-Team: \n" -"Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2024-05-15T07:58:40+00:00\n" +"PO-Revision-Date: 2024-05-15 11:05+0300\n" +"Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" "X-Domain: fau-degree-program-output\n" @@ -39,52 +39,52 @@ msgctxt "backoffice: block editor category" msgid "FAU" msgstr "FAU" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:56 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:52 msgctxt "backoffice: Sort by options" msgid "Sort by title" msgstr "Nach Titel sortieren" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:61 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:57 msgctxt "backoffice: Sort by options" msgid "Sort by title Z-A" msgstr "Nach Titel sortieren Z-A" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:68 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:64 msgctxt "backoffice: Sort by options" msgid "Sort by degree" msgstr "Nach Abschluss sortieren" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:73 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:69 msgctxt "backoffice: Sort by options" msgid "Sort by degree Z-A" msgstr "Nach Abschluss sortieren Z-A" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:80 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:76 msgctxt "backoffice: Sort by options" msgid "Sort by semester" msgstr "Nach Semester sortieren" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:85 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:81 msgctxt "backoffice: Sort by options" msgid "Sort by semester Z-A" msgstr "Nach Semester sortieren Z-A" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:92 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:88 msgctxt "backoffice: Sort by options" msgid "Sort by study location" msgstr "Nach Studienort sortieren" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:97 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:93 msgctxt "backoffice: Sort by options" msgid "Sort by study location Z-A" msgstr "Nach Studienort sortieren Z-A" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:104 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:100 msgctxt "backoffice: Sort by options" msgid "Sort by admission requirement" msgstr "Nach Zugangsvoraussetzung sortieren" -#: src/Infrastructure/Component/DegreeProgramsCollection.php:109 +#: src/Infrastructure/Component/DegreeProgramsCollection.php:105 msgctxt "backoffice: Sort by options" msgid "Sort by admission requirement Z-A" msgstr "Nach Zugangsvoraussetzung sortieren Z-A" @@ -286,18 +286,12 @@ msgid "Language skills" msgstr "Sprachkenntnisse" #: src/Infrastructure/Component/SingleDegreeProgram.php:268 -msgid "" -"Language skills for Faculty of Humanities, Social Sciences, and Theology only" -msgstr "" -"Sprachkenntnisse nur für die Philosophische Fakultät und Fachbereich " -"Theologie" +msgid "Language skills for Faculty of Humanities, Social Sciences, and Theology only" +msgstr "Sprachkenntnisse nur für die Philosophische Fakultät und Fachbereich Theologie" #: src/Infrastructure/Component/SingleDegreeProgram.php:272 -msgid "" -"Language certificates/German language skills for international applicants" -msgstr "" -"Sprachnachweise/Deutschkenntnisse für internationale Bewerberinnen und " -"Bewerber" +msgid "Language certificates/German language skills for international applicants" +msgstr "Sprachnachweise/Deutschkenntnisse für internationale Bewerberinnen und Bewerber" #: src/Infrastructure/Component/SingleDegreeProgram.php:276 msgid "Degree Program Fees" @@ -482,12 +476,9 @@ msgstr "Typ" #. translators: %s is the orderby value #: templates/search/degree-programs-list.php:38 -#, fuzzy -#| msgctxt "frontoffice: degree programs search result list" -#| msgid "Sort by" msgctxt "frontoffice: degree programs search result list" msgid "Sort by %s" -msgstr "Sortieren nach" +msgstr "Sortieren nach %s" #: templates/search/degree-programs-search-filters.php:48 #: templates/search/filter/search-filters.php:99 @@ -538,18 +529,15 @@ msgid "Display mode" msgstr "Anzeigemodus" #: templates/search/no-results.php:2 +#: assets/ts/frontend.js:1 msgctxt "backoffice: Search results" msgid "No degree programs found" msgstr "Keine Studiengänge gefunden." #: templates/search/search.php:97 msgctxt "frontoffice: degree programs search form" -msgid "" -"The degree program data is being processed. Please try again in a few " -"minutes." -msgstr "" -"Die Studiengangsdaten werden gerade verarbeitet. Bitte versuche es in ein " -"paar Minuten erneut." +msgid "The degree program data is being processed. Please try again in a few minutes." +msgstr "Die Studiengangsdaten werden gerade verarbeitet. Bitte versuche es in ein paar Minuten erneut." #: templates/single-degree-program-short.php:37 #: templates/single-degree-program/details.php:25 @@ -571,9 +559,7 @@ msgstr "Mehr lesen" #: templates/single-degree-program/accordion.php:75 msgctxt "frontoffice: single view" msgid "Degree program combinations & limited degree program combinations" -msgstr "" -"Mögliche Studiengangskombinationen und eingeschränkt mögliche " -"Studiengangskombinationen" +msgstr "Mögliche Studiengangskombinationen und eingeschränkt mögliche Studiengangskombinationen" #: templates/single-degree-program/accordion.php:85 msgctxt "frontoffice: single view" @@ -643,7 +629,6 @@ msgstr "Sprachkenntnisse" #: templates/single-degree-program/back.php:34 #, fuzzy -#| msgid "Start of degree program" msgctxt "frontoffice: single view" msgid "Back to degree programs" msgstr "Studienbeginn" @@ -730,31 +715,14 @@ msgstr "Benötigst du Hilfe oder weitere Informationen?" #: templates/single-degree-program/more-information.php:34 msgctxt "frontoffice: single view" -msgid "" -"Our Student Advice and Career Service (IBZ) is the central point of contact " -"for all questions about studying and starting a degree programme. Our " -"Student Service Centres and subject advisors support you in planning your " -"studies." -msgstr "" -"Unsere Studienberatung ist die zentrale Anlaufstelle für alle Fragen rund " -"ums Studium und den Studieneinstieg. Unsere Studien-Service-Center und " -"Studienfachberaterinnen unterstützen dich bei der Planung deines Studiums." +msgid "Our Student Advice and Career Service (IBZ) is the central point of contact for all questions about studying and starting a degree programme. Our Student Service Centres and subject advisors support you in planning your studies." +msgstr "Unsere Studienberatung ist die zentrale Anlaufstelle für alle Fragen rund ums Studium und den Studieneinstieg. Unsere Studien-Service-Center und Studienfachberaterinnen unterstützen dich bei der Planung deines Studiums." #: templates/single-degree-program/more-information.php:53 msgctxt "frontoffice: single view" msgid "Specific Student Advice" msgstr "Spezifische Studienberatung" -#: assets/ts/gutenberg.js:1 -msgctxt "backoffice: block editor" -msgid "Select degree program" -msgstr "Studiengang wählen" - -#: assets/ts/gutenberg.js:1 -msgctxt "backend: block editor" -msgid "Could not load suggestion list" -msgstr "Vorschlagsliste konnte nicht geladen werden" - #: resources/ts/blocks/degree-program/block.json msgctxt "block title" msgid "Degree program" diff --git a/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json new file mode 100644 index 0000000..b6fd521 --- /dev/null +++ b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-05-15 11:02+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang w\u00e4hlen"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json new file mode 100644 index 0000000..cb86e31 --- /dev/null +++ b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json @@ -0,0 +1 @@ +{"translation-revision-date":"2024-05-15 11:02+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal.mo b/languages/fau-degree-program-output-de_DE_formal.mo index 39c25893da891a00d5a09cd52fb2b8588e1979ab..d5d4b947f42287bc03b6ed4bdf1c7aa5569b9a8f 100644 GIT binary patch delta 2661 zcmZwHX>8O*7{~GHv0GXSJva)uxLew8%dzy|?E&2uC~cL9(8B^TC8TUVMo!JVJjOeqcS1`SeGvscFWHqdynB;6Ag`L=QJMW4mDyBo=3st=hE`gQx!8b;_!Z=5-nPDvdf_8fpcjzcFyEuz{~0yW zEv&|W(1n#msV!K98vkijfG?o7C~}a7A{xdjyoiOEPPj^885ZG2EX4t=#0$6plbKyx zSc`LUBhJCY=-_z_;sdO}0BM?u?HFKwbAUz-7e=rSAEAn9F&nN3ccK@MqPFUDN$l(Z&l#xm?fWncs~ z;jh+gmR&=?78m2|xD3yswj`Shl})HEIDm`r6e^SdqPECOIwMN?G8&q&A6xMpDiGiF z_};EUt>iUSwVy_<3SdI5>zk=D7;WpG(?e&uXM>JwwQ1P7f z#Rt4*&0+)fU@fX@Uqlt#TUdc3sJ*;{)R!qBx-Sw)E0Qepn4`pE%@n>~It67&ET+oZ znjeWDv+Z2aaoU4Aeuq$1`Uz?auG#x;I+^q{k#CF1#S9D}YcLB?#kt113E6)022v*G z2<8D-{_o4zhgKWR~1~u?aOu>8D zgpW~yH!2YVQY86Ml^hVQ!%I zK9fSxgtL(HFqNpSS&e$X8}oGj_tRj}<|J|w%_ZajnA@nm%b;XcM1`n<>rex%LB1ho z2kO0kR1F+Q73X{3w5Xg8&Q$BV=8X3_F@|SK2%_bP^llX z*FUxWv#3mdhdLFb_WC_cr=J{%FCYseN@+0-4OoFnWrMX7*U{gNiu@*OfIm?yO5n^U zq6-!97;6q{%lxS4=AZ(1PF;wcVSRdjz`qTIf>J${A zGV?5|NLQj#zaI1OO>D&>)blPUzQ7{nXKMJT_cuA@Ka<7|E@+SUp^EAlDic3pCf-FI z7dJN*NF}D=63oCxyo_zAOjhx*#%n=6-;K&ZukG)_Z2ALJX{e}N#-dP-vVJpRPg+VHxUd_CR1_ULC*J<%p_dd%a!?2dZ< zGosD@)$1Bp1nM?-gnK%>y8`v$o{o?&=mg6GPI;iDe1$VFR6ajc=FE1SkmIB^H3pvR z*w(q_|DN@gl!Tn%Y^RjxmW8`EYz=Q4qi+84}uIT4FCWD delta 3561 zcmZA3du)?c7{~E527_@cmu<*RN(T(aST_a?hQM$`5m33v9ffTz-JrCi>lkcGMcqIF zK_)18frv_oh6D!T4-7%b2oVS*purGPE*eS9Bwm66LBGHDESbL9)6aQN`@ZL#=REHV z>z97%-1}~pQ8q7#J2b?_QdNr2=Ci|mm@Yn zI*z7)45nfTHIW_Y!VggQIpK&H(}%_xI@;ln)+T(4^Sj8OnMhim#u?Zfccc1`p>B8< zwW21}gyNVzb25XGB${00D^rNd>}>3Tj7sGZ9E?qv zgFV=26C! zsIZ}!iCXCb9F1?|NIZ{)7|*C0a55_OtF1?@zhM>qZVG2S?n7nxCmhZA#>Fy}nuVB) zZ=wb`jU(`H)XKB_#s->eU61+nAH|9I7f!>xM`K&E-r9&0=#M9D{Fwqiv^6CdQL4An z&_I`Q0VX+!@D~BD-UfxtJ^) zH|i;viX_9#w608x#2&M)bm(!~je7j{Bh_inBlj|Q?e~3IMiB|yon^wJVfqo(uT!qU>0iN6-Zs07g1aEA@-&I%pn>|{Y7M(%^%1s!1SRadGgFi z)E>@671J_Qan+$FvIlwDnd7MIE}?4S7gUjULUI~etpjJ5qwW27S;3u$O2rKl9w zp>DVtmD*3NC$NO`tEdT2Apg34Dr!aZuoW&sO?WYC>jL)sFlxf9Q8n;tHu=|pJL%w& zHhVA~8!-p(pi(!0QjMk%^%NANGEs|Na0@Esdr(_>0vF&d)bA&7GcBkXnY*b*UH@4Q z`PU7O(4oCOjf`n-pjMv5Yf<03k$ahZR7xvQTeS`y_&Q$2ov48-c{X*w&8Xk+N3Hy* zJwJ)vIKLR7p<=p;8u$TrMK_hhi!6Gq;ByP13=JYS5?bX1qL5ILB@xUydU*M)u#@Cjx{DOsUrK2C;+C7U_7GP}-XhrCx`& zv?SVU{$TtUXsfuI54JFRs6ezOKB65li|`XVGGj#lPpIY+q8~Ab*hF}U*9p~z-U(}o z@q}t3o_L9vOGMYNLTY(z=0uN8X^YO4wBIHs5|fD8#5Q6oF@s1Zs)*)e5e-%TYGN|s zB$|)bG!_&6iD>?dXgo>inVv!{B;F)+Y>g59$41TPiKWCmB7@jY%p{&A{(tE0S>2-Z zE!xBE`B+TR_)oO>!7|$2TAZiR?n(?KhT8tuQ11-Acq)l>q7^ZXc#3cntBB?!pT^5X z9bsG(%gg<1oPl7K%jqu*EH@1Y5(gz@c>|t2XR$w6vfSzQl!b$#)&;>zzlYz2o&I2v z$5~P7^LZ=6Wx)WKRfHQZI2z+qTF>(Oy(M9%$LkAuz0UGb&=)FN(NNRtablet") { @@ -54,6 +58,7 @@ margin-right: 8px; box-shadow: none !important; padding: 0 !important; + pointer-events: none; } } diff --git a/resources/ts/degree-program-overview/degree-program-overview.ts b/resources/ts/degree-program-overview/degree-program-overview.ts new file mode 100644 index 0000000..2afca49 --- /dev/null +++ b/resources/ts/degree-program-overview/degree-program-overview.ts @@ -0,0 +1,79 @@ +import { _x } from '@wordpress/i18n'; + +import DegreeProgram, { DegreeProgramApiData } from './degree-program'; + +const DEGREE_PROGRAMS_SECTION_SELECTOR = '.c-degree-programs-search'; +const DEGREE_PROGRAMS_OVERVIEW_SELECTOR = '.c-degree-programs-collection'; +const SINGLE_PROGRAM_PREVIEW_SELECTOR = '.c-degree-program-preview'; +const NO_SEARCH_RESULT_SELECTOR = '.c-no-search-results'; + +const degreeProgramsSection = document.querySelector( + DEGREE_PROGRAMS_SECTION_SELECTOR +) as HTMLElement; +const degreeProgramsOverview = degreeProgramsSection?.querySelector( + DEGREE_PROGRAMS_OVERVIEW_SELECTOR +) as HTMLElement; + +export const currentLanguage = + degreeProgramsSection?.getAttribute( 'lang' )?.substring( 0, 2 ) || 'de'; + +const renderPrograms = ( programs: DegreeProgram[] ) => { + const output = programs.map( ( program ) => program.render() ).join( '' ); + degreeProgramsOverview?.insertAdjacentHTML( 'beforeend', output ); +}; + +const renderNoResults = () => { + const output = ` +

+ ${ _x( + 'No degree programs found', + 'backoffice: Search results', + 'fau-degree-program-output' + ) } +

`; + degreeProgramsSection?.insertAdjacentHTML( 'beforeend', output ); +}; + +const showNoResults = () => { + const noResults = degreeProgramsSection?.querySelector( + NO_SEARCH_RESULT_SELECTOR + ) as HTMLElement; + + if ( ! noResults ) { + renderNoResults(); + + return; + } + + noResults.classList.remove( 'hidden' ); +}; + +const hideNoResults = () => { + const noResults = degreeProgramsSection?.querySelector( + NO_SEARCH_RESULT_SELECTOR + ) as HTMLElement; + + if ( ! noResults ) { + return; + } + + noResults.classList.add( 'hidden' ); +}; + +export default ( data: DegreeProgramApiData[] ) => { + degreeProgramsOverview + ?.querySelectorAll( SINGLE_PROGRAM_PREVIEW_SELECTOR ) + ?.forEach( ( element ) => element.remove() ); + + const programs: DegreeProgram[] = data.map( ( programData ) => + DegreeProgram.createDegreeProgram( programData ) + ); + + if ( ! programs.length ) { + showNoResults(); + return; + } + + hideNoResults(); + renderPrograms( programs ); +}; diff --git a/resources/ts/degree-program-overview/degree-program.ts b/resources/ts/degree-program-overview/degree-program.ts new file mode 100644 index 0000000..df6c59b --- /dev/null +++ b/resources/ts/degree-program-overview/degree-program.ts @@ -0,0 +1,133 @@ +import { _x } from '@wordpress/i18n'; + +import settings from '../utils/settings'; + +interface DegreeProgramData { + id: number; + title: string; + degree: { + abbreviation: string; + name: string; + }; + image: string; + url: string; + location: string[]; + semester: string[]; + admissionRequirements: string; +} + +export interface DegreeProgramApiData { + id: number; + title: string; + degree: { + abbreviation: string; + name: string; + }; + link: string; + location: string[]; + start: string[]; + teaser_image: { rendered: string }; + admission_requirement_link: { name: string }; +} + +interface DegreeProgram extends DegreeProgramData {} + +class DegreeProgram { + private constructor( { + id, + image, + url, + title, + degree, + semester, + location, + admissionRequirements, + }: DegreeProgramData ) { + this.id = id; + this.image = image; + this.url = url; + this.title = title; + this.degree = degree; + this.semester = semester; + this.location = location; + this.admissionRequirements = admissionRequirements; + } + + static createDegreeProgram( program: DegreeProgramApiData ): DegreeProgram { + return new DegreeProgram( < DegreeProgramData >{ + id: program.id, + title: program.title, + degree: program.degree, + image: program.teaser_image.rendered || settings.icon_degree, + url: program.link, + location: program.location, + semester: program.start, + admissionRequirements: program.admission_requirement_link?.name, + } ); + } + + render(): string { + return ` +
  • +
    + ${ this.image } +
    +
    + +
    + ${ this.title } (${ + this.degree.abbreviation + }) +
    +
    +
    +
    + + ${ _x( + 'Type', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' + ) }: + + ${ this.degree.name } +
    +
    + + ${ _x( + 'Start', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' + ) }: + + ${ this.semester.join( ', ' ) } +
    +
    + + ${ _x( + 'Location', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' + ) }: + + ${ this.location.join( ', ' ) } +
    +
    + + ${ _x( + 'NC', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' + ) }: + + ${ this.admissionRequirements } +
    +
  • + `; + } +} + +export default DegreeProgram; diff --git a/resources/ts/filters/active-filter-label.ts b/resources/ts/filters/active-filter-label.ts new file mode 100644 index 0000000..784a0ad --- /dev/null +++ b/resources/ts/filters/active-filter-label.ts @@ -0,0 +1,33 @@ +const ACCORDION_ITEM_TITLE_SELECTOR = '.c-accordion-item__title'; +const ADVANCED_FILTER_SELECTOR = '.c-advanced-filter-item'; +const FILTER_DROPDOWN_SELECTOR = '.c-filter-dropdown'; +const FILTER_DROPDOWN_LABEL_SELECTOR = '.c-filter-dropdown__label'; + +const buildActiveFilterLabel = ( + filterControl: HTMLElement, + checkbox: HTMLInputElement +) => { + const labelText = filterControl + .querySelector( 'span' ) + ?.textContent?.trim(); + + let filter = checkbox.closest( ADVANCED_FILTER_SELECTOR ); + let filterLabel; + + if ( filter ) { + filterLabel = filter + .querySelector( ACCORDION_ITEM_TITLE_SELECTOR ) + ?.textContent?.trim(); + + return `${ filterLabel }: ${ labelText }`; + } + + filter = checkbox.closest( FILTER_DROPDOWN_SELECTOR ); + filterLabel = filter + ?.querySelector( FILTER_DROPDOWN_LABEL_SELECTOR ) + ?.textContent?.trim(); + + return `${ filterLabel }: ${ labelText }`; +}; + +export default buildActiveFilterLabel; diff --git a/resources/ts/filters/active-filters.ts b/resources/ts/filters/active-filters.ts new file mode 100644 index 0000000..ba6d892 --- /dev/null +++ b/resources/ts/filters/active-filters.ts @@ -0,0 +1,117 @@ +import { resetRelatedInput } from './filters-handler'; +import settings from '../utils/settings'; +import buildActiveFilterLabel from './active-filter-label'; + +const ACTIVE_FILTERS_SECTION_SELECTOR = '.c-active-search-filters'; +const ACTIVE_FILTERS_LIST_SELECTOR = '.c-active-search-filters__list'; +const ACTIVE_FILTER_CLASS = 'c-active-search-filters__item'; +const ACTIVE_FILTER_SELECTOR = `.${ ACTIVE_FILTER_CLASS }`; + +const activeFiltersSection = document.querySelector< HTMLElement >( + ACTIVE_FILTERS_SECTION_SELECTOR +); +const activeFiltersList = document.querySelector< HTMLElement >( + ACTIVE_FILTERS_LIST_SELECTOR +); + +const activeFilters = (): NodeListOf< HTMLElement > => { + return document.querySelectorAll< HTMLElement >( ACTIVE_FILTER_SELECTOR ); +}; + +const maybeHideFiltersSection = () => { + if ( activeFilters().length !== 0 ) { + return; + } + + activeFiltersSection?.classList.add( 'hidden' ); +}; + +const filterEventListener = ( e: MouseEvent ) => { + e.preventDefault(); + const filter = e.target as HTMLElement; + resetRelatedInput( filter.textContent || '' ); + filter.remove(); + maybeHideFiltersSection(); +}; + +activeFilters().forEach( ( filter ) => { + filter.addEventListener( 'click', filterEventListener ); +} ); + +const addActiveFilter = ( label: string ) => { + const filter = document.createElement( 'a' ); + filter.insertAdjacentHTML( + 'beforeend', + ` + ${ settings.icon_close } + ${ label } + ` + ); + filter.className = ACTIVE_FILTER_CLASS; + filter.addEventListener( 'click', filterEventListener ); + activeFiltersList?.insertAdjacentElement( 'beforeend', filter ); + + activeFiltersSection?.classList.remove( 'hidden' ); +}; + +const removeActiveFilter = ( label: string ) => { + activeFilters().forEach( ( filter ) => { + if ( filter.textContent?.trim() === label ) { + filter.remove(); + } + } ); + + maybeHideFiltersSection(); +}; + +export const toggleActiveFilter = ( + filterControl: HTMLElement, + checkbox: HTMLInputElement +) => { + const label = buildActiveFilterLabel( filterControl, checkbox ); + + if ( checkbox.checked ) { + addActiveFilter( label ); + return; + } + + removeActiveFilter( label ); +}; + +export const toggleSingleActiveFilter = ( key: string, value: string ) => { + let needCreateNewFilter = true; + + activeFilters().forEach( ( filter ) => { + const content = ( filter.textContent?.trim() || '' ) + .split( ':' ) + .map( ( item ) => item.trim() ); + const [ filterKey ] = content; + + if ( filterKey !== key ) { + return; + } + + const [ , filterValue ] = content; + + if ( value !== filterValue ) { + filter.remove(); + maybeHideFiltersSection(); + + return; + } + + needCreateNewFilter = false; + } ); + + if ( value && needCreateNewFilter ) { + addActiveFilter( `${ key }: ${ value }` ); + } +}; + +export const clearActiveFilters = () => { + activeFilters().forEach( ( filter ) => { + resetRelatedInput( filter.textContent || '' ); + filter.remove(); + } ); + maybeHideFiltersSection(); +}; diff --git a/resources/ts/filters/filters-count.ts b/resources/ts/filters/filters-count.ts new file mode 100644 index 0000000..a3f6628 --- /dev/null +++ b/resources/ts/filters/filters-count.ts @@ -0,0 +1,35 @@ +const FILTER_DROPDOWN_SELECTOR = '.c-filter-dropdown'; +const FILTER_DROPDOWN_LABEL_SELECTOR = '.c-filter-dropdown__label'; +const FILTER_COUNT_CLASS = 'c-filter-dropdown__count'; +const FILTER_COUNT_SELECTOR = `.${ FILTER_COUNT_CLASS }`; + +const updateFiltersCount = ( element: HTMLInputElement ) => { + const filter = element.closest< HTMLElement >( FILTER_DROPDOWN_SELECTOR ); + const filterLabel = filter?.querySelector< HTMLElement >( + FILTER_DROPDOWN_LABEL_SELECTOR + ); + + if ( ! filter || ! filterLabel ) { + return; + } + + let count = filter.querySelector< HTMLElement >( FILTER_COUNT_SELECTOR ); + + if ( ! count ) { + count = document.createElement( 'span' ); + count.className = FILTER_COUNT_CLASS; + filterLabel.insertAdjacentElement( 'afterend', count ); + } + + let value = Number( count.textContent?.trim() || '0' ); + value += element.checked ? 1 : -1; + + if ( ! value ) { + count.remove(); + return; + } + + count.textContent = String( value ); +}; + +export default updateFiltersCount; diff --git a/resources/ts/filters/filters-handler.ts b/resources/ts/filters/filters-handler.ts index 3a33c14..3a64608 100644 --- a/resources/ts/filters/filters-handler.ts +++ b/resources/ts/filters/filters-handler.ts @@ -1,18 +1,67 @@ -import submitForm from '../form/form-handler'; import isReducedMotion from '../common/reduced-motion-detection'; +import { clearInput, SEARCH_ACTIVE_FILTER_LABEL } from '../form/input-handler'; +import { toggleActiveFilter } from './active-filters'; +import updateFiltersCount from './filters-count'; +import submitForm from '../form/form-handler'; const FILTER_SELECTOR = '.c-filter-checkbox'; -document.querySelectorAll( FILTER_SELECTOR ).forEach( ( filterControl ) => { - if ( isReducedMotion() ) { +const filters = document.querySelectorAll< HTMLElement >( FILTER_SELECTOR ); + +export const resetRelatedInput = ( label: string ) => { + if ( ! label ) { + return; + } + + const content = label.split( ':' ).map( ( item ) => item.trim() ); + const [ filter ] = content; + + if ( filter === SEARCH_ACTIVE_FILTER_LABEL ) { + clearInput(); + + if ( isReducedMotion() ) { + submitForm(); + } + return; } - const checkboxes = filterControl.querySelectorAll< HTMLInputElement >( + const [ , filterValue ] = content; + + filters.forEach( ( filterControl ) => { + const labelText = filterControl + .querySelector( 'span' ) + ?.textContent?.trim(); + + if ( filterValue !== labelText ) { + return; + } + + const checkbox = filterControl.querySelector< HTMLInputElement >( + 'input[type=checkbox]' + ) as HTMLInputElement; + + checkbox.checked = false; + checkbox.dispatchEvent( new Event( 'change' ) ); + + if ( isReducedMotion() ) { + submitForm(); + } + } ); +}; + +filters.forEach( ( filterControl ) => { + const checkbox = filterControl.querySelector< HTMLInputElement >( 'input[type=checkbox]' ); + checkbox?.addEventListener( 'change', ( e ) => { + toggleActiveFilter( filterControl, checkbox ); + updateFiltersCount( checkbox ); + + if ( isReducedMotion() ) { + return; + } - checkboxes.forEach( ( checkbox ) => { - checkbox.addEventListener( 'change', submitForm ); + submitForm(); } ); } ); diff --git a/resources/ts/filters/filters-reset.ts b/resources/ts/filters/filters-reset.ts new file mode 100644 index 0000000..4cd04b2 --- /dev/null +++ b/resources/ts/filters/filters-reset.ts @@ -0,0 +1,11 @@ +import { form } from '../form/form-handler'; + +const CLEAR_FILTERS_SELECTOR = '.c-active-search-filters__clear-all-button'; + +const clearFilters = form.querySelector< HTMLElement >( + CLEAR_FILTERS_SELECTOR +); +clearFilters?.addEventListener( 'click', ( e ) => { + e.preventDefault(); + form.reset(); +} ); diff --git a/resources/ts/filters/index.ts b/resources/ts/filters/index.ts index a3f2219..6c6c94a 100644 --- a/resources/ts/filters/index.ts +++ b/resources/ts/filters/index.ts @@ -1,4 +1,5 @@ import './filter-dropdown'; import './filters-handler'; import './filters-sticky-container'; +import './filters-reset'; import './sort-selector'; diff --git a/resources/ts/form/form-handler.ts b/resources/ts/form/form-handler.ts index 7599ac5..8f2eefd 100644 --- a/resources/ts/form/form-handler.ts +++ b/resources/ts/form/form-handler.ts @@ -1,7 +1,58 @@ -const FORM_SELECTOR = '.c-degree-programs-search form'; +import updateDegreePrograms, { + currentLanguage, +} from '../degree-program-overview/degree-program-overview'; +import { toggleSearchActiveFilter } from './input-handler'; +import loadData from '../utils/data-fetcher'; +import { DegreeProgramApiData } from '../degree-program-overview/degree-program'; +import { clearActiveFilters } from '../filters/active-filters'; -const form = document.querySelector( FORM_SELECTOR ) as HTMLFormElement; +const DEGREE_PROGRAMS_FORM_SELECTOR = '.c-degree-programs-search form'; -export default () => { - form?.submit(); +export const form = document.querySelector< HTMLElement >( + DEGREE_PROGRAMS_FORM_SELECTOR +) as HTMLFormElement; + +form?.addEventListener( 'reset', () => { + clearActiveFilters(); + sendForm(); +} ); +form?.addEventListener( 'submit', ( e ) => { + e.preventDefault(); + submitForm(); +} ); + +const submitForm = () => { + const formData = new FormData( form ); + sendForm( `?${ new URLSearchParams( formData as any ).toString() }` ); +}; + +let timeout: ReturnType< typeof setTimeout > | null = null; + +const sendForm = ( urlSearchParams: string = '' ) => { + if ( timeout ) { + clearTimeout( timeout ); + } + + timeout = setTimeout( () => { + toggleSearchActiveFilter(); + history.replaceState( + null, + '', + urlSearchParams || window.location.pathname + ); + + try { + loadData( + `/fau/v1/degree-program${ urlSearchParams }`, + currentLanguage + ).then( ( data: DegreeProgramApiData[] ) => { + updateDegreePrograms( data ); + } ); + } catch ( error ) { + updateDegreePrograms( [] ); + } + timeout = null; + }, 50 ); }; + +export default submitForm; diff --git a/resources/ts/form/input-handler.ts b/resources/ts/form/input-handler.ts index a3b0953..b9c3735 100644 --- a/resources/ts/form/input-handler.ts +++ b/resources/ts/form/input-handler.ts @@ -1,13 +1,22 @@ -import submitForm from './form-handler'; +import { _x } from '@wordpress/i18n'; + import isReducedMotion from '../common/reduced-motion-detection'; +import submitForm from './form-handler'; +import { toggleSingleActiveFilter } from '../filters/active-filters'; + +const INPUT_SELECTOR = '.c-degree-programs-sarchform__input'; +export const SEARCH_ACTIVE_FILTER_LABEL = _x( + 'Keyword', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' +); -const init = () => { - const INPUT_SELECTOR = '.c-degree-programs-sarchform__input'; +const input = document.querySelector< HTMLInputElement >( INPUT_SELECTOR ); + +const initLiveSearching = () => { const INPUT_DELAY = 1500; const MIN_CHARACTERS = 3; - const input = document.querySelector( INPUT_SELECTOR ) as HTMLInputElement; - let timeout: ReturnType< typeof setTimeout > | null = null; input?.addEventListener( 'input', () => { @@ -27,5 +36,28 @@ const init = () => { }; if ( ! isReducedMotion() ) { - init(); + initLiveSearching(); } + +input?.addEventListener( 'search', () => { + submitForm(); +} ); + +export const toggleSearchActiveFilter = () => { + if ( ! input ) { + return; + } + + const inputValue = input.value.trim(); + + toggleSingleActiveFilter( SEARCH_ACTIVE_FILTER_LABEL, inputValue ); +}; + +export const clearInput = () => { + if ( ! input ) { + return; + } + + input.value = ''; + input.dispatchEvent( new Event( 'search' ) ); +}; diff --git a/resources/ts/utils/data-fetcher.ts b/resources/ts/utils/data-fetcher.ts new file mode 100644 index 0000000..2a808ca --- /dev/null +++ b/resources/ts/utils/data-fetcher.ts @@ -0,0 +1,32 @@ +import apiFetch from '@wordpress/api-fetch'; +import { addQueryArgs } from '@wordpress/url'; + +const loadData = async ( + url: string, + lang: string, + page: number = 1, + perPage: number = 100 +) => { + const response: any = await apiFetch( { + path: addQueryArgs( url, { + page, + per_page: perPage, + lang, + } ), + parse: false, + } ); + + let data = await response.json(); + + const totalPages = parseInt( + response.headers.get( 'X-WP-TotalPages' ) ?? '1' + ); + + if ( page < totalPages ) { + data = [ ...data, ...( await loadData( url, lang, ++page ) ) ]; + } + + return data; +}; + +export default loadData; diff --git a/resources/ts/utils/settings.ts b/resources/ts/utils/settings.ts new file mode 100644 index 0000000..684f4ef --- /dev/null +++ b/resources/ts/utils/settings.ts @@ -0,0 +1,12 @@ +declare global { + interface Window { + degreeProgramsOverviewSettings: { + icon_close: string; + icon_degree: string; + }; + } +} + +export default { + ...window.degreeProgramsOverviewSettings, +}; diff --git a/src/Infrastructure/Assets/AssetsLoader.php b/src/Infrastructure/Assets/AssetsLoader.php index 5112e0d..3bb0ac2 100644 --- a/src/Infrastructure/Assets/AssetsLoader.php +++ b/src/Infrastructure/Assets/AssetsLoader.php @@ -4,12 +4,16 @@ namespace Fau\DegreeProgram\Output\Infrastructure\Assets; +use Fau\DegreeProgram\Output\Infrastructure\Component\Component; +use Fau\DegreeProgram\Output\Infrastructure\Component\Icon; use Inpsyde\Assets\Asset; use Inpsyde\Assets\AssetManager; use Inpsyde\Assets\Script; use Inpsyde\Assets\Style; use Inpsyde\Modularity\Properties\PluginProperties; +use function Fau\DegreeProgram\Output\renderComponent; + class AssetsLoader { public function __construct( @@ -24,9 +28,16 @@ public function load(AssetManager $assetManager): void 'fau-frontend', (string) $this->pluginProperties->baseUrl() . 'assets/css/frontend.css' ), - new Script( + (new Script( 'fau-frontend', (string) $this->pluginProperties->baseUrl() . 'assets/ts/frontend.js' + ))->prependInlineScript( + 'var degreeProgramsOverviewSettings = ' + . $this->degreeProgramsOverviewSettings() + . ';' + )->withTranslation( + 'fau-degree-program-output', + $this->pluginProperties->basePath() . 'languages' ), new Style( 'fau-editor', @@ -37,4 +48,28 @@ public function load(AssetManager $assetManager): void $assetManager->register(...$frontend); } + + private function degreeProgramsOverviewSettings(): string + { + $settings = json_encode([ + 'icon_degree' => renderComponent( + new Component( + Icon::class, + [ + 'name' => 'degree', + ] + ) + ), + 'icon_close' => renderComponent( + new Component( + Icon::class, + [ + 'name' => 'close', + ] + ) + ), + ]); + + return $settings !== false ? $settings : ''; + } } diff --git a/src/Infrastructure/Component/ActiveFilters.php b/src/Infrastructure/Component/ActiveFilters.php index 283dc4a..3173d4c 100644 --- a/src/Infrastructure/Component/ActiveFilters.php +++ b/src/Infrastructure/Component/ActiveFilters.php @@ -35,10 +35,6 @@ public function render(array $attributes = self::DEFAULT_ATTRIBUTES): string $attributes = wp_parse_args($attributes, self::DEFAULT_ATTRIBUTES); $activeFilterGroups = []; - if (!count($attributes['activeFilters'])) { - return ''; - } - foreach ($attributes['activeFilters'] as $filterView) { if ($filterView->type() === FilterView::TEXT) { $activeFilterGroups[] = [ diff --git a/src/Infrastructure/Component/DegreeProgramsCollection.php b/src/Infrastructure/Component/DegreeProgramsCollection.php index 0e413d9..bcfd448 100644 --- a/src/Infrastructure/Component/DegreeProgramsCollection.php +++ b/src/Infrastructure/Component/DegreeProgramsCollection.php @@ -31,10 +31,6 @@ public function render(array $attributes = []): string /** * @var DegreeProgramsSearchAttributes $attributes */ - if ($attributes['collection']->totalItems() === 0) { - return $this->renderer->render('search/no-results'); - } - return $this->renderer->render( 'search/collection', [ diff --git a/src/Infrastructure/RestApi/RestApiModule.php b/src/Infrastructure/RestApi/RestApiModule.php new file mode 100644 index 0000000..33ceda6 --- /dev/null +++ b/src/Infrastructure/RestApi/RestApiModule.php @@ -0,0 +1,42 @@ + static fn(ContainerInterface $container) => new TranslatedDegreeProgramController( + $container->get(DegreeProgramViewRepository::class), + $container->get(DegreeProgramCollectionRepository::class), + ), + ]; + } + + public function run(ContainerInterface $container): bool + { + $translatedDegreeProgramController = $container->get(TranslatedDegreeProgramController::class); + + add_action( + 'rest_api_init', + static function () use ($translatedDegreeProgramController) { + $translatedDegreeProgramController->register_routes(); + } + ); + + return true; + } +} diff --git a/templates/search/collection.php b/templates/search/collection.php index ded7a14..5b29c7b 100644 --- a/templates/search/collection.php +++ b/templates/search/collection.php @@ -46,3 +46,9 @@ + +totalItems() === 0) : ?> + + render('search/no-results') ?> + + diff --git a/templates/search/filter/active-filters.php b/templates/search/filter/active-filters.php index 8ef9ecf..5e1862f 100644 --- a/templates/search/filter/active-filters.php +++ b/templates/search/filter/active-filters.php @@ -22,9 +22,11 @@ 'removeAllUrl' => $removeAllUrl, ] = $data; +$class = !$activeFilters ? ' hidden' : ''; + ?> -
    +
    + + `; } } From 45f1584abfc531921de84c92ba5a18ae92d5bf6e Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Thu, 16 May 2024 16:14:48 +0300 Subject: [PATCH 04/15] feat: update order links with current search params --- .../degree-program-overview.ts | 11 +++++-- resources/ts/form/form-handler.ts | 3 ++ resources/ts/order/order-updater.ts | 29 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 resources/ts/order/order-updater.ts diff --git a/resources/ts/degree-program-overview/degree-program-overview.ts b/resources/ts/degree-program-overview/degree-program-overview.ts index 7e11b45..d22a397 100644 --- a/resources/ts/degree-program-overview/degree-program-overview.ts +++ b/resources/ts/degree-program-overview/degree-program-overview.ts @@ -13,9 +13,6 @@ const degreeProgramsSection = document.querySelector( const degreeProgramsOverview = degreeProgramsSection?.querySelector( DEGREE_PROGRAMS_OVERVIEW_SELECTOR ) as HTMLElement; -const noResults = degreeProgramsSection?.querySelector( - NO_SEARCH_RESULT_SELECTOR -) as HTMLElement; export const currentLanguage = degreeProgramsSection?.getAttribute( 'lang' )?.substring( 0, 2 ) || 'de'; @@ -38,6 +35,10 @@ const renderNoResults = () => { }; const showNoResults = () => { + const noResults = degreeProgramsSection?.querySelector( + NO_SEARCH_RESULT_SELECTOR + ) as HTMLElement; + if ( ! noResults ) { renderNoResults(); @@ -48,6 +49,10 @@ const showNoResults = () => { }; const hideNoResults = () => { + const noResults = degreeProgramsSection?.querySelector( + NO_SEARCH_RESULT_SELECTOR + ) as HTMLElement; + if ( ! noResults ) { return; } diff --git a/resources/ts/form/form-handler.ts b/resources/ts/form/form-handler.ts index 8f2eefd..f72564b 100644 --- a/resources/ts/form/form-handler.ts +++ b/resources/ts/form/form-handler.ts @@ -5,6 +5,7 @@ import { toggleSearchActiveFilter } from './input-handler'; import loadData from '../utils/data-fetcher'; import { DegreeProgramApiData } from '../degree-program-overview/degree-program'; import { clearActiveFilters } from '../filters/active-filters'; +import updateHeadersUrls from '../order/order-updater'; const DEGREE_PROGRAMS_FORM_SELECTOR = '.c-degree-programs-search form'; @@ -41,6 +42,8 @@ const sendForm = ( urlSearchParams: string = '' ) => { urlSearchParams || window.location.pathname ); + updateHeadersUrls( urlSearchParams ); + try { loadData( `/fau/v1/degree-program${ urlSearchParams }`, diff --git a/resources/ts/order/order-updater.ts b/resources/ts/order/order-updater.ts new file mode 100644 index 0000000..55079e9 --- /dev/null +++ b/resources/ts/order/order-updater.ts @@ -0,0 +1,29 @@ +const DEGREE_PROGRAMS_HEADER_SELECTOR = + 'a.c-degree-programs-collection__header-item'; + +const headers = document.querySelectorAll< HTMLLinkElement >( + DEGREE_PROGRAMS_HEADER_SELECTOR +); + +const updateHeadersUrls = ( urlParams: string ) => { + headers.forEach( ( header ) => { + const formParams = new URLSearchParams( urlParams ); + const [ , params ] = header.href.split( '?' ); + + if ( ! params || ! urlParams ) { + return; + } + const [ path ] = header.href.split( '?' ); + const headerParams = new URLSearchParams( params ); + + headerParams.forEach( ( value, key ) => { + if ( [ 'order', 'order_by' ].includes( key ) ) { + formParams.append( key, value ); + } + } ); + + header.href = `${ path }?${ formParams.toString() }`; + } ); +}; + +export default updateHeadersUrls; From aebe2ba3c5770c3b3daa48660746328d1b037d3b Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Fri, 17 May 2024 13:22:34 +0300 Subject: [PATCH 05/15] feat: support filtering degree programs by German language skills in live search --- ...e_DE-94a0a682fe40fcfda002d6f12990a493.json | 2 +- ...e_DE-a56b7b8716b68171f352ac40372a87d0.json | 2 +- languages/fau-degree-program-output-de_DE.mo | Bin 14973 -> 13688 bytes languages/fau-degree-program-output-de_DE.po | 81 +++-------------- ...rmal-94a0a682fe40fcfda002d6f12990a493.json | 2 +- ...rmal-a56b7b8716b68171f352ac40372a87d0.json | 2 +- .../fau-degree-program-output-de_DE_formal.mo | Bin 14954 -> 13693 bytes .../fau-degree-program-output-de_DE_formal.po | 83 +++--------------- languages/fau-degree-program-output.pot | 7 +- .../degree-program-overview.ts | 7 ++ .../degree-program-overview/degree-program.ts | 18 +++- resources/ts/filters/active-filters.ts | 5 +- resources/ts/filters/filters-count.ts | 2 +- resources/ts/filters/filters-handler.ts | 20 +++++ resources/ts/filters/filters-reset.ts | 3 +- resources/ts/form/form-handler.ts | 7 +- 16 files changed, 88 insertions(+), 153 deletions(-) diff --git a/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json index ee6d305..5bdefea 100644 --- a/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json +++ b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-15 11:05+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang w\u00e4hlen"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-17 13:11+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json index b369ed8..270bede 100644 --- a/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json +++ b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-15 11:05+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-17 13:11+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachnachweise"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE.mo b/languages/fau-degree-program-output-de_DE.mo index 464780b1e7cd0db444508483e06787c9201ad1cf..4432af81b246445324c109ed26b95974554ff227 100644 GIT binary patch delta 2742 zcmYM$4{Xe59LMoT=~e$%RcRIHU#+fJzw1ABhIT5{YPQUpU?FEcmy)(L*Ue(wgvp9* znF}-N%+@8AR7`fmLW&7vnOU}pEc18C2*R=uMnt#wr+t!1_4Pc@{eI7%@Avy0Ps5Lv zMXqG_+h+LlF@N*;+b>={W9}sWZwAe~^mDP>nv-PA82Y8w`It(7E%IZw@M|D`h<@zE zv3LVrn3CM{dBhB)k;cF{%*1jWk2RQuVQU)>puY=;;C|Es-(vz^#vHtk`S`CL&rj){ zzX&TBpMspH4qq(T8 zjYhriMJ+T9pT$~KcH2-XcpoELU^@-%@EcT)uA(*+PvR$|8^__Rs1R(yz}X{tk@~7%0XQSdI^{01HX57wfPRH{f(Ug(|8< z3Pc;O#u2y-mAXyHBW4fkAV+WlUO*khHHbrD(IDcl2+U>Rd0dI=ccEUmiat!w?mcl8 zYJz3x!L6v19Ysav5tgBkyi{WdHP2pD3NBf5s9^Q$A~fEh5yh#PObILGvoU}haR%N* zEl|X96sZtS#GUBJUr-CDQi-KF9Tk~Xs15A0p2JG|-B^W@X~e6R#yV8)&RJ82nV!_l z#%YYNMuqqYDt8xAspvnvcfnd*Kz|)-BbQJ$kjYC^aSG~IyoEZ*CrIie<~JJJK%%?% z#X3}RZ9#?TfbHKyg?uRaQ3___Q*1^RStGNnmfEd9qMqwU6?Z;YNE@1i<+uucy8mC& zpfJrJ_+1}k?jzAQhlw9iGUrj(Vh zV$LGpP3AJDv%a}SgCLm4sH)9j+tQ2Fi>X5D%FM?UT!DP2m^JqE&8UStP#ZaoN%%8X z;w2;qW*A|0VI?X>Gclr_tf4{um^ReJpJM`kg)ib^)XtMRmil?9B5XuGzZ-SZeW>To zTd!j}{fAZ;@#kinY}9iFZsFY2z{VLRab1)5;U{6G?t5Fe%yh9_2#v#-WPhcwkZpUxh{(V%4`|xd| z+meNPE+12{6m^g)RHzrD=39!2@LKCfxQPDO$N~8G-|3xT1Zqcxn2w83CvCzwY{4{a zMQvaMD!1EF&$XitvKv(+ov4j`i~5hs8KfM{T`a*NEH+&CzqY4g%yQI;HlcF10~N9( zn1QEIDY<~k{X<-Uxm*Q3--FlUm`5 zm1R}*i?t6aNQiyrzS1ZAxxj17-Qi|;eK6D#47yjeG>2LOjZt6z(Ae9fF1n)Y3r0l` z6fE@2o#&n25)6bJnwz}UfpF08E_RAby-u0eH*ucN@jH|JPO-Zl%;-&iF;_4Z(wDD_Pu|v*Faj~qD^>NWy+3l2#oV!KNj_P(xF6 Nf@e(ZSozVu{{iDwIv@Z5 delta 3947 zcmZ|ReQ;FO9merv2pirBF$s_avy$*;2y8+kAp!yks3kxIq4Fj!+3RM>W>1t4KWv8w8HmNj4l&5rk%!U4&08q(W9tJJdXYFCF?P~j{Uchdz;JY z%>t~zLX4x1??T=0AZkFzP#yXZ)scQ29E8I$o9CNS8Y*oy4#!61T+@t~V;8E&yHPiI z!TLJt{8Olo{s;TxkErYWQyx925U1mKWOj{%nt~RL>j4oO>fsL5934V+=tHc+AMh%y zU_QoSE2@;;I3ADT6#NdSVOgFrGtfaz>7 z#qcKJ3@k@K&cbf2!?#e2tAGWe2P{PmU<(%G0n}6;MaE!0K@IGCoQ(M+slP@vkCo%b z5UL^%;(UDC?w?0pP|Vd8xCk}!O{nV+U>UxF)9?b;U=0hS8rNez?nm9{3)GYp#p#|J z%dHP#2m2>*Ce9y~F8zJzW&dTIi{md#KOlsv*nXUf?_w?HFnm3D0aoE=R0W?!RqA8Z z0OEP>bkAp^=4u_Pgx#o~9*6z+5J1Q|1Ih@?L+TMc)l4-L#w<3>9kpiI$;y?tub41AnwMY z_&BPx&!SfKJJv6d7a~<}ULZ4qx(~w1s892B)bGDQifq_S$oQ^DTb1mw|O_+u2u@O5_9Y1RKdr*sXB6S~(YfuAiokab0VuAzmkEjto zV|@wvn3g02O4k> z_Qf-(k$;7}appVJ+~;}H54;AMcC!|#y4i|a1Aj+7_&D-Hm=91>l)=TiPd=*jRj9Rg zW1I#bBXcM6%A1{-S~RFBIEk9GbEw6YO&#^1iKrXS!(8;C?$e1{8{1Kf_OGb>eTJI4 zetf6Kt2MT7dNA54B|i;YD6`t(l0~Za5ZX<+pOF0CiV}aMlgVtsq6Dm9V)@0xD+)~ z2Qx5$8b}b;feqMK@BafdbYcQEl85d7UetwuMy-jz*yB&3&P!q*K9B0~o5(lG^xze! z`ZHKlhMIyk);myBy9fL8eDea0Y&?pZyB^dc`5yU1n&PSH3%XDh*@LV{^9*WAK0;mp zC2Ec6bE!%cp(?i!^?LwW2Br%&MNeQ{bAE`1O7?GjA5Y+Le40OHy5SMj1s|bC{*B$g zfSS`mwdqA!jC$}iREb-V4`gauX`01k66qojlTDg`l|~!SG>gdnWF09WD!aB>q?^nq zTZy(+iQ;Xa21!CbyW?i@~=yQj{ zF?TTR^|_;Me!mlq1;QbBFc6I;i?e5B=4UQ(f=*M+?Q{GQ$8p~p3Hu}7)?{7ooUFv@ z0#`w~JrXSsw>y#cfYXsV-|6fKM|_Fn1-UsF|D0G|Fe>lj!3Mm*H|Es3D?OD}<(}&DifVU7O>JdWnP-Z}lL(cT3~lg+ z{B2%8=lGm8^>Y*3N>?SXAG5(#wk#ZpHZ=#m{-_4;xLd-Z5QG9v%`vy%33`1_$lc*Y xAo*(9;*5byVr{;F6Y_JzWYMH88N-&OE@$X5vxqRDZqM07WbEkVKPsN@^AlT)(^3Ec diff --git a/languages/fau-degree-program-output-de_DE.po b/languages/fau-degree-program-output-de_DE.po index efc6895..4c8ba7a 100644 --- a/languages/fau-degree-program-output-de_DE.po +++ b/languages/fau-degree-program-output-de_DE.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "Project-Id-Version: FAU Degree Program Output 0.0.4\n" "Report-Msgid-Bugs-To: https://github.com/RRZE-Webteam/FAU-Studium-Embed\n" -"POT-Creation-Date: 2024-05-15T15:13:22+00:00\n" -"PO-Revision-Date: 2024-05-15 18:24+0300\n" "Last-Translator: \n" "Language-Team: \n" -"Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2024-05-17T10:09:02+00:00\n" +"PO-Revision-Date: 2024-05-17 13:11+0300\n" +"Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" "X-Domain: fau-degree-program-output\n" @@ -296,18 +296,12 @@ msgid "Language skills" msgstr "Sprachkenntnisse" #: src/Infrastructure/Component/SingleDegreeProgram.php:268 -msgid "" -"Language skills for Faculty of Humanities, Social Sciences, and Theology only" -msgstr "" -"Sprachkenntnisse nur für die Philosophische Fakultät und Fachbereich " -"Theologie" +msgid "Language skills for Faculty of Humanities, Social Sciences, and Theology only" +msgstr "Sprachkenntnisse nur für die Philosophische Fakultät und Fachbereich Theologie" #: src/Infrastructure/Component/SingleDegreeProgram.php:272 -msgid "" -"Language certificates/German language skills for international applicants" -msgstr "" -"Sprachnachweise/Deutschkenntnisse für internationale Bewerberinnen und " -"Bewerber" +msgid "Language certificates/German language skills for international applicants" +msgstr "Sprachnachweise/Deutschkenntnisse für internationale Bewerberinnen und Bewerber" #: src/Infrastructure/Component/SingleDegreeProgram.php:276 msgid "Degree Program Fees" @@ -560,19 +554,16 @@ msgctxt "frontoffice: degree programs search result list" msgid "German language skills for international students" msgstr "Deutschkenntnisse für internationale Studierende" -#: templates/search/no-results.php:2 assets/ts/frontend.js:1 +#: templates/search/no-results.php:2 +#: assets/ts/frontend.js:1 msgctxt "backoffice: Search results" msgid "No degree programs found" msgstr "Keine Studiengänge gefunden." #: templates/search/search.php:97 msgctxt "frontoffice: degree programs search form" -msgid "" -"The degree program data is being processed. Please try again in a few " -"minutes." -msgstr "" -"Die Studiengangsdaten werden gerade verarbeitet. Bitte versuche es in ein " -"paar Minuten erneut." +msgid "The degree program data is being processed. Please try again in a few minutes." +msgstr "Die Studiengangsdaten werden gerade verarbeitet. Bitte versuche es in ein paar Minuten erneut." #: templates/single-degree-program-short.php:37 #: templates/single-degree-program/details.php:25 @@ -594,9 +585,7 @@ msgstr "Mehr lesen" #: templates/single-degree-program/accordion.php:75 msgctxt "frontoffice: single view" msgid "Degree program combinations & limited degree program combinations" -msgstr "" -"Mögliche Studiengangskombinationen und eingeschränkt mögliche " -"Studiengangskombinationen" +msgstr "Mögliche Studiengangskombinationen und eingeschränkt mögliche Studiengangskombinationen" #: templates/single-degree-program/accordion.php:85 msgctxt "frontoffice: single view" @@ -752,56 +741,14 @@ msgstr "Benötigst du Hilfe oder weitere Informationen?" #: templates/single-degree-program/more-information.php:34 msgctxt "frontoffice: single view" -msgid "" -"Our Student Advice and Career Service (IBZ) is the central point of contact " -"for all questions about studying and starting a degree programme. Our " -"Student Service Centres and subject advisors support you in planning your " -"studies." -msgstr "" -"Unsere Studienberatung ist die zentrale Anlaufstelle für alle Fragen rund " -"ums Studium und den Studieneinstieg. Unsere Studien-Service-Center und " -"Studienfachberaterinnen unterstützen dich bei der Planung deines Studiums." +msgid "Our Student Advice and Career Service (IBZ) is the central point of contact for all questions about studying and starting a degree programme. Our Student Service Centres and subject advisors support you in planning your studies." +msgstr "Unsere Studienberatung ist die zentrale Anlaufstelle für alle Fragen rund ums Studium und den Studieneinstieg. Unsere Studien-Service-Center und Studienfachberaterinnen unterstützen dich bei der Planung deines Studiums." #: templates/single-degree-program/more-information.php:53 msgctxt "frontoffice: single view" msgid "Specific Student Advice" msgstr "Spezifische Studienberatung" -#: assets/ts/frontend.js:1 -msgctxt "frontoffice: degree-programs-overview" -msgid "Type" -msgstr "Typ" - -#: assets/ts/frontend.js:1 -msgctxt "frontoffice: degree-programs-overview" -msgid "Start" -msgstr "Start" - -#: assets/ts/frontend.js:1 -msgctxt "frontoffice: degree-programs-overview" -msgid "Location" -msgstr "Ort" - -#: assets/ts/frontend.js:1 -msgctxt "frontoffice: degree-programs-overview" -msgid "NC" -msgstr "NC" - -#: assets/ts/frontend.js:1 -msgctxt "frontoffice: degree-programs-overview" -msgid "Keyword" -msgstr "Schlagwort" - -#: assets/ts/gutenberg.js:1 -msgctxt "backoffice: block editor" -msgid "Select degree program" -msgstr "Studiengang" - -#: assets/ts/gutenberg.js:1 -msgctxt "backend: block editor" -msgid "Could not load suggestion list" -msgstr "Vorschlagsliste konnte nicht geladen werden" - #: resources/ts/blocks/degree-program/block.json msgctxt "block title" msgid "Degree program" diff --git a/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json index b6fd521..f38cf80 100644 --- a/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json +++ b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-15 11:02+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang w\u00e4hlen"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-17 13:10+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json index cb86e31..cd67b55 100644 --- a/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json +++ b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-15 11:02+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-17 13:10+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachkenntnisse"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal.mo b/languages/fau-degree-program-output-de_DE_formal.mo index 652940aece1ed4baed9017f17019c9545c4e93f4..b59e7c2451bc3dc821fb34208fb7566a508a4774 100644 GIT binary patch delta 2766 zcmZwJeN5F=9LMn^!Bw6F5fxD2`h+1|x|auqYbp%Lhakv^g}OPyE1?4wZbn1Ab2FFb zdhm`~j>xp-A2!WyS<_L*GIE-&vWF$=+S1h7Rx&GBV($-}t$%XB>zv;`zw_|@e$SoP z{dd*|E+&L`8UDS-?-YK+Bh)kIM&y6S)BKfw3JzJ5ql}qBKi^u1vGlhfKV}zy#^WpK z#e+B#ub=~CqK7{ZnDI2m@?aJw;2fNdOE3}r)*U#Geh(($JE#Rt;b^>o$#@wv@UDHH z5i>G>4i@r!K2FC?=r93e_RyHdgEvqUeTs_2861PxtT%B9{l75|%QFVoNtKSbr|5^6&cBz_(`aTcybg>W0*i@lhK zSFi|ESam+upi;OSbFdfn`3?Jd24TsjzdC{VyJ@_{gIw&xId}^*F`ERtuojDP8UJVS%mLIvj^lm!9qJ&C2^w<$Es(=;6sbm>i+j+EU!xX|r4sY86cw3v)CPL2XR(<65SCzIA@Qo9u@#lOv(}hY zGn|^GxRB=^s1P4VH{?*}PwPZxM#a3Am1sb(|-OOYT^B;jr3y_ zeuc$2fCRy$5>^Kmqf)d81KLR^4eH12Ku!E6j>dPf8jqoN9?h}TpMomFX4Lq-sFNN- zjXP((jB)h;usVo8H``1^jmw-({564>2XZlLBefWb8!-wyP@&$A6R^uZKZqK46gBY) z`}`YJOwN6QZh9+Erd^wq?Q4>9ns)+-rYVAi& zIE43LDkUF{Q>`vk%8G2i1T|kJj>X4uIHJ}LR0IOg(1@b(0cwYR7>hsJ=T~ii5EbH4 ze4FUDB%;P;U<~G?4pM>&^(xeSYfus1Vto}G=)Z>?AYhW*BNNO(?Z|^Fjt108{TPPr zI2Jol8`z1;Z8vJ%KGZ?pLeJWOM;G~NGY!wrfJb)pwhIqN}% z>=TT~)2NgT;B@>4m!p%bpz$536Zar%n4_roe?h(fJL>x+jMaJ7q+tr{n`#;wunrkx zHlsFj7?smrjKh<79=}B`bc8Q@O?V15{xT{8gSJ0}3G`#Q>?*c&)WStL4%cDm^VmX1 zs35U0Jk*`k88YW|(q@ect#n==6Ku(x z7TlY;qM@qBRod#S_cyI?ag{OF>&$iM=DXYlF3;Q=kK5}m^15@g+%()#)m5%#zD-SS z|2Nj@$@6;LS?)Z>RoFdvovVGT%F08xGdmrjeeQ?DLU(f?2#b4ULu-A*6YG2}E&i6K PwzgntL4GJ$@O}8de0D+( delta 3943 zcmZ|ReQ;FO8OQMh3E?F`Ldc73qAVsMNL<*2L@*j&Oh74t#6&bA2y6Csvt-$o-Az)V zVbxMl!D3yYB8W(2bm&ZdS#|8_AJk55(GE^Ubf(MzN@rTJty4R-wi@mCw|ln#*q-6p z&$;K`d+s^UIroN>oC<23vQ&cw5}eKez2{}XTlPQyy<#5|KQW`N3-Gz_6SI)ci?vp5caWj%$BSki1vTPB zs18n8-$7k}4mHrvaXfy5x_>2VH*H8oc5F79- zybkMFj~d*BO65MBg{N>H{u8go+7e@$(LpWcFwVhKsPiNC{QOe#e>DyLrN(&iDAwa? zyaw}_-c{I)9t_}O+=ngrK5BEh*bsWaYSaX_<8(ZZTFSSOIha49CiW%H#nNfyUo%?9 z&T(THm61KT0$;GlBd8mub9WuKqh@{|>i*+ci|^vK_%$xT1#FB)+>EXG462_$qn4y1 z!SGbM-MSwKIX;aGamD4C)IWqij^9LeJnM=~rhGV`n^)s0O((Hd2`GpTDwjj-Q(3>R~J2A5zd>1o4m)EXbNUPLY747UCv>_oaYkD`|N zMbwg=M-8l!9leI%bN3H!1)a&&s9vH>u zLbiwTb1}G)6T69xgo{x6RTdNbh!w;x zLS-%Sc)FHZhJNZwyNB3f+m+oT#7#t!$QCVcU;02-P_82$BkmyXC$tPcBA3XP0V>LZ z%27g_YzLvusB%Mw^zUJQwL~h~r1ueS;t`^hxRv-Gq5YTs`(2AA#7d%@P*G}^5C@4C zVkhxKLQ9q{OR123v&=Ts;KR1Ay|JHIMTCj(6E_o!h&b^mk5VsHyr5pJRg+sP} zC+@NJVw`I0LLZ*3L@N;`ItZ0!qAp#_{MX!8(|;3GUq~DxVm^KzBvcxR*~9}npxl<> zzrP!(-AGgr0b&AiH4!4RB}nBm;wqwz_^wG^8sC)Xb;AB8_g$e#PoLZI2jh`wZcC&; z2P0v3C>V>UrWZEnmgaUjA*Uzq_B(;7W9mzjGBAefxBBo$KQC*$7wDP8F { noResults.classList.add( 'hidden' ); }; +export const toggleLanguageCertificateColumn = ( show: boolean = false ) => { + degreeProgramsOverview.dataset.activeFilters = show + ? LANGUAGE_SKILLS_INPUT + : ''; +}; + export default ( data: DegreeProgramApiData[] ) => { degreeProgramsOverview ?.querySelectorAll( SINGLE_PROGRAM_PREVIEW_SELECTOR ) diff --git a/resources/ts/degree-program-overview/degree-program.ts b/resources/ts/degree-program-overview/degree-program.ts index 2687cf0..9b926c0 100644 --- a/resources/ts/degree-program-overview/degree-program.ts +++ b/resources/ts/degree-program-overview/degree-program.ts @@ -14,6 +14,7 @@ interface DegreeProgramData { location: string[]; semester: string[]; admissionRequirements: string; + germanLanguageSkills: string; } export interface DegreeProgramApiData { @@ -28,6 +29,7 @@ export interface DegreeProgramApiData { start: string[]; teaser_image: { rendered: string }; admission_requirement_link: { name: string }; + german_language_skills_for_international_students: { name: string }; } interface DegreeProgram extends DegreeProgramData {} @@ -42,6 +44,7 @@ class DegreeProgram { semester, location, admissionRequirements, + germanLanguageSkills, }: DegreeProgramData ) { this.id = id; this.image = image; @@ -51,6 +54,7 @@ class DegreeProgram { this.semester = semester; this.location = location; this.admissionRequirements = admissionRequirements; + this.germanLanguageSkills = germanLanguageSkills; } static createDegreeProgram( program: DegreeProgramApiData ): DegreeProgram { @@ -62,7 +66,9 @@ class DegreeProgram { url: program.link, location: program.location, semester: program.start, - admissionRequirements: program.admission_requirement_link?.name, + admissionRequirements: program.admission_requirement_link.name, + germanLanguageSkills: + program.german_language_skills_for_international_students.name, } ); } @@ -125,6 +131,16 @@ class DegreeProgram { ${ this.admissionRequirements }
    +
    + + ${ _x( + 'Language certificates', + 'frontoffice: degree-programs-overview', + 'fau-degree-program-output' + ) }: + + ${ this.germanLanguageSkills } +
    `; } diff --git a/resources/ts/filters/active-filters.ts b/resources/ts/filters/active-filters.ts index ba6d892..3768e30 100644 --- a/resources/ts/filters/active-filters.ts +++ b/resources/ts/filters/active-filters.ts @@ -29,7 +29,7 @@ const maybeHideFiltersSection = () => { const filterEventListener = ( e: MouseEvent ) => { e.preventDefault(); const filter = e.target as HTMLElement; - resetRelatedInput( filter.textContent || '' ); + resetRelatedInput( filter.textContent?.trim() || '' ); filter.remove(); maybeHideFiltersSection(); }; @@ -110,8 +110,7 @@ export const toggleSingleActiveFilter = ( key: string, value: string ) => { export const clearActiveFilters = () => { activeFilters().forEach( ( filter ) => { - resetRelatedInput( filter.textContent || '' ); - filter.remove(); + filter.dispatchEvent( new Event( 'click' ) ); } ); maybeHideFiltersSection(); }; diff --git a/resources/ts/filters/filters-count.ts b/resources/ts/filters/filters-count.ts index a3f6628..b5fb59a 100644 --- a/resources/ts/filters/filters-count.ts +++ b/resources/ts/filters/filters-count.ts @@ -24,7 +24,7 @@ const updateFiltersCount = ( element: HTMLInputElement ) => { let value = Number( count.textContent?.trim() || '0' ); value += element.checked ? 1 : -1; - if ( ! value ) { + if ( value < 1 ) { count.remove(); return; } diff --git a/resources/ts/filters/filters-handler.ts b/resources/ts/filters/filters-handler.ts index 3a64608..75ba10e 100644 --- a/resources/ts/filters/filters-handler.ts +++ b/resources/ts/filters/filters-handler.ts @@ -3,8 +3,11 @@ import { clearInput, SEARCH_ACTIVE_FILTER_LABEL } from '../form/input-handler'; import { toggleActiveFilter } from './active-filters'; import updateFiltersCount from './filters-count'; import submitForm from '../form/form-handler'; +import { toggleLanguageCertificateColumn } from '../degree-program-overview/degree-program-overview'; const FILTER_SELECTOR = '.c-filter-checkbox'; +export const LANGUAGE_SKILLS_INPUT = + 'german-language-skills-for-international-students'; const filters = document.querySelectorAll< HTMLElement >( FILTER_SELECTOR ); @@ -50,14 +53,31 @@ export const resetRelatedInput = ( label: string ) => { } ); }; +let languageCertificateCheckedCheckboxes = 0; + filters.forEach( ( filterControl ) => { const checkbox = filterControl.querySelector< HTMLInputElement >( 'input[type=checkbox]' ); + + if ( + checkbox?.name.startsWith( LANGUAGE_SKILLS_INPUT ) && + checkbox?.checked + ) { + languageCertificateCheckedCheckboxes++; + } + checkbox?.addEventListener( 'change', ( e ) => { toggleActiveFilter( filterControl, checkbox ); updateFiltersCount( checkbox ); + if ( checkbox.name.startsWith( LANGUAGE_SKILLS_INPUT ) ) { + languageCertificateCheckedCheckboxes += checkbox.checked ? 1 : -1; + toggleLanguageCertificateColumn( + languageCertificateCheckedCheckboxes >= 1 + ); + } + if ( isReducedMotion() ) { return; } diff --git a/resources/ts/filters/filters-reset.ts b/resources/ts/filters/filters-reset.ts index 4cd04b2..af63bed 100644 --- a/resources/ts/filters/filters-reset.ts +++ b/resources/ts/filters/filters-reset.ts @@ -1,4 +1,5 @@ import { form } from '../form/form-handler'; +import { clearActiveFilters } from './active-filters'; const CLEAR_FILTERS_SELECTOR = '.c-active-search-filters__clear-all-button'; @@ -7,5 +8,5 @@ const clearFilters = form.querySelector< HTMLElement >( ); clearFilters?.addEventListener( 'click', ( e ) => { e.preventDefault(); - form.reset(); + clearActiveFilters(); } ); diff --git a/resources/ts/form/form-handler.ts b/resources/ts/form/form-handler.ts index f72564b..282a9b0 100644 --- a/resources/ts/form/form-handler.ts +++ b/resources/ts/form/form-handler.ts @@ -4,7 +4,6 @@ import updateDegreePrograms, { import { toggleSearchActiveFilter } from './input-handler'; import loadData from '../utils/data-fetcher'; import { DegreeProgramApiData } from '../degree-program-overview/degree-program'; -import { clearActiveFilters } from '../filters/active-filters'; import updateHeadersUrls from '../order/order-updater'; const DEGREE_PROGRAMS_FORM_SELECTOR = '.c-degree-programs-search form'; @@ -13,10 +12,6 @@ export const form = document.querySelector< HTMLElement >( DEGREE_PROGRAMS_FORM_SELECTOR ) as HTMLFormElement; -form?.addEventListener( 'reset', () => { - clearActiveFilters(); - sendForm(); -} ); form?.addEventListener( 'submit', ( e ) => { e.preventDefault(); submitForm(); @@ -55,7 +50,7 @@ const sendForm = ( urlSearchParams: string = '' ) => { updateDegreePrograms( [] ); } timeout = null; - }, 50 ); + }, 500 ); }; export default submitForm; From f505a0ec29a024052d77603605098b274ef0bb12 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Mon, 20 May 2024 20:24:40 +0300 Subject: [PATCH 06/15] refactor: update translations, implement PR suggestions --- ...e_DE-94a0a682fe40fcfda002d6f12990a493.json | 2 +- ...e_DE-a56b7b8716b68171f352ac40372a87d0.json | 2 +- languages/fau-degree-program-output-de_DE.mo | Bin 13688 -> 13688 bytes languages/fau-degree-program-output-de_DE.po | 5 ++-- ...rmal-94a0a682fe40fcfda002d6f12990a493.json | 2 +- ...rmal-a56b7b8716b68171f352ac40372a87d0.json | 2 +- .../fau-degree-program-output-de_DE_formal.mo | Bin 13693 -> 13693 bytes .../fau-degree-program-output-de_DE_formal.po | 5 ++-- languages/fau-degree-program-output.pot | 8 +++-- .../degree-program-overview.ts | 28 +++++++++++------- resources/ts/filters/filters-handler.ts | 11 ++++--- 11 files changed, 38 insertions(+), 27 deletions(-) diff --git a/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json index 5bdefea..fcb7c4b 100644 --- a/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json +++ b/languages/fau-degree-program-output-de_DE-94a0a682fe40fcfda002d6f12990a493.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-17 13:11+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-20 20:12+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json index 270bede..c2a6bdf 100644 --- a/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json +++ b/languages/fau-degree-program-output-de_DE-a56b7b8716b68171f352ac40372a87d0.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-17 13:11+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachnachweise"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-20 20:12+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachnachweise"],"frontoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE.mo b/languages/fau-degree-program-output-de_DE.mo index 4432af81b246445324c109ed26b95974554ff227..1f7154aa511af3112b208a306803adabda801094 100644 GIT binary patch delta 37 scmey7^&@Kon<}@FL5QK5m8q$fq2**jRYeXX0|g@kD?_8rR;qRa0Nqy!;{X5v delta 37 scmey7^&@Kon<}@Vd5EEbm4T&|fzf0^RYeX%a|J_VD?`K0R;qRa0Nn-&;Q#;t diff --git a/languages/fau-degree-program-output-de_DE.po b/languages/fau-degree-program-output-de_DE.po index 4c8ba7a..8d2304c 100644 --- a/languages/fau-degree-program-output-de_DE.po +++ b/languages/fau-degree-program-output-de_DE.po @@ -7,8 +7,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-17T10:09:02+00:00\n" -"PO-Revision-Date: 2024-05-17 13:11+0300\n" +"POT-Creation-Date: 2024-05-20T16:55:19+00:00\n" +"PO-Revision-Date: 2024-05-20 20:12+0300\n" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" @@ -555,7 +555,6 @@ msgid "German language skills for international students" msgstr "Deutschkenntnisse für internationale Studierende" #: templates/search/no-results.php:2 -#: assets/ts/frontend.js:1 msgctxt "backoffice: Search results" msgid "No degree programs found" msgstr "Keine Studiengänge gefunden." diff --git a/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json index f38cf80..fcb7c4b 100644 --- a/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json +++ b/languages/fau-degree-program-output-de_DE_formal-94a0a682fe40fcfda002d6f12990a493.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-17 13:10+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-20 20:12+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/gutenberg.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: block editor\u0004Select degree program":["Studiengang"],"backend: block editor\u0004Could not load suggestion list":["Vorschlagsliste konnte nicht geladen werden"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json index cd67b55..e1ac4b0 100644 --- a/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json +++ b/languages/fau-degree-program-output-de_DE_formal-a56b7b8716b68171f352ac40372a87d0.json @@ -1 +1 @@ -{"translation-revision-date":"2024-05-17 13:10+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"backoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachkenntnisse"],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file +{"translation-revision-date":"2024-05-20 20:12+0300","generator":"WP-CLI\/2.9.0","source":"assets\/ts\/frontend.js","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","lang":"de_DE","plural-forms":"nplurals=2; plural=(n != 1);"},"frontoffice: degree-programs-overview\u0004Type":["Typ"],"frontoffice: degree-programs-overview\u0004Start":["Start"],"frontoffice: degree-programs-overview\u0004Location":["Ort"],"frontoffice: degree-programs-overview\u0004NC":["NC"],"frontoffice: degree-programs-overview\u0004Language certificates":["Sprachkenntnisse"],"frontoffice: Search results\u0004No degree programs found":["Keine Studieng\u00e4nge gefunden."],"frontoffice: degree-programs-overview\u0004Keyword":["Schlagwort"]}}} \ No newline at end of file diff --git a/languages/fau-degree-program-output-de_DE_formal.mo b/languages/fau-degree-program-output-de_DE_formal.mo index b59e7c2451bc3dc821fb34208fb7566a508a4774..e3892ad1bfa796159f829790fbcd895d5aed7a08 100644 GIT binary patch delta 37 scmeyH^*3t+n<}@FL5QK5m8q$fq2**jRYeXX0|g@kD?_8rR;tbd0N%+7@&Et; delta 37 scmeyH^*3t+n<}@Vd5EEbm4T&|fzf0^RYeX%a|J_VD?@|LR;tbd0N!#5?*IS* diff --git a/languages/fau-degree-program-output-de_DE_formal.po b/languages/fau-degree-program-output-de_DE_formal.po index 1439b18..f2b6710 100644 --- a/languages/fau-degree-program-output-de_DE_formal.po +++ b/languages/fau-degree-program-output-de_DE_formal.po @@ -7,8 +7,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-17T10:09:02+00:00\n" -"PO-Revision-Date: 2024-05-17 13:10+0300\n" +"POT-Creation-Date: 2024-05-20T16:55:19+00:00\n" +"PO-Revision-Date: 2024-05-20 20:12+0300\n" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.2\n" @@ -555,7 +555,6 @@ msgid "German language skills for international students" msgstr "Deutschkenntnisse für internationale Studierende" #: templates/search/no-results.php:2 -#: assets/ts/frontend.js:1 msgctxt "backoffice: Search results" msgid "No degree programs found" msgstr "Keine Studiengänge gefunden." diff --git a/languages/fau-degree-program-output.pot b/languages/fau-degree-program-output.pot index 809e1e0..a9f33d1 100644 --- a/languages/fau-degree-program-output.pot +++ b/languages/fau-degree-program-output.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-17T10:09:02+00:00\n" +"POT-Creation-Date: 2024-05-20T16:55:19+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.9.0\n" "X-Domain: fau-degree-program-output\n" @@ -555,7 +555,6 @@ msgid "German language skills for international students" msgstr "" #: templates/search/no-results.php:2 -#: assets/ts/frontend.js:1 msgctxt "backoffice: Search results" msgid "No degree programs found" msgstr "" @@ -773,6 +772,11 @@ msgctxt "frontoffice: degree-programs-overview" msgid "Language certificates" msgstr "" +#: assets/ts/frontend.js:1 +msgctxt "frontoffice: Search results" +msgid "No degree programs found" +msgstr "" + #: assets/ts/frontend.js:1 msgctxt "frontoffice: degree-programs-overview" msgid "Keyword" diff --git a/resources/ts/degree-program-overview/degree-program-overview.ts b/resources/ts/degree-program-overview/degree-program-overview.ts index 1a0b95a..ea55629 100644 --- a/resources/ts/degree-program-overview/degree-program-overview.ts +++ b/resources/ts/degree-program-overview/degree-program-overview.ts @@ -1,19 +1,19 @@ import { _x } from '@wordpress/i18n'; import DegreeProgram, { DegreeProgramApiData } from './degree-program'; -import { LANGUAGE_SKILLS_INPUT } from '../filters/filters-handler'; const DEGREE_PROGRAMS_SECTION_SELECTOR = '.c-degree-programs-search'; const DEGREE_PROGRAMS_OVERVIEW_SELECTOR = '.c-degree-programs-collection'; const SINGLE_PROGRAM_PREVIEW_SELECTOR = '.c-degree-program-preview'; const NO_SEARCH_RESULT_SELECTOR = '.c-no-search-results'; -const degreeProgramsSection = document.querySelector( +const degreeProgramsSection = document.querySelector< HTMLElement >( DEGREE_PROGRAMS_SECTION_SELECTOR -) as HTMLElement; -const degreeProgramsOverview = degreeProgramsSection?.querySelector( - DEGREE_PROGRAMS_OVERVIEW_SELECTOR -) as HTMLElement; +); +const degreeProgramsOverview = + degreeProgramsSection?.querySelector< HTMLElement >( + DEGREE_PROGRAMS_OVERVIEW_SELECTOR + ); export const currentLanguage = degreeProgramsSection?.getAttribute( 'lang' )?.substring( 0, 2 ) || 'de'; @@ -28,7 +28,7 @@ const renderNoResults = () => {

    ${ _x( 'No degree programs found', - 'backoffice: Search results', + 'frontoffice: Search results', 'fau-degree-program-output' ) }

    `; @@ -61,10 +61,16 @@ const hideNoResults = () => { noResults.classList.add( 'hidden' ); }; -export const toggleLanguageCertificateColumn = ( show: boolean = false ) => { - degreeProgramsOverview.dataset.activeFilters = show - ? LANGUAGE_SKILLS_INPUT - : ''; +export const updateDegreeProgramOverviewDataset = ( + dataset: Record< string, any > +) => { + if ( ! ( degreeProgramsOverview instanceof HTMLElement ) ) { + return; + } + + Object.entries( dataset ).forEach( ( [ property, value ] ) => { + degreeProgramsOverview.dataset[ property ] = value; + } ); }; export default ( data: DegreeProgramApiData[] ) => { diff --git a/resources/ts/filters/filters-handler.ts b/resources/ts/filters/filters-handler.ts index 75ba10e..511ac58 100644 --- a/resources/ts/filters/filters-handler.ts +++ b/resources/ts/filters/filters-handler.ts @@ -3,7 +3,7 @@ import { clearInput, SEARCH_ACTIVE_FILTER_LABEL } from '../form/input-handler'; import { toggleActiveFilter } from './active-filters'; import updateFiltersCount from './filters-count'; import submitForm from '../form/form-handler'; -import { toggleLanguageCertificateColumn } from '../degree-program-overview/degree-program-overview'; +import { updateDegreeProgramOverviewDataset } from '../degree-program-overview/degree-program-overview'; const FILTER_SELECTOR = '.c-filter-checkbox'; export const LANGUAGE_SKILLS_INPUT = @@ -73,9 +73,12 @@ filters.forEach( ( filterControl ) => { if ( checkbox.name.startsWith( LANGUAGE_SKILLS_INPUT ) ) { languageCertificateCheckedCheckboxes += checkbox.checked ? 1 : -1; - toggleLanguageCertificateColumn( - languageCertificateCheckedCheckboxes >= 1 - ); + updateDegreeProgramOverviewDataset( { + activeFilters: + languageCertificateCheckedCheckboxes >= 1 + ? LANGUAGE_SKILLS_INPUT + : '', + } ); } if ( isReducedMotion() ) { From ad03070b2e3eac95e2fc7060a7ff2a4ef9f46cef Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Tue, 21 May 2024 18:05:17 +0300 Subject: [PATCH 07/15] feat: add order parameters to the REST API search request --- resources/ts/form/form-handler.ts | 14 ++++++++++++-- resources/ts/order/order-updater.ts | 5 +++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/resources/ts/form/form-handler.ts b/resources/ts/form/form-handler.ts index 282a9b0..6393e3a 100644 --- a/resources/ts/form/form-handler.ts +++ b/resources/ts/form/form-handler.ts @@ -4,7 +4,7 @@ import updateDegreePrograms, { import { toggleSearchActiveFilter } from './input-handler'; import loadData from '../utils/data-fetcher'; import { DegreeProgramApiData } from '../degree-program-overview/degree-program'; -import updateHeadersUrls from '../order/order-updater'; +import updateHeadersUrls, { ORDER_PARAMS } from '../order/order-updater'; const DEGREE_PROGRAMS_FORM_SELECTOR = '.c-degree-programs-search form'; @@ -19,7 +19,17 @@ form?.addEventListener( 'submit', ( e ) => { const submitForm = () => { const formData = new FormData( form ); - sendForm( `?${ new URLSearchParams( formData as any ).toString() }` ); + const formSearchParams = new URLSearchParams( formData as any ); + + const currentSearchParams = new URLSearchParams( window.location.search ); + ORDER_PARAMS.forEach( ( param ) => { + const value = currentSearchParams.get( param ); + if ( value ) { + formSearchParams.append( param, value ); + } + } ); + + sendForm( `?${ formSearchParams.toString() }` ); }; let timeout: ReturnType< typeof setTimeout > | null = null; diff --git a/resources/ts/order/order-updater.ts b/resources/ts/order/order-updater.ts index 55079e9..476a5dc 100644 --- a/resources/ts/order/order-updater.ts +++ b/resources/ts/order/order-updater.ts @@ -1,5 +1,6 @@ const DEGREE_PROGRAMS_HEADER_SELECTOR = 'a.c-degree-programs-collection__header-item'; +export const ORDER_PARAMS = [ 'order', 'order_by' ]; const headers = document.querySelectorAll< HTMLLinkElement >( DEGREE_PROGRAMS_HEADER_SELECTOR @@ -17,8 +18,8 @@ const updateHeadersUrls = ( urlParams: string ) => { const headerParams = new URLSearchParams( params ); headerParams.forEach( ( value, key ) => { - if ( [ 'order', 'order_by' ].includes( key ) ) { - formParams.append( key, value ); + if ( ORDER_PARAMS.includes( key ) ) { + formParams.set( key, value ); } } ); From 578fad213c3f67464ed5d0dd65c8dfff1ca5eee1 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Tue, 21 May 2024 19:25:08 +0300 Subject: [PATCH 08/15] feat: trigger the search on blur event --- resources/ts/form/input-handler.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/resources/ts/form/input-handler.ts b/resources/ts/form/input-handler.ts index b9c3735..577df2d 100644 --- a/resources/ts/form/input-handler.ts +++ b/resources/ts/form/input-handler.ts @@ -5,6 +5,7 @@ import submitForm from './form-handler'; import { toggleSingleActiveFilter } from '../filters/active-filters'; const INPUT_SELECTOR = '.c-degree-programs-sarchform__input'; +const MIN_CHARACTERS = 3; export const SEARCH_ACTIVE_FILTER_LABEL = _x( 'Keyword', 'frontoffice: degree-programs-overview', @@ -15,7 +16,6 @@ const input = document.querySelector< HTMLInputElement >( INPUT_SELECTOR ); const initLiveSearching = () => { const INPUT_DELAY = 1500; - const MIN_CHARACTERS = 3; let timeout: ReturnType< typeof setTimeout > | null = null; @@ -39,6 +39,15 @@ if ( ! isReducedMotion() ) { initLiveSearching(); } +input?.addEventListener( 'blur', () => { + const inputValue = input.value.trim(); + + if ( inputValue.length > MIN_CHARACTERS ) { + return; + } + + submitForm(); +} ); input?.addEventListener( 'search', () => { submitForm(); } ); From 40b52576e5947245a6a749bc2ed5632303037cc9 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Wed, 22 May 2024 17:55:55 +0300 Subject: [PATCH 09/15] fix: add error handling for null admissionRequirements value in REST API --- resources/ts/degree-program-overview/degree-program.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/ts/degree-program-overview/degree-program.ts b/resources/ts/degree-program-overview/degree-program.ts index 9b926c0..e1e836c 100644 --- a/resources/ts/degree-program-overview/degree-program.ts +++ b/resources/ts/degree-program-overview/degree-program.ts @@ -66,7 +66,7 @@ class DegreeProgram { url: program.link, location: program.location, semester: program.start, - admissionRequirements: program.admission_requirement_link.name, + admissionRequirements: program.admission_requirement_link?.name, germanLanguageSkills: program.german_language_skills_for_international_students.name, } ); @@ -129,7 +129,7 @@ class DegreeProgram { 'fau-degree-program-output' ) }: - ${ this.admissionRequirements } + ${ this.admissionRequirements ? this.admissionRequirements : '' }
    From d57c8bf6677250df715abe67bed4e23f0b2c6a68 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Thu, 23 May 2024 07:33:13 +0300 Subject: [PATCH 10/15] feat: implement loader for degree program overview search --- resources/scss/components/search/_loader.scss | 40 +++++++++++++++++++ resources/scss/frontend.scss | 1 + resources/ts/form/form-handler.ts | 20 ++++++---- resources/ts/form/loader.ts | 31 ++++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 resources/scss/components/search/_loader.scss create mode 100644 resources/ts/form/loader.ts diff --git a/resources/scss/components/search/_loader.scss b/resources/scss/components/search/_loader.scss new file mode 100644 index 0000000..af496fb --- /dev/null +++ b/resources/scss/components/search/_loader.scss @@ -0,0 +1,40 @@ +@use "../../abstracts/config"; + +.loader { + display: flex; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(#fff, 0.8); + justify-content: center; + align-items: center; + z-index: 160; + + &.hidden { + display: none; + } + + &-icon { + border: 14px solid config.color("grey", "muted"); + border-top: 14px solid config.color("branding", "primary"); + border-radius: 50%; + width: 100px; + height: 100px; + margin: auto; + position: relative; + animation: spin 2s linear infinite; + } +} + +@keyframes spin { + + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/resources/scss/frontend.scss b/resources/scss/frontend.scss index 1dc9faf..a1eceaa 100644 --- a/resources/scss/frontend.scss +++ b/resources/scss/frontend.scss @@ -17,6 +17,7 @@ @use "components/search/collection"; @use "components/search/preview-item"; @use "components/search/no-results"; +@use "components/search/loader"; @use "components/search/filters/active-filters"; @use "components/search/filters/search-form-filters"; @use "components/search/filters/filter-checkbox"; diff --git a/resources/ts/form/form-handler.ts b/resources/ts/form/form-handler.ts index 6393e3a..570a774 100644 --- a/resources/ts/form/form-handler.ts +++ b/resources/ts/form/form-handler.ts @@ -5,6 +5,7 @@ import { toggleSearchActiveFilter } from './input-handler'; import loadData from '../utils/data-fetcher'; import { DegreeProgramApiData } from '../degree-program-overview/degree-program'; import updateHeadersUrls, { ORDER_PARAMS } from '../order/order-updater'; +import { startLoader, stopLoader } from './loader'; const DEGREE_PROGRAMS_FORM_SELECTOR = '.c-degree-programs-search form'; @@ -35,6 +36,8 @@ const submitForm = () => { let timeout: ReturnType< typeof setTimeout > | null = null; const sendForm = ( urlSearchParams: string = '' ) => { + startLoader(); + if ( timeout ) { clearTimeout( timeout ); } @@ -49,16 +52,17 @@ const sendForm = ( urlSearchParams: string = '' ) => { updateHeadersUrls( urlSearchParams ); - try { - loadData( - `/fau/v1/degree-program${ urlSearchParams }`, - currentLanguage - ).then( ( data: DegreeProgramApiData[] ) => { + loadData( + `/fau/v1/degree-program${ urlSearchParams }`, + currentLanguage + ) + .then( ( data: DegreeProgramApiData[] ) => { updateDegreePrograms( data ); + } ) + .finally( () => { + stopLoader(); } ); - } catch ( error ) { - updateDegreePrograms( [] ); - } + timeout = null; }, 500 ); }; diff --git a/resources/ts/form/loader.ts b/resources/ts/form/loader.ts new file mode 100644 index 0000000..ebe7e68 --- /dev/null +++ b/resources/ts/form/loader.ts @@ -0,0 +1,31 @@ +const LOADER_SELECTOR = '.loader'; + +let loader = document.querySelector< HTMLElement >( LOADER_SELECTOR ); + +const createLoader = (): HTMLElement => { + const loaderHTML = ` +
    +
    +
    + `; + document.body.insertAdjacentHTML( 'afterbegin', loaderHTML ); + + return document.querySelector< HTMLElement >( + LOADER_SELECTOR + ) as HTMLElement; +}; + +const getLoader = (): HTMLElement => { + if ( ! loader ) { + loader = createLoader(); + } + return loader; +}; + +export const startLoader = () => { + getLoader().classList.remove( 'hidden' ); +}; + +export const stopLoader = () => { + getLoader().classList.add( 'hidden' ); +}; From e5b000a1eecb24352e878573a8fdf16706fa973d Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Thu, 23 May 2024 11:00:40 +0300 Subject: [PATCH 11/15] fix: trigger search only when the input value changes --- resources/ts/form/input-handler.ts | 38 ++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/resources/ts/form/input-handler.ts b/resources/ts/form/input-handler.ts index 577df2d..1eaf7bb 100644 --- a/resources/ts/form/input-handler.ts +++ b/resources/ts/form/input-handler.ts @@ -6,6 +6,7 @@ import { toggleSingleActiveFilter } from '../filters/active-filters'; const INPUT_SELECTOR = '.c-degree-programs-sarchform__input'; const MIN_CHARACTERS = 3; + export const SEARCH_ACTIVE_FILTER_LABEL = _x( 'Keyword', 'frontoffice: degree-programs-overview', @@ -19,12 +20,12 @@ const initLiveSearching = () => { let timeout: ReturnType< typeof setTimeout > | null = null; - input?.addEventListener( 'input', () => { + const handleInput = () => { if ( timeout ) { clearTimeout( timeout ); } - const inputValue = input.value.trim(); + const inputValue = input?.value.trim() || ''; if ( inputValue.length > MIN_CHARACTERS ) { timeout = setTimeout( () => { @@ -32,22 +33,34 @@ const initLiveSearching = () => { timeout = null; }, INPUT_DELAY ); } - } ); + }; + + input?.addEventListener( 'input', handleInput ); }; -if ( ! isReducedMotion() ) { - initLiveSearching(); -} +let valueOnFocusEvent = ''; -input?.addEventListener( 'blur', () => { - const inputValue = input.value.trim(); +const handleFocus = () => { + valueOnFocusEvent = input?.value.trim() || ''; +}; - if ( inputValue.length > MIN_CHARACTERS ) { - return; +const handleBlur = () => { + const inputValue = input?.value.trim() || ''; + + if ( + inputValue.length <= MIN_CHARACTERS && + valueOnFocusEvent !== inputValue + ) { + submitForm(); } +}; - submitForm(); -} ); +if ( ! isReducedMotion() ) { + initLiveSearching(); +} + +input?.addEventListener( 'focus', handleFocus ); +input?.addEventListener( 'blur', handleBlur ); input?.addEventListener( 'search', () => { submitForm(); } ); @@ -58,7 +71,6 @@ export const toggleSearchActiveFilter = () => { } const inputValue = input.value.trim(); - toggleSingleActiveFilter( SEARCH_ACTIVE_FILTER_LABEL, inputValue ); }; From 41dcd94e905acb9b7c4b65fc0b0cec978490dbf3 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhyian Date: Thu, 23 May 2024 14:21:16 +0300 Subject: [PATCH 12/15] refactor: improve active filters template Co-authored-by: Philipp Bammes <8144115+tyrann0us@users.noreply.github.com> --- templates/search/filter/active-filters.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/search/filter/active-filters.php b/templates/search/filter/active-filters.php index 5e1862f..92d6786 100644 --- a/templates/search/filter/active-filters.php +++ b/templates/search/filter/active-filters.php @@ -22,11 +22,11 @@ 'removeAllUrl' => $removeAllUrl, ] = $data; -$class = !$activeFilters ? ' hidden' : ''; +$class = !$activeFilters ? 'hidden' : ''; ?> -
    +