@form-eng/core 1.2.0 → 1.3.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/adapter-utils.d.mts +107 -0
- package/dist/adapter-utils.d.ts +107 -0
- package/dist/adapter-utils.js +146 -0
- package/dist/adapter-utils.js.map +1 -0
- package/dist/adapter-utils.mjs +33 -0
- package/dist/adapter-utils.mjs.map +1 -0
- package/dist/chunk-F57MYSS6.mjs +133 -0
- package/dist/chunk-F57MYSS6.mjs.map +1 -0
- package/dist/chunk-YMUYHDWI.mjs +57 -0
- package/dist/chunk-YMUYHDWI.mjs.map +1 -0
- package/dist/index-BrfbmVFA.d.mts +24 -0
- package/dist/index-BrfbmVFA.d.ts +24 -0
- package/dist/index.d.mts +4 -127
- package/dist/index.d.ts +4 -127
- package/dist/index.mjs +27 -162
- package/dist/index.mjs.map +1 -1
- package/dist/testing.d.mts +30 -0
- package/dist/testing.d.ts +30 -0
- package/dist/testing.js +231 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +157 -0
- package/dist/testing.mjs.map +1 -0
- package/package.json +15 -2
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { FieldError } from 'react-hook-form';
|
|
2
|
+
export { c as convertBooleanToYesOrNoText, b as isNull } from './index-BrfbmVFA.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates a consistent data-testid for field components.
|
|
6
|
+
* Used by all adapter packages for test attribute generation.
|
|
7
|
+
*/
|
|
8
|
+
declare const GetFieldDataTestId: (fieldName: string, programName?: string, entityType?: string, entityId?: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Appends "error" to a className when a field has a validation error.
|
|
11
|
+
* Used by Fluent and MUI adapters for error styling.
|
|
12
|
+
*/
|
|
13
|
+
declare const FieldClassName: (className: string, error?: FieldError) => string;
|
|
14
|
+
/**
|
|
15
|
+
* Returns a field state string based on the current field props.
|
|
16
|
+
* Used by headless adapter for data-state attributes.
|
|
17
|
+
*/
|
|
18
|
+
declare function getFieldState(props: {
|
|
19
|
+
error?: FieldError;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Formats an ISO date string for display.
|
|
26
|
+
* Returns short date (e.g. "Jan 15, 2024") or date+time (e.g. "Jan 15, 2024, 02:30 PM").
|
|
27
|
+
*/
|
|
28
|
+
declare function formatDateTime(dateStr: string, options?: {
|
|
29
|
+
hideTimestamp?: boolean;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Safely formats a value as a date+time string, falling back to String() on error.
|
|
33
|
+
*/
|
|
34
|
+
declare function formatDateTimeValue(value: unknown): string;
|
|
35
|
+
/**
|
|
36
|
+
* Formats a date range value for read-only display.
|
|
37
|
+
* Returns "start – end", or just the one that exists.
|
|
38
|
+
*/
|
|
39
|
+
declare function formatDateRange(value: unknown): string;
|
|
40
|
+
/**
|
|
41
|
+
* Extracts display names from File or File[] values.
|
|
42
|
+
*/
|
|
43
|
+
declare function getFileNames(value: unknown): string;
|
|
44
|
+
/**
|
|
45
|
+
* Strips all non-digit characters from a string.
|
|
46
|
+
*/
|
|
47
|
+
declare function extractDigits(value: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Formats a digit string as a phone number.
|
|
50
|
+
* Supports US "(XXX) XXX-XXXX", international "+X XXX XXX XXXX", and raw digits.
|
|
51
|
+
*/
|
|
52
|
+
declare function formatPhone(digits: string, format: "us" | "international" | "raw"): string;
|
|
53
|
+
/**
|
|
54
|
+
* Truncates text with "..." if it exceeds maxChars.
|
|
55
|
+
*/
|
|
56
|
+
declare function ellipsifyText(value: string, maxChars: number): string;
|
|
57
|
+
/** Default max file size in MB for FileUpload fields */
|
|
58
|
+
declare const MAX_FILE_SIZE_MB_DEFAULT = 10;
|
|
59
|
+
/** Shared strings for DocumentLinks component */
|
|
60
|
+
declare const DocumentLinksStrings: {
|
|
61
|
+
link: string;
|
|
62
|
+
addLink: string;
|
|
63
|
+
addAnotherLink: string;
|
|
64
|
+
deleteLink: string;
|
|
65
|
+
confirmDeleteLink: string;
|
|
66
|
+
delete: string;
|
|
67
|
+
cancel: string;
|
|
68
|
+
saveChanges: string;
|
|
69
|
+
save: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Shared field config interfaces used by adapter packages.
|
|
74
|
+
* These define the shape of the `config` prop (IFieldProps.config) for specific field types.
|
|
75
|
+
*/
|
|
76
|
+
/** Config for Rating field */
|
|
77
|
+
interface IRatingConfig {
|
|
78
|
+
max?: number;
|
|
79
|
+
allowHalf?: boolean;
|
|
80
|
+
}
|
|
81
|
+
/** Config for DateRange field */
|
|
82
|
+
interface IDateRangeConfig {
|
|
83
|
+
minDate?: string;
|
|
84
|
+
maxDate?: string;
|
|
85
|
+
}
|
|
86
|
+
/** Value shape for DateRange field */
|
|
87
|
+
interface IDateRangeValue {
|
|
88
|
+
start: string;
|
|
89
|
+
end: string;
|
|
90
|
+
}
|
|
91
|
+
/** Config for DateTime field */
|
|
92
|
+
interface IDateTimeConfig {
|
|
93
|
+
minDateTime?: string;
|
|
94
|
+
maxDateTime?: string;
|
|
95
|
+
}
|
|
96
|
+
/** Config for FileUpload field */
|
|
97
|
+
interface IFileUploadConfig {
|
|
98
|
+
multiple?: boolean;
|
|
99
|
+
accept?: string;
|
|
100
|
+
maxSizeMb?: number;
|
|
101
|
+
}
|
|
102
|
+
/** Config for PhoneInput field */
|
|
103
|
+
interface IPhoneInputConfig {
|
|
104
|
+
format?: "us" | "international" | "raw";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { DocumentLinksStrings, FieldClassName, GetFieldDataTestId, type IDateRangeConfig, type IDateRangeValue, type IDateTimeConfig, type IFileUploadConfig, type IPhoneInputConfig, type IRatingConfig, MAX_FILE_SIZE_MB_DEFAULT, ellipsifyText, extractDigits, formatDateRange, formatDateTime, formatDateTimeValue, formatPhone, getFieldState, getFileNames };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { FieldError } from 'react-hook-form';
|
|
2
|
+
export { c as convertBooleanToYesOrNoText, b as isNull } from './index-BrfbmVFA.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates a consistent data-testid for field components.
|
|
6
|
+
* Used by all adapter packages for test attribute generation.
|
|
7
|
+
*/
|
|
8
|
+
declare const GetFieldDataTestId: (fieldName: string, programName?: string, entityType?: string, entityId?: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Appends "error" to a className when a field has a validation error.
|
|
11
|
+
* Used by Fluent and MUI adapters for error styling.
|
|
12
|
+
*/
|
|
13
|
+
declare const FieldClassName: (className: string, error?: FieldError) => string;
|
|
14
|
+
/**
|
|
15
|
+
* Returns a field state string based on the current field props.
|
|
16
|
+
* Used by headless adapter for data-state attributes.
|
|
17
|
+
*/
|
|
18
|
+
declare function getFieldState(props: {
|
|
19
|
+
error?: FieldError;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
readOnly?: boolean;
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Formats an ISO date string for display.
|
|
26
|
+
* Returns short date (e.g. "Jan 15, 2024") or date+time (e.g. "Jan 15, 2024, 02:30 PM").
|
|
27
|
+
*/
|
|
28
|
+
declare function formatDateTime(dateStr: string, options?: {
|
|
29
|
+
hideTimestamp?: boolean;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Safely formats a value as a date+time string, falling back to String() on error.
|
|
33
|
+
*/
|
|
34
|
+
declare function formatDateTimeValue(value: unknown): string;
|
|
35
|
+
/**
|
|
36
|
+
* Formats a date range value for read-only display.
|
|
37
|
+
* Returns "start – end", or just the one that exists.
|
|
38
|
+
*/
|
|
39
|
+
declare function formatDateRange(value: unknown): string;
|
|
40
|
+
/**
|
|
41
|
+
* Extracts display names from File or File[] values.
|
|
42
|
+
*/
|
|
43
|
+
declare function getFileNames(value: unknown): string;
|
|
44
|
+
/**
|
|
45
|
+
* Strips all non-digit characters from a string.
|
|
46
|
+
*/
|
|
47
|
+
declare function extractDigits(value: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Formats a digit string as a phone number.
|
|
50
|
+
* Supports US "(XXX) XXX-XXXX", international "+X XXX XXX XXXX", and raw digits.
|
|
51
|
+
*/
|
|
52
|
+
declare function formatPhone(digits: string, format: "us" | "international" | "raw"): string;
|
|
53
|
+
/**
|
|
54
|
+
* Truncates text with "..." if it exceeds maxChars.
|
|
55
|
+
*/
|
|
56
|
+
declare function ellipsifyText(value: string, maxChars: number): string;
|
|
57
|
+
/** Default max file size in MB for FileUpload fields */
|
|
58
|
+
declare const MAX_FILE_SIZE_MB_DEFAULT = 10;
|
|
59
|
+
/** Shared strings for DocumentLinks component */
|
|
60
|
+
declare const DocumentLinksStrings: {
|
|
61
|
+
link: string;
|
|
62
|
+
addLink: string;
|
|
63
|
+
addAnotherLink: string;
|
|
64
|
+
deleteLink: string;
|
|
65
|
+
confirmDeleteLink: string;
|
|
66
|
+
delete: string;
|
|
67
|
+
cancel: string;
|
|
68
|
+
saveChanges: string;
|
|
69
|
+
save: string;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Shared field config interfaces used by adapter packages.
|
|
74
|
+
* These define the shape of the `config` prop (IFieldProps.config) for specific field types.
|
|
75
|
+
*/
|
|
76
|
+
/** Config for Rating field */
|
|
77
|
+
interface IRatingConfig {
|
|
78
|
+
max?: number;
|
|
79
|
+
allowHalf?: boolean;
|
|
80
|
+
}
|
|
81
|
+
/** Config for DateRange field */
|
|
82
|
+
interface IDateRangeConfig {
|
|
83
|
+
minDate?: string;
|
|
84
|
+
maxDate?: string;
|
|
85
|
+
}
|
|
86
|
+
/** Value shape for DateRange field */
|
|
87
|
+
interface IDateRangeValue {
|
|
88
|
+
start: string;
|
|
89
|
+
end: string;
|
|
90
|
+
}
|
|
91
|
+
/** Config for DateTime field */
|
|
92
|
+
interface IDateTimeConfig {
|
|
93
|
+
minDateTime?: string;
|
|
94
|
+
maxDateTime?: string;
|
|
95
|
+
}
|
|
96
|
+
/** Config for FileUpload field */
|
|
97
|
+
interface IFileUploadConfig {
|
|
98
|
+
multiple?: boolean;
|
|
99
|
+
accept?: string;
|
|
100
|
+
maxSizeMb?: number;
|
|
101
|
+
}
|
|
102
|
+
/** Config for PhoneInput field */
|
|
103
|
+
interface IPhoneInputConfig {
|
|
104
|
+
format?: "us" | "international" | "raw";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { DocumentLinksStrings, FieldClassName, GetFieldDataTestId, type IDateRangeConfig, type IDateRangeValue, type IDateTimeConfig, type IFileUploadConfig, type IPhoneInputConfig, type IRatingConfig, MAX_FILE_SIZE_MB_DEFAULT, ellipsifyText, extractDigits, formatDateRange, formatDateTime, formatDateTimeValue, formatPhone, getFieldState, getFileNames };
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/adapter-utils.ts
|
|
21
|
+
var adapter_utils_exports = {};
|
|
22
|
+
__export(adapter_utils_exports, {
|
|
23
|
+
DocumentLinksStrings: () => DocumentLinksStrings,
|
|
24
|
+
FieldClassName: () => FieldClassName,
|
|
25
|
+
GetFieldDataTestId: () => GetFieldDataTestId,
|
|
26
|
+
MAX_FILE_SIZE_MB_DEFAULT: () => MAX_FILE_SIZE_MB_DEFAULT,
|
|
27
|
+
convertBooleanToYesOrNoText: () => convertBooleanToYesOrNoText,
|
|
28
|
+
ellipsifyText: () => ellipsifyText,
|
|
29
|
+
extractDigits: () => extractDigits,
|
|
30
|
+
formatDateRange: () => formatDateRange,
|
|
31
|
+
formatDateTime: () => formatDateTime,
|
|
32
|
+
formatDateTimeValue: () => formatDateTimeValue,
|
|
33
|
+
formatPhone: () => formatPhone,
|
|
34
|
+
getFieldState: () => getFieldState,
|
|
35
|
+
getFileNames: () => getFileNames,
|
|
36
|
+
isNull: () => isNull
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(adapter_utils_exports);
|
|
39
|
+
|
|
40
|
+
// src/helpers/FieldUtils.ts
|
|
41
|
+
var GetFieldDataTestId = (fieldName, programName, entityType, entityId) => {
|
|
42
|
+
return `${programName}-${entityType}-${entityId}-${fieldName}`;
|
|
43
|
+
};
|
|
44
|
+
var FieldClassName = (className, error) => {
|
|
45
|
+
return error ? `${className} error` : className;
|
|
46
|
+
};
|
|
47
|
+
function getFieldState(props) {
|
|
48
|
+
if (props.error) return "error";
|
|
49
|
+
if (props.required) return "required";
|
|
50
|
+
if (props.readOnly) return "readonly";
|
|
51
|
+
if (props.disabled) return "disabled";
|
|
52
|
+
return void 0;
|
|
53
|
+
}
|
|
54
|
+
function formatDateTime(dateStr, options) {
|
|
55
|
+
if (!dateStr) return "";
|
|
56
|
+
const date = new Date(dateStr);
|
|
57
|
+
if (isNaN(date.getTime())) return dateStr;
|
|
58
|
+
if (options?.hideTimestamp) {
|
|
59
|
+
return date.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
|
|
60
|
+
}
|
|
61
|
+
return date.toLocaleString(void 0, { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
|
|
62
|
+
}
|
|
63
|
+
function formatDateTimeValue(value) {
|
|
64
|
+
if (!value) return "";
|
|
65
|
+
try {
|
|
66
|
+
return formatDateTime(value);
|
|
67
|
+
} catch {
|
|
68
|
+
return String(value);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function formatDateRange(value) {
|
|
72
|
+
if (!value) return "";
|
|
73
|
+
const v = value;
|
|
74
|
+
if (!v.start && !v.end) return "";
|
|
75
|
+
if (v.start && v.end) return `${v.start} \u2013 ${v.end}`;
|
|
76
|
+
return v.start || v.end;
|
|
77
|
+
}
|
|
78
|
+
function getFileNames(value) {
|
|
79
|
+
if (!value) return "";
|
|
80
|
+
if (Array.isArray(value)) return value.map((f) => f.name).join(", ");
|
|
81
|
+
return value.name ?? "";
|
|
82
|
+
}
|
|
83
|
+
function extractDigits(value) {
|
|
84
|
+
return value.replace(/\D/g, "");
|
|
85
|
+
}
|
|
86
|
+
function formatPhone(digits, format) {
|
|
87
|
+
if (format === "raw") return digits;
|
|
88
|
+
if (format === "international") {
|
|
89
|
+
const d2 = digits.slice(0, 12);
|
|
90
|
+
if (d2.length === 0) return "";
|
|
91
|
+
if (d2.length <= 1) return `+${d2}`;
|
|
92
|
+
if (d2.length <= 4) return `+${d2[0]} ${d2.slice(1)}`;
|
|
93
|
+
if (d2.length <= 7) return `+${d2[0]} ${d2.slice(1, 4)} ${d2.slice(4)}`;
|
|
94
|
+
return `+${d2[0]} ${d2.slice(1, 4)} ${d2.slice(4, 7)} ${d2.slice(7)}`;
|
|
95
|
+
}
|
|
96
|
+
const d = digits.slice(0, 10);
|
|
97
|
+
if (d.length === 0) return "";
|
|
98
|
+
if (d.length <= 3) return `(${d}`;
|
|
99
|
+
if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`;
|
|
100
|
+
return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;
|
|
101
|
+
}
|
|
102
|
+
function ellipsifyText(value, maxChars) {
|
|
103
|
+
if (!value || value.length <= maxChars) return value ?? "";
|
|
104
|
+
const cutoff = maxChars - 3;
|
|
105
|
+
return `${value.substring(0, cutoff)}...`;
|
|
106
|
+
}
|
|
107
|
+
var MAX_FILE_SIZE_MB_DEFAULT = 10;
|
|
108
|
+
var DocumentLinksStrings = {
|
|
109
|
+
link: "Link",
|
|
110
|
+
addLink: "Add Link",
|
|
111
|
+
addAnotherLink: "Add Another Link",
|
|
112
|
+
deleteLink: "Delete Link",
|
|
113
|
+
confirmDeleteLink: "Are you sure you want to delete",
|
|
114
|
+
delete: "Delete",
|
|
115
|
+
cancel: "Cancel",
|
|
116
|
+
saveChanges: "Save Changes",
|
|
117
|
+
save: "Save"
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// src/utils/index.ts
|
|
121
|
+
function isNull(value) {
|
|
122
|
+
return value == null;
|
|
123
|
+
}
|
|
124
|
+
function convertBooleanToYesOrNoText(value) {
|
|
125
|
+
if (value === true) return "Yes";
|
|
126
|
+
if (value === false) return "No";
|
|
127
|
+
return "";
|
|
128
|
+
}
|
|
129
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
130
|
+
0 && (module.exports = {
|
|
131
|
+
DocumentLinksStrings,
|
|
132
|
+
FieldClassName,
|
|
133
|
+
GetFieldDataTestId,
|
|
134
|
+
MAX_FILE_SIZE_MB_DEFAULT,
|
|
135
|
+
convertBooleanToYesOrNoText,
|
|
136
|
+
ellipsifyText,
|
|
137
|
+
extractDigits,
|
|
138
|
+
formatDateRange,
|
|
139
|
+
formatDateTime,
|
|
140
|
+
formatDateTimeValue,
|
|
141
|
+
formatPhone,
|
|
142
|
+
getFieldState,
|
|
143
|
+
getFileNames,
|
|
144
|
+
isNull
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=adapter-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapter-utils.ts","../src/helpers/FieldUtils.ts","../src/utils/index.ts"],"sourcesContent":["/**\n * Shared adapter utilities subpath export.\n *\n * Import as: import { ... } from \"@form-eng/core/adapter-utils\"\n *\n * These utilities are shared across all adapter packages (fluent, mui, headless, etc.)\n * for consistent field rendering, formatting, and test attribute generation.\n */\n\n// Field utilities\nexport {\n GetFieldDataTestId,\n FieldClassName,\n getFieldState,\n formatDateTime,\n formatDateTimeValue,\n formatDateRange,\n getFileNames,\n extractDigits,\n formatPhone,\n ellipsifyText,\n MAX_FILE_SIZE_MB_DEFAULT,\n DocumentLinksStrings,\n} from \"./helpers/FieldUtils\";\n\n// Field config interfaces\nexport type {\n IRatingConfig,\n IDateRangeConfig,\n IDateRangeValue,\n IDateTimeConfig,\n IFileUploadConfig,\n IPhoneInputConfig,\n} from \"./types/IFieldConfigs\";\n\n// Utility functions used by adapters\nexport { convertBooleanToYesOrNoText, isNull } from \"./utils\";\n","import { FieldError } from \"react-hook-form\";\n\n/**\n * Generates a consistent data-testid for field components.\n * Used by all adapter packages for test attribute generation.\n */\nexport const GetFieldDataTestId = (\n fieldName: string,\n programName?: string,\n entityType?: string,\n entityId?: string\n): string => {\n return `${programName}-${entityType}-${entityId}-${fieldName}`;\n};\n\n/**\n * Appends \"error\" to a className when a field has a validation error.\n * Used by Fluent and MUI adapters for error styling.\n */\nexport const FieldClassName = (className: string, error?: FieldError): string => {\n return error ? `${className} error` : className;\n};\n\n/**\n * Returns a field state string based on the current field props.\n * Used by headless adapter for data-state attributes.\n */\nexport function getFieldState(props: {\n error?: FieldError;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n}): string | undefined {\n if (props.error) return \"error\";\n if (props.required) return \"required\";\n if (props.readOnly) return \"readonly\";\n if (props.disabled) return \"disabled\";\n return undefined;\n}\n\n/**\n * Formats an ISO date string for display.\n * Returns short date (e.g. \"Jan 15, 2024\") or date+time (e.g. \"Jan 15, 2024, 02:30 PM\").\n */\nexport function formatDateTime(dateStr: string, options?: { hideTimestamp?: boolean }): string {\n if (!dateStr) return \"\";\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n if (options?.hideTimestamp) {\n return date.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n }\n return date.toLocaleString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n}\n\n/**\n * Safely formats a value as a date+time string, falling back to String() on error.\n */\nexport function formatDateTimeValue(value: unknown): string {\n if (!value) return \"\";\n try {\n return formatDateTime(value as string);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Formats a date range value for read-only display.\n * Returns \"start – end\", or just the one that exists.\n */\nexport function formatDateRange(value: unknown): string {\n if (!value) return \"\";\n const v = value as { start: string; end: string };\n if (!v.start && !v.end) return \"\";\n if (v.start && v.end) return `${v.start} – ${v.end}`;\n return v.start || v.end;\n}\n\n/**\n * Extracts display names from File or File[] values.\n */\nexport function getFileNames(value: unknown): string {\n if (!value) return \"\";\n if (Array.isArray(value)) return (value as File[]).map(f => f.name).join(\", \");\n return (value as File).name ?? \"\";\n}\n\n/**\n * Strips all non-digit characters from a string.\n */\nexport function extractDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Formats a digit string as a phone number.\n * Supports US \"(XXX) XXX-XXXX\", international \"+X XXX XXX XXXX\", and raw digits.\n */\nexport function formatPhone(digits: string, format: \"us\" | \"international\" | \"raw\"): string {\n if (format === \"raw\") return digits;\n\n if (format === \"international\") {\n // +X XXX XXX XXXX\n const d = digits.slice(0, 12);\n if (d.length === 0) return \"\";\n if (d.length <= 1) return `+${d}`;\n if (d.length <= 4) return `+${d[0]} ${d.slice(1)}`;\n if (d.length <= 7) return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4)}`;\n return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4, 7)} ${d.slice(7)}`;\n }\n\n // US: (XXX) XXX-XXXX\n const d = digits.slice(0, 10);\n if (d.length === 0) return \"\";\n if (d.length <= 3) return `(${d}`;\n if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`;\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;\n}\n\n/**\n * Truncates text with \"...\" if it exceeds maxChars.\n */\nexport function ellipsifyText(value: string, maxChars: number): string {\n if (!value || value.length <= maxChars) return value ?? \"\";\n const cutoff = maxChars - 3;\n return `${value.substring(0, cutoff)}...`;\n}\n\n/** Default max file size in MB for FileUpload fields */\nexport const MAX_FILE_SIZE_MB_DEFAULT = 10;\n\n/** Shared strings for DocumentLinks component */\nexport const DocumentLinksStrings = {\n link: \"Link\",\n addLink: \"Add Link\",\n addAnotherLink: \"Add Another Link\",\n deleteLink: \"Delete Link\",\n confirmDeleteLink: \"Are you sure you want to delete\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n saveChanges: \"Save Changes\",\n save: \"Save\",\n};\n","/** Generic dictionary type */\nexport type Dictionary<T> = Record<string, T>;\n\n/** Entity data type */\nexport type IEntityData = Record<string, unknown>;\n\n/** Sub-entity value type */\nexport type SubEntityType = string | number | boolean | Date | object | null | undefined;\n\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nexport function isNull(value: unknown): value is null | undefined {\n return value == null;\n}\n\nexport function isStringEmpty(value: string | null | undefined): boolean {\n return value == null || value.trim() === \"\";\n}\n\nexport function deepCopy<T>(obj: T): T {\n return structuredClone(obj);\n}\n\nexport function convertBooleanToYesOrNoText(value: boolean | null | undefined): string {\n if (value === true) return \"Yes\";\n if (value === false) return \"No\";\n return \"\";\n}\n\n/** Sort options alphabetically by label */\nexport function sortDropdownOptions(a: { label?: string }, b: { label?: string }): number {\n const aText = a.label ? a.label.toLowerCase() : \"\";\n const bText = b.label ? b.label.toLowerCase() : \"\";\n return aText < bText ? -1 : aText > bText ? 1 : 0;\n}\n\n/** Create an option from a value string (value and label are the same) */\nexport function createOption(value: string): { value: string; label: string } {\n return { value, label: value };\n}\n"],"mappings":"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","names":["d"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DocumentLinksStrings,
|
|
3
|
+
FieldClassName,
|
|
4
|
+
GetFieldDataTestId,
|
|
5
|
+
MAX_FILE_SIZE_MB_DEFAULT,
|
|
6
|
+
convertBooleanToYesOrNoText,
|
|
7
|
+
ellipsifyText,
|
|
8
|
+
extractDigits,
|
|
9
|
+
formatDateRange,
|
|
10
|
+
formatDateTime,
|
|
11
|
+
formatDateTimeValue,
|
|
12
|
+
formatPhone,
|
|
13
|
+
getFieldState,
|
|
14
|
+
getFileNames,
|
|
15
|
+
isNull
|
|
16
|
+
} from "./chunk-F57MYSS6.mjs";
|
|
17
|
+
export {
|
|
18
|
+
DocumentLinksStrings,
|
|
19
|
+
FieldClassName,
|
|
20
|
+
GetFieldDataTestId,
|
|
21
|
+
MAX_FILE_SIZE_MB_DEFAULT,
|
|
22
|
+
convertBooleanToYesOrNoText,
|
|
23
|
+
ellipsifyText,
|
|
24
|
+
extractDigits,
|
|
25
|
+
formatDateRange,
|
|
26
|
+
formatDateTime,
|
|
27
|
+
formatDateTimeValue,
|
|
28
|
+
formatPhone,
|
|
29
|
+
getFieldState,
|
|
30
|
+
getFileNames,
|
|
31
|
+
isNull
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=adapter-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// src/helpers/FieldUtils.ts
|
|
2
|
+
var GetFieldDataTestId = (fieldName, programName, entityType, entityId) => {
|
|
3
|
+
return `${programName}-${entityType}-${entityId}-${fieldName}`;
|
|
4
|
+
};
|
|
5
|
+
var FieldClassName = (className, error) => {
|
|
6
|
+
return error ? `${className} error` : className;
|
|
7
|
+
};
|
|
8
|
+
function getFieldState(props) {
|
|
9
|
+
if (props.error) return "error";
|
|
10
|
+
if (props.required) return "required";
|
|
11
|
+
if (props.readOnly) return "readonly";
|
|
12
|
+
if (props.disabled) return "disabled";
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
function formatDateTime(dateStr, options) {
|
|
16
|
+
if (!dateStr) return "";
|
|
17
|
+
const date = new Date(dateStr);
|
|
18
|
+
if (isNaN(date.getTime())) return dateStr;
|
|
19
|
+
if (options?.hideTimestamp) {
|
|
20
|
+
return date.toLocaleDateString(void 0, { year: "numeric", month: "short", day: "numeric" });
|
|
21
|
+
}
|
|
22
|
+
return date.toLocaleString(void 0, { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
|
|
23
|
+
}
|
|
24
|
+
function formatDateTimeValue(value) {
|
|
25
|
+
if (!value) return "";
|
|
26
|
+
try {
|
|
27
|
+
return formatDateTime(value);
|
|
28
|
+
} catch {
|
|
29
|
+
return String(value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function formatDateRange(value) {
|
|
33
|
+
if (!value) return "";
|
|
34
|
+
const v = value;
|
|
35
|
+
if (!v.start && !v.end) return "";
|
|
36
|
+
if (v.start && v.end) return `${v.start} \u2013 ${v.end}`;
|
|
37
|
+
return v.start || v.end;
|
|
38
|
+
}
|
|
39
|
+
function getFileNames(value) {
|
|
40
|
+
if (!value) return "";
|
|
41
|
+
if (Array.isArray(value)) return value.map((f) => f.name).join(", ");
|
|
42
|
+
return value.name ?? "";
|
|
43
|
+
}
|
|
44
|
+
function extractDigits(value) {
|
|
45
|
+
return value.replace(/\D/g, "");
|
|
46
|
+
}
|
|
47
|
+
function formatPhone(digits, format) {
|
|
48
|
+
if (format === "raw") return digits;
|
|
49
|
+
if (format === "international") {
|
|
50
|
+
const d2 = digits.slice(0, 12);
|
|
51
|
+
if (d2.length === 0) return "";
|
|
52
|
+
if (d2.length <= 1) return `+${d2}`;
|
|
53
|
+
if (d2.length <= 4) return `+${d2[0]} ${d2.slice(1)}`;
|
|
54
|
+
if (d2.length <= 7) return `+${d2[0]} ${d2.slice(1, 4)} ${d2.slice(4)}`;
|
|
55
|
+
return `+${d2[0]} ${d2.slice(1, 4)} ${d2.slice(4, 7)} ${d2.slice(7)}`;
|
|
56
|
+
}
|
|
57
|
+
const d = digits.slice(0, 10);
|
|
58
|
+
if (d.length === 0) return "";
|
|
59
|
+
if (d.length <= 3) return `(${d}`;
|
|
60
|
+
if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`;
|
|
61
|
+
return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;
|
|
62
|
+
}
|
|
63
|
+
function ellipsifyText(value, maxChars) {
|
|
64
|
+
if (!value || value.length <= maxChars) return value ?? "";
|
|
65
|
+
const cutoff = maxChars - 3;
|
|
66
|
+
return `${value.substring(0, cutoff)}...`;
|
|
67
|
+
}
|
|
68
|
+
var MAX_FILE_SIZE_MB_DEFAULT = 10;
|
|
69
|
+
var DocumentLinksStrings = {
|
|
70
|
+
link: "Link",
|
|
71
|
+
addLink: "Add Link",
|
|
72
|
+
addAnotherLink: "Add Another Link",
|
|
73
|
+
deleteLink: "Delete Link",
|
|
74
|
+
confirmDeleteLink: "Are you sure you want to delete",
|
|
75
|
+
delete: "Delete",
|
|
76
|
+
cancel: "Cancel",
|
|
77
|
+
saveChanges: "Save Changes",
|
|
78
|
+
save: "Save"
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// src/utils/index.ts
|
|
82
|
+
function isEmpty(value) {
|
|
83
|
+
if (value == null) return true;
|
|
84
|
+
if (typeof value === "string") return value.trim() === "";
|
|
85
|
+
if (Array.isArray(value)) return value.length === 0;
|
|
86
|
+
if (typeof value === "object") return Object.keys(value).length === 0;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
function isNull(value) {
|
|
90
|
+
return value == null;
|
|
91
|
+
}
|
|
92
|
+
function isStringEmpty(value) {
|
|
93
|
+
return value == null || value.trim() === "";
|
|
94
|
+
}
|
|
95
|
+
function deepCopy(obj) {
|
|
96
|
+
return structuredClone(obj);
|
|
97
|
+
}
|
|
98
|
+
function convertBooleanToYesOrNoText(value) {
|
|
99
|
+
if (value === true) return "Yes";
|
|
100
|
+
if (value === false) return "No";
|
|
101
|
+
return "";
|
|
102
|
+
}
|
|
103
|
+
function sortDropdownOptions(a, b) {
|
|
104
|
+
const aText = a.label ? a.label.toLowerCase() : "";
|
|
105
|
+
const bText = b.label ? b.label.toLowerCase() : "";
|
|
106
|
+
return aText < bText ? -1 : aText > bText ? 1 : 0;
|
|
107
|
+
}
|
|
108
|
+
function createOption(value) {
|
|
109
|
+
return { value, label: value };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
GetFieldDataTestId,
|
|
114
|
+
FieldClassName,
|
|
115
|
+
getFieldState,
|
|
116
|
+
formatDateTime,
|
|
117
|
+
formatDateTimeValue,
|
|
118
|
+
formatDateRange,
|
|
119
|
+
getFileNames,
|
|
120
|
+
extractDigits,
|
|
121
|
+
formatPhone,
|
|
122
|
+
ellipsifyText,
|
|
123
|
+
MAX_FILE_SIZE_MB_DEFAULT,
|
|
124
|
+
DocumentLinksStrings,
|
|
125
|
+
isEmpty,
|
|
126
|
+
isNull,
|
|
127
|
+
isStringEmpty,
|
|
128
|
+
deepCopy,
|
|
129
|
+
convertBooleanToYesOrNoText,
|
|
130
|
+
sortDropdownOptions,
|
|
131
|
+
createOption
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=chunk-F57MYSS6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/helpers/FieldUtils.ts","../src/utils/index.ts"],"sourcesContent":["import { FieldError } from \"react-hook-form\";\n\n/**\n * Generates a consistent data-testid for field components.\n * Used by all adapter packages for test attribute generation.\n */\nexport const GetFieldDataTestId = (\n fieldName: string,\n programName?: string,\n entityType?: string,\n entityId?: string\n): string => {\n return `${programName}-${entityType}-${entityId}-${fieldName}`;\n};\n\n/**\n * Appends \"error\" to a className when a field has a validation error.\n * Used by Fluent and MUI adapters for error styling.\n */\nexport const FieldClassName = (className: string, error?: FieldError): string => {\n return error ? `${className} error` : className;\n};\n\n/**\n * Returns a field state string based on the current field props.\n * Used by headless adapter for data-state attributes.\n */\nexport function getFieldState(props: {\n error?: FieldError;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n}): string | undefined {\n if (props.error) return \"error\";\n if (props.required) return \"required\";\n if (props.readOnly) return \"readonly\";\n if (props.disabled) return \"disabled\";\n return undefined;\n}\n\n/**\n * Formats an ISO date string for display.\n * Returns short date (e.g. \"Jan 15, 2024\") or date+time (e.g. \"Jan 15, 2024, 02:30 PM\").\n */\nexport function formatDateTime(dateStr: string, options?: { hideTimestamp?: boolean }): string {\n if (!dateStr) return \"\";\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n if (options?.hideTimestamp) {\n return date.toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n }\n return date.toLocaleString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n}\n\n/**\n * Safely formats a value as a date+time string, falling back to String() on error.\n */\nexport function formatDateTimeValue(value: unknown): string {\n if (!value) return \"\";\n try {\n return formatDateTime(value as string);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Formats a date range value for read-only display.\n * Returns \"start – end\", or just the one that exists.\n */\nexport function formatDateRange(value: unknown): string {\n if (!value) return \"\";\n const v = value as { start: string; end: string };\n if (!v.start && !v.end) return \"\";\n if (v.start && v.end) return `${v.start} – ${v.end}`;\n return v.start || v.end;\n}\n\n/**\n * Extracts display names from File or File[] values.\n */\nexport function getFileNames(value: unknown): string {\n if (!value) return \"\";\n if (Array.isArray(value)) return (value as File[]).map(f => f.name).join(\", \");\n return (value as File).name ?? \"\";\n}\n\n/**\n * Strips all non-digit characters from a string.\n */\nexport function extractDigits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Formats a digit string as a phone number.\n * Supports US \"(XXX) XXX-XXXX\", international \"+X XXX XXX XXXX\", and raw digits.\n */\nexport function formatPhone(digits: string, format: \"us\" | \"international\" | \"raw\"): string {\n if (format === \"raw\") return digits;\n\n if (format === \"international\") {\n // +X XXX XXX XXXX\n const d = digits.slice(0, 12);\n if (d.length === 0) return \"\";\n if (d.length <= 1) return `+${d}`;\n if (d.length <= 4) return `+${d[0]} ${d.slice(1)}`;\n if (d.length <= 7) return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4)}`;\n return `+${d[0]} ${d.slice(1, 4)} ${d.slice(4, 7)} ${d.slice(7)}`;\n }\n\n // US: (XXX) XXX-XXXX\n const d = digits.slice(0, 10);\n if (d.length === 0) return \"\";\n if (d.length <= 3) return `(${d}`;\n if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`;\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;\n}\n\n/**\n * Truncates text with \"...\" if it exceeds maxChars.\n */\nexport function ellipsifyText(value: string, maxChars: number): string {\n if (!value || value.length <= maxChars) return value ?? \"\";\n const cutoff = maxChars - 3;\n return `${value.substring(0, cutoff)}...`;\n}\n\n/** Default max file size in MB for FileUpload fields */\nexport const MAX_FILE_SIZE_MB_DEFAULT = 10;\n\n/** Shared strings for DocumentLinks component */\nexport const DocumentLinksStrings = {\n link: \"Link\",\n addLink: \"Add Link\",\n addAnotherLink: \"Add Another Link\",\n deleteLink: \"Delete Link\",\n confirmDeleteLink: \"Are you sure you want to delete\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n saveChanges: \"Save Changes\",\n save: \"Save\",\n};\n","/** Generic dictionary type */\nexport type Dictionary<T> = Record<string, T>;\n\n/** Entity data type */\nexport type IEntityData = Record<string, unknown>;\n\n/** Sub-entity value type */\nexport type SubEntityType = string | number | boolean | Date | object | null | undefined;\n\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") return Object.keys(value).length === 0;\n return false;\n}\n\nexport function isNull(value: unknown): value is null | undefined {\n return value == null;\n}\n\nexport function isStringEmpty(value: string | null | undefined): boolean {\n return value == null || value.trim() === \"\";\n}\n\nexport function deepCopy<T>(obj: T): T {\n return structuredClone(obj);\n}\n\nexport function convertBooleanToYesOrNoText(value: boolean | null | undefined): string {\n if (value === true) return \"Yes\";\n if (value === false) return \"No\";\n return \"\";\n}\n\n/** Sort options alphabetically by label */\nexport function sortDropdownOptions(a: { label?: string }, b: { label?: string }): number {\n const aText = a.label ? a.label.toLowerCase() : \"\";\n const bText = b.label ? b.label.toLowerCase() : \"\";\n return aText < bText ? -1 : aText > bText ? 1 : 0;\n}\n\n/** Create an option from a value string (value and label are the same) */\nexport function createOption(value: string): { value: string; label: string } {\n return { value, label: value };\n}\n"],"mappings":";AAMO,IAAM,qBAAqB,CAChC,WACA,aACA,YACA,aACW;AACX,SAAO,GAAG,WAAW,IAAI,UAAU,IAAI,QAAQ,IAAI,SAAS;AAC9D;AAMO,IAAM,iBAAiB,CAAC,WAAmB,UAA+B;AAC/E,SAAO,QAAQ,GAAG,SAAS,WAAW;AACxC;AAMO,SAAS,cAAc,OAKP;AACrB,MAAI,MAAM,MAAO,QAAO;AACxB,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,SAAU,QAAO;AAC3B,SAAO;AACT;AAMO,SAAS,eAAe,SAAiB,SAA+C;AAC7F,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,MAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAClC,MAAI,SAAS,eAAe;AAC1B,WAAO,KAAK,mBAAmB,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,EAC/F;AACA,SAAO,KAAK,eAAe,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,WAAW,MAAM,WAAW,QAAQ,UAAU,CAAC;AAC/H;AAKO,SAAS,oBAAoB,OAAwB;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,WAAO,eAAe,KAAe;AAAA,EACvC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAMO,SAAS,gBAAgB,OAAwB;AACtD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAK,QAAO;AAC/B,MAAI,EAAE,SAAS,EAAE,IAAK,QAAO,GAAG,EAAE,KAAK,WAAM,EAAE,GAAG;AAClD,SAAO,EAAE,SAAS,EAAE;AACtB;AAKO,SAAS,aAAa,OAAwB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAQ,MAAiB,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAC7E,SAAQ,MAAe,QAAQ;AACjC;AAKO,SAAS,cAAc,OAAuB;AACnD,SAAO,MAAM,QAAQ,OAAO,EAAE;AAChC;AAMO,SAAS,YAAY,QAAgB,QAAgD;AAC1F,MAAI,WAAW,MAAO,QAAO;AAE7B,MAAI,WAAW,iBAAiB;AAE9B,UAAMA,KAAI,OAAO,MAAM,GAAG,EAAE;AAC5B,QAAIA,GAAE,WAAW,EAAG,QAAO;AAC3B,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,EAAC;AAC/B,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AAChD,QAAIA,GAAE,UAAU,EAAG,QAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AACjE,WAAO,IAAIA,GAAE,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,GAAG,CAAC,CAAC,IAAIA,GAAE,MAAM,CAAC,CAAC;AAAA,EACjE;AAGA,QAAM,IAAI,OAAO,MAAM,GAAG,EAAE;AAC5B,MAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,MAAI,EAAE,UAAU,EAAG,QAAO,IAAI,CAAC;AAC/B,MAAI,EAAE,UAAU,EAAG,QAAO,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1D,SAAO,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1D;AAKO,SAAS,cAAc,OAAe,UAA0B;AACrE,MAAI,CAAC,SAAS,MAAM,UAAU,SAAU,QAAO,SAAS;AACxD,QAAM,SAAS,WAAW;AAC1B,SAAO,GAAG,MAAM,UAAU,GAAG,MAAM,CAAC;AACtC;AAGO,IAAM,2BAA2B;AAGjC,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AACR;;;ACrIO,SAAS,QAAQ,OAAyB;AAC/C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AACpE,SAAO;AACT;AAEO,SAAS,OAAO,OAA2C;AAChE,SAAO,SAAS;AAClB;AAEO,SAAS,cAAc,OAA2C;AACvE,SAAO,SAAS,QAAQ,MAAM,KAAK,MAAM;AAC3C;AAEO,SAAS,SAAY,KAAW;AACrC,SAAO,gBAAgB,GAAG;AAC5B;AAEO,SAAS,4BAA4B,OAA2C;AACrF,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO;AACT;AAGO,SAAS,oBAAoB,GAAuB,GAA+B;AACxF,QAAM,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,IAAI;AAChD,QAAM,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,IAAI;AAChD,SAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,IAAI;AAClD;AAGO,SAAS,aAAa,OAAiD;AAC5E,SAAO,EAAE,OAAO,OAAO,MAAM;AAC/B;","names":["d"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// src/constants.ts
|
|
2
|
+
var FIELD_PARENT_PREFIX = "Parent.";
|
|
3
|
+
var ComponentTypes = {
|
|
4
|
+
Textbox: "Textbox",
|
|
5
|
+
Dropdown: "Dropdown",
|
|
6
|
+
Toggle: "Toggle",
|
|
7
|
+
Number: "Number",
|
|
8
|
+
MultiSelect: "Multiselect",
|
|
9
|
+
DateControl: "DateControl",
|
|
10
|
+
Slider: "Slider",
|
|
11
|
+
Fragment: "DynamicFragment",
|
|
12
|
+
SimpleDropdown: "SimpleDropdown",
|
|
13
|
+
MultiSelectSearch: "MultiSelectSearch",
|
|
14
|
+
PopOutEditor: "PopOutEditor",
|
|
15
|
+
RichText: "RichText",
|
|
16
|
+
Textarea: "Textarea",
|
|
17
|
+
DocumentLinks: "DocumentLinks",
|
|
18
|
+
StatusDropdown: "StatusDropdown",
|
|
19
|
+
ReadOnly: "ReadOnly",
|
|
20
|
+
ReadOnlyArray: "ReadOnlyArray",
|
|
21
|
+
ReadOnlyDateTime: "ReadOnlyDateTime",
|
|
22
|
+
ReadOnlyCumulativeNumber: "ReadOnlyCumulativeNumber",
|
|
23
|
+
ReadOnlyRichText: "ReadOnlyRichText",
|
|
24
|
+
ReadOnlyWithButton: "ReadOnlyWithButton",
|
|
25
|
+
ChoiceSet: "ChoiceSet",
|
|
26
|
+
FieldArray: "FieldArray",
|
|
27
|
+
RadioGroup: "RadioGroup",
|
|
28
|
+
CheckboxGroup: "CheckboxGroup",
|
|
29
|
+
Rating: "Rating",
|
|
30
|
+
ColorPicker: "ColorPicker",
|
|
31
|
+
Autocomplete: "Autocomplete",
|
|
32
|
+
FileUpload: "FileUpload",
|
|
33
|
+
DateRange: "DateRange",
|
|
34
|
+
DateTime: "DateTime",
|
|
35
|
+
PhoneInput: "PhoneInput"
|
|
36
|
+
};
|
|
37
|
+
var FormConstants = {
|
|
38
|
+
defaultExpandCutoffCount: 12,
|
|
39
|
+
loadingShimmerCount: 12,
|
|
40
|
+
loadingFieldShimmerHeight: 32,
|
|
41
|
+
na: "n/a",
|
|
42
|
+
panelActionKeys: {
|
|
43
|
+
cancel: "Cancel",
|
|
44
|
+
close: "Close",
|
|
45
|
+
create: "Create",
|
|
46
|
+
update: "Update"
|
|
47
|
+
},
|
|
48
|
+
urlRegex: /(http(s?)):\/\//i,
|
|
49
|
+
errorColor: "#a4262c"
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
FIELD_PARENT_PREFIX,
|
|
54
|
+
ComponentTypes,
|
|
55
|
+
FormConstants
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=chunk-YMUYHDWI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const FIELD_PARENT_PREFIX = \"Parent.\";\n\n/** Component type constants */\nexport const ComponentTypes = {\n Textbox: \"Textbox\",\n Dropdown: \"Dropdown\",\n Toggle: \"Toggle\",\n Number: \"Number\",\n MultiSelect: \"Multiselect\",\n DateControl: \"DateControl\",\n Slider: \"Slider\",\n Fragment: \"DynamicFragment\",\n SimpleDropdown: \"SimpleDropdown\",\n MultiSelectSearch: \"MultiSelectSearch\",\n PopOutEditor: \"PopOutEditor\",\n RichText: \"RichText\",\n Textarea: \"Textarea\",\n DocumentLinks: \"DocumentLinks\",\n StatusDropdown: \"StatusDropdown\",\n ReadOnly: \"ReadOnly\",\n ReadOnlyArray: \"ReadOnlyArray\",\n ReadOnlyDateTime: \"ReadOnlyDateTime\",\n ReadOnlyCumulativeNumber: \"ReadOnlyCumulativeNumber\",\n ReadOnlyRichText: \"ReadOnlyRichText\",\n ReadOnlyWithButton: \"ReadOnlyWithButton\",\n ChoiceSet: \"ChoiceSet\",\n FieldArray: \"FieldArray\",\n RadioGroup: \"RadioGroup\",\n CheckboxGroup: \"CheckboxGroup\",\n Rating: \"Rating\",\n ColorPicker: \"ColorPicker\",\n Autocomplete: \"Autocomplete\",\n FileUpload: \"FileUpload\",\n DateRange: \"DateRange\",\n DateTime: \"DateTime\",\n PhoneInput: \"PhoneInput\",\n} as const;\n\n/** Form-level constants */\nexport const FormConstants = {\n defaultExpandCutoffCount: 12,\n loadingShimmerCount: 12,\n loadingFieldShimmerHeight: 32,\n na: \"n/a\",\n panelActionKeys: {\n cancel: \"Cancel\",\n close: \"Close\",\n create: \"Create\",\n update: \"Update\",\n },\n urlRegex: /(http(s?)):\\/\\//i,\n errorColor: \"#a4262c\",\n} as const;\n\n"],"mappings":";AAAO,IAAM,sBAAsB;AAG5B,IAAM,iBAAiB;AAAA,EAC5B,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AACd;AAGO,IAAM,gBAAgB;AAAA,EAC3B,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,IAAI;AAAA,EACJ,iBAAiB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AACd;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Generic dictionary type */
|
|
2
|
+
type Dictionary<T> = Record<string, T>;
|
|
3
|
+
/** Entity data type */
|
|
4
|
+
type IEntityData = Record<string, unknown>;
|
|
5
|
+
/** Sub-entity value type */
|
|
6
|
+
type SubEntityType = string | number | boolean | Date | object | null | undefined;
|
|
7
|
+
declare function isEmpty(value: unknown): boolean;
|
|
8
|
+
declare function isNull(value: unknown): value is null | undefined;
|
|
9
|
+
declare function isStringEmpty(value: string | null | undefined): boolean;
|
|
10
|
+
declare function deepCopy<T>(obj: T): T;
|
|
11
|
+
declare function convertBooleanToYesOrNoText(value: boolean | null | undefined): string;
|
|
12
|
+
/** Sort options alphabetically by label */
|
|
13
|
+
declare function sortDropdownOptions(a: {
|
|
14
|
+
label?: string;
|
|
15
|
+
}, b: {
|
|
16
|
+
label?: string;
|
|
17
|
+
}): number;
|
|
18
|
+
/** Create an option from a value string (value and label are the same) */
|
|
19
|
+
declare function createOption(value: string): {
|
|
20
|
+
value: string;
|
|
21
|
+
label: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { type Dictionary as D, type IEntityData as I, type SubEntityType as S, createOption as a, isNull as b, convertBooleanToYesOrNoText as c, deepCopy as d, isStringEmpty as e, isEmpty as i, sortDropdownOptions as s };
|