mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
Merge pull request #2395 from alexandrevryghem/themed-component-fixes-main
Fix themed components duplicating themself when switching themes
This commit is contained in:
@@ -29,7 +29,7 @@ export const themeStateSelector = createFeatureSelector<ThemeState>('theme');
|
|||||||
|
|
||||||
export const currentThemeSelector = createSelector(
|
export const currentThemeSelector = createSelector(
|
||||||
themeStateSelector,
|
themeStateSelector,
|
||||||
(state: ThemeState): string => hasValue(state) ? state.currentTheme : undefined
|
(state: ThemeState): string => hasValue(state) ? state.currentTheme : BASE_THEME_NAME,
|
||||||
);
|
);
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
@@ -240,14 +240,7 @@ export class ThemeService {
|
|||||||
if (hasValue(parentThemeName)) {
|
if (hasValue(parentThemeName)) {
|
||||||
// inherit the head tags of the parent theme
|
// inherit the head tags of the parent theme
|
||||||
return this.createHeadTags(parentThemeName);
|
return this.createHeadTags(parentThemeName);
|
||||||
}
|
} else {
|
||||||
const defaultThemeConfig = getDefaultThemeConfig();
|
|
||||||
const defaultThemeName = defaultThemeConfig.name;
|
|
||||||
if (
|
|
||||||
hasNoValue(defaultThemeName) ||
|
|
||||||
themeName === defaultThemeName ||
|
|
||||||
themeName === BASE_THEME_NAME
|
|
||||||
) {
|
|
||||||
// last resort, use fallback favicon.ico
|
// last resort, use fallback favicon.ico
|
||||||
return [
|
return [
|
||||||
this.createHeadTag({
|
this.createHeadTag({
|
||||||
@@ -260,9 +253,6 @@ export class ThemeService {
|
|||||||
})
|
})
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
// inherit the head tags of the default theme
|
|
||||||
return this.createHeadTags(defaultThemeConfig.name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return headTagConfigs.map(this.createHeadTag.bind(this));
|
return headTagConfigs.map(this.createHeadTag.bind(this));
|
||||||
@@ -425,9 +415,10 @@ export class ThemeService {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
private getActionForMatch(newTheme: Theme, currentThemeName: string): SetThemeAction | NoOpAction {
|
private getActionForMatch(newTheme: Theme, currentThemeName: string): SetThemeAction | NoOpAction {
|
||||||
if (hasValue(newTheme) && newTheme.config.name !== currentThemeName) {
|
const newThemeName: string = newTheme?.config.name ?? BASE_THEME_NAME;
|
||||||
|
if (newThemeName !== currentThemeName) {
|
||||||
// If we have a match, and it isn't already the active theme, set it as the new theme
|
// If we have a match, and it isn't already the active theme, set it as the new theme
|
||||||
return new SetThemeAction(newTheme.config.name);
|
return new SetThemeAction(newThemeName);
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, do nothing
|
// Otherwise, do nothing
|
||||||
return new NoOpAction();
|
return new NoOpAction();
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import {
|
import {
|
||||||
|
AfterViewInit,
|
||||||
Component,
|
Component,
|
||||||
ViewChild,
|
ViewChild,
|
||||||
ViewContainerRef,
|
ViewContainerRef,
|
||||||
ComponentRef,
|
ComponentRef,
|
||||||
SimpleChanges,
|
SimpleChanges,
|
||||||
OnInit,
|
|
||||||
OnDestroy,
|
OnDestroy,
|
||||||
ComponentFactoryResolver,
|
ComponentFactoryResolver,
|
||||||
ChangeDetectorRef,
|
ChangeDetectorRef,
|
||||||
@@ -24,7 +24,7 @@ import { BASE_THEME_NAME } from './theme.constants';
|
|||||||
styleUrls: ['./themed.component.scss'],
|
styleUrls: ['./themed.component.scss'],
|
||||||
templateUrl: './themed.component.html',
|
templateUrl: './themed.component.html',
|
||||||
})
|
})
|
||||||
export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges {
|
export abstract class ThemedComponent<T> implements AfterViewInit, OnDestroy, OnChanges {
|
||||||
@ViewChild('vcr', { read: ViewContainerRef }) vcr: ViewContainerRef;
|
@ViewChild('vcr', { read: ViewContainerRef }) vcr: ViewContainerRef;
|
||||||
@ViewChild('content') themedElementContent: ElementRef;
|
@ViewChild('content') themedElementContent: ElementRef;
|
||||||
protected compRef: ComponentRef<T>;
|
protected compRef: ComponentRef<T>;
|
||||||
@@ -74,8 +74,7 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngAfterViewInit(): void {
|
||||||
this.destroyComponentInstance();
|
|
||||||
this.initComponentInstance();
|
this.initComponentInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,8 +95,6 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hasNoValue(this.lazyLoadObs)) {
|
if (hasNoValue(this.lazyLoadObs)) {
|
||||||
this.destroyComponentInstance();
|
|
||||||
|
|
||||||
this.lazyLoadObs = combineLatest([
|
this.lazyLoadObs = combineLatest([
|
||||||
observableOf(changes),
|
observableOf(changes),
|
||||||
this.resolveThemedComponent(this.themeService.getThemeName()).pipe(
|
this.resolveThemedComponent(this.themeService.getThemeName()).pipe(
|
||||||
@@ -120,6 +117,7 @@ export abstract class ThemedComponent<T> implements OnInit, OnDestroy, OnChanges
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.lazyLoadSub = this.lazyLoadObs.subscribe(([simpleChanges, constructor]: [SimpleChanges, GenericConstructor<T>]) => {
|
this.lazyLoadSub = this.lazyLoadObs.subscribe(([simpleChanges, constructor]: [SimpleChanges, GenericConstructor<T>]) => {
|
||||||
|
this.destroyComponentInstance();
|
||||||
const factory = this.resolver.resolveComponentFactory(constructor);
|
const factory = this.resolver.resolveComponentFactory(constructor);
|
||||||
this.compRef = this.vcr.createComponent(factory, undefined, undefined, [this.themedElementContent.nativeElement.childNodes]);
|
this.compRef = this.vcr.createComponent(factory, undefined, undefined, [this.themedElementContent.nativeElement.childNodes]);
|
||||||
if (hasValue(simpleChanges)) {
|
if (hasValue(simpleChanges)) {
|
||||||
|
@@ -5,7 +5,8 @@ import { environment } from '../environments/environment';
|
|||||||
import { hasNoValue } from '../app/shared/empty.util';
|
import { hasNoValue } from '../app/shared/empty.util';
|
||||||
|
|
||||||
import { AppConfig } from './app-config.interface';
|
import { AppConfig } from './app-config.interface';
|
||||||
import { ThemeConfig } from './theme.model';
|
import { ThemeConfig, NamedThemeConfig } from './theme.model';
|
||||||
|
import { BASE_THEME_NAME } from '../app/shared/theme-support/theme.constants';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extend Angular environment with app config.
|
* Extend Angular environment with app config.
|
||||||
@@ -44,7 +45,9 @@ const getDefaultThemeConfig = (): ThemeConfig => {
|
|||||||
hasNoValue(themeConfig.regex) &&
|
hasNoValue(themeConfig.regex) &&
|
||||||
hasNoValue(themeConfig.handle) &&
|
hasNoValue(themeConfig.handle) &&
|
||||||
hasNoValue(themeConfig.uuid)
|
hasNoValue(themeConfig.uuid)
|
||||||
);
|
) ?? {
|
||||||
|
name: BASE_THEME_NAME,
|
||||||
|
} as NamedThemeConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
Reference in New Issue
Block a user