@thoughtspot/ts-chart-sdk 0.0.2-alpha.7 → 0.0.2-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ts-chart-sdk.d.ts +19 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/types/answer-column.types.d.ts +1 -0
- package/lib/types/answer-column.types.d.ts.map +1 -1
- package/lib/utils/date-formatting.d.ts +19 -0
- package/lib/utils/date-formatting.d.ts.map +1 -0
- package/lib/utils/date-formatting.js +56 -0
- package/lib/utils/date-formatting.js.map +1 -0
- package/lib/utils/date-formatting.spec.d.ts +2 -0
- package/lib/utils/date-formatting.spec.d.ts.map +1 -0
- package/lib/utils/date-formatting.spec.js +123 -0
- package/lib/utils/date-formatting.spec.js.map +1 -0
- package/package.json +3 -1
- package/src/index.ts +1 -0
- package/src/types/answer-column.types.ts +7 -0
- package/src/utils/date-formatting.spec.ts +166 -0
- package/src/utils/date-formatting.ts +109 -0
package/dist/ts-chart-sdk.d.ts
CHANGED
|
@@ -299,6 +299,7 @@ export interface ChartColumn {
|
|
|
299
299
|
};
|
|
300
300
|
aggregationType?: ColumnAggregationType;
|
|
301
301
|
customOrder?: Array<string>;
|
|
302
|
+
calenderGuid?: string;
|
|
302
303
|
}
|
|
303
304
|
|
|
304
305
|
export enum ChartToTSEvent {
|
|
@@ -672,6 +673,24 @@ export enum ParameterValueType {
|
|
|
672
673
|
Range = "RANGE"
|
|
673
674
|
}
|
|
674
675
|
|
|
676
|
+
export interface CustomCalendarDate {
|
|
677
|
+
v: {
|
|
678
|
+
s: number;
|
|
679
|
+
e: number;
|
|
680
|
+
};
|
|
681
|
+
d: string;
|
|
682
|
+
}
|
|
683
|
+
export const isDateColumn: (col: ChartColumn) => boolean;
|
|
684
|
+
export const isAttribute: (col: ChartColumn) => boolean;
|
|
685
|
+
export const getCustomCalendarGuidFromColumn: (col: ChartColumn) => string | undefined;
|
|
686
|
+
export const isDateNumColumn: (col: ChartColumn) => boolean;
|
|
687
|
+
export const isDateFamilyColumn: (col: ChartColumn) => boolean;
|
|
688
|
+
export const isTimeColumn: (col: ChartColumn) => boolean;
|
|
689
|
+
export const hasCustomCalendar: (col: ChartColumn) => boolean;
|
|
690
|
+
export function getStartEpoch(date: CustomCalendarDate): number | null;
|
|
691
|
+
export function getDisplayString(date: CustomCalendarDate): string | null;
|
|
692
|
+
export function dateFormatter(dataValue: any, col: ChartColumn): string | null;
|
|
693
|
+
|
|
675
694
|
export const getMinRangeValue: (metric: ConditionalMetric) => number | undefined | null;
|
|
676
695
|
export const getMaxRangeValue: (metric: ConditionalMetric) => number | undefined | null;
|
|
677
696
|
export const isConditionSatisfied: (metric: ConditionalMetric, parameters?: Parameter[], lhsColValue?: string | number | null, rhsColValue?: string | number | null) => boolean;
|
package/lib/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export * from './types/ts-to-chart-event.types';
|
|
|
7
7
|
export * from './main/custom-chart-context';
|
|
8
8
|
export * from './react/use-custom-chart-context';
|
|
9
9
|
export * from './types/conditional-formatting.types';
|
|
10
|
+
export * from './utils/date-formatting';
|
|
10
11
|
export * from './utils/conditional-formatting/conditional-formatting';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uDAAuD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uDAAuD,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -7,5 +7,6 @@ export * from './types/ts-to-chart-event.types';
|
|
|
7
7
|
export * from './main/custom-chart-context';
|
|
8
8
|
export * from './react/use-custom-chart-context';
|
|
9
9
|
export * from './types/conditional-formatting.types';
|
|
10
|
+
export * from './utils/date-formatting';
|
|
10
11
|
export * from './utils/conditional-formatting/conditional-formatting';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uDAAuD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uDAAuD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"answer-column.types.d.ts","sourceRoot":"","sources":["../../src/types/answer-column.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE9E,oBAAY,UAAU;IAClB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAKD,oBAAY,QAAQ;IAChB,OAAO,IAAA;IAEP,IAAI,IAAA;IAEJ,IAAI,IAAA;IAEJ,KAAK,IAAA;IACL,KAAK,IAAA;IACL,KAAK,IAAA;IACL,MAAM,IAAA;IAEN,IAAI,IAAA;IACJ,SAAS,IAAA;IACT,IAAI,IAAA;IAEJ,QAAQ,KAAA;CACX;AAED,oBAAY,gBAAgB;IACxB,SAAS,IAAA;IACT,KAAK,IAAA;IACL,MAAM,IAAA;IACN,OAAO,IAAA;IACP,SAAS,IAAA;IACT,MAAM,IAAA;IACN,MAAM,IAAA;IACN,IAAI,IAAA;IACJ,WAAW,IAAA;IACX,WAAW,IAAA;IACX,YAAY,KAAA;IACZ,cAAc,KAAA;IACd,WAAW,KAAA;IACX,aAAa,KAAA;IACb,eAAe,KAAA;IACf,YAAY,KAAA;IACZ,gBAAgB,KAAA;IAChB,aAAa,KAAA;IACb,eAAe,KAAA;CAClB;AAOD,oBAAY,UAAU;IAClB,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,UAAU,IAAA;IACV,QAAQ,IAAA;CACX;AAOD,oBAAY,kBAAkB;IAC1B,WAAW,IAAA;IACX,MAAM,IAAA;IACN,QAAQ,IAAA;CACX;AAOD,oBAAY,qBAAqB;IAC7B,SAAS,IAAA;IACT,kBAAkB,IAAA;IAClB,oBAAoB,IAAA;IACpB,0BAA0B,IAAA;IAC1B,qBAAqB,IAAA;IACrB,OAAO,IAAA;IACP,KAAK,IAAA;IACL,cAAc,IAAA;IACd,kBAAkB,IAAA;IAClB,gBAAgB,IAAA;IAChB,cAAc,KAAA;IACd,cAAc,KAAA;IACd,cAAc,KAAA;IACd,MAAM,KAAA;IACN,GAAG,KAAA;IACH,MAAM,KAAA;IACN,GAAG,KAAA;IACH,cAAc,KAAA;IACd,YAAY,KAAA;IACZ,UAAU,KAAA;IACV,UAAU,KAAA;IACV,UAAU,KAAA;IACV,IAAI,KAAA;IACJ,UAAU,KAAA;IACV,IAAI,KAAA;IACJ,eAAe,KAAA;IACf,qBAAqB,KAAA;IACrB,qBAAqB,KAAA;IACrB,0BAA0B,KAAA;IAC1B,uBAAuB,KAAA;IACvB,oBAAoB,KAAA;IACpB,uBAAuB,KAAA;IACvB,qBAAqB,KAAA;IACrB,aAAa,KAAA;IACb,GAAG,KAAA;IACH,UAAU,KAAA;IACV,QAAQ,KAAA;CACX;AAOD,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IAMzB,MAAM,EAAE,MAAM,CAAC;IAMf,OAAO,EAAE,MAAM,CAAC;CACnB;AAQD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,UAAU,CAAC;IAOjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,cAAc,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAMxB,EAAE,EAAE,MAAM,CAAC;IAMX,IAAI,EAAE,MAAM,CAAC;IAMb,IAAI,EAAE,UAAU,CAAC;IAQjB,UAAU,EAAE,gBAAgB,CAAC;IAO7B,QAAQ,EAAE,QAAQ,CAAC;IAqBnB,MAAM,CAAC,EAAE,YAAY,CAAC;IAOtB,gBAAgB,CAAC,EAAE;QACf,qBAAqB,CAAC,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;KACxD,CAAC;IAOF,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAQxC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"answer-column.types.d.ts","sourceRoot":"","sources":["../../src/types/answer-column.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE9E,oBAAY,UAAU;IAClB,OAAO,IAAA;IACP,OAAO,IAAA;IACP,SAAS,IAAA;CACZ;AAKD,oBAAY,QAAQ;IAChB,OAAO,IAAA;IAEP,IAAI,IAAA;IAEJ,IAAI,IAAA;IAEJ,KAAK,IAAA;IACL,KAAK,IAAA;IACL,KAAK,IAAA;IACL,MAAM,IAAA;IAEN,IAAI,IAAA;IACJ,SAAS,IAAA;IACT,IAAI,IAAA;IAEJ,QAAQ,KAAA;CACX;AAED,oBAAY,gBAAgB;IACxB,SAAS,IAAA;IACT,KAAK,IAAA;IACL,MAAM,IAAA;IACN,OAAO,IAAA;IACP,SAAS,IAAA;IACT,MAAM,IAAA;IACN,MAAM,IAAA;IACN,IAAI,IAAA;IACJ,WAAW,IAAA;IACX,WAAW,IAAA;IACX,YAAY,KAAA;IACZ,cAAc,KAAA;IACd,WAAW,KAAA;IACX,aAAa,KAAA;IACb,eAAe,KAAA;IACf,YAAY,KAAA;IACZ,gBAAgB,KAAA;IAChB,aAAa,KAAA;IACb,eAAe,KAAA;CAClB;AAOD,oBAAY,UAAU;IAClB,IAAI,IAAA;IACJ,OAAO,IAAA;IACP,UAAU,IAAA;IACV,QAAQ,IAAA;CACX;AAOD,oBAAY,kBAAkB;IAC1B,WAAW,IAAA;IACX,MAAM,IAAA;IACN,QAAQ,IAAA;CACX;AAOD,oBAAY,qBAAqB;IAC7B,SAAS,IAAA;IACT,kBAAkB,IAAA;IAClB,oBAAoB,IAAA;IACpB,0BAA0B,IAAA;IAC1B,qBAAqB,IAAA;IACrB,OAAO,IAAA;IACP,KAAK,IAAA;IACL,cAAc,IAAA;IACd,kBAAkB,IAAA;IAClB,gBAAgB,IAAA;IAChB,cAAc,KAAA;IACd,cAAc,KAAA;IACd,cAAc,KAAA;IACd,MAAM,KAAA;IACN,GAAG,KAAA;IACH,MAAM,KAAA;IACN,GAAG,KAAA;IACH,cAAc,KAAA;IACd,YAAY,KAAA;IACZ,UAAU,KAAA;IACV,UAAU,KAAA;IACV,UAAU,KAAA;IACV,IAAI,KAAA;IACJ,UAAU,KAAA;IACV,IAAI,KAAA;IACJ,eAAe,KAAA;IACf,qBAAqB,KAAA;IACrB,qBAAqB,KAAA;IACrB,0BAA0B,KAAA;IAC1B,uBAAuB,KAAA;IACvB,oBAAoB,KAAA;IACpB,uBAAuB,KAAA;IACvB,qBAAqB,KAAA;IACrB,aAAa,KAAA;IACb,GAAG,KAAA;IACH,UAAU,KAAA;IACV,QAAQ,KAAA;CACX;AAOD,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IAMzB,MAAM,EAAE,MAAM,CAAC;IAMf,OAAO,EAAE,MAAM,CAAC;CACnB;AAQD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,UAAU,CAAC;IAOjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAOjB,cAAc,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAMxB,EAAE,EAAE,MAAM,CAAC;IAMX,IAAI,EAAE,MAAM,CAAC;IAMb,IAAI,EAAE,UAAU,CAAC;IAQjB,UAAU,EAAE,gBAAgB,CAAC;IAO7B,QAAQ,EAAE,QAAQ,CAAC;IAqBnB,MAAM,CAAC,EAAE,YAAY,CAAC;IAOtB,gBAAgB,CAAC,EAAE;QACf,qBAAqB,CAAC,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;KACxD,CAAC;IAOF,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAQxC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAO5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ChartColumn } from '../types/answer-column.types';
|
|
2
|
+
export interface CustomCalendarDate {
|
|
3
|
+
v: {
|
|
4
|
+
s: number;
|
|
5
|
+
e: number;
|
|
6
|
+
};
|
|
7
|
+
d: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const isDateColumn: (col: ChartColumn) => boolean;
|
|
10
|
+
export declare const isAttribute: (col: ChartColumn) => boolean;
|
|
11
|
+
export declare const getCustomCalendarGuidFromColumn: (col: ChartColumn) => string | undefined;
|
|
12
|
+
export declare const isDateNumColumn: (col: ChartColumn) => boolean;
|
|
13
|
+
export declare const isDateFamilyColumn: (col: ChartColumn) => boolean;
|
|
14
|
+
export declare const isTimeColumn: (col: ChartColumn) => boolean;
|
|
15
|
+
export declare const hasCustomCalendar: (col: ChartColumn) => boolean;
|
|
16
|
+
export declare function getStartEpoch(date: CustomCalendarDate): number | null;
|
|
17
|
+
export declare function getDisplayString(date: CustomCalendarDate): string | null;
|
|
18
|
+
export declare function dateFormatter(dataValue: any, col: ChartColumn): string | null;
|
|
19
|
+
//# sourceMappingURL=date-formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatting.d.ts","sourceRoot":"","sources":["../../src/utils/date-formatting.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,WAAW,EAId,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IAC/B,CAAC,EAAE;QACC,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,CAAC,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,YAAY,QAAS,WAAW,YACkC,CAAC;AAEhF,eAAO,MAAM,WAAW,QAAS,WAAW,YACP,CAAC;AAEtC,eAAO,MAAM,+BAA+B,QAAS,WAAW,uBAC5C,CAAC;AAiBrB,eAAO,MAAM,eAAe,QAAS,WAAW,KAAG,OAElD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,WAAW,KAAG,OAErD,CAAC;AAEF,eAAO,MAAM,YAAY,QAAS,WAAW,YAE5C,CAAC;AAQF,eAAO,MAAM,iBAAiB,QAAS,WAAW,KAAG,OACgB,CAAC;AAQtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAKrE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAKxE;AASD,wBAAgB,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,iBAW7D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { DateTime } from 'luxon';
|
|
3
|
+
import { ColumnTimeBucket, ColumnType, DataType, } from '../types/answer-column.types';
|
|
4
|
+
export const isDateColumn = (col) => DataType[col.dataType] === 'DATE' || DataType[col.dataType] === 'DATE_TIME';
|
|
5
|
+
export const isAttribute = (col) => col.type === ColumnType.ATTRIBUTE;
|
|
6
|
+
export const getCustomCalendarGuidFromColumn = (col) => col.calenderGuid;
|
|
7
|
+
const isDateNumTimeBucket = (col) => {
|
|
8
|
+
return [
|
|
9
|
+
ColumnTimeBucket.HOUR_OF_DAY,
|
|
10
|
+
ColumnTimeBucket.DAY_OF_WEEK,
|
|
11
|
+
ColumnTimeBucket.DAY_OF_MONTH,
|
|
12
|
+
ColumnTimeBucket.DAY_OF_QUARTER,
|
|
13
|
+
ColumnTimeBucket.DAY_OF_YEAR,
|
|
14
|
+
ColumnTimeBucket.WEEK_OF_MONTH,
|
|
15
|
+
ColumnTimeBucket.WEEK_OF_QUARTER,
|
|
16
|
+
ColumnTimeBucket.WEEK_OF_YEAR,
|
|
17
|
+
ColumnTimeBucket.MONTH_OF_QUARTER,
|
|
18
|
+
ColumnTimeBucket.MONTH_OF_YEAR,
|
|
19
|
+
ColumnTimeBucket.QUARTER_OF_YEAR,
|
|
20
|
+
].includes(col.timeBucket);
|
|
21
|
+
};
|
|
22
|
+
export const isDateNumColumn = (col) => {
|
|
23
|
+
return isAttribute(col) && isDateNumTimeBucket(col);
|
|
24
|
+
};
|
|
25
|
+
export const isDateFamilyColumn = (col) => {
|
|
26
|
+
return isDateColumn(col) || isDateNumColumn(col);
|
|
27
|
+
};
|
|
28
|
+
export const isTimeColumn = (col) => {
|
|
29
|
+
return DataType[col.dataType] === 'TIME';
|
|
30
|
+
};
|
|
31
|
+
export const hasCustomCalendar = (col) => isDateFamilyColumn(col) && !!getCustomCalendarGuidFromColumn(col);
|
|
32
|
+
export function getStartEpoch(date) {
|
|
33
|
+
if (_.has(date, 'v') && _.has(date.v, 's')) {
|
|
34
|
+
return date.v.s;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
export function getDisplayString(date) {
|
|
39
|
+
if (_.has(date, 'd')) {
|
|
40
|
+
return date.d;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
export function dateFormatter(dataValue, col) {
|
|
45
|
+
if (hasCustomCalendar(col)) {
|
|
46
|
+
if (getDisplayString(dataValue)) {
|
|
47
|
+
return getDisplayString(dataValue);
|
|
48
|
+
}
|
|
49
|
+
const startEpoch = getStartEpoch(dataValue);
|
|
50
|
+
return startEpoch !== null
|
|
51
|
+
? DateTime.fromMillis(startEpoch * 1000).toFormat('dd-MM-yyyy')
|
|
52
|
+
: null;
|
|
53
|
+
}
|
|
54
|
+
return DateTime.fromMillis(dataValue * 1000).toFormat('dd-MM-yyyy');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=date-formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatting.js","sourceRoot":"","sources":["../../src/utils/date-formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatting.spec.d.ts","sourceRoot":"","sources":["../../src/utils/date-formatting.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { ColumnTimeBucket, ColumnType, DataType, } from '../types/answer-column.types';
|
|
2
|
+
import { dateFormatter, getCustomCalendarGuidFromColumn, getDisplayString, getStartEpoch, hasCustomCalendar, isAttribute, isDateColumn, isDateFamilyColumn, isDateNumColumn, isTimeColumn, } from './date-formatting';
|
|
3
|
+
describe('date-formatting', () => {
|
|
4
|
+
let col;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
col = {
|
|
7
|
+
id: 'testId',
|
|
8
|
+
name: 'test',
|
|
9
|
+
type: ColumnType.MEASURE,
|
|
10
|
+
timeBucket: ColumnTimeBucket.AUTO,
|
|
11
|
+
dataType: DataType.UNKNOWN,
|
|
12
|
+
calenderGuid: '12345',
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
test('isDateColumn should return true for DATE data type', () => {
|
|
16
|
+
col.dataType = DataType.DATE;
|
|
17
|
+
expect(isDateColumn(col)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
test('isDateColumn should return true for DATE_TIME data type', () => {
|
|
20
|
+
col.dataType = DataType.DATE_TIME;
|
|
21
|
+
expect(isDateColumn(col)).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
test('isAttribute should return true for ATTRIBUTE column type', () => {
|
|
24
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
25
|
+
expect(isAttribute(col)).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
test('isAttribute should return false for non-ATTRIBUTE column type', () => {
|
|
28
|
+
col.type = ColumnType.MEASURE;
|
|
29
|
+
expect(isAttribute(col)).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
test('getCustomCalendarGuidFromColumn should return the calendarGuid', () => {
|
|
32
|
+
col.calenderGuid = '12345';
|
|
33
|
+
expect(getCustomCalendarGuidFromColumn(col)).toBe('12345');
|
|
34
|
+
});
|
|
35
|
+
test('isDateNumColumn should return true for ATTRIBUTE type with specific time buckets', () => {
|
|
36
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
37
|
+
col.timeBucket = ColumnTimeBucket.HOUR_OF_DAY;
|
|
38
|
+
expect(isDateNumColumn(col)).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
test('isDateNumColumn should return false for non-ATTRIBUTE type', () => {
|
|
41
|
+
col.type = ColumnType.MEASURE;
|
|
42
|
+
col.timeBucket = ColumnTimeBucket.DAY_OF_WEEK;
|
|
43
|
+
expect(isDateNumColumn(col)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
test('isDateFamilyColumn should return true for DATE data type', () => {
|
|
46
|
+
col.dataType = DataType.DATE;
|
|
47
|
+
expect(isDateFamilyColumn(col)).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
test('isDateFamilyColumn should return true for DATE_NUM column', () => {
|
|
50
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
51
|
+
col.timeBucket = ColumnTimeBucket.DAY_OF_WEEK;
|
|
52
|
+
expect(isDateFamilyColumn(col)).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
test('isTimeColumn should return true for TIME data type', () => {
|
|
55
|
+
col.dataType = DataType.TIME;
|
|
56
|
+
expect(isTimeColumn(col)).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
test('hasCustomCalendar should return true for date family columns with custom calendar', () => {
|
|
59
|
+
col.dataType = DataType.DATE;
|
|
60
|
+
col.calenderGuid = '12345';
|
|
61
|
+
expect(hasCustomCalendar(col)).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
test('getStartEpoch should return the start epoch from CustomCalendarDate', () => {
|
|
64
|
+
const date = {
|
|
65
|
+
v: { s: 12345, e: 12346 },
|
|
66
|
+
d: 'Custom_Date',
|
|
67
|
+
};
|
|
68
|
+
expect(getStartEpoch(date)).toBe(date.v.s);
|
|
69
|
+
});
|
|
70
|
+
test('getStartEpoch should return null if start epoch is not present', () => {
|
|
71
|
+
const date = { v: {}, d: '01-07-2021' };
|
|
72
|
+
expect(getStartEpoch(date)).toBe(null);
|
|
73
|
+
});
|
|
74
|
+
test('getDisplayString should return display string if present', () => {
|
|
75
|
+
const date = { v: { s: 1625097600, e: 1625184000 }, d: '01-07-2021' };
|
|
76
|
+
expect(getDisplayString(date)).toBe('01-07-2021');
|
|
77
|
+
});
|
|
78
|
+
test('getDisplayString should return null if display string is not present', () => {
|
|
79
|
+
const date = {
|
|
80
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
81
|
+
};
|
|
82
|
+
expect(getDisplayString(date)).toBe(null);
|
|
83
|
+
});
|
|
84
|
+
test('dateFormatter should return custom calendar display string if present', () => {
|
|
85
|
+
const dataValue = {
|
|
86
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
87
|
+
d: '01-07-2021',
|
|
88
|
+
};
|
|
89
|
+
col.dataType = DataType.DATE;
|
|
90
|
+
col.calenderGuid = '12345';
|
|
91
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
92
|
+
});
|
|
93
|
+
test('dateFormatter should return formatted date from start epoch if custom calendar display string is not present', () => {
|
|
94
|
+
const dataValue = {
|
|
95
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
96
|
+
};
|
|
97
|
+
col.dataType = DataType.DATE;
|
|
98
|
+
col.calenderGuid = '12345';
|
|
99
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
100
|
+
});
|
|
101
|
+
test('dateFormatter should return null if start epoch is not present', () => {
|
|
102
|
+
const dataValue = { v: { e: 1625184000 } };
|
|
103
|
+
col.dataType = DataType.DATE;
|
|
104
|
+
col.calenderGuid = '12345';
|
|
105
|
+
expect(dateFormatter(dataValue, col)).toBe(null);
|
|
106
|
+
});
|
|
107
|
+
test('dateFormatter should return formatted date for non-custom calendar column', () => {
|
|
108
|
+
const dataValue = 1625097600;
|
|
109
|
+
col.dataType = DataType.DATE;
|
|
110
|
+
col.calenderGuid = undefined;
|
|
111
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
112
|
+
});
|
|
113
|
+
test('dateFormatter should format the date based on custom calendar', () => {
|
|
114
|
+
col.dataType = DataType.DATE;
|
|
115
|
+
col.calenderGuid = '12345';
|
|
116
|
+
const date = {
|
|
117
|
+
v: { s: 12345, e: 12346 },
|
|
118
|
+
d: 'Custom_Date',
|
|
119
|
+
};
|
|
120
|
+
expect(dateFormatter(date, col)).toBe(date.d);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=date-formatting.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-formatting.spec.js","sourceRoot":"","sources":["../../src/utils/date-formatting.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thoughtspot/ts-chart-sdk",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.2-alpha.
|
|
4
|
+
"version": "0.0.2-alpha.8",
|
|
5
5
|
"module": "lib/index",
|
|
6
6
|
"main": "lib/index",
|
|
7
7
|
"types": "lib/index",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"@testing-library/react-hooks": "^7.0.2",
|
|
37
37
|
"@types/jest": "^27.0.3",
|
|
38
38
|
"@types/lodash": "4.14.175",
|
|
39
|
+
"@types/luxon": "^3.4.2",
|
|
39
40
|
"@types/node": "18.16.3",
|
|
40
41
|
"@types/react": "^17.0.2",
|
|
41
42
|
"@types/react-dom": "^17.0.11",
|
|
@@ -74,6 +75,7 @@
|
|
|
74
75
|
},
|
|
75
76
|
"dependencies": {
|
|
76
77
|
"lodash": "^4.17.21",
|
|
78
|
+
"luxon": "^3.4.4",
|
|
77
79
|
"promise-postmessage": "^3.5.0",
|
|
78
80
|
"react": "^17.0.2",
|
|
79
81
|
"react-dom": "^17.0.2"
|
package/src/index.ts
CHANGED
|
@@ -7,4 +7,5 @@ export * from './types/ts-to-chart-event.types';
|
|
|
7
7
|
export * from './main/custom-chart-context';
|
|
8
8
|
export * from './react/use-custom-chart-context';
|
|
9
9
|
export * from './types/conditional-formatting.types';
|
|
10
|
+
export * from './utils/date-formatting';
|
|
10
11
|
export * from './utils/conditional-formatting/conditional-formatting';
|
|
@@ -242,4 +242,11 @@ export interface ChartColumn {
|
|
|
242
242
|
* @version SDK: 0.1 | ThoughtSpot:
|
|
243
243
|
*/
|
|
244
244
|
customOrder?: Array<string>;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Guid of Custom calender for the column if defined in worksheet else null
|
|
248
|
+
*
|
|
249
|
+
* @version SDK: 0.1 | ThoughtSpot: sdcwdc
|
|
250
|
+
*/
|
|
251
|
+
calenderGuid?: string;
|
|
245
252
|
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file: Date Formatting Spec
|
|
3
|
+
*
|
|
4
|
+
* @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
|
|
5
|
+
*
|
|
6
|
+
* Copyright: ThoughtSpot Inc. 2023
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
ChartColumn,
|
|
11
|
+
ColumnTimeBucket,
|
|
12
|
+
ColumnType,
|
|
13
|
+
DataType,
|
|
14
|
+
} from '../types/answer-column.types';
|
|
15
|
+
import {
|
|
16
|
+
CustomCalendarDate,
|
|
17
|
+
dateFormatter,
|
|
18
|
+
getCustomCalendarGuidFromColumn,
|
|
19
|
+
getDisplayString,
|
|
20
|
+
getStartEpoch,
|
|
21
|
+
hasCustomCalendar,
|
|
22
|
+
isAttribute,
|
|
23
|
+
isDateColumn,
|
|
24
|
+
isDateFamilyColumn,
|
|
25
|
+
isDateNumColumn,
|
|
26
|
+
isTimeColumn,
|
|
27
|
+
} from './date-formatting';
|
|
28
|
+
|
|
29
|
+
describe('date-formatting', () => {
|
|
30
|
+
let col: ChartColumn;
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
col = {
|
|
33
|
+
id: 'testId',
|
|
34
|
+
name: 'test',
|
|
35
|
+
type: ColumnType.MEASURE,
|
|
36
|
+
timeBucket: ColumnTimeBucket.AUTO,
|
|
37
|
+
dataType: DataType.UNKNOWN,
|
|
38
|
+
calenderGuid: '12345',
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
test('isDateColumn should return true for DATE data type', () => {
|
|
42
|
+
col.dataType = DataType.DATE;
|
|
43
|
+
expect(isDateColumn(col)).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('isDateColumn should return true for DATE_TIME data type', () => {
|
|
47
|
+
col.dataType = DataType.DATE_TIME;
|
|
48
|
+
expect(isDateColumn(col)).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('isAttribute should return true for ATTRIBUTE column type', () => {
|
|
52
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
53
|
+
expect(isAttribute(col)).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('isAttribute should return false for non-ATTRIBUTE column type', () => {
|
|
57
|
+
col.type = ColumnType.MEASURE;
|
|
58
|
+
expect(isAttribute(col)).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('getCustomCalendarGuidFromColumn should return the calendarGuid', () => {
|
|
62
|
+
col.calenderGuid = '12345';
|
|
63
|
+
expect(getCustomCalendarGuidFromColumn(col)).toBe('12345');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('isDateNumColumn should return true for ATTRIBUTE type with specific time buckets', () => {
|
|
67
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
68
|
+
col.timeBucket = ColumnTimeBucket.HOUR_OF_DAY;
|
|
69
|
+
expect(isDateNumColumn(col)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('isDateNumColumn should return false for non-ATTRIBUTE type', () => {
|
|
73
|
+
col.type = ColumnType.MEASURE;
|
|
74
|
+
col.timeBucket = ColumnTimeBucket.DAY_OF_WEEK;
|
|
75
|
+
expect(isDateNumColumn(col)).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('isDateFamilyColumn should return true for DATE data type', () => {
|
|
79
|
+
col.dataType = DataType.DATE;
|
|
80
|
+
expect(isDateFamilyColumn(col)).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('isDateFamilyColumn should return true for DATE_NUM column', () => {
|
|
84
|
+
col.type = ColumnType.ATTRIBUTE;
|
|
85
|
+
col.timeBucket = ColumnTimeBucket.DAY_OF_WEEK;
|
|
86
|
+
expect(isDateFamilyColumn(col)).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('isTimeColumn should return true for TIME data type', () => {
|
|
90
|
+
col.dataType = DataType.TIME;
|
|
91
|
+
expect(isTimeColumn(col)).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('hasCustomCalendar should return true for date family columns with custom calendar', () => {
|
|
95
|
+
col.dataType = DataType.DATE;
|
|
96
|
+
col.calenderGuid = '12345';
|
|
97
|
+
expect(hasCustomCalendar(col)).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('getStartEpoch should return the start epoch from CustomCalendarDate', () => {
|
|
101
|
+
const date = {
|
|
102
|
+
v: { s: 12345, e: 12346 },
|
|
103
|
+
d: 'Custom_Date',
|
|
104
|
+
} as CustomCalendarDate;
|
|
105
|
+
expect(getStartEpoch(date)).toBe(date.v.s);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('getStartEpoch should return null if start epoch is not present', () => {
|
|
109
|
+
const date = { v: {}, d: '01-07-2021' } as CustomCalendarDate;
|
|
110
|
+
expect(getStartEpoch(date)).toBe(null);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('getDisplayString should return display string if present', () => {
|
|
114
|
+
const date = { v: { s: 1625097600, e: 1625184000 }, d: '01-07-2021' };
|
|
115
|
+
expect(getDisplayString(date)).toBe('01-07-2021');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('getDisplayString should return null if display string is not present', () => {
|
|
119
|
+
const date = {
|
|
120
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
121
|
+
} as CustomCalendarDate;
|
|
122
|
+
expect(getDisplayString(date)).toBe(null);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('dateFormatter should return custom calendar display string if present', () => {
|
|
126
|
+
const dataValue = {
|
|
127
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
128
|
+
d: '01-07-2021',
|
|
129
|
+
} as CustomCalendarDate;
|
|
130
|
+
col.dataType = DataType.DATE;
|
|
131
|
+
col.calenderGuid = '12345';
|
|
132
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test('dateFormatter should return formatted date from start epoch if custom calendar display string is not present', () => {
|
|
136
|
+
const dataValue = {
|
|
137
|
+
v: { s: 1625097600, e: 1625184000 },
|
|
138
|
+
} as CustomCalendarDate;
|
|
139
|
+
col.dataType = DataType.DATE;
|
|
140
|
+
col.calenderGuid = '12345';
|
|
141
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('dateFormatter should return null if start epoch is not present', () => {
|
|
145
|
+
const dataValue = { v: { e: 1625184000 } } as CustomCalendarDate;
|
|
146
|
+
col.dataType = DataType.DATE;
|
|
147
|
+
col.calenderGuid = '12345';
|
|
148
|
+
expect(dateFormatter(dataValue, col)).toBe(null);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('dateFormatter should return formatted date for non-custom calendar column', () => {
|
|
152
|
+
const dataValue = 1625097600;
|
|
153
|
+
col.dataType = DataType.DATE;
|
|
154
|
+
col.calenderGuid = undefined;
|
|
155
|
+
expect(dateFormatter(dataValue, col)).toBe('01-07-2021');
|
|
156
|
+
});
|
|
157
|
+
test('dateFormatter should format the date based on custom calendar', () => {
|
|
158
|
+
col.dataType = DataType.DATE;
|
|
159
|
+
col.calenderGuid = '12345';
|
|
160
|
+
const date = {
|
|
161
|
+
v: { s: 12345, e: 12346 },
|
|
162
|
+
d: 'Custom_Date',
|
|
163
|
+
} as CustomCalendarDate;
|
|
164
|
+
expect(dateFormatter(date, col)).toBe(date.d);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file: Date Formatting Utils
|
|
3
|
+
*
|
|
4
|
+
* @author Yashvardhan Nehra <yashvardhan.nehra@thoughtspot.com>
|
|
5
|
+
*
|
|
6
|
+
* Copyright: ThoughtSpot Inc. 2023
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import _ from 'lodash';
|
|
10
|
+
import { DateTime } from 'luxon';
|
|
11
|
+
import {
|
|
12
|
+
ChartColumn,
|
|
13
|
+
ColumnTimeBucket,
|
|
14
|
+
ColumnType,
|
|
15
|
+
DataType,
|
|
16
|
+
} from '../types/answer-column.types';
|
|
17
|
+
|
|
18
|
+
export interface CustomCalendarDate {
|
|
19
|
+
v: {
|
|
20
|
+
s: number;
|
|
21
|
+
e: number;
|
|
22
|
+
};
|
|
23
|
+
d: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const isDateColumn = (col: ChartColumn) =>
|
|
27
|
+
DataType[col.dataType] === 'DATE' || DataType[col.dataType] === 'DATE_TIME';
|
|
28
|
+
|
|
29
|
+
export const isAttribute = (col: ChartColumn) =>
|
|
30
|
+
col.type === ColumnType.ATTRIBUTE;
|
|
31
|
+
|
|
32
|
+
export const getCustomCalendarGuidFromColumn = (col: ChartColumn) =>
|
|
33
|
+
col.calenderGuid;
|
|
34
|
+
|
|
35
|
+
const isDateNumTimeBucket = (col: ChartColumn): boolean => {
|
|
36
|
+
return [
|
|
37
|
+
ColumnTimeBucket.HOUR_OF_DAY,
|
|
38
|
+
ColumnTimeBucket.DAY_OF_WEEK,
|
|
39
|
+
ColumnTimeBucket.DAY_OF_MONTH,
|
|
40
|
+
ColumnTimeBucket.DAY_OF_QUARTER,
|
|
41
|
+
ColumnTimeBucket.DAY_OF_YEAR,
|
|
42
|
+
ColumnTimeBucket.WEEK_OF_MONTH,
|
|
43
|
+
ColumnTimeBucket.WEEK_OF_QUARTER,
|
|
44
|
+
ColumnTimeBucket.WEEK_OF_YEAR,
|
|
45
|
+
ColumnTimeBucket.MONTH_OF_QUARTER,
|
|
46
|
+
ColumnTimeBucket.MONTH_OF_YEAR,
|
|
47
|
+
ColumnTimeBucket.QUARTER_OF_YEAR,
|
|
48
|
+
].includes(col.timeBucket);
|
|
49
|
+
};
|
|
50
|
+
export const isDateNumColumn = (col: ChartColumn): boolean => {
|
|
51
|
+
return isAttribute(col) && isDateNumTimeBucket(col);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const isDateFamilyColumn = (col: ChartColumn): boolean => {
|
|
55
|
+
return isDateColumn(col) || isDateNumColumn(col);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const isTimeColumn = (col: ChartColumn) => {
|
|
59
|
+
return DataType[col.dataType] === 'TIME';
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Determines if the given column has a custom calendar.
|
|
64
|
+
*
|
|
65
|
+
* @param col - The chart column to check.
|
|
66
|
+
* @returns True if the column is a date family column and has a custom calendar GUID, false otherwise.
|
|
67
|
+
*/
|
|
68
|
+
export const hasCustomCalendar = (col: ChartColumn): boolean =>
|
|
69
|
+
isDateFamilyColumn(col) && !!getCustomCalendarGuidFromColumn(col);
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Retrieves the start epoch from a custom calendar date.
|
|
73
|
+
*
|
|
74
|
+
* @param date - The custom calendar date object.
|
|
75
|
+
* @returns The start epoch time if present, null otherwise.
|
|
76
|
+
*/
|
|
77
|
+
export function getStartEpoch(date: CustomCalendarDate): number | null {
|
|
78
|
+
if (_.has(date, 'v') && _.has(date.v, 's')) {
|
|
79
|
+
return date.v.s;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function getDisplayString(date: CustomCalendarDate): string | null {
|
|
85
|
+
if (_.has(date, 'd')) {
|
|
86
|
+
return date.d;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Formats the date value based on the column's properties and custom calendar settings.
|
|
93
|
+
*
|
|
94
|
+
* @param dataValue - The date value to format.
|
|
95
|
+
* @param col - The chart column.
|
|
96
|
+
* @returns The formatted date string.
|
|
97
|
+
*/
|
|
98
|
+
export function dateFormatter(dataValue: any, col: ChartColumn) {
|
|
99
|
+
if (hasCustomCalendar(col)) {
|
|
100
|
+
if (getDisplayString(dataValue)) {
|
|
101
|
+
return getDisplayString(dataValue);
|
|
102
|
+
}
|
|
103
|
+
const startEpoch = getStartEpoch(dataValue);
|
|
104
|
+
return startEpoch !== null
|
|
105
|
+
? DateTime.fromMillis(startEpoch * 1000).toFormat('dd-MM-yyyy')
|
|
106
|
+
: null;
|
|
107
|
+
}
|
|
108
|
+
return DateTime.fromMillis(dataValue * 1000).toFormat('dd-MM-yyyy');
|
|
109
|
+
}
|