From ffff337abafdca88a594ab8d910af4576f4726df Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Tue, 23 Nov 2021 16:43:53 +0100 Subject: [PATCH 01/27] 85123: Remove favicon --- src/assets/images/favicon.ico | Bin 3262 -> 0 bytes src/index.csr.html | 1 - src/index.html | 1 - 3 files changed, 2 deletions(-) delete mode 100644 src/assets/images/favicon.ico diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico deleted file mode 100644 index c73ad96b2699f44ca88a0e333bc6567c639a8610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3262 zcmeH}p>GsH6vnrK1k;2nf+80XAmKkiRGc_bfk0G1Qc+QHBo!wr7PycV6)P%6RE(%t zQL&<8Ma7a-jA+6L#E6O^sTff)qGAQf@|&C9wOP#NXaLda?sVtvo9}(|y?HyABuo7D zdI|mGq*zXpM@f>r;Kr1^<_`AIQr>mj&!)M%{-FYeRePpBw5pjV;=9&|MNyTd_a0&w z&MBp442>~yi2rd_#aZXpmPK(?mN?_dM5af}K;;Kk?U-^~7ZC*Tle!i{?BzKY!j02( z7X8eat<6n2d5awf=iJU{R8>_WB_XijvppOF0+S6TBkY@6ocRzPe?shL+01z~91=_9 zd0bJJrl93n27ml<+ZQ5&#NJvDc(+#P7flc(9gPm8)LKV0qji?0Ji|5u z)^$yET6BPCTp;409tiLU|5PbJ)|Eh+O0#3|S9K!SF5F;VxnbMgR(eC>HM*&iQ-gq}Dj8zVU-P$I@5%hL(I)76xbHP!|!uZ^Y50Iw-)^I`12aJ@iKI znQGw>*ZBGhpFMx-t@8HRX-YCg(Jaj_79uy*0DUHex29je8PsLdyj5agWTqEi0@<|Q zAr2`ZgfO) DSpace - diff --git a/src/index.html b/src/index.html index 491a2d319c..ddd448f289 100644 --- a/src/index.html +++ b/src/index.html @@ -6,7 +6,6 @@ DSpace - From a5a91d51399a5a197ae4f2d9bf8929bd40c04477 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Tue, 23 Nov 2021 17:03:25 +0100 Subject: [PATCH 02/27] 85123: Add new favicon files --- .../favicons/android-chrome-192x192.png | Bin 0 -> 11844 bytes .../favicons/android-chrome-512x512.png | Bin 0 -> 33567 bytes .../images/favicons/apple-touch-icon.png | Bin 0 -> 2371 bytes .../dspace/assets/images/favicons/favicon.ico | Bin 0 -> 15086 bytes .../dspace/assets/images/favicons/favicon.svg | 7 +++++++ .../images/favicons/manifest.webmanifest | 19 ++++++++++++++++++ 6 files changed, 26 insertions(+) create mode 100644 src/themes/dspace/assets/images/favicons/android-chrome-192x192.png create mode 100644 src/themes/dspace/assets/images/favicons/android-chrome-512x512.png create mode 100644 src/themes/dspace/assets/images/favicons/apple-touch-icon.png create mode 100644 src/themes/dspace/assets/images/favicons/favicon.ico create mode 100644 src/themes/dspace/assets/images/favicons/favicon.svg create mode 100644 src/themes/dspace/assets/images/favicons/manifest.webmanifest diff --git a/src/themes/dspace/assets/images/favicons/android-chrome-192x192.png b/src/themes/dspace/assets/images/favicons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..1aaffb1b90e56ff30d06451586641e3ddaf0fbd6 GIT binary patch literal 11844 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 QUbzK;LY#+JS^3=i2VZyi4FCWD literal 0 HcmV?d00001 diff --git a/src/themes/dspace/assets/images/favicons/favicon.ico b/src/themes/dspace/assets/images/favicons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a5dfd5e3226ca4dd5990a674f5b053afbe1f4d38 GIT binary patch literal 15086 zcmdU$50F(=9mnso$TR=2s3;)Nt|>}tfn!RcvVi8K*jSoY4mn!XXpQ~BY&3QDG0vDx z777`El8nm6X-1m_6U&LUF)PQ)NFhTBBh4fgp=_0v*XMip{$7W(=iYbkdv9U)&3yKE z?(h80@Ao_B-h1x3=Ry>M)#10^{4EEalV8Cs2%Zb{W?NJ)+XMMq zPS2C)#n9@f`(1Huwj)G1AJq7djiv|51F@e1^IG$tvS(7)*l)LGyoF?xtUXjmF20i^^AM`<|?v z>Z!x$c=$<z*AsY}5L-kha6>$up}BK92$2A8B!=*E;62pzAoxE~`%S*{rNw z>aD}?XF$*2toV0Re-zvUMdtwX`#aiBsW;EGcKAF3o&k#!l255UHf?Ywd>phsHs(?O z9NYpAL)x{bbNyi`wDwKQJ;`Yw{M`$oyiK<~%ZFR1+(3O?1)(+HYv|X)^`O4Y@tDo= zXxC@0GWL2muv|m(&00SEdi;%q8zAd?({-ypy7X{-AB^*TrX6Fe^B&5(s!MB|rN?Ip zH1|~fjgS5FY>2$zAiljcpz|n8v?cFn9HDP~=Y@TAw^I6!RzN{a|Swxoge) z(X2V&t;4qI&o6u)0^fkwA#}a#-AQ$tS6#MqthM@KZjM=HY@3olep*0zp9jAHjiaBt z^3&Q*>(#TN6J{i+JPq2i^7ZSmUjlv{_qbPWu+clVa{D}d!9(lG74UmVTeCez-8rzY zpF_RJ_!SMes-6zAyz&0=NBC zjyqt#U_(cV%|)PjW@`XFV}1t5IZdiX^hd%Ipmm?y{soRVg4$jSdhZB+(?-7qYz|A4 zw^f5W1=<}AdG=Xl^EH^@G>?nu(qg*$RoKPf_1*U9^2Rq`kI-hfccYx~S2roX^3eG@ z(fY9$;wy)47^@s|#=jrC5tg$_bYnp0RnNWU4tG-4dN^%gMmdz_2WjUfOUhU3eQ5cZ z#8&t8!7vxJml5*)H2UM9)?R|zZiCaze-TN$li?}wbI@8u_ol7~zb^$xfK z)`8h;eYgfb2{U0joB|r-)I9_0M!@}GeoV&uj9LAljn+^Pcx^QHw^T3Uw^cHJFEq_ zzr7r9hgU#zv*aSE>;9wN{xHtL)`MR{r*XB|J(M+9>bdf6(6|V#uMY69dpoAC1Z%+j znADtn255fyi-Y!1)hGAar1|E{u)q1uD`_(ksqhS#FO!7I*}>$ew)?UHDmp4ejmhN zJXh?6_wb;q{*LtpN%!2;6n0#u zT*4N6wTautK4O3JDc_3Gu9*61pF-Ob9Z=n;h`)fKaDMdV)1W!{JBfV1RdakOd>!t9 z+hGCBfNK9KYn^KMpX5UjKeLcJkADZN*EOR(g~gEeo~Su7-cdoSy{<8})4XbaB!378 zc{=GeKOL$*Aoct`2QGwsQbJvuq4piC)*#r=SPaW*y9dtKe$T zILg2DifPwO_1TI}bL)DDa|rnVAayUp8=$e$v-DE4qdXEGg*a!^n?$d79?k1+pRRH0 z^R!=6PkY)7g9|{gO#8@Yc4$xbiW-9)%`BY<6r}*e~R&H zQnvo;{GDm>T!~)i?{cu`*B>ccJClDxXV=dGls^C$!N=fMcnM@HAM=y4wUvAf{OebG zUBj-Oo~xr^ho{%tCB9yeq5DT;x)AI+r+3z+und;K+16*ux_@ti<)Au^@pPy@^A|D; gme|27vDaIA7J8y+3-nyQJJP8xwvjDu7P5c(KTAbi>Hq)$ literal 0 HcmV?d00001 diff --git a/src/themes/dspace/assets/images/favicons/favicon.svg b/src/themes/dspace/assets/images/favicons/favicon.svg new file mode 100644 index 0000000000..8ea65cb72f --- /dev/null +++ b/src/themes/dspace/assets/images/favicons/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/themes/dspace/assets/images/favicons/manifest.webmanifest b/src/themes/dspace/assets/images/favicons/manifest.webmanifest new file mode 100644 index 0000000000..1784ba2b4c --- /dev/null +++ b/src/themes/dspace/assets/images/favicons/manifest.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "DSpace", + "short_name": "DSpace", + "icons": [ + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#091119", + "background_color": "#091119", + "display": "standalone" +} From 99a2cf926a02a0acdbdac1d60ecb2a4dc99dff7b Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Tue, 23 Nov 2021 19:36:49 +0100 Subject: [PATCH 03/27] 85123: WIP: Support for theme-specific head tags --- src/app/app.component.ts | 62 +++++++++++++++++++++++--- src/config/theme.model.ts | 22 +++++++++ src/environments/environment.common.ts | 34 +++++++++++++- 3 files changed, 111 insertions(+), 7 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 6f06a84144..f138753596 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -31,12 +31,12 @@ import { AuthService } from './core/auth/auth.service'; import { CSSVariableService } from './shared/sass-helper/sass-helper.service'; import { MenuService } from './shared/menu/menu.service'; import { HostWindowService } from './shared/host-window.service'; -import { ThemeConfig } from '../config/theme.model'; +import {HeadTagConfig, ThemeConfig} from '../config/theme.model'; import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; import { environment } from '../environments/environment'; import { models } from './core/core.module'; import { LocaleService } from './core/locale/locale.service'; -import { hasValue, isNotEmpty } from './shared/empty.util'; +import { hasValue, isEmpty, isNotEmpty } from './shared/empty.util'; import { KlaroService } from './shared/cookies/klaro.service'; import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; @@ -115,11 +115,11 @@ export class AppComponent implements OnInit, AfterViewInit { this.isThemeCSSLoading$.next(true); } if (hasValue(themeName)) { - this.setThemeCss(themeName); + this.loadGlobalThemeConfig(themeName); } else if (hasValue(DEFAULT_THEME_CONFIG)) { - this.setThemeCss(DEFAULT_THEME_CONFIG.name); + this.loadGlobalThemeConfig(DEFAULT_THEME_CONFIG.name); } else { - this.setThemeCss(BASE_THEME_NAME); + this.loadGlobalThemeConfig(BASE_THEME_NAME); } }); @@ -233,6 +233,11 @@ export class AppComponent implements OnInit, AfterViewInit { } } + private loadGlobalThemeConfig(themeName: string): void { + this.setThemeCss(themeName); + this.setHeadTags(themeName); + } + /** * Update the theme css file in * @@ -243,7 +248,7 @@ export class AppComponent implements OnInit, AfterViewInit { const head = this.document.getElementsByTagName('head')[0]; // Array.from to ensure we end up with an array, not an HTMLCollection, which would be // automatically updated if we add nodes later - const currentThemeLinks = Array.from(this.document.getElementsByClassName('theme-css')); + const currentThemeLinks = Array.from(head.getElementsByClassName('theme-css')); const link = this.document.createElement('link'); link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); @@ -265,6 +270,51 @@ export class AppComponent implements OnInit, AfterViewInit { head.appendChild(link); } + private setHeadTags(themeName: string): void { + const head = this.document.getElementsByTagName('head')[0]; + + // clear head tags + const currentHeadTags = Array.from(head.getElementsByClassName('theme-head-tag')); + if (isNotEmpty(currentHeadTags)) { + currentHeadTags.forEach((currentHeadTag: any) => currentHeadTag.remove()); + } + + // create new head tags (not yet added to DOM) + const headTagFragment = document.createDocumentFragment(); + this.createHeadTags(themeName) + .forEach(newHeadTag => headTagFragment.appendChild(newHeadTag)); + + // add new head tags to DOM + head.appendChild(headTagFragment); + } + + private createHeadTags(themeName: string): HTMLElement[] { + const themeConfig = this.themeService.getThemeConfigFor(themeName); + const headTagConfigs = themeConfig?.headTags; + + // if the current theme does not have head tags, we inherit the head tags of the parent + if (isEmpty(headTagConfigs)) { + const parentThemeName = themeConfig.extends; + return isNotEmpty(parentThemeName) ? this.createHeadTags(parentThemeName) : []; + } + + return headTagConfigs.map(this.createHeadTag.bind(this)); + } + + private createHeadTag(themeHeadTag: HeadTagConfig): HTMLElement { + const tag = this.document.createElement(themeHeadTag.tagName); + + if (isNotEmpty(themeHeadTag.attributes)) { + Object.entries(themeHeadTag.attributes) + .forEach(([key, value]) => tag.setAttribute(key, value)); + } + + // 'class' attribute should always be 'theme-head-tag' for removal + tag.setAttribute('class', 'theme-head-tag'); + + return tag; + } + private trackIdleModal() { const isIdle$ = this.authService.isUserIdle(); const isAuthenticated$ = this.authService.isAuthenticated(); diff --git a/src/config/theme.model.ts b/src/config/theme.model.ts index 0130b5ffd8..d65118d5d4 100644 --- a/src/config/theme.model.ts +++ b/src/config/theme.model.ts @@ -12,6 +12,28 @@ export interface NamedThemeConfig extends Config { * its ancestor theme(s) will be checked recursively before falling back to the default theme. */ extends?: string; + + /** + * A list of HTML tags that should be added to the HEAD section of the document, whenever this theme is active. + */ + headTags?: HeadTagConfig[]; +} + +/** + * Interface that represents a single theme-specific HTML tag in the HEAD section of the page. + */ +export interface HeadTagConfig extends Config { + /** + * The name of the HTML tag + */ + tagName: string; + + /** + * The attributes on the HTML tag + */ + attributes?: { + [key: string]: string; + }; } export interface RegExThemeConfig extends NamedThemeConfig { diff --git a/src/environments/environment.common.ts b/src/environments/environment.common.ts index b1cbd699a3..b8b7c31092 100644 --- a/src/environments/environment.common.ts +++ b/src/environments/environment.common.ts @@ -292,7 +292,39 @@ export const environment: GlobalConfig = { { // The default dspace theme - name: 'dspace' + name: 'dspace', + headTags: [ + { + tagName: 'link', + attributes: { + 'rel': 'icon', + 'href': 'assets/dspace/images/favicons/favicon.ico', + 'sizes': 'any', + } + }, + { + tagName: 'link', + attributes: { + 'rel': 'icon', + 'href': 'assets/dspace/images/favicons/favicon.svg', + 'type': 'image/svg+xml', + } + }, + { + tagName: 'link', + attributes: { + 'rel': 'apple-touch-icon', + 'href': 'assets/dspace/images/favicons/apple-touch-icon.png', + } + }, + { + tagName: 'link', + attributes: { + 'rel': 'manifest', + 'href': 'assets/dspace/images/favicons/manifest.webmanifest', + } + }, + ] }, ], // Whether to enable media viewer for image and/or video Bitstreams (i.e. Bitstreams whose MIME type starts with "image" or "video"). From 893a306da066d18064fe9e9ae0b75d1454261d12 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Wed, 24 Nov 2021 12:18:45 +0100 Subject: [PATCH 04/27] 85123: Fallback to favicon of default theme and src/assets/images/favicon.ico --- src/app/app.component.ts | 38 +++++++++++++++++++++++++++------- src/assets/images/favicon.ico | Bin 0 -> 15086 bytes 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 src/assets/images/favicon.ico diff --git a/src/app/app.component.ts b/src/app/app.component.ts index f138753596..9dc2b5a5ab 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -31,7 +31,7 @@ import { AuthService } from './core/auth/auth.service'; import { CSSVariableService } from './shared/sass-helper/sass-helper.service'; import { MenuService } from './shared/menu/menu.service'; import { HostWindowService } from './shared/host-window.service'; -import {HeadTagConfig, ThemeConfig} from '../config/theme.model'; +import { HeadTagConfig, ThemeConfig } from '../config/theme.model'; import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; import { environment } from '../environments/environment'; import { models } from './core/core.module'; @@ -292,20 +292,44 @@ export class AppComponent implements OnInit, AfterViewInit { const themeConfig = this.themeService.getThemeConfigFor(themeName); const headTagConfigs = themeConfig?.headTags; - // if the current theme does not have head tags, we inherit the head tags of the parent if (isEmpty(headTagConfigs)) { const parentThemeName = themeConfig.extends; - return isNotEmpty(parentThemeName) ? this.createHeadTags(parentThemeName) : []; + if (isNotEmpty(parentThemeName)) { + // inherit the head tags of the parent theme + return this.createHeadTags(parentThemeName); + } + + const defaultThemeName = DEFAULT_THEME_CONFIG.name; + if ( + isEmpty(defaultThemeName) || + themeName === defaultThemeName || + themeName === BASE_THEME_NAME + ) { + // last resort, use fallback favicon.ico + return [ + this.createHeadTag({ + 'tagName': 'link', + 'attributes': { + 'rel': 'icon', + 'href': 'assets/images/favicon.ico', + 'sizes': 'any', + } + }) + ]; + } + + // inherit the head tags of the default theme + return this.createHeadTags(DEFAULT_THEME_CONFIG.name); } return headTagConfigs.map(this.createHeadTag.bind(this)); } - private createHeadTag(themeHeadTag: HeadTagConfig): HTMLElement { - const tag = this.document.createElement(themeHeadTag.tagName); + private createHeadTag(headTagConfig: HeadTagConfig): HTMLElement { + const tag = this.document.createElement(headTagConfig.tagName); - if (isNotEmpty(themeHeadTag.attributes)) { - Object.entries(themeHeadTag.attributes) + if (isNotEmpty(headTagConfig.attributes)) { + Object.entries(headTagConfig.attributes) .forEach(([key, value]) => tag.setAttribute(key, value)); } diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a5dfd5e3226ca4dd5990a674f5b053afbe1f4d38 GIT binary patch literal 15086 zcmdU$50F(=9mnso$TR=2s3;)Nt|>}tfn!RcvVi8K*jSoY4mn!XXpQ~BY&3QDG0vDx z777`El8nm6X-1m_6U&LUF)PQ)NFhTBBh4fgp=_0v*XMip{$7W(=iYbkdv9U)&3yKE z?(h80@Ao_B-h1x3=Ry>M)#10^{4EEalV8Cs2%Zb{W?NJ)+XMMq zPS2C)#n9@f`(1Huwj)G1AJq7djiv|51F@e1^IG$tvS(7)*l)LGyoF?xtUXjmF20i^^AM`<|?v z>Z!x$c=$<z*AsY}5L-kha6>$up}BK92$2A8B!=*E;62pzAoxE~`%S*{rNw z>aD}?XF$*2toV0Re-zvUMdtwX`#aiBsW;EGcKAF3o&k#!l255UHf?Ywd>phsHs(?O z9NYpAL)x{bbNyi`wDwKQJ;`Yw{M`$oyiK<~%ZFR1+(3O?1)(+HYv|X)^`O4Y@tDo= zXxC@0GWL2muv|m(&00SEdi;%q8zAd?({-ypy7X{-AB^*TrX6Fe^B&5(s!MB|rN?Ip zH1|~fjgS5FY>2$zAiljcpz|n8v?cFn9HDP~=Y@TAw^I6!RzN{a|Swxoge) z(X2V&t;4qI&o6u)0^fkwA#}a#-AQ$tS6#MqthM@KZjM=HY@3olep*0zp9jAHjiaBt z^3&Q*>(#TN6J{i+JPq2i^7ZSmUjlv{_qbPWu+clVa{D}d!9(lG74UmVTeCez-8rzY zpF_RJ_!SMes-6zAyz&0=NBC zjyqt#U_(cV%|)PjW@`XFV}1t5IZdiX^hd%Ipmm?y{soRVg4$jSdhZB+(?-7qYz|A4 zw^f5W1=<}AdG=Xl^EH^@G>?nu(qg*$RoKPf_1*U9^2Rq`kI-hfccYx~S2roX^3eG@ z(fY9$;wy)47^@s|#=jrC5tg$_bYnp0RnNWU4tG-4dN^%gMmdz_2WjUfOUhU3eQ5cZ z#8&t8!7vxJml5*)H2UM9)?R|zZiCaze-TN$li?}wbI@8u_ol7~zb^$xfK z)`8h;eYgfb2{U0joB|r-)I9_0M!@}GeoV&uj9LAljn+^Pcx^QHw^T3Uw^cHJFEq_ zzr7r9hgU#zv*aSE>;9wN{xHtL)`MR{r*XB|J(M+9>bdf6(6|V#uMY69dpoAC1Z%+j znADtn255fyi-Y!1)hGAar1|E{u)q1uD`_(ksqhS#FO!7I*}>$ew)?UHDmp4ejmhN zJXh?6_wb;q{*LtpN%!2;6n0#u zT*4N6wTautK4O3JDc_3Gu9*61pF-Ob9Z=n;h`)fKaDMdV)1W!{JBfV1RdakOd>!t9 z+hGCBfNK9KYn^KMpX5UjKeLcJkADZN*EOR(g~gEeo~Su7-cdoSy{<8})4XbaB!378 zc{=GeKOL$*Aoct`2QGwsQbJvuq4piC)*#r=SPaW*y9dtKe$T zILg2DifPwO_1TI}bL)DDa|rnVAayUp8=$e$v-DE4qdXEGg*a!^n?$d79?k1+pRRH0 z^R!=6PkY)7g9|{gO#8@Yc4$xbiW-9)%`BY<6r}*e~R&H zQnvo;{GDm>T!~)i?{cu`*B>ccJClDxXV=dGls^C$!N=fMcnM@HAM=y4wUvAf{OebG zUBj-Oo~xr^ho{%tCB9yeq5DT;x)AI+r+3z+und;K+16*ux_@ti<)Au^@pPy@^A|D; gme|27vDaIA7J8y+3-nyQJJP8xwvjDu7P5c(KTAbi>Hq)$ literal 0 HcmV?d00001 From 7c23e2ef8238aa210c93131e62db43af2fa127e2 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Wed, 24 Nov 2021 14:44:38 +0100 Subject: [PATCH 05/27] 85123: Fix tests --- src/app/app.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 9dc2b5a5ab..8b706d1fb6 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -293,7 +293,7 @@ export class AppComponent implements OnInit, AfterViewInit { const headTagConfigs = themeConfig?.headTags; if (isEmpty(headTagConfigs)) { - const parentThemeName = themeConfig.extends; + const parentThemeName = themeConfig?.extends; if (isNotEmpty(parentThemeName)) { // inherit the head tags of the parent theme return this.createHeadTags(parentThemeName); From b6dc7af13ec3a6c1a17db29f8e2888a8e886b1f9 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Wed, 24 Nov 2021 15:13:50 +0100 Subject: [PATCH 06/27] 85123: Fix tests #2 --- src/app/app.component.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8b706d1fb6..e614fd918b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -246,6 +246,10 @@ export class AppComponent implements OnInit, AfterViewInit { */ private setThemeCss(themeName: string): void { const head = this.document.getElementsByTagName('head')[0]; + if (isEmpty(head)) { + return; + } + // Array.from to ensure we end up with an array, not an HTMLCollection, which would be // automatically updated if we add nodes later const currentThemeLinks = Array.from(head.getElementsByClassName('theme-css')); @@ -272,6 +276,9 @@ export class AppComponent implements OnInit, AfterViewInit { private setHeadTags(themeName: string): void { const head = this.document.getElementsByTagName('head')[0]; + if (isEmpty(head)) { + return; + } // clear head tags const currentHeadTags = Array.from(head.getElementsByClassName('theme-head-tag')); From 787358d1b0dd996ba4702e65ef5cc6dbfb5697bf Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Wed, 24 Nov 2021 16:08:26 +0100 Subject: [PATCH 07/27] 85123: Fix tests - 3 --- src/app/app.component.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 3f2dc45ce7..937b71eb5a 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -171,7 +171,8 @@ describe('App component', () => { TestBed.configureTestingModule(getDefaultTestBedConf()); TestBed.overrideProvider(ThemeService, {useValue: getMockThemeService('custom')}); document = TestBed.inject(DOCUMENT); - headSpy = jasmine.createSpyObj('head', ['appendChild']); + headSpy = jasmine.createSpyObj('head', ['appendChild', 'getElementsByClassName']); + headSpy.getElementsByClassName.and.returnValue([]); spyOn(document, 'getElementsByTagName').and.returnValue([headSpy]); fixture = TestBed.createComponent(AppComponent); comp = fixture.componentInstance; From 6df1ee64f27a844aa4a80118d8fb6000fb298406 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 2 Aug 2021 09:18:21 +0200 Subject: [PATCH 08/27] [DSC-184] Fix issue with mydpsace page that hangs forever on error response --- src/app/my-dspace-page/my-dspace-page.component.html | 4 ++-- src/app/my-dspace-page/my-dspace-page.component.ts | 11 +++++------ src/app/shared/error/error.component.html | 6 +++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/app/my-dspace-page/my-dspace-page.component.html b/src/app/my-dspace-page/my-dspace-page.component.html index 4aadb16255..5a15abcc08 100644 --- a/src/app/my-dspace-page/my-dspace-page.component.html +++ b/src/app/my-dspace-page/my-dspace-page.component.html @@ -4,7 +4,7 @@ = new InjectionToken('searchConfigurationService'); @@ -111,8 +111,7 @@ export class MyDSpacePageComponent implements OnInit { constructor(private service: SearchService, private sidebarService: SidebarService, private windowService: HostWindowService, - @Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: MyDSpaceConfigurationService, - private routeService: RouteService) { + @Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: MyDSpaceConfigurationService) { this.isXsOrSm$ = this.windowService.isXsOrSm(); this.service.setServiceOptions(MyDSpaceResponseParsingService, MyDSpaceRequest); } @@ -134,8 +133,8 @@ export class MyDSpacePageComponent implements OnInit { this.searchOptions$ = this.searchConfigService.paginatedSearchOptions; this.sub = this.searchOptions$.pipe( tap(() => this.resultsRD$.next(null)), - switchMap((options: PaginatedSearchOptions) => this.service.search(options).pipe(getFirstSucceededRemoteData()))) - .subscribe((results) => { + switchMap((options: PaginatedSearchOptions) => this.service.search(options).pipe(getFirstCompletedRemoteData()))) + .subscribe((results: RemoteData>) => { this.resultsRD$.next(results); }); diff --git a/src/app/shared/error/error.component.html b/src/app/shared/error/error.component.html index d41760e258..dd75cb4b1b 100644 --- a/src/app/shared/error/error.component.html +++ b/src/app/shared/error/error.component.html @@ -1,3 +1,3 @@ -
- -
+ + {{ message }} + From 7a567a47b9ff7851c645b69b4a0d6627aa80fb5f Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Fri, 26 Nov 2021 11:20:35 +0100 Subject: [PATCH 09/27] [CST-4882] Show error message if the search query fails - Handle error 422 (invalid query) separately --- .../my-dspace-results/my-dspace-results.component.html | 2 +- .../my-dspace-results/my-dspace-results.component.ts | 8 ++++++++ src/app/shared/error/error.component.html | 5 +++-- src/app/shared/error/error.component.spec.ts | 2 +- src/app/shared/error/error.component.ts | 7 +++++++ src/assets/i18n/en.json5 | 2 ++ 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.html b/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.html index 2710285f0d..ad06f97c88 100644 --- a/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.html +++ b/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.html @@ -10,5 +10,5 @@ - +

{{'mydspace.results.no-results' | translate}}

diff --git a/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.ts b/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.ts index 32b6d9c9f7..96395adea2 100644 --- a/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.ts +++ b/src/app/my-dspace-page/my-dspace-results/my-dspace-results.component.ts @@ -58,4 +58,12 @@ export class MyDSpaceResultsComponent { isLoading() { return !this.searchResults || isEmpty(this.searchResults) || this.searchResults.isLoading; } + + showError(searchResults: RemoteData>>): boolean { + return searchResults?.hasFailed && (!searchResults?.errorMessage || searchResults?.statusCode !== 400); + } + + errorMessageLabel(searchResults: RemoteData>>): string { + return (searchResults?.statusCode === 422) ? 'error.invalid-search-query' : 'error.search-results'; + } } diff --git a/src/app/shared/error/error.component.html b/src/app/shared/error/error.component.html index dd75cb4b1b..157c47f2cd 100644 --- a/src/app/shared/error/error.component.html +++ b/src/app/shared/error/error.component.html @@ -1,3 +1,4 @@ - - {{ message }} + + + diff --git a/src/app/shared/error/error.component.spec.ts b/src/app/shared/error/error.component.spec.ts index d3e3e80c07..f8483ac7aa 100644 --- a/src/app/shared/error/error.component.spec.ts +++ b/src/app/shared/error/error.component.spec.ts @@ -36,7 +36,7 @@ describe('ErrorComponent (inline template)', () => { comp = fixture.componentInstance; // ErrorComponent test instance // query for the message