Skip to content

Commit 75c713f

Browse files
committed
Merge remote-tracking branch 'AlejandroCano/CustomDrilldowns' into CustomDrilldown
# Conflicts: # Signum.React/Scripts/SearchControl/SearchControlLoaded.tsx
2 parents c681882 + 911be53 commit 75c713f

File tree

10 files changed

+79
-89
lines changed

10 files changed

+79
-89
lines changed

Signum.React.Extensions/Chart/ChartClient.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,6 @@ export module Encoder {
487487
return p.element.value != defaultParameterValue(scriptParam, c?.token && c.token.token);
488488
})
489489
.map(p => ({ name: p.element.name, value: p.element.value }) as ChartParameterOption),
490-
customDrilldowns: cr.customDrilldowns,
491490
};
492491
}
493492

Signum.React.Extensions/Chart/Templates/ChartRenderer.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DomUtils, Dic } from '@framework/Globals'
33
import * as Finder from '@framework/Finder'
44
import * as Navigator from '@framework/Navigator'
55
import { FilterOptionParsed, ColumnOption, hasAggregate, withoutAggregate, FilterOption, FindOptions, withoutPinned } from '@framework/FindOptions'
6-
import { ChartRequestModel, ChartMessage } from '../Signum.Entities.Chart'
6+
import { ChartRequestModel, ChartMessage, UserChartEntity } from '../Signum.Entities.Chart'
77
import * as ChartClient from '../ChartClient'
88
import { toFilterOptions } from '@framework/Finder';
99

@@ -19,8 +19,10 @@ import { toAbsoluteUrl } from '@framework/AppContext'
1919
import * as UserQueryClient from '../../UserQueries/UserQueryClient'
2020
import { DynamicTypeConditionSymbolEntity } from '../../Dynamic/Signum.Entities.Dynamic'
2121
import { extractFindOptions } from '../../UserQueries/UserQueryClient'
22+
import { Lite } from '@framework/Signum.Entities'
2223

