[TLC-249] Larger refactor to field, item components for browse links

This commit is contained in:
Kim Shepherd
2023-01-26 14:47:35 +13:00
parent 2b1b2ef4cb
commit bdda84f884
18 changed files with 139 additions and 177 deletions

View File

@@ -0,0 +1,91 @@
import { EMPTY, Observable, of as observableOf } from 'rxjs';
import { RemoteData } from '../../core/data/remote-data';
import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model';
import { BrowseDefinition } from '../../core/shared/browse-definition.model';
import {
getPaginatedListPayload,
getRemoteDataPayload
} from '../../core/shared/operators';
import { BrowseService } from '../../core/browse/browse.service';
import { distinctUntilChanged, map, startWith } from 'rxjs/operators';
import { isEmpty, isNotEmpty } from '../empty.util';
import { createSuccessfulRemoteDataObject } from '../remote-data.utils';
import { PageInfo } from '../../core/shared/page-info.model';
// This data is in post-serialized form (metadata -> metadataKeys)
export const mockData: BrowseDefinition[] = [
Object.assign(new BrowseDefinition, {
'id' : 'dateissued',
'metadataBrowse' : false,
'dataType' : 'date',
'sortOptions' : EMPTY,
'order' : 'ASC',
'type' : 'browse',
'metadataKeys' : [ 'dc.date.issued' ],
'_links' : EMPTY
}),
Object.assign(new BrowseDefinition, {
'id' : 'author',
'metadataBrowse' : true,
'dataType' : 'text',
'sortOptions' : EMPTY,
'order' : 'ASC',
'type' : 'browse',
'metadataKeys' : [ 'dc.contributor.*', 'dc.creator' ],
'_links' : EMPTY
})
];
export const browseServiceStub = {
getBrowseDefinitions(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
},
}
export const BrowseDefinitionDataServiceStub: any = {
/**
* Get all BrowseDefinitions
*/
findAll(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
},
/**
* Get all BrowseDefinitions with any link configuration
*/
findAllLinked(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
},
/**
* Get the browse URL by providing a list of metadata keys
* @param metadatumKey
* @param linkPath
*/
findByFields(metadataKeys: string[]): Observable<BrowseDefinition> {
let searchKeyArray: string[] = [];
metadataKeys.forEach((metadataKey) => {
searchKeyArray = searchKeyArray.concat(BrowseService.toSearchKeyArray(metadataKey));
});
return this.findAllLinked().pipe(
getRemoteDataPayload(),
getPaginatedListPayload(),
map((browseDefinitions: BrowseDefinition[]) => browseDefinitions
.find((def: BrowseDefinition) => {
const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0);
return isNotEmpty(matchingKeys);
})
),
map((def: BrowseDefinition) => {
if (isEmpty(def) || isEmpty(def.id)) {
//throw new Error(`A browse definition for field ${metadataKey} isn't configured`);
} else {
return def;
}
}),
startWith(undefined),
distinctUntilChanged()
);
}
};