mirror of
https://github.com/clearml/clearml-web
synced 2025-06-26 18:27:02 +00:00
@@ -34,8 +34,6 @@ export const globalFilterChanged = createAction(`${SELECT_MODEL_PREFIX} global f
|
||||
|
||||
export const setCurrentScrollId = createAction(SELECT_MODEL_PREFIX + 'set current scrollId', props<{ scrollId: string }>());
|
||||
|
||||
export const allProjectsModeChanged = createAction(`${SELECT_MODEL_PREFIX} all projects mode changed`, props<{ isAllProjects: boolean }>());
|
||||
|
||||
export const setViewMode = createAction(`${SELECT_MODEL_PREFIX} set view mode`, props<{ viewMode: ModelsViewModesEnum }>());
|
||||
|
||||
export const resetState = createAction(`${SELECT_MODEL_PREFIX} reset state`);
|
||||
export const resetSelectModelState = createAction(`${SELECT_MODEL_PREFIX} reset state`, props<{fullReset: boolean}>());
|
||||
|
||||
@@ -4,14 +4,11 @@
|
||||
<sm-select-model-header
|
||||
[searchActive]="true"
|
||||
[searchValue]="searchValue$ | async"
|
||||
[isAllProjects]="isAllProjects$ | async"
|
||||
[viewMode]="viewMode$ | async"
|
||||
[hideArchiveToggle]="data.hideShowArchived"
|
||||
[hideCreateNewButton]="true"
|
||||
[showAllProjectsToggle]="selectedProject?.id !== '*'"
|
||||
[tableFilters]="tableFilters$ | async"
|
||||
(searchValueChanged)="onSearchValueChanged($event)"
|
||||
(isAllProjectsChanged)="onIsAllProjectsChanged($event)"
|
||||
(clearFilters)="clearFilters()"
|
||||
(isArchivedChanged)="showArchives($event)"
|
||||
></sm-select-model-header>
|
||||
@@ -24,7 +21,8 @@
|
||||
[hideSelectAll]="true"
|
||||
[reorderableColumns]="false"
|
||||
[models]="models$ | async"
|
||||
[tableCols]="tableCols"
|
||||
[tableCols]="tableCols$ | async"
|
||||
[metadataValuesOptions]="metadataColsOptions$ | async"
|
||||
[noMoreModels]="noMoreModels$ | async"
|
||||
[users]="users$ |async"
|
||||
[frameworks]="frameworks$ |async"
|
||||
@@ -48,7 +46,7 @@
|
||||
<button (click)="closeDialog(null)" class="btn btn-outline-neon" data-id ="CancelButton">
|
||||
CANCEL
|
||||
</button>
|
||||
<button type="submit"
|
||||
<button type="submit" *ngIf="data.selectionMode === 'multiple'"
|
||||
(click)="closeDialogMultiple()"
|
||||
class="btn btn-neon yes-button" data-id="ApplyButton">
|
||||
APPLY
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
import {ChangeDetectionStrategy, Component, EventEmitter, Inject, OnDestroy, OnInit, ViewChild} from '@angular/core';
|
||||
import {Store} from '@ngrx/store';
|
||||
import * as actions from './select-model.actions';
|
||||
import {clearTableFilter, setSelectedModels, showArchive} from './select-model.actions';
|
||||
import {
|
||||
selectGlobalFilter, selectIsAllProjectsMode, selectModels, selectNoMoreModels, selectSelectedModels, selectSelectedModelsList, selectTableFilters, selectTableSortFields, selectViewMode
|
||||
selectGlobalFilter, selectModels, selectNoMoreModels, selectSelectedModels, selectSelectedModelsList, selectSelectModelTableFilters, selectTableSortFields, selectViewMode
|
||||
} from './select-model.reducer';
|
||||
import {combineLatest, Observable, Subscription} from 'rxjs';
|
||||
import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
|
||||
import {ConfirmDialogComponent} from '../shared/ui-components/overlay/confirm-dialog/confirm-dialog.component';
|
||||
import {ISmCol, TableSortOrderEnum} from '../shared/ui-components/data/table/table.consts';
|
||||
import {ColHeaderTypeEnum, ISmCol, TableSortOrderEnum} from '../shared/ui-components/data/table/table.consts';
|
||||
import {SelectedModel} from '../models/shared/models.model';
|
||||
import {MODELS_TABLE_COLS, ModelsViewModesEnum} from '../models/models.consts';
|
||||
import {FilterMetadata} from 'primeng/api/filtermetadata';
|
||||
import {selectAllProjectsUsers, selectProjectSystemTags, selectProjectUsers, selectSelectedProject, selectTablesFilterProjectsOptions} from '../core/reducers/projects.reducer';
|
||||
import {selectModelsFrameworks, selectModelsTags} from '../models/reducers';
|
||||
import {selectAllProjectsUsers, selectProjectSystemTags, selectSelectedProject, selectTablesFilterProjectsOptions} from '../core/reducers/projects.reducer';
|
||||
import {selectMetadataColsForProject, selectMetadataColsOptions, selectModelsFrameworks, selectModelsTags, selectModelTableColumns} from '../models/reducers';
|
||||
import {User} from '~/business-logic/model/users/user';
|
||||
import * as modelsActions from '../models/actions/models-view.actions';
|
||||
import {SortMeta} from 'primeng/api';
|
||||
import {ModelsTableComponent} from '@common/models/shared/models-table/models-table.component';
|
||||
import {map, tap} from 'rxjs/operators';
|
||||
import {debounceTime, distinctUntilChanged, map, tap} from 'rxjs/operators';
|
||||
import {Project} from '~/business-logic/model/projects/models';
|
||||
import {getTablesFilterProjectsOptions, resetTablesFilterProjectsOptions, setTablesFilterProjectsOptions} from '@common/core/actions/projects.actions';
|
||||
import {clearTableFilter, setSelectedModels, showArchive} from './select-model.actions';
|
||||
import {unionBy} from 'lodash-es';
|
||||
import {isEqual, unionBy} from 'lodash-es';
|
||||
import {compareLimitations} from '@common/shared/entity-page/footer-items/compare-footer-item';
|
||||
import {addMessage} from '@common/core/actions/layout.actions';
|
||||
import {MESSAGES_SEVERITY} from '@common/constants';
|
||||
@@ -38,7 +38,6 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
public tableSortFields$: Observable<SortMeta[]>;
|
||||
public tableSortOrder$: Observable<TableSortOrderEnum>;
|
||||
public noMoreModels$: Observable<boolean>;
|
||||
public isAllProjects$: Observable<boolean>;
|
||||
public tableFilters$: Observable<{ [s: string]: FilterMetadata }>;
|
||||
public searchValue$: Observable<string>;
|
||||
public selectedModels$: Observable<Array<any>>;
|
||||
@@ -55,8 +54,12 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
private isAllProjects: any;
|
||||
public selectedProject: Project;
|
||||
private selectedModels: Array<SelectedModel>;
|
||||
private columns$: Observable<ISmCol[]>;
|
||||
private metadataTableCols$: Observable<ISmCol[]>;
|
||||
public tableCols$: Observable<ISmCol[]>;
|
||||
public metadataColsOptions$: Observable<Record<string, string[]>>;
|
||||
|
||||
constructor(private store: Store<any>,
|
||||
constructor(private store: Store,
|
||||
public dialogRef: MatDialogRef<ConfirmDialogComponent>,
|
||||
@Inject(MAT_DIALOG_DATA) public data: {
|
||||
selectionMode: 'multiple' | 'single' | null;
|
||||
@@ -70,29 +73,48 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
this.store.select(selectSelectedModelsList),
|
||||
]).pipe(map(([models, selectedModels]) => unionBy(selectedModels, models, 'id')));
|
||||
this.tableSortFields$ = this.store.select(selectTableSortFields);
|
||||
this.tableFilters$ = this.store.select(selectTableFilters);
|
||||
this.tableFilters$ = this.store.select(selectSelectModelTableFilters);
|
||||
this.selectedModels$ = this.store.select(selectSelectedModels).pipe(tap(models => this.selectedModels = models));
|
||||
this.viewMode$ = this.store.select(selectViewMode);
|
||||
this.searchValue$ = this.store.select(selectGlobalFilter);
|
||||
this.noMoreModels$ = this.store.select(selectNoMoreModels);
|
||||
this.isAllProjects$ = this.store.select(selectIsAllProjectsMode);
|
||||
this.users$ = combineLatest([
|
||||
this.isAllProjects$,
|
||||
this.store.select(selectProjectUsers),
|
||||
this.store.select(selectAllProjectsUsers),
|
||||
]).pipe(
|
||||
tap(([all]) => this.isAllProjects = all),
|
||||
map(([all, projUsers, allUsers]) => all ? allUsers : projUsers));
|
||||
this.users$ = this.store.select(selectAllProjectsUsers);
|
||||
this.tags$ = this.store.select(selectModelsTags);
|
||||
this.systemTags$ = this.store.select(selectProjectSystemTags);
|
||||
this.subs.add(this.store.select(selectSelectedProject).subscribe(selectedProject => this.selectedProject = selectedProject));
|
||||
this.subs.add(this.store.select(selectSelectedProject).pipe(debounceTime(100))
|
||||
.subscribe(selectedProject => {
|
||||
this.selectedProject = selectedProject;
|
||||
if (selectedProject?.id !== '*') {
|
||||
this.store.dispatch(actions.tableFilterChanged({col: {id: 'project.name'}, value: [selectedProject.id]}));
|
||||
}
|
||||
}));
|
||||
this.frameworks$ = this.store.select(selectModelsFrameworks);
|
||||
|
||||
this.projectsOptions$ = this.store.select(selectTablesFilterProjectsOptions);
|
||||
|
||||
// if (data.selectedModels) {
|
||||
// this.store.dispatch(setSelectedModels({models: data.selectedModels.map(modelId => ({id: modelId}))}));
|
||||
// }
|
||||
this.metadataColsOptions$ = this.store.select(selectMetadataColsOptions);
|
||||
this.columns$ = this.store.select(selectModelTableColumns);
|
||||
this.metadataTableCols$ = this.store.select(selectMetadataColsForProject);
|
||||
this.tableCols$ = combineLatest([this.columns$, this.metadataTableCols$])
|
||||
.pipe(
|
||||
map(([tableCols, metricCols]) =>
|
||||
(tableCols.length > 0 ? tableCols : this.tableCols)
|
||||
.concat(metricCols.map(col => ({...col, metric: true})))
|
||||
),
|
||||
distinctUntilChanged((a, b) => isEqual(a, b)),
|
||||
map(cols => cols.filter(col => (!col.hidden || col.id === 'project.name')).map(col => ({
|
||||
...col,
|
||||
hidden: false,
|
||||
headerType: col.headerType === ColHeaderTypeEnum.checkBox ? ColHeaderTypeEnum.title : col.headerType,
|
||||
...(col.id === 'project.name' && {
|
||||
getter: 'project',
|
||||
filterable: true,
|
||||
searchableFilter: true,
|
||||
sortable: false,
|
||||
headerType: ColHeaderTypeEnum.sortFilter,
|
||||
}),
|
||||
})
|
||||
)));
|
||||
}
|
||||
|
||||
@ViewChild(ModelsTableComponent) table: ModelsTableComponent;
|
||||
@@ -108,7 +130,7 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
|
||||
ngOnDestroy(): void {
|
||||
this.store.dispatch(resetTablesFilterProjectsOptions());
|
||||
this.store.dispatch(actions.resetState());
|
||||
this.store.dispatch(actions.resetSelectModelState({fullReset: false}));
|
||||
this.subs.unsubscribe();
|
||||
}
|
||||
|
||||
@@ -120,8 +142,9 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
closeDialogMultiple() {
|
||||
return this.dialogRef.close(this.selectedModels.map( model => model.id));
|
||||
return this.dialogRef.close(this.selectedModels.map(model => model.id));
|
||||
}
|
||||
|
||||
getNextModels() {
|
||||
this.store.dispatch(actions.getNextModels());
|
||||
}
|
||||
@@ -148,31 +171,20 @@ export class SelectModelComponent implements OnInit, OnDestroy {
|
||||
if (this.data.selectionMode !== 'multiple') {
|
||||
return;
|
||||
}
|
||||
if (models.length === 0) {
|
||||
this.store.dispatch(addMessage(MESSAGES_SEVERITY.WARN, 'Compare module should include at least one model'));
|
||||
return;
|
||||
}
|
||||
if (models.length <= compareLimitations) {
|
||||
this.store.dispatch(setSelectedModels({models}));
|
||||
} else {
|
||||
this.store.dispatch(addMessage(MESSAGES_SEVERITY.WARN, compareLimitations + ' or fewer models can be compared'));
|
||||
}
|
||||
}
|
||||
|
||||
onIsAllProjectsChanged(isAllProjects: boolean) {
|
||||
this.store.dispatch(resetTablesFilterProjectsOptions());
|
||||
this.store.dispatch(actions.allProjectsModeChanged({isAllProjects}));
|
||||
isAllProjects ? this.store.dispatch(modelsActions.getTagsForAllProjects()) : this.store.dispatch(modelsActions.getTags());
|
||||
isAllProjects ? this.store.dispatch(modelsActions.getAllProjectsFrameworks()) : this.store.dispatch(modelsActions.getFrameworks());
|
||||
}
|
||||
|
||||
filterSearchChanged({value}: { colId: string; value: {value: string; loadMore?: boolean} }) {
|
||||
if (this.isAllProjects) {
|
||||
! value.loadMore && this.store.dispatch(resetTablesFilterProjectsOptions());
|
||||
this.store.dispatch(getTablesFilterProjectsOptions({searchString: value.value || '', loadMore: value.loadMore}));
|
||||
} else {
|
||||
this.store.dispatch(setTablesFilterProjectsOptions({projects: this.selectedProject ? [this.selectedProject, ...this.selectedProject?.sub_projects] : [], scrollId: null}));
|
||||
if (models.length === 0) {
|
||||
this.store.dispatch(addMessage(MESSAGES_SEVERITY.WARN, 'Compare module should include at least one model'));
|
||||
return;
|
||||
}
|
||||
if (models.length <= compareLimitations) {
|
||||
this.store.dispatch(setSelectedModels({models}));
|
||||
} else {
|
||||
this.store.dispatch(addMessage(MESSAGES_SEVERITY.WARN, compareLimitations + ' or fewer models can be compared'));
|
||||
}
|
||||
}
|
||||
|
||||
filterSearchChanged({value}: { colId: string; value: { value: string; loadMore?: boolean } }) {
|
||||
!value.loadMore && this.store.dispatch(resetTablesFilterProjectsOptions());
|
||||
this.store.dispatch(getTablesFilterProjectsOptions({searchString: value.value || '', loadMore: value.loadMore}));
|
||||
}
|
||||
|
||||
clearFilters() {
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
import {Injectable} from '@angular/core';
|
||||
import {Store} from '@ngrx/store';
|
||||
import {Actions, createEffect, ofType} from '@ngrx/effects';
|
||||
import {Actions, concatLatestFrom, createEffect, ofType} from '@ngrx/effects';
|
||||
import * as actions from './select-model.actions';
|
||||
import * as exSelectors from './select-model.reducer';
|
||||
import {MODELS_PAGE_SIZE} from '../models/models.consts';
|
||||
import {catchError, mergeMap, map, switchMap, withLatestFrom, debounceTime} from 'rxjs/operators';
|
||||
import {catchError, mergeMap, map, switchMap, debounceTime} from 'rxjs/operators';
|
||||
import {get} from 'lodash-es';
|
||||
import {MODEL_TAGS, MODELS_TABLE_COL_FIELDS} from '../models/shared/models.const';
|
||||
import {IModelsViewState} from '../models/reducers/models-view.reducer';
|
||||
import {ApiModelsService} from '~/business-logic/api-services/models.service';
|
||||
import {requestFailed} from '../core/actions/http.actions';
|
||||
import {activeLoader, deactivateLoader, setServerError} from '../core/actions/layout.actions';
|
||||
import {selectRouterParams} from '../core/reducers/router-reducer';
|
||||
import {addMultipleSortColumns} from '../shared/utils/shared-utils';
|
||||
import {of} from 'rxjs';
|
||||
import {FilterMetadata} from 'primeng/api/filtermetadata';
|
||||
import {ModelsGetAllExRequest} from '~/business-logic/model/models/modelsGetAllExRequest';
|
||||
import {SortMeta} from 'primeng/api';
|
||||
import {encodeOrder} from '../shared/utils/tableParamEncode';
|
||||
import {addExcludeFilters, createFiltersFromStore, encodeOrder} from '../shared/utils/tableParamEncode';
|
||||
import {selectTableSortFields} from './select-model.reducer';
|
||||
import {escapeRegex} from '@common/shared/utils/escape-regex';
|
||||
import {getNextModels, getSelectedModels, setSelectedModels, setSelectedModelsList, tableFilterChanged, tableSortChanged} from './select-model.actions';
|
||||
import {getNextModels, getSelectedModels, setSelectedModels, setSelectedModelsList} from './select-model.actions';
|
||||
import {selectMetadataColsForProject} from '@common/models/reducers';
|
||||
import {ISmCol} from '@common/shared/ui-components/data/table/table.consts';
|
||||
import {selectRouterProjectId} from '@common/core/reducers/projects.reducer';
|
||||
|
||||
@Injectable()
|
||||
export class SelectModelEffects {
|
||||
private selectModelsOnlyFields = ['created', 'framework', 'id', 'labels', 'name', 'ready', 'tags', 'system_tags', 'task.name', 'uri', 'user.name', 'parent', 'design', 'company', 'project.name', 'comment', 'last_update'];
|
||||
|
||||
constructor(private actions$: Actions, private store: Store<IModelsViewState>, private apiModels: ApiModelsService) {
|
||||
constructor(private actions$: Actions, private store: Store, private apiModels: ApiModelsService) {
|
||||
}
|
||||
|
||||
activeLoader = createEffect(() => this.actions$.pipe(
|
||||
ofType(actions.getNextModels, actions.globalFilterChanged,
|
||||
actions.allProjectsModeChanged, actions.tableSortChanged, actions.tableFilterChanged),
|
||||
ofType(actions.getNextModels, actions.globalFilterChanged, actions.tableSortChanged, actions.tableFilterChanged),
|
||||
map(action => activeLoader(action.type))
|
||||
));
|
||||
|
||||
tableSortChange = createEffect(() => this.actions$.pipe(
|
||||
ofType(actions.tableSortChanged),
|
||||
withLatestFrom(this.store.select(selectTableSortFields)),
|
||||
concatLatestFrom(() => this.store.select(selectTableSortFields)),
|
||||
switchMap(([action, oldOrders]) => {
|
||||
const orders = addMultipleSortColumns(oldOrders, action.colId, action.isShift);
|
||||
return [actions.setTableSort({orders})];
|
||||
@@ -45,7 +45,7 @@ export class SelectModelEffects {
|
||||
));
|
||||
|
||||
modelsFilterChanged = createEffect(() => this.actions$.pipe(
|
||||
ofType(actions.globalFilterChanged, actions.allProjectsModeChanged, actions.tableSortChanged, actions.tableFilterChanged, actions.showArchive, actions.clearTableFilter),
|
||||
ofType(actions.globalFilterChanged, actions.tableSortChanged, actions.tableFilterChanged, actions.showArchive, actions.clearTableFilter),
|
||||
debounceTime(0), // Let other effects finish first
|
||||
switchMap((action) => this.fetchModels$(null)
|
||||
.pipe(
|
||||
@@ -62,7 +62,7 @@ export class SelectModelEffects {
|
||||
|
||||
getModels = createEffect(() => this.actions$.pipe(
|
||||
ofType(getNextModels),
|
||||
withLatestFrom(this.store.select(exSelectors.selectCurrentScrollId)),
|
||||
concatLatestFrom(() => this.store.select(exSelectors.selectCurrentScrollId)),
|
||||
switchMap(([action, scrollId]) =>
|
||||
this.fetchModels$(scrollId)
|
||||
.pipe(
|
||||
@@ -91,29 +91,33 @@ export class SelectModelEffects {
|
||||
));
|
||||
|
||||
getGetAllQuery(
|
||||
scrollId: string, projectId: string, searchQuery: string, isAllProjects: boolean,
|
||||
orderFields: SortMeta[], tableFilters: { [s: string]: FilterMetadata }, showArchived: boolean
|
||||
scrollId: string, projectId: string, searchQuery: string, orderFields: SortMeta[],
|
||||
tableFilters: { [s: string]: FilterMetadata }, showArchived: boolean, metadataCols: ISmCol[]
|
||||
): ModelsGetAllExRequest {
|
||||
const userFilter = get(tableFilters, [MODELS_TABLE_COL_FIELDS.USER, 'value']);
|
||||
const tagsFilter = tableFilters?.[MODELS_TABLE_COL_FIELDS.TAGS]?.value;
|
||||
const tagsFilterAnd = tableFilters?.[MODELS_TABLE_COL_FIELDS.TAGS]?.matchMode === 'AND';
|
||||
const projectFilter = get(tableFilters, [MODELS_TABLE_COL_FIELDS.PROJECT, 'value']);
|
||||
const systemTags = tableFilters?.system_tags?.value;
|
||||
const systemTagsFilter = (showArchived ? [] :
|
||||
false ? ['__$and', MODEL_TAGS.HIDDEN] : ['__$and', '__$not', MODEL_TAGS.HIDDEN]).concat(systemTags ? systemTags : []);
|
||||
['__$and', '__$not', MODEL_TAGS.HIDDEN]).concat(systemTags ? systemTags : []);
|
||||
const filters = createFiltersFromStore(tableFilters, true);
|
||||
return {
|
||||
...filters,
|
||||
_any_: searchQuery ? {
|
||||
pattern: escapeRegex(searchQuery),
|
||||
fields: ['id', 'name', 'framework', 'system_tags', 'uri']
|
||||
} : undefined,
|
||||
/* eslint-disable @typescript-eslint/naming-convention */
|
||||
project: projectFilter ? projectFilter : ((isAllProjects || !projectId || projectId === '*') ? undefined : [projectId]),
|
||||
project: projectFilter,
|
||||
scroll_id: scrollId || null, // null to create new scroll (undefined doesn't generate scroll)
|
||||
size: MODELS_PAGE_SIZE,
|
||||
order_by: encodeOrder(orderFields),
|
||||
tags: (tagsFilter && tagsFilter.length > 0) ? tagsFilter : [],
|
||||
...(tagsFilter?.length > 0 && {tags: addExcludeFilters(tagsFilterAnd ? ['__$and', ...tagsFilter] : tagsFilter)}),
|
||||
system_tags: (systemTagsFilter && systemTagsFilter.length > 0) ? systemTagsFilter : [],
|
||||
only_fields: this.selectModelsOnlyFields,
|
||||
...(![0, 2].includes(tableFilters?.[MODELS_TABLE_COL_FIELDS.READY]?.value.length) && !!tableFilters && {ready: tableFilters?.[MODELS_TABLE_COL_FIELDS.READY]?.value[0] === 'true'}),
|
||||
only_fields: [...this.selectModelsOnlyFields, ...metadataCols.map(col => col.id)],
|
||||
...(tableFilters?.[MODELS_TABLE_COL_FIELDS.READY]?.value.length == 1 && !!tableFilters) ?
|
||||
{ready: tableFilters?.[MODELS_TABLE_COL_FIELDS.READY]?.value[0] === 'true'} : {ready: undefined},
|
||||
...(!window.location.href.includes('compare') && {ready: true}),
|
||||
framework: tableFilters?.[MODELS_TABLE_COL_FIELDS.FRAMEWORK]?.value ?? undefined,
|
||||
user: (userFilter && userFilter.length > 0) ? userFilter : undefined
|
||||
@@ -124,17 +128,17 @@ export class SelectModelEffects {
|
||||
fetchModels$(scrollId1: string) {
|
||||
return of(scrollId1)
|
||||
.pipe(
|
||||
withLatestFrom(
|
||||
concatLatestFrom(() => [
|
||||
// TODO: refactor with ngrx router.
|
||||
this.store.select(selectRouterParams).pipe(map(params => params?.projectId)),
|
||||
this.store.select(exSelectors.selectIsAllProjectsMode),
|
||||
this.store.select(selectRouterProjectId),
|
||||
this.store.select(exSelectors.selectGlobalFilter),
|
||||
this.store.select(exSelectors.selectTableSortFields),
|
||||
this.store.select(exSelectors.selectTableFilters),
|
||||
this.store.select(exSelectors.selectSelectModelTableFilters),
|
||||
this.store.select(exSelectors.selectShowArchive),
|
||||
),
|
||||
switchMap(([scrollId, projectId, isAllProjects, gb, sortFields, filters, showArchive]) =>
|
||||
this.apiModels.modelsGetAllEx(this.getGetAllQuery(scrollId, projectId, gb, isAllProjects, sortFields, filters, showArchive))
|
||||
this.store.select(selectMetadataColsForProject),
|
||||
]),
|
||||
switchMap(([scrollId, projectId, gb, sortFields, filters, showArchive, metadataCols]) =>
|
||||
this.apiModels.modelsGetAllEx(this.getGetAllQuery(scrollId, projectId, gb, sortFields, filters, showArchive, metadataCols))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,16 +9,16 @@ import {SelectModelEffects} from './select-model.effects';
|
||||
import {ModelSharedModule} from '../models/shared/model-shared.module';
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
imports: [
|
||||
CommonModule,
|
||||
SMSharedModule,
|
||||
ModelSharedModule,
|
||||
EffectsModule.forFeature([SelectModelEffects]),
|
||||
StoreModule.forFeature('selectModel', selectModelReducer)
|
||||
StoreModule.forFeature('selectModel', selectModelReducer),
|
||||
],
|
||||
providers : [],
|
||||
declarations : [SelectModelComponent],
|
||||
exports : [SelectModelComponent]
|
||||
providers: [],
|
||||
declarations: [SelectModelComponent],
|
||||
exports: [SelectModelComponent]
|
||||
})
|
||||
export class SelectModelModule {
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ const selectModelInitState: SelectModelState = {
|
||||
modelToken: null,
|
||||
viewMode: MODELS_VIEW_MODES.TABLE,
|
||||
allProjectsMode: true,
|
||||
tableFilters: null,
|
||||
tableFilters: {},
|
||||
tableSortFields: [{field: MODELS_TABLE_COL_FIELDS.CREATED, order: TABLE_SORT_ORDER.DESC}],
|
||||
scrollId: null,
|
||||
globalFilter: null,
|
||||
@@ -43,8 +43,14 @@ const selectModelInitState: SelectModelState = {
|
||||
|
||||
export function selectModelReducer<ActionReducer>(state: SelectModelState = selectModelInitState, action): SelectModelState {
|
||||
switch (action.type) {
|
||||
case actions.resetState.type:
|
||||
return {...selectModelInitState};
|
||||
case actions.resetSelectModelState.type:
|
||||
return {
|
||||
...selectModelInitState,
|
||||
...(!action.fullReset && {
|
||||
tableFilters: state.tableFilters,
|
||||
tableSortFields: state.tableSortFields,
|
||||
showArchive: state.showArchive})
|
||||
};
|
||||
case actions.addModels.type:
|
||||
return {...state, models: state.models.concat(action.models)};
|
||||
case actions.removeModels.type:
|
||||
@@ -64,8 +70,6 @@ export function selectModelReducer<ActionReducer>(state: SelectModelState = sele
|
||||
return {...state, scrollId: action.scrollId};
|
||||
case actions.setSelectedModels.type:
|
||||
return {...state, selectedModels: action.models};
|
||||
case actions.allProjectsModeChanged.type:
|
||||
return {...state, allProjectsMode: action.isAllProjects};
|
||||
case actions.setViewMode.type:
|
||||
return {...state, viewMode: action.viewMode};
|
||||
case actions.globalFilterChanged.type:
|
||||
@@ -73,7 +77,7 @@ export function selectModelReducer<ActionReducer>(state: SelectModelState = sele
|
||||
case actions.setTableSort.type:
|
||||
return {...state, tableSortFields: action.orders};
|
||||
case actions.clearTableFilter.type:
|
||||
return {...state, tableFilters: null};
|
||||
return {...state, tableFilters: {}};
|
||||
case actions.tableFilterChanged.type:
|
||||
return {
|
||||
...state,
|
||||
@@ -96,8 +100,7 @@ export const selectSelectedModelsList = createSelector(models, (state) => state
|
||||
export const selectCurrentScrollId = createSelector(models, (state): string => state.scrollId);
|
||||
export const selectGlobalFilter = createSelector(models, (state): string => state.globalFilter);
|
||||
export const selectTableSortFields = createSelector(models, (state): SortMeta[] => state.tableSortFields);
|
||||
export const selectTableFilters = createSelector(models, state => state.tableFilters);
|
||||
export const selectIsAllProjectsMode = createSelector(models, (state): boolean => state.allProjectsMode);
|
||||
export const selectSelectModelTableFilters = createSelector(models, state => state.tableFilters);
|
||||
export const selectViewMode = createSelector(models, (state): ModelsViewModesEnum => state.viewMode);
|
||||
export const selectSelectedModels = createSelector(models, (state): Array<any> => state.selectedModels);
|
||||
export const selectNoMoreModels = createSelector(models, (state): boolean => state.noMoreModels);
|
||||
|
||||
Reference in New Issue
Block a user