@levi-gemcommerce/analytics 1.0.0-dev.12 → 1.0.0-dev.14
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/esm/components/GTimePicker/GTimePicker.d.ts +17 -0
- package/dist/esm/components/GTimePicker/components/BaseTimePicker.d.ts +10 -0
- package/dist/esm/components/GTimePicker/components/CompareTimePicker.d.ts +5 -0
- package/dist/esm/components/GTimePicker/components/DateTimeFilterAddition.d.ts +2 -0
- package/dist/esm/components/GTimePicker/components/DateTimeFilterInputs.d.ts +9 -0
- package/dist/esm/components/GTimePicker/components/DateTimeFilters.d.ts +15 -0
- package/dist/esm/components/GTimePicker/components/MainTimePicker.d.ts +3 -0
- package/dist/esm/components/GTimePicker/components/index.d.ts +2 -0
- package/dist/esm/components/GTimePicker/constants/compareDateTimePicker.d.ts +12 -0
- package/dist/esm/components/GTimePicker/constants/datePicker.d.ts +14 -0
- package/dist/esm/components/GTimePicker/constants/index.d.ts +2 -0
- package/dist/esm/components/GTimePicker/constants/mainDataTimePicker.d.ts +14 -0
- package/dist/esm/components/GTimePicker/contexts/DateTimePickerProvider.d.ts +15 -0
- package/dist/esm/components/GTimePicker/contexts/index.d.ts +1 -0
- package/dist/esm/components/GTimePicker/helpers/date-range-info.d.ts +16 -0
- package/dist/esm/components/GTimePicker/helpers/index.d.ts +4 -0
- package/dist/esm/components/GTimePicker/helpers/parse-date.d.ts +24 -0
- package/dist/esm/components/GTimePicker/helpers/time-picker.d.ts +76 -0
- package/dist/esm/components/GTimePicker/helpers/version.d.ts +2 -0
- package/dist/esm/components/GTimePicker/hooks/index.d.ts +3 -0
- package/dist/esm/components/GTimePicker/hooks/useCompareDateTimePicker.d.ts +25 -0
- package/dist/esm/components/GTimePicker/hooks/useDateTimeFilter.d.ts +18 -0
- package/dist/esm/components/GTimePicker/hooks/useDateTimePicker.d.ts +30 -0
- package/dist/esm/components/GTimePicker/hooks/useVersionDateTimeFilters.d.ts +9 -0
- package/dist/esm/components/GTimePicker/index.d.ts +7 -0
- package/dist/esm/components/GTimePicker/types/index.d.ts +38 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/constants/breakdown-targets.d.ts +1 -1
- package/dist/esm/core/gemxql/builder/clauses/mode-query.d.ts +1 -1
- package/dist/esm/core/gemxql/helpers/getTimeDimension.d.ts +1 -1
- package/dist/esm/core/gemxql/index.d.ts +3 -6
- package/dist/esm/core/gemxql/types/date-filter.d.ts +1 -1
- package/dist/esm/core/gemxql/types/index.d.ts +0 -2
- package/dist/esm/gemxql.js +159 -204
- package/dist/esm/gemxql.mjs +159 -204
- package/dist/esm/index.d.ts +1 -3
- package/dist/esm/index.js +2041 -2080
- package/dist/esm/index.mjs +2041 -2080
- package/dist/esm/shared/charts/components/GPolarisViz/utilities/getFontSize.d.ts +1 -1
- package/dist/esm/shared/components/GTimePicker/GTimePicker.d.ts +1 -1
- package/dist/esm/shared/components/GTimePicker/helpers/parse-date.d.ts +2 -2
- package/dist/esm/shared/components/GTimePicker/hooks/useCompareDateTimePicker.d.ts +1 -2
- package/dist/esm/shared/components/GTimePicker/types/index.d.ts +1 -1
- package/dist/esm/shared/components/index.d.ts +0 -1
- package/dist/esm/types/breakdown-items.d.ts +19 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types.js +24 -1
- package/dist/esm/types.mjs +24 -1
- package/dist/esm/utils/analytics.d.ts +12 -0
- package/dist/esm/utils/dayjs.d.ts +10 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/umd/esm/components/GTimePicker/GTimePicker.d.ts +17 -0
- package/dist/umd/esm/components/GTimePicker/components/BaseTimePicker.d.ts +10 -0
- package/dist/umd/esm/components/GTimePicker/components/CompareTimePicker.d.ts +5 -0
- package/dist/umd/esm/components/GTimePicker/components/DateTimeFilterAddition.d.ts +2 -0
- package/dist/umd/esm/components/GTimePicker/components/DateTimeFilterInputs.d.ts +9 -0
- package/dist/umd/esm/components/GTimePicker/components/DateTimeFilters.d.ts +15 -0
- package/dist/umd/esm/components/GTimePicker/components/MainTimePicker.d.ts +3 -0
- package/dist/umd/esm/components/GTimePicker/components/index.d.ts +2 -0
- package/dist/umd/esm/components/GTimePicker/constants/compareDateTimePicker.d.ts +12 -0
- package/dist/umd/esm/components/GTimePicker/constants/datePicker.d.ts +14 -0
- package/dist/umd/esm/components/GTimePicker/constants/index.d.ts +2 -0
- package/dist/umd/esm/components/GTimePicker/constants/mainDataTimePicker.d.ts +14 -0
- package/dist/umd/esm/components/GTimePicker/contexts/DateTimePickerProvider.d.ts +15 -0
- package/dist/umd/esm/components/GTimePicker/contexts/index.d.ts +1 -0
- package/dist/umd/esm/components/GTimePicker/helpers/date-range-info.d.ts +16 -0
- package/dist/umd/esm/components/GTimePicker/helpers/index.d.ts +4 -0
- package/dist/umd/esm/components/GTimePicker/helpers/parse-date.d.ts +24 -0
- package/dist/umd/esm/components/GTimePicker/helpers/time-picker.d.ts +76 -0
- package/dist/umd/esm/components/GTimePicker/helpers/version.d.ts +2 -0
- package/dist/umd/esm/components/GTimePicker/hooks/index.d.ts +3 -0
- package/dist/umd/esm/components/GTimePicker/hooks/useCompareDateTimePicker.d.ts +25 -0
- package/dist/umd/esm/components/GTimePicker/hooks/useDateTimeFilter.d.ts +18 -0
- package/dist/umd/esm/components/GTimePicker/hooks/useDateTimePicker.d.ts +30 -0
- package/dist/umd/esm/components/GTimePicker/hooks/useVersionDateTimeFilters.d.ts +9 -0
- package/dist/umd/esm/components/GTimePicker/index.d.ts +7 -0
- package/dist/umd/esm/components/GTimePicker/types/index.d.ts +38 -0
- package/dist/umd/esm/components/index.d.ts +1 -0
- package/dist/umd/esm/constants/breakdown-targets.d.ts +1 -1
- package/dist/umd/esm/core/gemxql/builder/clauses/mode-query.d.ts +1 -1
- package/dist/umd/esm/core/gemxql/helpers/getTimeDimension.d.ts +1 -1
- package/dist/umd/esm/core/gemxql/index.d.ts +3 -6
- package/dist/umd/esm/core/gemxql/types/date-filter.d.ts +1 -1
- package/dist/umd/esm/core/gemxql/types/index.d.ts +0 -2
- package/dist/umd/esm/index.d.ts +1 -3
- package/dist/umd/esm/shared/charts/components/GPolarisViz/utilities/getFontSize.d.ts +1 -1
- package/dist/umd/esm/shared/components/GTimePicker/GTimePicker.d.ts +1 -1
- package/dist/umd/esm/shared/components/GTimePicker/helpers/parse-date.d.ts +2 -2
- package/dist/umd/esm/shared/components/GTimePicker/hooks/useCompareDateTimePicker.d.ts +1 -2
- package/dist/umd/esm/shared/components/GTimePicker/types/index.d.ts +1 -1
- package/dist/umd/esm/shared/components/index.d.ts +0 -1
- package/dist/umd/esm/types/breakdown-items.d.ts +19 -0
- package/dist/umd/esm/types/index.d.ts +1 -0
- package/dist/umd/esm/utils/analytics.d.ts +12 -0
- package/dist/umd/esm/utils/dayjs.d.ts +10 -0
- package/dist/umd/esm/utils/index.d.ts +2 -0
- package/dist/umd/gemxql.js +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/types.js +1 -1
- package/package.json +1 -1
package/dist/esm/gemxql.js
CHANGED
|
@@ -1,63 +1,10 @@
|
|
|
1
|
-
import { useQuery } from '@tanstack/react-query';
|
|
2
1
|
import dayjs from 'dayjs';
|
|
3
2
|
import quarterOfYear from 'dayjs/plugin/quarterOfYear.js';
|
|
4
3
|
import timezone from 'dayjs/plugin/timezone.js';
|
|
5
4
|
import utc from 'dayjs/plugin/utc.js';
|
|
5
|
+
import { useQuery } from '@tanstack/react-query';
|
|
6
6
|
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
7
7
|
|
|
8
|
-
const ColumnSelectFragmentDoc = `
|
|
9
|
-
fragment ColumnSelect on Column {
|
|
10
|
-
dataType
|
|
11
|
-
displayName
|
|
12
|
-
name
|
|
13
|
-
}
|
|
14
|
-
`;
|
|
15
|
-
const TableDataSelectFragmentDoc = `
|
|
16
|
-
fragment TableDataSelect on TableData {
|
|
17
|
-
columns {
|
|
18
|
-
...ColumnSelect
|
|
19
|
-
}
|
|
20
|
-
rows
|
|
21
|
-
}
|
|
22
|
-
`;
|
|
23
|
-
const GemXqlResultSelectFragmentDoc = `
|
|
24
|
-
fragment GemXQLResultSelect on GemxQLResult {
|
|
25
|
-
tableData {
|
|
26
|
-
...TableDataSelect
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
`;
|
|
30
|
-
|
|
31
|
-
const GemxQlDocument = `
|
|
32
|
-
query GemxQL($input: String!) {
|
|
33
|
-
gemxQLQuery(query: $input) {
|
|
34
|
-
...GemXQLResultSelect
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
${GemXqlResultSelectFragmentDoc}
|
|
38
|
-
${TableDataSelectFragmentDoc}
|
|
39
|
-
${ColumnSelectFragmentDoc}`;
|
|
40
|
-
|
|
41
|
-
const useCustomGemXQlQuery = (variables, fetcher, options) => {
|
|
42
|
-
return useQuery({
|
|
43
|
-
queryKey: ['GemXQlCustom', variables],
|
|
44
|
-
queryFn: fetcher(GemxQlDocument, variables),
|
|
45
|
-
...options,
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
useCustomGemXQlQuery.getKey = (variables) => ['GemXQlCustom', variables];
|
|
49
|
-
|
|
50
|
-
const useGemxQlNamedQuery = ({ name, variables, fetcher }, options) => {
|
|
51
|
-
const document = GemxQlDocument.replace(/query\s+GemxQL\b/, `query ${name}`);
|
|
52
|
-
return useQuery({
|
|
53
|
-
queryKey: [name, variables],
|
|
54
|
-
queryFn: fetcher(document, variables),
|
|
55
|
-
retry: 0,
|
|
56
|
-
...options,
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
useGemxQlNamedQuery.getKey = (name, variables) => [name, variables];
|
|
60
|
-
|
|
61
8
|
const NONE_VALUE = 'None';
|
|
62
9
|
const PLACEHOLDER_VALUE = '-';
|
|
63
10
|
|
|
@@ -94,42 +41,12 @@ var EAnalyticColumnKey;
|
|
|
94
41
|
EAnalyticColumnKey["TRAFFIC_SOURCE_ITEMS"] = "traffic_source_items";
|
|
95
42
|
})(EAnalyticColumnKey || (EAnalyticColumnKey = {}));
|
|
96
43
|
|
|
97
|
-
var EAnalyticMode;
|
|
98
|
-
(function (EAnalyticMode) {
|
|
99
|
-
EAnalyticMode["ALL_SESSION"] = "ALL_SESSION";
|
|
100
|
-
EAnalyticMode["FIRST_SESSION"] = "FIRST_SESSION";
|
|
101
|
-
EAnalyticMode["PAGE_ONLY"] = "PAGE_ONLY";
|
|
102
|
-
})(EAnalyticMode || (EAnalyticMode = {}));
|
|
103
|
-
|
|
104
44
|
var EAnalyticSource;
|
|
105
45
|
(function (EAnalyticSource) {
|
|
106
46
|
EAnalyticSource["SESSIONS"] = "sessions";
|
|
107
47
|
EAnalyticSource["SALES"] = "sales";
|
|
108
48
|
})(EAnalyticSource || (EAnalyticSource = {}));
|
|
109
49
|
|
|
110
|
-
var EVisitorType;
|
|
111
|
-
(function (EVisitorType) {
|
|
112
|
-
EVisitorType["NEW"] = "new";
|
|
113
|
-
EVisitorType["RETURNING"] = "returning";
|
|
114
|
-
})(EVisitorType || (EVisitorType = {}));
|
|
115
|
-
var EDeviceType;
|
|
116
|
-
(function (EDeviceType) {
|
|
117
|
-
EDeviceType["DESKTOP"] = "desktop";
|
|
118
|
-
EDeviceType["MOBILE"] = "mobile";
|
|
119
|
-
EDeviceType["TABLET"] = "tablet";
|
|
120
|
-
})(EDeviceType || (EDeviceType = {}));
|
|
121
|
-
var ETrafficSourceType;
|
|
122
|
-
(function (ETrafficSourceType) {
|
|
123
|
-
ETrafficSourceType["DIRECT"] = "direct";
|
|
124
|
-
ETrafficSourceType["EMAIL"] = "email";
|
|
125
|
-
ETrafficSourceType["REFERRAL"] = "referral";
|
|
126
|
-
ETrafficSourceType["ORGANIC_SOCIAL"] = "organic-social";
|
|
127
|
-
ETrafficSourceType["ORGANIC_SEARCH"] = "organic-search";
|
|
128
|
-
ETrafficSourceType["PAID_SOCIAL"] = "paid-social";
|
|
129
|
-
ETrafficSourceType["PAID_SEARCH"] = "paid-search";
|
|
130
|
-
ETrafficSourceType["SMS"] = "sms";
|
|
131
|
-
})(ETrafficSourceType || (ETrafficSourceType = {}));
|
|
132
|
-
|
|
133
50
|
var EComparisonOperator;
|
|
134
51
|
(function (EComparisonOperator) {
|
|
135
52
|
EComparisonOperator["EQ"] = "=";
|
|
@@ -561,32 +478,123 @@ const parse$4 = (query) => {
|
|
|
561
478
|
.filter(Boolean);
|
|
562
479
|
};
|
|
563
480
|
|
|
481
|
+
const TRIM_DECIMAL_ZEROS_REGEX = /\.0+$/;
|
|
482
|
+
const DEFAULT_DECIMALS = 2;
|
|
483
|
+
const trimDecimalZeros = (number) => {
|
|
484
|
+
return `${number}`.replace(TRIM_DECIMAL_ZEROS_REGEX, '');
|
|
485
|
+
};
|
|
486
|
+
const cleanDecimal = (number, decimals = DEFAULT_DECIMALS) => {
|
|
487
|
+
return trimDecimalZeros(number.toFixed(decimals));
|
|
488
|
+
};
|
|
489
|
+
const numberWithCommas = (x) => {
|
|
490
|
+
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Utility function to calculate percentage and format it.
|
|
495
|
+
* @param part - The part value.
|
|
496
|
+
* @param total - The total value.
|
|
497
|
+
* @param decimals - The number of decimal places to format the percentage to.
|
|
498
|
+
* @returns The formatted percentage as a string.
|
|
499
|
+
*/
|
|
500
|
+
const PERCENTAGE_THRESHOLD = 0.005;
|
|
501
|
+
const PERCENTAGE_THRESHOLD_STRING = '~0%';
|
|
502
|
+
const calcPercentage = (part, total, decimals = DEFAULT_DECIMALS) => {
|
|
503
|
+
if (typeof part !== 'number' || !total)
|
|
504
|
+
return undefined;
|
|
505
|
+
if (part === 0)
|
|
506
|
+
return 0;
|
|
507
|
+
const percentage = (part / total) * 100;
|
|
508
|
+
return parseFloat(cleanDecimal(percentage, decimals));
|
|
509
|
+
};
|
|
510
|
+
const isLessThanThreshold = (percentage) => percentage > 0 && percentage < PERCENTAGE_THRESHOLD;
|
|
511
|
+
const calcPercentageString = (part, total, decimals = 2) => {
|
|
512
|
+
const percentage = calcPercentage(part, total, decimals);
|
|
513
|
+
if (typeof percentage !== 'number')
|
|
514
|
+
return undefined;
|
|
515
|
+
if (isLessThanThreshold(percentage)) {
|
|
516
|
+
return PERCENTAGE_THRESHOLD_STRING;
|
|
517
|
+
}
|
|
518
|
+
return `${percentage}%`;
|
|
519
|
+
};
|
|
520
|
+
|
|
564
521
|
dayjs.extend(utc);
|
|
565
522
|
dayjs.extend(timezone);
|
|
566
523
|
dayjs.extend(quarterOfYear);
|
|
567
524
|
let tz = 'UTC';
|
|
568
|
-
const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';
|
|
569
525
|
function getInitialTimezone() {
|
|
570
526
|
return tz;
|
|
571
527
|
}
|
|
572
|
-
function setTz(value) {
|
|
573
|
-
tz = value;
|
|
574
|
-
dayjs.tz.setDefault(value);
|
|
575
|
-
}
|
|
576
528
|
const dayjsTz = (date) => {
|
|
577
529
|
if (!date)
|
|
578
530
|
return dayjs().tz(tz);
|
|
579
531
|
return dayjs(date).tz(tz);
|
|
580
532
|
};
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
533
|
+
|
|
534
|
+
var AnalyticInterval;
|
|
535
|
+
(function (AnalyticInterval) {
|
|
536
|
+
AnalyticInterval["DAY"] = "DAY";
|
|
537
|
+
AnalyticInterval["HOUR"] = "HOUR";
|
|
538
|
+
AnalyticInterval["MONTH"] = "MONTH";
|
|
539
|
+
AnalyticInterval["QUARTER"] = "QUARTER";
|
|
540
|
+
AnalyticInterval["WEEK"] = "WEEK";
|
|
541
|
+
AnalyticInterval["YEAR"] = "YEAR";
|
|
542
|
+
})(AnalyticInterval || (AnalyticInterval = {}));
|
|
543
|
+
const SECONDS_IN_MINUTE = 60;
|
|
544
|
+
const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * SECONDS_IN_MINUTE;
|
|
545
|
+
const getTimeDurationLabel = (valueInSeconds) => {
|
|
546
|
+
let data = valueInSeconds;
|
|
547
|
+
if (!Number.isFinite(valueInSeconds) || valueInSeconds == null) {
|
|
548
|
+
data = 0;
|
|
549
|
+
}
|
|
550
|
+
const fixedValue = cleanDecimal(data);
|
|
551
|
+
if (data >= SECONDS_IN_HOUR) {
|
|
552
|
+
const hours = Math.floor(data / SECONDS_IN_HOUR);
|
|
553
|
+
const minutes = Math.floor((data % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE);
|
|
554
|
+
const seconds = Math.floor(data % SECONDS_IN_MINUTE);
|
|
555
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
556
|
+
}
|
|
557
|
+
else if (data >= SECONDS_IN_MINUTE) {
|
|
558
|
+
const minutes = Math.floor(data / SECONDS_IN_MINUTE);
|
|
559
|
+
const seconds = Math.floor(data % SECONDS_IN_MINUTE);
|
|
560
|
+
return `${minutes}m ${seconds}s`;
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
return `${fixedValue}s`;
|
|
564
|
+
}
|
|
585
565
|
};
|
|
586
|
-
const
|
|
587
|
-
if (!
|
|
588
|
-
return
|
|
589
|
-
|
|
566
|
+
const getFormattedByInterval = (value, interval, options) => {
|
|
567
|
+
if (!value)
|
|
568
|
+
return '';
|
|
569
|
+
const optionFormat = options?.isExpandDetail
|
|
570
|
+
? {
|
|
571
|
+
formatHouse: 'MMM D, h:mm A',
|
|
572
|
+
formatDay: 'MMM D, YYYY',
|
|
573
|
+
formatMonth: 'MMM YYYY',
|
|
574
|
+
formatYear: 'MMM YYYY',
|
|
575
|
+
}
|
|
576
|
+
: {
|
|
577
|
+
formatHouse: 'h A',
|
|
578
|
+
formatDay: 'MMM D',
|
|
579
|
+
formatMonth: 'MMM YYYY',
|
|
580
|
+
formatYear: 'YYYY',
|
|
581
|
+
};
|
|
582
|
+
switch (interval) {
|
|
583
|
+
case AnalyticInterval.HOUR:
|
|
584
|
+
return dayjsTz(value).format(optionFormat.formatHouse);
|
|
585
|
+
case AnalyticInterval.DAY:
|
|
586
|
+
case AnalyticInterval.WEEK:
|
|
587
|
+
return dayjsTz(value).format(optionFormat.formatDay);
|
|
588
|
+
case AnalyticInterval.MONTH:
|
|
589
|
+
return dayjsTz(value).format(optionFormat.formatMonth);
|
|
590
|
+
case AnalyticInterval.QUARTER: {
|
|
591
|
+
const d = dayjsTz(value);
|
|
592
|
+
return `Q${d.quarter()} ${d.format('YYYY')}`;
|
|
593
|
+
}
|
|
594
|
+
case AnalyticInterval.YEAR:
|
|
595
|
+
return dayjsTz(value).format(optionFormat.formatYear);
|
|
596
|
+
}
|
|
597
|
+
return dayjsTz(value).format(optionFormat.formatMonth);
|
|
590
598
|
};
|
|
591
599
|
|
|
592
600
|
const toDate = (value) => (typeof value === 'string' ? dayjsTz(value) : value);
|
|
@@ -746,112 +754,6 @@ const extractColumnTypes = (response) => {
|
|
|
746
754
|
return columnTypes;
|
|
747
755
|
};
|
|
748
756
|
|
|
749
|
-
const TRIM_DECIMAL_ZEROS_REGEX = /\.0+$/;
|
|
750
|
-
const DEFAULT_DECIMALS = 2;
|
|
751
|
-
const trimDecimalZeros = (number) => {
|
|
752
|
-
return `${number}`.replace(TRIM_DECIMAL_ZEROS_REGEX, '');
|
|
753
|
-
};
|
|
754
|
-
const cleanDecimal = (number, decimals = DEFAULT_DECIMALS) => {
|
|
755
|
-
return trimDecimalZeros(number.toFixed(decimals));
|
|
756
|
-
};
|
|
757
|
-
|
|
758
|
-
/**
|
|
759
|
-
* Utility function to calculate percentage and format it.
|
|
760
|
-
* @param part - The part value.
|
|
761
|
-
* @param total - The total value.
|
|
762
|
-
* @param decimals - The number of decimal places to format the percentage to.
|
|
763
|
-
* @returns The formatted percentage as a string.
|
|
764
|
-
*/
|
|
765
|
-
const PERCENTAGE_THRESHOLD = 0.005;
|
|
766
|
-
const PERCENTAGE_THRESHOLD_STRING = '~0%';
|
|
767
|
-
const calcPercentage = (part, total, decimals = DEFAULT_DECIMALS) => {
|
|
768
|
-
if (typeof part !== 'number' || !total)
|
|
769
|
-
return undefined;
|
|
770
|
-
if (part === 0)
|
|
771
|
-
return 0;
|
|
772
|
-
const percentage = (part / total) * 100;
|
|
773
|
-
return parseFloat(cleanDecimal(percentage, decimals));
|
|
774
|
-
};
|
|
775
|
-
const isLessThanThreshold = (percentage) => percentage > 0 && percentage < PERCENTAGE_THRESHOLD;
|
|
776
|
-
const calcPercentageString = (part, total, decimals = 2) => {
|
|
777
|
-
const percentage = calcPercentage(part, total, decimals);
|
|
778
|
-
if (typeof percentage !== 'number')
|
|
779
|
-
return undefined;
|
|
780
|
-
if (isLessThanThreshold(percentage)) {
|
|
781
|
-
return PERCENTAGE_THRESHOLD_STRING;
|
|
782
|
-
}
|
|
783
|
-
return `${percentage}%`;
|
|
784
|
-
};
|
|
785
|
-
|
|
786
|
-
var AnalyticInterval;
|
|
787
|
-
(function (AnalyticInterval) {
|
|
788
|
-
AnalyticInterval["DAY"] = "DAY";
|
|
789
|
-
AnalyticInterval["HOUR"] = "HOUR";
|
|
790
|
-
AnalyticInterval["MONTH"] = "MONTH";
|
|
791
|
-
AnalyticInterval["QUARTER"] = "QUARTER";
|
|
792
|
-
AnalyticInterval["WEEK"] = "WEEK";
|
|
793
|
-
AnalyticInterval["YEAR"] = "YEAR";
|
|
794
|
-
})(AnalyticInterval || (AnalyticInterval = {}));
|
|
795
|
-
function numberWithCommas(x) {
|
|
796
|
-
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
797
|
-
}
|
|
798
|
-
const SECONDS_IN_MINUTE = 60;
|
|
799
|
-
const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * SECONDS_IN_MINUTE;
|
|
800
|
-
const getTimeDurationLabel = (valueInSeconds) => {
|
|
801
|
-
let data = valueInSeconds;
|
|
802
|
-
if (!Number.isFinite(valueInSeconds) || valueInSeconds == null) {
|
|
803
|
-
data = 0;
|
|
804
|
-
}
|
|
805
|
-
const fixedValue = cleanDecimal(data);
|
|
806
|
-
if (data >= SECONDS_IN_HOUR) {
|
|
807
|
-
const hours = Math.floor(data / SECONDS_IN_HOUR);
|
|
808
|
-
const minutes = Math.floor((data % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE);
|
|
809
|
-
const seconds = Math.floor(data % SECONDS_IN_MINUTE);
|
|
810
|
-
return `${hours}h ${minutes}m ${seconds}s`;
|
|
811
|
-
}
|
|
812
|
-
else if (data >= SECONDS_IN_MINUTE) {
|
|
813
|
-
const minutes = Math.floor(data / SECONDS_IN_MINUTE);
|
|
814
|
-
const seconds = Math.floor(data % SECONDS_IN_MINUTE);
|
|
815
|
-
return `${minutes}m ${seconds}s`;
|
|
816
|
-
}
|
|
817
|
-
else {
|
|
818
|
-
return `${fixedValue}s`;
|
|
819
|
-
}
|
|
820
|
-
};
|
|
821
|
-
const getFormattedByInterval = (value, interval, options) => {
|
|
822
|
-
if (!value)
|
|
823
|
-
return '';
|
|
824
|
-
const optionFormat = options?.isExpandDetail
|
|
825
|
-
? {
|
|
826
|
-
formatHouse: 'MMM D, h:mm A',
|
|
827
|
-
formatDay: 'MMM D, YYYY',
|
|
828
|
-
formatMonth: 'MMM YYYY',
|
|
829
|
-
formatYear: 'MMM YYYY',
|
|
830
|
-
}
|
|
831
|
-
: {
|
|
832
|
-
formatHouse: 'h A',
|
|
833
|
-
formatDay: 'MMM D',
|
|
834
|
-
formatMonth: 'MMM YYYY',
|
|
835
|
-
formatYear: 'YYYY',
|
|
836
|
-
};
|
|
837
|
-
switch (interval) {
|
|
838
|
-
case AnalyticInterval.HOUR:
|
|
839
|
-
return dayjsTz(value).format(optionFormat.formatHouse);
|
|
840
|
-
case AnalyticInterval.DAY:
|
|
841
|
-
case AnalyticInterval.WEEK:
|
|
842
|
-
return dayjsTz(value).format(optionFormat.formatDay);
|
|
843
|
-
case AnalyticInterval.MONTH:
|
|
844
|
-
return dayjsTz(value).format(optionFormat.formatMonth);
|
|
845
|
-
case AnalyticInterval.QUARTER: {
|
|
846
|
-
const d = dayjsTz(value);
|
|
847
|
-
return `Q${d.quarter()} ${d.format('YYYY')}`;
|
|
848
|
-
}
|
|
849
|
-
case AnalyticInterval.YEAR:
|
|
850
|
-
return dayjsTz(value).format(optionFormat.formatYear);
|
|
851
|
-
}
|
|
852
|
-
return dayjsTz(value).format(optionFormat.formatMonth);
|
|
853
|
-
};
|
|
854
|
-
|
|
855
757
|
const formatAnalyticDate = (dateString) => {
|
|
856
758
|
if (!dateString)
|
|
857
759
|
return 'None';
|
|
@@ -992,6 +894,59 @@ const createNumericRowReader = (row, mode = ERowReaderMode.DEFAULT) => (key) =>
|
|
|
992
894
|
return 0;
|
|
993
895
|
};
|
|
994
896
|
|
|
897
|
+
const ColumnSelectFragmentDoc = `
|
|
898
|
+
fragment ColumnSelect on Column {
|
|
899
|
+
dataType
|
|
900
|
+
displayName
|
|
901
|
+
name
|
|
902
|
+
}
|
|
903
|
+
`;
|
|
904
|
+
const TableDataSelectFragmentDoc = `
|
|
905
|
+
fragment TableDataSelect on TableData {
|
|
906
|
+
columns {
|
|
907
|
+
...ColumnSelect
|
|
908
|
+
}
|
|
909
|
+
rows
|
|
910
|
+
}
|
|
911
|
+
`;
|
|
912
|
+
const GemXqlResultSelectFragmentDoc = `
|
|
913
|
+
fragment GemXQLResultSelect on GemxQLResult {
|
|
914
|
+
tableData {
|
|
915
|
+
...TableDataSelect
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
`;
|
|
919
|
+
|
|
920
|
+
const GemxQlDocument = `
|
|
921
|
+
query GemxQL($input: String!) {
|
|
922
|
+
gemxQLQuery(query: $input) {
|
|
923
|
+
...GemXQLResultSelect
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
${GemXqlResultSelectFragmentDoc}
|
|
927
|
+
${TableDataSelectFragmentDoc}
|
|
928
|
+
${ColumnSelectFragmentDoc}`;
|
|
929
|
+
|
|
930
|
+
const useCustomGemXQlQuery = (variables, fetcher, options) => {
|
|
931
|
+
return useQuery({
|
|
932
|
+
queryKey: ['GemXQlCustom', variables],
|
|
933
|
+
queryFn: fetcher(GemxQlDocument, variables),
|
|
934
|
+
...options,
|
|
935
|
+
});
|
|
936
|
+
};
|
|
937
|
+
useCustomGemXQlQuery.getKey = (variables) => ['GemXQlCustom', variables];
|
|
938
|
+
|
|
939
|
+
const useGemxQlNamedQuery = ({ name, variables, fetcher }, options) => {
|
|
940
|
+
const document = GemxQlDocument.replace(/query\s+GemxQL\b/, `query ${name}`);
|
|
941
|
+
return useQuery({
|
|
942
|
+
queryKey: [name, variables],
|
|
943
|
+
queryFn: fetcher(document, variables),
|
|
944
|
+
retry: 0,
|
|
945
|
+
...options,
|
|
946
|
+
});
|
|
947
|
+
};
|
|
948
|
+
useGemxQlNamedQuery.getKey = (name, variables) => [name, variables];
|
|
949
|
+
|
|
995
950
|
const useAnalyticData = (getTextPrice) => {
|
|
996
951
|
const formatData = ({ value, formatter, name }) => {
|
|
997
952
|
return formatAnalyticData({ value, formatter, getTextPrice, name });
|
|
@@ -1048,4 +1003,4 @@ const useGemXQlPagination = ({ resetKey, itemsPerPage, }) => {
|
|
|
1048
1003
|
return { currentPage: effectivePage, offset, buildPagination };
|
|
1049
1004
|
};
|
|
1050
1005
|
|
|
1051
|
-
export {
|
|
1006
|
+
export { CLAUSE_KEYWORDS, CLAUSE_KEYWORD_BOUNDARY, COMPARE_PREFIX, COMPARE_SUFFIX, COMPARE_TOTALS_SUFFIX, ColumnSelectFragmentDoc, DATE_QUERY_FORMAT, DEFAULT_QUERY_LIMIT, EAnalyticColumnKey, EAnalyticDataType, EAnalyticSource, EComparisonOperator, EFilterField, EGroupOperator, EGroupWithClause, EOperatorField, EOrderDirectionType, EPageDimension, EPageField, EPageMetric, ERowReaderMode, ETimeDimension, GPaginationDirection, GemXqlResultSelectFragmentDoc, GemxQlDocument, NONE_VALUE, OPERATOR_IS, OPERATOR_IS_ONE_OF, PLACEHOLDER_VALUE, ROW_READER_MODE_CONFIG, TOTALS_SUFFIX, TableDataSelectFragmentDoc, build$a as buildConditionQuery, buildExtraCondition, buildExtraConditions, build$9 as buildFromQuery, buildGemXQlQuery, build$8 as buildGroupQuery, build$7 as buildLimitQuery, build$6 as buildModeQuery, build$5 as buildOffsetQuery, build$4 as buildOrderByQuery, build$3 as buildShowQuery, build$2 as buildTimeQuery, build$1 as buildTimeSeriesQuery, build as buildTimezoneQuery, buildVersionIdCondition, createNumericRowReader, extractColumnTypes, extractQueryColumns, extractQueryRows, filterConfigs, formatAnalyticData, formatAnalyticDate, generateFilterConditions, getComparisonKey, getComparisonTotalsKey, getFirstMetricInOrderBy, getTimeDimensionByDate, getTotalsKey, hasMetricData, isValidQueryInput, parseBreakdownItems, parse$b as parseConditionQuery, parse$a as parseFromQuery, parse as parseGemXQlQuery, parse$9 as parseGroupQuery, parseJsonArray, parseJsonObject, parse$8 as parseLimitQuery, parse$7 as parseModeQuery, parse$6 as parseOffsetQuery, parse$5 as parseOrderByQuery, parsePageItems, parse$4 as parseShowQuery, parse$3 as parseTimeQuery, parse$2 as parseTimeSeriesQuery, parse$1 as parseTimezoneQuery, readNumeric, useAnalyticData, useCustomGemXQlQuery, useGemXQlPagination, useGemxQlNamedQuery };
|