import { NgClass, NgFor, NgIf, } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core'; import { SortDirection, SortOptions, } from '../../core/cache/models/sort-options.model'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { RemoteData } from '../../core/data/remote-data'; import { Context } from '../../core/shared/context.model'; import { ViewMode } from '../../core/shared/view-mode.model'; import { fadeIn } from '../animations/fade'; import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; import { ImportableListItemControlComponent } from '../object-collection/shared/importable-list-item-control/importable-list-item-control.component'; import { ListableObject } from '../object-collection/shared/listable-object.model'; import { ListableObjectComponentLoaderComponent } from '../object-collection/shared/listable-object/listable-object-component-loader.component'; import { SelectableListItemControlComponent } from '../object-collection/shared/selectable-list-item-control/selectable-list-item-control.component'; import { PaginationComponent } from '../pagination/pagination.component'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { BrowserOnlyPipe } from '../utils/browser-only.pipe'; import { SelectableListService } from './selectable-list/selectable-list.service'; import { Community } from '../../core/shared/community.model' import { Collection } from '../../core/shared/collection.model' @Component({ changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.Emulated, selector: 'ds-base-object-list', styleUrls: ['./object-list.component.scss'], templateUrl: './object-list.component.html', animations: [fadeIn], standalone: true, imports: [PaginationComponent, NgIf, NgClass, NgFor, SelectableListItemControlComponent, ImportableListItemControlComponent, ListableObjectComponentLoaderComponent, BrowserOnlyPipe], }) export class ObjectListComponent { /** * The view mode of the this component */ viewMode = ViewMode.ListElement; /** * GI: object type: community, collection or empty */ objecttype = ""; /** * The current pagination configuration */ @Input() config: PaginationComponentOptions; /** * The current sort configuration */ @Input() sortConfig: SortOptions; /** * Whether or not the list elements have a border */ @Input() hasBorder = false; /** * The whether or not the gear is hidden */ @Input() hideGear = false; /** * Whether or not the pager is visible when there is only a single page of results */ @Input() hidePagerWhenSinglePage = true; @Input() selectable = false; @Input() selectionConfig: { repeatable: boolean, listId: string }; /** * The link type of the listable elements */ @Input() linkType: CollectionElementLinkType; /** * The context of the listable elements */ @Input() context: Context; /** * Option for hiding the pagination detail */ @Input() hidePaginationDetail = false; /** * Whether or not to add an import button to the object */ @Input() importable = false; /** * Config used for the import button */ @Input() importConfig: { buttonLabel: string }; /** * Whether or not the pagination should be rendered as simple previous and next buttons instead of the normal pagination */ @Input() showPaginator = true; /** * Whether to show the thumbnail preview */ @Input() showThumbnails; /** * Emit when one of the listed object has changed. */ @Output() contentChange = new EventEmitter<any>(); /** * If showPaginator is set to true, emit when the previous button is clicked */ @Output() prev = new EventEmitter<boolean>(); /** * If showPaginator is set to true, emit when the next button is clicked */ @Output() next = new EventEmitter<boolean>(); /** * The current listable objects */ private _objects: RemoteData<PaginatedList<ListableObject>>; /** * Setter for the objects * @param objects The new objects */ @Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) { this._objects = objects; if (objects.payload.page[0] instanceof Community) { this.objecttype = "community"; } if (objects.payload.page[0] instanceof Collection) { this.objecttype = "collection"; } } /** * Getter to return the current objects */ get objects() { return this._objects; } /** * An event fired when the page is changed. * Event's payload equals to the newly selected page. */ @Output() change: EventEmitter<{ pagination: PaginationComponentOptions, sort: SortOptions }> = new EventEmitter<{ pagination: PaginationComponentOptions, sort: SortOptions }>(); /** * An event fired when the page is changed. * Event's payload equals to the newly selected page. */ @Output() pageChange: EventEmitter<number> = new EventEmitter<number>(); /** * An event fired when the page wsize is changed. * Event's payload equals to the newly selected page size. */ @Output() pageSizeChange: EventEmitter<number> = new EventEmitter<number>(); /** * An event fired when the sort direction is changed. * Event's payload equals to the newly selected sort direction. */ @Output() sortDirectionChange: EventEmitter<SortDirection> = new EventEmitter<SortDirection>(); /** * An event fired when on of the pagination parameters changes */ @Output() paginationChange: EventEmitter<any> = new EventEmitter<any>(); @Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>(); @Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>(); /** * Send an import event to the parent component */ @Output() importObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>(); /** * An event fired when the sort field is changed. * Event's payload equals to the newly selected sort field. */ @Output() sortFieldChange: EventEmitter<string> = new EventEmitter<string>(); constructor(protected selectionService: SelectableListService) { } /** * Emits the current page when it changes * @param event The new page */ onPageChange(event) { this.pageChange.emit(event); } /** * Emits the current page size when it changes * @param event The new page size */ onPageSizeChange(event) { this.pageSizeChange.emit(event); } /** * Emits the current sort direction when it changes * @param event The new sort direction */ onSortDirectionChange(event) { this.sortDirectionChange.emit(event); } /** * Emits the current sort field when it changes * @param event The new sort field */ onSortFieldChange(event) { this.sortFieldChange.emit(event); } /** * Emits the current pagination when it changes * @param event The new pagination */ onPaginationChange(event) { this.paginationChange.emit(event); } /** * Go to the previous page */ goPrev() { this.prev.emit(true); } /** * Go to the next page */ goNext() { this.next.emit(true); } }