@finos/legend-data-cube
Version:
126 lines • 6.34 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { action, makeObservable, observable, override } from 'mobx';
import {} from '../../core/DataCubeSnapshot.js';
import { _findCol, _toCol } from '../../core/model/DataCubeColumn.js';
import { DataCubeEditorColumnsSelectorColumnState, DataCubeEditorColumnsSelectorState, } from './DataCubeEditorColumnsSelectorState.js';
import {} from '../../core/model/DataCubeConfiguration.js';
export class DataCubeEditorBasicColumnsSelectorState extends DataCubeEditorColumnsSelectorState {
showHiddenColumns = false;
constructor(editor, options) {
super(editor, options);
makeObservable(this, {
availableColumnsForDisplay: override,
selectedColumnsForDisplay: override,
showHiddenColumns: observable,
setShowHiddenColumns: action,
});
}
cloneColumn(column) {
return new DataCubeEditorColumnsSelectorColumnState(column.name, column.type);
}
get availableColumns() {
return [
...this._editor.sourceColumns,
...this._editor.leafExtendColumns,
...this._editor.groupExtendColumns,
].map((col) => new DataCubeEditorColumnsSelectorColumnState(col.name, col.type));
}
get availableColumnsForDisplay() {
return super.availableColumnsForDisplay.filter((column) => this.showHiddenColumns ||
!this._editor.columnProperties.getColumnConfiguration(column.name)
.hideFromView);
}
get selectedColumnsForDisplay() {
return super.selectedColumnsForDisplay.filter((column) => this.showHiddenColumns ||
!this._editor.columnProperties.getColumnConfiguration(column.name)
.hideFromView);
}
setShowHiddenColumns(val) {
this.showHiddenColumns = val;
}
}
/**
* This panel allows selection of columns (including extended columns) for the query.
*
* NOTE: this does not really represent the `select()` function in the query. Think about
* this column selection more intuitively from users' perspective, i.e. what columns they
* wish to see in the grid. Whereas the `select()` function actually impact the data fetching
* which should be computed based on more than just information coming from this panels, such
* as horizontal pivots and vertical pivots, since regardless of whether user choose to see
* those columns or not, they still need to be fetched.
*/
export class DataCubeEditorColumnsPanelState {
_editor;
selector;
constructor(editor) {
makeObservable(this, {
applySnaphot: action,
});
this._editor = editor;
this.selector = new DataCubeEditorBasicColumnsSelectorState(editor, {
onChange: (selector) => {
const selectedColumnConfigurations = selector.selectedColumns.map((col) => this._editor.columnProperties.getColumnConfiguration(col.name));
const unselectedColumnConfigurations = this._editor.columnProperties.columns.filter((col) => !selectedColumnConfigurations.includes(col));
// update selection config in column configurations and apply the
// order of selected columns in the column configurations list (unselected
// columns are kept in the same order and placed after all selected ones)
selectedColumnConfigurations.forEach((col) => col.setIsSelected(true));
unselectedColumnConfigurations.forEach((col) => col.setIsSelected(false));
this._editor.columnProperties.setColumns([
...selectedColumnConfigurations,
...unselectedColumnConfigurations,
]);
},
});
}
/**
* NOTE: Ideally, this should be called on every changes made to the column selection, but to
* give user some room for error, i.e. when user accidentally select/deselect columns, we would
* not propagate this change until user either leaves this panel or explicitly applies changes
* (i.e. publishes a new snapshot)
*/
propagateChanges() {
this._editor.sorts.adaptPropagatedChanges();
}
applySnaphot(snapshot, configuration) {
this.selector.setSelectedColumns(this._editor.columnProperties.columns
// extract from the configuration since it specifies the order of columns
// there taking into account group-level extended columns
.filter((col) => col.isSelected)
.map((col) => {
const column = this.selector.getColumn(col.name);
return new DataCubeEditorColumnsSelectorColumnState(column.name, column.type);
}));
}
buildSnapshot(newSnapshot, baseSnapshot) {
this.propagateChanges();
// NOTE: these columns make up just part of the set of columns we want to fetch with `select()`.
// Subsequently, we need to include columns used for horizontal pivots and vertical pivots.
//
// Note that this is a fairly simple way to determine the set of columns to fetch, but we have a
// compile check to ensure the columns needed by parts we don't account for well such as group-level
// extended columns must be properly included.
//
// Maybe, we can improve this later by having an algorithm to determine the set of columns needed
// by each extended column.
newSnapshot.data.selectColumns = this.selector.selectedColumns
// filter out group-level extended columns since these columns are technically not selectable
.filter((col) => !_findCol(this._editor.groupExtendColumns, col.name))
.map(_toCol);
}
}
//# sourceMappingURL=DataCubeEditorColumnsPanelState.js.map