diff --git a/src/app/datasets/dataset-table/dataset-table.component.ts b/src/app/datasets/dataset-table/dataset-table.component.ts index 803f755282..787abda059 100644 --- a/src/app/datasets/dataset-table/dataset-table.component.ts +++ b/src/app/datasets/dataset-table/dataset-table.component.ts @@ -224,7 +224,7 @@ export class DatasetTableComponent implements OnInit, OnDestroy { this.store.dispatch( updateUserSettingsAction({ property: { - columns: columnsSetting, + fe_dataset_table_columns: columnsSetting, }, }), ); diff --git a/src/app/datasets/datasets-filter/datasets-filter.component.html b/src/app/datasets/datasets-filter/datasets-filter.component.html index e919e6791f..0c2d352727 100644 --- a/src/app/datasets/datasets-filter/datasets-filter.component.html +++ b/src/app/datasets/datasets-filter/datasets-filter.component.html @@ -62,7 +62,7 @@ [metadataKeys]="metadataKeys$ | async" [unitsEnabled]="appConfig.scienceSearchUnitsEnabled" [showConditionToggle]="true" - [conditionType]="'datasets'" + [conditionSettingsKey]="'fe_dataset_table_conditions'" [addConditionAction]="addCondition" [removeConditionAction]="removeCondition" > diff --git a/src/app/datasets/datasets-filter/datasets-filter.component.ts b/src/app/datasets/datasets-filter/datasets-filter.component.ts index 334dbfdead..1056ffae1b 100644 --- a/src/app/datasets/datasets-filter/datasets-filter.component.ts +++ b/src/app/datasets/datasets-filter/datasets-filter.component.ts @@ -169,7 +169,7 @@ export class DatasetsFilterComponent implements OnInit, OnDestroy { ); this.store.dispatch( updateUserSettingsAction({ - property: { conditions: [] }, + property: { fe_dataset_table_conditions: [] }, }), ); @@ -208,7 +208,7 @@ export class DatasetsFilterComponent implements OnInit, OnDestroy { if (filtersChanged) { this.store.dispatch( updateUserSettingsAction({ - property: { filters: result.filterConfigs }, + property: { fe_dataset_table_filters: result.filterConfigs }, }), ); diff --git a/src/app/files/files-dashboard/files-dashboard.component.ts b/src/app/files/files-dashboard/files-dashboard.component.ts index 5473fc45e2..eabcde503a 100644 --- a/src/app/files/files-dashboard/files-dashboard.component.ts +++ b/src/app/files/files-dashboard/files-dashboard.component.ts @@ -250,23 +250,16 @@ export class FilesDashboardComponent implements OnInit, OnDestroy { saveTableSettings(setting: ITableSetting) { this.pending = true; - const columnsSetting = setting.columnSetting.map((column) => { - const { name, display, index, width } = column; + const columnsSetting = setting.columnSetting.map((column, index) => { + const { name, display, width } = column; - return { name, display, index, width }; + return { name, display, order: index, width }; }); - const tablesSettings = { - ...this.tablesSettings, - [setting.settingName || this.tableName]: { - columns: columnsSetting, - }, - }; - this.store.dispatch( updateUserSettingsAction({ property: { - tablesSettings, + fe_file_table_columns: columnsSetting, }, }), ); diff --git a/src/app/instruments/instruments-dashboard/instruments-dashboard.component.ts b/src/app/instruments/instruments-dashboard/instruments-dashboard.component.ts index 5c7c418e07..0a3a2543cc 100644 --- a/src/app/instruments/instruments-dashboard/instruments-dashboard.component.ts +++ b/src/app/instruments/instruments-dashboard/instruments-dashboard.component.ts @@ -195,23 +195,16 @@ export class InstrumentsDashboardComponent implements OnInit, OnDestroy { saveTableSettings(setting: ITableSetting) { this.pending = true; - const columnsSetting = setting.columnSetting.map((column) => { - const { name, display, index, width } = column; + const columnsSetting = setting.columnSetting.map((column, index) => { + const { name, display, width } = column; - return { name, display, index, width }; + return { name, display, order: index, width }; }); - const tablesSettings = { - ...this.tablesSettings, - [setting.settingName || this.tableName]: { - columns: columnsSetting, - }, - }; - this.store.dispatch( updateUserSettingsAction({ property: { - tablesSettings, + fe_instrument_table_columns: columnsSetting, }, }), ); diff --git a/src/app/proposals/proposal-table/proposal-table.component.ts b/src/app/proposals/proposal-table/proposal-table.component.ts index a2e2b3e5ad..9485c125fa 100644 --- a/src/app/proposals/proposal-table/proposal-table.component.ts +++ b/src/app/proposals/proposal-table/proposal-table.component.ts @@ -257,17 +257,10 @@ export class ProposalTableComponent implements OnInit, OnDestroy { }; }); - const tablesSettings = { - ...this.tablesSettings, - [setting.settingName || this.tableName]: { - columns: columnsSetting, - }, - }; - this.store.dispatch( updateUserSettingsAction({ property: { - tablesSettings, + fe_proposal_table_columns: columnsSetting, }, }), ); diff --git a/src/app/samples/sample-dashboard/sample-dashboard.component.html b/src/app/samples/sample-dashboard/sample-dashboard.component.html index 3886684577..b23e4358ab 100644 --- a/src/app/samples/sample-dashboard/sample-dashboard.component.html +++ b/src/app/samples/sample-dashboard/sample-dashboard.component.html @@ -21,7 +21,6 @@ (search)="onTextSearchChange($event)" > - diff --git a/src/app/samples/sample-dashboard/sample-dashboard.component.ts b/src/app/samples/sample-dashboard/sample-dashboard.component.ts index a37d3caf5f..7f6f910fa9 100644 --- a/src/app/samples/sample-dashboard/sample-dashboard.component.ts +++ b/src/app/samples/sample-dashboard/sample-dashboard.component.ts @@ -329,23 +329,16 @@ export class SampleDashboardComponent implements OnInit, OnDestroy { saveTableSettings(setting: ITableSetting) { this.pending = true; - const columnsSetting = setting.columnSetting.map((column) => { - const { name, display, index, width } = column; + const columnsSetting = setting.columnSetting.map((column, index) => { + const { name, display, width } = column; - return { name, display, index, width }; + return { name, display, order: index, width }; }); - const tablesSettings = { - ...this.tablesSettings, - [setting.settingName || this.tableName]: { - columns: columnsSetting, - }, - }; - this.store.dispatch( updateUserSettingsAction({ property: { - tablesSettings, + fe_sample_table_columns: columnsSetting, }, }), ); diff --git a/src/app/shared/modules/shared-condition/shared-condition.component.spec.ts b/src/app/shared/modules/shared-condition/shared-condition.component.spec.ts index 89acd0994a..1af11dc97e 100644 --- a/src/app/shared/modules/shared-condition/shared-condition.component.spec.ts +++ b/src/app/shared/modules/shared-condition/shared-condition.component.spec.ts @@ -49,6 +49,7 @@ describe("SharedConditionComponent", () => { fixture = TestBed.createComponent(SharedConditionComponent); component = fixture.componentInstance; + component.conditionSettingsKey = "fe_dataset_table_conditions"; fixture.detectChanges(); }); diff --git a/src/app/shared/modules/shared-condition/shared-condition.component.ts b/src/app/shared/modules/shared-condition/shared-condition.component.ts index 3d5fc022ac..43e59551d3 100644 --- a/src/app/shared/modules/shared-condition/shared-condition.component.ts +++ b/src/app/shared/modules/shared-condition/shared-condition.component.ts @@ -5,10 +5,13 @@ import { Output, OnDestroy, } from "@angular/core"; -import { map, take } from "rxjs/operators"; +import { take } from "rxjs/operators"; import { ConditionConfig } from "state-management/state/user.store"; import { isEqual } from "lodash-es"; -import { ScientificCondition } from "state-management/models"; +import { + ScientificCondition, + ConditionSettingsKey, +} from "state-management/models"; import { ConnectedPosition } from "@angular/cdk/overlay"; import { Store } from "@ngrx/store"; import { MatDialog } from "@angular/material/dialog"; @@ -24,8 +27,12 @@ import { import { updateConditionsConfigs, updateUserSettingsAction, + updateSampleConditionsConfigs, } from "state-management/actions/user.actions"; -import { selectConditions } from "state-management/selectors/user.selectors"; +import { + selectConditions, + selectSampleConditions, +} from "state-management/selectors/user.selectors"; @Component({ selector: "shared-condition", templateUrl: "./shared-condition.component.html", @@ -39,18 +46,12 @@ export class SharedConditionComponent implements OnDestroy { @Input() metadataKeys: string[] = []; @Input() unitsEnabled = false; @Input() showConditionToggle = false; - @Input() conditionType: "datasets" | "samples" = "datasets"; + @Input() conditionSettingsKey: ConditionSettingsKey; @Input() addConditionAction: (condition: ScientificCondition) => void; @Input() removeConditionAction: (condition: ScientificCondition) => void; @Output() conditionsApplied = new EventEmitter(); - allConditions$ = this.store.select(selectConditions); - - conditionConfigs$ = this.allConditions$.pipe( - map((configs) => - configs.filter((c) => c.conditionType === this.conditionType), - ), - ); + conditionConfigs$ = this.store.select(selectConditions); humanNameMap: { [key: string]: string } = {}; tempConditionValues: string[] = []; @@ -82,6 +83,16 @@ export class SharedConditionComponent implements OnDestroy { ) {} ngOnInit() { + switch (this.conditionSettingsKey) { + case "fe_dataset_table_conditions": + this.conditionConfigs$ = this.store.select(selectConditions); + break; + case "fe_sample_table_conditions": + this.conditionConfigs$ = this.store.select(selectSampleConditions); + break; + default: + throw new Error("Invalid conditionSettingsKey"); + } if (this.showConditions) { this.buildMetadataMaps(); this.applyEnabledConditions(); @@ -92,11 +103,20 @@ export class SharedConditionComponent implements OnDestroy { // Helper to get all conditions and update store updateStore(updatedConditions: ConditionConfig[]) { + if (this.conditionSettingsKey === "fe_dataset_table_conditions") { + this.store.dispatch( + updateConditionsConfigs({ conditionConfigs: updatedConditions }), + ); + } else if (this.conditionSettingsKey === "fe_sample_table_conditions") { + this.store.dispatch( + updateSampleConditionsConfigs({ conditionConfigs: updatedConditions }), + ); + } + this.store.dispatch( - updateConditionsConfigs({ conditionConfigs: updatedConditions }), - ); - this.store.dispatch( - updateUserSettingsAction({ property: { conditions: updatedConditions } }), + updateUserSettingsAction({ + property: { [this.conditionSettingsKey]: updatedConditions }, + }), ); } @@ -114,34 +134,14 @@ export class SharedConditionComponent implements OnDestroy { applyEnabledConditions() { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const needsUpdate = allConditions.some((c) => !c.conditionType); - if (needsUpdate && allConditions.length > 0) { - const updatedConditions = allConditions.map((c) => ({ - ...c, - conditionType: c.conditionType || this.conditionType, - })); - this.updateStore(updatedConditions); - - updatedConditions - .filter((c) => c.conditionType === this.conditionType) - .forEach((config) => { - this.applyUnitsOptions(config.condition); - }); - return; - } - - const myConditions = allConditions.filter( - (c) => !c.conditionType || c.conditionType === this.conditionType, - ); - - myConditions.forEach((config) => { + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + conditions.forEach((config) => { if (config.condition.lhs) { this.removeConditionAction?.(config.condition); } }); - myConditions.forEach((config) => { + conditions.forEach((config) => { this.applyUnitsOptions(config.condition); if (config.enabled && config.condition.lhs && config.condition.rhs) { const condition = { ...config.condition }; @@ -244,11 +244,8 @@ export class SharedConditionComponent implements OnDestroy { this.buildMetadataMaps(); this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const myConditions = allConditions.filter( - (c) => c.conditionType === this.conditionType, - ); - const usedFields = myConditions.map((config) => config.condition.lhs); + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + const usedFields = conditions.map((config) => config.condition.lhs); const availableKeys = this.metadataKeys.filter( (key) => !usedFields.includes(key), ); @@ -271,8 +268,8 @@ export class SharedConditionComponent implements OnDestroy { if (res) { const { data } = res; - const existingConditionIndex = myConditions.findIndex( - (config) => isEqual(config.condition.lhs, data.lhs), + const existingConditionIndex = conditions.findIndex((config) => + isEqual(config.condition.lhs, data.lhs), ); if (existingConditionIndex !== -1) { @@ -290,10 +287,9 @@ export class SharedConditionComponent implements OnDestroy { human_name: this.humanNameMap[data.lhs], }, enabled: true, - conditionType: this.conditionType, }; - this.updateStore([...allConditions, newCondition]); + this.updateStore([...conditions, newCondition]); this.snackBar.open("Condition added successfully", "Close", { duration: 2000, @@ -308,16 +304,14 @@ export class SharedConditionComponent implements OnDestroy { removeCondition(condition: ConditionConfig, index: number) { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const actualIndex = allConditions.findIndex( - (c) => - c.condition.lhs === condition.condition.lhs && - c.conditionType === this.conditionType, + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + const actualIndex = conditions.findIndex( + (c) => c.condition.lhs === condition.condition.lhs, ); if (actualIndex === -1) return; - const updatedConditions = [...allConditions]; + const updatedConditions = [...conditions]; updatedConditions.splice(actualIndex, 1); this.tempConditionValues.splice(index, 1); @@ -336,22 +330,16 @@ export class SharedConditionComponent implements OnDestroy { updateConditionField(index: number, updates: Partial) { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const myConditions = allConditions.filter( - (c) => c.conditionType === this.conditionType, - ); + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + if (!conditions[index]) return; - if (!myConditions[index]) return; - - const actualIndex = allConditions.findIndex( - (c) => - c.condition.lhs === myConditions[index].condition.lhs && - c.conditionType === this.conditionType, + const actualIndex = conditions.findIndex( + (c) => c.condition.lhs === conditions[index].condition.lhs, ); if (actualIndex === -1) return; - const updatedConditions = [...allConditions]; + const updatedConditions = [...conditions]; const conditionConfig = updatedConditions[actualIndex]; updatedConditions[actualIndex] = { @@ -363,9 +351,17 @@ export class SharedConditionComponent implements OnDestroy { }, }; - this.store.dispatch( - updateConditionsConfigs({ conditionConfigs: updatedConditions }), - ); + if (this.conditionSettingsKey === "fe_dataset_table_conditions") { + this.store.dispatch( + updateConditionsConfigs({ conditionConfigs: updatedConditions }), + ); + } else if (this.conditionSettingsKey === "fe_sample_table_conditions") { + this.store.dispatch( + updateSampleConditionsConfigs({ + conditionConfigs: updatedConditions, + }), + ); + } }), ); } @@ -406,22 +402,16 @@ export class SharedConditionComponent implements OnDestroy { toggleConditionEnabled(index: number, enabled: boolean) { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const myConditions = allConditions.filter( - (c) => c.conditionType === this.conditionType, - ); - - if (!myConditions[index]) return; + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + if (!conditions[index]) return; - const actualIndex = allConditions.findIndex( - (c) => - c.condition.lhs === myConditions[index].condition.lhs && - c.conditionType === this.conditionType, + const actualIndex = conditions.findIndex( + (c) => c.condition.lhs === conditions[index].condition.lhs, ); if (actualIndex === -1) return; - const updatedConditions = [...allConditions]; + const updatedConditions = [...conditions]; updatedConditions[actualIndex] = { ...updatedConditions[actualIndex], enabled, @@ -441,15 +431,8 @@ export class SharedConditionComponent implements OnDestroy { applyConditions() { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const myConditions = allConditions.filter( - (c) => c.conditionType === this.conditionType, - ); - const otherConditions = allConditions.filter( - (c) => c.conditionType !== this.conditionType, - ); - - const updatedMyConditions = myConditions.map((config, i) => { + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + const updatedMyConditions = conditions.map((config, i) => { const lhs = config.condition.lhs; const baseCondition = { ...config.condition, @@ -490,10 +473,10 @@ export class SharedConditionComponent implements OnDestroy { return { ...config, condition: baseCondition }; }); - // Removes old conditions for this type - myConditions.forEach((c) => this.removeConditionAction?.(c.condition)); + // Removes old conditions + conditions.forEach((c) => this.removeConditionAction?.(c.condition)); - // Adds updated conditions for this type + // Adds updated conditions updatedMyConditions.forEach((config) => { if ( config.enabled && @@ -505,8 +488,8 @@ export class SharedConditionComponent implements OnDestroy { } }); - // Merges other conditions with updated conditions for this type - this.updateStore([...otherConditions, ...updatedMyConditions]); + // Merges other conditions with updated conditions + this.updateStore(updatedMyConditions); this.tempConditionValues = []; this.conditionsApplied.emit(); }), @@ -515,19 +498,12 @@ export class SharedConditionComponent implements OnDestroy { clearConditions() { this.subscriptions.push( - this.allConditions$.pipe(take(1)).subscribe((allConditions = []) => { - const myConditions = allConditions.filter( - (c) => c.conditionType === this.conditionType, - ); - - myConditions.forEach((config) => + this.conditionConfigs$.pipe(take(1)).subscribe((conditions = []) => { + conditions.forEach((config) => this.removeConditionAction?.(config.condition), ); - const updatedConditions = allConditions.filter( - (c) => c.conditionType !== this.conditionType, - ); - this.updateStore(updatedConditions); + this.updateStore([]); }), ); } diff --git a/src/app/state-management/actions/user.actions.spec.ts b/src/app/state-management/actions/user.actions.spec.ts index 925146fe21..50c695cc14 100644 --- a/src/app/state-management/actions/user.actions.spec.ts +++ b/src/app/state-management/actions/user.actions.spec.ts @@ -226,7 +226,7 @@ describe("User Actions", () => { it("should create an action", () => { const userSettings: UserSettings = { externalSettings: { - columns: [], + fe_dataset_table_columns: [], }, datasetCount: 25, jobCount: 25, @@ -254,7 +254,7 @@ describe("User Actions", () => { describe("updateUserSettingsAction", () => { it("should create an action", () => { - const property = { columns: [] }; + const property = { fe_dataset_table_columns: [] }; const action = fromActions.updateUserSettingsAction({ property }); expect({ ...action }).toEqual({ type: "[User] Update User Settings", @@ -267,7 +267,7 @@ describe("User Actions", () => { it("should create an action", () => { const userSettings: UserSettings = { externalSettings: { - columns: [], + fe_dataset_table_columns: [], }, datasetCount: 25, jobCount: 25, diff --git a/src/app/state-management/actions/user.actions.ts b/src/app/state-management/actions/user.actions.ts index bc1e9704ce..bf177ac825 100644 --- a/src/app/state-management/actions/user.actions.ts +++ b/src/app/state-management/actions/user.actions.ts @@ -188,6 +188,11 @@ export const updateConditionsConfigs = createAction( props<{ conditionConfigs: ConditionConfig[] }>(), ); +export const updateSampleConditionsConfigs = createAction( + "[User] Update Sample Conditions Configs", + props<{ conditionConfigs: ConditionConfig[] }>(), +); + export const loadDefaultSettings = createAction( "[User] Load Default Settings", props<{ config: AppConfigInterface }>(), diff --git a/src/app/state-management/effects/user.effects.spec.ts b/src/app/state-management/effects/user.effects.spec.ts index 0fe902df8b..2ec184103f 100644 --- a/src/app/state-management/effects/user.effects.spec.ts +++ b/src/app/state-management/effects/user.effects.spec.ts @@ -55,6 +55,10 @@ class AppConfigServiceMock { conditions: [], filters: [], }, + defaultProposalsListSettings: { + columns: [], + filters: [], + }, }; } } @@ -597,15 +601,29 @@ describe("UserEffects", () => { it("should result in a fetchUserSettingsCompleteAction", () => { const userSettings = { - columns: [], datasetCount: 25, jobCount: 25, userId: "testId", id: "testId", } as unknown as UserSettings; + + const normalizedUserSettings = { + ...userSettings, + externalSettings: { + fe_dataset_table_columns: [], + fe_dataset_table_conditions: [], + fe_dataset_table_filters: [], + fe_proposal_table_columns: [], + fe_proposal_table_filters: [], + fe_sample_table_columns: [], + fe_sample_table_conditions: [], + fe_instrument_table_columns: [], + fe_file_table_columns: [], + }, + } as unknown as UserSettings; const action = fromActions.fetchUserSettingsAction({ id }); const outcome = fromActions.fetchUserSettingsCompleteAction({ - userSettings, + userSettings: normalizedUserSettings, }); actions = hot("-a", { a: action }); @@ -632,7 +650,6 @@ describe("UserEffects", () => { describe("setLimitFilters$", () => { it("should result in a setDatasetsLimitFilterAction and a setJobsLimitFilterAction", () => { const userSettings = { - columns: [], datasetCount: 10, jobCount: 10, } as unknown as UserSettings; @@ -668,7 +685,7 @@ describe("UserEffects", () => { }); describe("updateUserColumns$", () => { - const property = { columns: [] }; + const property = { fe_dataset_table_columns: [] }; describe("ofType selectColumnAction", () => { it("should dispatch an updateUserSettingsAction", () => { const name = "test"; @@ -699,22 +716,19 @@ describe("UserEffects", () => { }); describe("updateUserSettings$", () => { - const property = { columns: [] }; + const property = { fe_dataset_table_columns: [] }; it("should result in an updateUserSettingsCompleteAction", () => { // TODO: try to fix the types here instead of using type casting and conversion const userSettings = { - columns: [], - filters: [], - conditions: [], datasetCount: 25, jobCount: 25, userId: "testId", id: "testId", externalSettings: { - columns: [], - filters: [], - conditions: [], + fe_dataset_table_columns: [], + fe_dataset_table_filters: [], + fe_dataset_table_conditions: [], }, } as unknown as UserSettings; @@ -724,9 +738,9 @@ describe("UserEffects", () => { userId: "testId", id: "testId", externalSettings: { - columns: [], - filters: [], - conditions: [], + fe_dataset_table_columns: [], + fe_dataset_table_filters: [], + fe_dataset_table_conditions: [], }, }; const action = fromActions.updateUserSettingsAction({ property }); diff --git a/src/app/state-management/effects/user.effects.ts b/src/app/state-management/effects/user.effects.ts index bf72045373..3e7547450c 100644 --- a/src/app/state-management/effects/user.effects.ts +++ b/src/app/state-management/effects/user.effects.ts @@ -325,28 +325,52 @@ export class UserEffects { this.usersService.usersControllerGetSettingsV3(id, null).pipe( map((userSettings: UserSettings) => { const config = this.configService.getConfig(); - const externalSettings = userSettings.externalSettings || {}; - - const settingsToCheck = ["columns", "conditions", "filters"]; + const externalSettings = { + ...(userSettings.externalSettings || {}), + }; + + const settingsToCheck = [ + "fe_dataset_table_columns", + "fe_dataset_table_conditions", + "fe_dataset_table_filters", + "fe_proposal_table_columns", + "fe_proposal_table_filters", + "fe_sample_table_columns", + "fe_sample_table_conditions", + "fe_instrument_table_columns", + "fe_file_table_columns", + ]; for (const setting of settingsToCheck) { - let items = []; - - if (Array.isArray(externalSettings[setting])) { - items = externalSettings[setting]; + let items = externalSettings[setting]; + + if (!Array.isArray(items) || items.length < 1) { + if (setting.startsWith("fe_dataset_table_")) { + const key = setting.replace("fe_dataset_table_", ""); + items = + config.defaultDatasetsListSettings?.[key] || + initialUserState.settings[setting] || + []; + } else if (setting.startsWith("fe_proposal_table_")) { + const key = setting.replace("fe_proposal_table_", ""); + items = + config.defaultProposalsListSettings?.[key] || + initialUserState.settings[setting] || + []; + } else { + items = initialUserState.settings[setting] || []; + } } - - if (items.length < 1) { - items = - config.defaultDatasetsListSettings[setting] || - initialUserState[setting]; - } - - userSettings[setting] = items; + externalSettings[setting] = items; } + const normalizedUserSettings = { + ...userSettings, + externalSettings, + }; + return fromActions.fetchUserSettingsCompleteAction({ - userSettings, + userSettings: normalizedUserSettings, }); }), catchError(() => of(fromActions.fetchUserSettingsFailedAction())), @@ -370,7 +394,9 @@ export class UserEffects { ofType(fromActions.fetchUserSettingsCompleteAction), mergeMap(({ userSettings }) => [ fromActions.updateFilterConfigs({ - filterConfigs: (userSettings as any).filters, + filterConfigs: + (userSettings as any).externalSettings?.fe_dataset_table_filters || + [], }), ]), ); @@ -379,27 +405,31 @@ export class UserEffects { setConditions$ = createEffect(() => { return this.actions$.pipe( ofType(fromActions.fetchUserSettingsCompleteAction), - mergeMap(({ userSettings }) => { + concatLatestFrom(() => this.store.select(selectConditions)), + mergeMap(([{ userSettings }, existingConditions]) => { const actions = []; + const incomingConditions = + (userSettings as any).externalSettings?.fe_dataset_table_conditions || + []; + + const conditions = + incomingConditions.length > 0 + ? incomingConditions + : existingConditions || []; + // TODO: Check with the types here. This is working better as it is now with the conditions and filters. We are leaving it for now as it was from before. - (userSettings as any).conditions + conditions .filter((condition) => condition.enabled) .forEach((condition) => { actions.push( addScientificConditionAction({ condition: condition.condition }), ); - actions.push( - selectColumnAction({ - name: condition.condition.lhs, - columnType: "custom", - }), - ); }); actions.push( fromActions.updateConditionsConfigs({ - conditionConfigs: (userSettings as any).conditions, + conditionConfigs: conditions, }), ); @@ -428,7 +458,7 @@ export class UserEffects { ), map((columns) => fromActions.updateUserSettingsAction({ - property: { columns }, + property: { fe_dataset_table_columns: columns }, }), ), ); @@ -441,10 +471,15 @@ export class UserEffects { takeWhile(([action, user]) => !!user), switchMap(([{ property }, user]) => { const settingsToNest = [ - "columns", - "conditions", - "filters", - "tablesSettings", + "fe_dataset_table_columns", + "fe_dataset_table_conditions", + "fe_dataset_table_filters", + "fe_proposal_table_columns", + "fe_proposal_table_filters", + "fe_sample_table_columns", + "fe_sample_table_conditions", + "fe_instrument_table_columns", + "fe_file_table_columns", ]; const propertyKeys = Object.keys(property); const newProperty = {}; @@ -473,20 +508,12 @@ export class UserEffects { JSON.stringify(newProperty) as any, ); return apiCall$.pipe( - map((userSettings: UserSettings) => { - userSettings["conditions"] = ( - userSettings.externalSettings as any - ).conditions; - userSettings["filters"] = ( - userSettings.externalSettings as any - ).filters; - userSettings["columns"] = ( - userSettings.externalSettings as any - ).columns; - return fromActions.updateUserSettingsCompleteAction({ + map((userSettings: UserSettings) => + fromActions.updateUserSettingsCompleteAction({ userSettings, - }); - }), + }), + ), + catchError(() => of(fromActions.updateUserSettingsFailedAction())), ); }), @@ -512,17 +539,17 @@ export class UserEffects { map(([{ config }, existingConditions]) => { const defaultFilters = config.defaultDatasetsListSettings.filters || - initialUserState.filters; + initialUserState.settings.fe_dataset_table_filters; const defaultConditions = config.defaultDatasetsListSettings.conditions || - initialUserState.conditions; + initialUserState.settings.fe_dataset_table_conditions; // NOTE: config.localColumns is for backward compatibility. // it should be removed once no longer needed const columns = config.defaultDatasetsListSettings.columns || config.localColumns || - initialUserState.columns; + initialUserState.settings.fe_dataset_table_columns; const isAuthenticated = this.authService.isAuthenticated(); const actions = []; diff --git a/src/app/state-management/models/index.ts b/src/app/state-management/models/index.ts index ba4927b45b..a8a8132ebb 100644 --- a/src/app/state-management/models/index.ts +++ b/src/app/state-management/models/index.ts @@ -9,6 +9,15 @@ export interface Settings { datasetCount: number; jobCount: number; darkTheme: false; + fe_dataset_table_columns?: TableColumn[]; + fe_dataset_table_filters?: FilterConfig[]; + fe_dataset_table_conditions?: ConditionConfig[]; + fe_proposal_table_columns?: TableColumn[]; + fe_proposal_table_filters?: FilterConfig[]; + fe_sample_table_columns?: TableColumn[]; + fe_sample_table_conditions?: ConditionConfig[]; + fe_instrument_table_columns?: TableColumn[]; + fe_file_table_columns?: TableColumn[]; } export interface TableColumn { @@ -183,3 +192,7 @@ export interface LogbookFilters extends GenericFilters { export interface JobFilters extends GenericFilters { mode: Record | undefined; } + +export type ConditionSettingsKey = + | "fe_dataset_table_conditions" + | "fe_sample_table_conditions"; diff --git a/src/app/state-management/reducers/user.reducer.spec.ts b/src/app/state-management/reducers/user.reducer.spec.ts index 790f15f825..e70dbd6467 100644 --- a/src/app/state-management/reducers/user.reducer.spec.ts +++ b/src/app/state-management/reducers/user.reducer.spec.ts @@ -20,7 +20,7 @@ describe("UserReducer", () => { }); const state = userReducer(initialUserState, action); - expect(state.columns.length).toEqual(1); + expect(state.settings.fe_dataset_table_columns.length).toEqual(1); }); }); @@ -117,12 +117,16 @@ describe("UserReducer", () => { describe("on fetchUserSettingsCompleteAction", () => { it("should set jobCount and datasetCount settings, and columns if not empty", () => { + const datasetColumns: TableColumn[] = [ + { name: "test", order: 0, type: "standard", enabled: true }, + ]; const userSettings = { - columns: [{ name: "test", order: 0, type: "standard", enabled: true }], datasetCount: 50, jobCount: 50, userId: "testId", - externalSettings: {}, + externalSettings: { + fe_dataset_table_columns: datasetColumns, + }, id: "testId", }; const action = fromActions.fetchUserSettingsCompleteAction({ @@ -132,19 +136,20 @@ describe("UserReducer", () => { expect(state.settings.datasetCount).toEqual(userSettings.datasetCount); expect(state.settings.jobCount).toEqual(userSettings.jobCount); - expect(state.columns).toEqual( - (userSettings as { columns: TableColumn[] }).columns, + expect(state.settings.fe_dataset_table_columns).toEqual( + userSettings.externalSettings.fe_dataset_table_columns, ); }); it("should set jobCount and datasetCount settings, and not columns if empty", () => { const userSettings = { - columns: [], datasetCount: 50, jobCount: 50, userId: "testId", id: "testId", - externalSettings: {}, + externalSettings: { + fe_dataset_table_columns: [], + }, }; const action = fromActions.fetchUserSettingsCompleteAction({ userSettings, @@ -153,18 +158,24 @@ describe("UserReducer", () => { expect(state.settings.datasetCount).toEqual(userSettings.datasetCount); expect(state.settings.jobCount).toEqual(userSettings.jobCount); - expect(state.columns).toEqual(initialUserState.columns); + expect(state.settings.fe_dataset_table_columns).toEqual( + initialUserState.settings.fe_dataset_table_columns, + ); }); }); describe("on updateUserSettingsCompleteAction", () => { it("should set jobCount and datasetCount settings, and columns if not empty", () => { + const datasetColumns: TableColumn[] = [ + { name: "test", order: 0, type: "standard", enabled: true }, + ]; const userSettings = { - columns: [{ name: "test", order: 0, type: "standard", enabled: true }], datasetCount: 50, jobCount: 50, userId: "testId", - externalSettings: {}, + externalSettings: { + fe_dataset_table_columns: datasetColumns, + }, id: "testId", }; const action = fromActions.updateUserSettingsCompleteAction({ @@ -174,18 +185,19 @@ describe("UserReducer", () => { expect(state.settings.datasetCount).toEqual(userSettings.datasetCount); expect(state.settings.jobCount).toEqual(userSettings.jobCount); - expect(state.columns).toEqual( - (userSettings as { columns: TableColumn[] }).columns, + expect(state.settings.fe_dataset_table_columns).toEqual( + userSettings.externalSettings.fe_dataset_table_columns, ); }); it("should set jobCount and datasetCount settings, and not columns if empty", () => { const userSettings = { - columns: [], datasetCount: 50, jobCount: 50, userId: "testId", - externalSettings: {}, + externalSettings: { + fe_dataset_table_columns: [], + }, id: "testId", }; const action = fromActions.updateUserSettingsCompleteAction({ @@ -195,7 +207,9 @@ describe("UserReducer", () => { expect(state.settings.datasetCount).toEqual(userSettings.datasetCount); expect(state.settings.jobCount).toEqual(userSettings.jobCount); - expect(state.columns).toEqual(initialUserState.columns); + expect(state.settings.fe_dataset_table_columns).toEqual( + initialUserState.settings.fe_dataset_table_columns, + ); }); }); @@ -237,11 +251,21 @@ describe("UserReducer", () => { const action = fromActions.addCustomColumnsAction({ names }); const state = userReducer(initialUserState, action); - expect(state.columns[state.columns.length - 1].name).toEqual("test"); - expect(state.columns[state.columns.length - 1].order).toEqual( - state.columns.length - 1, - ); - expect(state.columns[state.columns.length - 1].enabled).toEqual(false); + expect( + state.settings.fe_dataset_table_columns[ + state.settings.fe_dataset_table_columns.length - 1 + ].name, + ).toEqual("test"); + expect( + state.settings.fe_dataset_table_columns[ + state.settings.fe_dataset_table_columns.length - 1 + ].order, + ).toEqual(state.settings.fe_dataset_table_columns.length - 1); + expect( + state.settings.fe_dataset_table_columns[ + state.settings.fe_dataset_table_columns.length - 1 + ].enabled, + ).toEqual(false); }); }); @@ -253,7 +277,7 @@ describe("UserReducer", () => { const action = fromActions.selectColumnAction({ name, columnType }); const state = userReducer(initialUserState, action); - state.columns.forEach((column) => { + state.settings.fe_dataset_table_columns.forEach((column) => { if (column.name === name && column.type === columnType) { expect(column.enabled).toEqual(true); } @@ -269,7 +293,7 @@ describe("UserReducer", () => { const action = fromActions.deselectColumnAction({ name, columnType }); const state = userReducer(initialUserState, action); - state.columns.forEach((column) => { + state.settings.fe_dataset_table_columns.forEach((column) => { if (column.name === name && column.type === columnType) { expect(column.enabled).toEqual(false); } diff --git a/src/app/state-management/reducers/user.reducer.ts b/src/app/state-management/reducers/user.reducer.ts index 9b8a41461f..b42063f385 100644 --- a/src/app/state-management/reducers/user.reducer.ts +++ b/src/app/state-management/reducers/user.reducer.ts @@ -9,7 +9,10 @@ const reducer = createReducer( fromActions.setDatasetTableColumnsAction, (state, { columns }): UserState => ({ ...state, - columns, + settings: { + ...state.settings, + fe_dataset_table_columns: columns, + }, }), ), @@ -71,63 +74,34 @@ const reducer = createReducer( on( fromActions.fetchUserSettingsCompleteAction, (state, { userSettings }): UserState => { - const { datasetCount, jobCount, columns, externalSettings } = - userSettings as any; - const settings = { - ...state.settings, - datasetCount, - jobCount, + const { datasetCount, jobCount, externalSettings } = userSettings as any; + + return { + ...state, + settings: { + ...state.settings, + datasetCount, + jobCount, + ...externalSettings, + }, + hasFetchedSettings: true, }; - if (columns.length > 0) { - return { - ...state, - settings, - columns, - tablesSettings: externalSettings?.tablesSettings, - hasFetchedSettings: true, - }; - } else { - return { - ...state, - settings, - tablesSettings: externalSettings?.tablesSettings, - hasFetchedSettings: true, - }; - } }, ), on( fromActions.updateUserSettingsCompleteAction, (state, { userSettings }): UserState => { - const { - datasetCount, - jobCount, - columns = [], - externalSettings, - filters, - conditions, - } = userSettings as any; - const settings = { ...state.settings, datasetCount, jobCount }; - - if (columns.length > 0) { - return { - ...state, - settings, - columns, - tablesSettings: externalSettings?.tablesSettings, - filters: filters || state.filters, - conditions: conditions || state.conditions, - }; - } else { - return { - ...state, - settings, - tablesSettings: externalSettings?.tablesSettings, - filters: filters || state.filters, - conditions: conditions || state.conditions, - }; - } + const { datasetCount, jobCount, externalSettings } = userSettings as any; + return { + ...state, + settings: { + ...state.settings, + datasetCount, + jobCount, + ...externalSettings, + }, + }; }, ), @@ -154,7 +128,7 @@ const reducer = createReducer( ), on(fromActions.addCustomColumnsAction, (state, { names }): UserState => { - const existingColumns = [...state.columns]; + const existingColumns = [...state.settings.fe_dataset_table_columns]; const standardColumns = existingColumns.filter( (column) => column.type === "standard", @@ -192,31 +166,40 @@ const reducer = createReducer( .concat(enabledCustomColumns) .concat(newColumns); - return { ...state, columns }; + return { + ...state, + settings: { ...state.settings, fe_dataset_table_columns: columns }, + }; }), on( fromActions.selectColumnAction, (state, { name, columnType }): UserState => { - const columns = [...state.columns]; + const columns = [...state.settings.fe_dataset_table_columns]; columns.forEach((item) => { if (item.name === name && item.type === columnType) { item.enabled = true; } }); - return { ...state, columns }; + return { + ...state, + settings: { ...state.settings, fe_dataset_table_columns: columns }, + }; }, ), on( fromActions.deselectColumnAction, (state, { name, columnType }): UserState => { - const columns = [...state.columns]; + const columns = [...state.settings.fe_dataset_table_columns]; columns.forEach((item) => { if (item.name === name && item.type === columnType) { item.enabled = false; } }); - return { ...state, columns }; + return { + ...state, + settings: { ...state.settings, fe_dataset_table_columns: columns }, + }; }, ), @@ -262,13 +245,30 @@ const reducer = createReducer( (state, { filterConfigs }): UserState => ({ ...state, filters: filterConfigs, + settings: { + ...state.settings, + fe_dataset_table_filters: filterConfigs, + }, }), ), on( fromActions.updateConditionsConfigs, (state, { conditionConfigs }): UserState => ({ ...state, - conditions: conditionConfigs, + settings: { + ...state.settings, + fe_dataset_table_conditions: conditionConfigs, + }, + }), + ), + on( + fromActions.updateSampleConditionsConfigs, + (state, { conditionConfigs }): UserState => ({ + ...state, + settings: { + ...state.settings, + fe_sample_table_conditions: conditionConfigs, + }, }), ), ); diff --git a/src/app/state-management/selectors/datasets.selectors.spec.ts b/src/app/state-management/selectors/datasets.selectors.spec.ts index a2db2f5737..340cbd0cb3 100644 --- a/src/app/state-management/selectors/datasets.selectors.spec.ts +++ b/src/app/state-management/selectors/datasets.selectors.spec.ts @@ -290,7 +290,7 @@ describe("test dataset selectors", () => { it("should return the fullfacet params", () => { const fullfacet = fromDatasetSelectors.selectFullfacetParams.projector( initialDatasetState, - initialUserState.filters, + initialUserState.settings.fe_dataset_table_filters, ); const fullfacetKeys = Object.keys(fullfacet); expect(fullfacet.facets).toEqual([ diff --git a/src/app/state-management/selectors/files.selectors.spec.ts b/src/app/state-management/selectors/files.selectors.spec.ts index d391e6c966..3a2846251a 100644 --- a/src/app/state-management/selectors/files.selectors.spec.ts +++ b/src/app/state-management/selectors/files.selectors.spec.ts @@ -1,5 +1,5 @@ import * as fromSelectors from "./files.selectors"; -import { selectTablesSettings } from "./user.selectors"; +import { selectSettings } from "./user.selectors"; import { GenericFilters } from "state-management/models"; import { mockOrigDatablock as origDatablock } from "shared/MockStubs"; import { FilesState } from "state-management/state/files.store"; @@ -50,12 +50,16 @@ describe("Files Selectors", () => { fromSelectors.selectFilesWithCountAndTableSettings.projector( fromSelectors.selectAllOrigDatablocks.projector(initialFilesState), fromSelectors.selectOrigDatablocksCount.projector(initialFilesState), - selectTablesSettings.projector(initialUserState), + selectSettings.projector(initialUserState), ), ).toEqual({ origDatablocks: [], count: 0, - tablesSettings: {}, + tablesSettings: { + filesTable: { + columns: initialUserState.settings.fe_file_table_columns, + }, + }, }); }); }); diff --git a/src/app/state-management/selectors/files.selectors.ts b/src/app/state-management/selectors/files.selectors.ts index 280563cace..b14ec2321f 100644 --- a/src/app/state-management/selectors/files.selectors.ts +++ b/src/app/state-management/selectors/files.selectors.ts @@ -1,6 +1,6 @@ import { createFeatureSelector, createSelector } from "@ngrx/store"; import { FilesState } from "state-management/state/files.store"; -import { selectTablesSettings } from "./user.selectors"; +import { selectSettings } from "./user.selectors"; const selectFilesState = createFeatureSelector("files"); @@ -22,10 +22,14 @@ export const selectOrigDatablocksCount = createSelector( export const selectFilesWithCountAndTableSettings = createSelector( selectAllOrigDatablocks, selectOrigDatablocksCount, - selectTablesSettings, - (origDatablocks, count, tablesSettings) => ({ + selectSettings, + (origDatablocks, count, settings) => ({ origDatablocks, count, - tablesSettings, + tablesSettings: { + filesTable: { + columns: settings.fe_file_table_columns, + }, + }, }), ); diff --git a/src/app/state-management/selectors/instruments.selectors.spec.ts b/src/app/state-management/selectors/instruments.selectors.spec.ts index 13a9dd3e2a..f45b7f5861 100644 --- a/src/app/state-management/selectors/instruments.selectors.spec.ts +++ b/src/app/state-management/selectors/instruments.selectors.spec.ts @@ -81,12 +81,16 @@ describe("Instrument Selectors", () => { fromSelectors.selectInstrumentsCount.projector( initialInstrumentState, ), - fromUserSelectors.selectTablesSettings.projector(initialUserState), + fromUserSelectors.selectSettings.projector(initialUserState), ), ).toEqual({ instruments: [], count: 0, - tablesSettings: {}, + tablesSettings: { + instrumentsTable: { + columns: initialUserState.settings.fe_instrument_table_columns, + }, + }, }); }); diff --git a/src/app/state-management/selectors/instruments.selectors.ts b/src/app/state-management/selectors/instruments.selectors.ts index fb4ffb074c..88fc0423c6 100644 --- a/src/app/state-management/selectors/instruments.selectors.ts +++ b/src/app/state-management/selectors/instruments.selectors.ts @@ -1,6 +1,6 @@ import { createFeatureSelector, createSelector } from "@ngrx/store"; import { InstrumentState } from "state-management/state/instruments.store"; -import { selectTablesSettings } from "./user.selectors"; +import { selectSettings } from "./user.selectors"; const selectInstrumentState = createFeatureSelector("instruments"); @@ -38,12 +38,16 @@ export const selectInstrumentsPerPage = createSelector( export const selectInstrumentsWithCountAndTableSettings = createSelector( selectInstruments, selectInstrumentsCount, - selectTablesSettings, - (instruments, count, tablesSettings) => { + selectSettings, + (instruments, count, settings) => { return { instruments, count, - tablesSettings, + tablesSettings: { + instrumentsTable: { + columns: settings.fe_instrument_table_columns, + }, + }, }; }, ); diff --git a/src/app/state-management/selectors/proposals.selectors.spec.ts b/src/app/state-management/selectors/proposals.selectors.spec.ts index 9381c96d85..ae479b3c62 100644 --- a/src/app/state-management/selectors/proposals.selectors.spec.ts +++ b/src/app/state-management/selectors/proposals.selectors.spec.ts @@ -2,6 +2,7 @@ import * as fromSelectors from "./proposals.selectors"; import { ProposalsState } from "state-management/state/proposals.store"; import { createMock } from "shared/MockStubs"; import { ProposalClass } from "@scicatproject/scicat-sdk-ts-angular"; +import { TableColumn, Settings } from "state-management/models"; const proposal = createMock({ proposalId: "testId", @@ -320,20 +321,36 @@ describe("Proposal Selectors", () => { { proposalId: "p1", instrumentIds: ["i1"] } as any, ]; const count = 1; - const tablesSettings = { col: "v" }; + + const proposalColumns: TableColumn[] = [ + { name: "proposalId", enabled: true, order: 0, type: "standard" }, + ]; + + const settings: Settings = { + tapeCopies: "", + datasetCount: 25, + jobCount: 25, + darkTheme: false, + fe_proposal_table_columns: proposalColumns, + }; + const hasFetchedSettings = true; expect( fromSelectors.selectProposalsWithCountAndTableSettings.projector( proposalsSample, count, - tablesSettings, hasFetchedSettings, + settings, ), ).toEqual({ proposals: proposalsSample, count, - tablesSettings, + tablesSettings: { + proposalsTable: { + columns: settings.fe_proposal_table_columns, + }, + }, hasFetchedSettings, }); }); diff --git a/src/app/state-management/selectors/proposals.selectors.ts b/src/app/state-management/selectors/proposals.selectors.ts index b511b4bd8e..a30ae0318e 100644 --- a/src/app/state-management/selectors/proposals.selectors.ts +++ b/src/app/state-management/selectors/proposals.selectors.ts @@ -1,9 +1,6 @@ import { createSelector, createFeatureSelector } from "@ngrx/store"; import { ProposalsState } from "../state/proposals.store"; -import { - selectHasFetchedSettings, - selectTablesSettings, -} from "./user.selectors"; +import { selectHasFetchedSettings, selectSettings } from "./user.selectors"; import { selectInstrumentWithIdAndLabel } from "./instruments.selectors"; const selectProposalsState = createFeatureSelector("proposals"); @@ -197,9 +194,15 @@ export const selectDatasetsQueryParams = createSelector( export const selectProposalsWithCountAndTableSettings = createSelector( selectEnrichedProposals, selectProposalsCount, - selectTablesSettings, selectHasFetchedSettings, - (proposals, count, tablesSettings, hasFetchedSettings) => { + selectSettings, + (proposals, count, hasFetchedSettings, settings) => { + const tablesSettings = { + proposalsTable: { + columns: settings.fe_proposal_table_columns, + }, + }; + return { proposals, count, diff --git a/src/app/state-management/selectors/samples.selectors.spec.ts b/src/app/state-management/selectors/samples.selectors.spec.ts index a8d00f426d..202418cc32 100644 --- a/src/app/state-management/selectors/samples.selectors.spec.ts +++ b/src/app/state-management/selectors/samples.selectors.spec.ts @@ -204,7 +204,7 @@ describe("Sample Selectors", () => { initialSampleState.sampleFilters.text, initialSampleState.metadataKeys, initialSampleState.sampleFilters.characteristics, - initialUserState.tablesSettings, + initialUserState.settings, initialSampleState.samplesCount, false, //hasAppliedFilters ), @@ -220,7 +220,11 @@ describe("Sample Selectors", () => { textFilter: "test", metadataKeys: [], characteristicsFilter: [], - tableSettings: {}, + tableSettings: { + samplesTable: { + columns: initialUserState.settings.fe_sample_table_columns, + }, + }, count: 0, hasAppliedFilters: false, }); diff --git a/src/app/state-management/selectors/samples.selectors.ts b/src/app/state-management/selectors/samples.selectors.ts index 909a2b2d80..a6adf42e6d 100644 --- a/src/app/state-management/selectors/samples.selectors.ts +++ b/src/app/state-management/selectors/samples.selectors.ts @@ -1,6 +1,6 @@ import { createFeatureSelector, createSelector } from "@ngrx/store"; import { SampleState } from "state-management/state/samples.store"; -import { selectCurrentUser, selectTablesSettings } from "./user.selectors"; +import { selectCurrentUser, selectSettings } from "./user.selectors"; const selectSampleState = createFeatureSelector("samples"); @@ -113,7 +113,7 @@ export const selectSampleDashboardPageViewModel = createSelector( selectTextFilter, selectMetadataKeys, selectCharacteristicsFilter, - selectTablesSettings, + selectSettings, selectSamplesCount, selectHasAppliedFilters, ( @@ -124,7 +124,7 @@ export const selectSampleDashboardPageViewModel = createSelector( textFilter, metadataKeys, characteristicsFilter, - tableSettings, + settings, count, hasAppliedFilters, ) => ({ @@ -135,7 +135,11 @@ export const selectSampleDashboardPageViewModel = createSelector( textFilter, metadataKeys, characteristicsFilter, - tableSettings, + tableSettings: { + samplesTable: { + columns: settings.fe_sample_table_columns, + }, + }, count, hasAppliedFilters, }), diff --git a/src/app/state-management/selectors/user.selectors.spec.ts b/src/app/state-management/selectors/user.selectors.spec.ts index 7c818c9a1a..98d5b01e4c 100644 --- a/src/app/state-management/selectors/user.selectors.spec.ts +++ b/src/app/state-management/selectors/user.selectors.spec.ts @@ -52,6 +52,54 @@ const settings: Settings = { datasetCount: 25, jobCount: 25, darkTheme: false, + fe_dataset_table_columns: [ + { name: "datasetName", order: 1, type: "standard", enabled: true }, + ], + fe_dataset_table_filters: [ + { + key: "creationLocation", + label: "Location", + type: "multiSelect", + description: "Filter by creation location on the dataset", + enabled: true, + }, + { + key: "pid", + label: "Pid", + type: "text", + description: "Filter by dataset pid", + enabled: true, + }, + { + key: "ownerGroup", + label: "Group", + type: "multiSelect", + description: "Filter by owner group of the dataset", + enabled: true, + }, + { + key: "type", + label: "Type", + type: "multiSelect", + description: "Filter by dataset type", + enabled: true, + }, + { + key: "keywords", + label: "Keyword", + type: "multiSelect", + description: "Filter by keywords in the dataset", + enabled: true, + }, + { + key: "creationTime", + label: "Creation Time", + type: "dateRange", + description: "Filter by creation time of the dataset", + enabled: true, + }, + ], + fe_dataset_table_conditions: [], }; export const initialUserState: UserState = { @@ -118,7 +166,6 @@ export const initialUserState: UserState = { ], conditions: [], - tablesSettings: {}, hasFetchedSettings: false, }; @@ -243,9 +290,9 @@ describe("User Selectors", () => { describe("selectColumns", () => { it("should select columns", () => { - expect(fromSelectors.selectColumns.projector(initialUserState)).toEqual([ - { name: "datasetName", order: 1, type: "standard", enabled: true }, - ]); + expect(fromSelectors.selectColumns.projector(initialUserState)).toEqual( + initialUserState.settings.fe_dataset_table_columns, + ); }); }); diff --git a/src/app/state-management/selectors/user.selectors.ts b/src/app/state-management/selectors/user.selectors.ts index 34013309ae..334b6d4a2f 100644 --- a/src/app/state-management/selectors/user.selectors.ts +++ b/src/app/state-management/selectors/user.selectors.ts @@ -91,22 +91,22 @@ export const selectIsLoading = createSelector( export const selectColumns = createSelector( selectUserState, - (state) => state.columns, + (state) => state.settings.fe_dataset_table_columns, ); -export const selectTablesSettings = createSelector( +export const selectFilters = createSelector( selectUserState, - (state) => state.tablesSettings, + (state) => state.settings.fe_dataset_table_filters, ); -export const selectFilters = createSelector( +export const selectConditions = createSelector( selectUserState, - (state) => state.filters, + (state) => state.settings.fe_dataset_table_conditions || [], ); -export const selectConditions = createSelector( +export const selectSampleConditions = createSelector( selectUserState, - (state) => state.conditions, + (state) => state.settings.fe_sample_table_conditions || [], ); export const selectSampleDialogPageViewModel = createSelector( @@ -153,7 +153,7 @@ export const selectHasFetchedSettings = createSelector( export const selectColumnsWithHasFetchedSettings = createSelector( selectUserState, (state) => ({ - columns: state.columns, + columns: state.settings.fe_dataset_table_columns, hasFetchedSettings: state.hasFetchedSettings, }), ); diff --git a/src/app/state-management/state/user.store.ts b/src/app/state-management/state/user.store.ts index e7a910aff3..9e01a3c661 100644 --- a/src/app/state-management/state/user.store.ts +++ b/src/app/state-management/state/user.store.ts @@ -24,7 +24,6 @@ export interface FilterConfig { export interface ConditionConfig { condition: ScientificCondition; enabled: boolean; - conditionType?: "datasets" | "samples"; } // NOTE It IS ok to make up a state of other sub states @@ -48,8 +47,6 @@ export interface UserState { columns: TableColumn[]; - tablesSettings: object; - filters: FilterConfig[]; conditions: ConditionConfig[]; @@ -73,6 +70,15 @@ export const initialUserState: UserState = { datasetCount: 25, jobCount: 25, darkTheme: false, + fe_dataset_table_columns: [], + fe_dataset_table_filters: [], + fe_dataset_table_conditions: [], + fe_proposal_table_columns: [], + fe_proposal_table_filters: [], + fe_sample_table_columns: [], + fe_sample_table_conditions: [], + fe_instrument_table_columns: [], + fe_file_table_columns: [], }, // TODO sync with server settings? message: undefined, @@ -132,6 +138,4 @@ export const initialUserState: UserState = { ], conditions: [], - - tablesSettings: {}, };