@servicetitan/marketing-ui 5.8.1 → 5.10.0
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/components/ads/ads-stat.js +21 -10
- package/dist/components/ads/ads-stat.js.map +1 -1
- package/dist/components/charts/funnel-chart/components/funnel-chart.js +118 -6
- package/dist/components/charts/funnel-chart/components/funnel-chart.js.map +1 -1
- package/dist/components/charts/funnel-chart/components/funnel-chart.module.less.d.ts +9 -0
- package/dist/components/charts/funnel-chart/components/funnel-svg.js +62 -12
- package/dist/components/charts/funnel-chart/components/funnel-svg.js.map +1 -1
- package/dist/components/charts/funnel-chart/funnel-chart.stories.d.ts +0 -1
- package/dist/components/charts/funnel-chart/funnel-chart.stories.d.ts.map +1 -1
- package/dist/components/charts/funnel-chart/index.js +1 -0
- package/dist/components/charts/funnel-chart/index.js.map +1 -1
- package/dist/components/charts/funnel-chart/utils/const.js +1 -0
- package/dist/components/charts/funnel-chart/utils/const.js.map +1 -1
- package/dist/components/charts/funnel-chart/utils/interface.js +2 -1
- package/dist/components/charts/funnel-chart/utils/interface.js.map +1 -1
- package/dist/components/charts/line-chart/components/body.js +105 -16
- package/dist/components/charts/line-chart/components/body.js.map +1 -1
- package/dist/components/charts/line-chart/components/body.module.less.d.ts +4 -0
- package/dist/components/charts/line-chart/components/container.js +12 -4
- package/dist/components/charts/line-chart/components/container.js.map +1 -1
- package/dist/components/charts/line-chart/components/hover-popover.js +56 -13
- package/dist/components/charts/line-chart/components/hover-popover.js.map +1 -1
- package/dist/components/charts/line-chart/components/hover-popover.module.less.d.ts +5 -0
- package/dist/components/charts/line-chart/components/sidebar.js +35 -5
- package/dist/components/charts/line-chart/components/sidebar.js.map +1 -1
- package/dist/components/charts/line-chart/components/sidebar.module.less.d.ts +13 -0
- package/dist/components/charts/line-chart/components/stuff.js +73 -32
- package/dist/components/charts/line-chart/components/stuff.js.map +1 -1
- package/dist/components/charts/line-chart/components/stuff.module.less.d.ts +6 -0
- package/dist/components/charts/line-chart/components/svg-bars.d.ts.map +1 -1
- package/dist/components/charts/line-chart/components/svg-bars.js +60 -26
- package/dist/components/charts/line-chart/components/svg-bars.js.map +1 -1
- package/dist/components/charts/line-chart/components/svg-body.js +52 -11
- package/dist/components/charts/line-chart/components/svg-body.js.map +1 -1
- package/dist/components/charts/line-chart/components/svg-lines.js +46 -27
- package/dist/components/charts/line-chart/components/svg-lines.js.map +1 -1
- package/dist/components/charts/line-chart/components/svg.module.less.d.ts +5 -0
- package/dist/components/charts/line-chart/index.js +1 -0
- package/dist/components/charts/line-chart/index.js.map +1 -1
- package/dist/components/charts/line-chart/stores/line-chart.store.d.ts.map +1 -1
- package/dist/components/charts/line-chart/stores/line-chart.store.js +98 -127
- package/dist/components/charts/line-chart/stores/line-chart.store.js.map +1 -1
- package/dist/components/charts/line-chart/stores/svg.store.d.ts.map +1 -1
- package/dist/components/charts/line-chart/stores/svg.store.js +66 -108
- package/dist/components/charts/line-chart/stores/svg.store.js.map +1 -1
- package/dist/components/charts/line-chart/utils/const.js +8 -7
- package/dist/components/charts/line-chart/utils/const.js.map +1 -1
- package/dist/components/charts/line-chart/utils/formatters.d.ts.map +1 -1
- package/dist/components/charts/line-chart/utils/formatters.js +13 -11
- package/dist/components/charts/line-chart/utils/formatters.js.map +1 -1
- package/dist/components/charts/line-chart/utils/interfaces.js +2 -1
- package/dist/components/charts/line-chart/utils/interfaces.js.map +1 -1
- package/dist/components/charts/line-chart/utils/internal-interfaces.js +2 -1
- package/dist/components/charts/line-chart/utils/internal-interfaces.js.map +1 -1
- package/dist/components/charts/line-chart/utils/key.d.ts.map +1 -1
- package/dist/components/charts/line-chart/utils/key.js +2 -1
- package/dist/components/charts/line-chart/utils/key.js.map +1 -1
- package/dist/components/charts/line-chart/utils/labels.d.ts.map +1 -1
- package/dist/components/charts/line-chart/utils/labels.js +50 -46
- package/dist/components/charts/line-chart/utils/labels.js.map +1 -1
- package/dist/components/charts/pie-chart/components/pie-chart.js +60 -6
- package/dist/components/charts/pie-chart/components/pie-chart.js.map +1 -1
- package/dist/components/charts/pie-chart/components/pie-chart.module.less.d.ts +3 -0
- package/dist/components/charts/pie-chart/components/pie.js +176 -39
- package/dist/components/charts/pie-chart/components/pie.js.map +1 -1
- package/dist/components/charts/pie-chart/index.js +2 -0
- package/dist/components/charts/pie-chart/index.js.map +1 -1
- package/dist/components/charts/pie-chart/pie-chart.stories.d.ts +0 -1
- package/dist/components/charts/pie-chart/pie-chart.stories.d.ts.map +1 -1
- package/dist/components/charts/pie-chart/utils/const.d.ts.map +1 -1
- package/dist/components/charts/pie-chart/utils/const.js +55 -39
- package/dist/components/charts/pie-chart/utils/const.js.map +1 -1
- package/dist/components/charts/pie-chart/utils/interface.js +2 -1
- package/dist/components/charts/pie-chart/utils/interface.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.d.ts.map +1 -1
- package/dist/components/image-cropper/image-cropper.js +74 -88
- package/dist/components/image-cropper/image-cropper.js.map +1 -1
- package/dist/components/stat/stat-card.js +68 -22
- package/dist/components/stat/stat-card.js.map +1 -1
- package/dist/components/stat/stat-card.module.less.d.ts +5 -0
- package/dist/components/stat/stat-cards.stories.d.ts +0 -1
- package/dist/components/stat/stat-cards.stories.d.ts.map +1 -1
- package/dist/components/stat/stat-extended-card.js +76 -4
- package/dist/components/stat/stat-extended-card.js.map +1 -1
- package/dist/components/stat/stat-extended-card.stories.d.ts +0 -1
- package/dist/components/stat/stat-extended-card.stories.d.ts.map +1 -1
- package/dist/components/ui/action-button/action-button.js +33 -7
- package/dist/components/ui/action-button/action-button.js.map +1 -1
- package/dist/components/ui/action-button/action-button.module.less.d.ts +9 -0
- package/dist/components/ui/action-button/action-button.stories.d.ts +0 -1
- package/dist/components/ui/action-button/action-button.stories.d.ts.map +1 -1
- package/dist/components/ui/action-button/index.js +1 -0
- package/dist/components/ui/action-button/index.js.map +1 -1
- package/dist/components/ui/centered-spinner/centered-spinner.js +20 -2
- package/dist/components/ui/centered-spinner/centered-spinner.js.map +1 -1
- package/dist/components/ui/centered-spinner/centered-spinner.stories.d.ts +0 -1
- package/dist/components/ui/centered-spinner/centered-spinner.stories.d.ts.map +1 -1
- package/dist/components/ui/date-range-picker/date-range-picker.d.ts.map +1 -1
- package/dist/components/ui/date-range-picker/date-range-picker.js +71 -35
- package/dist/components/ui/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/ui/date-range-picker/date-range-picker.module.less.d.ts +4 -0
- package/dist/components/ui/date-range-picker/date-range-picker.stories.d.ts.map +1 -1
- package/dist/components/ui/disabled-button.js +12 -3
- package/dist/components/ui/disabled-button.js.map +1 -1
- package/dist/components/ui/label-with-hint/label-with-hint.js +23 -1
- package/dist/components/ui/label-with-hint/label-with-hint.js.map +1 -1
- package/dist/components/ui/label-with-hint/label-with-hint.stories.d.ts +0 -1
- package/dist/components/ui/label-with-hint/label-with-hint.stories.d.ts.map +1 -1
- package/dist/components/ui/line-text/index.js +1 -0
- package/dist/components/ui/line-text/index.js.map +1 -1
- package/dist/components/ui/line-text/line-text-body.stories.d.ts +0 -1
- package/dist/components/ui/line-text/line-text-body.stories.d.ts.map +1 -1
- package/dist/components/ui/line-text/line-text-head.stories.d.ts +0 -1
- package/dist/components/ui/line-text/line-text-head.stories.d.ts.map +1 -1
- package/dist/components/ui/line-text/line-text.js +71 -25
- package/dist/components/ui/line-text/line-text.js.map +1 -1
- package/dist/components/ui/line-text/line-text.module.less.d.ts +6 -0
- package/dist/components/ui/title-popover/index.js +1 -0
- package/dist/components/ui/title-popover/index.js.map +1 -1
- package/dist/components/ui/title-popover/title-popover.d.ts.map +1 -1
- package/dist/components/ui/title-popover/title-popover.js +78 -69
- package/dist/components/ui/title-popover/title-popover.js.map +1 -1
- package/dist/components/ui/title-popover/title-popover.module.less.d.ts +3 -0
- package/dist/components/ui/title-popover/title-popover.stories.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/format-big-numbers.test.d.ts +2 -0
- package/dist/utils/__tests__/format-big-numbers.test.d.ts.map +1 -0
- package/dist/utils/__tests__/formatters.test.d.ts +2 -0
- package/dist/utils/__tests__/formatters.test.d.ts.map +1 -0
- package/dist/utils/__tests__/helpers.test.d.ts +2 -0
- package/dist/utils/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/utils/__tests__/string-case.test.d.ts +2 -0
- package/dist/utils/__tests__/string-case.test.d.ts.map +1 -0
- package/dist/utils/ads-texts.js +2 -1
- package/dist/utils/ads-texts.js.map +1 -1
- package/dist/utils/date/__tests__/date-range-picker.test.d.ts +2 -0
- package/dist/utils/date/__tests__/date-range-picker.test.d.ts.map +1 -0
- package/dist/utils/date/__tests__/date-tenant.test.d.ts +2 -0
- package/dist/utils/date/__tests__/date-tenant.test.d.ts.map +1 -0
- package/dist/utils/date/date-range-picker-options.d.ts.map +1 -1
- package/dist/utils/date/date-range-picker-options.js +90 -68
- package/dist/utils/date/date-range-picker-options.js.map +1 -1
- package/dist/utils/date/date-range-picker-state.d.ts.map +1 -1
- package/dist/utils/date/date-range-picker-state.js +42 -43
- package/dist/utils/date/date-range-picker-state.js.map +1 -1
- package/dist/utils/date/date-tenant.js +4 -6
- package/dist/utils/date/date-tenant.js.map +1 -1
- package/dist/utils/date/date.d.ts.map +1 -1
- package/dist/utils/date/date.js +5 -9
- package/dist/utils/date/date.js.map +1 -1
- package/dist/utils/date/index.js +1 -0
- package/dist/utils/date/index.js.map +1 -1
- package/dist/utils/format-big-numbers.d.ts.map +1 -1
- package/dist/utils/format-big-numbers.js +11 -6
- package/dist/utils/format-big-numbers.js.map +1 -1
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +8 -7
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +9 -12
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/marketing-parner-handlers.js +9 -12
- package/dist/utils/marketing-parner-handlers.js.map +1 -1
- package/dist/utils/string-case.js +1 -0
- package/dist/utils/string-case.js.map +1 -1
- package/dist/utils/use-client-rect.d.ts +1 -5
- package/dist/utils/use-client-rect.d.ts.map +1 -1
- package/dist/utils/use-client-rect.js +19 -19
- package/dist/utils/use-client-rect.js.map +1 -1
- package/dist/utils/use-target-range-store.js +7 -6
- package/dist/utils/use-target-range-store.js.map +1 -1
- package/package.json +11 -11
- package/src/components/charts/funnel-chart/funnel-chart.stories.tsx +3 -2
- package/src/components/charts/line-chart/components/svg-bars.tsx +2 -0
- package/src/components/ui/action-button/action-button.stories.tsx +3 -2
- package/src/components/ui/centered-spinner/centered-spinner.stories.tsx +3 -2
- package/src/components/ui/date-range-picker/date-range-picker.stories.tsx +5 -6
- package/src/components/ui/date-range-picker/date-range-picker.tsx +2 -2
- package/src/components/ui/line-text/line-text-body.stories.tsx +3 -2
- package/src/components/ui/line-text/line-text-head.stories.tsx +3 -2
- package/src/components/ui/line-text/line-text.tsx +1 -1
- package/src/components/ui/title-popover/title-popover.stories.tsx +3 -2
- package/src/utils/date/__tests__/date-range-picker.test.ts +1 -1
- package/src/utils/use-client-rect.ts +1 -1
- package/dist/components/charts/funnel-chart/funnel-chart.stories.js +0 -76
- package/dist/components/charts/funnel-chart/funnel-chart.stories.js.map +0 -1
- package/dist/components/charts/line-chart/line-chart.stories.js +0 -225
- package/dist/components/charts/line-chart/line-chart.stories.js.map +0 -1
- package/dist/components/charts/pie-chart/pie-chart.stories.js +0 -22
- package/dist/components/charts/pie-chart/pie-chart.stories.js.map +0 -1
- package/dist/components/image-cropper/image-cropper.stories.js +0 -48
- package/dist/components/image-cropper/image-cropper.stories.js.map +0 -1
- package/dist/components/stat/stat-cards.stories.js +0 -16
- package/dist/components/stat/stat-cards.stories.js.map +0 -1
- package/dist/components/stat/stat-extended-card.stories.js +0 -12
- package/dist/components/stat/stat-extended-card.stories.js.map +0 -1
- package/dist/components/ui/action-button/action-button.stories.js +0 -11
- package/dist/components/ui/action-button/action-button.stories.js.map +0 -1
- package/dist/components/ui/centered-spinner/centered-spinner.stories.js +0 -12
- package/dist/components/ui/centered-spinner/centered-spinner.stories.js.map +0 -1
- package/dist/components/ui/date-range-picker/date-range-picker.stories.js +0 -18
- package/dist/components/ui/date-range-picker/date-range-picker.stories.js.map +0 -1
- package/dist/components/ui/label-with-hint/label-with-hint.stories.js +0 -12
- package/dist/components/ui/label-with-hint/label-with-hint.stories.js.map +0 -1
- package/dist/components/ui/line-text/line-text-body.stories.js +0 -11
- package/dist/components/ui/line-text/line-text-body.stories.js.map +0 -1
- package/dist/components/ui/line-text/line-text-head.stories.js +0 -11
- package/dist/components/ui/line-text/line-text-head.stories.js.map +0 -1
- package/dist/components/ui/title-popover/title-popover.stories.js +0 -17
- package/dist/components/ui/title-popover/title-popover.stories.js.map +0 -1
- package/dist/utils/date/__mocks__/date-mock.js +0 -19
- package/dist/utils/date/__mocks__/date-mock.js.map +0 -1
|
@@ -1,66 +1,112 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
|
-
import { BodyText, Eyebrow, Popover, Stack, Tooltip
|
|
4
|
+
import { BodyText, Eyebrow, Popover, Stack, Tooltip } from '@servicetitan/design-system';
|
|
5
5
|
import * as Styles from './stat-card.module.less';
|
|
6
6
|
import { formatValue } from '../../utils/formatters';
|
|
7
|
-
const calculateDiff = (value, prev, percents)
|
|
7
|
+
const calculateDiff = (value, prev, percents)=>{
|
|
8
8
|
const diff = (value - prev) * (percents ? 100 : 1);
|
|
9
9
|
const absDiff = Math.abs(diff);
|
|
10
10
|
let diffPercent = 0;
|
|
11
11
|
if (percents) {
|
|
12
12
|
diffPercent = diff;
|
|
13
|
+
} else if (absDiff) {
|
|
14
|
+
diffPercent = prev ? 100 * absDiff / prev : 100;
|
|
13
15
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
return [
|
|
17
|
+
absDiff,
|
|
18
|
+
diffPercent,
|
|
19
|
+
diff >= 0
|
|
20
|
+
];
|
|
18
21
|
};
|
|
19
|
-
const formatDifference = (value, isPlus, format)
|
|
22
|
+
const formatDifference = (value, isPlus, format)=>{
|
|
20
23
|
return (isPlus ? '+' : '-') + formatValue(value, format);
|
|
21
24
|
};
|
|
22
|
-
const formatDifferencePercentage = (value, isPlus)
|
|
25
|
+
const formatDifferencePercentage = (value, isPlus)=>{
|
|
23
26
|
if (!value) {
|
|
24
27
|
return '';
|
|
25
28
|
}
|
|
26
29
|
return (isPlus ? '+' : '-') + formatValue(value, 'percent-100');
|
|
27
30
|
};
|
|
28
|
-
export const StatDiff = ({ value, prev, size, format, inverted, neutral, className, diffPercentOnly = false
|
|
31
|
+
export const StatDiff = ({ value, prev, size, format, inverted, neutral, className, diffPercentOnly = false })=>{
|
|
29
32
|
const percents = format === 'percent';
|
|
30
33
|
const [absDiff, diffPercent, isIncrease] = calculateDiff(value !== null && value !== void 0 ? value : 0, prev !== null && prev !== void 0 ? prev : 0, percents);
|
|
31
34
|
const diff = absDiff === 0 ? '' : isIncrease ? '▲ ' : '▼ ';
|
|
32
35
|
let text = '';
|
|
33
36
|
if (percents) {
|
|
34
37
|
text += formatDifferencePercentage(absDiff, isIncrease);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
38
|
+
} else {
|
|
37
39
|
const diffPercentage = formatDifferencePercentage(diffPercent, isIncrease);
|
|
38
40
|
if (diffPercentOnly) {
|
|
39
41
|
text += `${diffPercentage}`;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
+
} else {
|
|
42
43
|
text += `${formatDifference(absDiff, isIncrease, format)}`;
|
|
43
44
|
if (diffPercent !== 0) {
|
|
44
45
|
text += ` (${diffPercentage})`;
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
|
-
return
|
|
49
|
+
return /*#__PURE__*/ _jsxs(BodyText, {
|
|
50
|
+
className: classNames(Styles.statDiff, {
|
|
49
51
|
'c-red-500': !neutral && (inverted ? isIncrease : !isIncrease),
|
|
50
52
|
'c-green-500': !neutral && (inverted ? !isIncrease : isIncrease),
|
|
51
|
-
'c-neutral-200': !!neutral
|
|
52
|
-
}, className),
|
|
53
|
+
'c-neutral-200': !!neutral
|
|
54
|
+
}, className),
|
|
55
|
+
size: size !== null && size !== void 0 ? size : 'small',
|
|
56
|
+
"data-cy": "stat-diff-value",
|
|
57
|
+
children: [
|
|
58
|
+
/*#__PURE__*/ _jsx("span", {
|
|
59
|
+
children: diff
|
|
60
|
+
}),
|
|
61
|
+
value === undefined ? '\u00A0' : text
|
|
62
|
+
]
|
|
63
|
+
});
|
|
53
64
|
};
|
|
54
|
-
export const StatCard = ({ title, description, popoverContent, value, percent, money, rate, prev, clean, inverted, neutral, fill, valueOnly, className, diffPercentOnly = false
|
|
65
|
+
export const StatCard = ({ title, description, popoverContent, value, percent, money, rate, prev, clean, inverted, neutral, fill, valueOnly, className, diffPercentOnly = false })=>{
|
|
55
66
|
const [popoverShown, setPopoverShown] = useState(false);
|
|
56
67
|
const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';
|
|
57
68
|
const val = value === undefined ? '\u00A0' : formatValue(value, format);
|
|
58
|
-
const eyebrow =
|
|
69
|
+
const eyebrow = /*#__PURE__*/ _jsx(Eyebrow, {
|
|
70
|
+
className: classNames(Styles.title, 'ta-center'),
|
|
71
|
+
"data-cy": `marketing-stat-${title}-title`,
|
|
72
|
+
onMouseEnter: ()=>{
|
|
59
73
|
setPopoverShown(true);
|
|
60
|
-
},
|
|
61
|
-
|
|
74
|
+
},
|
|
75
|
+
children: title
|
|
76
|
+
});
|
|
77
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
78
|
+
direction: "column",
|
|
79
|
+
alignItems: "center",
|
|
80
|
+
className: classNames('p-y-3', {
|
|
62
81
|
'bg-white border-radius-2 border': !clean,
|
|
63
|
-
'flex-grow-1 flex-basis-0': fill
|
|
64
|
-
}, className),
|
|
82
|
+
'flex-grow-1 flex-basis-0': fill
|
|
83
|
+
}, className),
|
|
84
|
+
onMouseLeave: ()=>setPopoverShown(false),
|
|
85
|
+
children: [
|
|
86
|
+
popoverContent ? /*#__PURE__*/ _jsx(Popover, {
|
|
87
|
+
open: popoverShown,
|
|
88
|
+
trigger: eyebrow,
|
|
89
|
+
children: popoverContent
|
|
90
|
+
}) : description ? /*#__PURE__*/ _jsx(Tooltip, {
|
|
91
|
+
text: description,
|
|
92
|
+
"data-cy": `marketing-stat-${title}-tooltip`,
|
|
93
|
+
children: eyebrow
|
|
94
|
+
}) : eyebrow,
|
|
95
|
+
/*#__PURE__*/ _jsx(BodyText, {
|
|
96
|
+
className: "fs-6-i ff-display",
|
|
97
|
+
"data-cy": `marketing-stat-${title}-value`,
|
|
98
|
+
children: val
|
|
99
|
+
}),
|
|
100
|
+
!valueOnly && /*#__PURE__*/ _jsx(StatDiff, {
|
|
101
|
+
value: value,
|
|
102
|
+
prev: prev,
|
|
103
|
+
format: format,
|
|
104
|
+
inverted: inverted,
|
|
105
|
+
neutral: neutral,
|
|
106
|
+
diffPercentOnly: diffPercentOnly
|
|
107
|
+
})
|
|
108
|
+
]
|
|
109
|
+
});
|
|
65
110
|
};
|
|
111
|
+
|
|
66
112
|
//# sourceMappingURL=stat-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/stat/stat-card.tsx"],"sourcesContent":["import { FC, ReactNode, useState } from 'react';\nimport classNames from 'classnames';\nimport {\n BodyText,\n BodyTextPropsStrict,\n Eyebrow,\n Popover,\n Stack,\n Tooltip,\n} from '@servicetitan/design-system';\nimport * as Styles from './stat-card.module.less';\nimport { formatValue, NumberFormatter } from '../../utils/formatters';\n\nconst calculateDiff = (\n value: number,\n prev: number,\n percents?: boolean\n): [number, number, boolean] => {\n const diff = (value - prev) * (percents ? 100 : 1);\n const absDiff = Math.abs(diff);\n let diffPercent = 0;\n\n if (percents) {\n diffPercent = diff;\n } else if (absDiff) {\n diffPercent = prev ? (100 * absDiff) / prev : 100;\n }\n\n return [absDiff, diffPercent, diff >= 0];\n};\n\nconst formatDifference = (value: number, isPlus: boolean, format: NumberFormatter): string => {\n return (isPlus ? '+' : '-') + formatValue(value, format);\n};\n\nconst formatDifferencePercentage = (value: number, isPlus: boolean): string => {\n if (!value) {\n return '';\n }\n\n return (isPlus ? '+' : '-') + formatValue(value, 'percent-100');\n};\n\ninterface StatDiffProps {\n value?: number;\n prev?: number;\n size?: BodyTextPropsStrict['size'];\n format: NumberFormatter;\n inverted?: boolean;\n neutral?: boolean;\n className?: string;\n diffPercentOnly?: boolean;\n}\n\nexport const StatDiff: FC<StatDiffProps> = ({\n value,\n prev,\n size,\n format,\n inverted,\n neutral,\n className,\n diffPercentOnly = false,\n}) => {\n const percents = format === 'percent';\n const [absDiff, diffPercent, isIncrease] = calculateDiff(value ?? 0, prev ?? 0, percents);\n const diff = absDiff === 0 ? '' : isIncrease ? '▲ ' : '▼ ';\n let text = '';\n\n if (percents) {\n text += formatDifferencePercentage(absDiff, isIncrease);\n } else {\n const diffPercentage = formatDifferencePercentage(diffPercent, isIncrease);\n\n if (diffPercentOnly) {\n text += `${diffPercentage}`;\n } else {\n text += `${formatDifference(absDiff, isIncrease, format)}`;\n\n if (diffPercent !== 0) {\n text += ` (${diffPercentage})`;\n }\n }\n }\n\n return (\n <BodyText\n className={classNames(\n Styles.statDiff,\n {\n 'c-red-500': !neutral && (inverted ? isIncrease : !isIncrease),\n 'c-green-500': !neutral && (inverted ? !isIncrease : isIncrease),\n 'c-neutral-200': !!neutral,\n },\n className\n )}\n size={size ?? 'small'}\n data-cy=\"stat-diff-value\"\n >\n <span>{diff}</span>\n {value === undefined ? '\\u00A0' : text}\n </BodyText>\n );\n};\n\nexport interface StatCardProps {\n title: string;\n description?: string;\n popoverContent?: ReactNode;\n value?: number;\n prev?: number;\n percent?: boolean;\n money?: boolean;\n rate?: boolean;\n clean?: boolean;\n inverted?: boolean;\n neutral?: boolean;\n fill?: boolean;\n valueOnly?: boolean;\n className?: string;\n diffPercentOnly?: boolean;\n}\n\nexport const StatCard: FC<StatCardProps> = ({\n title,\n description,\n popoverContent,\n value,\n percent,\n money,\n rate,\n prev,\n clean,\n inverted,\n neutral,\n fill,\n valueOnly,\n className,\n diffPercentOnly = false,\n}) => {\n const [popoverShown, setPopoverShown] = useState(false);\n const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';\n const val = value === undefined ? '\\u00A0' : formatValue(value, format);\n\n const eyebrow = (\n <Eyebrow\n className={classNames(Styles.title, 'ta-center')}\n data-cy={`marketing-stat-${title}-title`}\n onMouseEnter={() => {\n setPopoverShown(true);\n }}\n >\n {title}\n </Eyebrow>\n );\n\n return (\n <Stack\n direction=\"column\"\n alignItems=\"center\"\n className={classNames(\n 'p-y-3',\n {\n 'bg-white border-radius-2 border': !clean,\n 'flex-grow-1 flex-basis-0': fill,\n },\n className\n )}\n onMouseLeave={() => setPopoverShown(false)}\n >\n {popoverContent ? (\n <Popover open={popoverShown} trigger={eyebrow}>\n {popoverContent}\n </Popover>\n ) : description ? (\n <Tooltip text={description} data-cy={`marketing-stat-${title}-tooltip`}>\n {eyebrow}\n </Tooltip>\n ) : (\n eyebrow\n )}\n <BodyText className=\"fs-6-i ff-display\" data-cy={`marketing-stat-${title}-value`}>\n {val}\n </BodyText>\n {!valueOnly && (\n <StatDiff\n value={value}\n prev={prev}\n format={format}\n inverted={inverted}\n neutral={neutral}\n diffPercentOnly={diffPercentOnly}\n />\n )}\n </Stack>\n );\n};\n"],"names":["useState","classNames","BodyText","Eyebrow","Popover","Stack","Tooltip","Styles","formatValue","calculateDiff","value","prev","percents","diff","absDiff","Math","abs","diffPercent","formatDifference","isPlus","format","formatDifferencePercentage","StatDiff","size","inverted","neutral","className","diffPercentOnly","isIncrease","text","diffPercentage","statDiff","data-cy","span","undefined","StatCard","title","description","popoverContent","percent","money","rate","clean","fill","valueOnly","popoverShown","setPopoverShown","val","eyebrow","onMouseEnter","direction","alignItems","onMouseLeave","open","trigger"],"mappings":";AAAA,SAAwBA,QAAQ,QAAQ,QAAQ;AAChD,OAAOC,gBAAgB,aAAa;AACpC,SACIC,QAAQ,EAERC,OAAO,EACPC,OAAO,EACPC,KAAK,EACLC,OAAO,QACJ,8BAA8B;AACrC,YAAYC,YAAY,0BAA0B;AAClD,SAASC,WAAW,QAAyB,yBAAyB;AAEtE,MAAMC,gBAAgB,CAClBC,OACAC,MACAC;IAEA,MAAMC,OAAO,AAACH,CAAAA,QAAQC,IAAG,IAAMC,CAAAA,WAAW,MAAM,CAAA;IAChD,MAAME,UAAUC,KAAKC,GAAG,CAACH;IACzB,IAAII,cAAc;IAElB,IAAIL,UAAU;QACVK,cAAcJ;IAClB,OAAO,IAAIC,SAAS;QAChBG,cAAcN,OAAO,AAAC,MAAMG,UAAWH,OAAO;IAClD;IAEA,OAAO;QAACG;QAASG;QAAaJ,QAAQ;KAAE;AAC5C;AAEA,MAAMK,mBAAmB,CAACR,OAAeS,QAAiBC;IACtD,OAAO,AAACD,CAAAA,SAAS,MAAM,GAAE,IAAKX,YAAYE,OAAOU;AACrD;AAEA,MAAMC,6BAA6B,CAACX,OAAeS;IAC/C,IAAI,CAACT,OAAO;QACR,OAAO;IACX;IAEA,OAAO,AAACS,CAAAA,SAAS,MAAM,GAAE,IAAKX,YAAYE,OAAO;AACrD;AAaA,OAAO,MAAMY,WAA8B,CAAC,EACxCZ,KAAK,EACLC,IAAI,EACJY,IAAI,EACJH,MAAM,EACNI,QAAQ,EACRC,OAAO,EACPC,SAAS,EACTC,kBAAkB,KAAK,EAC1B;IACG,MAAMf,WAAWQ,WAAW;IAC5B,MAAM,CAACN,SAASG,aAAaW,WAAW,GAAGnB,cAAcC,kBAAAA,mBAAAA,QAAS,GAAGC,iBAAAA,kBAAAA,OAAQ,GAAGC;IAChF,MAAMC,OAAOC,YAAY,IAAI,KAAKc,aAAa,OAAO;IACtD,IAAIC,OAAO;IAEX,IAAIjB,UAAU;QACViB,QAAQR,2BAA2BP,SAASc;IAChD,OAAO;QACH,MAAME,iBAAiBT,2BAA2BJ,aAAaW;QAE/D,IAAID,iBAAiB;YACjBE,QAAQ,GAAGC,gBAAgB;QAC/B,OAAO;YACHD,QAAQ,GAAGX,iBAAiBJ,SAASc,YAAYR,SAAS;YAE1D,IAAIH,gBAAgB,GAAG;gBACnBY,QAAQ,CAAC,EAAE,EAAEC,eAAe,CAAC,CAAC;YAClC;QACJ;IACJ;IAEA,qBACI,MAAC5B;QACGwB,WAAWzB,WACPM,OAAOwB,QAAQ,EACf;YACI,aAAa,CAACN,WAAYD,CAAAA,WAAWI,aAAa,CAACA,UAAS;YAC5D,eAAe,CAACH,WAAYD,CAAAA,WAAW,CAACI,aAAaA,UAAS;YAC9D,iBAAiB,CAAC,CAACH;QACvB,GACAC;QAEJH,MAAMA,iBAAAA,kBAAAA,OAAQ;QACdS,WAAQ;;0BAER,KAACC;0BAAMpB;;YACNH,UAAUwB,YAAY,WAAWL;;;AAG9C,EAAE;AAoBF,OAAO,MAAMM,WAA8B,CAAC,EACxCC,KAAK,EACLC,WAAW,EACXC,cAAc,EACd5B,KAAK,EACL6B,OAAO,EACPC,KAAK,EACLC,IAAI,EACJ9B,IAAI,EACJ+B,KAAK,EACLlB,QAAQ,EACRC,OAAO,EACPkB,IAAI,EACJC,SAAS,EACTlB,SAAS,EACTC,kBAAkB,KAAK,EAC1B;IACG,MAAM,CAACkB,cAAcC,gBAAgB,GAAG9C,SAAS;IACjD,MAAMoB,SAASoB,QAAQ,UAAUD,UAAU,YAAYE,OAAO,SAAS;IACvE,MAAMM,MAAMrC,UAAUwB,YAAY,WAAW1B,YAAYE,OAAOU;IAEhE,MAAM4B,wBACF,KAAC7C;QACGuB,WAAWzB,WAAWM,OAAO6B,KAAK,EAAE;QACpCJ,WAAS,CAAC,eAAe,EAAEI,MAAM,MAAM,CAAC;QACxCa,cAAc;YACVH,gBAAgB;QACpB;kBAECV;;IAIT,qBACI,MAAC/B;QACG6C,WAAU;QACVC,YAAW;QACXzB,WAAWzB,WACP,SACA;YACI,mCAAmC,CAACyC;YACpC,4BAA4BC;QAChC,GACAjB;QAEJ0B,cAAc,IAAMN,gBAAgB;;YAEnCR,+BACG,KAAClC;gBAAQiD,MAAMR;gBAAcS,SAASN;0BACjCV;iBAELD,4BACA,KAAC/B;gBAAQuB,MAAMQ;gBAAaL,WAAS,CAAC,eAAe,EAAEI,MAAM,QAAQ,CAAC;0BACjEY;iBAGLA;0BAEJ,KAAC9C;gBAASwB,WAAU;gBAAoBM,WAAS,CAAC,eAAe,EAAEI,MAAM,MAAM,CAAC;0BAC3EW;;YAEJ,CAACH,2BACE,KAACtB;gBACGZ,OAAOA;gBACPC,MAAMA;gBACNS,QAAQA;gBACRI,UAAUA;gBACVC,SAASA;gBACTE,iBAAiBA;;;;AAKrC,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-cards.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stat/stat-cards.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stat-cards.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stat/stat-cards.stories.tsx"],"names":[],"mappings":";;;;;AAIA,wBAIE;AAIF,eAAO,MAAM,cAAc,+CAA+D,CAAC;AAC3F,eAAO,MAAM,0BAA0B,+CAOrC,CAAC;AACH,eAAO,MAAM,yBAAyB,+CAEpC,CAAC;AACH,eAAO,MAAM,aAAa,+CAAuE,CAAC;AAClG,eAAO,MAAM,uBAAuB,+CAElC,CAAC;AACH,eAAO,MAAM,YAAY,+CAAiE,CAAC"}
|
|
@@ -4,10 +4,82 @@ import { BodyText, Icon, Headline, Eyebrow, Stack, Tooltip } from '@servicetitan
|
|
|
4
4
|
import { formatValue } from '../../utils/formatters';
|
|
5
5
|
import { StatDiff } from './stat-card';
|
|
6
6
|
import * as Styles from './stat-card.module.less';
|
|
7
|
-
export const StatExtendedCard = ({ title, title2, description, value, goal, prev, percent, money, rate, inverted, neutral, fill, className, actions
|
|
7
|
+
export const StatExtendedCard = ({ title, title2, description, value, goal, prev, percent, money, rate, inverted, neutral, fill, className, actions })=>{
|
|
8
8
|
const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';
|
|
9
|
-
return
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
10
|
+
className: classNames('p-3 bg-white border border-radius-2', {
|
|
11
|
+
'flex-grow-1 flex-basis-0': fill
|
|
12
|
+
}, className),
|
|
13
|
+
children: [
|
|
14
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
15
|
+
justifyContent: "space-between",
|
|
16
|
+
alignItems: "center",
|
|
17
|
+
children: [
|
|
18
|
+
/*#__PURE__*/ _jsx(Stack.Item, {
|
|
19
|
+
fill: true,
|
|
20
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
21
|
+
children: [
|
|
22
|
+
/*#__PURE__*/ _jsx(Headline, {
|
|
23
|
+
size: "small",
|
|
24
|
+
children: title
|
|
25
|
+
}),
|
|
26
|
+
!!description && /*#__PURE__*/ _jsx(Tooltip, {
|
|
27
|
+
text: description,
|
|
28
|
+
"data-cy": `marketing-stat-card-${title}-info-tooltip`,
|
|
29
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
30
|
+
name: "info",
|
|
31
|
+
size: 18,
|
|
32
|
+
className: "c-neutral-80 m-l-half",
|
|
33
|
+
"data-cy": `marketing-stat-card-${title}-info-icon`
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
]
|
|
37
|
+
})
|
|
38
|
+
}),
|
|
39
|
+
actions && /*#__PURE__*/ _jsx(Stack.Item, {
|
|
40
|
+
shrink: 0,
|
|
41
|
+
children: actions
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
}),
|
|
45
|
+
/*#__PURE__*/ _jsx(Eyebrow, {
|
|
46
|
+
size: "small",
|
|
47
|
+
className: "m-t-2 c-black",
|
|
48
|
+
"data-cy": `marketing-stat-card-${title2}-title2`,
|
|
49
|
+
children: title2
|
|
50
|
+
}),
|
|
51
|
+
/*#__PURE__*/ _jsx(Stack, {
|
|
52
|
+
justifyContent: "space-between",
|
|
53
|
+
className: "m-t-half",
|
|
54
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
55
|
+
alignItems: "flex-end",
|
|
56
|
+
className: "flex-grow-1 flex-basis-0",
|
|
57
|
+
children: [
|
|
58
|
+
/*#__PURE__*/ _jsx(Headline, {
|
|
59
|
+
className: "m-b-0-i m-r-half fw-normal-i",
|
|
60
|
+
size: "xlarge",
|
|
61
|
+
children: formatValue(value, format)
|
|
62
|
+
}),
|
|
63
|
+
goal !== undefined ? /*#__PURE__*/ _jsxs(BodyText, {
|
|
64
|
+
subdued: true,
|
|
65
|
+
children: [
|
|
66
|
+
"/ ",
|
|
67
|
+
formatValue(goal, format),
|
|
68
|
+
" (Goal)"
|
|
69
|
+
]
|
|
70
|
+
}) : prev !== undefined ? /*#__PURE__*/ _jsx(StatDiff, {
|
|
71
|
+
value: value,
|
|
72
|
+
prev: prev,
|
|
73
|
+
format: format,
|
|
74
|
+
inverted: inverted,
|
|
75
|
+
neutral: neutral,
|
|
76
|
+
className: classNames(Styles.statExtendedDiff, 'm-l-1')
|
|
77
|
+
}) : undefined
|
|
78
|
+
]
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
]
|
|
82
|
+
});
|
|
12
83
|
};
|
|
84
|
+
|
|
13
85
|
//# sourceMappingURL=stat-extended-card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/stat/stat-extended-card.tsx"],"sourcesContent":["import { FC, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { BodyText, Icon, Headline, Eyebrow, Stack, Tooltip } from '@servicetitan/design-system';\nimport { formatValue } from '../../utils/formatters';\nimport { StatDiff } from './stat-card';\nimport * as Styles from './stat-card.module.less';\n\nexport interface StatExtendedCardProps {\n title: string;\n description?: string;\n title2: string;\n value: number;\n goal?: number;\n prev?: number;\n percent?: boolean;\n money?: boolean;\n rate?: boolean;\n inverted?: boolean;\n neutral?: boolean;\n fill?: boolean;\n className?: string;\n actions?: ReactNode;\n}\nexport const StatExtendedCard: FC<StatExtendedCardProps> = ({\n title,\n title2,\n description,\n value,\n goal,\n prev,\n percent,\n money,\n rate,\n inverted,\n neutral,\n fill,\n className,\n actions,\n}) => {\n const format = money ? 'money' : percent ? 'percent' : rate ? 'rate' : 'number';\n\n return (\n <div\n className={classNames(\n 'p-3 bg-white border border-radius-2',\n {\n 'flex-grow-1 flex-basis-0': fill,\n },\n className\n )}\n >\n <Stack justifyContent=\"space-between\" alignItems=\"center\">\n <Stack.Item fill>\n <Stack>\n <Headline size=\"small\">{title}</Headline>\n {!!description && (\n <Tooltip\n text={description}\n data-cy={`marketing-stat-card-${title}-info-tooltip`}\n >\n <Icon\n name=\"info\"\n size={18}\n className=\"c-neutral-80 m-l-half\"\n data-cy={`marketing-stat-card-${title}-info-icon`}\n />\n </Tooltip>\n )}\n </Stack>\n </Stack.Item>\n {actions && <Stack.Item shrink={0}>{actions}</Stack.Item>}\n </Stack>\n <Eyebrow\n size=\"small\"\n className=\"m-t-2 c-black\"\n data-cy={`marketing-stat-card-${title2}-title2`}\n >\n {title2}\n </Eyebrow>\n\n <Stack justifyContent=\"space-between\" className=\"m-t-half\">\n <Stack alignItems=\"flex-end\" className=\"flex-grow-1 flex-basis-0\">\n <Headline className=\"m-b-0-i m-r-half fw-normal-i\" size=\"xlarge\">\n {formatValue(value, format)}\n </Headline>\n {goal !== undefined ? (\n <BodyText subdued>/ {formatValue(goal, format)} (Goal)</BodyText>\n ) : prev !== undefined ? (\n <StatDiff\n value={value}\n prev={prev}\n format={format}\n inverted={inverted}\n neutral={neutral}\n className={classNames(Styles.statExtendedDiff, 'm-l-1')}\n />\n ) : undefined}\n </Stack>\n </Stack>\n </div>\n );\n};\n"],"names":["classNames","BodyText","Icon","Headline","Eyebrow","Stack","Tooltip","formatValue","StatDiff","Styles","StatExtendedCard","title","title2","description","value","goal","prev","percent","money","rate","inverted","neutral","fill","className","actions","format","div","justifyContent","alignItems","Item","size","text","data-cy","name","shrink","undefined","subdued","statExtendedDiff"],"mappings":";AACA,OAAOA,gBAAgB,aAAa;AACpC,SAASC,QAAQ,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,KAAK,EAAEC,OAAO,QAAQ,8BAA8B;AAChG,SAASC,WAAW,QAAQ,yBAAyB;AACrD,SAASC,QAAQ,QAAQ,cAAc;AACvC,YAAYC,YAAY,0BAA0B;AAkBlD,OAAO,MAAMC,mBAA8C,CAAC,EACxDC,KAAK,EACLC,MAAM,EACNC,WAAW,EACXC,KAAK,EACLC,IAAI,EACJC,IAAI,EACJC,OAAO,EACPC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,IAAI,EACJC,SAAS,EACTC,OAAO,EACV;IACG,MAAMC,SAASP,QAAQ,UAAUD,UAAU,YAAYE,OAAO,SAAS;IAEvE,qBACI,MAACO;QACGH,WAAWvB,WACP,uCACA;YACI,4BAA4BsB;QAChC,GACAC;;0BAGJ,MAAClB;gBAAMsB,gBAAe;gBAAgBC,YAAW;;kCAC7C,KAACvB,MAAMwB,IAAI;wBAACP,IAAI;kCACZ,cAAA,MAACjB;;8CACG,KAACF;oCAAS2B,MAAK;8CAASnB;;gCACvB,CAAC,CAACE,6BACC,KAACP;oCACGyB,MAAMlB;oCACNmB,WAAS,CAAC,oBAAoB,EAAErB,MAAM,aAAa,CAAC;8CAEpD,cAAA,KAACT;wCACG+B,MAAK;wCACLH,MAAM;wCACNP,WAAU;wCACVS,WAAS,CAAC,oBAAoB,EAAErB,MAAM,UAAU,CAAC;;;;;;oBAMpEa,yBAAW,KAACnB,MAAMwB,IAAI;wBAACK,QAAQ;kCAAIV;;;;0BAExC,KAACpB;gBACG0B,MAAK;gBACLP,WAAU;gBACVS,WAAS,CAAC,oBAAoB,EAAEpB,OAAO,OAAO,CAAC;0BAE9CA;;0BAGL,KAACP;gBAAMsB,gBAAe;gBAAgBJ,WAAU;0BAC5C,cAAA,MAAClB;oBAAMuB,YAAW;oBAAWL,WAAU;;sCACnC,KAACpB;4BAASoB,WAAU;4BAA+BO,MAAK;sCACnDvB,YAAYO,OAAOW;;wBAEvBV,SAASoB,0BACN,MAAClC;4BAASmC,OAAO;;gCAAC;gCAAG7B,YAAYQ,MAAMU;gCAAQ;;6BAC/CT,SAASmB,0BACT,KAAC3B;4BACGM,OAAOA;4BACPE,MAAMA;4BACNS,QAAQA;4BACRL,UAAUA;4BACVC,SAASA;4BACTE,WAAWvB,WAAWS,OAAO4B,gBAAgB,EAAE;6BAEnDF;;;;;;AAKxB,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-extended-card.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stat/stat-extended-card.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stat-extended-card.stories.d.ts","sourceRoot":"","sources":["../../../src/components/stat/stat-extended-card.stories.tsx"],"names":[],"mappings":";;;;;AAGA,wBAIE;AAIF,eAAO,MAAM,qBAAqB,+CAUhC,CAAC;AACH,eAAO,MAAM,qBAAqB,+CAEhC,CAAC;AACH,eAAO,MAAM,uBAAuB,+CASlC,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useRef } from 'react';
|
|
3
3
|
import classnames from 'classnames';
|
|
4
|
-
import { Icon, BodyText, Tooltip, useFocusVisible
|
|
4
|
+
import { Icon, BodyText, Tooltip, useFocusVisible } from '@servicetitan/design-system';
|
|
5
5
|
import * as Styles from './action-button.module.less';
|
|
6
|
-
export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaPrefix, active, tooltip
|
|
6
|
+
export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaPrefix, active, tooltip })=>{
|
|
7
7
|
const buttonRef = useRef(null);
|
|
8
8
|
const { isFocusVisible, focusFunction, blurFunction } = useFocusVisible(buttonRef);
|
|
9
|
-
const handleClick = ()
|
|
9
|
+
const handleClick = ()=>{
|
|
10
10
|
if (disabled) {
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
@@ -14,19 +14,45 @@ export const ActionButton = ({ onClick, disabled, children, iconName, hover, qaP
|
|
|
14
14
|
onClick();
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
|
-
const getButton = ()
|
|
17
|
+
const getButton = ()=>{
|
|
18
18
|
const classes = classnames(Styles.actionButton, qaPrefix, {
|
|
19
19
|
[Styles.primary]: hover === 'primary' && !disabled,
|
|
20
20
|
[Styles.negative]: hover === 'negative' && !disabled,
|
|
21
21
|
[Styles.active]: active && !disabled,
|
|
22
22
|
[Styles.disabled]: disabled,
|
|
23
|
-
[Styles.focusVisible]: isFocusVisible
|
|
23
|
+
[Styles.focusVisible]: isFocusVisible
|
|
24
|
+
});
|
|
25
|
+
return /*#__PURE__*/ _jsxs("button", {
|
|
26
|
+
type: "button",
|
|
27
|
+
ref: buttonRef,
|
|
28
|
+
className: classes,
|
|
29
|
+
onClick: handleClick,
|
|
30
|
+
disabled: disabled,
|
|
31
|
+
onFocus: focusFunction,
|
|
32
|
+
onBlur: blurFunction,
|
|
33
|
+
children: [
|
|
34
|
+
iconName && /*#__PURE__*/ _jsx(Icon, {
|
|
35
|
+
name: iconName,
|
|
36
|
+
size: "20px",
|
|
37
|
+
className: "m-r-1"
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ _jsx(BodyText, {
|
|
40
|
+
className: classnames(Styles.text, `${qaPrefix}-text`),
|
|
41
|
+
children: children
|
|
42
|
+
})
|
|
43
|
+
]
|
|
24
44
|
});
|
|
25
|
-
return (_jsxs("button", { type: "button", ref: buttonRef, className: classes, onClick: handleClick, disabled: disabled, onFocus: focusFunction, onBlur: blurFunction, children: [iconName && _jsx(Icon, { name: iconName, size: "20px", className: "m-r-1" }), _jsx(BodyText, { className: classnames(Styles.text, `${qaPrefix}-text`), children: children })] }));
|
|
26
45
|
};
|
|
27
46
|
if (!tooltip) {
|
|
28
47
|
return getButton();
|
|
29
48
|
}
|
|
30
|
-
return
|
|
49
|
+
return /*#__PURE__*/ _jsx(Tooltip, {
|
|
50
|
+
text: tooltip,
|
|
51
|
+
direction: "l",
|
|
52
|
+
el: "div",
|
|
53
|
+
className: `${qaPrefix}-tooltip`,
|
|
54
|
+
children: getButton()
|
|
55
|
+
});
|
|
31
56
|
};
|
|
57
|
+
|
|
32
58
|
//# sourceMappingURL=action-button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/action-button/action-button.tsx"],"sourcesContent":["import { ReactNode, FC, useRef } from 'react';\nimport classnames from 'classnames';\nimport {\n Icon,\n BodyText,\n IconNameType,\n Tooltip,\n useFocusVisible,\n} from '@servicetitan/design-system';\nimport * as Styles from './action-button.module.less';\n\nexport interface ActionButtonProps {\n children: ReactNode;\n iconName?: IconNameType;\n hover?: 'primary' | 'negative' | 'none';\n disabled?: boolean;\n tooltip?: string;\n qaPrefix?: string;\n active?: boolean;\n onClick?(): void;\n}\n\nexport const ActionButton: FC<ActionButtonProps> = ({\n onClick,\n disabled,\n children,\n iconName,\n hover,\n qaPrefix,\n active,\n tooltip,\n}) => {\n const buttonRef = useRef<HTMLButtonElement>(null);\n const { isFocusVisible, focusFunction, blurFunction } = useFocusVisible(buttonRef);\n\n const handleClick = () => {\n if (disabled) {\n return;\n }\n\n if (onClick) {\n onClick();\n }\n };\n\n const getButton = () => {\n const classes = classnames(Styles.actionButton, qaPrefix, {\n [Styles.primary]: hover === 'primary' && !disabled,\n [Styles.negative]: hover === 'negative' && !disabled,\n [Styles.active]: active && !disabled,\n [Styles.disabled]: disabled,\n [Styles.focusVisible]: isFocusVisible,\n });\n\n return (\n <button\n type=\"button\"\n ref={buttonRef}\n className={classes}\n onClick={handleClick}\n disabled={disabled}\n onFocus={focusFunction}\n onBlur={blurFunction}\n >\n {iconName && <Icon name={iconName} size=\"20px\" className=\"m-r-1\" />}\n <BodyText className={classnames(Styles.text, `${qaPrefix}-text`)}>\n {children}\n </BodyText>\n </button>\n );\n };\n\n if (!tooltip) {\n return getButton();\n }\n\n return (\n <Tooltip text={tooltip} direction=\"l\" el=\"div\" className={`${qaPrefix}-tooltip`}>\n {getButton()}\n </Tooltip>\n );\n};\n"],"names":["useRef","classnames","Icon","BodyText","Tooltip","useFocusVisible","Styles","ActionButton","onClick","disabled","children","iconName","hover","qaPrefix","active","tooltip","buttonRef","isFocusVisible","focusFunction","blurFunction","handleClick","getButton","classes","actionButton","primary","negative","focusVisible","button","type","ref","className","onFocus","onBlur","name","size","text","direction","el"],"mappings":";AAAA,SAAwBA,MAAM,QAAQ,QAAQ;AAC9C,OAAOC,gBAAgB,aAAa;AACpC,SACIC,IAAI,EACJC,QAAQ,EAERC,OAAO,EACPC,eAAe,QACZ,8BAA8B;AACrC,YAAYC,YAAY,8BAA8B;AAatD,OAAO,MAAMC,eAAsC,CAAC,EAChDC,OAAO,EACPC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACNC,OAAO,EACV;IACG,MAAMC,YAAYhB,OAA0B;IAC5C,MAAM,EAAEiB,cAAc,EAAEC,aAAa,EAAEC,YAAY,EAAE,GAAGd,gBAAgBW;IAExE,MAAMI,cAAc;QAChB,IAAIX,UAAU;YACV;QACJ;QAEA,IAAID,SAAS;YACTA;QACJ;IACJ;IAEA,MAAMa,YAAY;QACd,MAAMC,UAAUrB,WAAWK,OAAOiB,YAAY,EAAEV,UAAU;YACtD,CAACP,OAAOkB,OAAO,CAAC,EAAEZ,UAAU,aAAa,CAACH;YAC1C,CAACH,OAAOmB,QAAQ,CAAC,EAAEb,UAAU,cAAc,CAACH;YAC5C,CAACH,OAAOQ,MAAM,CAAC,EAAEA,UAAU,CAACL;YAC5B,CAACH,OAAOG,QAAQ,CAAC,EAAEA;YACnB,CAACH,OAAOoB,YAAY,CAAC,EAAET;QAC3B;QAEA,qBACI,MAACU;YACGC,MAAK;YACLC,KAAKb;YACLc,WAAWR;YACXd,SAASY;YACTX,UAAUA;YACVsB,SAASb;YACTc,QAAQb;;gBAEPR,0BAAY,KAACT;oBAAK+B,MAAMtB;oBAAUuB,MAAK;oBAAOJ,WAAU;;8BACzD,KAAC3B;oBAAS2B,WAAW7B,WAAWK,OAAO6B,IAAI,EAAE,GAAGtB,SAAS,KAAK,CAAC;8BAC1DH;;;;IAIjB;IAEA,IAAI,CAACK,SAAS;QACV,OAAOM;IACX;IAEA,qBACI,KAACjB;QAAQ+B,MAAMpB;QAASqB,WAAU;QAAIC,IAAG;QAAMP,WAAW,GAAGjB,SAAS,QAAQ,CAAC;kBAC1EQ;;AAGb,EAAE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const __esModule: true;
|
|
2
|
+
export const actionButton: string;
|
|
3
|
+
export const active: string;
|
|
4
|
+
export const disabled: string;
|
|
5
|
+
export const focusVisible: string;
|
|
6
|
+
export const negative: string;
|
|
7
|
+
export const primary: string;
|
|
8
|
+
export const text: string;
|
|
9
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-button.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/action-button/action-button.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action-button.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/action-button/action-button.stories.tsx"],"names":[],"mappings":";;;;;AAGA,wBAIE;AAMF,eAAO,MAAM,wBAAwB,+CAEnC,CAAC;AAEH,eAAO,MAAM,yBAAyB,+CAEpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/action-button/index.tsx"],"sourcesContent":["export * from './action-button';\n"],"names":[],"mappings":"AAAA,cAAc,kBAAkB"}
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import classnames from 'classnames';
|
|
3
3
|
import { BodyText, Stack, Spinner } from '@servicetitan/design-system';
|
|
4
|
-
export const CenteredSpinner = ({ size, className, info })
|
|
5
|
-
return
|
|
4
|
+
export const CenteredSpinner = ({ size, className, info })=>{
|
|
5
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
6
|
+
justifyContent: "center",
|
|
7
|
+
alignItems: "center",
|
|
8
|
+
direction: "column",
|
|
9
|
+
className: classnames(className, 'h-100 w-100'),
|
|
10
|
+
children: [
|
|
11
|
+
/*#__PURE__*/ _jsx(Spinner, {
|
|
12
|
+
className: "of-hidden",
|
|
13
|
+
size: size
|
|
14
|
+
}),
|
|
15
|
+
!!info && /*#__PURE__*/ _jsx(BodyText, {
|
|
16
|
+
size: "small",
|
|
17
|
+
className: "m-t-1",
|
|
18
|
+
subdued: true,
|
|
19
|
+
children: info
|
|
20
|
+
})
|
|
21
|
+
]
|
|
22
|
+
});
|
|
6
23
|
};
|
|
24
|
+
|
|
7
25
|
//# sourceMappingURL=centered-spinner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/centered-spinner/centered-spinner.tsx"],"sourcesContent":["import { FC } from 'react';\nimport classnames from 'classnames';\nimport { BodyText, Stack, Spinner } from '@servicetitan/design-system';\n\nexport interface CenteredSpinnerPropsStrict {\n /** Size variants */\n size?: 'large' | 'medium' | 'small' | 'tiny';\n className?: string;\n info?: string;\n}\n\nexport const CenteredSpinner: FC<CenteredSpinnerPropsStrict> = ({ size, className, info }) => {\n return (\n <Stack\n justifyContent=\"center\"\n alignItems=\"center\"\n direction=\"column\"\n className={classnames(className, 'h-100 w-100')}\n >\n <Spinner className=\"of-hidden\" size={size} />\n {!!info && (\n <BodyText size=\"small\" className=\"m-t-1\" subdued>\n {info}\n </BodyText>\n )}\n </Stack>\n );\n};\n"],"names":["classnames","BodyText","Stack","Spinner","CenteredSpinner","size","className","info","justifyContent","alignItems","direction","subdued"],"mappings":";AACA,OAAOA,gBAAgB,aAAa;AACpC,SAASC,QAAQ,EAAEC,KAAK,EAAEC,OAAO,QAAQ,8BAA8B;AASvE,OAAO,MAAMC,kBAAkD,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,EAAE;IACrF,qBACI,MAACL;QACGM,gBAAe;QACfC,YAAW;QACXC,WAAU;QACVJ,WAAWN,WAAWM,WAAW;;0BAEjC,KAACH;gBAAQG,WAAU;gBAAYD,MAAMA;;YACpC,CAAC,CAACE,sBACC,KAACN;gBAASI,MAAK;gBAAQC,WAAU;gBAAQK,OAAO;0BAC3CJ;;;;AAKrB,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"centered-spinner.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/centered-spinner/centered-spinner.stories.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"centered-spinner.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/centered-spinner/centered-spinner.stories.tsx"],"names":[],"mappings":";;;;;AAGA,wBAIE;AAMF,eAAO,MAAM,mBAAmB,+CAA+C,CAAC;AAChF,eAAO,MAAM,eAAe,+CAAoE,CAAC;AACjG,eAAO,MAAM,qBAAqB,+CAEhC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAW,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAY,oBAAoB,EAAe,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAa,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAGjF,UAAU,YAAY;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B,CAAC,UAAU,SAAS,MAAM;IACjE,KAAK,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAC3B,OAAO,EAAE,CACL,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,EACpC,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAClC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,KACnC,YAAY,CAAC;KACrB,CAAC;CACL;AAwBD,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAW,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAY,oBAAoB,EAAe,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAa,+BAA+B,EAAE,MAAM,qBAAqB,CAAC;AAGjF,UAAU,YAAY;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B,CAAC,UAAU,SAAS,MAAM;IACjE,KAAK,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,+BAA+B,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAC3B,OAAO,EAAE,CACL,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,EACpC,WAAW,EAAE,YAAY,EACzB,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAClC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,KACnC,YAAY,CAAC;KACrB,CAAC;CACL;AAwBD,eAAO,MAAM,eAAe,GACvB,UAAU,SAAS,MAAM,kDAMvB,0BAA0B,CAAC,UAAU,CAAC,4CA8E5C,CAAC"}
|