2324
export interface ChartRendererProps {
25+
userChart?: Lite<UserChartEntity>;
2426
chartRequest: ChartRequestModel;
2527
loading: boolean;
2628

@@ -56,7 +58,7 @@ export default function ChartRenderer(p: ChartRendererProps) {
5658
data={p.data}
5759
dashboardFilter={p.dashboardFilter}
5860
loading={p.loading}
59-
onDrillDown={p.onDrillDown ?? ((r, e) => handleDrillDown(r, e, p.lastChartRequest!, p.autoRefresh ? p.onReload : undefined))}
61+
onDrillDown={p.onDrillDown ?? ((r, e) => handleDrillDown(r, e, p.lastChartRequest!, p.userChart, p.autoRefresh ? p.onReload : undefined))}
6062
onBackgroundClick={p.onBackgroundClick}
6163
parameters={parameters}
6264
onReload={p.onReload}
@@ -69,12 +71,12 @@ export default function ChartRenderer(p: ChartRendererProps) {
6971
);
7072
}
7173

72-
export function handleDrillDown(r: ChartRow, e: React.MouseEvent | MouseEvent, cr: ChartRequestModel, onReload?: () => void) {
74+
export function handleDrillDown(r: ChartRow, e: React.MouseEvent | MouseEvent, cr: ChartRequestModel, uc?: Lite<UserChartEntity>, onReload?: () => void) {
7375

7476
e.stopPropagation();
7577
var newWindow = e.ctrlKey || e.button == 1;
7678

77-
UserQueryClient.onDrilldownUserChart(cr, r, { openInNewTab: newWindow, onReload })
79+
UserQueryClient.onDrilldownUserChart(cr, r, uc, { openInNewTab: newWindow, onReload })
7880
.then(done => {
7981
if (done == false) {
8082
if (r.entity) {

Signum.React.Extensions/Chart/Templates/ChartRendererCombined.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DomUtils, Dic } from '@framework/Globals'
33
import * as Finder from '@framework/Finder'
44
import * as Navigator from '@framework/Navigator'
55
import { FilterOptionParsed, ColumnOption, hasAggregate, withoutAggregate, FilterOption, FindOptions, withoutPinned } from '@framework/FindOptions'
6-
import { ChartRequestModel, ChartMessage } from '../Signum.Entities.Chart'
6+
import { ChartRequestModel, ChartMessage, UserChartEntity } from '../Signum.Entities.Chart'
77
import * as ChartClient from '../ChartClient'
88
import { toFilterOptions } from '@framework/Finder';
99

@@ -17,6 +17,7 @@ import { TypeInfo } from '@framework/Reflection'
1717
import { FullscreenComponent } from './FullscreenComponent'
1818
import { handleDrillDown } from './ChartRenderer'
1919
import { ReactChartCombined } from '../D3Scripts/Components/ReactChartCombined'
20+
import { Lite } from '@framework/Signum.Entities'
2021

2122

2223

@@ -28,6 +29,7 @@ export interface ChartRendererCombinedProps {
2829
}
2930

3031
export interface ChartRendererCombinedInfo {
32+
userChart: Lite<UserChartEntity>;
3133
chartRequest: ChartRequestModel;
3234
chartScript: ChartScript;
3335
data?: ChartClient.ChartTable;
@@ -41,7 +43,7 @@ export default function ChartRendererCombined(p: ChartRendererCombinedProps) {
4143
<ErrorBoundary deps={p.infos.map(a => a.data)}>
4244
<ReactChartCombined useSameScale={p.useSameScale} minHeigh={p.minHeigh} infos={p.infos.map(info => ({
4345
chartRequest: info.chartRequest,
44-
onDrillDown: (r, e) => handleDrillDown(r, e, info.chartRequest),
46+
onDrillDown: (r, e) => handleDrillDown(r, e, info.chartRequest, info.userChart),
4547
parameters: ChartClient.API.getParameterWithDefault(info.chartRequest, info.chartScript),
4648
data: info.data,
4749
memo: info.memo

Signum.React.Extensions/Chart/Templates/ChartRequestView.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { ChartScript, cleanedChartRequest, getCustomDrilldownsFindOptions, hasAg
2424
import { useForceUpdate, useAPI } from '@framework/Hooks'
2525
import { AutoFocus } from '@framework/Components/AutoFocus';
2626
import PinnedFilterBuilder from '@framework/SearchControl/PinnedFilterBuilder';
27-
import { EntityStrip } from '../../../Signum.React/Scripts/Lines';
2827

2928
interface ChartRequestViewProps {
3029
chartRequest: ChartRequestModel;
@@ -58,19 +57,6 @@ export default function ChartRequestView(p: ChartRequestViewProps) {
5857
loading: boolean;
5958
} | undefined>(undefined);
6059

61-
const hasAggregatesRef = React.useRef<boolean>(hasAggregates(p.chartRequest));
62-
63-
React.useEffect(() => {
64-
const ha = hasAggregates(p.chartRequest);
65-
if (ha == hasAggregatesRef.current)
66-
return;
67-
68-
hasAggregatesRef.current = ha;
69-
p.chartRequest.customDrilldowns = [];
70-
p.chartRequest.modified = true;
71-
forceUpdate();
72-
});
73-
7460
const queryDescription = useAPI(signal => p.chartRequest ? Finder.getQueryDescription(p.chartRequest.queryKey) : Promise.resolve(undefined),
7561
[p.chartRequest.queryKey]);
7662

@@ -215,11 +201,6 @@ export default function ChartRequestView(p: ChartRequestViewProps) {
215201
forceUpdate();
216202
}}
217203
/>
218-
<EntityStrip ctx={tc.subCtx(e => e.customDrilldowns)}
219-
findOptions={getCustomDrilldownsFindOptions(p.chartRequest.queryKey, qd, hasAggregatesRef.current)}
220-
avoidDuplicates={true}
221-
vertical={true}
222-
iconStart={true} />
223204
</>}
224205
</div>
225206
<div className="sf-query-button-bar btn-toolbar mb-2">
@@ -239,7 +220,7 @@ export default function ChartRequestView(p: ChartRequestViewProps) {
239220
<div className="sf-chart-tab-container">
240221
<Tabs id="chartResultTabs" key={showChartSettings + ""}>
241222
<Tab eventKey="chart" title={ChartMessage.Chart.niceToString()}>
242-
<ChartRenderer chartRequest={cr} loading={loading == true} autoRefresh={false} lastChartRequest={result?.lastChartRequest} data={result?.chartResult.chartTable} minHeight={null} />
223+
<ChartRenderer userChart={p.userChart} chartRequest={cr} loading={loading == true} autoRefresh={false} lastChartRequest={result?.lastChartRequest} data={result?.chartResult.chartTable} minHeight={null} />
243224
</Tab>
244225
{result &&
245226
<Tab eventKey="data" title={<span>{ChartMessage.Data.niceToString()} (

Signum.React.Extensions/Chart/UserChart/UserChartClient.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export module Converter {
7373
export async function applyUserChart(cr: ChartRequestModel, uc: UserChartEntity, entity?: Lite<Entity>): Promise<ChartRequestModel> {
7474
cr.chartScript = uc.chartScript;
7575
cr.maxRows = uc.maxRows;
76-
cr.customDrilldowns = uc.customDrilldowns;
7776

7877
const filters = await UserAssetsClient.API.parseFilters({
7978
queryKey: uc.query.key,

Signum.React.Extensions/Chart/UserChart/UserChartMenu.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ export default function UserChartMenu(p: UserChartMenuProps) {
153153
filters: qfs.map(f => newMListElement(UserAssetClient.Converter.toQueryFilterEmbedded(f))),
154154
columns: cr.columns.map(a => newMListElement(JSON.parse(JSON.stringify(a.element)))),
155155
parameters: cr.parameters.map(p => newMListElement(JSON.parse(JSON.stringify(p.element)))),
156-
customDrilldowns: cr.customDrilldowns.map(p => newMListElement(JSON.parse(JSON.stringify(p.element)))),
157156
});
158157

159158
return uc;

Signum.React.Extensions/Dashboard/View/CombinedUserChartPart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ export default function CombinedUserChartPart(p: PanelPartContentProps<CombinedU
175175
onReload={e => { e.preventDefault(); c.makeQuery!(); }}
176176
/>) :
177177
<ChartRendererCombined
178-
infos={infos.map(c => ({ chartRequest: c.chartRequest!, data: c.result?.chartTable, chartScript: c.chartScript!, memo: c.memo }))}
178+
infos={infos.map(c => ({ userChart: toLite(c.userChart, true), chartRequest: c.chartRequest!, data: c.result?.chartTable, chartScript: c.chartScript!, memo: c.memo }))}
179179
onReload={e => { infos.forEach(a => a.makeQuery!()) }}
180180
useSameScale={p.content.useSameScale}
181181
minHeigh={p.content.minHeight}

Signum.React.Extensions/Dashboard/View/UserChartPart.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,14 @@ export default function UserChartPart(p: PanelPartContentProps<UserChartPartEnti
148148
);
149149
}
150150

151-
const result = resultOrError?.result;
152-
153151
function handleReload(e?: React.MouseEvent<any>) {
154152
e?.preventDefault();
155153
reloadQuery();
156154
}
157155

156+
const result = resultOrError?.result;
157+
const userChart = toLite(p.content.userChart, true);
158+
158159
return (
159160
<div className="d-flex flex-column flex-grow-1">
160161
<PinnedFilterBuilder filterOptions={chartRequest.filterOptions} onFiltersChanged={() => reloadQuery()} pinnedFilterVisible={fop => fop.dashboardBehaviour == null} extraSmall={true} />
@@ -175,6 +176,7 @@ export default function UserChartPart(p: PanelPartContentProps<UserChartPartEnti
175176
onReload={handleReload}
176177
/>) :
177178
<ChartRenderer
179+
userChart={userChart}
178180
chartRequest={chartRequest}
179181
lastChartRequest={chartRequest}
180182
data={result?.chartTable}
@@ -189,7 +191,7 @@ export default function UserChartPart(p: PanelPartContentProps<UserChartPartEnti
189191
onDrillDown={(row, e) => {
190192
e.stopPropagation();
191193
if (e.altKey || p.partEmbedded.interactionGroup == null)
192-
handleDrillDown(row, e, chartRequest, handleReload);
194+
handleDrillDown(row, e, chartRequest, userChart, handleReload);
193195
else {
194196
const dashboardFilter = p.dashboardController.filters.get(p.partEmbedded);
195197
const filterRow = toDashboardFilterRow(row, chartRequest);

Signum.React.Extensions/UserQueries/UserQueryClient.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import SearchControlLoaded, { OnDrilldownOptions } from '@framework/SearchContro
2727
import SelectorModal from '@framework/SelectorModal';
2828
import { DynamicTypeConditionSymbolEntity } from '../Dynamic/Signum.Entities.Dynamic';
2929
import { Dic } from '@framework/Globals';
30-
import { ChartRequestModel } from '../Chart/Signum.Entities.Chart';
30+
import { ChartRequestModel, UserChartEntity } from '../Chart/Signum.Entities.Chart';
3131
import { ChartRow, hasAggregates } from '../Chart/ChartClient';
3232

3333
export function start(options: { routes: RouteObject[] }) {
@@ -164,22 +164,28 @@ export async function onDrilldownSearchControl(scl: SearchControlLoaded, row: Re
164164
return drilldownToUserQuery(val.fo, val.uq, options);
165165
}
166166

167-
export function onDrilldownUserChart(cr: ChartRequestModel, row: ChartRow, options?: OnDrilldownOptions): Promise<boolean | undefined> {
168-
if (cr.customDrilldowns.length == 0)
169-
return Promise.resolve(false);
167+
export async function onDrilldownUserChart(cr: ChartRequestModel, row: ChartRow, uc?: Lite<UserChartEntity>, options?: OnDrilldownOptions): Promise<boolean | undefined> {
168+
if (uc == null)
169+
return false;
170+
171+
await Navigator.API.fetchAndRemember(uc);
172+
173+
if (uc.entity!.customDrilldowns.length == 0 || hasAggregates(uc.entity!) != hasAggregates(cr))
174+
return false;
170175

176+
debugger;
171177
const fo = extractFindOptions(cr, row);
172178
const entity = row.entity ?? (hasAggregates(cr) ? undefined : fo.filterOptions?.singleOrNull(f => f?.token == "Entity")?.value);
173-
174179
const filters = fo.filterOptions?.notNull();
175-
const promise = entity ? onDrilldownEntity(cr.customDrilldowns, entity) : onDrilldownGroup(cr.customDrilldowns, filters);
176-
return promise
177-
.then(val => {
178-
if (!val)
179-
return undefined;
180180

181-
return drilldownToUserQuery(val.fo, val.uq, options);
182-
});
181+
const val = entity ?
182+
await onDrilldownEntity(uc.entity!.customDrilldowns, entity) :
183+
await onDrilldownGroup(uc.entity!.customDrilldowns, filters);
184+
185+
if (!val)
186+
return undefined;
187+
188+
return drilldownToUserQuery(val.fo, val.uq, options);
183189
}
184190

185191
export function onDrilldownEntity(items: MList<Lite<Entity>>, entity: Lite<Entity>) {

0 commit comments

Comments
 (0)