@@ -9,7 +9,7 @@ import { Constructor } from '@framework/Constructor'
9
9
import { Entity, getToString, is, Lite, liteKey, MList, SelectorMessage, toLite, translated } from '@framework/Signum.Entities'
10
10
import { getQueryKey, getEnumInfo, QueryTokenString, tryGetTypeInfos, timeToString, toFormatWithFixes } from '@framework/Reflection'
11
11
import {
12
-
FilterOption, OrderOption, QueryRequest, QueryToken, SubTokensOptions, ResultTable, OrderRequest, OrderType, FilterOptionParsed, hasAggregate, ColumnOption, withoutAggregate, FilterConditionOption, QueryDescription, FindOptions, withoutPinned
12
+
FilterOption, OrderOption, QueryRequest, QueryToken, SubTokensOptions, ResultTable, OrderRequest, OrderType, FilterOptionParsed, hasAggregate, ColumnOption, withoutAggregate, FilterConditionOption, QueryDescription, FindOptions, withoutPinned, SystemTime
13
13
} from '@framework/FindOptions'
14
14
import { AuthClient } from '../Signum.Authorization/AuthClient'
15
15
import ChartButton from './ChartButton'
@@ -27,7 +27,7 @@ import { Dic, softCast } from '@framework/Globals';
27
27
import { colorInterpolators, colorSchemes } from './ColorPalette/ColorUtils';
28
28
import { getColorInterpolation } from './D3Scripts/Components/ChartUtils';
29
29
import { UserQueryEntity } from '../Signum.UserQueries/Signum.UserQueries';
30
-
import { ChartColumnEmbedded, ChartColumnType, ChartParameterEmbedded, ChartParameterType, ChartPermission, ChartRequestModel, ChartScriptSymbol, D3ChartScript, GoogleMapsChartScript, HtmlChartScript, SpecialParameterType, SvgMapsChartScript } from './Signum.Chart';
30
+
import { ChartColumnEmbedded, ChartColumnType, ChartParameterEmbedded, ChartParameterType, ChartPermission, ChartRequestModel, ChartScriptSymbol, ChartTimeSeriesEmbedded, D3ChartScript, GoogleMapsChartScript, HtmlChartScript, SpecialParameterType, SvgMapsChartScript } from './Signum.Chart';
31
31
import { IChartBase, UserChartEntity } from './UserChart/Signum.Chart.UserChart';
32
32
import { UserChartPartHandler } from './Dashboard/View/UserChartPart';
33
33
import SelectorModal from '@framework/SelectorModal';
@@ -516,12 +516,23 @@ export namespace ChartClient {
516
516
return clone;
517
517
}
518
518
519
-
519
+
export function cloneChartTimeSeries(ts : ChartTimeSeriesEmbedded | null): ChartTimeSeriesEmbedded | null {
520
+
if(!ts)
521
+
return null;
522
+
return ChartTimeSeriesEmbedded.New({
523
+
timeSeriesStep: ts.timeSeriesStep,
524
+
timeSeriesUnit: ts.timeSeriesUnit,
525
+
startDate: ts.startDate,
526
+
endDate: ts.endDate,
527
+
timeSeriesMaxRowsPerStep: ts.timeSeriesMaxRowsPerStep});
528
+
}
529
+
520
530
export interface ChartOptions {
521
531
queryName: any,
522
532
chartScript?: string,
523
533
maxRows?: number | null,
524
534
groupResults?: boolean,
535
+
timeSeries?: ChartTimeSeriesEmbedded | null | undefined;
525
536
filterOptions?: (FilterOption | null | undefined)[];
526
537
orderOptions?: (OrderOption | null | undefined)[];
527
538
columnOptions?: (ChartColumnOption | null | undefined)[];
@@ -575,6 +586,7 @@ export namespace ChartClient {
575
586
queryName: cr.queryKey,
576
587
chartScript: cr.chartScript?.key.after(".") ?? undefined,
577
588
maxRows: cr.maxRows,
589
+
timeSeries: cloneChartTimeSeries(cr.chartTimeSeries),
578
590
filterOptions: Finder.toFilterOptions(cr.filterOptions),
579
591
columnOptions: cr.columns.map(co => ({
580
592
token: co.element.token && co.element.token.tokenString,
@@ -610,15 +622,17 @@ export namespace ChartClient {
610
622
maxRows:
611
623
co.maxRows === null ? "null" :
612
624
co.maxRows === undefined || co.maxRows == Decoder.DefaultMaxRows ? undefined : co.maxRows,
613
-
groupResults: co.groupResults,
625
+
groupResults: co.groupResults,
614
626
userChart: userChart && liteKey(userChart)
615
627
};
616
628
629
+
encodeTimeSeries(query, co.timeSeries);
617
630
Finder.Encoder.encodeFilters(query, co.filterOptions?.notNull());
618
631
Finder.Encoder.encodeOrders(query, co.orderOptions?.notNull());
619
632
encodeParameters(query, co.parameters?.notNull());
620
633
621
634
encodeColumn(query, co.columnOptions?.notNull());
635
+
622
636
623
637
return `/chart/${getQueryKey(co.queryName)}?` + QueryString.stringify(query);
624
638
@@ -639,6 +653,17 @@ export namespace ChartClient {
639
653
if (parameters)
640
654
parameters.map((p, i) => query["param" + i] = scapeTilde(p.name!) + "~" + scapeTilde(p.value!));
641
655
}
656
+
657
+
export function encodeTimeSeries(query: any, ts: ChartTimeSeriesEmbedded | null | undefined): void {
658
+
if (ts)
659
+
{
660
+
query['systemTimeStartDate'] = ts.startDate;
661
+
query['systemTimeEndDate'] = ts.endDate;
662
+
query['timeSeriesStep'] = ts.timeSeriesStep;
663
+
query['timeSeriesUnit'] = ts.timeSeriesUnit;
664
+
query['timeSeriesMaxRowsPerStep'] = ts.timeSeriesMaxRowsPerStep;
665
+
}
666
+
}
642
667
}
643
668
644
669
export module Decoder {
@@ -658,8 +683,10 @@ export namespace ChartClient {
658
683
const oos = Finder.Decoder.decodeOrders(query);
659
684
oos.forEach(oo => completer.request(oo.token.toString(), SubTokensOptions.CanElement | SubTokensOptions.CanAggregate));
660
685
686
+
const ts = Decoder.decodeTimeSeries(query);
687
+
661
688
const cols = Decoder.decodeColumns(query);
662
-
cols.map(a => a.element.token).filter(te => te != undefined).forEach(te => completer.request(te!.tokenString!, SubTokensOptions.CanAggregate | SubTokensOptions.CanElement));
689
+
cols.map(a => a.element.token).filter(te => te != undefined).forEach(te => completer.request(te!.tokenString!, SubTokensOptions.CanAggregate | SubTokensOptions.CanElement | (ts ? SubTokensOptions.CanTimeSeries : 0)));
663
690
664
691
return completer.finished().then(() => {
665
692
@@ -677,6 +704,7 @@ export namespace ChartClient {
677
704
filterOptions: fos.map(fo => completer.toFilterOptionParsed(fo)),
678
705
columns: cols,
679
706
parameters: Decoder.decodeParameters(query),
707
+
chartTimeSeries: ts,
680
708
});
681
709
682
710
synchronizeColumns(chartRequest, cr);
@@ -731,16 +759,40 @@ export namespace ChartClient {
731
759
})
732
760
}));
733
761
}
762
+
763
+
export function decodeTimeSeries(query: any): ChartTimeSeriesEmbedded | null {
764
+
if(!query.timeSeriesUnit)
765
+
return null;
766
+
return ChartTimeSeriesEmbedded.New({
767
+
startDate: query.systemTimeStartDate,
768
+
endDate: query.systemTimeEndDate,
769
+
timeSeriesUnit: query.timeSeriesUnit,
770
+
timeSeriesStep: query.timeSeriesStep && parseInt(query.timeSeriesStep),
771
+
timeSeriesMaxRowsPerStep: query.timeSeriesMaxRowsPerStep && parseInt(query.timeSeriesMaxRowsPerStep),
772
+
});
773
+
}
734
774
}
735
775
736
776
737
777
export module API {
738
778
739
779
export function getRequest(request: ChartRequestModel): QueryRequest {
780
+
var ts = request.chartTimeSeries;
781
+
var systemTime : SystemTime | undefined = ts == null ? undefined :
782
+
softCast<SystemTime>({
783
+
joinMode: 'AllCompatible',
784
+
mode : 'TimeSeries',
785
+
timeSeriesStep: ts.timeSeriesStep!,
786
+
timeSeriesUnit: ts.timeSeriesUnit!,
787
+
startDate: ts.startDate!,
788
+
endDate: ts.endDate!,
789
+
timeSeriesMaxRowsPerStep: ts.timeSeriesMaxRowsPerStep!,
790
+
});
740
791
741
792
return {
742
793
queryKey: request.queryKey,
743
794
groupResults: hasAggregates(request),
795
+
systemTime: systemTime,
744
796
filters: Finder.toFilterRequests(request.filterOptions),
745
797
columns: request.columns.map(mle => mle.element).filter(cce => cce.token != null).map(co => ({ token: co.token!.token!.fullKey }) as ColumnRequest),
746
798
orders: request.columns.filter(mle => mle.element.orderByType != null && mle.element.token != null).orderBy(mle => mle.element.orderByIndex).map(mle => ({ token: mle.element.token!.token!.fullKey, orderType: mle.element.orderByType! }) as OrderRequest),
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4