mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Ensure chart summary is more detailed then linked summary
Summary: When a summary table is linked, the column used for linking needs to be included as a group-by column (or the linking can’t work). A good example is here: https://templates-s.getgrist.com/doc/investment-research/p/4 This was request by Dmitry here: https://grist.slack.com/archives/C04AYS9JF/p1649400119930389?thread_ts=1649338496.915759&cid=C04AYS9JF (2nd point) Test Plan: Added new nbrowser test case. Reviewers: georgegevoian Reviewed By: georgegevoian Subscribers: georgegevoian Differential Revision: https://phab.getgrist.com/D3408
This commit is contained in:
parent
e4d47a2f3c
commit
f17e31c023
@ -11,7 +11,7 @@ import {ColumnRec, ViewFieldRec, ViewSectionRec} from 'app/client/models/DocMode
|
|||||||
import {reportError} from 'app/client/models/errors';
|
import {reportError} from 'app/client/models/errors';
|
||||||
import {KoSaveableObservable, ObjObservable, setSaveValue} from 'app/client/models/modelUtil';
|
import {KoSaveableObservable, ObjObservable, setSaveValue} from 'app/client/models/modelUtil';
|
||||||
import {SortedRowSet} from 'app/client/models/rowset';
|
import {SortedRowSet} from 'app/client/models/rowset';
|
||||||
import {toPageWidget} from 'app/client/ui/PageWidgetPicker';
|
import {IPageWidget, toPageWidget} from 'app/client/ui/PageWidgetPicker';
|
||||||
import {cssLabel, cssRow, cssSeparator} from 'app/client/ui/RightPanel';
|
import {cssLabel, cssRow, cssSeparator} from 'app/client/ui/RightPanel';
|
||||||
import {cssFieldEntry, cssFieldLabel, IField, VisibleFieldsConfig } from 'app/client/ui/VisibleFieldsConfig';
|
import {cssFieldEntry, cssFieldLabel, IField, VisibleFieldsConfig } from 'app/client/ui/VisibleFieldsConfig';
|
||||||
import {IconName} from 'app/client/ui2018/IconList';
|
import {IconName} from 'app/client/ui2018/IconList';
|
||||||
@ -34,6 +34,7 @@ import defaults = require('lodash/defaults');
|
|||||||
import defaultsDeep = require('lodash/defaultsDeep');
|
import defaultsDeep = require('lodash/defaultsDeep');
|
||||||
import isNumber = require('lodash/isNumber');
|
import isNumber = require('lodash/isNumber');
|
||||||
import sum = require('lodash/sum');
|
import sum = require('lodash/sum');
|
||||||
|
import union = require('lodash/union');
|
||||||
import {Annotations, Config, Data, Datum, ErrorBar, Layout, LayoutAxis, Margin} from 'plotly.js';
|
import {Annotations, Config, Data, Datum, ErrorBar, Layout, LayoutAxis, Margin} from 'plotly.js';
|
||||||
|
|
||||||
|
|
||||||
@ -882,6 +883,7 @@ export class ChartConfig extends GrainJSDisposable {
|
|||||||
const pageWidget = toPageWidget(this._section);
|
const pageWidget = toPageWidget(this._section);
|
||||||
pageWidget.summarize = !this._isSummaryTable();
|
pageWidget.summarize = !this._isSummaryTable();
|
||||||
pageWidget.columns = this._getColumnIds(colIds);
|
pageWidget.columns = this._getColumnIds(colIds);
|
||||||
|
this._ensureValidLinkingIfAny(pageWidget);
|
||||||
const newSection = await this._gristDoc.saveViewSection(this._section, pageWidget);
|
const newSection = await this._gristDoc.saveViewSection(this._section, pageWidget);
|
||||||
return ChartConfig._instanceMap.get(newSection)!;
|
return ChartConfig._instanceMap.get(newSection)!;
|
||||||
}
|
}
|
||||||
@ -889,9 +891,21 @@ export class ChartConfig extends GrainJSDisposable {
|
|||||||
private async _setGroupByColumns(groupByCols: string[]) {
|
private async _setGroupByColumns(groupByCols: string[]) {
|
||||||
const pageWidget = toPageWidget(this._section);
|
const pageWidget = toPageWidget(this._section);
|
||||||
pageWidget.columns = this._getColumnIds(groupByCols);
|
pageWidget.columns = this._getColumnIds(groupByCols);
|
||||||
|
this._ensureValidLinkingIfAny(pageWidget);
|
||||||
return this._gristDoc.saveViewSection(this._section, pageWidget);
|
return this._gristDoc.saveViewSection(this._section, pageWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If section is linked to a summary table, makes sure that pageWidget describes a summary table
|
||||||
|
// that is more detailed than the source summary table. Function mutates `pageWidget`.
|
||||||
|
private _ensureValidLinkingIfAny(pageWidget: IPageWidget) {
|
||||||
|
if (!pageWidget.summarize) { return; }
|
||||||
|
if (!this._section.linkSrcSection().getRowId()) { return; }
|
||||||
|
const srcPageWidget = toPageWidget(this._section.linkSrcSection());
|
||||||
|
pageWidget.columns = union(pageWidget.columns, srcPageWidget.columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns column ids corresponding to each colIds in the selected table (or corresponding summary
|
||||||
|
// source table, if select table is a summary table).
|
||||||
private _getColumnIds(colIds: string[]) {
|
private _getColumnIds(colIds: string[]) {
|
||||||
const cols = this._isSummaryTable() ?
|
const cols = this._isSummaryTable() ?
|
||||||
this._section.table().summarySource().columns().all() :
|
this._section.table().summarySource().columns().all() :
|
||||||
|
Loading…
Reference in New Issue
Block a user