add loading indicator to infinite scroll, few style tweaks

This commit is contained in:
Art Lowel
2020-10-30 13:36:39 +01:00
parent 18577f016c
commit 48c7fff930
15 changed files with 52 additions and 19 deletions

View File

@@ -14,4 +14,5 @@ export enum Context {
AdminSearch = 'adminSearch', AdminSearch = 'adminSearch',
AdminWorkflowSearch = 'adminWorkflowSearch', AdminWorkflowSearch = 'adminWorkflowSearch',
SideBarSearchModal = 'sideBarSearchModal', SideBarSearchModal = 'sideBarSearchModal',
SideBarSearchModalCurrent = 'sideBarSearchModalCurrent',
} }

View File

@@ -8,6 +8,7 @@ import { Item } from '../../../../../core/shared/item.model';
import { isNotEmpty } from '../../../../../shared/empty.util'; import { isNotEmpty } from '../../../../../shared/empty.util';
@listableObjectComponent('JournalIssueSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('JournalIssueSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('JournalIssueSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-journal-issue-sidebar-search-list-element', selector: 'ds-journal-issue-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -8,6 +8,7 @@ import { Item } from '../../../../../core/shared/item.model';
import { isNotEmpty } from '../../../../../shared/empty.util'; import { isNotEmpty } from '../../../../../shared/empty.util';
@listableObjectComponent('JournalVolumeSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('JournalVolumeSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('JournalVolumeSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-journal-volume-sidebar-search-list-element', selector: 'ds-journal-volume-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -8,6 +8,7 @@ import { Item } from '../../../../../core/shared/item.model';
import { isNotEmpty } from '../../../../../shared/empty.util'; import { isNotEmpty } from '../../../../../shared/empty.util';
@listableObjectComponent('JournalSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('JournalSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('JournalSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-journal-sidebar-search-list-element', selector: 'ds-journal-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -8,6 +8,7 @@ import { Item } from '../../../../../core/shared/item.model';
import { isNotEmpty } from '../../../../../shared/empty.util'; import { isNotEmpty } from '../../../../../shared/empty.util';
@listableObjectComponent('OrgUnitSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('OrgUnitSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('OrgUnitSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-org-unit-sidebar-search-list-element', selector: 'ds-org-unit-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -11,6 +11,7 @@ import { LinkService } from '../../../../../core/cache/builders/link.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
@listableObjectComponent('PersonSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('PersonSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('PersonSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-person-sidebar-search-list-element', selector: 'ds-person-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -8,6 +8,7 @@ import { Item } from '../../../../../core/shared/item.model';
import { isNotEmpty } from '../../../../../shared/empty.util'; import { isNotEmpty } from '../../../../../shared/empty.util';
@listableObjectComponent('ProjectSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('ProjectSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('ProjectSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-project-sidebar-search-list-element', selector: 'ds-project-sidebar-search-list-element',
templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html' templateUrl: '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html'

View File

@@ -20,11 +20,15 @@
</button> </button>
<button *ngFor="let listEntry of listEntries" <button *ngFor="let listEntry of listEntries"
class="list-group-item list-group-item-action border-0 list-entry" class="list-group-item list-group-item-action border-0 list-entry"
[ngClass]="{'current': listEntry.indexableObject.id === currentDSOId}" [ngClass]="{'bg-primary': listEntry.indexableObject.id === currentDSOId}"
title="{{ listEntry.indexableObject.name }}" title="{{ listEntry.indexableObject.name }}"
(click)="onSelect.emit(listEntry.indexableObject)" #listEntryElement> (click)="onSelect.emit(listEntry.indexableObject)" #listEntryElement>
<ds-listable-object-component-loader [object]="listEntry" [viewMode]="viewMode" <ds-listable-object-component-loader [object]="listEntry" [viewMode]="viewMode"
[linkType]=linkTypes.None [context]="context"></ds-listable-object-component-loader> [linkType]=linkTypes.None [context]="getContext(listEntry.indexableObject.id)"></ds-listable-object-component-loader>
</button>
<button *ngIf="hasNextPage"
class="list-group-item list-group-item-action border-0 list-entry">
<ds-loading [showMessage]="false"></ds-loading>
</button> </button>
</div> </div>
</div> </div>

View File

@@ -1,12 +1,5 @@
.scrollable-menu { .scrollable-menu {
height: auto; height: auto;
max-height: $dso-selector-list-max-height; max-height: min(70vh, 475px);
overflow-x: hidden; overflow-x: hidden;
} }
.current {
background-color: $dso-selector-current-background-color;
&:hover {
background-color: $dso-selector-current-background-hover-color;
}
}

View File

@@ -107,11 +107,6 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
*/ */
linkTypes = CollectionElementLinkType; linkTypes = CollectionElementLinkType;
/**
* This component's context to display listable objects for
*/
context = Context.SideBarSearchModal;
/** /**
* Array to track all subscriptions and unsubscribe them onDestroy * Array to track all subscriptions and unsubscribe them onDestroy
* @type {Array} * @type {Array}
@@ -212,6 +207,17 @@ export class DSOSelectorComponent implements OnInit, OnDestroy {
} }
} }
/**
* Get the context for element with the given id
*/
getContext(id: string) {
if (id === this.currentDSOId) {
return Context.SideBarSearchModalCurrent;
} else {
return Context.SideBarSearchModal;
}
}
/** /**
* Unsubscribe from all subscriptions * Unsubscribe from all subscriptions
*/ */

View File

@@ -7,6 +7,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
import { SidebarSearchListElementComponent } from '../sidebar-search-list-element.component'; import { SidebarSearchListElementComponent } from '../sidebar-search-list-element.component';
@listableObjectComponent(CollectionSearchResult, ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent(CollectionSearchResult, ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent(CollectionSearchResult, ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-collection-sidebar-search-list-element', selector: 'ds-collection-sidebar-search-list-element',
templateUrl: '../sidebar-search-list-element.component.html' templateUrl: '../sidebar-search-list-element.component.html'

View File

@@ -7,6 +7,7 @@ import { CommunitySearchResult } from '../../../object-collection/shared/communi
import { Community } from '../../../../core/shared/community.model'; import { Community } from '../../../../core/shared/community.model';
@listableObjectComponent(CommunitySearchResult, ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent(CommunitySearchResult, ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent(CommunitySearchResult, ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-collection-sidebar-search-list-element', selector: 'ds-collection-sidebar-search-list-element',
templateUrl: '../sidebar-search-list-element.component.html' templateUrl: '../sidebar-search-list-element.component.html'

View File

@@ -7,7 +7,9 @@ import { Item } from '../../../../../core/shared/item.model';
import { SidebarSearchListElementComponent } from '../../sidebar-search-list-element.component'; import { SidebarSearchListElementComponent } from '../../sidebar-search-list-element.component';
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent('PublicationSearchResult', ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@listableObjectComponent(ItemSearchResult, ViewMode.ListElement, Context.SideBarSearchModal) @listableObjectComponent(ItemSearchResult, ViewMode.ListElement, Context.SideBarSearchModal)
@listableObjectComponent(ItemSearchResult, ViewMode.ListElement, Context.SideBarSearchModalCurrent)
@Component({ @Component({
selector: 'ds-publication-sidebar-search-list-element', selector: 'ds-publication-sidebar-search-list-element',
templateUrl: '../../sidebar-search-list-element.component.html' templateUrl: '../../sidebar-search-list-element.component.html'

View File

@@ -1,3 +1,14 @@
<ds-truncatable-part *ngIf="parentTitle$ && parentTitle$ | async" [maxLines]="1"><div class="text-secondary" [innerHTML]="parentTitle$ | async"></div></ds-truncatable-part> <ds-truncatable-part *ngIf="parentTitle$ && parentTitle$ | async" [maxLines]="1">
<ds-truncatable-part *ngIf="title" [maxLines]="1"><div class="text-primary" [innerHTML]="title"></div></ds-truncatable-part> <div [ngClass]="isCurrent() ? 'text-light' : 'text-body'"
<ds-truncatable-part *ngIf="description" [maxLines]="1"><div class="text-secondary" [innerHTML]="description"></div></ds-truncatable-part> [innerHTML]="parentTitle$ | async"></div>
</ds-truncatable-part>
<ds-truncatable-part *ngIf="title" [maxLines]="1">
<div class="font-weight-bold"
[ngClass]="isCurrent() ? 'text-light' : 'text-primary'"
[innerHTML]="title"></div>
</ds-truncatable-part>
<ds-truncatable-part *ngIf="description" [maxLines]="1">
<div class="text-secondary"
[ngClass]="isCurrent() ? 'text-light' : 'text-secondary'"
[innerHTML]="description"></div>
</ds-truncatable-part>

View File

@@ -11,6 +11,7 @@ import { ChildHALResource } from '../../../core/shared/child-hal-resource.model'
import { followLink } from '../../utils/follow-link-config.model'; import { followLink } from '../../utils/follow-link-config.model';
import { RemoteData } from '../../../core/data/remote-data'; import { RemoteData } from '../../../core/data/remote-data';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { Context } from '../../../core/shared/context.model';
@Component({ @Component({
selector: 'ds-sidebar-search-list-element', selector: 'ds-sidebar-search-list-element',
@@ -54,6 +55,13 @@ export class SidebarSearchListElementComponent<T extends SearchResult<K>, K exte
} }
} }
/**
* returns true if this element represents the current dso
*/
isCurrent(): boolean {
return this.context === Context.SideBarSearchModalCurrent;
}
/** /**
* Get the title of the object's parent * Get the title of the object's parent
* Retrieve the parent by using the object's parent link and retrieving its 'dc.title' metadata * Retrieve the parent by using the object's parent link and retrieving its 'dc.title' metadata
@@ -61,7 +69,7 @@ export class SidebarSearchListElementComponent<T extends SearchResult<K>, K exte
getParentTitle(): Observable<string> { getParentTitle(): Observable<string> {
return this.getParent().pipe( return this.getParent().pipe(
map((parentRD: RemoteData<DSpaceObject>) => { map((parentRD: RemoteData<DSpaceObject>) => {
return parentRD ? parentRD.payload.firstMetadataValue('dc.title') : undefined; return hasValue(parentRD) && hasValue(parentRD.payload) ? parentRD.payload.firstMetadataValue('dc.title') : undefined;
}) })
); );
} }