hs-uix 1.4.1 → 1.5.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/README.md +20 -2
- package/common-components.d.ts +55 -0
- package/dist/common-components.js +260 -0
- package/dist/common-components.mjs +221 -0
- package/dist/datatable.js +35 -10
- package/dist/datatable.mjs +35 -10
- package/dist/index.js +243 -10
- package/dist/index.mjs +238 -10
- package/dist/utils.js +269 -0
- package/dist/utils.mjs +230 -0
- package/index.d.ts +21 -0
- package/package.json +14 -2
- package/utils.d.ts +59 -0
package/dist/index.mjs
CHANGED
|
@@ -304,7 +304,9 @@ var DataTable = ({
|
|
|
304
304
|
const initialSortState = useMemo(() => {
|
|
305
305
|
return normalizeSortState(columns, defaultSort);
|
|
306
306
|
}, [columns, defaultSort]);
|
|
307
|
-
const [internalSearchTerm, setInternalSearchTerm] = useState(
|
|
307
|
+
const [internalSearchTerm, setInternalSearchTerm] = useState(
|
|
308
|
+
() => serverSide && searchValue != null ? searchValue : ""
|
|
309
|
+
);
|
|
308
310
|
const [internalFilterValues, setInternalFilterValues] = useState(() => {
|
|
309
311
|
const init = {};
|
|
310
312
|
filters.forEach((f) => {
|
|
@@ -315,7 +317,16 @@ var DataTable = ({
|
|
|
315
317
|
const [internalSortState, setInternalSortState] = useState(initialSortState);
|
|
316
318
|
const [currentPage, setCurrentPage] = useState(1);
|
|
317
319
|
const [showMoreFilters, setShowMoreFilters] = useState(false);
|
|
320
|
+
const lastAppliedSearchRef = useRef(
|
|
321
|
+
serverSide && searchValue != null ? searchValue : ""
|
|
322
|
+
);
|
|
318
323
|
const searchTerm = serverSide && searchValue != null ? searchValue : internalSearchTerm;
|
|
324
|
+
useEffect(() => {
|
|
325
|
+
if (!serverSide || searchValue == null) return;
|
|
326
|
+
if (searchValue === lastAppliedSearchRef.current) return;
|
|
327
|
+
lastAppliedSearchRef.current = searchValue;
|
|
328
|
+
setInternalSearchTerm(searchValue);
|
|
329
|
+
}, [serverSide, searchValue]);
|
|
319
330
|
const filterValues = serverSide && externalFilterValues != null ? externalFilterValues : internalFilterValues;
|
|
320
331
|
const externalSortState = useMemo(
|
|
321
332
|
() => normalizeSortState(columns, externalSort),
|
|
@@ -349,15 +360,16 @@ var DataTable = ({
|
|
|
349
360
|
const handleSearchChange = useCallback((term) => {
|
|
350
361
|
setInternalSearchTerm(term);
|
|
351
362
|
resetPage();
|
|
363
|
+
const dispatch = () => {
|
|
364
|
+
lastAppliedSearchRef.current = term;
|
|
365
|
+
fireSearchCallback(term);
|
|
366
|
+
fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
|
|
367
|
+
};
|
|
352
368
|
if (searchDebounce > 0) {
|
|
353
369
|
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
354
|
-
debounceRef.current = setTimeout(
|
|
355
|
-
fireSearchCallback(term);
|
|
356
|
-
fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
|
|
357
|
-
}, searchDebounce);
|
|
370
|
+
debounceRef.current = setTimeout(dispatch, searchDebounce);
|
|
358
371
|
} else {
|
|
359
|
-
|
|
360
|
-
fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
|
|
372
|
+
dispatch();
|
|
361
373
|
}
|
|
362
374
|
}, [searchDebounce, fireSearchCallback, fireParamsChange, resetPage, resetPageOnChange]);
|
|
363
375
|
useEffect(() => () => {
|
|
@@ -439,10 +451,23 @@ var DataTable = ({
|
|
|
439
451
|
if (serverSide) return filteredData;
|
|
440
452
|
const activeField = Object.keys(sortState).find((k) => sortState[k] !== "none");
|
|
441
453
|
if (!activeField) return filteredData;
|
|
454
|
+
const activeCol = columns.find((c) => c.field === activeField);
|
|
455
|
+
const sortOrder = Array.isArray(activeCol == null ? void 0 : activeCol.sortOrder) ? activeCol.sortOrder : null;
|
|
456
|
+
const sortOrderIndex = (val) => {
|
|
457
|
+
const idx = sortOrder.indexOf(val);
|
|
458
|
+
return idx === -1 ? sortOrder.length : idx;
|
|
459
|
+
};
|
|
442
460
|
return [...filteredData].sort((a, b) => {
|
|
443
461
|
const dir = sortState[activeField] === "ascending" ? 1 : -1;
|
|
444
462
|
const aVal = a[activeField];
|
|
445
463
|
const bVal = b[activeField];
|
|
464
|
+
if (typeof (activeCol == null ? void 0 : activeCol.sortComparator) === "function") {
|
|
465
|
+
return dir * activeCol.sortComparator(aVal, bVal, a, b);
|
|
466
|
+
}
|
|
467
|
+
if (sortOrder) {
|
|
468
|
+
const diff = sortOrderIndex(aVal) - sortOrderIndex(bVal);
|
|
469
|
+
if (diff !== 0) return dir * diff;
|
|
470
|
+
}
|
|
446
471
|
if (aVal == null && bVal == null) return 0;
|
|
447
472
|
if (aVal == null) return 1;
|
|
448
473
|
if (bVal == null) return -1;
|
|
@@ -450,7 +475,7 @@ var DataTable = ({
|
|
|
450
475
|
if (aVal > bVal) return dir;
|
|
451
476
|
return 0;
|
|
452
477
|
});
|
|
453
|
-
}, [filteredData, sortState, serverSide]);
|
|
478
|
+
}, [filteredData, sortState, serverSide, columns]);
|
|
454
479
|
const groupedData = useMemo(() => {
|
|
455
480
|
if (!groupBy) return null;
|
|
456
481
|
const source = serverSide ? data : sortedData;
|
|
@@ -974,12 +999,12 @@ var DataTable = ({
|
|
|
974
999
|
}
|
|
975
1000
|
);
|
|
976
1001
|
};
|
|
977
|
-
return /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "
|
|
1002
|
+
return /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "end", gap: "sm", wrap: "wrap" }, showSearch && searchFields.length > 0 && /* @__PURE__ */ React.createElement(
|
|
978
1003
|
SearchInput,
|
|
979
1004
|
{
|
|
980
1005
|
name: "datatable-search",
|
|
981
1006
|
placeholder: searchPlaceholder,
|
|
982
|
-
value:
|
|
1007
|
+
value: internalSearchTerm,
|
|
983
1008
|
onChange: handleSearchChange
|
|
984
1009
|
}
|
|
985
1010
|
), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ React.createElement(
|
|
@@ -3482,8 +3507,211 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
|
|
|
3482
3507
|
formContent
|
|
3483
3508
|
);
|
|
3484
3509
|
});
|
|
3510
|
+
|
|
3511
|
+
// src/common-components/AutoTag.js
|
|
3512
|
+
import React3 from "react";
|
|
3513
|
+
import { Tag as Tag2 } from "@hubspot/ui-extensions";
|
|
3514
|
+
|
|
3515
|
+
// src/utils/tagVariants.js
|
|
3516
|
+
var DEFAULT_VARIANT = "default";
|
|
3517
|
+
var DANGER_VARIANT = "danger";
|
|
3518
|
+
var ERROR_VARIANT = "error";
|
|
3519
|
+
var SUCCESS_MATCHERS = [
|
|
3520
|
+
"active",
|
|
3521
|
+
"success",
|
|
3522
|
+
"succeeded",
|
|
3523
|
+
"complete",
|
|
3524
|
+
"completed",
|
|
3525
|
+
"approved",
|
|
3526
|
+
"won",
|
|
3527
|
+
"healthy",
|
|
3528
|
+
"enabled",
|
|
3529
|
+
"connected",
|
|
3530
|
+
"paid",
|
|
3531
|
+
"live",
|
|
3532
|
+
"published",
|
|
3533
|
+
"available",
|
|
3534
|
+
"synced",
|
|
3535
|
+
"resolved"
|
|
3536
|
+
];
|
|
3537
|
+
var WARNING_MATCHERS = [
|
|
3538
|
+
"warning",
|
|
3539
|
+
"at risk",
|
|
3540
|
+
"risky",
|
|
3541
|
+
"pending",
|
|
3542
|
+
"paused",
|
|
3543
|
+
"pause",
|
|
3544
|
+
"on hold",
|
|
3545
|
+
"hold",
|
|
3546
|
+
"review",
|
|
3547
|
+
"expiring",
|
|
3548
|
+
"trial",
|
|
3549
|
+
"in progress",
|
|
3550
|
+
"awaiting",
|
|
3551
|
+
"scheduled"
|
|
3552
|
+
];
|
|
3553
|
+
var DANGER_MATCHERS = [
|
|
3554
|
+
"danger",
|
|
3555
|
+
"error",
|
|
3556
|
+
"failed",
|
|
3557
|
+
"failure",
|
|
3558
|
+
"inactive",
|
|
3559
|
+
"disabled",
|
|
3560
|
+
"blocked",
|
|
3561
|
+
"cancelled",
|
|
3562
|
+
"canceled",
|
|
3563
|
+
"rejected",
|
|
3564
|
+
"denied",
|
|
3565
|
+
"churned",
|
|
3566
|
+
"lost",
|
|
3567
|
+
"overdue",
|
|
3568
|
+
"expired",
|
|
3569
|
+
"offline",
|
|
3570
|
+
"deleted",
|
|
3571
|
+
"archived",
|
|
3572
|
+
"unpaid"
|
|
3573
|
+
];
|
|
3574
|
+
var INFO_MATCHERS = [
|
|
3575
|
+
"info",
|
|
3576
|
+
"new",
|
|
3577
|
+
"queued",
|
|
3578
|
+
"processing",
|
|
3579
|
+
"progress",
|
|
3580
|
+
"upcoming",
|
|
3581
|
+
"draft",
|
|
3582
|
+
"open"
|
|
3583
|
+
];
|
|
3584
|
+
var normalizeTagValue = (value) => {
|
|
3585
|
+
if (value == null) return "";
|
|
3586
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
3587
|
+
return String(value).trim().toLowerCase().replace(/[_-]+/g, " ").replace(/\s+/g, " ");
|
|
3588
|
+
};
|
|
3589
|
+
var matchesAny = (value, matchers) => matchers.some((matcher) => {
|
|
3590
|
+
if (value === matcher) return true;
|
|
3591
|
+
return ` ${value} `.includes(` ${matcher} `);
|
|
3592
|
+
});
|
|
3593
|
+
var getSemanticVariant = (value, options = {}) => {
|
|
3594
|
+
const normalized = normalizeTagValue(value);
|
|
3595
|
+
const fallback = options.fallback || DEFAULT_VARIANT;
|
|
3596
|
+
if (!normalized) return fallback;
|
|
3597
|
+
if (options.overrides) {
|
|
3598
|
+
const overrideKey = Object.keys(options.overrides).find(
|
|
3599
|
+
(key) => normalizeTagValue(key) === normalized
|
|
3600
|
+
);
|
|
3601
|
+
if (overrideKey) return options.overrides[overrideKey];
|
|
3602
|
+
}
|
|
3603
|
+
if (normalized === "true") return "success";
|
|
3604
|
+
if (normalized === "false") return fallback;
|
|
3605
|
+
if (matchesAny(normalized, SUCCESS_MATCHERS)) return "success";
|
|
3606
|
+
if (matchesAny(normalized, DANGER_MATCHERS)) return DANGER_VARIANT;
|
|
3607
|
+
if (matchesAny(normalized, WARNING_MATCHERS)) return "warning";
|
|
3608
|
+
if (matchesAny(normalized, INFO_MATCHERS)) return "info";
|
|
3609
|
+
return fallback;
|
|
3610
|
+
};
|
|
3611
|
+
var getAutoTagVariant = (value, options = {}) => {
|
|
3612
|
+
const semanticVariant = getSemanticVariant(value, options);
|
|
3613
|
+
return semanticVariant === DANGER_VARIANT ? ERROR_VARIANT : semanticVariant;
|
|
3614
|
+
};
|
|
3615
|
+
var getAutoStatusTagVariant = (value, options = {}) => getSemanticVariant(value, options);
|
|
3616
|
+
var getAutoTagDisplayValue = (value) => {
|
|
3617
|
+
if (typeof value === "boolean") return value ? "True" : "False";
|
|
3618
|
+
return value;
|
|
3619
|
+
};
|
|
3620
|
+
var DEFAULT_STATUS_TAG_COLOR_ORDER = [
|
|
3621
|
+
"success",
|
|
3622
|
+
"warning",
|
|
3623
|
+
"danger",
|
|
3624
|
+
"error",
|
|
3625
|
+
"info",
|
|
3626
|
+
"default"
|
|
3627
|
+
];
|
|
3628
|
+
var createStatusTagSortComparator = (options = {}) => {
|
|
3629
|
+
const {
|
|
3630
|
+
variantOrder = DEFAULT_STATUS_TAG_COLOR_ORDER,
|
|
3631
|
+
overrides,
|
|
3632
|
+
fallback,
|
|
3633
|
+
getLabel
|
|
3634
|
+
} = options;
|
|
3635
|
+
const variantIndex = (variant) => {
|
|
3636
|
+
const idx = variantOrder.indexOf(variant);
|
|
3637
|
+
return idx === -1 ? variantOrder.length : idx;
|
|
3638
|
+
};
|
|
3639
|
+
const labelOf = (value) => {
|
|
3640
|
+
if (getLabel) return String(getLabel(value) ?? "");
|
|
3641
|
+
if (value == null) return "";
|
|
3642
|
+
return String(getAutoTagDisplayValue(value) ?? "");
|
|
3643
|
+
};
|
|
3644
|
+
return (aVal, bVal) => {
|
|
3645
|
+
const aVariant = getSemanticVariant(aVal, { overrides, fallback });
|
|
3646
|
+
const bVariant = getSemanticVariant(bVal, { overrides, fallback });
|
|
3647
|
+
const diff = variantIndex(aVariant) - variantIndex(bVariant);
|
|
3648
|
+
if (diff !== 0) return diff;
|
|
3649
|
+
return labelOf(aVal).localeCompare(labelOf(bVal));
|
|
3650
|
+
};
|
|
3651
|
+
};
|
|
3652
|
+
|
|
3653
|
+
// src/common-components/AutoTag.js
|
|
3654
|
+
var AutoTag = ({
|
|
3655
|
+
value,
|
|
3656
|
+
tag,
|
|
3657
|
+
children,
|
|
3658
|
+
variant,
|
|
3659
|
+
overrides,
|
|
3660
|
+
fallback,
|
|
3661
|
+
...props
|
|
3662
|
+
}) => {
|
|
3663
|
+
const resolvedValue = value ?? tag ?? children;
|
|
3664
|
+
const displayValue = children ?? getAutoTagDisplayValue(resolvedValue);
|
|
3665
|
+
const resolvedVariant = variant || getAutoTagVariant(resolvedValue, {
|
|
3666
|
+
overrides,
|
|
3667
|
+
fallback
|
|
3668
|
+
});
|
|
3669
|
+
return React3.createElement(
|
|
3670
|
+
Tag2,
|
|
3671
|
+
{ variant: resolvedVariant, ...props },
|
|
3672
|
+
displayValue
|
|
3673
|
+
);
|
|
3674
|
+
};
|
|
3675
|
+
|
|
3676
|
+
// src/common-components/AutoStatusTag.js
|
|
3677
|
+
import React4 from "react";
|
|
3678
|
+
import { StatusTag } from "@hubspot/ui-extensions";
|
|
3679
|
+
var AutoStatusTag = ({
|
|
3680
|
+
value,
|
|
3681
|
+
status,
|
|
3682
|
+
children,
|
|
3683
|
+
variant,
|
|
3684
|
+
overrides,
|
|
3685
|
+
fallback,
|
|
3686
|
+
...props
|
|
3687
|
+
}) => {
|
|
3688
|
+
const resolvedValue = value ?? status ?? children;
|
|
3689
|
+
const displayValue = children ?? getAutoTagDisplayValue(resolvedValue);
|
|
3690
|
+
const resolvedVariant = variant || getAutoStatusTagVariant(resolvedValue, {
|
|
3691
|
+
overrides,
|
|
3692
|
+
fallback
|
|
3693
|
+
});
|
|
3694
|
+
return React4.createElement(
|
|
3695
|
+
StatusTag,
|
|
3696
|
+
{ variant: resolvedVariant, ...props },
|
|
3697
|
+
displayValue
|
|
3698
|
+
);
|
|
3699
|
+
};
|
|
3700
|
+
|
|
3701
|
+
// src/common-components/KeyValueList.js
|
|
3702
|
+
import React5 from "react";
|
|
3703
|
+
import { DescriptionList, DescriptionListItem, Flex as Flex3 } from "@hubspot/ui-extensions";
|
|
3704
|
+
|
|
3705
|
+
// src/common-components/SectionHeader.js
|
|
3706
|
+
import React6 from "react";
|
|
3707
|
+
import { Flex as Flex4, Heading, Text as Text3 } from "@hubspot/ui-extensions";
|
|
3485
3708
|
export {
|
|
3709
|
+
AutoStatusTag,
|
|
3710
|
+
AutoTag,
|
|
3486
3711
|
DataTable,
|
|
3487
3712
|
FormBuilder,
|
|
3713
|
+
createStatusTagSortComparator,
|
|
3714
|
+
getAutoStatusTagVariant,
|
|
3715
|
+
getAutoTagVariant,
|
|
3488
3716
|
useFormPrefill
|
|
3489
3717
|
};
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/utils/index.js
|
|
20
|
+
var utils_exports = {};
|
|
21
|
+
__export(utils_exports, {
|
|
22
|
+
buildOptions: () => buildOptions,
|
|
23
|
+
createStatusTagSortComparator: () => createStatusTagSortComparator,
|
|
24
|
+
findOptionLabel: () => findOptionLabel,
|
|
25
|
+
formatCurrency: () => formatCurrency,
|
|
26
|
+
formatDate: () => formatDate,
|
|
27
|
+
formatDateTime: () => formatDateTime,
|
|
28
|
+
formatPercentage: () => formatPercentage,
|
|
29
|
+
getAutoStatusTagVariant: () => getAutoStatusTagVariant,
|
|
30
|
+
getAutoTagDisplayValue: () => getAutoTagDisplayValue,
|
|
31
|
+
getAutoTagVariant: () => getAutoTagVariant,
|
|
32
|
+
isDateTimeValueObject: () => isDateTimeValueObject,
|
|
33
|
+
isDateValueObject: () => isDateValueObject,
|
|
34
|
+
isTimeValueObject: () => isTimeValueObject,
|
|
35
|
+
sumBy: () => sumBy
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(utils_exports);
|
|
38
|
+
|
|
39
|
+
// src/utils/collections.js
|
|
40
|
+
var sumBy = (items, keyOrFn) => (items || []).reduce((total, item) => {
|
|
41
|
+
const value = typeof keyOrFn === "function" ? keyOrFn(item) : item == null ? void 0 : item[keyOrFn];
|
|
42
|
+
return total + Number(value || 0);
|
|
43
|
+
}, 0);
|
|
44
|
+
|
|
45
|
+
// src/utils/formatters.js
|
|
46
|
+
var DEFAULT_LOCALE = "en-US";
|
|
47
|
+
var formatCurrency = (value, { locale = DEFAULT_LOCALE, currency = "USD", maximumFractionDigits = 0, ...options } = {}) => new Intl.NumberFormat(locale, {
|
|
48
|
+
style: "currency",
|
|
49
|
+
currency,
|
|
50
|
+
maximumFractionDigits,
|
|
51
|
+
...options
|
|
52
|
+
}).format(Number(value || 0));
|
|
53
|
+
var formatDate = (value, { locale = DEFAULT_LOCALE, month = "short", day = "numeric", year = "numeric", ...options } = {}) => {
|
|
54
|
+
if (value == null || value === "") return "";
|
|
55
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
56
|
+
if (Number.isNaN(date.getTime())) return "";
|
|
57
|
+
return date.toLocaleDateString(locale, {
|
|
58
|
+
month,
|
|
59
|
+
day,
|
|
60
|
+
year,
|
|
61
|
+
...options
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
var formatDateTime = (value, {
|
|
65
|
+
locale = DEFAULT_LOCALE,
|
|
66
|
+
month = "short",
|
|
67
|
+
day = "numeric",
|
|
68
|
+
year = "numeric",
|
|
69
|
+
hour = "numeric",
|
|
70
|
+
minute = "2-digit",
|
|
71
|
+
...options
|
|
72
|
+
} = {}) => {
|
|
73
|
+
if (value == null || value === "") return "";
|
|
74
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
75
|
+
if (Number.isNaN(date.getTime())) return "";
|
|
76
|
+
return date.toLocaleString(locale, {
|
|
77
|
+
month,
|
|
78
|
+
day,
|
|
79
|
+
year,
|
|
80
|
+
hour,
|
|
81
|
+
minute,
|
|
82
|
+
...options
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
var formatPercentage = (value, { locale = DEFAULT_LOCALE, minimumFractionDigits = 0, maximumFractionDigits = 0, ...options } = {}) => new Intl.NumberFormat(locale, {
|
|
86
|
+
style: "percent",
|
|
87
|
+
minimumFractionDigits,
|
|
88
|
+
maximumFractionDigits,
|
|
89
|
+
...options
|
|
90
|
+
}).format(Number(value || 0));
|
|
91
|
+
|
|
92
|
+
// src/utils/hubspotValues.js
|
|
93
|
+
var isDateValueObject = (value) => Boolean(
|
|
94
|
+
value && typeof value === "object" && typeof value.year === "number" && typeof value.month === "number" && typeof value.date === "number"
|
|
95
|
+
);
|
|
96
|
+
var isTimeValueObject = (value) => Boolean(
|
|
97
|
+
value && typeof value === "object" && typeof value.hours === "number" && typeof value.minutes === "number"
|
|
98
|
+
);
|
|
99
|
+
var isDateTimeValueObject = (value) => Boolean(
|
|
100
|
+
value && typeof value === "object" && (value.date == null || isDateValueObject(value.date)) && (value.time == null || isTimeValueObject(value.time))
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// src/utils/options.js
|
|
104
|
+
var buildOptions = (items, { labelKey = "label", valueKey = "value", descriptionKey, mapLabel, mapValue, mapDescription } = {}) => (items || []).map((item) => {
|
|
105
|
+
const label = mapLabel ? mapLabel(item) : (item == null ? void 0 : item[labelKey]) ?? item;
|
|
106
|
+
const value = mapValue ? mapValue(item) : (item == null ? void 0 : item[valueKey]) ?? item;
|
|
107
|
+
const description = descriptionKey ? item == null ? void 0 : item[descriptionKey] : void 0;
|
|
108
|
+
const mappedDescription = mapDescription ? mapDescription(item) : description;
|
|
109
|
+
return mappedDescription == null ? { label, value } : { label, value, description: mappedDescription };
|
|
110
|
+
});
|
|
111
|
+
var findOptionLabel = (options, value, fallback = "") => {
|
|
112
|
+
const match = (options || []).find((option) => (option == null ? void 0 : option.value) === value);
|
|
113
|
+
return (match == null ? void 0 : match.label) ?? fallback;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// src/utils/tagVariants.js
|
|
117
|
+
var DEFAULT_VARIANT = "default";
|
|
118
|
+
var DANGER_VARIANT = "danger";
|
|
119
|
+
var ERROR_VARIANT = "error";
|
|
120
|
+
var SUCCESS_MATCHERS = [
|
|
121
|
+
"active",
|
|
122
|
+
"success",
|
|
123
|
+
"succeeded",
|
|
124
|
+
"complete",
|
|
125
|
+
"completed",
|
|
126
|
+
"approved",
|
|
127
|
+
"won",
|
|
128
|
+
"healthy",
|
|
129
|
+
"enabled",
|
|
130
|
+
"connected",
|
|
131
|
+
"paid",
|
|
132
|
+
"live",
|
|
133
|
+
"published",
|
|
134
|
+
"available",
|
|
135
|
+
"synced",
|
|
136
|
+
"resolved"
|
|
137
|
+
];
|
|
138
|
+
var WARNING_MATCHERS = [
|
|
139
|
+
"warning",
|
|
140
|
+
"at risk",
|
|
141
|
+
"risky",
|
|
142
|
+
"pending",
|
|
143
|
+
"paused",
|
|
144
|
+
"pause",
|
|
145
|
+
"on hold",
|
|
146
|
+
"hold",
|
|
147
|
+
"review",
|
|
148
|
+
"expiring",
|
|
149
|
+
"trial",
|
|
150
|
+
"in progress",
|
|
151
|
+
"awaiting",
|
|
152
|
+
"scheduled"
|
|
153
|
+
];
|
|
154
|
+
var DANGER_MATCHERS = [
|
|
155
|
+
"danger",
|
|
156
|
+
"error",
|
|
157
|
+
"failed",
|
|
158
|
+
"failure",
|
|
159
|
+
"inactive",
|
|
160
|
+
"disabled",
|
|
161
|
+
"blocked",
|
|
162
|
+
"cancelled",
|
|
163
|
+
"canceled",
|
|
164
|
+
"rejected",
|
|
165
|
+
"denied",
|
|
166
|
+
"churned",
|
|
167
|
+
"lost",
|
|
168
|
+
"overdue",
|
|
169
|
+
"expired",
|
|
170
|
+
"offline",
|
|
171
|
+
"deleted",
|
|
172
|
+
"archived",
|
|
173
|
+
"unpaid"
|
|
174
|
+
];
|
|
175
|
+
var INFO_MATCHERS = [
|
|
176
|
+
"info",
|
|
177
|
+
"new",
|
|
178
|
+
"queued",
|
|
179
|
+
"processing",
|
|
180
|
+
"progress",
|
|
181
|
+
"upcoming",
|
|
182
|
+
"draft",
|
|
183
|
+
"open"
|
|
184
|
+
];
|
|
185
|
+
var normalizeTagValue = (value) => {
|
|
186
|
+
if (value == null) return "";
|
|
187
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
188
|
+
return String(value).trim().toLowerCase().replace(/[_-]+/g, " ").replace(/\s+/g, " ");
|
|
189
|
+
};
|
|
190
|
+
var matchesAny = (value, matchers) => matchers.some((matcher) => {
|
|
191
|
+
if (value === matcher) return true;
|
|
192
|
+
return ` ${value} `.includes(` ${matcher} `);
|
|
193
|
+
});
|
|
194
|
+
var getSemanticVariant = (value, options = {}) => {
|
|
195
|
+
const normalized = normalizeTagValue(value);
|
|
196
|
+
const fallback = options.fallback || DEFAULT_VARIANT;
|
|
197
|
+
if (!normalized) return fallback;
|
|
198
|
+
if (options.overrides) {
|
|
199
|
+
const overrideKey = Object.keys(options.overrides).find(
|
|
200
|
+
(key) => normalizeTagValue(key) === normalized
|
|
201
|
+
);
|
|
202
|
+
if (overrideKey) return options.overrides[overrideKey];
|
|
203
|
+
}
|
|
204
|
+
if (normalized === "true") return "success";
|
|
205
|
+
if (normalized === "false") return fallback;
|
|
206
|
+
if (matchesAny(normalized, SUCCESS_MATCHERS)) return "success";
|
|
207
|
+
if (matchesAny(normalized, DANGER_MATCHERS)) return DANGER_VARIANT;
|
|
208
|
+
if (matchesAny(normalized, WARNING_MATCHERS)) return "warning";
|
|
209
|
+
if (matchesAny(normalized, INFO_MATCHERS)) return "info";
|
|
210
|
+
return fallback;
|
|
211
|
+
};
|
|
212
|
+
var getAutoTagVariant = (value, options = {}) => {
|
|
213
|
+
const semanticVariant = getSemanticVariant(value, options);
|
|
214
|
+
return semanticVariant === DANGER_VARIANT ? ERROR_VARIANT : semanticVariant;
|
|
215
|
+
};
|
|
216
|
+
var getAutoStatusTagVariant = (value, options = {}) => getSemanticVariant(value, options);
|
|
217
|
+
var getAutoTagDisplayValue = (value) => {
|
|
218
|
+
if (typeof value === "boolean") return value ? "True" : "False";
|
|
219
|
+
return value;
|
|
220
|
+
};
|
|
221
|
+
var DEFAULT_STATUS_TAG_COLOR_ORDER = [
|
|
222
|
+
"success",
|
|
223
|
+
"warning",
|
|
224
|
+
"danger",
|
|
225
|
+
"error",
|
|
226
|
+
"info",
|
|
227
|
+
"default"
|
|
228
|
+
];
|
|
229
|
+
var createStatusTagSortComparator = (options = {}) => {
|
|
230
|
+
const {
|
|
231
|
+
variantOrder = DEFAULT_STATUS_TAG_COLOR_ORDER,
|
|
232
|
+
overrides,
|
|
233
|
+
fallback,
|
|
234
|
+
getLabel
|
|
235
|
+
} = options;
|
|
236
|
+
const variantIndex = (variant) => {
|
|
237
|
+
const idx = variantOrder.indexOf(variant);
|
|
238
|
+
return idx === -1 ? variantOrder.length : idx;
|
|
239
|
+
};
|
|
240
|
+
const labelOf = (value) => {
|
|
241
|
+
if (getLabel) return String(getLabel(value) ?? "");
|
|
242
|
+
if (value == null) return "";
|
|
243
|
+
return String(getAutoTagDisplayValue(value) ?? "");
|
|
244
|
+
};
|
|
245
|
+
return (aVal, bVal) => {
|
|
246
|
+
const aVariant = getSemanticVariant(aVal, { overrides, fallback });
|
|
247
|
+
const bVariant = getSemanticVariant(bVal, { overrides, fallback });
|
|
248
|
+
const diff = variantIndex(aVariant) - variantIndex(bVariant);
|
|
249
|
+
if (diff !== 0) return diff;
|
|
250
|
+
return labelOf(aVal).localeCompare(labelOf(bVal));
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
254
|
+
0 && (module.exports = {
|
|
255
|
+
buildOptions,
|
|
256
|
+
createStatusTagSortComparator,
|
|
257
|
+
findOptionLabel,
|
|
258
|
+
formatCurrency,
|
|
259
|
+
formatDate,
|
|
260
|
+
formatDateTime,
|
|
261
|
+
formatPercentage,
|
|
262
|
+
getAutoStatusTagVariant,
|
|
263
|
+
getAutoTagDisplayValue,
|
|
264
|
+
getAutoTagVariant,
|
|
265
|
+
isDateTimeValueObject,
|
|
266
|
+
isDateValueObject,
|
|
267
|
+
isTimeValueObject,
|
|
268
|
+
sumBy
|
|
269
|
+
});
|