@shortstravelmgmt/component-lib 0.3.0 → 0.3.1-canary.76.g68c014d
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/index.d.ts +103 -2
- package/dist/index.esm.js +494 -248
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +495 -247
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.esm.js
CHANGED
|
@@ -1078,7 +1078,7 @@ const iconStyle$h = {
|
|
|
1078
1078
|
const bodyStyle$d = {
|
|
1079
1079
|
label: 'Alert-bodyStyle', flex: 1, minWidth: 0
|
|
1080
1080
|
};
|
|
1081
|
-
const titleStyle$
|
|
1081
|
+
const titleStyle$I = {
|
|
1082
1082
|
label: 'Alert-titleStyle',
|
|
1083
1083
|
color: 'var(--alert-ink)',
|
|
1084
1084
|
fontWeight: 'var(--font-weight-semibold)',
|
|
@@ -1147,7 +1147,7 @@ const variantIcons = {
|
|
|
1147
1147
|
*/
|
|
1148
1148
|
const Alert = ({ variant = 'primary', title, children, dismissible = false, onDismiss, className = '', }) => {
|
|
1149
1149
|
const IconComponent = variantIcons[variant];
|
|
1150
|
-
return (jsx("div", { className: cx(sx(alertStyle$5), sx(variantStyles$8[variant]), className), role: "alert", children: jsxs("div", { className: sx(contentStyle$e), children: [jsx(IconComponent, { className: sx(iconStyle$h), size: 20 }), jsxs("div", { className: sx(bodyStyle$d), children: [title && jsx("h4", { className: sx(titleStyle$
|
|
1150
|
+
return (jsx("div", { className: cx(sx(alertStyle$5), sx(variantStyles$8[variant]), className), role: "alert", children: jsxs("div", { className: sx(contentStyle$e), children: [jsx(IconComponent, { className: sx(iconStyle$h), size: 20 }), jsxs("div", { className: sx(bodyStyle$d), children: [title && jsx("h4", { className: sx(titleStyle$I), children: title }), jsx("div", { className: sx(messageStyle$3), children: children })] }), dismissible && onDismiss && (jsx("button", { type: "button", onClick: onDismiss, className: sx(dismissButtonStyle), "aria-label": "Dismiss alert", children: jsx(CloseIcon, { size: 16 }) }))] }) }));
|
|
1151
1151
|
};
|
|
1152
1152
|
|
|
1153
1153
|
const avatarSizeStyles = {
|
|
@@ -2840,7 +2840,7 @@ const textareaSizeStyles = {
|
|
|
2840
2840
|
* The focus rules below restate the ring the base focus rules already set —
|
|
2841
2841
|
* they did in the sheet too, and they are carried across unchanged.
|
|
2842
2842
|
*/
|
|
2843
|
-
const errorStyle$
|
|
2843
|
+
const errorStyle$5 = {
|
|
2844
2844
|
label: 'Input-errorStyle',
|
|
2845
2845
|
'&&&': {
|
|
2846
2846
|
borderColor: 'var(--color-danger-accent)',
|
|
@@ -2982,7 +2982,7 @@ const Input = forwardRef(({ size = 'md', sizing = 'fixed', label, helperText, er
|
|
|
2982
2982
|
const inputWrapperClasses = cx(sx(inputWrapperStyle$3),
|
|
2983
2983
|
// The fixed-height class still applies its horizontal padding and gap;
|
|
2984
2984
|
// the padded classes that follow override height and the vertical rhythm.
|
|
2985
|
-
sx(sizeStyles$8[size]), paddedClasses(sizing, size), error && sx(errorStyle$
|
|
2985
|
+
sx(sizeStyles$8[size]), paddedClasses(sizing, size), error && sx(errorStyle$5), disabled && sx(disabledStyle$7));
|
|
2986
2986
|
return (jsxs("div", { className: wrapperClasses, children: [label && (jsx("label", { htmlFor: inputId, className: sx(labelStyle$g), children: label })), jsxs("div", { className: inputWrapperClasses, children: [leftIcon && jsx("span", { className: sx(iconStyle$d), children: leftIcon }), jsx("input", { ref: ref, id: inputId, className: sx(inputStyle$5), disabled: disabled, "aria-invalid": !!error, "aria-describedby": error ? `${inputId}-error` : helperText ? `${inputId}-helper` : undefined, ...props }), rightIcon && jsx("span", { className: sx(iconStyle$d), children: rightIcon })] }), error && (jsx("span", { id: `${inputId}-error`, className: sx(errorTextStyle$4), children: error })), helperText && !error && (jsx("span", { id: `${inputId}-helper`, className: sx(helperTextStyle$4), children: helperText }))] }));
|
|
2987
2987
|
});
|
|
2988
2988
|
Input.displayName = 'Input';
|
|
@@ -2998,7 +2998,7 @@ const Textarea = forwardRef(({ size = 'md', sizing = 'fixed', label, helperText,
|
|
|
2998
2998
|
sx(textareaSizeStyles[size]), paddedClasses(sizing, size),
|
|
2999
2999
|
// `.textarea.paddedSm` — the type scale the padded rules put on a
|
|
3000
3000
|
// descendant `.input` that a bare <textarea> does not have.
|
|
3001
|
-
sizing === 'padded' && sx(textareaPaddedSizeStyles[size]), error && sx(errorStyle$
|
|
3001
|
+
sizing === 'padded' && sx(textareaPaddedSizeStyles[size]), error && sx(errorStyle$5), disabled && sx(disabledStyle$7));
|
|
3002
3002
|
return (jsxs("div", { className: wrapperClasses, children: [label && (jsx("label", { htmlFor: textareaId, className: sx(labelStyle$g), children: label })), jsx("textarea", { ref: ref, id: textareaId, className: textareaClasses, disabled: disabled, rows: rows, "aria-invalid": !!error, "aria-describedby": error ? `${textareaId}-error` : helperText ? `${textareaId}-helper` : undefined, ...props }), error && (jsx("span", { id: `${textareaId}-error`, className: sx(errorTextStyle$4), children: error })), helperText && !error && (jsx("span", { id: `${textareaId}-helper`, className: sx(helperTextStyle$4), children: helperText }))] }));
|
|
3003
3003
|
});
|
|
3004
3004
|
Textarea.displayName = 'Textarea';
|
|
@@ -3246,7 +3246,7 @@ const chevron$1 = `.${sx(chevronStyle$6)}`;
|
|
|
3246
3246
|
* `.selectWrapper:focus-within`, which is rewritten below as `&&:focus-within`
|
|
3247
3247
|
* (0,3,0) so it still clears the plain `&&` error border.
|
|
3248
3248
|
*/
|
|
3249
|
-
const errorStyle$
|
|
3249
|
+
const errorStyle$4 = {
|
|
3250
3250
|
label: 'Select-errorStyle',
|
|
3251
3251
|
'&&': { borderColor: 'var(--color-red-500)' },
|
|
3252
3252
|
'&&&:focus-within': {
|
|
@@ -3254,7 +3254,7 @@ const errorStyle$3 = {
|
|
|
3254
3254
|
boxShadow: '0 0 0 2px var(--color-accent-ink), 0 0 0 5px var(--color-accent-glow)',
|
|
3255
3255
|
},
|
|
3256
3256
|
};
|
|
3257
|
-
const error = `.${sx(errorStyle$
|
|
3257
|
+
const error = `.${sx(errorStyle$4)}`;
|
|
3258
3258
|
/**
|
|
3259
3259
|
* `&&` for the wrapper's own background/cursor, which beat `.selectWrapper` on
|
|
3260
3260
|
* source order; `&& .select` (0,3,0) for the inner colour, which had to clear
|
|
@@ -3418,7 +3418,7 @@ const Select = forwardRef(({ options, optionGroups, size = 'md', label, placehol
|
|
|
3418
3418
|
* their padded sizes separately, so Input's objects are not this
|
|
3419
3419
|
* component's. The prop is the shared contract; the rules are local.
|
|
3420
3420
|
*/
|
|
3421
|
-
const selectWrapperClasses = cx(sx(selectWrapperStyle), sx(sizeStyles$7[size]), sizing === 'padded' && cx(sx(paddedStyle), sx(paddedSizeStyles[size])), error && sx(errorStyle$
|
|
3421
|
+
const selectWrapperClasses = cx(sx(selectWrapperStyle), sx(sizeStyles$7[size]), sizing === 'padded' && cx(sx(paddedStyle), sx(paddedSizeStyles[size])), error && sx(errorStyle$4), disabled && sx(disabledStyle$6), Boolean(leftIcon) && sx(hasLeftIconStyle));
|
|
3422
3422
|
const renderOptions = () => {
|
|
3423
3423
|
// Render grouped options
|
|
3424
3424
|
if (optionGroups && optionGroups.length > 0) {
|
|
@@ -3731,7 +3731,7 @@ const inputStyle$4 = {
|
|
|
3731
3731
|
* `.inputWrapper:focus-within` on specificity and won on source order — here it
|
|
3732
3732
|
* has to out-rank that rule's own `&&&:focus-within` (0,4,0) outright.
|
|
3733
3733
|
*/
|
|
3734
|
-
const errorStyle$
|
|
3734
|
+
const errorStyle$3 = {
|
|
3735
3735
|
label: 'Timepicker-errorStyle',
|
|
3736
3736
|
'&&': {
|
|
3737
3737
|
borderColor: 'var(--color-red-500)',
|
|
@@ -3781,7 +3781,7 @@ const inputWrapperStyle$2 = {
|
|
|
3781
3781
|
borderColor: 'var(--color-primary-500)',
|
|
3782
3782
|
boxShadow: '0 0 0 2px var(--color-accent-ink), 0 0 0 5px var(--color-accent-glow)',
|
|
3783
3783
|
},
|
|
3784
|
-
[`&&&&:hover:not(.${sx(disabledStyle$5)}):not(.${sx(errorStyle$
|
|
3784
|
+
[`&&&&:hover:not(.${sx(disabledStyle$5)}):not(.${sx(errorStyle$3)})`]: {
|
|
3785
3785
|
borderColor: 'var(--color-gray-400)',
|
|
3786
3786
|
},
|
|
3787
3787
|
};
|
|
@@ -3826,7 +3826,7 @@ const Timepicker = forwardRef(({ size = 'md', label, helperText, error, fullWidt
|
|
|
3826
3826
|
const helperId = `${inputId}-helper`;
|
|
3827
3827
|
const errorId = `${inputId}-error`;
|
|
3828
3828
|
const wrapperClasses = cx(sx(wrapperStyle$6), fullWidth ? sx(fullWidthStyle$1) : '', className);
|
|
3829
|
-
const inputWrapperClasses = cx(sx(inputWrapperStyle$2), sx(sizeStyles$5[size]), error ? sx(errorStyle$
|
|
3829
|
+
const inputWrapperClasses = cx(sx(inputWrapperStyle$2), sx(sizeStyles$5[size]), error ? sx(errorStyle$3) : '', disabled ? sx(disabledStyle$5) : '');
|
|
3830
3830
|
return (jsxs("div", { className: wrapperClasses, children: [label && (jsx("label", { htmlFor: inputId, className: sx(labelStyle$d), children: label })), jsxs("div", { className: inputWrapperClasses, children: [jsx("span", { className: sx(iconStyle$c), children: jsx(ClockIcon$1, {}) }), jsx("input", { ref: ref, type: "time", id: inputId, className: sx(inputStyle$4), disabled: disabled, "aria-invalid": !!error, "aria-describedby": [error ? errorId : null, helperText ? helperId : null]
|
|
3831
3831
|
.filter(Boolean)
|
|
3832
3832
|
.join(' ') || undefined, ...props })] }), error && (jsx("span", { id: errorId, className: sx(errorTextStyle$2), children: error })), helperText && !error && (jsx("span", { id: helperId, className: sx(helperTextStyle$2), children: helperText }))] }));
|
|
@@ -3834,7 +3834,7 @@ const Timepicker = forwardRef(({ size = 'md', label, helperText, error, fullWidt
|
|
|
3834
3834
|
Timepicker.displayName = 'Timepicker';
|
|
3835
3835
|
|
|
3836
3836
|
/** The page heading: display face, tightened tracking, and no default margin. */
|
|
3837
|
-
const titleStyle$
|
|
3837
|
+
const titleStyle$H = {
|
|
3838
3838
|
label: 'Title-titleStyle',
|
|
3839
3839
|
fontFamily: 'var(--font-family-display)',
|
|
3840
3840
|
fontSize: 36,
|
|
@@ -3861,7 +3861,7 @@ const weightStyles = {
|
|
|
3861
3861
|
* Large, prominent text for page titles.
|
|
3862
3862
|
*/
|
|
3863
3863
|
const Title = ({ children, weight = 'light', className = '', }) => {
|
|
3864
|
-
return (jsx("h1", { className: cx(sx(titleStyle$
|
|
3864
|
+
return (jsx("h1", { className: cx(sx(titleStyle$H), sx(weightStyles[weight]), className), children: children }));
|
|
3865
3865
|
};
|
|
3866
3866
|
Title.displayName = 'Title';
|
|
3867
3867
|
|
|
@@ -4718,11 +4718,11 @@ const identityStyle$2 = {
|
|
|
4718
4718
|
display: 'flex',
|
|
4719
4719
|
flexDirection: 'column',
|
|
4720
4720
|
};
|
|
4721
|
-
const nameStyle$
|
|
4721
|
+
const nameStyle$7 = {
|
|
4722
4722
|
label: 'ContactCard-nameStyle',
|
|
4723
4723
|
fontWeight: 600,
|
|
4724
4724
|
};
|
|
4725
|
-
const titleStyle$
|
|
4725
|
+
const titleStyle$G = {
|
|
4726
4726
|
label: 'ContactCard-titleStyle',
|
|
4727
4727
|
fontSize: 12,
|
|
4728
4728
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -4752,7 +4752,7 @@ const linkTextStyle = {
|
|
|
4752
4752
|
const ContactCard$1 = ({ name, title, phone, email, action, showAvatar = true, className = '', }) => {
|
|
4753
4753
|
if (!action && !name)
|
|
4754
4754
|
return null;
|
|
4755
|
-
return (jsxs("div", { className: cx(sx(contactStyle$1), className), children: [name && showAvatar && jsx(Avatar, { name: name, size: 36 }), jsxs("div", { className: sx(bodyStyle$b), children: [jsxs("div", { className: sx(identityStyle$2), children: [action || jsx("span", { className: sx(nameStyle$
|
|
4755
|
+
return (jsxs("div", { className: cx(sx(contactStyle$1), className), children: [name && showAvatar && jsx(Avatar, { name: name, size: 36 }), jsxs("div", { className: sx(bodyStyle$b), children: [jsxs("div", { className: sx(identityStyle$2), children: [action || jsx("span", { className: sx(nameStyle$7), children: name }), title && jsx("span", { className: sx(titleStyle$G), children: title })] }), phone && (jsxs("a", { href: `tel:${phone}`, className: sx(linkStyle$1), children: [jsx(PhoneIcon, { size: 16, "aria-hidden": "true" }), jsx("span", { className: sx(linkTextStyle), children: phone })] })), email && (jsxs("a", { href: `mailto:${email}`, className: sx(linkStyle$1), children: [jsx(MailIcon, { size: 16, "aria-hidden": "true" }), jsx("span", { className: sx(linkTextStyle), children: email })] }))] })] }));
|
|
4756
4756
|
};
|
|
4757
4757
|
ContactCard$1.displayName = 'ContactCard';
|
|
4758
4758
|
|
|
@@ -5072,7 +5072,7 @@ const iconStyle$a = {
|
|
|
5072
5072
|
backgroundColor: 'var(--bg-subtle)',
|
|
5073
5073
|
color: 'var(--fg-4)',
|
|
5074
5074
|
};
|
|
5075
|
-
const titleStyle$
|
|
5075
|
+
const titleStyle$F = {
|
|
5076
5076
|
label: 'EmptyState-titleStyle',
|
|
5077
5077
|
margin: 0,
|
|
5078
5078
|
color: 'var(--fg-1)',
|
|
@@ -5088,7 +5088,7 @@ const descriptionStyle$a = {
|
|
|
5088
5088
|
fontSize: 'var(--fs-sm)',
|
|
5089
5089
|
lineHeight: 'var(--lh-sm)',
|
|
5090
5090
|
};
|
|
5091
|
-
const actionsStyle$
|
|
5091
|
+
const actionsStyle$e = {
|
|
5092
5092
|
label: 'EmptyState-actionsStyle',
|
|
5093
5093
|
display: 'flex',
|
|
5094
5094
|
flexWrap: 'wrap',
|
|
@@ -5098,7 +5098,7 @@ const actionsStyle$d = {
|
|
|
5098
5098
|
};
|
|
5099
5099
|
|
|
5100
5100
|
/** Placeholder shown when a list, table, or panel has nothing to display. */
|
|
5101
|
-
const EmptyState$1 = ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size = 'md', children, className = '', }) => (jsxs("div", { className: cx(sx(emptyStateStyle$1), sx(sizeStyles$4[size]), className), "data-test": "empty-state", children: [icon && jsx("div", { className: sx(iconStyle$a), "aria-hidden": "true", children: icon }), jsx("p", { className: sx(titleStyle$
|
|
5101
|
+
const EmptyState$1 = ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size = 'md', children, className = '', }) => (jsxs("div", { className: cx(sx(emptyStateStyle$1), sx(sizeStyles$4[size]), className), "data-test": "empty-state", children: [icon && jsx("div", { className: sx(iconStyle$a), "aria-hidden": "true", children: icon }), jsx("p", { className: sx(titleStyle$F), children: title }), description && jsx("p", { className: sx(descriptionStyle$a), children: description }), (actionLabel || secondaryActionLabel) && (jsxs("div", { className: sx(actionsStyle$e), children: [actionLabel && (jsx(Button, { size: "sm", onClick: onAction, "data-test": "empty-state-action", children: actionLabel })), secondaryActionLabel && (jsx(Button, { size: "sm", variant: "secondary", onClick: onSecondaryAction, "data-test": "empty-state-secondary-action", children: secondaryActionLabel }))] })), children] }));
|
|
5102
5102
|
|
|
5103
5103
|
/** FieldLayout's compiled rules. */
|
|
5104
5104
|
const fieldStyle$4 = {
|
|
@@ -5178,11 +5178,11 @@ const messageStyle$2 = {
|
|
|
5178
5178
|
label: 'FieldLayout-messageStyle', fontSize: 12
|
|
5179
5179
|
};
|
|
5180
5180
|
/** Paired with `messageStyle`, which sets no colour — no ranking to preserve. */
|
|
5181
|
-
const errorStyle$
|
|
5181
|
+
const errorStyle$2 = {
|
|
5182
5182
|
label: 'FieldLayout-errorStyle',
|
|
5183
5183
|
color: 'var(--color-error, #940000)',
|
|
5184
5184
|
};
|
|
5185
|
-
const noteStyle$
|
|
5185
|
+
const noteStyle$3 = {
|
|
5186
5186
|
label: 'FieldLayout-noteStyle',
|
|
5187
5187
|
color: 'var(--color-stone, #787878)',
|
|
5188
5188
|
};
|
|
@@ -5200,7 +5200,7 @@ const FieldLayout = ({ children, label, labelPosition = 'top', showLabel = true,
|
|
|
5200
5200
|
const id = useId();
|
|
5201
5201
|
const errorId = `${id}-error`;
|
|
5202
5202
|
const hasError = Boolean(error);
|
|
5203
|
-
return (jsxs("div", { className: cx(sx(fieldStyle$4), sx(labelPositionStyles[labelPosition]), className), children: [label && showLabel && (jsxs("label", { htmlFor: id, className: cx(sx(labelStyle$b), hasError ? sx(labelErrorStyle) : ''), children: [label, required && !disabled && (jsx("span", { className: sx(requiredStyle$2), "aria-hidden": "true", children: "*" })), tooltip && (jsx(Tooltip, { className: sx(tooltipStyle$1), content: tooltip, children: jsx(InfoIcon$1, { size: 16 }) }))] })), jsxs("div", { className: sx(controlStyle$2), children: [leftIcon && !disabled && (jsx("span", { className: cx(sx(iconStyle$9), sx(iconLeftStyle)), "aria-hidden": "true", children: leftIcon })), children({ id, describedBy: hasError ? errorId : undefined, hasError }), rightIcon && !disabled && (jsx("span", { className: cx(sx(iconStyle$9), sx(iconRightStyle)), "aria-hidden": "true", children: rightIcon }))] }), hasError && (jsx("p", { id: errorId, className: cx(sx(messageStyle$2), sx(errorStyle$
|
|
5203
|
+
return (jsxs("div", { className: cx(sx(fieldStyle$4), sx(labelPositionStyles[labelPosition]), className), children: [label && showLabel && (jsxs("label", { htmlFor: id, className: cx(sx(labelStyle$b), hasError ? sx(labelErrorStyle) : ''), children: [label, required && !disabled && (jsx("span", { className: sx(requiredStyle$2), "aria-hidden": "true", children: "*" })), tooltip && (jsx(Tooltip, { className: sx(tooltipStyle$1), content: tooltip, children: jsx(InfoIcon$1, { size: 16 }) }))] })), jsxs("div", { className: sx(controlStyle$2), children: [leftIcon && !disabled && (jsx("span", { className: cx(sx(iconStyle$9), sx(iconLeftStyle)), "aria-hidden": "true", children: leftIcon })), children({ id, describedBy: hasError ? errorId : undefined, hasError }), rightIcon && !disabled && (jsx("span", { className: cx(sx(iconStyle$9), sx(iconRightStyle)), "aria-hidden": "true", children: rightIcon }))] }), hasError && (jsx("p", { id: errorId, className: cx(sx(messageStyle$2), sx(errorStyle$2)), children: error })), note && jsx("p", { className: cx(sx(messageStyle$2), sx(noteStyle$3)), children: note })] }));
|
|
5204
5204
|
};
|
|
5205
5205
|
FieldLayout.displayName = 'FieldLayout';
|
|
5206
5206
|
|
|
@@ -5731,7 +5731,7 @@ const iconStyle$8 = {
|
|
|
5731
5731
|
display: 'flex',
|
|
5732
5732
|
},
|
|
5733
5733
|
};
|
|
5734
|
-
const titleStyle$
|
|
5734
|
+
const titleStyle$E = {
|
|
5735
5735
|
label: 'FormSection-titleStyle',
|
|
5736
5736
|
margin: 0,
|
|
5737
5737
|
fontSize: 16,
|
|
@@ -5798,7 +5798,7 @@ const statusStyles = {
|
|
|
5798
5798
|
const FormSection = ({ title, icon, description, action, status, disabled = false, children, className, id, dataTest, }) => {
|
|
5799
5799
|
const isSubmitted = status === 'submitted';
|
|
5800
5800
|
const isDisabled = disabled || isSubmitted;
|
|
5801
|
-
return (jsxs("div", { className: cx(sx(sectionStyle$a), className), id: id, "data-test": dataTest, children: [jsxs("div", { className: sx(headerStyle$J), children: [icon && jsx("span", { className: sx(iconStyle$8), children: icon }), jsxs("div", { className: sx(headingStyle$5), children: [jsx("h2", { className: sx(titleStyle$
|
|
5801
|
+
return (jsxs("div", { className: cx(sx(sectionStyle$a), className), id: id, "data-test": dataTest, children: [jsxs("div", { className: sx(headerStyle$J), children: [icon && jsx("span", { className: sx(iconStyle$8), children: icon }), jsxs("div", { className: sx(headingStyle$5), children: [jsx("h2", { className: sx(titleStyle$E), children: title }), description && jsx("p", { className: sx(descriptionStyle$9), children: description })] }), action && jsx("div", { className: sx(actionStyle$1), children: action })] }), jsxs("fieldset", { disabled: isDisabled, className: cx(sx(fieldsetStyle), isDisabled && sx(disabledStyle$4)), children: [status && (jsxs("div", { className: sx(statusStyle$6), children: [jsx("span", { className: sx(statusLabelStyle), children: "Status:" }), jsx("span", { className: cx(sx(statusValueStyle), sx(statusStyles[status])), children: status === 'submitted' ? 'Submitted' : status === 'draft' ? 'Draft' : 'Not Submitted' })] })), children] })] }));
|
|
5802
5802
|
};
|
|
5803
5803
|
FormSection.displayName = 'FormSection';
|
|
5804
5804
|
|
|
@@ -5946,7 +5946,7 @@ const lockedActiveStyle = {
|
|
|
5946
5946
|
* and the tab picks one, which is exactly what the cascade resolved to and
|
|
5947
5947
|
* needs no ordering between the rules to hold.
|
|
5948
5948
|
*/
|
|
5949
|
-
const countStyle = {
|
|
5949
|
+
const countStyle$1 = {
|
|
5950
5950
|
label: 'ManifestViewToggle-countStyle',
|
|
5951
5951
|
fontSize: 11,
|
|
5952
5952
|
fontWeight: 'var(--fw-bold)',
|
|
@@ -5973,7 +5973,7 @@ const ManifestViewToggle = ({ view, onView, paxCount, eqCount, locked, className
|
|
|
5973
5973
|
// Locked reads before active, matching the descendant rules the
|
|
5974
5974
|
// stylesheet ordered the same way.
|
|
5975
5975
|
const countState = locked ? 'locked' : active ? 'active' : 'default';
|
|
5976
|
-
return (jsxs("button", { type: "button", role: "tab", "aria-selected": active, onClick: () => onView(tab.key), className: cx(sx(tabStyle$3), active && sx(activeStyle), locked && sx(lockedStyle$1), locked && active && sx(lockedActiveStyle)), children: [jsx(Icon, { size: 16 }), tab.label, jsx("span", { className: cx(sx(countStyle), sx(countColorStyles[countState])), children: tab.count })] }, tab.key));
|
|
5976
|
+
return (jsxs("button", { type: "button", role: "tab", "aria-selected": active, onClick: () => onView(tab.key), className: cx(sx(tabStyle$3), active && sx(activeStyle), locked && sx(lockedStyle$1), locked && active && sx(lockedActiveStyle)), children: [jsx(Icon, { size: 16 }), tab.label, jsx("span", { className: cx(sx(countStyle$1), sx(countColorStyles[countState])), children: tab.count })] }, tab.key));
|
|
5977
5977
|
}) }));
|
|
5978
5978
|
};
|
|
5979
5979
|
|
|
@@ -6906,7 +6906,7 @@ const pretitleStyle$1 = {
|
|
|
6906
6906
|
color: 'var(--color-slate, #5c5c5c)',
|
|
6907
6907
|
margin: 0,
|
|
6908
6908
|
};
|
|
6909
|
-
const titleStyle$
|
|
6909
|
+
const titleStyle$D = {
|
|
6910
6910
|
label: 'PageHeader-titleStyle',
|
|
6911
6911
|
fontSize: 36,
|
|
6912
6912
|
lineHeight: '48px',
|
|
@@ -6926,7 +6926,7 @@ const titleStyle$C = {
|
|
|
6926
6926
|
* The header keeps its height while `title` is empty and fades in once one
|
|
6927
6927
|
* arrives, so pages do not jump as their data loads.
|
|
6928
6928
|
*/
|
|
6929
|
-
const PageHeader = ({ title, pretitle, after, back, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$I), !title && sx(emptyStyle$m), className), children: [back, jsx("div", { className: sx(bodyStyle$a), children: jsxs("div", { className: sx(textStyle), children: [pretitle && jsx("h2", { className: sx(pretitleStyle$1), children: pretitle }), jsxs("h1", { className: sx(titleStyle$
|
|
6929
|
+
const PageHeader = ({ title, pretitle, after, back, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$I), !title && sx(emptyStyle$m), className), children: [back, jsx("div", { className: sx(bodyStyle$a), children: jsxs("div", { className: sx(textStyle), children: [pretitle && jsx("h2", { className: sx(pretitleStyle$1), children: pretitle }), jsxs("h1", { className: sx(titleStyle$D), children: [title, "\u00A0"] }), after] }) })] }));
|
|
6930
6930
|
PageHeader.displayName = 'PageHeader';
|
|
6931
6931
|
|
|
6932
6932
|
/**
|
|
@@ -6982,7 +6982,7 @@ const sectionStyle$9 = {
|
|
|
6982
6982
|
fontWeight: 400,
|
|
6983
6983
|
lineHeight: '28px',
|
|
6984
6984
|
};
|
|
6985
|
-
const titleStyle$
|
|
6985
|
+
const titleStyle$C = {
|
|
6986
6986
|
label: 'PageHeaderSubsection-titleStyle',
|
|
6987
6987
|
gridArea: 'title',
|
|
6988
6988
|
margin: 0,
|
|
@@ -6999,7 +6999,7 @@ const metaStyle$1 = {
|
|
|
6999
6999
|
minWidth: 0,
|
|
7000
7000
|
marginTop: 4,
|
|
7001
7001
|
};
|
|
7002
|
-
const actionsStyle$
|
|
7002
|
+
const actionsStyle$d = {
|
|
7003
7003
|
label: 'PageHeaderSubsection-actionsStyle',
|
|
7004
7004
|
gridArea: 'actions',
|
|
7005
7005
|
display: 'flex',
|
|
@@ -7019,7 +7019,7 @@ const PageHeaderSubsection = ({ sectionName, pageName, meta, onBack, backLabel =
|
|
|
7019
7019
|
else
|
|
7020
7020
|
window.history.back();
|
|
7021
7021
|
};
|
|
7022
|
-
return (jsxs("div", { className: cx(sx(headerStyle$H), className), "data-test": "page-header-subsection", children: [jsxs("div", { className: sx(sectionRowStyle), children: [!hideBack && (jsx("button", { type: "button", className: sx(backButtonStyle$1), onClick: handleBack, "aria-label": backLabel, "data-test": "page-header-subsection-back", children: jsx(BackIcon$1, {}) })), jsx("p", { className: sx(sectionStyle$9), children: sectionName })] }), jsx("h1", { className: sx(titleStyle$
|
|
7022
|
+
return (jsxs("div", { className: cx(sx(headerStyle$H), className), "data-test": "page-header-subsection", children: [jsxs("div", { className: sx(sectionRowStyle), children: [!hideBack && (jsx("button", { type: "button", className: sx(backButtonStyle$1), onClick: handleBack, "aria-label": backLabel, "data-test": "page-header-subsection-back", children: jsx(BackIcon$1, {}) })), jsx("p", { className: sx(sectionStyle$9), children: sectionName })] }), jsx("h1", { className: sx(titleStyle$C), children: pageName }), meta && jsx("div", { className: sx(metaStyle$1), children: meta }), actions && jsx("div", { className: sx(actionsStyle$d), children: actions })] }));
|
|
7023
7023
|
};
|
|
7024
7024
|
PageHeaderSubsection.displayName = 'PageHeaderSubsection';
|
|
7025
7025
|
|
|
@@ -7117,7 +7117,7 @@ const focusRing = {
|
|
|
7117
7117
|
* current page is matched on `[aria-current="page"]` instead — the component
|
|
7118
7118
|
* sets that attribute from the same expression that sets `currentStyle`.
|
|
7119
7119
|
*/
|
|
7120
|
-
const pageStyle$
|
|
7120
|
+
const pageStyle$v = {
|
|
7121
7121
|
label: 'Pagination-pageStyle',
|
|
7122
7122
|
...buttonBase,
|
|
7123
7123
|
'&:hover:not([aria-current="page"])': {
|
|
@@ -7200,7 +7200,7 @@ const Pagination = ({ page, pageSize, totalItems, siblingCount = 1, pageSizeOpti
|
|
|
7200
7200
|
return;
|
|
7201
7201
|
onPageChange?.(next);
|
|
7202
7202
|
};
|
|
7203
|
-
return (jsxs("nav", { className: cx(sx(paginationStyle$3), className), "aria-label": ariaLabel, "data-test": "pagination", children: [!hideSummary && (jsxs("p", { className: sx(summaryStyle$6), "data-test": "pagination-summary", children: ["Showing ", firstItem, "\u2013", lastItem, " of ", totalItems, " ", itemLabel] })), jsxs("div", { className: sx(controlsStyle), children: [showSizeSelector && (jsxs("label", { className: sx(pageSizeStyle), children: [jsx("span", { children: "Rows per page" }), jsx("select", { value: pageSize, onChange: (event) => onPageSizeChange?.(Number(event.target.value)), "data-test": "pagination-page-size", children: pageSizeOptions.map((option) => (jsx("option", { value: option, children: option }, option))) })] })), jsxs("ul", { className: sx(pagesStyle), children: [jsx("li", { children: jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage - 1), disabled: currentPage <= 1, "aria-label": "Previous page", "data-test": "pagination-previous", children: jsx(ChevronLeftIcon, { size: 16 }) }) }), items.map((item, index) => item === 'ellipsis' ? (jsx("li", { className: sx(ellipsisStyle), "aria-hidden": "true", children: "\u2026" }, `ellipsis-${index}`)) : (jsx("li", { children: jsx("button", { type: "button", className: cx(sx(pageStyle$
|
|
7203
|
+
return (jsxs("nav", { className: cx(sx(paginationStyle$3), className), "aria-label": ariaLabel, "data-test": "pagination", children: [!hideSummary && (jsxs("p", { className: sx(summaryStyle$6), "data-test": "pagination-summary", children: ["Showing ", firstItem, "\u2013", lastItem, " of ", totalItems, " ", itemLabel] })), jsxs("div", { className: sx(controlsStyle), children: [showSizeSelector && (jsxs("label", { className: sx(pageSizeStyle), children: [jsx("span", { children: "Rows per page" }), jsx("select", { value: pageSize, onChange: (event) => onPageSizeChange?.(Number(event.target.value)), "data-test": "pagination-page-size", children: pageSizeOptions.map((option) => (jsx("option", { value: option, children: option }, option))) })] })), jsxs("ul", { className: sx(pagesStyle), children: [jsx("li", { children: jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage - 1), disabled: currentPage <= 1, "aria-label": "Previous page", "data-test": "pagination-previous", children: jsx(ChevronLeftIcon, { size: 16 }) }) }), items.map((item, index) => item === 'ellipsis' ? (jsx("li", { className: sx(ellipsisStyle), "aria-hidden": "true", children: "\u2026" }, `ellipsis-${index}`)) : (jsx("li", { children: jsx("button", { type: "button", className: cx(sx(pageStyle$v), item === currentPage && sx(currentStyle)), onClick: () => goTo(item), "aria-label": `Page ${item}`, "aria-current": item === currentPage ? 'page' : undefined, "data-test": `pagination-page-${item}`, children: item }) }, item))), jsx("li", { children: jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage + 1), disabled: currentPage >= pageCount, "aria-label": "Next page", "data-test": "pagination-next", children: jsx(ChevronRightIcon$1, { size: 16 }) }) })] })] })] }));
|
|
7204
7204
|
};
|
|
7205
7205
|
|
|
7206
7206
|
/* Progress Bar */
|
|
@@ -7371,7 +7371,7 @@ ResultCount.displayName = 'ResultCount';
|
|
|
7371
7371
|
* - `@keyframes spin` was scoped by the module; injected at runtime it is
|
|
7372
7372
|
* global, so it is namespaced `stm-spin` and the `animation` value follows.
|
|
7373
7373
|
*/
|
|
7374
|
-
const toolbarStyle$
|
|
7374
|
+
const toolbarStyle$5 = {
|
|
7375
7375
|
label: 'RosterToolbar-toolbarStyle',
|
|
7376
7376
|
display: 'flex',
|
|
7377
7377
|
alignItems: 'center',
|
|
@@ -7550,7 +7550,7 @@ const DropdownButton = ({ label, icon, options, }) => {
|
|
|
7550
7550
|
* RosterToolbar - Toolbar for roster management with import/export/save actions
|
|
7551
7551
|
*/
|
|
7552
7552
|
const RosterToolbar = ({ importOptions, exportOptions, lockToggle, saveButton, additionalActions, searchField, className = '', }) => {
|
|
7553
|
-
const toolbarClasses = cx(sx(toolbarStyle$
|
|
7553
|
+
const toolbarClasses = cx(sx(toolbarStyle$5), className);
|
|
7554
7554
|
return (jsxs("div", { className: toolbarClasses, children: [jsxs("div", { className: sx(leftSectionStyle), children: [searchField, additionalActions] }), jsxs("div", { className: sx(rightSectionStyle), children: [importOptions && importOptions.length > 0 && (jsx(DropdownButton, { label: "Import", icon: jsx(ImportIcon, {}), options: importOptions })), exportOptions && exportOptions.length > 0 && (jsx(DropdownButton, { label: "Export", icon: jsx(ExportIcon$1, {}), options: exportOptions })), lockToggle && (jsxs("button", { type: "button", className: cx(sx(lockButtonStyle), lockToggle.isLocked && sx(lockedStyle)), onClick: () => lockToggle.onToggle(!lockToggle.isLocked), disabled: lockToggle.disabled, "aria-label": lockToggle.isLocked ? 'Unlock roster' : 'Lock roster', children: [lockToggle.isLocked ? jsx(LockIcon, {}) : jsx(UnlockIcon, {}), jsx("span", { children: lockToggle.isLocked ? 'Locked' : 'Unlocked' })] })), saveButton && (jsxs("button", { type: "button", className: sx(saveButtonStyle), onClick: saveButton.onClick, disabled: saveButton.disabled || saveButton.loading, children: [saveButton.loading ? jsx(SpinnerIcon, {}) : jsx(SaveIcon, {}), jsx("span", { children: saveButton.label || 'Save' })] }))] })] }));
|
|
7555
7555
|
};
|
|
7556
7556
|
RosterToolbar.displayName = 'RosterToolbar';
|
|
@@ -7667,7 +7667,7 @@ const SearchField = forwardRef(({ placeholder = 'Search...', value, defaultValue
|
|
|
7667
7667
|
SearchField.displayName = 'SearchField';
|
|
7668
7668
|
|
|
7669
7669
|
/** The form's own vertical rhythm. */
|
|
7670
|
-
const formStyle$
|
|
7670
|
+
const formStyle$6 = {
|
|
7671
7671
|
label: 'SchoolContactForm-formStyle',
|
|
7672
7672
|
display: 'grid',
|
|
7673
7673
|
gap: 16,
|
|
@@ -7726,7 +7726,7 @@ const phoneFieldsStyle = {
|
|
|
7726
7726
|
* Layout for Hub's school-contact editor. Field controls stay injectable so
|
|
7727
7727
|
* consuming applications retain their form state, validation, and masking.
|
|
7728
7728
|
*/
|
|
7729
|
-
const SchoolContactForm = ({ mode, createFromPortalUser, firstNameField, middleInitialField, lastNameField, businessPhoneField, cellPhoneField, emailField, className = '', }) => (jsxs("div", { className: cx(sx(formStyle$
|
|
7729
|
+
const SchoolContactForm = ({ mode, createFromPortalUser, firstNameField, middleInitialField, lastNameField, businessPhoneField, cellPhoneField, emailField, className = '', }) => (jsxs("div", { className: cx(sx(formStyle$6), className), children: [mode === 'Add' && (jsxs(Fragment, { children: [jsxs("div", { children: [jsx("label", { className: sx(portalLabelStyle), children: "Create From Portal User" }), createFromPortalUser] }), jsx("div", { className: sx(dividerStyle$2), children: jsx("strong", { children: "OR" }) }), jsx("p", { className: sx(newContactLabelStyle), children: "Create New Contact Without Portal Access" })] })), jsxs("div", { className: sx(nameFieldsStyle), children: [firstNameField, middleInitialField, lastNameField] }), jsxs("div", { className: sx(phoneFieldsStyle), children: [businessPhoneField, cellPhoneField] }), jsx("div", { children: emailField })] }));
|
|
7730
7730
|
|
|
7731
7731
|
const segmentStyle$2 = {
|
|
7732
7732
|
label: 'Segment-segmentStyle',
|
|
@@ -7955,7 +7955,7 @@ const activeTabStyle$1 = {
|
|
|
7955
7955
|
},
|
|
7956
7956
|
};
|
|
7957
7957
|
/* Actions */
|
|
7958
|
-
const actionsStyle$
|
|
7958
|
+
const actionsStyle$c = {
|
|
7959
7959
|
label: 'SelectFilter-actionsStyle',
|
|
7960
7960
|
display: 'flex',
|
|
7961
7961
|
gap: 8,
|
|
@@ -8119,7 +8119,7 @@ const SelectFilter = ({ label, options = [], groupedOptions = {}, value = [], on
|
|
|
8119
8119
|
}
|
|
8120
8120
|
return `${selected.length} selected`;
|
|
8121
8121
|
};
|
|
8122
|
-
return (jsxs("div", { ref: dropdownRef, className: cx(sx(containerStyle$4), className), children: [jsxs("button", { type: "button", className: cx(sx(triggerStyle$1), disabled ? sx(disabledStyle) : '', isOpen ? sx(openStyle$2) : ''), onClick: () => !disabled && setIsOpen(!isOpen), children: [jsx("span", { className: cx(sx(triggerTextStyle), selectedValues.length === 0 ? sx(placeholderStyle) : ''), children: getDisplayText() }), jsx("span", { className: sx(chevronStyle$3), children: jsx(ChevronIcon$1, {}) })] }), isOpen && (jsxs("div", { className: sx(dropdownStyle$1), style: { width }, children: [grouped && tabs.length > 0 && (jsx("div", { className: sx(tabsStyle$8), children: tabs.map(tab => (jsx("button", { type: "button", className: cx(sx(tabStyle$2), activeTab === tab ? sx(activeTabStyle$1) : ''), onClick: () => setActiveTab(tab), children: tab.charAt(0).toUpperCase() + tab.slice(1) }, tab))) })), multiselect && (jsxs("div", { className: sx(actionsStyle$
|
|
8122
|
+
return (jsxs("div", { ref: dropdownRef, className: cx(sx(containerStyle$4), className), children: [jsxs("button", { type: "button", className: cx(sx(triggerStyle$1), disabled ? sx(disabledStyle) : '', isOpen ? sx(openStyle$2) : ''), onClick: () => !disabled && setIsOpen(!isOpen), children: [jsx("span", { className: cx(sx(triggerTextStyle), selectedValues.length === 0 ? sx(placeholderStyle) : ''), children: getDisplayText() }), jsx("span", { className: sx(chevronStyle$3), children: jsx(ChevronIcon$1, {}) })] }), isOpen && (jsxs("div", { className: sx(dropdownStyle$1), style: { width }, children: [grouped && tabs.length > 0 && (jsx("div", { className: sx(tabsStyle$8), children: tabs.map(tab => (jsx("button", { type: "button", className: cx(sx(tabStyle$2), activeTab === tab ? sx(activeTabStyle$1) : ''), onClick: () => setActiveTab(tab), children: tab.charAt(0).toUpperCase() + tab.slice(1) }, tab))) })), multiselect && (jsxs("div", { className: sx(actionsStyle$c), children: [jsx("button", { type: "button", className: sx(actionBtnStyle), onClick: handleSelectAll, children: "Select All" }), jsx("button", { type: "button", className: sx(actionBtnStyle), onClick: handleClear, children: "Clear" })] })), jsx("div", { className: sx(optionsStyle), children: currentOptions.map(option => (jsxs("div", { className: cx(sx(optionStyle), selectedValues.includes(option.value) ? sx(selectedStyle$3) : ''), onClick: () => handleSelect(option.value), children: [multiselect && (jsx("span", { className: sx(checkboxStyle$1), children: selectedValues.includes(option.value) && jsx(CheckIcon, {}) })), jsx("span", { className: sx(optionLabelStyle), children: option.label })] }, option.value))) }), multiselect && (jsx("div", { className: sx(footerStyle$d), children: jsx("button", { type: "button", className: sx(applyBtnStyle), onClick: () => setIsOpen(false), children: "Apply" }) }))] }))] }));
|
|
8123
8123
|
};
|
|
8124
8124
|
SelectFilter.displayName = 'SelectFilter';
|
|
8125
8125
|
|
|
@@ -8621,7 +8621,7 @@ const toggleRowStyle = {
|
|
|
8621
8621
|
'& [data-team-picker-only]': { opacity: 0 },
|
|
8622
8622
|
'&:hover [data-team-picker-only], &:focus-within [data-team-picker-only]': { opacity: 1 },
|
|
8623
8623
|
};
|
|
8624
|
-
const nameStyle$
|
|
8624
|
+
const nameStyle$6 = {
|
|
8625
8625
|
label: 'TeamPicker-nameStyle',
|
|
8626
8626
|
flex: 1,
|
|
8627
8627
|
// `&&`: see rootStyle — the name is a span, which host heading rules target.
|
|
@@ -8662,7 +8662,7 @@ const TeamPicker = ({ groups, groupOrder, activeGroup, onGroupChange, mode = 'si
|
|
|
8662
8662
|
const row = (team) => {
|
|
8663
8663
|
const chosen = selected.includes(team.code);
|
|
8664
8664
|
if (!multiple) {
|
|
8665
|
-
return (jsxs("button", { type: "button", className: [sx(pickRowStyle), chosen && sx(pickedStyle)].filter(Boolean).join(' '), "aria-label": `${team.name} (${team.code})`, "aria-pressed": chosen || undefined, onClick: () => onSelect?.(team.code), "data-testid": "team-picker-option", children: [jsx(SportCodeBadge, { code: team.code }), jsx("span", { className: sx(nameStyle$
|
|
8665
|
+
return (jsxs("button", { type: "button", className: [sx(pickRowStyle), chosen && sx(pickedStyle)].filter(Boolean).join(' '), "aria-label": `${team.name} (${team.code})`, "aria-pressed": chosen || undefined, onClick: () => onSelect?.(team.code), "data-testid": "team-picker-option", children: [jsx(SportCodeBadge, { code: team.code }), jsx("span", { className: sx(nameStyle$6), children: team.name })] }, team.code));
|
|
8666
8666
|
}
|
|
8667
8667
|
return (jsxs("div", { className: sx(toggleRowStyle),
|
|
8668
8668
|
// A click anywhere on the row toggles the team, except on the checkbox
|
|
@@ -8672,7 +8672,7 @@ const TeamPicker = ({ groups, groupOrder, activeGroup, onGroupChange, mode = 'si
|
|
|
8672
8672
|
if (event.target.closest('input, label'))
|
|
8673
8673
|
return;
|
|
8674
8674
|
onToggle?.(team.code);
|
|
8675
|
-
}, "data-testid": "team-picker-option", children: [jsx(Checkbox, { size: "sm", checked: chosen, onChange: () => onToggle?.(team.code), "aria-label": `${team.name} (${team.code})` }), jsx(SportCodeBadge, { code: team.code }), " ", jsx("span", { className: sx(nameStyle$
|
|
8675
|
+
}, "data-testid": "team-picker-option", children: [jsx(Checkbox, { size: "sm", checked: chosen, onChange: () => onToggle?.(team.code), "aria-label": `${team.name} (${team.code})` }), jsx(SportCodeBadge, { code: team.code }), " ", jsx("span", { className: sx(nameStyle$6), children: team.name }), onOnly && (jsx(Button, { type: "button", variant: "secondary", size: "sm", "data-team-picker-only": "", onClick: (event) => {
|
|
8676
8676
|
event.stopPropagation();
|
|
8677
8677
|
onOnly(team.code);
|
|
8678
8678
|
}, children: "Only" }))] }, team.code));
|
|
@@ -8728,7 +8728,7 @@ const identityStyle$1 = {
|
|
|
8728
8728
|
gap: 12,
|
|
8729
8729
|
},
|
|
8730
8730
|
};
|
|
8731
|
-
const codeStyle$
|
|
8731
|
+
const codeStyle$4 = {
|
|
8732
8732
|
label: 'TeamCalendarHeader-codeStyle',
|
|
8733
8733
|
background: '#fff',
|
|
8734
8734
|
borderRadius: 12,
|
|
@@ -8739,7 +8739,7 @@ const codeStyle$3 = {
|
|
|
8739
8739
|
fontWeight: 400,
|
|
8740
8740
|
},
|
|
8741
8741
|
};
|
|
8742
|
-
const nameStyle$
|
|
8742
|
+
const nameStyle$5 = {
|
|
8743
8743
|
label: 'TeamCalendarHeader-nameStyle',
|
|
8744
8744
|
color: 'var(--color-slate, #5c5c5c)',
|
|
8745
8745
|
fontSize: 20,
|
|
@@ -8765,7 +8765,7 @@ const contentStyle$8 = {
|
|
|
8765
8765
|
* It sticks to the top of its column so the team stays identifiable while the
|
|
8766
8766
|
* schedule scrolls.
|
|
8767
8767
|
*/
|
|
8768
|
-
const TeamCalendarHeader = ({ teamCode, teamFullName, children, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$G), className), children: [jsx("div", { className: sx(rowStyle$7), children: jsxs("div", { className: sx(identityStyle$1), children: [jsx("div", { className: sx(codeStyle$
|
|
8768
|
+
const TeamCalendarHeader = ({ teamCode, teamFullName, children, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$G), className), children: [jsx("div", { className: sx(rowStyle$7), children: jsxs("div", { className: sx(identityStyle$1), children: [jsx("div", { className: sx(codeStyle$4), children: teamCode }), teamFullName && jsx("span", { className: sx(nameStyle$5), children: teamFullName })] }) }), jsx("div", { className: sx(contentStyle$8), children: children })] }));
|
|
8769
8769
|
TeamCalendarHeader.displayName = 'TeamCalendarHeader';
|
|
8770
8770
|
|
|
8771
8771
|
/**
|
|
@@ -8835,7 +8835,7 @@ const pretitleStyle = {
|
|
|
8835
8835
|
fontSize: 20,
|
|
8836
8836
|
lineHeight: '32px',
|
|
8837
8837
|
};
|
|
8838
|
-
const titleStyle$
|
|
8838
|
+
const titleStyle$B = {
|
|
8839
8839
|
label: 'TeamHeader-titleStyle',
|
|
8840
8840
|
margin: 0,
|
|
8841
8841
|
overflowWrap: 'anywhere',
|
|
@@ -8848,7 +8848,7 @@ const titleStyle$A = {
|
|
|
8848
8848
|
lineHeight: '52px',
|
|
8849
8849
|
},
|
|
8850
8850
|
};
|
|
8851
|
-
const actionsStyle$
|
|
8851
|
+
const actionsStyle$b = {
|
|
8852
8852
|
label: 'TeamHeader-actionsStyle',
|
|
8853
8853
|
display: 'flex',
|
|
8854
8854
|
alignItems: 'center',
|
|
@@ -8873,7 +8873,7 @@ const TeamHeader = ({ title: suppliedTitle, teamCode, teamName, pretitle = 'Team
|
|
|
8873
8873
|
window.location.href = backHref;
|
|
8874
8874
|
}
|
|
8875
8875
|
};
|
|
8876
|
-
return (jsxs("div", { className: headerClasses, "data-test": "team-header", children: [jsxs("div", { className: sx(leftStyle$1), children: [(backHref || onBack) && (jsx("button", { type: "button", className: sx(backButtonStyle), onClick: handleBack, "aria-label": "Go back", "data-test": "team-header-back", children: jsx(BackIcon, {}) })), jsxs("div", { className: sx(titlesStyle), children: [pretitle && jsx("span", { className: sx(pretitleStyle), children: pretitle }), jsxs("h1", { className: sx(titleStyle$
|
|
8876
|
+
return (jsxs("div", { className: headerClasses, "data-test": "team-header", children: [jsxs("div", { className: sx(leftStyle$1), children: [(backHref || onBack) && (jsx("button", { type: "button", className: sx(backButtonStyle), onClick: handleBack, "aria-label": "Go back", "data-test": "team-header-back", children: jsx(BackIcon, {}) })), jsxs("div", { className: sx(titlesStyle), children: [pretitle && jsx("span", { className: sx(pretitleStyle), children: pretitle }), jsxs("h1", { className: sx(titleStyle$B), children: [title, "\u00A0"] })] })] }), actions && (jsx("div", { className: sx(actionsStyle$b), children: actions }))] }));
|
|
8877
8877
|
};
|
|
8878
8878
|
const DEFAULT_TABS$1 = [
|
|
8879
8879
|
{ id: 'profile', label: 'Profile' },
|
|
@@ -9226,7 +9226,7 @@ const legErrorStyle = {
|
|
|
9226
9226
|
color: 'var(--color-error)',
|
|
9227
9227
|
fontSize: 'var(--fs-sm)',
|
|
9228
9228
|
};
|
|
9229
|
-
const actionsStyle$
|
|
9229
|
+
const actionsStyle$a = {
|
|
9230
9230
|
label: 'AcmiQuoteCalculator-actionsStyle',
|
|
9231
9231
|
display: 'flex',
|
|
9232
9232
|
flexWrap: 'wrap',
|
|
@@ -9467,7 +9467,7 @@ const AcmiQuoteCalculator = ({ carrierOptions = ACMI_CARRIER_OPTIONS, aircraftOp
|
|
|
9467
9467
|
return (jsxs("div", { className: cx(sx(calculatorStyle$1), className), "data-test": "acmi-quote-calculator", children: [showErrors && errorList.length > 0 && (jsx(Alert, { variant: "error", title: "Fix these before calculating", children: jsx("ul", { className: sx(errorSummaryStyle$1), "data-test": "acmi-error-summary", children: errorList.map(([field, message]) => (jsx("li", { children: message }, field))) }) })), calculationError && (jsx(Alert, { variant: "error", title: "Quote could not be calculated", children: jsx("p", { className: sx(alertMessageStyle), "data-test": "acmi-calculation-error", children: calculationError }) })), jsxs("div", { className: sx(columnsStyle), children: [jsxs("section", { className: sx(panelStyle$6), "aria-label": "Quote configuration", children: [jsx("h3", { className: sx(panelTitleStyle), children: "Quote Configuration" }), jsx(Select, { id: "acmi-carrier", label: "Carrier", placeholder: "Select Carrier\u2026", options: carrierOptions, value: inputs.carrier, error: showErrors ? errors.carrier : undefined, onChange: (event) => updateCarrier(event.target.value), "data-test": "acmi-carrier" }), jsx(Select, { id: "acmi-aircraft", label: "Aircraft Type", placeholder: "Select Aircraft\u2026", options: availableAircraftOptions, value: inputs.aircraft, disabled: !inputs.carrier, error: showErrors ? errors.aircraft : undefined, onChange: (event) => update('aircraft', event.target.value), "data-test": "acmi-aircraft" }), jsx(Input, { id: "acmi-passengers", type: "number", label: "Number of Passengers", placeholder: "Enter passenger count", helperText: seatHint, value: inputs.passengers, error: showErrors ? errors.passengers : undefined, onChange: (event) => update('passengers', event.target.value), "data-test": "acmi-passengers" }), jsx(Input, { id: "acmi-fuel-price", type: "number", step: "0.01", label: "Fuel Price ($/gallon)", placeholder: "e.g. 5.50", value: inputs.fuelPrice, error: showErrors ? errors.fuelPrice : undefined, onChange: (event) => update('fuelPrice', event.target.value), "data-test": "acmi-fuel-price" }), jsx(Input, { id: "acmi-markup", type: "number", step: "0.1", label: "Markup %", helperText: "Standard is 7% \u2014 adjustable as needed", value: inputs.markupPercent, onChange: (event) => update('markupPercent', event.target.value), "data-test": "acmi-markup" }), jsx(Input, { id: "acmi-insurance", label: "Insurance (Flat Fee)", helperText: `${currency.format(insuranceFlat)} per trip (locked)`, value: currency.format(insuranceFlat), readOnly: true, disabled: true, "data-test": "acmi-insurance" }), jsx(Input, { id: "acmi-crew-nights", type: "number", label: "Crew Nights (RON)", helperText: "Number of nights crew stays away from base", value: inputs.crewNights, onChange: (event) => update('crewNights', event.target.value), "data-test": "acmi-crew-nights" }), showTripMonth && (jsx(Select, { id: "acmi-trip-month", label: "Trip Month (for Historic Winds)", options: TRIP_MONTH_OPTIONS, helperText: "Use this only when the configured pricing service applies a historic winds profile.", value: inputs.tripMonth, onChange: (event) => update('tripMonth', event.target.value), "data-test": "acmi-trip-month" }))] }), jsxs("section", { className: sx(panelStyle$6), "aria-label": "Flight itinerary", children: [jsx("h3", { className: sx(panelTitleStyle), children: "Flight Itinerary" }), jsx(Alert, { variant: "primary", children: positioningMode === 'automatic' ? (jsxs(Fragment, { children: ["Enter ", jsx("strong", { children: "live legs only" }), ", in trip order. The host pricing engine adds positioning ferry legs automatically. Leave flight time blank to use its route estimate; an entered time is treated as an explicit contractual input."] })) : (jsxs(Fragment, { children: ["Enter ", jsx("strong", { children: "every flown leg in order" }), ", including positioning. Mark each leg as live or ferry. Leave flight time blank to use the pricing engine\u2019s route estimate; an entered time is treated as an explicit contractual input."] })) }), showErrors && errors.legs && (jsx("p", { className: sx(legErrorStyle), role: "alert", "data-test": "acmi-legs-error", children: errors.legs })), jsx("ol", { className: sx(legsStyle$3), children: inputs.legs.map((leg, index) => (jsxs("li", { className: cx(sx(legStyle$2), positioningMode === 'automatic' && sx(automaticLegStyle)), "data-test": "acmi-leg", children: [jsxs("span", { className: sx(legIndexStyle$1), children: ["Leg ", index + 1] }), positioningMode === 'explicit' && (jsx(Select, { id: `${leg.id}-type`, size: "sm", label: "Leg type", options: [
|
|
9468
9468
|
{ value: 'live', label: 'Live' },
|
|
9469
9469
|
{ value: 'ferry', label: 'Ferry' },
|
|
9470
|
-
], value: leg.type ?? 'live', onChange: (event) => updateLeg(leg.id, { type: event.target.value }), "data-test": "acmi-leg-type" })), jsx(Input, { id: `${leg.id}-origin`, size: "sm", label: "From", maxLength: 4, value: leg.origin, onChange: (event) => updateLeg(leg.id, { origin: event.target.value.toUpperCase() }), "data-test": "acmi-leg-origin" }), jsx(Input, { id: `${leg.id}-destination`, size: "sm", label: "To", maxLength: 4, value: leg.destination, onChange: (event) => updateLeg(leg.id, { destination: event.target.value.toUpperCase() }), "data-test": "acmi-leg-destination" }), jsx(Input, { id: `${leg.id}-flight-time`, size: "sm", type: "number", step: "0.1", label: "Flight time (h, optional)", value: leg.flightTime, onChange: (event) => updateLeg(leg.id, { flightTime: event.target.value }), "data-test": "acmi-leg-flight-time" }), jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Remove leg ${index + 1}`, disabled: inputs.legs.length === 1, onClick: () => removeLeg(leg.id), "data-test": "acmi-remove-leg", children: jsx(TrashIcon$2, { size: 16 }) })] }, leg.id))) }), jsxs("div", { className: sx(actionsStyle$
|
|
9470
|
+
], value: leg.type ?? 'live', onChange: (event) => updateLeg(leg.id, { type: event.target.value }), "data-test": "acmi-leg-type" })), jsx(Input, { id: `${leg.id}-origin`, size: "sm", label: "From", maxLength: 4, value: leg.origin, onChange: (event) => updateLeg(leg.id, { origin: event.target.value.toUpperCase() }), "data-test": "acmi-leg-origin" }), jsx(Input, { id: `${leg.id}-destination`, size: "sm", label: "To", maxLength: 4, value: leg.destination, onChange: (event) => updateLeg(leg.id, { destination: event.target.value.toUpperCase() }), "data-test": "acmi-leg-destination" }), jsx(Input, { id: `${leg.id}-flight-time`, size: "sm", type: "number", step: "0.1", label: "Flight time (h, optional)", value: leg.flightTime, onChange: (event) => updateLeg(leg.id, { flightTime: event.target.value }), "data-test": "acmi-leg-flight-time" }), jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Remove leg ${index + 1}`, disabled: inputs.legs.length === 1, onClick: () => removeLeg(leg.id), "data-test": "acmi-remove-leg", children: jsx(TrashIcon$2, { size: 16 }) })] }, leg.id))) }), jsxs("div", { className: sx(actionsStyle$a), children: [jsx(Button, { variant: "outline", size: "sm", leftIcon: jsx(PlusIcon$2, { size: 16 }), onClick: addLeg, "data-test": "acmi-add-leg", children: "Add Flight Leg" }), jsx(Button, { size: "sm", loading: calculating, onClick: calculate, "data-test": "acmi-calculate", children: calculating ? 'Calculating' : 'Calculate Quote' }), result && onSubmitForApproval && (jsx(Button, { variant: "secondary", size: "sm", onClick: () => onSubmitForApproval(inputs), "data-test": "acmi-submit-approval", children: "Use This Total" }))] })] })] }), result && (jsxs("section", { className: sx(resultsStyle), "aria-label": "Quote summary", "data-test": "acmi-results", children: [jsx("h3", { className: sx(panelTitleStyle), children: "Quote Summary" }), jsxs("dl", { className: sx(resultGridStyle), children: [jsxs("div", { children: [jsx("dt", { children: "Operating Subtotal" }), jsx("dd", { children: currency.format(result.operatingSubtotal) })] }), jsxs("div", { children: [jsx("dt", { children: "Markup Applied" }), jsx("dd", { children: currency.format(result.markupAmount) })] }), jsxs("div", { children: [jsx("dt", { children: "Insurance (Flat Fee)" }), jsx("dd", { children: currency.format(result.insuranceAmount) })] }), jsxs("div", { children: [jsx("dt", { children: "Pre-Tax Total" }), jsx("dd", { children: currency.format(result.preTaxTotal) })] }), jsxs("div", { children: [jsx("dt", { children: "Federal Excise Tax" }), jsx("dd", { children: currency.format(result.fet) })] }), jsxs("div", { children: [jsx("dt", { children: "Segment Fees" }), jsx("dd", { children: currency.format(result.segmentFees) })] })] }), jsxs("p", { className: sx(finalPriceStyle), "data-test": "acmi-final-price", children: [jsx("span", { children: "Total Quoted Price" }), jsx("strong", { children: currency.format(result.finalPrice) })] }), result.pricingDetails && (jsxs("dl", { className: sx(contractFactsStyle), "data-test": "acmi-pricing-details", children: [jsxs("div", { "data-test": "acmi-ferry-floor", children: [jsx("dt", { children: "Ferry block time" }), jsxs("dd", { children: [result.pricingDetails.ferryBlockHours.toFixed(2), " h", result.pricingDetails.ferryMinimumHours
|
|
9471
9471
|
? ` · ${result.pricingDetails.ferryMinimumHours.toFixed(2)} h minimum per estimated SkyWest ferry leg`
|
|
9472
9472
|
: ''] })] }), jsxs("div", { "data-test": "acmi-fuel-buffer", children: [jsx("dt", { children: "Fuel buffer" }), jsxs("dd", { children: [(result.pricingDetails.fuelBufferPercent * 100).toFixed(0), "% \u00B7 ", currency.format(result.pricingDetails.fuelBufferAmount)] })] }), jsxs("div", { "data-test": "acmi-screening", children: [jsx("dt", { children: "Security screening" }), jsx("dd", { children: currency.format(result.pricingDetails.screeningAmount) })] })] })), result.legs && result.legs.length > 0 && (jsxs("div", { className: sx(pricedLegsStyle), "data-test": "acmi-priced-legs", children: [jsx("h4", { children: "Backend-priced itinerary" }), jsxs("div", { className: sx(pricedLegHeaderStyle), "aria-hidden": "true", children: [jsx("span", { children: "Leg" }), jsx("span", { children: "Type" }), jsx("span", { children: "Block" }), jsx("span", { children: "Total" })] }), result.legs.map((leg) => (jsxs("div", { className: sx(pricedLegStyle), "data-test": "acmi-priced-leg", children: [jsxs("span", { children: [leg.origin, " \u2192 ", leg.destination] }), jsx("span", { "data-test": "acmi-priced-leg-type", children: leg.type === 'ferry' ? 'Ferry' : 'Live' }), jsxs("span", { "data-test": "acmi-priced-leg-block", children: [leg.blockHours.toFixed(2), " h"] }), jsx("span", { children: currency.format(leg.total) })] }, leg.id)))] }))] }))] }));
|
|
9473
9473
|
};
|
|
@@ -9480,7 +9480,7 @@ const wrapperStyle$2 = {
|
|
|
9480
9480
|
gap: 'var(--space-3)',
|
|
9481
9481
|
fontFamily: 'var(--font-family-base)',
|
|
9482
9482
|
};
|
|
9483
|
-
const toolbarStyle$
|
|
9483
|
+
const toolbarStyle$4 = {
|
|
9484
9484
|
label: 'AgentGroupTravelRequestsTable-toolbarStyle',
|
|
9485
9485
|
display: 'flex',
|
|
9486
9486
|
flexWrap: 'wrap',
|
|
@@ -9869,7 +9869,7 @@ const AgentGroupTravelRequestsTable = ({ requests, sports = [], views = [], toda
|
|
|
9869
9869
|
setDateEdits((current) => ({ ...current, [id]: { ...current[id], submittedDate: value } }));
|
|
9870
9870
|
onSubmittedDateChange?.(id, value);
|
|
9871
9871
|
};
|
|
9872
|
-
return (jsxs("div", { className: cx(sx(wrapperStyle$2), className), "data-test": "agent-gtr-table", children: [jsxs("div", { className: sx(toolbarStyle$
|
|
9872
|
+
return (jsxs("div", { className: cx(sx(wrapperStyle$2), className), "data-test": "agent-gtr-table", children: [jsxs("div", { className: sx(toolbarStyle$4), children: [jsxs("button", { type: "button", className: sx(showHideAllStyle), title: "Show/Hide all PNRs", onClick: toggleExpandAll, disabled: multiPnrIds.length === 0, "data-test": "agent-gtr-toggle-all", children: [allExpanded ? jsx(ChevronUpIcon, { size: 16 }) : jsx(ChevronDownIcon$1, { size: 16 }), jsx("span", { children: allExpanded ? 'Collapse all PNRs' : 'Expand all PNRs' })] }), jsxs("div", { className: sx(filtersStyle$5), children: [jsxs("label", { className: sx(filterFieldStyle$1), children: [jsx("span", { children: "Filter by sport" }), jsxs("select", { value: sportFilter, onChange: (event) => setSportFilter(event.target.value), "data-test": "agent-gtr-sport-filter", children: [jsx("option", { value: "", children: "All Sports" }), sports.map((sport) => (jsx("option", { value: sport.code, children: sport.label }, sport.code)))] })] }), views.length > 0 && (jsxs("label", { className: sx(filterFieldStyle$1), children: [jsx("span", { children: "Filter by view" }), jsxs("select", { value: viewFilter, onChange: (event) => setViewFilter(event.target.value), "data-test": "agent-gtr-view-filter", children: [jsx("option", { value: "", children: "All Accounts" }), views.map((view) => (jsx("option", { value: view.id, children: view.label }, view.id)))] })] }))] })] }), jsx("div", { className: sx(tableScrollStyle$2), children: jsxs("table", { className: sx(tableStyle$b), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { className: sx(colExpandStyle), children: jsx("span", { className: "sr-only", children: "Expand" }) }), jsx("th", { children: "Source" }), jsx("th", { children: "Master Trip" }), jsx("th", { children: "ID" }), jsx("th", { children: "Start Date" }), jsx("th", { children: "Name" }), jsx("th", { children: "Sport" }), jsxs("th", { children: [jsx(PlaneIcon$3, { size: 16 }), jsx("span", { className: "sr-only", children: "Carrier" })] }), jsx("th", { children: "Routing" }), jsx("th", { children: "Submitted" }), jsx("th", { children: "Type" }), jsx("th", { children: "Quote Sent" }), jsx("th", { children: "Confirmation" }), jsx("th", { children: "Deposit" }), jsx("th", { children: "Utilization" }), jsx("th", { children: "Names" }), jsx("th", { children: "Ticketing" }), jsx("th", { children: "PNR" }), jsx("th", { className: sx(colDeleteStyle), children: jsx("span", { className: "sr-only", children: "Delete" }) })] }) }), jsxs("tbody", { children: [!groups.length && (jsx("tr", { children: jsx("td", { colSpan: COLUMN_COUNT, className: sx(emptyStyle$i), "data-test": "agent-gtr-empty", children: "No open group travel requests match these filters." }) })), groups.map((group) => (jsxs(Fragment$1, { children: [jsx("tr", { className: sx(accountRowStyle), children: jsx("td", { colSpan: COLUMN_COUNT, children: group.accountName }) }), group.items.map((request) => {
|
|
9873
9873
|
const isMulti = request.pnrs.length > 1;
|
|
9874
9874
|
const isExpanded = expandedIds.has(request.id);
|
|
9875
9875
|
const startSoon = daysUntil(request.startDate, today) < 8;
|
|
@@ -10165,7 +10165,7 @@ const Table = ({ columns, data, rowKey = 'id', bordered = false, striped = false
|
|
|
10165
10165
|
* A bordered card: a header band with the title and Version control, then the
|
|
10166
10166
|
* invoice table with its total row and legend.
|
|
10167
10167
|
*/
|
|
10168
|
-
const cardStyle$
|
|
10168
|
+
const cardStyle$g = {
|
|
10169
10169
|
label: 'AirInvoiceCard-cardStyle',
|
|
10170
10170
|
overflow: 'hidden',
|
|
10171
10171
|
backgroundColor: 'var(--bg-surface, #fff)',
|
|
@@ -10191,7 +10191,7 @@ const headerStyle$D = {
|
|
|
10191
10191
|
padding: '12px 24px',
|
|
10192
10192
|
borderBottom: '1px solid var(--border-color-dark, #d5d5d5)',
|
|
10193
10193
|
};
|
|
10194
|
-
const titleStyle$
|
|
10194
|
+
const titleStyle$A = {
|
|
10195
10195
|
label: 'AirInvoiceCard-titleStyle',
|
|
10196
10196
|
margin: 0,
|
|
10197
10197
|
color: 'var(--fg-3, #6b7785)',
|
|
@@ -10348,7 +10348,7 @@ const AirInvoiceCard = ({ title, lines, paymentStatus, total, versions = [], sel
|
|
|
10348
10348
|
const legend = (jsxs("span", { className: sx(legendStyle$1), "data-test": "air-invoice-legend", children: [jsx("span", { className: sx(knownTravelerStyle), children: jsx(CheckIcon$2, { size: 16 }) }), "= Known Traveler Number Loaded"] }));
|
|
10349
10349
|
const hasHeader = Boolean(title || versionControlShown(versions));
|
|
10350
10350
|
const versionControl = versionControlShown(versions) && (jsx(Dropdown, { label: "Version", alignment: "right", trigger: ({ isOpen, toggle }) => (jsxs("button", { type: "button", className: sx(versionButtonStyle), onClick: toggle, "aria-expanded": isOpen, "aria-haspopup": "menu", "data-test": "air-invoice-version", children: [jsx(LayersIcon, {}), "Version", jsx("span", { className: sx(versionCountStyle), children: versions.length }), jsx(ChevronDownIcon$1, { size: 16 })] })), children: versions.map((version) => (jsx(Dropdown.Item, { icon: version.id === selectedVersionId ? jsx(CheckIcon$2, { size: 14 }) : undefined, onClick: () => onVersionChange?.(version.id), children: version.label }, version.id))) }));
|
|
10351
|
-
return (jsxs("section", { className: cx(sx(cardStyle$
|
|
10351
|
+
return (jsxs("section", { className: cx(sx(cardStyle$g), className), "aria-label": "Air invoice", "data-test": "air-invoice-card", children: [hasHeader && (jsxs("div", { className: sx(headerStyle$D), children: [title && jsx("h2", { className: sx(titleStyle$A), children: title }), jsx("div", { className: sx(headerEndStyle), children: versionControl })] })), jsx(Table, { className: sx(tableStyle$9), columns: columns, data: lines, hoverable: false, rowClassName: (line) => cx(line.isVoid && sx(voidRowStyle), line.struckThrough && sx(struckRowStyle)) || undefined, footer: total && (jsxs("tr", { children: [jsx("td", { colSpan: 6, children: jsxs("span", { className: sx(totalCellStyle$1), children: ["Total", showLegend && legend] }) }), jsx("td", { className: sx(upperStyle), children: paymentStatus }), jsx("td", { "data-test": "air-invoice-total", children: total })] })) }), showLegend && !total && (jsx("p", { className: sx(legendBlockStyle), children: legend }))] }));
|
|
10352
10352
|
};
|
|
10353
10353
|
AirInvoiceCard.displayName = 'AirInvoiceCard';
|
|
10354
10354
|
|
|
@@ -10801,7 +10801,7 @@ const noResultsStyle = {
|
|
|
10801
10801
|
fontSize: 14,
|
|
10802
10802
|
};
|
|
10803
10803
|
/* Actions */
|
|
10804
|
-
const actionsStyle$
|
|
10804
|
+
const actionsStyle$9 = {
|
|
10805
10805
|
label: 'Topbar-actionsStyle',
|
|
10806
10806
|
display: 'flex',
|
|
10807
10807
|
gap: 'var(--space-2, 8px)',
|
|
@@ -10866,7 +10866,7 @@ const Topbar = ({ account, accounts, onAccountSelect, onAccountClick, actions, l
|
|
|
10866
10866
|
const filteredAccounts = accounts?.filter(acc => acc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
10867
10867
|
acc.code.toLowerCase().includes(searchQuery.toLowerCase())) || [];
|
|
10868
10868
|
const hasDropdown = accounts && accounts.length > 0;
|
|
10869
|
-
return (jsxs("header", { className: classNames, ...props, children: [jsxs("div", { className: sx(leftStyle), children: [leftContent, account && (jsxs("div", { className: sx(accountWrapperStyle), ref: dropdownRef, children: [jsxs("button", { className: cx(sx(accountSelectorStyle), isOpen && sx(openStyle$1)), onClick: handleToggle, "aria-expanded": isOpen, "aria-haspopup": hasDropdown ? 'listbox' : undefined, children: [jsx("span", { className: sx(accountCodeStyle), children: account.code }), jsx("span", { className: sx(accountNameStyle), children: account.name }), hasDropdown && (jsx(ChevronDownIcon$1, { size: 16, className: cx(sx(chevronStyle$2), isOpen && sx(chevronOpenStyle)) }))] }), isOpen && hasDropdown && (jsxs("div", { className: sx(dropdownStyle), role: "listbox", children: [jsxs("div", { className: sx(dropdownSearchStyle), children: [jsxs("svg", { className: sx(searchIconStyle$1), width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsx("circle", { cx: "11", cy: "11", r: "8" }), jsx("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })] }), jsx("input", { ref: searchInputRef, type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), placeholder: "Search accounts...", className: sx(searchInputStyle$1) })] }), jsx("div", { className: sx(dropdownListStyle), children: filteredAccounts.length > 0 ? (filteredAccounts.map((acc) => (jsxs("button", { className: cx(sx(dropdownItemStyle), acc.code === account.code && sx(selectedStyle$2)), onClick: () => handleSelectAccount(acc), role: "option", "aria-selected": acc.code === account.code, children: [jsx("span", { className: sx(dropdownItemCodeStyle), children: acc.code }), jsx("span", { className: sx(dropdownItemNameStyle), children: acc.name })] }, acc.code)))) : (jsx("div", { className: sx(noResultsStyle), children: "No accounts found" })) })] }))] }))] }), actions && jsx("div", { className: sx(actionsStyle$
|
|
10869
|
+
return (jsxs("header", { className: classNames, ...props, children: [jsxs("div", { className: sx(leftStyle), children: [leftContent, account && (jsxs("div", { className: sx(accountWrapperStyle), ref: dropdownRef, children: [jsxs("button", { className: cx(sx(accountSelectorStyle), isOpen && sx(openStyle$1)), onClick: handleToggle, "aria-expanded": isOpen, "aria-haspopup": hasDropdown ? 'listbox' : undefined, children: [jsx("span", { className: sx(accountCodeStyle), children: account.code }), jsx("span", { className: sx(accountNameStyle), children: account.name }), hasDropdown && (jsx(ChevronDownIcon$1, { size: 16, className: cx(sx(chevronStyle$2), isOpen && sx(chevronOpenStyle)) }))] }), isOpen && hasDropdown && (jsxs("div", { className: sx(dropdownStyle), role: "listbox", children: [jsxs("div", { className: sx(dropdownSearchStyle), children: [jsxs("svg", { className: sx(searchIconStyle$1), width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsx("circle", { cx: "11", cy: "11", r: "8" }), jsx("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })] }), jsx("input", { ref: searchInputRef, type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), placeholder: "Search accounts...", className: sx(searchInputStyle$1) })] }), jsx("div", { className: sx(dropdownListStyle), children: filteredAccounts.length > 0 ? (filteredAccounts.map((acc) => (jsxs("button", { className: cx(sx(dropdownItemStyle), acc.code === account.code && sx(selectedStyle$2)), onClick: () => handleSelectAccount(acc), role: "option", "aria-selected": acc.code === account.code, children: [jsx("span", { className: sx(dropdownItemCodeStyle), children: acc.code }), jsx("span", { className: sx(dropdownItemNameStyle), children: acc.name })] }, acc.code)))) : (jsx("div", { className: sx(noResultsStyle), children: "No accounts found" })) })] }))] }))] }), actions && jsx("div", { className: sx(actionsStyle$9), children: actions })] }));
|
|
10870
10870
|
};
|
|
10871
10871
|
Topbar.displayName = 'Topbar';
|
|
10872
10872
|
|
|
@@ -10919,7 +10919,7 @@ const AppLayout = ({ navItems = [], activeNavKey, logo, collapsedLogo, account,
|
|
|
10919
10919
|
* Shares the AirInvoiceCard's shell — bordered card, header band with a small
|
|
10920
10920
|
* uppercase title — so the two read as a set when stacked on a page.
|
|
10921
10921
|
*/
|
|
10922
|
-
const cardStyle$
|
|
10922
|
+
const cardStyle$f = {
|
|
10923
10923
|
label: 'BookingDetailsCard-cardStyle',
|
|
10924
10924
|
overflow: 'hidden',
|
|
10925
10925
|
backgroundColor: 'var(--bg-surface, #fff)',
|
|
@@ -10944,7 +10944,7 @@ const headerStyle$C = {
|
|
|
10944
10944
|
padding: '12px 24px',
|
|
10945
10945
|
borderBottom: '1px solid var(--border-color-dark, #d5d5d5)',
|
|
10946
10946
|
};
|
|
10947
|
-
const titleStyle$
|
|
10947
|
+
const titleStyle$z = {
|
|
10948
10948
|
label: 'BookingDetailsCard-titleStyle',
|
|
10949
10949
|
margin: 0,
|
|
10950
10950
|
color: 'var(--fg-3, #6b7785)',
|
|
@@ -11020,12 +11020,12 @@ const BookingDetailsCard = ({ details, title = 'Booking Details', refId, childre
|
|
|
11020
11020
|
if (details.length === 0 && !children)
|
|
11021
11021
|
return null;
|
|
11022
11022
|
const rows = Math.ceil(details.length / 2);
|
|
11023
|
-
return (jsxs("section", { className: cx(sx(cardStyle$
|
|
11023
|
+
return (jsxs("section", { className: cx(sx(cardStyle$f), className), "aria-label": "Booking details", "data-test": "booking-details-card", children: [jsxs("div", { className: sx(headerStyle$C), children: [jsx("h2", { className: sx(titleStyle$z), children: title }), refId && (jsxs("p", { className: sx(refStyle), "data-test": "booking-details-ref", children: ["Short\u2019s ID: ", jsx("span", { className: sx(refValueStyle), children: refId })] }))] }), details.length > 0 && (jsx("dl", { className: sx(detailsStyle$2), style: { gridTemplateRows: `repeat(${rows}, auto)` }, children: details.map((detail) => (jsxs("div", { className: sx(detailStyle$2), children: [jsx("dt", { className: sx(detailLabelStyle$1), children: detail.label }), jsx("dd", { className: sx(detailValueStyle$1), children: detail.value })] }, detail.label))) })), children && jsx("div", { className: cx(sx(sectionStyle$8), details.length > 0 && sx(sectionRuleStyle)), "data-test": "booking-details-section", children: children })] }));
|
|
11024
11024
|
};
|
|
11025
11025
|
BookingDetailsCard.displayName = 'BookingDetailsCard';
|
|
11026
11026
|
|
|
11027
11027
|
/* Card Component Styles */
|
|
11028
|
-
const cardStyle$
|
|
11028
|
+
const cardStyle$e = {
|
|
11029
11029
|
label: 'Card-cardStyle',
|
|
11030
11030
|
background: 'var(--bg-surface)',
|
|
11031
11031
|
borderRadius: 'var(--radius-2xl)',
|
|
@@ -11087,7 +11087,7 @@ const headerContentStyle$1 = {
|
|
|
11087
11087
|
flex: 1,
|
|
11088
11088
|
minWidth: 0,
|
|
11089
11089
|
};
|
|
11090
|
-
const titleStyle$
|
|
11090
|
+
const titleStyle$y = {
|
|
11091
11091
|
label: 'Card-titleStyle',
|
|
11092
11092
|
margin: 0,
|
|
11093
11093
|
fontSize: 'var(--fs-lg)',
|
|
@@ -11101,7 +11101,7 @@ const subtitleStyle$7 = {
|
|
|
11101
11101
|
fontSize: 'var(--fs-sm)',
|
|
11102
11102
|
color: 'var(--fg-3)',
|
|
11103
11103
|
};
|
|
11104
|
-
const actionsStyle$
|
|
11104
|
+
const actionsStyle$8 = {
|
|
11105
11105
|
label: 'Card-actionsStyle',
|
|
11106
11106
|
display: 'flex',
|
|
11107
11107
|
gap: 'var(--space-2)',
|
|
@@ -11136,7 +11136,7 @@ const footerStyle$b = {
|
|
|
11136
11136
|
* Card component for grouping related content.
|
|
11137
11137
|
*/
|
|
11138
11138
|
const Card = forwardRef(({ variant = 'default', padding = 'md', interactive = false, className = '', children, ...props }, ref) => {
|
|
11139
|
-
const classNames = cx(sx(cardStyle$
|
|
11139
|
+
const classNames = cx(sx(cardStyle$e), sx(variantStyles[variant]), sx(paddingStyles[padding]), interactive && sx(interactiveStyle), className);
|
|
11140
11140
|
return (jsx("div", { ref: ref, className: classNames, ...props, children: children }));
|
|
11141
11141
|
});
|
|
11142
11142
|
Card.displayName = 'Card';
|
|
@@ -11145,7 +11145,7 @@ Card.displayName = 'Card';
|
|
|
11145
11145
|
*/
|
|
11146
11146
|
const CardHeader = ({ title, subtitle, actions, className = '', children, ...props }) => {
|
|
11147
11147
|
const classNames = cx(sx(headerStyle$B), className);
|
|
11148
|
-
return (jsxs("div", { className: classNames, ...props, children: [jsxs("div", { className: sx(headerContentStyle$1), children: [title && jsx("h3", { className: sx(titleStyle$
|
|
11148
|
+
return (jsxs("div", { className: classNames, ...props, children: [jsxs("div", { className: sx(headerContentStyle$1), children: [title && jsx("h3", { className: sx(titleStyle$y), children: title }), subtitle && jsx("p", { className: sx(subtitleStyle$7), children: subtitle }), children] }), actions && jsx("div", { className: sx(actionsStyle$8), children: actions })] }));
|
|
11149
11149
|
};
|
|
11150
11150
|
CardHeader.displayName = 'CardHeader';
|
|
11151
11151
|
/**
|
|
@@ -11848,7 +11848,7 @@ const alertStyle$4 = {
|
|
|
11848
11848
|
label: 'ContactList-alertStyle', width: '100%'
|
|
11849
11849
|
};
|
|
11850
11850
|
/* Card */
|
|
11851
|
-
const cardStyle$
|
|
11851
|
+
const cardStyle$d = {
|
|
11852
11852
|
label: 'ContactList-cardStyle',
|
|
11853
11853
|
backgroundColor: 'var(--color-white)',
|
|
11854
11854
|
border: '1px solid var(--color-gray-200)',
|
|
@@ -11867,7 +11867,7 @@ const titleRowStyle$3 = {
|
|
|
11867
11867
|
alignItems: 'center',
|
|
11868
11868
|
gap: 'var(--space-2)',
|
|
11869
11869
|
};
|
|
11870
|
-
const titleStyle$
|
|
11870
|
+
const titleStyle$x = {
|
|
11871
11871
|
label: 'ContactList-titleStyle',
|
|
11872
11872
|
fontSize: 'var(--text-base)',
|
|
11873
11873
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -12053,7 +12053,7 @@ const PlusIcon$1 = () => (jsxs("svg", { width: "16", height: "16", viewBox: "0 0
|
|
|
12053
12053
|
*/
|
|
12054
12054
|
const ContactList = ({ title = 'Contacts', tooltip, contacts, onEdit, onRemove, onAdd, showAdd = true, addLabel = 'Add Contact', alert, className = '', }) => {
|
|
12055
12055
|
const listClasses = cx(sx(containerStyle$3), className);
|
|
12056
|
-
return (jsxs("div", { className: listClasses, children: [alert && (jsx("div", { className: sx(alertStyle$4), children: alert })), jsxs("div", { className: sx(cardStyle$
|
|
12056
|
+
return (jsxs("div", { className: listClasses, children: [alert && (jsx("div", { className: sx(alertStyle$4), children: alert })), jsxs("div", { className: sx(cardStyle$d), children: [jsx("div", { className: sx(headerStyle$A), children: jsxs("div", { className: sx(titleRowStyle$3), children: [jsx("h3", { className: sx(titleStyle$x), children: title }), tooltip && (jsx("span", { className: sx(tooltipStyle), children: jsx(InfoIcon, {}) }))] }) }), jsxs("div", { className: sx(listStyle$4), children: [contacts.map((contact) => (jsxs("div", { className: sx(contactItemStyle), children: [jsxs("div", { className: sx(contactInfoStyle), children: [jsxs("div", { className: sx(contactNameStyle$1), children: [contact.name, contact.isPrimary && (jsx("span", { className: sx(badgeStyle$2), children: "Primary" })), contact.isSecondary && (jsx("span", { className: cx(sx(badgeStyle$2), sx(badgeSecondaryStyle)), children: "Secondary" }))] }), contact.role && (jsx("div", { className: sx(contactRoleStyle$1), children: contact.role })), jsxs("div", { className: sx(contactDetailsStyle$1), children: [contact.email && (jsx("a", { href: `mailto:${contact.email}`, className: sx(contactLinkStyle$2), children: contact.email })), contact.phone && (jsx("span", { className: sx(contactPhoneStyle), children: contact.phone }))] })] }), jsxs("div", { className: sx(contactActionsStyle), children: [onEdit && (jsx("button", { type: "button", className: sx(actionButtonStyle$1), onClick: () => onEdit(contact), "aria-label": "Edit contact", children: jsx(EditIcon$1, {}) })), onRemove && (jsx("button", { type: "button", className: cx(sx(actionButtonStyle$1), sx(actionButtonDangerStyle)), onClick: () => onRemove(contact), "aria-label": "Remove contact", children: jsx(TrashIcon$1, {}) }))] })] }, contact.id))), contacts.length === 0 && (jsx("div", { className: sx(emptyStyle$f), children: "No contacts added" }))] }), showAdd && onAdd && (jsx("div", { className: sx(footerStyle$a), children: jsxs("button", { type: "button", className: sx(addButtonStyle$1), onClick: onAdd, children: [jsx(PlusIcon$1, {}), addLabel] }) }))] })] }));
|
|
12057
12057
|
};
|
|
12058
12058
|
ContactList.displayName = 'ContactList';
|
|
12059
12059
|
|
|
@@ -12189,7 +12189,7 @@ const headerContentStyle = {
|
|
|
12189
12189
|
label: 'Drawer-headerContentStyle',
|
|
12190
12190
|
flex: 1,
|
|
12191
12191
|
};
|
|
12192
|
-
const titleStyle$
|
|
12192
|
+
const titleStyle$w = {
|
|
12193
12193
|
label: 'Drawer-titleStyle',
|
|
12194
12194
|
margin: 0,
|
|
12195
12195
|
fontSize: 18,
|
|
@@ -12235,7 +12235,7 @@ const footerStyle$9 = {
|
|
|
12235
12235
|
/**
|
|
12236
12236
|
* Top of a Drawer: title and the close affordance.
|
|
12237
12237
|
*/
|
|
12238
|
-
const DrawerHeader = ({ title, children, showClose = true, onClose, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$z), className), children: [jsxs("div", { className: sx(headerContentStyle), children: [title && jsx("h2", { className: sx(titleStyle$
|
|
12238
|
+
const DrawerHeader = ({ title, children, showClose = true, onClose, className = '', }) => (jsxs("div", { className: cx(sx(headerStyle$z), className), children: [jsxs("div", { className: sx(headerContentStyle), children: [title && jsx("h2", { className: sx(titleStyle$w), children: title }), children] }), showClose && (jsx("button", { type: "button", className: sx(closeButtonStyle$2), onClick: onClose, "aria-label": "Close drawer", children: jsx("svg", { width: "20", height: "20", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }))] }));
|
|
12239
12239
|
/**
|
|
12240
12240
|
* Scrollable content region of a Drawer.
|
|
12241
12241
|
*/
|
|
@@ -12370,7 +12370,7 @@ const bodyStyle$6 = {
|
|
|
12370
12370
|
fontWeight: 500,
|
|
12371
12371
|
},
|
|
12372
12372
|
};
|
|
12373
|
-
const searchStyle$
|
|
12373
|
+
const searchStyle$2 = {
|
|
12374
12374
|
label: 'DueDatesDrawer-searchStyle',
|
|
12375
12375
|
display: 'flex',
|
|
12376
12376
|
width: '100%',
|
|
@@ -12405,7 +12405,7 @@ const emptyStyle$e = {
|
|
|
12405
12405
|
padding: '16px 8px 0',
|
|
12406
12406
|
color: 'var(--color-stone, #787878)',
|
|
12407
12407
|
};
|
|
12408
|
-
const cardStyle$
|
|
12408
|
+
const cardStyle$c = {
|
|
12409
12409
|
label: 'DueDatesDrawer-cardStyle',
|
|
12410
12410
|
display: 'flex',
|
|
12411
12411
|
flexDirection: 'column',
|
|
@@ -12529,7 +12529,7 @@ const DueDateCard$1 = ({ item, onToggle, onTaskClick }) => {
|
|
|
12529
12529
|
const completed = isTravelDueDateCompleted(item);
|
|
12530
12530
|
const dueDate = parseLocalDate$1(item.duedate);
|
|
12531
12531
|
const pastDue = !!dueDate && dueDate < new Date() && !completed;
|
|
12532
|
-
return (jsxs("article", { className: sx(cardStyle$
|
|
12532
|
+
return (jsxs("article", { className: sx(cardStyle$c), children: [jsxs("div", { className: sx(cardTitleStyle$3), children: [onToggle ? (jsx("button", { type: "button", "aria-label": `${completed ? 'Reopen' : 'Complete'} ${item.tasktitle}`, className: cx(sx(statusStyle$5), completed ? sx(completedStyle) : pastDue ? sx(pastDueStyle) : ''), onClick: () => onToggle(item), "data-test": `due-date-toggle-${item.taskid}`, children: completed ? jsx(CheckIcon$2, { size: 12 }) : null })) : (jsx("span", { "aria-label": `${completed ? 'Completed' : pastDue ? 'Past due' : 'Incomplete'}: ${item.tasktitle}`, className: cx(sx(statusStyle$5), sx(readOnlyStatusStyle), completed ? sx(completedStyle) : pastDue ? sx(pastDueStyle) : ''), "data-test": `due-date-status-${item.taskid}`, children: completed ? jsx(CheckIcon$2, { size: 12 }) : null })), jsx("h5", { children: item.tasktitle })] }), item.description && jsx("p", { children: item.description }), jsxs("div", { className: sx(tagsStyle), children: [jsx("span", { style: { backgroundColor: sportColor$1(item.sportCode) }, children: item.sportCode }), jsx("button", { type: "button", disabled: !item.masterTripGUID || !onTaskClick, onClick: () => item.masterTripGUID && onTaskClick?.(item.masterTripGUID), children: item.tripName })] }), completed && item.completeddatetime && jsxs("div", { className: sx(completionStyle), children: [jsx(CheckIcon$2, { size: 14 }), jsxs("span", { children: [jsx("em", { children: "on" }), " ", formatDate$8(item.completeddatetime, { month: 'numeric', day: 'numeric', year: '2-digit' }), " ", jsx("em", { children: "by" }), " ", item.completedby] })] })] }));
|
|
12533
12533
|
};
|
|
12534
12534
|
/** Hub's searchable, status-aware due-dates drawer. */
|
|
12535
12535
|
const DueDatesDrawer = ({ isOpen, dueDates, selectedDate, selectedTrip, overdueOnly, onClose, onToggle, onTaskClick, className = '' }) => {
|
|
@@ -12541,7 +12541,7 @@ const DueDatesDrawer = ({ isOpen, dueDates, selectedDate, selectedTrip, overdueO
|
|
|
12541
12541
|
const matches = items.filter((item) => (!selectedTrip || item.masterTripGUID === String(selectedTrip)) && (!overdueOnly || isTravelDueDateOverdue(item)) && (!normalized || item.tasktitle.toLowerCase().includes(normalized) || item.sportCode.toLowerCase().includes(normalized) || item.description.toLowerCase().includes(normalized)));
|
|
12542
12542
|
return matches.length ? [[date, matches]] : [];
|
|
12543
12543
|
})), [dueDates, search, selectedDate, selectedTrip, overdueOnly]);
|
|
12544
|
-
return (jsxs("aside", { className: cx(sx(drawerStyle), isOpen && sx(openStyle), className), "aria-hidden": !isOpen, "aria-label": "Due Dates", children: [jsxs("header", { children: [jsx("h3", { children: "Due Dates" }), jsx("button", { type: "button", "aria-label": "Close due dates", onClick: onClose, children: jsx(CloseIcon, { size: 24 }) })] }), jsxs("div", { className: sx(bodyStyle$6), children: [jsxs("label", { className: sx(searchStyle$
|
|
12544
|
+
return (jsxs("aside", { className: cx(sx(drawerStyle), isOpen && sx(openStyle), className), "aria-hidden": !isOpen, "aria-label": "Due Dates", children: [jsxs("header", { children: [jsx("h3", { children: "Due Dates" }), jsx("button", { type: "button", "aria-label": "Close due dates", onClick: onClose, children: jsx(CloseIcon, { size: 24 }) })] }), jsxs("div", { className: sx(bodyStyle$6), children: [jsxs("label", { className: sx(searchStyle$2), children: [jsx(SearchIcon$1, { size: 16 }), jsx("input", { type: "search", placeholder: "Search", value: search, onChange: (event) => setSearch(event.target.value) })] }), !Object.keys(filtered).length ? jsx("div", { className: sx(emptyStyle$e), children: "No due dates found." }) : Object.entries(filtered).map(([date, items]) => (jsxs("section", { children: [jsx("h4", { children: formatDate$8(date, { month: 'long', day: 'numeric', year: 'numeric' }) }), jsx("div", { className: sx(cardsStyle$2), children: items.map((item) => jsx(DueDateCard$1, { item: item, onToggle: onToggle, onTaskClick: onTaskClick }, `${date}-${item.taskid}`)) })] }, date)))] })] }));
|
|
12545
12545
|
};
|
|
12546
12546
|
|
|
12547
12547
|
/**
|
|
@@ -13829,7 +13829,7 @@ const HubAppShell = ({ children, navItems, individualTravelItem, agentsItem, sou
|
|
|
13829
13829
|
* Explicit specificity keeps service and cancellation border colors stable
|
|
13830
13830
|
* regardless of style injection order: base < type (`&&`) < cancelled (`&&&`).
|
|
13831
13831
|
*/
|
|
13832
|
-
const cardStyle$
|
|
13832
|
+
const cardStyle$b = {
|
|
13833
13833
|
label: 'ItinerarySegmentCard-cardStyle',
|
|
13834
13834
|
display: 'flex',
|
|
13835
13835
|
flexDirection: 'column',
|
|
@@ -13907,7 +13907,7 @@ const confirmationHeaderStyle = {
|
|
|
13907
13907
|
},
|
|
13908
13908
|
},
|
|
13909
13909
|
};
|
|
13910
|
-
const eyebrowStyle$
|
|
13910
|
+
const eyebrowStyle$9 = {
|
|
13911
13911
|
label: 'ItinerarySegmentCard-eyebrowStyle',
|
|
13912
13912
|
fontSize: 'var(--fs-xs)',
|
|
13913
13913
|
lineHeight: 'var(--lh-xs)',
|
|
@@ -13917,7 +13917,7 @@ const eyebrowStyle$8 = {
|
|
|
13917
13917
|
letterSpacing: '0.06em',
|
|
13918
13918
|
};
|
|
13919
13919
|
/** Declared before `isCancelledStyle`, which reaches it as a descendant. */
|
|
13920
|
-
const titleStyle$
|
|
13920
|
+
const titleStyle$v = {
|
|
13921
13921
|
label: 'ItinerarySegmentCard-titleStyle',
|
|
13922
13922
|
margin: 0,
|
|
13923
13923
|
fontSize: 'var(--fs-lg)',
|
|
@@ -13951,7 +13951,7 @@ const isCancelledStyle = {
|
|
|
13951
13951
|
backgroundColor: 'var(--bg-subtle)',
|
|
13952
13952
|
},
|
|
13953
13953
|
/* `.isCancelled .title` */
|
|
13954
|
-
[`&&& .${sx(titleStyle$
|
|
13954
|
+
[`&&& .${sx(titleStyle$v)}`]: {
|
|
13955
13955
|
textDecoration: 'line-through',
|
|
13956
13956
|
},
|
|
13957
13957
|
};
|
|
@@ -14143,7 +14143,7 @@ const flightStatusStyle = {
|
|
|
14143
14143
|
lineHeight: 'var(--lh-sm)',
|
|
14144
14144
|
fontWeight: 'var(--fw-medium)',
|
|
14145
14145
|
};
|
|
14146
|
-
const actionsStyle$
|
|
14146
|
+
const actionsStyle$7 = {
|
|
14147
14147
|
label: 'ItinerarySegmentCard-actionsStyle',
|
|
14148
14148
|
display: 'flex',
|
|
14149
14149
|
flexWrap: 'wrap',
|
|
@@ -14449,7 +14449,7 @@ const ItinerarySegmentCard = ({ segment, headingLevel = 3, onCheckIn, showCheckI
|
|
|
14449
14449
|
...(segment.type === 'limo' ? [{ label: 'Cancellation policy', lines: segment.cancellationPolicies }] : []),
|
|
14450
14450
|
{ label: 'Segment Notes', lines: segment.type === 'limo' ? [...(segment.comments ?? []), ...(segment.notes ?? [])] : segment.notes },
|
|
14451
14451
|
];
|
|
14452
|
-
return (jsxs("article", { className: cx(sx(cardStyle$
|
|
14452
|
+
return (jsxs("article", { className: cx(sx(cardStyle$b), sx(typeStyles$1[segment.type]), segment.status === 'cancelled' && sx(isCancelledStyle), variant === 'section' && sx(sectionVariantStyle), className), "data-test": `itinerary-segment-${segment.id}`, "aria-label": `${meta.label} — ${getSegmentTitle(segment)}`, children: [jsxs("div", { className: cx(sx(headerStyle$w), pillConfirmation && sx(confirmationHeaderStyle)), children: [jsx("span", { className: sx(iconStyle$2), "aria-hidden": "true", children: jsx(TravelServiceIcon, { type: meta.code, vendor: vendorCode, size: 48 }) }), jsxs("span", { className: sx(headingsStyle), children: [jsx("span", { className: sx(eyebrowStyle$9), children: meta.label }), jsx("span", { className: sx(titleRowStyle$2), children: jsx(Heading, { className: sx(titleStyle$v), children: getSegmentTitle(segment) }) }), segment.type === 'air' && segment.operatedBy?.trim() && jsxs("span", { className: sx(operatedByStyle), children: ["Operated by ", segment.operatedBy] }), (segment.type === 'car' || segment.type === 'hotel') && segment.reservationName?.trim() && (jsxs("span", { className: sx(operatedByStyle), "data-test": `itinerary-reserved-for-${segment.id}`, children: ["Reserved for ", segment.reservationName] }))] }), headerCheckIn && (jsx(Button, { size: "sm", variant: "primary", "aria-label": checkInLabel, "data-test": `itinerary-check-in-${segment.id}`, onClick: () => onCheckIn?.(segment), children: "Check In" })), jsx(StatusBadge, { status: badge.variant, label: pillConfirmation ? `${badge.label}: ${pillConfirmation}` : badge.label, className: sx(statusStyle$4), style: pillConfirmation ? { maxWidth: '100%', whiteSpace: 'normal', overflowWrap: 'anywhere', lineHeight: 'var(--lh-sm)' } : undefined })] }), (hasStart || hasEnd) && jsxs("div", { className: sx(routeStyle$2), children: [hasStart && jsxs("div", { className: sx(endpointStyle), children: [jsx("span", { className: sx(endpointLabelStyle), children: endpoints.startLabel }), segment.type === 'car' && jsx("span", { className: sx(endpointTimeStyle), children: endpoints.startCode }), endpoints.startTime && jsx("span", { className: sx(segment.type === 'car' ? endpointCodeStyle : endpointTimeStyle), children: endpoints.startTime }), segment.type !== 'car' && endpoints.startCode && jsx("span", { className: sx(endpointCodeStyle), children: endpoints.startCode }), endpoints.startPlace && jsx("span", { className: sx(endpointPlaceStyle), children: endpoints.startPlace })] }), hasStart && hasEnd && jsxs("div", { className: sx(connectorStyle), children: [duration && jsx("span", { className: sx(connectorLabelStyle), children: duration }), jsx("span", { className: sx(connectorArrowStyle), "aria-hidden": "true", children: jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }), jsx("polyline", { points: "12 5 19 12 12 19" })] }) }), (segment.type === 'air' || segment.type === 'rail') && !!segment.miles && jsxs("span", { className: sx(connectorLabelStyle), children: [segment.miles.toLocaleString('en-US'), " miles"] }), segment.type === 'car' && !!segment.carCount && jsxs("span", { className: sx(connectorLabelStyle), children: [segment.carCount, " ", segment.carCount === 1 ? 'Vehicle' : 'Vehicles'] }), segment.type === 'hotel' && !!segment.rooms && jsxs("span", { className: sx(connectorLabelStyle), children: [segment.rooms, " ", segment.rooms === 1 ? 'Room' : 'Rooms'] })] }), hasEnd && jsxs("div", { className: sx(endpointStyle), children: [jsx("span", { className: sx(endpointLabelStyle), children: endpoints.endLabel }), segment.type === 'car' && jsx("span", { className: sx(endpointTimeStyle), children: endpoints.endCode }), endpoints.endTime && (jsxs("span", { className: sx(segment.type === 'car' ? endpointCodeStyle : endpointTimeStyle), children: [endpoints.endTime, dayOffset > 0 && jsxs("span", { className: sx(nextDayStyle), children: ["+", dayOffset, " day", dayOffset === 1 ? '' : 's'] })] })), segment.type !== 'car' && endpoints.endCode && jsx("span", { className: sx(endpointCodeStyle), children: endpoints.endCode }), endpoints.endPlace && jsx("span", { className: sx(endpointPlaceStyle), children: endpoints.endPlace })] })] }), details.length > 0 && (jsx("dl", { className: sx(detailsStyle$1), children: details.map((detail) => (jsxs("div", { className: cx(sx(detailStyle$1), detail.fullRow && sx(detailFullRowStyle)), children: [jsx("dt", { className: sx(detailLabelStyle), children: detail.label }), jsx("dd", { className: cx(sx(detailValueStyle), detail.mono && sx(monoStyle$2)), children: detail.value }), detail.below && jsxs(Fragment, { children: [jsx("dt", { className: cx(sx(detailLabelStyle), sx(detailBelowLabelStyle)), children: detail.below.label }), jsx("dd", { className: sx(detailValueStyle), children: detail.below.value })] })] }, detail.label))) })), segment.type === 'air' && segment.flightStatus && (jsx("p", { className: sx(flightStatusStyle), "data-test": `itinerary-flight-status-${segment.id}`, children: segment.flightStatus })), segment.type === 'air' && segment.checkInAvailable && onCheckIn && !headerCheckIn && (jsx("div", { className: sx(actionsStyle$7), children: jsxs(Button, { size: "sm", variant: "secondary", "data-test": `itinerary-check-in-${segment.id}`, onClick: () => onCheckIn?.(segment), children: ["Check in for ", segment.carrierCode ?? segment.carrier, " ", segment.flightNumber] }) })), noteSections.map(({ label, lines }) => {
|
|
14453
14453
|
const content = lines?.filter((line) => line.trim());
|
|
14454
14454
|
return content?.length ? (jsxs("section", { "aria-label": label, className: sx(footerStyle$7), children: [jsx("div", { className: sx(noteLabelStyle), children: label }), content.map((line, index) => jsx("p", { className: sx(noteLineStyle), children: line }, index))] }, label)) : null;
|
|
14455
14455
|
}), footer && jsx("div", { className: sx(footerStyle$7), children: footer })] }));
|
|
@@ -14756,7 +14756,7 @@ const headerStyle$v = {
|
|
|
14756
14756
|
justifyContent: 'space-between',
|
|
14757
14757
|
gap: 'var(--space-4)',
|
|
14758
14758
|
};
|
|
14759
|
-
const titleStyle$
|
|
14759
|
+
const titleStyle$u = {
|
|
14760
14760
|
label: 'MembershipPrograms-titleStyle',
|
|
14761
14761
|
fontSize: 'var(--text-lg)',
|
|
14762
14762
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -14952,7 +14952,7 @@ const MembershipPrograms = ({ title = 'Membership Programs', programs, onEdit, o
|
|
|
14952
14952
|
return acc;
|
|
14953
14953
|
}, {});
|
|
14954
14954
|
const typeOrder = ['airline', 'hotel', 'car', 'other'];
|
|
14955
|
-
return (jsxs("div", { className: containerClasses, children: [alert && jsx("div", { className: sx(alertStyle$3), children: alert }), jsxs("div", { className: sx(headerStyle$v), children: [jsx("h2", { className: sx(titleStyle$
|
|
14955
|
+
return (jsxs("div", { className: containerClasses, children: [alert && jsx("div", { className: sx(alertStyle$3), children: alert }), jsxs("div", { className: sx(headerStyle$v), children: [jsx("h2", { className: sx(titleStyle$u), children: title }), onAdd && (jsxs("button", { type: "button", className: sx(addButtonStyle), onClick: onAdd, "aria-label": "Add membership program", children: [jsx(PlusIcon, {}), jsx("span", { children: "Add Program" })] }))] }), programs.length === 0 ? (jsx("div", { className: sx(emptyStyle$c), children: jsx("p", { children: emptyMessage }) })) : (jsx("div", { className: sx(listStyle$3), children: typeOrder.map((type) => {
|
|
14956
14956
|
const typePrograms = groupedPrograms[type];
|
|
14957
14957
|
if (!typePrograms || typePrograms.length === 0)
|
|
14958
14958
|
return null;
|
|
@@ -15121,7 +15121,7 @@ const dialogStyle = {
|
|
|
15121
15121
|
},
|
|
15122
15122
|
};
|
|
15123
15123
|
/** The Module card inside it: fills the box and lets its body scroll. */
|
|
15124
|
-
const cardStyle$
|
|
15124
|
+
const cardStyle$a = {
|
|
15125
15125
|
label: 'Modal-cardStyle',
|
|
15126
15126
|
flex: 1,
|
|
15127
15127
|
minHeight: 0,
|
|
@@ -15140,7 +15140,7 @@ const sizeStyles$1 = {
|
|
|
15140
15140
|
},
|
|
15141
15141
|
};
|
|
15142
15142
|
/** The title inherits the Module header's type (16px semibold, ink). */
|
|
15143
|
-
const titleStyle$
|
|
15143
|
+
const titleStyle$t = {
|
|
15144
15144
|
label: 'Modal-titleStyle',
|
|
15145
15145
|
margin: 0,
|
|
15146
15146
|
font: 'inherit',
|
|
@@ -15245,7 +15245,7 @@ const iconStyle$1 = {
|
|
|
15245
15245
|
const iconSpacedStyle = {
|
|
15246
15246
|
label: 'Module-iconSpacedStyle', margin: 4
|
|
15247
15247
|
};
|
|
15248
|
-
const titleStyle$
|
|
15248
|
+
const titleStyle$s = {
|
|
15249
15249
|
label: 'Module-titleStyle', color: 'var(--fg-1, #282828)'
|
|
15250
15250
|
};
|
|
15251
15251
|
const badgeStyle$1 = {
|
|
@@ -15363,7 +15363,7 @@ const Module = ({ title, icon, iconClassName = '', badge, before, children, afte
|
|
|
15363
15363
|
setOpen(!open);
|
|
15364
15364
|
}
|
|
15365
15365
|
};
|
|
15366
|
-
return (jsxs("div", { className: cx(sx(moduleStyle), className), children: [title && (jsx("div", { className: cx(sx(headerStyle$u), sx(headerSizeStyles[size]), !open && sx(closedStyle), headerClassName), children: jsxs("div", { className: cx(sx(titleRowStyle$1), sx(titleRowSizeStyles[size]), titleClassName), children: [icon && (jsx("span", { className: cx(sx(iconStyle$1), size !== 'sm' && sx(iconSpacedStyle), iconClassName), children: icon })), jsx("div", { className: sx(titleStyle$
|
|
15366
|
+
return (jsxs("div", { className: cx(sx(moduleStyle), className), children: [title && (jsx("div", { className: cx(sx(headerStyle$u), sx(headerSizeStyles[size]), !open && sx(closedStyle), headerClassName), children: jsxs("div", { className: cx(sx(titleRowStyle$1), sx(titleRowSizeStyles[size]), titleClassName), children: [icon && (jsx("span", { className: cx(sx(iconStyle$1), size !== 'sm' && sx(iconSpacedStyle), iconClassName), children: icon })), jsx("div", { className: sx(titleStyle$s), children: title }), badge && jsx("span", { className: sx(badgeStyle$1), children: badge }), jsxs("div", { className: sx(toolsStyle), children: [tools, useToggle && (jsx("button", { type: "button", className: sx(toggleBtnStyle), onClick: handleToggle, "aria-expanded": open, children: jsx(ChevronIcon, { direction: open ? 'up' : 'down' }) }))] })] }) })), jsxs("div", { className: cx(sx(bodyWrapperStyle), scrollBody && sx(scrollBodyStyle)), children: [before, jsx("div", { className: cx(sx(bodyStyle$4), sx(bodySizeStyles[size]), !open && sx(hiddenStyle), bodyClassName), children: children }), after] }), footer && (jsx("div", { className: cx(sx(footerStyle$6), !open && sx(hiddenStyle)), children: footer }))] }));
|
|
15367
15367
|
};
|
|
15368
15368
|
/**
|
|
15369
15369
|
* Horizontal divider for Module content
|
|
@@ -15415,8 +15415,8 @@ const Modal = ({ isOpen, onClose, title, subtitle, icon, children, size = 'md',
|
|
|
15415
15415
|
const close = showCloseButton ? (jsx(Button, { type: "button", variant: "secondary", size: "sm", square: true, className: sx(closeButtonStyle$1), onClick: onClose, "aria-label": "Close modal", children: jsx(CloseIcon, { size: 16 }) })) : undefined;
|
|
15416
15416
|
// Module draws its header only when it has a title; a close button alone
|
|
15417
15417
|
// still needs one, so it gets an empty title slot.
|
|
15418
|
-
const heading = title || subtitle ? (jsxs("div", { children: [title && (jsx("h2", { id: titleId, className: sx(titleStyle$
|
|
15419
|
-
return (jsx("div", { className: [sx(overlayStyle), overlayClassName].filter(Boolean).join(' '), onClick: handleBackdropClick, children: jsx("div", { className: cx(sx(dialogStyle), sx(sizeStyles$1[size]), className), style: width ? { maxWidth: width } : undefined, role: "dialog", "aria-modal": "true", "aria-labelledby": title ? titleId : undefined, children: jsx(Module, { className: sx(cardStyle$
|
|
15418
|
+
const heading = title || subtitle ? (jsxs("div", { children: [title && (jsx("h2", { id: titleId, className: sx(titleStyle$t), children: title })), subtitle && jsx("p", { className: sx(subtitleStyle$6), children: subtitle })] })) : close ? (jsx("span", {})) : undefined;
|
|
15419
|
+
return (jsx("div", { className: [sx(overlayStyle), overlayClassName].filter(Boolean).join(' '), onClick: handleBackdropClick, children: jsx("div", { className: cx(sx(dialogStyle), sx(sizeStyles$1[size]), className), style: width ? { maxWidth: width } : undefined, role: "dialog", "aria-modal": "true", "aria-labelledby": title ? titleId : undefined, children: jsx(Module, { className: sx(cardStyle$a), title: heading, icon: icon, tools: close, footer: footer, useToggle: false, scrollBody: true, bodyClassName: bodyClassName, children: children }) }) }));
|
|
15420
15420
|
};
|
|
15421
15421
|
/**
|
|
15422
15422
|
* Action row for the bottom of a Modal, keeping button order consistent across dialogs.
|
|
@@ -15436,7 +15436,7 @@ const ConfirmModal = ({ message, confirmText = 'Confirm', cancelText = 'Cancel',
|
|
|
15436
15436
|
|
|
15437
15437
|
The three `--nt-*` custom properties are declared on the card and inherited
|
|
15438
15438
|
by everything below it, so their names are carried across verbatim. */
|
|
15439
|
-
const cardStyle$
|
|
15439
|
+
const cardStyle$9 = {
|
|
15440
15440
|
label: 'NextTripCard-cardStyle',
|
|
15441
15441
|
'--nt-sky': '#5bade6',
|
|
15442
15442
|
'--nt-muted': 'rgb(255 255 255 / 55%)',
|
|
@@ -15460,7 +15460,7 @@ const topStyle = {
|
|
|
15460
15460
|
justifyContent: 'space-between',
|
|
15461
15461
|
gap: 12,
|
|
15462
15462
|
};
|
|
15463
|
-
const eyebrowStyle$
|
|
15463
|
+
const eyebrowStyle$8 = {
|
|
15464
15464
|
label: 'NextTripCard-eyebrowStyle',
|
|
15465
15465
|
color: 'var(--color-accent, #00bcd0)',
|
|
15466
15466
|
fontFamily: 'var(--font-family-label)',
|
|
@@ -15554,7 +15554,7 @@ const travelerStyle$1 = {
|
|
|
15554
15554
|
gap: 10,
|
|
15555
15555
|
marginBottom: 8,
|
|
15556
15556
|
};
|
|
15557
|
-
const nameStyle$
|
|
15557
|
+
const nameStyle$4 = {
|
|
15558
15558
|
label: 'NextTripCard-nameStyle',
|
|
15559
15559
|
fontSize: 17,
|
|
15560
15560
|
fontWeight: 700,
|
|
@@ -15723,7 +15723,7 @@ const btnStyle = {
|
|
|
15723
15723
|
fontWeight: 700,
|
|
15724
15724
|
cursor: 'pointer',
|
|
15725
15725
|
};
|
|
15726
|
-
const actionsStyle$
|
|
15726
|
+
const actionsStyle$6 = {
|
|
15727
15727
|
label: 'NextTripCard-actionsStyle',
|
|
15728
15728
|
display: 'flex',
|
|
15729
15729
|
flexWrap: 'wrap',
|
|
@@ -15787,7 +15787,7 @@ const NextTripCard = ({ eyebrow = 'Your Next Trip', countdownLabel, date, origin
|
|
|
15787
15787
|
const expanded = expandedProp ?? autoExpanded;
|
|
15788
15788
|
const hasDetail = expanded && (details.length > 0 || !!checkIn || !!onAddToCalendar);
|
|
15789
15789
|
const viewItineraryButton = (jsxs("button", { type: "button", className: cx(sx(btnStyle), sx(btnPrimaryStyle)), onClick: onViewItinerary, children: [viewItineraryLabel, " \u2192"] }));
|
|
15790
|
-
return (jsxs("div", { ref: ref, className: cx(sx(cardStyle$
|
|
15790
|
+
return (jsxs("div", { ref: ref, className: cx(sx(cardStyle$9), className), ...props, children: [jsxs("div", { className: sx(topStyle), children: [jsx("span", { className: sx(eyebrowStyle$8), children: eyebrow }), countdownLabel != null && (jsxs("span", { className: sx(countdownStyle), children: [jsx(ClockGlyph, {}), countdownLabel] }))] }), jsxs("div", { className: sx(headStyle), children: [jsx("span", { className: sx(dateStyle), children: date }), jsxs("div", { className: sx(routeStyle$1), children: [jsxs("div", { style: { textAlign: 'right' }, children: [jsx("div", { className: sx(aptCodeStyle), children: origin.code }), jsx("div", { className: sx(aptCityStyle), children: origin.city.toUpperCase() })] }), jsxs("div", { className: sx(pathStyle), children: [jsxs("svg", { width: "92", height: "34", viewBox: "0 0 92 34", fill: "none", "aria-hidden": "true", children: [jsx("circle", { cx: "5", cy: "27", r: "3.5", stroke: "var(--color-accent, #00bcd0)", strokeWidth: "2" }), jsx("circle", { cx: "87", cy: "27", r: "3.5", stroke: "var(--color-accent, #00bcd0)", strokeWidth: "2" }), jsx("path", { d: "M8 26 C 30 3, 62 3, 84 26", stroke: "var(--color-accent, #00bcd0)", strokeWidth: "1.5", strokeDasharray: "3 4", fill: "none" })] }), jsx("span", { className: sx(planeStyle), children: jsx(PlaneIcon$3, { size: 16 }) })] }), jsxs("div", { children: [jsx("div", { className: sx(aptCodeStyle), children: destination.code }), jsx("div", { className: sx(aptCityStyle), children: destination.city.toUpperCase() })] })] })] }), jsx("div", { className: sx(dividerStyle) }), jsxs("div", { className: sx(summaryStyle$5), children: [jsxs("div", { children: [jsxs("div", { className: sx(travelerStyle$1), children: [jsx("span", { className: sx(nameStyle$4), children: traveler }), status && (jsxs("span", { className: cx(sx(statusStyle$3), sx(toneStyles$1[status.tone ?? 'ontime'])), children: [jsx("span", { className: sx(statusDotStyle$1) }), status.label] }))] }), jsxs("div", { className: sx(timesStyle), children: [jsx("span", { className: sx(timeStyle), children: departTime }), jsx("span", { className: sx(arrowStyle), children: "\u2192" }), jsx("span", { className: sx(timeStyle), children: arriveTime })] }), jsxs("div", { className: sx(legsStyle$2), children: [jsxs("span", { children: ["Depart \u00B7 ", origin.code] }), jsxs("span", { children: ["Arrive \u00B7 ", destination.code] })] })] }), !hasDetail && viewItineraryButton] }), hasDetail && (jsxs("div", { className: sx(moreStyle), children: [details.length > 0 && (jsxs(Fragment, { children: [jsxs("div", { className: sx(moreLabelStyle), children: [jsx("span", { children: "Flight details" }), jsx("span", { className: sx(ruleStyle) })] }), jsx("div", { className: sx(gridStyle$6), children: details.map((f) => (jsxs("div", { children: [jsx("div", { className: sx(fieldKStyle), children: f.label }), jsxs("div", { className: sx(fieldVStyle), children: [f.value, f.note && jsxs("span", { className: sx(fieldNoteStyle), children: [" ", f.note] })] })] }, f.label))) })] })), checkIn && (jsxs("div", { className: sx(checkinStyle), children: [jsx("span", { className: sx(checkinIconStyle), children: jsx(CalendarGlyph$1, {}) }), jsxs("span", { className: sx(checkinTextStyle), children: [jsx("strong", { children: checkIn.title }), checkIn.note && jsxs(Fragment, { children: [" ", jsx("span", { children: checkIn.note })] })] })] })), jsxs("div", { className: sx(actionsStyle$6), children: [viewItineraryButton, onAddToCalendar && (jsx("button", { type: "button", className: cx(sx(btnStyle), sx(btnGhostStyle)), onClick: onAddToCalendar, children: addToCalendarLabel }))] })] }))] }));
|
|
15791
15791
|
};
|
|
15792
15792
|
|
|
15793
15793
|
/* "Your travel board": a full-width (L-only) home widget showing the week's
|
|
@@ -15795,7 +15795,7 @@ const NextTripCard = ({ eyebrow = 'Your Next Trip', countdownLabel, date, origin
|
|
|
15795
15795
|
Individual view is flight-centric (route + time + traveller). Team view, drawn
|
|
15796
15796
|
from the Team Travel Calendar, de-emphasises flights and shows each team trip
|
|
15797
15797
|
as a bar spanning its travel dates. Selecting an item fills the footer. */
|
|
15798
|
-
const cardStyle$
|
|
15798
|
+
const cardStyle$8 = {
|
|
15799
15799
|
label: 'TravelBoard-cardStyle',
|
|
15800
15800
|
display: 'flex',
|
|
15801
15801
|
width: '100%',
|
|
@@ -15818,7 +15818,7 @@ const headerStyle$t = {
|
|
|
15818
15818
|
gap: '14px 20px',
|
|
15819
15819
|
padding: '18px 22px',
|
|
15820
15820
|
};
|
|
15821
|
-
const titleStyle$
|
|
15821
|
+
const titleStyle$r = {
|
|
15822
15822
|
label: 'TravelBoard-titleStyle',
|
|
15823
15823
|
margin: 0,
|
|
15824
15824
|
flex: '0 0 auto',
|
|
@@ -16222,7 +16222,7 @@ const footerEyebrowStyle = {
|
|
|
16222
16222
|
* `footerTitleStyle`, which resolves this class name to build that descendant
|
|
16223
16223
|
* selector.
|
|
16224
16224
|
*/
|
|
16225
|
-
const codeStyle$
|
|
16225
|
+
const codeStyle$3 = {
|
|
16226
16226
|
label: 'TravelBoard-codeStyle',
|
|
16227
16227
|
};
|
|
16228
16228
|
const footerTitleStyle = {
|
|
@@ -16235,7 +16235,7 @@ const footerTitleStyle = {
|
|
|
16235
16235
|
whiteSpace: 'nowrap',
|
|
16236
16236
|
/* `.footerTitle .code` — the child's class is content-hashed, so it is
|
|
16237
16237
|
resolved here rather than written out. */
|
|
16238
|
-
[`& .${sx(codeStyle$
|
|
16238
|
+
[`& .${sx(codeStyle$3)}`]: {
|
|
16239
16239
|
color: 'var(--color-accent-strong, #0097a8)',
|
|
16240
16240
|
},
|
|
16241
16241
|
};
|
|
@@ -16371,14 +16371,14 @@ const TravelBoard = ({ title = "This Week's Travel", weekDays, periodLabel, trip
|
|
|
16371
16371
|
if (!selectedTrip)
|
|
16372
16372
|
return jsx("span", { className: sx(footerEmptyStyle), children: "Select a trip to see its details." });
|
|
16373
16373
|
const t = selectedTrip;
|
|
16374
|
-
return (jsxs(Fragment, { children: [jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, children: t.travelerInitials ?? initialsOf(t.travelerFull ?? t.traveler) }), jsxs("span", { className: sx(footerMetaStyle), children: [jsxs("span", { className: sx(footerEyebrowStyle), children: [t.travelerFull ?? t.traveler, t.sportCode ? ` - ${t.sportCode}` : ''] }), jsxs("span", { className: sx(footerTitleStyle), children: [t.originCity ?? t.origin, " ", jsx("span", { className: sx(codeStyle$
|
|
16374
|
+
return (jsxs(Fragment, { children: [jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, children: t.travelerInitials ?? initialsOf(t.travelerFull ?? t.traveler) }), jsxs("span", { className: sx(footerMetaStyle), children: [jsxs("span", { className: sx(footerEyebrowStyle), children: [t.travelerFull ?? t.traveler, t.sportCode ? ` - ${t.sportCode}` : ''] }), jsxs("span", { className: sx(footerTitleStyle), children: [t.originCity ?? t.origin, " ", jsx("span", { className: sx(codeStyle$3), children: t.origin }), " \u2192 ", t.destinationCity ?? t.destination, " ", jsx("span", { className: sx(codeStyle$3), children: t.destination })] }), jsxs("span", { className: sx(footerSubStyle), children: [t.time, t.arriveTime ? ` – ${t.arriveTime}` : '', t.airline ? jsxs(Fragment, { children: [" \u00B7 ", t.airline] }) : null, t.confirmation ? jsxs(Fragment, { children: [" \u00B7 Confirmation: ", jsx("b", { children: t.confirmation })] }) : null] })] }), jsxs("button", { type: "button", className: sx(footerBtnStyle), onClick: () => onViewItinerary?.(t), children: ["View itinerary ", chevron] })] }));
|
|
16375
16375
|
}
|
|
16376
16376
|
if (!selectedTeamTrip)
|
|
16377
16377
|
return jsx("span", { className: sx(footerEmptyStyle), children: "Select a team trip to see its details." });
|
|
16378
16378
|
const t = selectedTeamTrip;
|
|
16379
16379
|
return (jsxs(Fragment, { children: [jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, style: t.accent ? { color: t.accent } : undefined, children: t.teamInitials ?? initialsOf(t.team) }), jsxs("span", { className: sx(footerMetaStyle), children: [jsx("span", { className: sx(footerEyebrowStyle), children: "Team Travel" }), jsxs("span", { className: sx(footerTitleStyle), children: [t.team, t.destination ? jsxs(Fragment, { children: [" \u00B7 ", t.destination] }) : null] }), jsxs("span", { className: sx(footerSubStyle), children: [periodLabelForTeam(t), t.travelerCount != null ? jsxs(Fragment, { children: [" \u00B7 ", jsx("b", { children: t.travelerCount }), " travelers"] }) : null] })] }), jsxs("button", { type: "button", className: sx(footerBtnStyle), onClick: () => onViewTeamTrip?.(t), children: ["View trip ", chevron] })] }));
|
|
16380
16380
|
};
|
|
16381
|
-
return (jsxs("div", { className: cx(sx(cardStyle$
|
|
16381
|
+
return (jsxs("div", { className: cx(sx(cardStyle$8), className), "data-test": "travel-board", ...props, children: [jsxs("div", { className: sx(headerStyle$t), children: [jsx("h3", { className: sx(titleStyle$r), children: title }), jsx("div", { className: sx(togglesStyle), children: jsx(SegmentedSelector, { ariaLabel: "Traveller scope", dataTest: "travel-board-mode", value: mode, onChange: (v) => changeMode(v), activeItemClassName: sx(modeActiveStyle), options: [{ id: 'individual', label: 'Individual' }, { id: 'team', label: 'Team' }] }) }), jsxs("div", { className: sx(periodStyle), children: [jsx("span", { className: sx(periodLabelStyle), children: periodLabel }), jsx("button", { type: "button", className: sx(navBtnStyle), "aria-label": "Previous week", onClick: onPrev, children: jsx(ChevronLeftIcon, { size: 18 }) }), jsx("button", { type: "button", className: sx(navBtnStyle), "aria-label": "Next week", onClick: onNext, children: jsx(ChevronRightIcon$1, { size: 18 }) })] })] }), mode === 'individual' ? renderIndividualBoard() : renderTeamBoard(), jsx("div", { className: sx(footerStyle$5), children: renderFooter() })] }));
|
|
16382
16382
|
};
|
|
16383
16383
|
/** Formats a team trip's travel span for the footer, collapsing the repeated month. */
|
|
16384
16384
|
const periodLabelForTeam = (t) => {
|
|
@@ -16476,7 +16476,7 @@ const contentStyle$5 = {
|
|
|
16476
16476
|
flex: 1,
|
|
16477
16477
|
minWidth: 0,
|
|
16478
16478
|
};
|
|
16479
|
-
const titleStyle$
|
|
16479
|
+
const titleStyle$q = {
|
|
16480
16480
|
label: 'PageBanners-titleStyle',
|
|
16481
16481
|
'&&': {
|
|
16482
16482
|
margin: 0,
|
|
@@ -16590,8 +16590,8 @@ const PageBanners = ({ systemBanners, alertBanners, fullWidth = false, className
|
|
|
16590
16590
|
const visibleAlerts = alertBanners.filter((banner) => !dismissed.has(banner.id));
|
|
16591
16591
|
if (!visibleSystem.length && !visibleAlerts.length)
|
|
16592
16592
|
return null;
|
|
16593
|
-
return (jsxs("div", { className: classes(sx(stackStyle$3), fullWidth && sx(flushStyle), className), role: "region", "aria-label": "Page notices", children: [visibleSystem.map((banner) => (jsxs("div", { className: classes(sx(bannerStyle$1), sx(systemStyle)), role: "status", children: [jsx(InfoIcon$1, { className: sx(systemIconStyle), size: 20, "aria-hidden": "true" }), jsxs("div", { className: sx(contentStyle$5), children: [jsx("p", { className: sx(titleStyle$
|
|
16594
|
-
const content = (jsxs("div", { className: sx(contentStyle$5), children: [jsx("p", { className: classes(sx(titleStyle$
|
|
16593
|
+
return (jsxs("div", { className: classes(sx(stackStyle$3), fullWidth && sx(flushStyle), className), role: "region", "aria-label": "Page notices", children: [visibleSystem.map((banner) => (jsxs("div", { className: classes(sx(bannerStyle$1), sx(systemStyle)), role: "status", children: [jsx(InfoIcon$1, { className: sx(systemIconStyle), size: 20, "aria-hidden": "true" }), jsxs("div", { className: sx(contentStyle$5), children: [jsx("p", { className: sx(titleStyle$q), children: decodeEntities(banner.html) }), banner.detailHtml && jsx("p", { className: sx(detailStyle), children: decodeEntities(banner.detailHtml) })] }), jsx("button", { type: "button", className: sx(dismissStyle), "aria-label": "Dismiss notice", onClick: () => dismiss(banner.id), children: jsx(CloseIcon, { size: 16 }) })] }, banner.id))), visibleAlerts.map((banner) => {
|
|
16594
|
+
const content = (jsxs("div", { className: sx(contentStyle$5), children: [jsx("p", { className: classes(sx(titleStyle$q), sx(alertTitleStyle)), children: decodeEntities(banner.title) }), banner.body && jsx("p", { className: classes(sx(detailStyle), sx(clampStyle)), children: decodeEntities(banner.body) })] }));
|
|
16595
16595
|
return (jsxs("div", { className: classes(sx(bannerStyle$1), sx(alertStyle$1)), role: "alert", children: [jsx(WarningIcon$1, { className: sx(alertIconStyle), size: 20, "aria-hidden": "true" }), banner.href ? (jsx("a", { href: banner.href, className: sx(alertLinkStyle), children: content })) : (content), jsx("button", { type: "button", className: classes(sx(dismissStyle), sx(alertDismissStyle)), "aria-label": "Dismiss alert", onClick: () => dismiss(banner.id), children: jsx(CloseIcon, { size: 16 }) })] }, banner.id));
|
|
16596
16596
|
})] }));
|
|
16597
16597
|
};
|
|
@@ -16623,7 +16623,7 @@ const alertStyle = {
|
|
|
16623
16623
|
label: 'PreferencesPanel-alertStyle',
|
|
16624
16624
|
width: '100%',
|
|
16625
16625
|
};
|
|
16626
|
-
const titleStyle$
|
|
16626
|
+
const titleStyle$p = {
|
|
16627
16627
|
label: 'PreferencesPanel-titleStyle',
|
|
16628
16628
|
fontSize: 'var(--text-lg)',
|
|
16629
16629
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -16732,7 +16732,7 @@ const DEFAULT_ICONS = {
|
|
|
16732
16732
|
*/
|
|
16733
16733
|
const PreferencesPanel = ({ title, sections, alert, footer, isLoading = false, className = '', }) => {
|
|
16734
16734
|
const panelClasses = cx(sx(panelStyle$4), isLoading && sx(loadingStyle$2), className);
|
|
16735
|
-
return (jsxs("div", { className: panelClasses, children: [alert && (jsx("div", { className: sx(alertStyle), children: alert })), title && jsx("h2", { className: sx(titleStyle$
|
|
16735
|
+
return (jsxs("div", { className: panelClasses, children: [alert && (jsx("div", { className: sx(alertStyle), children: alert })), title && jsx("h2", { className: sx(titleStyle$p), children: title }), jsx("div", { className: sx(gridStyle$5), children: sections.map((section, i) => (jsxs("div", { className: sx(sectionStyle$7), children: [jsxs("div", { className: sx(sectionHeaderStyle$2), children: [(section.icon || DEFAULT_ICONS[section.title.toLowerCase()]) && (jsx("span", { className: sx(sectionIconStyle$2), children: section.icon || DEFAULT_ICONS[section.title.toLowerCase()] })), jsx("h3", { className: sx(sectionTitleStyle$a), children: section.title })] }), jsx("div", { className: sx(fieldsStyle$1), children: section.fields.map((field, j) => (jsxs("div", { className: sx(fieldStyle$3), children: [jsx("label", { className: sx(fieldLabelStyle$1), children: field.label }), field.input ? (jsx("div", { className: sx(fieldInputStyle), children: field.input })) : (jsx("div", { className: sx(fieldValueStyle$1), children: field.value || '—' }))] }, j))) })] }, i))) }), footer && (jsx("div", { className: sx(footerStyle$4), children: footer }))] }));
|
|
16736
16736
|
};
|
|
16737
16737
|
PreferencesPanel.displayName = 'PreferencesPanel';
|
|
16738
16738
|
|
|
@@ -16784,7 +16784,7 @@ const identityTextStyle = {
|
|
|
16784
16784
|
flexDirection: 'column',
|
|
16785
16785
|
gap: 2,
|
|
16786
16786
|
};
|
|
16787
|
-
const nameStyle$
|
|
16787
|
+
const nameStyle$3 = {
|
|
16788
16788
|
label: 'ProfileMenu-nameStyle',
|
|
16789
16789
|
overflow: 'hidden',
|
|
16790
16790
|
fontSize: 18,
|
|
@@ -16858,7 +16858,7 @@ const dangerStyle$1 = {
|
|
|
16858
16858
|
* user, the rows, and their handlers, and positions the menu (e.g. as the
|
|
16859
16859
|
* `profileMenu` popover of HubAppShell).
|
|
16860
16860
|
*/
|
|
16861
|
-
const ProfileMenu = ({ name, email, initials, avatarSrc, profileLabel = 'Profile', accountLabel = 'Account', items, className = '', ...props }) => (jsxs("div", { className: cx(sx(menuStyle), className), role: "menu", "aria-label": profileLabel, "data-test": "profile-menu", ...props, children: [jsxs("div", { className: sx(identityBlockStyle), children: [jsx("p", { className: sx(sectionLabelStyle), children: profileLabel }), jsxs("div", { className: sx(identityStyle), children: [jsx(Avatar, { name: name, initials: initials, src: avatarSrc, size: "lg" }), jsxs("div", { className: sx(identityTextStyle), children: [jsx("span", { className: sx(nameStyle$
|
|
16861
|
+
const ProfileMenu = ({ name, email, initials, avatarSrc, profileLabel = 'Profile', accountLabel = 'Account', items, className = '', ...props }) => (jsxs("div", { className: cx(sx(menuStyle), className), role: "menu", "aria-label": profileLabel, "data-test": "profile-menu", ...props, children: [jsxs("div", { className: sx(identityBlockStyle), children: [jsx("p", { className: sx(sectionLabelStyle), children: profileLabel }), jsxs("div", { className: sx(identityStyle), children: [jsx(Avatar, { name: name, initials: initials, src: avatarSrc, size: "lg" }), jsxs("div", { className: sx(identityTextStyle), children: [jsx("span", { className: sx(nameStyle$3), children: name }), jsx("span", { className: sx(emailStyle), children: email })] })] })] }), jsxs("div", { className: sx(sectionStyle$6), children: [jsx("p", { className: sx(sectionLabelStyle), children: accountLabel }), items.map((item) => (jsxs("button", { type: "button", role: "menuitem", className: cx(sx(itemStyle$1), item.variant === 'danger' && sx(dangerStyle$1)), onClick: item.onClick, "data-test": `profile-menu-${item.key}`, children: [item.icon && jsx("span", { className: sx(itemIconStyle), children: item.icon }), jsx("span", { children: item.label })] }, item.key)))] })] }));
|
|
16862
16862
|
|
|
16863
16863
|
/**
|
|
16864
16864
|
* QuoteCostBreakdown's compiled rules.
|
|
@@ -16882,7 +16882,7 @@ const breakdownStyle = {
|
|
|
16882
16882
|
flexDirection: 'column',
|
|
16883
16883
|
gap: 'var(--space-3)',
|
|
16884
16884
|
};
|
|
16885
|
-
const titleStyle$
|
|
16885
|
+
const titleStyle$o = {
|
|
16886
16886
|
label: 'QuoteCostBreakdown-titleStyle',
|
|
16887
16887
|
margin: 0,
|
|
16888
16888
|
color: 'var(--fg-1)',
|
|
@@ -17028,11 +17028,11 @@ const QuoteCostBreakdown = ({ lineItems, adjustments = [], currency = 'USD', loc
|
|
|
17028
17028
|
const quantityFormatter = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
17029
17029
|
const totals = useMemo(() => computeQuoteTotals(lineItems, adjustments), [lineItems, adjustments]);
|
|
17030
17030
|
const perPassenger = passengerCount && passengerCount > 0 ? totals.total / passengerCount : undefined;
|
|
17031
|
-
return (jsxs("section", { className: cx(sx(breakdownStyle), className), "aria-label": title || 'Cost breakdown', "data-test": "quote-cost-breakdown", children: [title && jsx("h3", { className: sx(titleStyle$
|
|
17031
|
+
return (jsxs("section", { className: cx(sx(breakdownStyle), className), "aria-label": title || 'Cost breakdown', "data-test": "quote-cost-breakdown", children: [title && jsx("h3", { className: sx(titleStyle$o), children: title }), jsx("div", { className: sx(tableScrollStyle$1), children: jsxs("table", { className: sx(tableStyle$7), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Item" }), jsx("th", { scope: "col", className: sx(numericStyle), children: "Qty" }), jsx("th", { scope: "col", className: sx(numericStyle), children: "Unit price" }), jsx("th", { scope: "col", className: sx(numericStyle), children: "Amount" })] }) }), jsxs("tbody", { children: [lineItems.length === 0 && (jsx("tr", { children: jsx("td", { colSpan: 4, className: sx(emptyStyle$a), "data-test": "quote-cost-empty", children: "This quote has no cost line items yet." }) })), lineItems.map((lineItem) => (jsxs("tr", { "data-test": "quote-cost-line-item", children: [jsxs("th", { scope: "row", className: sx(itemCellStyle), children: [jsx("span", { className: sx(itemLabelStyle), children: lineItem.label }), jsxs("span", { className: sx(itemMetaStyle), children: [CATEGORY_LABELS[lineItem.category ?? 'other'], lineItem.description ? ` · ${lineItem.description}` : ''] })] }), jsxs("td", { className: sx(numericStyle), children: [quantityFormatter.format(lineItem.quantity), " ", lineItem.unit] }), jsx("td", { className: sx(numericStyle), children: currencyFormatter.format(lineItem.unitPrice) }), jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), children: currencyFormatter.format(computeLineItemTotal(lineItem)) })] }, lineItem.id)))] }), jsxs("tfoot", { children: [jsxs("tr", { className: sx(subtotalRowStyle), children: [jsx("th", { scope: "row", colSpan: 3, children: "Subtotal" }), jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), "data-test": "quote-cost-subtotal", children: currencyFormatter.format(totals.subtotal) })] }), adjustments.map((adjustment) => (jsxs("tr", { "data-test": "quote-cost-adjustment", children: [jsxs("th", { scope: "row", colSpan: 3, className: sx(itemCellStyle), children: [jsx("span", { className: sx(itemLabelStyle), children: adjustment.label }), adjustment.note && jsx("span", { className: sx(itemMetaStyle), children: adjustment.note })] }), jsx("td", { className: cx(sx(numericStyle), sx(amountStyle), adjustment.amount < 0 && sx(creditStyle)), children: currencyFormatter.format(adjustment.amount) })] }, adjustment.id))), jsxs("tr", { className: sx(totalRowStyle), children: [jsx("th", { scope: "row", colSpan: 3, children: "Quoted total" }), jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), "data-test": "quote-cost-total", children: currencyFormatter.format(totals.total) })] }), perPassenger !== undefined && (jsxs("tr", { className: sx(perPassengerRowStyle), children: [jsxs("th", { scope: "row", colSpan: 3, children: ["Per passenger (", quantityFormatter.format(passengerCount), " pax)"] }), jsx("td", { className: sx(numericStyle), "data-test": "quote-cost-per-passenger", children: currencyFormatter.format(perPassenger) })] }))] })] }) })] }));
|
|
17032
17032
|
};
|
|
17033
17033
|
|
|
17034
17034
|
/** The button row itself; it wraps so the disabled reason can take a line of its own. */
|
|
17035
|
-
const actionsStyle$
|
|
17035
|
+
const actionsStyle$5 = {
|
|
17036
17036
|
label: 'QuoteReviewActions-actionsStyle',
|
|
17037
17037
|
display: 'flex',
|
|
17038
17038
|
flexWrap: 'wrap',
|
|
@@ -17191,7 +17191,7 @@ const QuoteReviewActions = ({ quoteId, carrier, formattedTotal, changes = [], di
|
|
|
17191
17191
|
const appendReason = (reason) => {
|
|
17192
17192
|
setNote((current) => (current.trim() ? `${current.trim()}\n${reason}` : reason));
|
|
17193
17193
|
};
|
|
17194
|
-
return (jsxs("div", { className: cx(sx(actionsStyle$
|
|
17194
|
+
return (jsxs("div", { className: cx(sx(actionsStyle$5), className), "data-test": "quote-review-actions", children: [jsx(Button, { disabled: disabled, onClick: () => setIsApproveOpen(true), "data-test": "quote-review-approve", children: approveLabel }), jsx(Button, { variant: "secondary", disabled: disabled, onClick: () => setIsRejectOpen(true), "data-test": "quote-review-reject", children: rejectLabel }), changes.length > 0 && (jsxs("span", { className: sx(changeCountStyle), "data-test": "quote-review-change-count", children: [changes.length, " field", changes.length === 1 ? '' : 's', " edited"] })), disabled && disabledReason && (jsx("p", { className: sx(disabledReasonStyle), "data-test": "quote-review-disabled-reason", children: disabledReason })), jsx(ConfirmModal, { isOpen: isApproveOpen, onClose: () => setIsApproveOpen(false), title: "Approve this quote?", confirmText: approveLabel, cancelText: "Cancel", loading: loading, onConfirm: confirmApprove, message: jsxs("span", { "data-test": "quote-review-approve-message", children: [jsxs("span", { className: sx(approveIntroStyle), children: ["Approving ", quoteId, " records ", carrier, formattedTotal ? `'s ${formattedTotal} quote` : "'s quote", " as approved. This cannot be undone from Hub."] }), changes.length > 0 ? (jsxs(Fragment, { children: [jsxs("span", { className: sx(changeIntroStyle), "data-test": "quote-review-change-intro", children: ["You changed ", changes.length, " field", changes.length === 1 ? '' : 's', " \u2014 the submitter is notified when these edits are stored."] }), jsx("span", { className: sx(changeListStyle), "data-test": "quote-review-change-list", children: changes.map((change) => (jsxs("span", { className: sx(changeStyle), "data-test": "quote-review-change", children: [jsx("span", { className: sx(changeLabelStyle), children: change.label }), jsxs("span", { className: sx(changeValuesStyle), children: [jsx("s", { className: sx(changeFromStyle), children: change.from }), jsx("span", { "aria-hidden": "true", children: "\u2192" }), jsx("strong", { className: sx(changeToStyle), children: change.to })] })] }, change.field))) })] })) : (jsx("span", { className: sx(changeIntroStyle), "data-test": "quote-review-no-changes", children: "You have not changed anything \u2014 the quote is approved exactly as the carrier submitted it." }))] }) }), jsxs(Drawer, { isOpen: isRejectOpen, onClose: closeReject, position: "right", size: "md", children: [jsx(Drawer.Header, { title: `Reject ${quoteId}` }), jsx(Drawer.Body, { children: jsxs("div", { className: sx(changesBodyStyle), children: [jsx("p", { className: sx(changesIntroStyle), children: "Rejecting closes the quote outright. The note is stored with the decision for the Charter Sourcing team; the current workflow does not send a rejection email." }), rejectReasons.length > 0 && (jsx("div", { className: sx(reasonsStyle), role: "group", "aria-label": "Common reasons", children: rejectReasons.map((reason) => (jsx("button", { type: "button", className: sx(reasonStyle$2), onClick: () => appendReason(reason), "data-test": "quote-review-reason", children: reason }, reason))) })), jsx(Textarea, { id: "quote-review-reject-note", label: "Why is this being rejected?", helperText: "Stored with the rejection for the Charter Sourcing team.", rows: 6, fullWidth: true, value: note, onChange: (event) => setNote(event.target.value), placeholder: "Explain why this quote cannot be approved\u2026", "data-test": "quote-review-message" })] }) }), jsx(Drawer.Footer, { children: jsxs("div", { className: sx(drawerFooterStyle), children: [jsx(Button, { variant: "secondary", onClick: closeReject, "data-test": "quote-review-cancel-reject", children: "Cancel" }), jsx(Button, { variant: "danger", disabled: !note.trim(), onClick: submitReject, "data-test": "quote-review-send-reject", children: "Confirm rejection" })] }) })] })] }));
|
|
17195
17195
|
};
|
|
17196
17196
|
QuoteReviewActions.displayName = 'QuoteReviewActions';
|
|
17197
17197
|
|
|
@@ -17212,7 +17212,7 @@ const summaryStyle$4 = {
|
|
|
17212
17212
|
background: 'var(--color-white, #fff)',
|
|
17213
17213
|
boxShadow: '0 1px 3px rgb(0 0 0 / 5%)',
|
|
17214
17214
|
};
|
|
17215
|
-
const titleStyle$
|
|
17215
|
+
const titleStyle$n = {
|
|
17216
17216
|
label: 'RequestSummary-titleStyle',
|
|
17217
17217
|
fontSize: 18,
|
|
17218
17218
|
fontWeight: 600,
|
|
@@ -17330,7 +17330,7 @@ const RequestSummary = ({ sections, values, enabledSections = {}, submissionInfo
|
|
|
17330
17330
|
const visibleSections = sections.filter(section => enabledSections[section.key] !== false);
|
|
17331
17331
|
const populatedSections = visibleSections.filter((section) => (section.items?.some((item) => hasDisplayValue(resolveItemValue(item, values, `${section.key}_${item.label}`)))
|
|
17332
17332
|
|| section.segments?.some((segment) => segment.items.some((item) => (hasDisplayValue(resolveItemValue(item, values, `${section.key}_${segment.label}_${item.label}`)))))));
|
|
17333
|
-
return (jsxs("div", { className: cx(sx(summaryStyle$4), className), "data-test": dataTest, children: [jsx("h2", { className: sx(titleStyle$
|
|
17333
|
+
return (jsxs("div", { className: cx(sx(summaryStyle$4), className), "data-test": dataTest, children: [jsx("h2", { className: sx(titleStyle$n), children: title }), submissionInfo && (jsxs("div", { className: sx(submissionInfoStyle), children: [jsx("span", { className: sx(labelStyle$3), children: "Submitted by" }), jsx("span", { className: sx(valueStyle), children: submissionInfo.submittedBy }), jsx("span", { className: sx(labelStyle$3), children: "on" }), jsx("span", { className: sx(valueStyle), children: submissionInfo.submittedOn })] })), jsx("div", { className: sx(sectionsStyle$1), children: populatedSections.map((section) => (jsx(SummarySection, { section: section, values: values }, section.key))) }), populatedSections.length === 0 && (jsx("p", { className: sx(emptyStyle$9), children: "No services selected" }))] }));
|
|
17334
17334
|
};
|
|
17335
17335
|
RequestSummary.displayName = 'RequestSummary';
|
|
17336
17336
|
|
|
@@ -18248,14 +18248,14 @@ const selectedStyle = {
|
|
|
18248
18248
|
fontWeight: 500,
|
|
18249
18249
|
},
|
|
18250
18250
|
};
|
|
18251
|
-
const nameStyle$
|
|
18251
|
+
const nameStyle$2 = {
|
|
18252
18252
|
label: 'SingleTeamPanelSelector-nameStyle',
|
|
18253
18253
|
overflow: 'hidden',
|
|
18254
18254
|
textOverflow: 'ellipsis',
|
|
18255
18255
|
whiteSpace: 'nowrap',
|
|
18256
18256
|
};
|
|
18257
18257
|
/* The sport code, held a step back from the name. */
|
|
18258
|
-
const codeStyle$
|
|
18258
|
+
const codeStyle$2 = {
|
|
18259
18259
|
label: 'SingleTeamPanelSelector-codeStyle',
|
|
18260
18260
|
flex: '0 0 auto',
|
|
18261
18261
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -18287,7 +18287,7 @@ const SingleTeamPanelSelector = ({ categories, activeCategoryKey, defaultCategor
|
|
|
18287
18287
|
setInternalKey(key);
|
|
18288
18288
|
onCategoryChange?.(key);
|
|
18289
18289
|
};
|
|
18290
|
-
return (jsxs("div", { className: cx(sx(panelStyle$3), className), role: "dialog", "aria-label": "Book team travel", "data-test": "single-team-panel-selector", ...props, children: [jsx("div", { className: sx(tabsStyle$7), children: jsx(Segment, { options: options, value: activeCategory?.key ?? '', onChange: changeCategory, fullWidth: true, "aria-label": tabsLabel }) }), jsx("div", { className: sx(listStyle$2), role: "listbox", "aria-label": activeCategory ? `${activeCategory.label} teams` : 'Teams', children: activeCategory && activeCategory.teams.length > 0 ? (activeCategory.teams.map((team) => (jsxs("button", { type: "button", role: "option", "aria-selected": team.id === selectedTeamId, className: cx(sx(itemStyle), team.id === selectedTeamId && sx(selectedStyle)), onClick: () => onSelectTeam?.(team, activeCategory), "data-test": `single-team-panel-selector-option-${team.id}`, children: [jsx("span", { className: sx(nameStyle$
|
|
18290
|
+
return (jsxs("div", { className: cx(sx(panelStyle$3), className), role: "dialog", "aria-label": "Book team travel", "data-test": "single-team-panel-selector", ...props, children: [jsx("div", { className: sx(tabsStyle$7), children: jsx(Segment, { options: options, value: activeCategory?.key ?? '', onChange: changeCategory, fullWidth: true, "aria-label": tabsLabel }) }), jsx("div", { className: sx(listStyle$2), role: "listbox", "aria-label": activeCategory ? `${activeCategory.label} teams` : 'Teams', children: activeCategory && activeCategory.teams.length > 0 ? (activeCategory.teams.map((team) => (jsxs("button", { type: "button", role: "option", "aria-selected": team.id === selectedTeamId, className: cx(sx(itemStyle), team.id === selectedTeamId && sx(selectedStyle)), onClick: () => onSelectTeam?.(team, activeCategory), "data-test": `single-team-panel-selector-option-${team.id}`, children: [jsx("span", { className: sx(nameStyle$2), children: team.name }), jsxs("span", { className: sx(codeStyle$2), children: ["(", team.code, ")"] })] }, team.id)))) : (jsx("p", { className: sx(emptyStyle$8), role: "status", children: emptyMessage })) })] }));
|
|
18291
18291
|
};
|
|
18292
18292
|
|
|
18293
18293
|
/**
|
|
@@ -18304,7 +18304,7 @@ const queueStyle = {
|
|
|
18304
18304
|
flexDirection: 'column',
|
|
18305
18305
|
gap: 'var(--space-3)',
|
|
18306
18306
|
};
|
|
18307
|
-
const toolbarStyle$
|
|
18307
|
+
const toolbarStyle$3 = {
|
|
18308
18308
|
label: 'SourcingReviewQueueTable-toolbarStyle',
|
|
18309
18309
|
display: 'flex',
|
|
18310
18310
|
flexWrap: 'wrap',
|
|
@@ -18520,7 +18520,7 @@ const SourcingReviewQueueTable = ({ quotes, selectedQuoteIds, onSelectionChange,
|
|
|
18520
18520
|
render: (_value, quote) => jsx(StatusBadge, { status: quote.status }),
|
|
18521
18521
|
},
|
|
18522
18522
|
];
|
|
18523
|
-
return (jsxs("div", { className: cx(sx(queueStyle), className), "data-test": "sourcing-review-queue", children: [jsxs("div", { className: sx(toolbarStyle$
|
|
18523
|
+
return (jsxs("div", { className: cx(sx(queueStyle), className), "data-test": "sourcing-review-queue", children: [jsxs("div", { className: sx(toolbarStyle$3), children: [!hideFilters && (jsxs("div", { className: sx(filtersStyle$3), children: [jsx(Input, { size: "sm", type: "search", "aria-label": "Search quotes", placeholder: "Search carrier, trip, or school", leftIcon: jsx(SearchIcon$1, { size: 16 }), value: searchTerm, onChange: (event) => {
|
|
18524
18524
|
setSearchTerm(event.target.value);
|
|
18525
18525
|
setPage(1);
|
|
18526
18526
|
}, "data-test": "sourcing-queue-search" }), jsxs("label", { className: sx(statusFilterStyle), children: [jsx("span", { className: sx(statusFilterLabelStyle), children: "Status" }), jsx("select", { value: statusFilter, onChange: (event) => {
|
|
@@ -18548,7 +18548,7 @@ const SourcingReviewQueueTable = ({ quotes, selectedQuoteIds, onSelectionChange,
|
|
|
18548
18548
|
* - `.teamItem:hover .chevron` names two generated classes, so the chevron's
|
|
18549
18549
|
* name is resolved here and used as a computed key.
|
|
18550
18550
|
*/
|
|
18551
|
-
const cardStyle$
|
|
18551
|
+
const cardStyle$7 = {
|
|
18552
18552
|
label: 'TeamCard-cardStyle',
|
|
18553
18553
|
overflow: 'hidden',
|
|
18554
18554
|
border: '1px solid var(--border-color-dark, #ababab)',
|
|
@@ -18569,7 +18569,7 @@ const iconStyle = {
|
|
|
18569
18569
|
display: 'flex',
|
|
18570
18570
|
color: 'var(--color-primary, #005eb8)',
|
|
18571
18571
|
};
|
|
18572
|
-
const titleStyle$
|
|
18572
|
+
const titleStyle$m = {
|
|
18573
18573
|
label: 'TeamCard-titleStyle',
|
|
18574
18574
|
margin: 0,
|
|
18575
18575
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -18719,8 +18719,8 @@ const TeamCard = ({ title = 'Administer Teams', icon, teams, onTeamSelect, class
|
|
|
18719
18719
|
return teams;
|
|
18720
18720
|
return teams.filter(team => team.category === activeTab);
|
|
18721
18721
|
}, [teams, activeTab]);
|
|
18722
|
-
const cardClasses = cx(sx(cardStyle$
|
|
18723
|
-
return (jsxs("div", { className: cardClasses, "data-test": "team-card", children: [jsxs("div", { className: sx(headerStyle$r), children: [jsx("span", { className: sx(iconStyle), children: icon || jsx(UsersIcon, {}) }), jsx("h3", { className: sx(titleStyle$
|
|
18722
|
+
const cardClasses = cx(sx(cardStyle$7), className);
|
|
18723
|
+
return (jsxs("div", { className: cardClasses, "data-test": "team-card", children: [jsxs("div", { className: sx(headerStyle$r), children: [jsx("span", { className: sx(iconStyle), children: icon || jsx(UsersIcon, {}) }), jsx("h3", { className: sx(titleStyle$m), children: title })] }), jsxs("div", { className: sx(bodyStyle$3), children: [jsx("div", { className: sx(tabsStyle$6), children: TEAM_GROUPS.map(({ label, key }) => (jsx("button", { type: "button", onClick: () => setActiveTab(key), className: cx(sx(tabStyle), activeTab === key && sx(tabActiveStyle)), "data-test": `team-card-filter-${key ?? 'all'}`, children: label }, label))) }), jsxs("div", { className: sx(listStyle$1), children: [filteredTeams.map((team) => (jsxs("button", { type: "button", className: sx(teamItemStyle), "data-test": `team-card-team-${team.id}`, onClick: () => onTeamSelect?.(team), children: [jsx("span", { className: sx(teamCodeStyle$1), style: { backgroundColor: getTeamColor(team.code) }, children: team.code }), jsx("span", { className: sx(teamNameStyle), children: team.description }), jsx("span", { className: sx(chevronStyle$1), children: jsx(ChevronRightIcon, {}) })] }, team.id))), filteredTeams.length === 0 && (jsx("div", { className: sx(emptyStyle$7), children: "No teams found" }))] })] })] }));
|
|
18724
18724
|
};
|
|
18725
18725
|
TeamCard.displayName = 'TeamCard';
|
|
18726
18726
|
|
|
@@ -19120,7 +19120,7 @@ const TeamContactsPanel = ({ contacts, value, onChange, disabled = false, loadin
|
|
|
19120
19120
|
};
|
|
19121
19121
|
TeamContactsPanel.displayName = 'TeamContactsPanel';
|
|
19122
19122
|
|
|
19123
|
-
const actionsStyle$
|
|
19123
|
+
const actionsStyle$4 = {
|
|
19124
19124
|
label: 'TeamScheduleActions-actionsStyle', margin: '16px 0'
|
|
19125
19125
|
};
|
|
19126
19126
|
const primaryRowStyle = {
|
|
@@ -19209,7 +19209,7 @@ const secondaryRowStyle = {
|
|
|
19209
19209
|
};
|
|
19210
19210
|
|
|
19211
19211
|
/** Exact presentational counterpart of Hub's Team Schedule action controls. */
|
|
19212
|
-
const TeamScheduleActions = ({ isCompactView, tripCount, seasonLabel, seasonValue, seasonOptions = [], previousSeasonDisabled = false, exportDisabled = false, exporting = false, groupTravelDisabled = false, mergeDisabled = false, unmergeDisabled = false, merging = false, unmerging = false, onViewSchedule, onBack, onPreviousSeason, onNextSeason, onSeasonChange, onExport, onGroupTravelRequest, onMergeEvents, onUnmergeEvents, className = '', }) => (jsxs("div", { className: cx(sx(actionsStyle$
|
|
19212
|
+
const TeamScheduleActions = ({ isCompactView, tripCount, seasonLabel, seasonValue, seasonOptions = [], previousSeasonDisabled = false, exportDisabled = false, exporting = false, groupTravelDisabled = false, mergeDisabled = false, unmergeDisabled = false, merging = false, unmerging = false, onViewSchedule, onBack, onPreviousSeason, onNextSeason, onSeasonChange, onExport, onGroupTravelRequest, onMergeEvents, onUnmergeEvents, className = '', }) => (jsxs("div", { className: cx(sx(actionsStyle$4), className), "data-test": "team-schedule-actions", children: [jsxs("div", { className: sx(primaryRowStyle), children: [!isCompactView ? (onViewSchedule && jsx(Button, { "data-test": "team-schedule-view-edit", size: "sm", onClick: onViewSchedule, children: "View/Edit Schedule" })) : (onBack && jsx(Button, { "data-test": "team-schedule-back", size: "sm", onClick: onBack, leftIcon: jsx(ChevronLeftIcon, { size: 14 }), children: "Back" })), jsxs("div", { className: sx(seasonNavigatorStyle), children: [onPreviousSeason && jsx(Button, { "data-test": "team-schedule-previous-season", variant: "secondary", size: "sm", square: true, "aria-label": "Previous Season", disabled: previousSeasonDisabled, onClick: onPreviousSeason, children: jsx(ChevronLeftIcon, { size: 18 }) }), jsxs("div", { className: sx(seasonLabelStyle), children: [jsx("span", { className: sx(seasonValueStyle), children: seasonLabel }), !!seasonOptions.length && onSeasonChange && (jsx("select", { "data-test": "team-schedule-season", "aria-label": "Season", value: seasonValue, onChange: (event) => onSeasonChange(event.target.value), children: seasonOptions.map((option) => jsx("option", { value: option.value, children: option.label }, option.value)) }))] }), onNextSeason && jsx(Button, { "data-test": "team-schedule-next-season", variant: "secondary", size: "sm", square: true, "aria-label": "Next Season", onClick: onNextSeason, children: jsx(ChevronRightIcon$1, { size: 18 }) })] }), onExport && jsx(Button, { "data-test": "team-schedule-export", variant: "outline", size: "sm", loading: exporting, disabled: exportDisabled, rightIcon: jsx(ArrowUpRightIcon, { size: 14 }), onClick: onExport, children: "Export XLS" }), jsxs("span", { className: sx(tripCountStyle), "data-test": "team-schedule-trip-count", children: [tripCount, " trips displayed"] })] }), isCompactView && (onGroupTravelRequest || onMergeEvents || onUnmergeEvents) && (jsxs("div", { className: sx(secondaryRowStyle), children: [onGroupTravelRequest && jsx(Button, { "data-test": "team-schedule-group-travel-request", variant: "outline", size: "sm", disabled: groupTravelDisabled, onClick: onGroupTravelRequest, children: "Group Travel Request" }), onMergeEvents && jsx(Button, { "data-test": "team-schedule-merge-events", variant: "outline", size: "sm", disabled: mergeDisabled, loading: merging, onClick: onMergeEvents, children: "Merge Events" }), onUnmergeEvents && jsx(Button, { "data-test": "team-schedule-unmerge-events", variant: "outline", size: "sm", disabled: unmergeDisabled, loading: unmerging, onClick: onUnmergeEvents, children: "Unmerge Events" })] }))] }));
|
|
19213
19213
|
|
|
19214
19214
|
//#region src/FlexRender.tsx
|
|
19215
19215
|
function isReactComponent(component) {
|
|
@@ -26000,7 +26000,7 @@ const addRowStyle = {
|
|
|
26000
26000
|
paddingLeft: 0,
|
|
26001
26001
|
},
|
|
26002
26002
|
};
|
|
26003
|
-
const toolbarStyle$
|
|
26003
|
+
const toolbarStyle$2 = {
|
|
26004
26004
|
label: 'TeamScheduleCompactTable-toolbarStyle',
|
|
26005
26005
|
display: 'flex',
|
|
26006
26006
|
alignItems: 'center',
|
|
@@ -26011,7 +26011,7 @@ const toolbarStyle$1 = {
|
|
|
26011
26011
|
flexWrap: 'wrap',
|
|
26012
26012
|
},
|
|
26013
26013
|
};
|
|
26014
|
-
const searchStyle = {
|
|
26014
|
+
const searchStyle$1 = {
|
|
26015
26015
|
label: 'TeamScheduleCompactTable-searchStyle',
|
|
26016
26016
|
display: 'inline-flex',
|
|
26017
26017
|
alignItems: 'center',
|
|
@@ -26430,7 +26430,7 @@ const TeamScheduleCompactTable = ({ data, rows, tripHeaders = DEFAULT_TRIP_HEADE
|
|
|
26430
26430
|
return (jsxs("div", {
|
|
26431
26431
|
// The stylesheet never carried a `.schedule` rule, so this wrapper only
|
|
26432
26432
|
// ever wore the caller's class.
|
|
26433
|
-
className: className, "data-test": "team-schedule-editor", children: [(enableGlobalFilter || enableColumnVisibility) && (jsxs("div", { className: sx(toolbarStyle$
|
|
26433
|
+
className: className, "data-test": "team-schedule-editor", children: [(enableGlobalFilter || enableColumnVisibility) && (jsxs("div", { className: sx(toolbarStyle$2), children: [enableGlobalFilter ? (jsxs("label", { className: sx(searchStyle$1), children: [jsx(SearchIcon$1, { size: 16 }), jsx("input", { type: "search", value: globalFilter, onChange: (event) => table.setGlobalFilter(event.target.value), placeholder: globalFilterPlaceholder, "aria-label": "Search trips and events", "data-test": "team-schedule-search" })] })) : (jsx("span", {})), enableColumnVisibility && (jsxs("details", { className: sx(columnMenuStyle), "data-test": "team-schedule-column-menu", children: [jsxs("summary", { children: ["Columns ", jsx(ChevronDownIcon$1, { size: 14 })] }), jsx("div", { className: sx(columnMenuListStyle), children: table
|
|
26434
26434
|
.getAllLeafColumns()
|
|
26435
26435
|
.filter((column) => column.getCanHide())
|
|
26436
26436
|
.map((column) => (jsxs("label", { children: [jsx("input", { type: "checkbox", className: sx(checkboxStyle), checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }), typeof column.columnDef.header === "string" &&
|
|
@@ -27016,7 +27016,7 @@ const TeamScheduleEditor = ({ rows, initialRows = [], opponentOptions = [], onCh
|
|
|
27016
27016
|
/** The two responsive breakpoints, spelled exactly as the stylesheet had them. */
|
|
27017
27017
|
const COMPACT = '@media (max-width: 900px)';
|
|
27018
27018
|
const NARROW = '@media (max-width: 640px)';
|
|
27019
|
-
const toolbarStyle = {
|
|
27019
|
+
const toolbarStyle$1 = {
|
|
27020
27020
|
label: 'TeamTravelCalendarViews-toolbarStyle',
|
|
27021
27021
|
display: 'flex',
|
|
27022
27022
|
minWidth: 0,
|
|
@@ -27895,7 +27895,7 @@ const sportColor = (sportCode) => {
|
|
|
27895
27895
|
* Period controls shared by the calendar views: previous, next, today, and month/week.
|
|
27896
27896
|
* Stateless -- the host owns the active date and passes the label back in.
|
|
27897
27897
|
*/
|
|
27898
|
-
const TeamTravelCalendarToolbar = ({ duration, label = '', navigation, onDurationChange, onToday, onPrevious, onNext, className = '', }) => (jsxs("div", { className: cx(sx(toolbarStyle), className), "data-test": "calendar-toolbar", children: [jsx("button", { type: "button", className: sx(todayButtonStyle), onClick: onToday, "data-test": "calendar-today", children: "Today" }), jsx(SegmentedSelector, { value: duration, size: "sm", ariaLabel: "Calendar duration", onChange: (value) => onDurationChange?.(value), options: [{ id: 'month', label: 'Month' }, { id: 'week', label: 'Week' }] }), navigation ?? (jsxs("div", { className: sx(periodNavigationStyle), children: [jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Previous ${duration}`, onClick: onPrevious, children: jsx(ChevronLeft$1, {}) }), jsx("button", { type: "button", className: sx(periodButtonStyle), children: label }), jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Next ${duration}`, onClick: onNext, children: jsx(ChevronRight$2, {}) })] }))] }));
|
|
27898
|
+
const TeamTravelCalendarToolbar = ({ duration, label = '', navigation, onDurationChange, onToday, onPrevious, onNext, className = '', }) => (jsxs("div", { className: cx(sx(toolbarStyle$1), className), "data-test": "calendar-toolbar", children: [jsx("button", { type: "button", className: sx(todayButtonStyle), onClick: onToday, "data-test": "calendar-today", children: "Today" }), jsx(SegmentedSelector, { value: duration, size: "sm", ariaLabel: "Calendar duration", onChange: (value) => onDurationChange?.(value), options: [{ id: 'month', label: 'Month' }, { id: 'week', label: 'Week' }] }), navigation ?? (jsxs("div", { className: sx(periodNavigationStyle), children: [jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Previous ${duration}`, onClick: onPrevious, children: jsx(ChevronLeft$1, {}) }), jsx("button", { type: "button", className: sx(periodButtonStyle), children: label }), jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Next ${duration}`, onClick: onNext, children: jsx(ChevronRight$2, {}) })] }))] }));
|
|
27899
27899
|
const getVisibleDates = (activeDate, duration) => {
|
|
27900
27900
|
const active = parseDate(activeDate);
|
|
27901
27901
|
if (duration === 'week') {
|
|
@@ -28040,7 +28040,7 @@ const moveTeamTravelCalendarPeriod = (activeDate, duration, amount) => {
|
|
|
28040
28040
|
* later. Injected classes tie there, so the winner would be whichever object was
|
|
28041
28041
|
* injected first. Doubling the selector on the override restores the ranking.
|
|
28042
28042
|
*/
|
|
28043
|
-
const formStyle$
|
|
28043
|
+
const formStyle$5 = {
|
|
28044
28044
|
label: 'TeamManagementForms-formStyle',
|
|
28045
28045
|
display: 'flex',
|
|
28046
28046
|
flexDirection: 'column',
|
|
@@ -28072,7 +28072,7 @@ const threeColumnGridStyle = {
|
|
|
28072
28072
|
gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
|
|
28073
28073
|
},
|
|
28074
28074
|
};
|
|
28075
|
-
const actionsStyle$
|
|
28075
|
+
const actionsStyle$3 = {
|
|
28076
28076
|
label: 'TeamManagementForms-actionsStyle',
|
|
28077
28077
|
display: 'flex',
|
|
28078
28078
|
justifyContent: 'flex-end',
|
|
@@ -28243,10 +28243,10 @@ const useManagedValues = (controlledValues, initialValues, onChange) => {
|
|
|
28243
28243
|
};
|
|
28244
28244
|
const numericValue$1 = (value) => value === '' ? '' : Number(value);
|
|
28245
28245
|
const FormShell = ({ ariaLabel, children, className = '', disabled = false, onCancel, onSubmit, showActions = true, values, }) => {
|
|
28246
|
-
const content = (jsxs(Fragment, { children: [children, showActions && (jsxs("div", { className: sx(actionsStyle$
|
|
28246
|
+
const content = (jsxs(Fragment, { children: [children, showActions && (jsxs("div", { className: sx(actionsStyle$3), children: [jsx(Button, { type: "button", variant: "secondary", onClick: onCancel, disabled: disabled, children: "Cancel" }), jsx(Button, { type: "submit", disabled: disabled, children: "Save" })] }))] }));
|
|
28247
28247
|
if (!showActions)
|
|
28248
|
-
return jsx("div", { className: cx(sx(formStyle$
|
|
28249
|
-
return (jsx("form", { "aria-label": ariaLabel, className: cx(sx(formStyle$
|
|
28248
|
+
return jsx("div", { className: cx(sx(formStyle$5), className), children: content });
|
|
28249
|
+
return (jsx("form", { "aria-label": ariaLabel, className: cx(sx(formStyle$5), className), onSubmit: (event) => {
|
|
28250
28250
|
event.preventDefault();
|
|
28251
28251
|
onSubmit?.(values);
|
|
28252
28252
|
}, children: content }));
|
|
@@ -28400,11 +28400,11 @@ const IMPORT_COPY = {
|
|
|
28400
28400
|
const TeamImportForm = ({ kind, onSubmit, onCancel, disabled = false, className = '' }) => {
|
|
28401
28401
|
const [file, setFile] = useState(null);
|
|
28402
28402
|
const copy = IMPORT_COPY[kind];
|
|
28403
|
-
return (jsxs("form", { "aria-label": `Import ${kind}`, className: cx(sx(formStyle$
|
|
28403
|
+
return (jsxs("form", { "aria-label": `Import ${kind}`, className: cx(sx(formStyle$5), className), onSubmit: (event) => {
|
|
28404
28404
|
event.preventDefault();
|
|
28405
28405
|
if (file)
|
|
28406
28406
|
onSubmit?.(file);
|
|
28407
|
-
}, children: [jsx("ol", { className: sx(instructionsStyle), children: copy.instructions.map((instruction, index) => jsxs("li", { children: [index + 1, ". ", instruction] }, instruction)) }), jsx("a", { className: sx(sampleLinkStyle), href: `/${copy.sample}`, download: true, children: copy.sample }), jsxs("label", { className: sx(fileFieldStyle), children: [jsx(UploadIcon, { size: 24 }), jsx("span", { children: file?.name ?? 'Choose an Excel spreadsheet' }), jsx("input", { "aria-label": "Spreadsheet file", type: "file", accept: ".xlsx,.xls", onChange: (event) => setFile(event.target.files?.[0] ?? null), required: true, disabled: disabled })] }), jsxs("div", { className: sx(actionsStyle$
|
|
28407
|
+
}, children: [jsx("ol", { className: sx(instructionsStyle), children: copy.instructions.map((instruction, index) => jsxs("li", { children: [index + 1, ". ", instruction] }, instruction)) }), jsx("a", { className: sx(sampleLinkStyle), href: `/${copy.sample}`, download: true, children: copy.sample }), jsxs("label", { className: sx(fileFieldStyle), children: [jsx(UploadIcon, { size: 24 }), jsx("span", { children: file?.name ?? 'Choose an Excel spreadsheet' }), jsx("input", { "aria-label": "Spreadsheet file", type: "file", accept: ".xlsx,.xls", onChange: (event) => setFile(event.target.files?.[0] ?? null), required: true, disabled: disabled })] }), jsxs("div", { className: sx(actionsStyle$3), children: [jsx(Button, { type: "button", variant: "secondary", onClick: onCancel, disabled: disabled, children: "Cancel" }), jsx(Button, { type: "submit", disabled: disabled || !file, children: "Import" })] })] }));
|
|
28408
28408
|
};
|
|
28409
28409
|
|
|
28410
28410
|
/**
|
|
@@ -28458,7 +28458,7 @@ const TravelSummaryMetrics = ({ tripsTraveled, remainingTrips, seasonTripCosts,
|
|
|
28458
28458
|
};
|
|
28459
28459
|
|
|
28460
28460
|
/** The form column: header, content/sections and footer stacked with one gap. */
|
|
28461
|
-
const formStyle$
|
|
28461
|
+
const formStyle$4 = {
|
|
28462
28462
|
label: 'TravelerForm-formStyle',
|
|
28463
28463
|
display: 'flex',
|
|
28464
28464
|
flexDirection: 'column',
|
|
@@ -28486,7 +28486,7 @@ const headerStyle$p = {
|
|
|
28486
28486
|
flexDirection: 'column',
|
|
28487
28487
|
gap: 'var(--space-1)',
|
|
28488
28488
|
};
|
|
28489
|
-
const titleStyle$
|
|
28489
|
+
const titleStyle$l = {
|
|
28490
28490
|
label: 'TravelerForm-titleStyle',
|
|
28491
28491
|
fontSize: 'var(--text-lg)',
|
|
28492
28492
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -28549,11 +28549,84 @@ const footerStyle$2 = {
|
|
|
28549
28549
|
* TravelerForm - Form layout for editing traveler/roster member details
|
|
28550
28550
|
*/
|
|
28551
28551
|
const TravelerForm = ({ values = {}, title, subtitle, children, renderNameSection, renderDetailsSection, renderPreferencesSection, footer, isLoading = false, className = '', }) => {
|
|
28552
|
-
const formClasses = cx(sx(formStyle$
|
|
28553
|
-
return (jsxs("div", { className: formClasses, children: [(title || subtitle) && (jsxs("div", { className: sx(headerStyle$p), children: [title && jsx("h2", { className: sx(titleStyle$
|
|
28552
|
+
const formClasses = cx(sx(formStyle$4), isLoading && sx(loadingStyle$1), className);
|
|
28553
|
+
return (jsxs("div", { className: formClasses, children: [(title || subtitle) && (jsxs("div", { className: sx(headerStyle$p), children: [title && jsx("h2", { className: sx(titleStyle$l), children: title }), subtitle && jsx("p", { className: sx(subtitleStyle$5), children: subtitle })] })), children ? (jsx("div", { className: sx(contentStyle$4), children: children })) : (jsxs("div", { className: sx(sectionsStyle), children: [renderNameSection && (jsxs("div", { className: sx(sectionStyle$4), children: [jsx("h3", { className: sx(sectionTitleStyle$8), children: "Name" }), jsx("div", { className: sx(sectionContentStyle), children: renderNameSection(values) })] })), renderDetailsSection && (jsxs("div", { className: sx(sectionStyle$4), children: [jsx("h3", { className: sx(sectionTitleStyle$8), children: "Details" }), jsx("div", { className: sx(sectionContentStyle), children: renderDetailsSection(values) })] })), renderPreferencesSection && (jsxs("div", { className: sx(sectionStyle$4), children: [jsx("h3", { className: sx(sectionTitleStyle$8), children: "Travel Preferences" }), jsx("div", { className: sx(sectionContentStyle), children: renderPreferencesSection(values) })] }))] })), footer && (jsx("div", { className: sx(footerStyle$2), children: footer }))] }));
|
|
28554
28554
|
};
|
|
28555
28555
|
TravelerForm.displayName = 'TravelerForm';
|
|
28556
28556
|
|
|
28557
|
+
const formStyle$3 = {
|
|
28558
|
+
label: 'ViHeaderForm-formStyle',
|
|
28559
|
+
display: 'flex',
|
|
28560
|
+
flexDirection: 'column',
|
|
28561
|
+
gap: 'var(--space-6)',
|
|
28562
|
+
fontFamily: 'var(--font-family-base)',
|
|
28563
|
+
color: 'var(--fg-1)',
|
|
28564
|
+
};
|
|
28565
|
+
const noteStyle$2 = {
|
|
28566
|
+
label: 'ViHeaderForm-noteStyle',
|
|
28567
|
+
margin: 0,
|
|
28568
|
+
fontSize: 'var(--fs-sm)',
|
|
28569
|
+
color: 'var(--fg-3)',
|
|
28570
|
+
lineHeight: 1.5,
|
|
28571
|
+
};
|
|
28572
|
+
const eyebrowNoteStyle = {
|
|
28573
|
+
label: 'ViHeaderForm-eyebrowNoteStyle',
|
|
28574
|
+
margin: 0,
|
|
28575
|
+
padding: 'var(--space-2) var(--space-3)',
|
|
28576
|
+
borderLeft: '3px solid var(--color-accent-ink)',
|
|
28577
|
+
background: 'var(--bg-subtle)',
|
|
28578
|
+
borderRadius: 'var(--radius-md)',
|
|
28579
|
+
fontSize: 'var(--fs-sm)',
|
|
28580
|
+
color: 'var(--fg-2)',
|
|
28581
|
+
};
|
|
28582
|
+
const errorStyle$1 = {
|
|
28583
|
+
label: 'ViHeaderForm-errorStyle',
|
|
28584
|
+
margin: 0,
|
|
28585
|
+
fontSize: 'var(--fs-sm)',
|
|
28586
|
+
fontWeight: 'var(--fw-medium)',
|
|
28587
|
+
color: 'var(--color-error)',
|
|
28588
|
+
};
|
|
28589
|
+
const actionsStyle$2 = {
|
|
28590
|
+
label: 'ViHeaderForm-actionsStyle',
|
|
28591
|
+
display: 'flex',
|
|
28592
|
+
justifyContent: 'flex-end',
|
|
28593
|
+
gap: 'var(--space-3)',
|
|
28594
|
+
paddingTop: 'var(--space-4)',
|
|
28595
|
+
borderTop: '1px solid var(--border-color)',
|
|
28596
|
+
};
|
|
28597
|
+
|
|
28598
|
+
/**
|
|
28599
|
+
* Editor for a virtual-invoice header: who the invoice comes from, how to reach
|
|
28600
|
+
* them, and the survey and message that go with it. An account or a branch is
|
|
28601
|
+
* required, and a branch header wins over its account's.
|
|
28602
|
+
*/
|
|
28603
|
+
const ViHeaderForm = ({ value, onSave, onCancel, saveLabel = 'Save header', className = '', }) => {
|
|
28604
|
+
const [draft, setDraft] = useState(value);
|
|
28605
|
+
const [error, setError] = useState('');
|
|
28606
|
+
const field = (key, label, extra = {}) => (jsx(FormField, { label: label, inputProps: {
|
|
28607
|
+
value: draft[key],
|
|
28608
|
+
onChange: (e) => setDraft({ ...draft, [key]: e.target.value }),
|
|
28609
|
+
'data-test': `vi-header-${String(key).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`,
|
|
28610
|
+
...extra,
|
|
28611
|
+
} }));
|
|
28612
|
+
const handleSubmit = (e) => {
|
|
28613
|
+
e.preventDefault();
|
|
28614
|
+
if (!draft.accountId.trim() && !draft.branch.trim()) {
|
|
28615
|
+
setError('Enter an Account ID or a Branch.');
|
|
28616
|
+
return;
|
|
28617
|
+
}
|
|
28618
|
+
setError('');
|
|
28619
|
+
onSave?.(draft);
|
|
28620
|
+
};
|
|
28621
|
+
return (jsxs("form", { className: cx(sx(formStyle$3), className), onSubmit: handleSubmit, noValidate: true, children: [jsx("p", { className: sx(eyebrowNoteStyle), children: "Enter an Account OR a Branch. The header configured for a branch takes precedence." }), jsxs(FormSection, { title: "Applies to", children: [jsxs(FormRow, { columns: 2, stackOnMobile: false, children: [field('accountId', 'Account ID'), field('branch', 'Branch')] }), error && (jsx("p", { className: sx(errorStyle$1), role: "alert", children: error }))] }), jsxs(FormSection, { title: "Company & contact", children: [field('companyName', 'Company name'), field('address', 'Address'), jsxs(FormRow, { columns: 3, stackOnMobile: false, children: [field('city', 'City'), field('state', 'State'), field('zipCode', 'Zip code')] }), jsxs(FormRow, { columns: 2, stackOnMobile: false, children: [field('phone', 'Phone number'), field('tollFree', 'Toll-free number'), field('afterHoursPhone', 'After-hours phone'), field('fax', 'Fax number')] })] }), jsxs(FormSection, { title: "Web & hours", children: [field('defaultWebsite', 'Default website'), jsx("p", { className: sx(noteStyle$2), children: "For headers configured by branch, the client\u2019s Portal Redirector is used instead." }), field('email', 'Email address'), field('hoursOfOperation', 'Hours of operation')] }), jsxs(FormSection, { title: "Survey Sparrow", children: [field('agentSurveyEndpoint', 'Agent survey API endpoint'), field('onlineSurveyEndpoint', 'Online survey API endpoint'), jsx(FormRow, { columns: 3, stackOnMobile: false, children: field('surveyDelayDays', 'Survey delay (days)', { type: 'number', min: 0 }) })] }), jsx(FormSection, { title: "Invoice message", children: jsx(FormField, { label: "Description", helperText: "Printed on the invoice. Paste one line at a time.", as: "textarea", textareaProps: {
|
|
28622
|
+
value: draft.description,
|
|
28623
|
+
rows: 5,
|
|
28624
|
+
onChange: (e) => setDraft({ ...draft, description: e.target.value }),
|
|
28625
|
+
'data-test': 'vi-header-description',
|
|
28626
|
+
} }) }), jsxs("div", { className: sx(actionsStyle$2), children: [jsx(Button, { type: "button", variant: "outline", onClick: onCancel, "data-test": "vi-header-cancel", children: "Cancel" }), jsx(Button, { type: "submit", variant: "primary", "data-test": "vi-header-save", children: saveLabel })] })] }));
|
|
28627
|
+
};
|
|
28628
|
+
ViHeaderForm.displayName = 'ViHeaderForm';
|
|
28629
|
+
|
|
28557
28630
|
/**
|
|
28558
28631
|
* TripTable's compiled rules.
|
|
28559
28632
|
*
|
|
@@ -28888,7 +28961,7 @@ const TripTable = ({ trips, variant = 'current', density = 'comfortable', vendor
|
|
|
28888
28961
|
* `.card:hover .chevron`), so the icon and the chevron are declared first and
|
|
28889
28962
|
* their generated class names resolved into `cardStyle` as computed keys.
|
|
28890
28963
|
*/
|
|
28891
|
-
const pageStyle$
|
|
28964
|
+
const pageStyle$u = {
|
|
28892
28965
|
label: 'AdministrationPage-pageStyle',
|
|
28893
28966
|
color: 'var(--color-ink)',
|
|
28894
28967
|
};
|
|
@@ -28943,7 +29016,7 @@ const chevronStyle = {
|
|
|
28943
29016
|
flex: '0 0 auto',
|
|
28944
29017
|
color: 'var(--border-color-dark)',
|
|
28945
29018
|
};
|
|
28946
|
-
const cardStyle$
|
|
29019
|
+
const cardStyle$6 = {
|
|
28947
29020
|
label: 'AdministrationPage-cardStyle',
|
|
28948
29021
|
display: 'flex',
|
|
28949
29022
|
alignItems: 'center',
|
|
@@ -29025,10 +29098,10 @@ const AdministrationPage = ({ activeTab = 'system', enabledTabs = ADMINISTRATION
|
|
|
29025
29098
|
const resolvedActiveTab = visibleTabs.some((tab) => tab.key === activeTab)
|
|
29026
29099
|
? activeTab
|
|
29027
29100
|
: visibleTabs[0]?.key;
|
|
29028
|
-
return jsxs("div", { className: cx(sx(pageStyle$
|
|
29101
|
+
return jsxs("div", { className: cx(sx(pageStyle$u), className), children: [jsx("header", { className: sx(headerStyle$n), children: jsx("h1", { children: "Administration\u00A0" }) }), visibleTabs.length > 0 && (jsx(TabStrip, { className: sx(tabsStyle$5), tabs: visibleTabs.map((tab) => ({ id: tab.key, label: tab.label })), activeTab: resolvedActiveTab, onTabChange: (id) => onTabChange?.(id), "aria-label": "Administration sections" })), children ?? (resolvedActiveTab === 'system' ? (jsx("div", { className: sx(cardsStyle$1), children: resolvedCards.map((card) => (jsxs("button", { type: "button", className: sx(cardStyle$6), onClick: () => onCardClick?.(card), children: [jsx("span", { className: sx(cardIconStyle$1), children: card.icon }), jsxs("span", { className: sx(cardCopyStyle), children: [jsx("span", { className: sx(cardTitleStyle$2), children: card.title }), jsx("span", { className: sx(cardDescriptionStyle$1), children: card.description })] }), jsx(ChevronRightIcon$1, { className: sx(chevronStyle), size: 14 })] }, card.key))) })) : resolvedActiveTab === 'client' ? (jsx("p", { className: sx(comingSoonStyle), children: "Client administration settings coming soon." })) : (jsx("p", { className: sx(comingSoonStyle), "data-test": "administration-empty-tabs", children: "No administration sections are available." })))] });
|
|
29029
29102
|
};
|
|
29030
29103
|
|
|
29031
|
-
const pageStyle$
|
|
29104
|
+
const pageStyle$t = {
|
|
29032
29105
|
label: 'AgentGroupTravelRequestsPage-pageStyle',
|
|
29033
29106
|
display: 'flex',
|
|
29034
29107
|
flexDirection: 'column',
|
|
@@ -29044,7 +29117,7 @@ const breadcrumbStyle$9 = {
|
|
|
29044
29117
|
alignSelf: 'flex-start',
|
|
29045
29118
|
paddingLeft: '0 !important',
|
|
29046
29119
|
};
|
|
29047
|
-
const titleStyle$
|
|
29120
|
+
const titleStyle$k = {
|
|
29048
29121
|
label: 'AgentGroupTravelRequestsPage-titleStyle',
|
|
29049
29122
|
margin: 0,
|
|
29050
29123
|
color: 'var(--fg-1)',
|
|
@@ -29065,12 +29138,12 @@ const quickLinksStyle = {
|
|
|
29065
29138
|
};
|
|
29066
29139
|
|
|
29067
29140
|
/** Hub's agent-facing Group Travel Request screen — the "Book a Trip" quick links plus the open-requests list. */
|
|
29068
|
-
const AgentGroupTravelRequestsPage = ({ title = 'Group Travel Request', requests, sports, views, today, isStmEmployee = true, onBackToBookATrip, onSubmitNewRequest, onSubmitAgentRequest, onSearchPastRequests, onShowCdsRequests, onShowActionableItems, onAdministerViews, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$
|
|
29141
|
+
const AgentGroupTravelRequestsPage = ({ title = 'Group Travel Request', requests, sports, views, today, isStmEmployee = true, onBackToBookATrip, onSubmitNewRequest, onSubmitAgentRequest, onSearchPastRequests, onShowCdsRequests, onShowActionableItems, onAdministerViews, onOpenRequest, onViewMasterTrip, onDeleteRequest, onCopyPnr, onToggleDueStatus, onSubmittedDateChange, onQuoteSentDateChange, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$t), className), "data-test": "agent-gtr-page", children: [jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$9), onClick: onBackToBookATrip, children: "Book a Trip" }), jsx("h1", { className: sx(titleStyle$k), children: title }), jsxs("ul", { className: sx(quickLinksStyle), children: [jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onSubmitNewRequest, children: "Submit a new group travel request" }) }), isStmEmployee && (jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onSubmitAgentRequest, children: "Submit a new group travel request (agent use only)" }) })), jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onSearchPastRequests, children: "Search past travel requests/Non-agent-only requests" }) }), isStmEmployee && (jsxs(Fragment, { children: [jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onShowCdsRequests, children: "Show all open CDS group travel requests" }) }), jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onShowActionableItems, children: "Show this week's actionable items" }) }), jsx("li", { children: jsx(Button, { variant: "ghost", onClick: onAdministerViews, children: "Administer your views" }) })] }))] }), jsx(AgentGroupTravelRequestsTable, { requests: requests, sports: sports, views: views, today: today, onOpenRequest: onOpenRequest, onViewMasterTrip: onViewMasterTrip, onDeleteRequest: onDeleteRequest, onCopyPnr: onCopyPnr, onToggleDueStatus: onToggleDueStatus, onSubmittedDateChange: onSubmittedDateChange, onQuoteSentDateChange: onQuoteSentDateChange })] }));
|
|
29069
29142
|
|
|
29070
29143
|
/** CarrierProfilePage's compiled rules. A straight translation: the only
|
|
29071
29144
|
* overrides are the mobile media query, which is nested into the two styles
|
|
29072
29145
|
* it repadded, and an at-rule always outranks the declaration beside it. */
|
|
29073
|
-
const pageStyle$
|
|
29146
|
+
const pageStyle$s = {
|
|
29074
29147
|
label: 'CarrierProfilePage-pageStyle',
|
|
29075
29148
|
display: 'flex',
|
|
29076
29149
|
flexDirection: 'column',
|
|
@@ -29091,7 +29164,7 @@ const headerStyle$m = {
|
|
|
29091
29164
|
flexDirection: 'column',
|
|
29092
29165
|
gap: 'var(--space-1)',
|
|
29093
29166
|
};
|
|
29094
|
-
const titleStyle$
|
|
29167
|
+
const titleStyle$j = {
|
|
29095
29168
|
label: 'CarrierProfilePage-titleStyle',
|
|
29096
29169
|
margin: 0,
|
|
29097
29170
|
color: 'var(--fg-1)',
|
|
@@ -29157,7 +29230,7 @@ const formStyle$2 = {
|
|
|
29157
29230
|
const saveStyle = {
|
|
29158
29231
|
label: 'CarrierProfilePage-saveStyle', alignSelf: 'flex-start'
|
|
29159
29232
|
};
|
|
29160
|
-
const rowActionsStyle = {
|
|
29233
|
+
const rowActionsStyle$1 = {
|
|
29161
29234
|
label: 'CarrierProfilePage-rowActionsStyle',
|
|
29162
29235
|
display: 'inline-flex',
|
|
29163
29236
|
gap: 'var(--space-1)',
|
|
@@ -29289,7 +29362,7 @@ const CarrierProfilePage = ({ carrierName, preferences: initialPreferences, cate
|
|
|
29289
29362
|
key: 'contactId',
|
|
29290
29363
|
label: 'Actions',
|
|
29291
29364
|
align: 'right',
|
|
29292
|
-
render: (_value, contact) => (jsxs("span", { className: sx(rowActionsStyle), children: [canEditContacts && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${contact.name}`, onClick: () => onEditContact?.(contact.contactId), "data-test": "carrier-contact-edit", children: jsx(EditIcon$2, { size: 16 }) })), canDeleteContacts && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${contact.name}`, onClick: () => onDeleteContact?.(contact.contactId), "data-test": "carrier-contact-delete", children: jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29365
|
+
render: (_value, contact) => (jsxs("span", { className: sx(rowActionsStyle$1), children: [canEditContacts && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${contact.name}`, onClick: () => onEditContact?.(contact.contactId), "data-test": "carrier-contact-edit", children: jsx(EditIcon$2, { size: 16 }) })), canDeleteContacts && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${contact.name}`, onClick: () => onDeleteContact?.(contact.contactId), "data-test": "carrier-contact-delete", children: jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29293
29366
|
}] : []),
|
|
29294
29367
|
];
|
|
29295
29368
|
const aircraftColumns = [
|
|
@@ -29318,15 +29391,15 @@ const CarrierProfilePage = ({ carrierName, preferences: initialPreferences, cate
|
|
|
29318
29391
|
key: 'aircraftId',
|
|
29319
29392
|
label: 'Actions',
|
|
29320
29393
|
align: 'right',
|
|
29321
|
-
render: (_value, item) => (jsxs("span", { className: sx(rowActionsStyle), children: [canEditAircraft && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${item.name}`, onClick: () => onEditAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-edit", children: jsx(EditIcon$2, { size: 16 }) })), canDeleteAircraft && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${item.name}`, onClick: () => onDeleteAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-delete", children: jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29394
|
+
render: (_value, item) => (jsxs("span", { className: sx(rowActionsStyle$1), children: [canEditAircraft && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${item.name}`, onClick: () => onEditAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-edit", children: jsx(EditIcon$2, { size: 16 }) })), canDeleteAircraft && (jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${item.name}`, onClick: () => onDeleteAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-delete", children: jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29322
29395
|
}] : []),
|
|
29323
29396
|
];
|
|
29324
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
29397
|
+
return (jsxs("div", { className: cx(sx(pageStyle$s), className), "data-test": "carrier-profile-page", children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$8), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "carrier-profile-back", children: backLabel })), jsxs("header", { className: sx(headerStyle$m), children: [jsx("h1", { className: sx(titleStyle$j), children: "My Profile" }), jsx("p", { className: sx(descriptionStyle$8), children: "Keep your default bid values, bid contacts, and aircraft up to date \u2014 STM quotes you from exactly what is here." })] }), jsx(Segment, { options: TAB_OPTIONS$2, value: tab, onChange: selectTab, "aria-label": "Profile section", className: sx(tabsStyle$4) }), tab === 'profile' && (jsxs("section", { className: sx(panelStyle$1), "aria-label": "Preferences", children: [jsx("h2", { className: sx(sectionTitleStyle$7), children: "Preferences" }), jsx("p", { className: sx(sectionCopyStyle$1), children: "These values pre-fill every bid response form, so you only change them when a bid differs from your norm." }), jsxs("div", { className: sx(formStyle$2), children: [jsx(Input, { id: "carrier-available-seats", type: "number", label: "# of Available Seats", value: preferences.availableSeats, disabled: !canSavePreferences, onChange: (event) => updatePreference('availableSeats', event.target.value), "data-test": "carrier-available-seats" }), jsx(Input, { id: "carrier-max-payload", type: "number", label: "Max Payload (lbs)", value: preferences.maxPayload, disabled: !canSavePreferences, onChange: (event) => updatePreference('maxPayload', event.target.value), "data-test": "carrier-max-payload" }), jsx(Input, { id: "carrier-fuel-base", label: "Fuel Base ($)", inputMode: "decimal", value: preferences.fuelBase, disabled: !canSavePreferences, onChange: (event) => updatePreference('fuelBase', event.target.value), "data-test": "carrier-fuel-base" }), jsx(Select, { id: "carrier-catering", label: "Catering Options Included", placeholder: "Select a catering option", options: cateringOptions.map((option) => ({ value: option, label: option })), value: preferences.cateringOptions, disabled: !canSavePreferences, onChange: (event) => updatePreference('cateringOptions', event.target.value), "data-test": "carrier-catering" })] }), canSavePreferences && (jsx(Button, { className: sx(saveStyle), onClick: () => onSavePreferences?.(preferences), "data-test": "carrier-save-preferences", children: "Save" }))] })), tab === 'contacts' && (jsxs("section", { className: sx(panelStyle$1), "aria-label": "Contacts", children: [jsxs("h2", { className: sx(sectionTitleStyle$7), children: [carrierName, " contacts"] }), jsx(Table, { columns: contactColumns, data: contacts, rowKey: "contactId", emptyContent: jsx(EmptyState$1, { size: "sm", title: "No contacts currently exist.", description: "Add at least one bid contact so STM knows who to email about new opportunities." }) }), canAddContact && (jsxs(Fragment, { children: [jsx("h3", { className: sx(subTitleStyle), children: "Add a contact" }), jsxs("div", { className: sx(formStyle$2), children: [jsx(Input, { id: "carrier-contact-name", label: "Name", maxLength: 50, required: true, value: newContact.name, error: contactErrors.name, onChange: (event) => setNewContact({ ...newContact, name: event.target.value }), "data-test": "carrier-contact-name" }), jsx(Select, { id: "carrier-contact-type", label: "Contact type", options: contactTypes.map((type) => ({ value: type, label: type })), value: newContact.contactType, onChange: (event) => setNewContact({ ...newContact, contactType: event.target.value }), "data-test": "carrier-contact-type" }), jsx(Input, { id: "carrier-contact-phone", label: "Work phone", maxLength: 20, required: true, value: newContact.workPhone, error: contactErrors.workPhone, onChange: (event) => setNewContact({ ...newContact, workPhone: event.target.value }), "data-test": "carrier-contact-phone" }), jsx(Input, { id: "carrier-contact-email", type: "email", label: "Email address", maxLength: 255, required: true, value: newContact.email, error: contactErrors.email, onChange: (event) => setNewContact({ ...newContact, email: event.target.value }), "data-test": "carrier-contact-email" })] }), jsx(Checkbox, { label: "Contact for new bids", helperText: "New bid opportunities are emailed to every contact with this checked.", checked: newContact.bidContact, onChange: (event) => setNewContact({ ...newContact, bidContact: event.target.checked }), "data-test": "carrier-contact-bid-contact" }), jsx(Button, { className: sx(saveStyle), onClick: submitContact, "data-test": "carrier-contact-submit", children: "Add contact" })] }))] })), tab === 'aircraft' && (jsxs("section", { className: sx(panelStyle$1), "aria-label": "Aircraft", children: [jsx("h2", { className: sx(sectionTitleStyle$7), children: "Aircraft and seat maps" }), jsx("p", { className: sx(sectionCopyStyle$1), children: "Only aircraft listed here can be offered on a bid, and their seat counts and payloads pre-fill the bid response form." }), jsx(Table, { columns: aircraftColumns, data: aircraft, rowKey: "aircraftId", emptyContent: jsx(EmptyState$1, { size: "sm", title: "No aircraft on file", description: "Add the airframes you operate so they appear in the Aircraft Type picker when you bid." }) })] }))] }));
|
|
29325
29398
|
};
|
|
29326
29399
|
CarrierProfilePage.displayName = 'CarrierProfilePage';
|
|
29327
29400
|
|
|
29328
29401
|
/** ChampionshipBidDetailPage's compiled rules. */
|
|
29329
|
-
const pageStyle$
|
|
29402
|
+
const pageStyle$r = {
|
|
29330
29403
|
label: 'ChampionshipBidDetailPage-pageStyle',
|
|
29331
29404
|
display: 'flex',
|
|
29332
29405
|
flexDirection: 'column',
|
|
@@ -29352,7 +29425,7 @@ const headerStyle$l = {
|
|
|
29352
29425
|
flexDirection: 'column',
|
|
29353
29426
|
},
|
|
29354
29427
|
};
|
|
29355
|
-
const eyebrowStyle$
|
|
29428
|
+
const eyebrowStyle$7 = {
|
|
29356
29429
|
label: 'ChampionshipBidDetailPage-eyebrowStyle',
|
|
29357
29430
|
color: 'var(--fg-4)',
|
|
29358
29431
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29360,7 +29433,7 @@ const eyebrowStyle$6 = {
|
|
|
29360
29433
|
letterSpacing: '.06em',
|
|
29361
29434
|
textTransform: 'uppercase',
|
|
29362
29435
|
};
|
|
29363
|
-
const titleStyle$
|
|
29436
|
+
const titleStyle$i = {
|
|
29364
29437
|
label: 'ChampionshipBidDetailPage-titleStyle',
|
|
29365
29438
|
margin: 'var(--space-1) 0 0',
|
|
29366
29439
|
color: 'var(--fg-1)',
|
|
@@ -29481,7 +29554,7 @@ const ChampionshipBidDetailPage = ({ bid, loading = false, backLabel = 'NCAA Cha
|
|
|
29481
29554
|
const currency = useMemo(() => new Intl.NumberFormat(locale, { style: 'currency', currency: 'USD' }), [locale]);
|
|
29482
29555
|
const numbers = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
29483
29556
|
const status = bid ? detailStatus(bid) : undefined;
|
|
29484
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
29557
|
+
return (jsxs("div", { className: cx(sx(pageStyle$r), className), "data-test": "championship-bid-detail-page", children: [onBack && (jsx(Button, { type: "button", variant: "ghost", size: "sm", className: sx(breadcrumbStyle$7), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "championship-bid-detail-back", children: backLabel })), loading ? (jsxs("div", { className: sx(loadingStyle), "data-test": "championship-bid-detail-loading", children: [jsx(Spinner, { size: "lg", label: "Loading championship bid detail" }), jsx("p", { children: "Loading championship bid detail\u2026" })] })) : bid && status ? (jsxs(Fragment, { children: [jsxs("header", { className: sx(headerStyle$l), children: [jsxs("div", { children: [jsxs("span", { className: sx(eyebrowStyle$7), children: ["NCAA Championship bid \u00B7 ", bid.bidId] }), jsx("h1", { className: sx(titleStyle$i), children: bid.bidName })] }), jsx("span", { "data-test": "championship-bid-detail-status", children: jsx(StatusBadge, { status: status.status, label: status.label }) })] }), jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-details-heading", children: [jsx("h2", { id: "championship-bid-details-heading", children: "Bid details" }), jsxs("dl", { className: sx(factsStyle$4), children: [jsxs("div", { children: [jsx("dt", { children: "Aircraft" }), jsx("dd", { children: bid.aircraftName || 'Not provided' })] }), jsxs("div", { children: [jsx("dt", { children: "Seats" }), jsx("dd", { children: bid.seats === undefined ? 'Not provided' : numbers.format(bid.seats) })] }), jsxs("div", { className: sx(totalFactStyle$1), children: [jsx("dt", { children: "Total cost" }), jsx("dd", { "data-test": "championship-bid-detail-total", children: bid.totalCost === undefined ? 'Not provided' : currency.format(bid.totalCost) })] }), jsxs("div", { children: [jsx("dt", { children: "Cities" }), jsx("dd", { children: bid.cities || 'Not provided' })] })] })] }), jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-notes-heading", children: [jsx("h2", { id: "championship-bid-notes-heading", children: "Carrier notes" }), jsxs("div", { className: sx(notesGridStyle), children: [jsxs("div", { children: [jsx("h3", { children: "Restrictions" }), jsx("p", { children: bid.restrictions || 'No restrictions provided.' })] }), jsxs("div", { children: [jsx("h3", { children: "Comments" }), jsx("p", { children: bid.comments || 'No comments provided.' })] })] })] }), jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-contract-heading", children: [jsx("h2", { id: "championship-bid-contract-heading", children: "Contract" }), jsxs("div", { className: sx(contractStyle), "data-test": "championship-bid-detail-contract", children: [jsx(DocumentIcon, { size: 20, "aria-hidden": "true" }), jsx("span", { children: bid.contractFileName || 'No contract on file' })] })] })] })) : (jsx("div", { "data-test": "championship-bid-detail-empty", children: jsx(EmptyState$1, { title: "Championship bid detail unavailable", description: "Return to the championship queue and select an available opportunity.", icon: jsx(DocumentIcon, { size: 30 }) }) }))] }));
|
|
29485
29558
|
};
|
|
29486
29559
|
ChampionshipBidDetailPage.displayName = 'ChampionshipBidDetailPage';
|
|
29487
29560
|
|
|
@@ -29493,7 +29566,7 @@ ChampionshipBidDetailPage.displayName = 'ChampionshipBidDetailPage';
|
|
|
29493
29566
|
* declaration block in the sheet; they are separate elements, so each keeps its
|
|
29494
29567
|
* own object.
|
|
29495
29568
|
*/
|
|
29496
|
-
const pageStyle$
|
|
29569
|
+
const pageStyle$q = {
|
|
29497
29570
|
label: 'ChampionshipBidsPage-pageStyle',
|
|
29498
29571
|
display: 'flex',
|
|
29499
29572
|
flexDirection: 'column',
|
|
@@ -29514,7 +29587,7 @@ const headerStyle$k = {
|
|
|
29514
29587
|
flexDirection: 'column',
|
|
29515
29588
|
gap: 'var(--space-1)',
|
|
29516
29589
|
};
|
|
29517
|
-
const titleStyle$
|
|
29590
|
+
const titleStyle$h = {
|
|
29518
29591
|
label: 'ChampionshipBidsPage-titleStyle',
|
|
29519
29592
|
margin: 0,
|
|
29520
29593
|
color: 'var(--fg-1)',
|
|
@@ -29692,7 +29765,7 @@ const ChampionshipBidsPage = ({ bids, bidType: controlledBidType, defaultBidType
|
|
|
29692
29765
|
render: (_value, bid) => onOpenBid ? (jsx(Button, { variant: "outline", size: "sm", onClick: () => onOpenBid(bid.bidId), "data-test": "championship-rebid", children: "Bid anyway" })) : jsx("span", { className: sx(mutedStyle), children: "\u2014" }),
|
|
29693
29766
|
});
|
|
29694
29767
|
}
|
|
29695
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
29768
|
+
return (jsxs("div", { className: cx(sx(pageStyle$q), className), "data-test": "championship-bids-page", children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$6), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "championship-bids-back", children: backLabel })), jsxs("header", { className: sx(headerStyle$k), children: [jsx("h1", { className: sx(titleStyle$h), children: CHAMPIONSHIP_HEADINGS[bidType] }), jsx("p", { className: sx(descriptionStyle$7), children: "NCAA championship charter opportunities released to you. Award confirmations and signed contracts live in the Awarded queue." })] }), jsx(Segment, { options: TAB_OPTIONS$1, value: bidType, onChange: selectBidType, "aria-label": "Championship bid queue", className: sx(tabsStyle$3) }), jsx(Table, { columns: columns, data: pageBids, rowKey: "bidId", loading: loading, emptyContent: jsx(EmptyState$1, { size: "sm", title: "No such bids currently exist.", description: "Championship opportunities appear here as soon as the NCAA releases them to your carrier." }) }), jsx(Pagination, { page: currentPage, pageSize: pageSize, totalItems: bids.length, itemLabel: "bids", ariaLabel: "Championship bids pagination", onPageChange: setPage, onPageSizeChange: (nextSize) => {
|
|
29696
29769
|
setPageSize(nextSize);
|
|
29697
29770
|
setPage(1);
|
|
29698
29771
|
} })] }));
|
|
@@ -29707,7 +29780,7 @@ ChampionshipBidsPage.displayName = 'ChampionshipBidsPage';
|
|
|
29707
29780
|
* eye on is `.breadcrumb`'s `!important`, which overrides the Breadcrumb
|
|
29708
29781
|
* component's own padding and has to survive the move verbatim.
|
|
29709
29782
|
*/
|
|
29710
|
-
const pageStyle$
|
|
29783
|
+
const pageStyle$p = {
|
|
29711
29784
|
label: 'CharterBidResponsePage-pageStyle',
|
|
29712
29785
|
display: 'flex',
|
|
29713
29786
|
flexDirection: 'column',
|
|
@@ -29728,7 +29801,7 @@ const headerStyle$j = {
|
|
|
29728
29801
|
flexDirection: 'column',
|
|
29729
29802
|
gap: 'var(--space-1)',
|
|
29730
29803
|
};
|
|
29731
|
-
const eyebrowStyle$
|
|
29804
|
+
const eyebrowStyle$6 = {
|
|
29732
29805
|
label: 'CharterBidResponsePage-eyebrowStyle',
|
|
29733
29806
|
color: 'var(--fg-4)',
|
|
29734
29807
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29736,7 +29809,7 @@ const eyebrowStyle$5 = {
|
|
|
29736
29809
|
letterSpacing: '0.06em',
|
|
29737
29810
|
textTransform: 'uppercase',
|
|
29738
29811
|
};
|
|
29739
|
-
const titleStyle$
|
|
29812
|
+
const titleStyle$g = {
|
|
29740
29813
|
label: 'CharterBidResponsePage-titleStyle',
|
|
29741
29814
|
margin: 0,
|
|
29742
29815
|
color: 'var(--fg-1)',
|
|
@@ -29855,12 +29928,12 @@ const CharterBidResponsePage = ({ program, trips, accountName, tripLevel = true,
|
|
|
29855
29928
|
const blockedReason = noBid || pricedInputs
|
|
29856
29929
|
? undefined
|
|
29857
29930
|
: 'Price the trip with the calculator before submitting, or tick “No Bid” to decline.';
|
|
29858
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
29931
|
+
return (jsxs("div", { className: cx(sx(pageStyle$p), className), "data-test": "charter-bid-response-page", children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$5), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charter-bid-back", children: backLabel })), jsxs("header", { className: sx(headerStyle$j), children: [jsx("span", { className: sx(eyebrowStyle$6), children: "Bid response" }), jsx("h1", { className: sx(titleStyle$g), children: tripLevel ? trips[0]?.tripName : program.bidName })] }), jsxs("section", { className: sx(summaryStyle$3), "aria-label": "Team overview", children: [jsx("h2", { className: sx(sectionTitleStyle$6), children: "Team Overview" }), jsxs("dl", { className: sx(factsStyle$3), children: [jsxs("div", { children: [jsx("dt", { children: "Team" }), jsx("dd", { children: accountName })] }), jsxs("div", { children: [jsx("dt", { children: "Sport" }), jsx("dd", { children: program.sport })] }), jsxs("div", { children: [jsx("dt", { children: "Season" }), jsx("dd", { children: program.season })] }), jsxs("div", { children: [jsx("dt", { children: "Year" }), jsx("dd", { children: program.year })] }), jsxs("div", { children: [jsx("dt", { children: "Due Date" }), jsx("dd", { children: formatDate$3(program.dueDate, locale) })] })] })] }), trips.map((trip, index) => (jsxs("section", { className: sx(summaryStyle$3), "aria-label": `Trip ${index + 1}`, children: [jsxs("h2", { className: sx(sectionTitleStyle$6), children: ["Trip ", index + 1] }), jsxs("p", { className: sx(tripMetaStyle), children: [jsxs("span", { children: [jsx("strong", { children: "Bid Type:" }), " ", trip.bidType] }), acmiCarrier && requestedCarrier && (jsxs("span", { "data-test": "charter-bid-requested-carrier", children: [jsx("strong", { children: "Requested Carrier:" }), " ", requestedCarrier] }))] }), jsxs("dl", { className: sx(factsStyle$3), children: [jsxs("div", { children: [jsx("dt", { children: "Depart Date" }), jsx("dd", { children: formatDate$3(trip.departureDate, locale) })] }), jsxs("div", { children: [jsx("dt", { children: "Travel Party Size" }), jsx("dd", { children: trip.travelPartySize })] }), jsxs("div", { children: [jsx("dt", { children: "Route" }), jsx("dd", { children: trip.route })] }), jsxs("div", { children: [jsx("dt", { children: "Expires" }), jsx("dd", { children: formatDate$3(trip.expirationDate, locale) })] })] })] }, trip.tripGuid))), jsxs("section", { className: sx(calculatorStyle), "aria-label": "ACMI calculator", children: [jsxs("div", { className: sx(calculatorHeaderStyle), children: [jsx("h2", { className: sx(sectionTitleStyle$6), children: "Price this trip" }), jsx("p", { className: sx(sectionCopyStyle), children: "Every bid is priced here, so the total you submit is always built from the same carrier, aircraft, fuel, and leg inputs." })] }), noBid ? (jsx(Alert, { variant: "warning", title: "You are declining this opportunity", children: "Pricing is switched off while \u201CNo Bid\u201D is ticked. Untick it to build a quote instead." })) : (jsx(AcmiQuoteCalculator, { defaultInputs: defaultInputs, result: acmiResult, onCalculate: handleCalculate, locale: locale }))] }), jsxs("div", { className: sx(submitBarStyle), children: [jsx(Checkbox, { label: "No Bid Submitted for this Request", helperText: "Declines the opportunity. Pricing is switched off and nothing is quoted.", checked: noBid, onChange: (event) => setNoBid(event.target.checked), "data-test": "charter-bid-no-bid" }), jsx(Button, { fullWidth: true, loading: submitting, disabled: Boolean(blockedReason), onClick: () => onSubmitBid?.({ inputs: noBid ? null : pricedInputs, noBid }), "data-test": "charter-bid-submit", children: noBid ? 'Submit No Bid' : 'Submit Bid' }), blockedReason && (jsx("p", { className: sx(blockedReasonStyle$1), "data-test": "charter-bid-blocked-reason", children: blockedReason }))] })] }));
|
|
29859
29932
|
};
|
|
29860
29933
|
CharterBidResponsePage.displayName = 'CharterBidResponsePage';
|
|
29861
29934
|
|
|
29862
29935
|
/** CharterBidViewPage's compiled rules. */
|
|
29863
|
-
const pageStyle$
|
|
29936
|
+
const pageStyle$o = {
|
|
29864
29937
|
label: 'CharterBidViewPage-pageStyle',
|
|
29865
29938
|
display: 'flex',
|
|
29866
29939
|
flexDirection: 'column',
|
|
@@ -29881,7 +29954,7 @@ const headerStyle$i = {
|
|
|
29881
29954
|
flexDirection: 'column',
|
|
29882
29955
|
gap: 'var(--space-1)',
|
|
29883
29956
|
};
|
|
29884
|
-
const eyebrowStyle$
|
|
29957
|
+
const eyebrowStyle$5 = {
|
|
29885
29958
|
label: 'CharterBidViewPage-eyebrowStyle',
|
|
29886
29959
|
color: 'var(--fg-4)',
|
|
29887
29960
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29889,7 +29962,7 @@ const eyebrowStyle$4 = {
|
|
|
29889
29962
|
letterSpacing: '0.06em',
|
|
29890
29963
|
textTransform: 'uppercase',
|
|
29891
29964
|
};
|
|
29892
|
-
const titleStyle$
|
|
29965
|
+
const titleStyle$f = {
|
|
29893
29966
|
label: 'CharterBidViewPage-titleStyle',
|
|
29894
29967
|
margin: 0,
|
|
29895
29968
|
color: 'var(--fg-1)',
|
|
@@ -30044,7 +30117,7 @@ const SUBMISSION_LABELS = {
|
|
|
30044
30117
|
const CharterBidViewPage = ({ program, trip, bids = [], processingSubmission, onRefresh, backLabel = 'Regular Season Bids', onBack, locale = 'en-US', className = '', }) => {
|
|
30045
30118
|
const currency = useMemo(() => new Intl.NumberFormat(locale, { style: 'currency', currency: 'USD' }), [locale]);
|
|
30046
30119
|
const numbers = useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
30047
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
30120
|
+
return (jsxs("div", { className: cx(sx(pageStyle$o), className), "data-test": "charter-bid-view-page", children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$4), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charter-bid-view-back", children: backLabel })), jsxs("header", { className: sx(headerStyle$i), children: [jsx("span", { className: sx(eyebrowStyle$5), children: "Bid response" }), jsx("h1", { className: sx(titleStyle$f), children: trip ? trip.tripName : program.bidName }), jsxs("p", { className: sx(subtitleStyle$4), children: [program.team, " \u00B7 ", program.sport, " \u00B7 ", program.season, " ", program.year] })] }), bids.length > 0 && (jsx("ol", { className: sx(bidsStyle), children: bids.map((bid, index) => (jsxs("li", { className: sx(bidStyle), "data-test": "charter-submitted-bid", children: [jsxs("div", { className: sx(bidHeaderStyle), children: [jsxs("h2", { className: sx(bidTitleStyle), children: ["Bid ", index + 1] }), jsx(StatusBadge, { status: "submitted" })] }), jsxs("dl", { className: sx(factsStyle$2), children: [jsxs("div", { children: [jsx("dt", { children: "Seats" }), jsx("dd", { children: bid.seats })] }), jsxs("div", { children: [jsx("dt", { children: "Max Payload (lbs)" }), jsx("dd", { children: numbers.format(bid.maxPayloadLbs) })] }), jsxs("div", { children: [jsx("dt", { children: "Fuel Base ($)" }), jsx("dd", { children: currency.format(bid.fuelBasePrice) })] }), jsxs("div", { className: sx(totalFactStyle), children: [jsx("dt", { children: "Total Cost ($)" }), jsx("dd", { "data-test": "charter-bid-total", children: currency.format(bid.totalCost) })] }), jsxs("div", { children: [jsx("dt", { children: "Catering Options" }), jsx("dd", { children: bid.cateringAvailable })] })] }), bid.notesFromOperator && bid.notesFromOperator.length > 0 && (jsxs("div", { className: sx(notesStyle), children: [jsx("h3", { className: sx(notesTitleStyle), children: "Notes from Operator" }), jsx("ul", { className: sx(notesListStyle), "data-test": "charter-bid-notes", children: bid.notesFromOperator.map((note) => (jsx("li", { children: note }, note))) })] }))] }, bid.id))) })), bids.length === 0 && processingSubmission && (jsxs("div", { className: sx(processingStyle), "data-test": "charter-bid-processing", children: [jsx(Spinner, { size: "lg", label: "Parsing your submission" }), jsx("h2", { className: sx(processingTitleStyle), children: "We are still reading your bid" }), jsxs("p", { className: sx(processingCopyStyle), children: ["Your ", SUBMISSION_LABELS[processingSubmission], " arrived and is being parsed into a quote. This normally takes a couple of minutes \u2014 nothing is lost while it runs, and you do not need to submit it again."] }), onRefresh && (jsx(Button, { variant: "outline", size: "sm", onClick: onRefresh, "data-test": "charter-bid-refresh", children: "Check again" }))] })), bids.length === 0 && !processingSubmission && (jsx(EmptyState$1, { title: "No bid submitted for this opportunity.", description: "Nothing has been received against this trip yet. Submit a bid from the Open queue while it is still live." }))] }));
|
|
30048
30121
|
};
|
|
30049
30122
|
CharterBidViewPage.displayName = 'CharterBidViewPage';
|
|
30050
30123
|
|
|
@@ -30057,7 +30130,7 @@ CharterBidViewPage.displayName = 'CharterBidViewPage';
|
|
|
30057
30130
|
* members here, with the group's declarations first and the member's own after,
|
|
30058
30131
|
* so the last value still wins.
|
|
30059
30132
|
*/
|
|
30060
|
-
const pageStyle$
|
|
30133
|
+
const pageStyle$n = {
|
|
30061
30134
|
label: 'CharterManifestPage-pageStyle',
|
|
30062
30135
|
display: 'flex',
|
|
30063
30136
|
flexDirection: 'column',
|
|
@@ -30192,7 +30265,7 @@ const railStyle = {
|
|
|
30192
30265
|
width: '100%',
|
|
30193
30266
|
},
|
|
30194
30267
|
};
|
|
30195
|
-
const eyebrowStyle$
|
|
30268
|
+
const eyebrowStyle$4 = {
|
|
30196
30269
|
label: 'CharterManifestPage-eyebrowStyle',
|
|
30197
30270
|
marginBottom: 8,
|
|
30198
30271
|
color: 'var(--color-slate)',
|
|
@@ -30477,7 +30550,7 @@ const CharterManifestPage = ({ tripName, travelStartDate, travelEndDate, seats,
|
|
|
30477
30550
|
}
|
|
30478
30551
|
return a.lastName.localeCompare(b.lastName);
|
|
30479
30552
|
}), [passengers, sort]);
|
|
30480
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
30553
|
+
return (jsxs("div", { className: cx(sx(pageStyle$n), className), "data-screen-label": "Charter Trip Manifest", children: [jsxs("header", { className: sx(headerStyle$h), children: [jsxs("div", { className: sx(headerRowStyle$1), children: [jsx("button", { type: "button", "aria-label": "Back", className: sx(backStyle), onClick: onBack, children: jsx(ChevronLeftIcon, { size: 28 }) }), jsxs("h1", { children: [jsx("strong", { children: "Manifest" }), jsx(ChevronRightIcon$1, { size: 24 }), jsx("span", { children: tripName })] }), jsxs("div", { className: sx(headerActionsStyle), children: [jsx(StatusPill, { sendState: sendState, locked: locked }), jsx(Button, { variant: "outline", leftIcon: jsx(DocumentIcon, { size: 16 }), disabled: carrierName === 'No carrier selected', onClick: onGenerateFile, children: "Generate File" })] })] }), (travelStartDate || travelEndDate) && (jsxs("div", { className: sx(dateRowStyle), children: [jsx("span", { children: formatDate$2(travelStartDate) }), jsx("span", { className: sx(dateLineStyle), children: "\u25B6" }), jsx("span", { children: formatDate$2(travelEndDate) })] })), jsxs("div", { className: sx(metaRowStyle), children: [jsxs("span", { children: [jsx(PlaneIcon$3, { size: 16 }), seats, " seats"] }), jsxs("span", { children: [jsx(CubeIcon, { size: 16 }), "Payload limit ", payloadLimit.toLocaleString(), " lb"] })] })] }), jsxs("div", { className: sx(layoutStyle), children: [jsxs("aside", { className: sx(railStyle), children: [jsxs("div", { children: [jsx("div", { className: sx(eyebrowStyle$4), children: "Flight Manifest" }), jsx("div", { className: sx(scopeListStyle), children: [{ id: 'all', label: 'Full Trip', detail: 'All flight segments' }, ...segments].map((item) => (jsxs("button", { type: "button", className: cx(sx(scopeStyle), scope === item.id ? sx(activeScopeStyle) : ''), onClick: () => setScope(item.id), children: [jsx("strong", { children: item.label }), jsx("span", { children: item.detail })] }, item.id))) })] }), segments.length > 0 && (jsx(Button, { variant: "outline", size: "sm", disabled: locked, onClick: onSplitSegments, children: "Split by Segment" })), jsxs("div", { className: sx(carrierCardStyle), children: [jsx("div", { className: sx(eyebrowStyle$4), children: "Carrier" }), jsx("strong", { children: carrierName }), jsx("p", { children: carrierNote }), jsx(Button, { variant: "outline", size: "sm", fullWidth: true, disabled: locked, leftIcon: jsx(SettingsIcon, { size: 15 }), onClick: onChangeCarrier, children: "Change Carrier" })] })] }), jsxs("main", { className: sx(mainStyle$2), children: [jsx("section", { className: sx(capacityCardStyle), children: jsx(ManifestCapacityStats, { paxCount: passengers.length, seats: seats, paxWeight: passengerWeight, cargoWeight: cargoWeight, payloadLimit: payloadLimit }) }), jsxs("div", { className: sx(viewRowStyle), children: [jsx(ManifestViewToggle, { view: view, onView: setView, paxCount: passengers.length, eqCount: equipment.length, locked: locked }), locked && jsx("span", { className: sx(lockedMessageStyle), children: "Locked \u2014 coordinate any changes directly with the carrier." })] }), view === 'passengers' ? (jsxs("section", { children: [!locked && (jsxs("div", { className: sx(tableActionsStyle), children: [jsxs("strong", { children: [passengers.length, " Passengers"] }), jsxs("div", { children: [jsx("span", { children: "Order by" }), jsx("span", { className: sx(sortToggleStyle), children: ['name', 'type'].map((option) => (jsx("button", { type: "button", className: sort === option ? sx(activeSortStyle) : '', onClick: () => setSort(option), children: option }, option))) }), jsx(Button, { size: "sm", leftIcon: jsx(PlusIcon$2, { size: 15 }), onClick: onAddPassengers, children: "Add Passengers" })] })] })), jsx("div", { className: sx(tableWrapStyle$3), children: jsxs("table", { children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { children: "#" }), jsx("th", { children: "Passenger" }), jsx("th", { children: "Type" }), jsx("th", { children: "TSA Screening" }), jsx("th", { children: "Personal" }), jsx("th", { children: "Carry-On" }), jsx("th", { children: "Checked" }), jsx("th", { children: "Seat" }), jsx("th", {})] }) }), jsxs("tbody", { children: [!sortedPassengers.length && jsx("tr", { children: jsx("td", { colSpan: 9, className: sx(emptyStyle$3), children: "No passengers on this manifest yet. Add passengers from the master list." }) }), sortedPassengers.map((passenger, index) => (jsxs("tr", { children: [jsx("td", { children: index + 1 }), jsxs("td", { children: [jsx("strong", { children: passenger.lastName }), jsxs("span", { children: [", ", passenger.firstName] })] }), jsx("td", { children: jsx(TypeTag, { type: passenger.travelerType }) }), jsx("td", { children: passenger.screeningType || '—' }), jsxs("td", { children: [passenger.personalWeight ?? 0, " lb"] }), jsxs("td", { children: [passenger.carryOnWeight ?? 0, " lb"] }), jsxs("td", { children: [passenger.checkedWeight ?? 0, " lb"] }), jsx("td", { children: passenger.seatAssignment || '—' }), jsx("td", { children: !locked && jsx("button", { type: "button", "aria-label": `Remove ${passenger.firstName} ${passenger.lastName}`, className: sx(removeStyle), onClick: () => onRemovePassenger?.(passenger), children: jsx(TrashIcon$2, { size: 16 }) }) })] }, passenger.id)))] })] }) })] })) : (jsxs("section", { children: [!locked && jsxs("div", { className: sx(tableActionsStyle), children: [jsxs("strong", { children: [equipment.length, " Equipment Items"] }), jsx(Button, { size: "sm", leftIcon: jsx(PlusIcon$2, { size: 15 }), onClick: onAddEquipment, children: "Add Equipment" })] }), jsx("div", { className: sx(tableWrapStyle$3), children: jsxs("table", { children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { children: "Equipment" }), jsx("th", { children: "Quantity" }), jsx("th", { children: "Weight" }), jsx("th", { children: "Total" }), jsx("th", {})] }) }), jsx("tbody", { children: equipment.map((item) => jsxs("tr", { children: [jsx("td", { children: jsx("strong", { children: item.name }) }), jsx("td", { children: item.quantity }), jsxs("td", { children: [item.weight.toLocaleString(), " lb"] }), jsxs("td", { children: [(item.quantity * item.weight).toLocaleString(), " lb"] }), jsx("td", { children: !locked && jsx("button", { type: "button", "aria-label": `Remove ${item.name}`, className: sx(removeStyle), onClick: () => onRemoveEquipment?.(item), children: jsx(TrashIcon$2, { size: 16 }) }) })] }, item.id)) })] }) })] })), !locked && (jsxs("section", { className: sx(finalizeStyle), children: [jsx(StatusPill, { sendState: sendState, locked: false }), jsx("p", { children: sendState === 'initial-sent' ? 'Initial manifest sent. The final manifest may be sent within 3 days of departure.' : 'No manifest has been transmitted to the carrier yet.' }), jsxs("div", { className: sx(finalizeActionsStyle), children: [sendState === 'none' && jsx(Button, { onClick: onSendInitial, children: "Send Initial Manifest" }), sendState === 'initial-sent' && jsxs(Fragment, { children: [jsx(Button, { onClick: onSendFinal, children: "Send Final Manifest" }), jsx(Button, { variant: "ghost", size: "sm", onClick: onUndoInitial, children: "Undo initial" })] })] })] }))] })] })] }));
|
|
30481
30554
|
};
|
|
30482
30555
|
|
|
30483
30556
|
/**
|
|
@@ -30496,7 +30569,7 @@ const mutedCopy = {
|
|
|
30496
30569
|
margin: 0,
|
|
30497
30570
|
color: 'var(--color-slate)',
|
|
30498
30571
|
};
|
|
30499
|
-
const pageStyle$
|
|
30572
|
+
const pageStyle$m = {
|
|
30500
30573
|
label: 'ChartersAccessManagementPage-pageStyle',
|
|
30501
30574
|
maxWidth: 1180,
|
|
30502
30575
|
margin: '0 auto',
|
|
@@ -30531,7 +30604,7 @@ const headingRowStyle = {
|
|
|
30531
30604
|
flexDirection: 'column',
|
|
30532
30605
|
},
|
|
30533
30606
|
};
|
|
30534
|
-
const eyebrowStyle$
|
|
30607
|
+
const eyebrowStyle$3 = {
|
|
30535
30608
|
label: 'ChartersAccessManagementPage-eyebrowStyle',
|
|
30536
30609
|
...mutedCopy,
|
|
30537
30610
|
marginBottom: 8,
|
|
@@ -30714,14 +30787,14 @@ const avatarStyle = {
|
|
|
30714
30787
|
fontSize: 12,
|
|
30715
30788
|
fontWeight: 'var(--fw-semibold)',
|
|
30716
30789
|
};
|
|
30717
|
-
const nameStyle = {
|
|
30790
|
+
const nameStyle$1 = {
|
|
30718
30791
|
label: 'ChartersAccessManagementPage-nameStyle',
|
|
30719
30792
|
display: 'flex',
|
|
30720
30793
|
alignItems: 'center',
|
|
30721
30794
|
gap: 7,
|
|
30722
30795
|
fontWeight: 'var(--fw-semibold)',
|
|
30723
30796
|
};
|
|
30724
|
-
const titleStyle$
|
|
30797
|
+
const titleStyle$e = {
|
|
30725
30798
|
label: 'ChartersAccessManagementPage-titleStyle',
|
|
30726
30799
|
display: 'block',
|
|
30727
30800
|
marginTop: 2,
|
|
@@ -30868,7 +30941,7 @@ const ChartersAccessManagementPage = ({ accountName, memberships, availableAccou
|
|
|
30868
30941
|
const addUnavailableReason = !onAddAccess
|
|
30869
30942
|
? 'Adding STM Charters access is not available in this view.'
|
|
30870
30943
|
: undefined;
|
|
30871
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
30944
|
+
return (jsxs("div", { className: cx(sx(pageStyle$m), className), "data-test": "charters-access-management-page", children: [jsxs("header", { className: sx(headerStyle$g), children: [onBack && (jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charters-access-back", children: "STM Charters" })), jsxs("div", { className: sx(headingRowStyle), children: [jsxs("div", { children: [jsxs("p", { className: sx(eyebrowStyle$3), children: ["STM Charters \u00B7 ", accountName] }), jsx("h1", { children: "Access Management" }), jsx("p", { className: sx(descriptionStyle$6), children: "Grant account users access to charter bids and choose who can manage membership." })] }), jsxs("div", { className: sx(summaryStyle$2), "aria-label": "Access summary", children: [jsxs("span", { children: [jsx("strong", { children: memberships.length }), " members"] }), jsxs("span", { children: [jsx("strong", { children: adminCount }), " admins"] })] })] })] }), loading && (jsxs("div", { className: sx(pageStateStyle$1), "data-test": "charters-access-loading", children: [jsx(Spinner, { size: "lg", label: "Loading STM Charters access" }), jsx("p", { children: "Loading STM Charters access\u2026" })] })), !loading && error && (jsxs("div", { className: sx(pageStateStyle$1), "data-test": "charters-access-error", children: [jsx(Alert, { variant: "error", title: "Access could not be loaded", children: error }), onRetry && (jsx(Button, { type: "button", variant: "outline", onClick: onRetry, "data-test": "charters-access-retry", children: "Try again" }))] })), !loading && !error && (jsxs(Fragment, { children: [actionError && (jsx(Alert, { variant: "error", title: "Access change failed", dismissible: true, onDismiss: () => setActionError(undefined), className: sx(actionErrorStyle$1), children: jsx("span", { "data-test": "charters-access-action-error", children: actionError }) })), canManageAccess ? (jsxs("section", { className: sx(addPanelStyle), "data-test": "charters-access-add-panel", children: [jsxs("div", { className: sx(sectionHeadingStyle$1), children: [jsx("span", { className: sx(sectionIconStyle), children: jsx(UsersIcon$1, { size: 20 }) }), jsxs("div", { children: [jsx("h2", { children: "Add account users" }), jsxs("p", { children: ["Search and select one or more existing users of ", accountName, " to grant STM Charters access."] })] })] }), jsxs("div", { className: sx(addControlsStyle), children: [jsx(MultiUserSearch, { label: "Search account users", placeholder: "Type to search by name or email", options: userSearchOptions, selectedIds: selectedUserIds, onSearch: handleUserSearch, onSelectionChange: setSelectedUserIds, loading: accountUserSearchLoading, disabled: Boolean(pendingAction), error: accountUserSearchError, helperText: "Select one or more users, then choose their role below.", "data-test": "charters-access-user-search" }), jsxs("div", { className: sx(addActionsRowStyle), children: [jsx(Select, { label: "STM Charters role", options: ROLE_OPTIONS, value: newRole, onChange: (event) => setNewRole(event.target.value), disabled: Boolean(pendingAction), "data-test": "charters-access-new-role" }), jsx(Button, { type: "button", onClick: addSelectedUsers, disabled: !hasSelectedUsers || Boolean(addUnavailableReason), loading: pendingAction === 'add', title: addUnavailableReason, "data-test": "charters-access-add", children: selectedUsers.length > 1
|
|
30872
30945
|
? `Add ${selectedUsers.length} users`
|
|
30873
30946
|
: 'Add access' })] })] })] })) : (jsx(Alert, { variant: "primary", title: "Read-only access", className: sx(readOnlyNoticeStyle$1), children: jsx("span", { "data-test": "charters-access-read-only", children: readOnlyMessage }) })), jsxs("section", { className: sx(membersPanelStyle), "aria-labelledby": "charters-access-members-heading", children: [jsxs("div", { className: sx(membersHeadingStyle), children: [jsxs("div", { children: [jsx("h2", { id: "charters-access-members-heading", children: "People with STM Charters access" }), jsx("p", { children: "Members use carrier workflows. Admins can also manage this list." })] }), jsx(LockIcon$1, { size: 20, "aria-hidden": "true" })] }), memberships.length === 0 ? (jsx("div", { "data-test": "charters-access-empty", children: jsx(EmptyState$1, { title: "No STM Charters members", description: canManageAccess
|
|
30874
30947
|
? 'Search for an existing account user above to grant the first membership.'
|
|
@@ -30882,7 +30955,7 @@ const ChartersAccessManagementPage = ({ accountName, memberships, availableAccou
|
|
|
30882
30955
|
?? (!onChangeRole ? 'Changing roles is not available in this view.' : undefined);
|
|
30883
30956
|
const removeDisabledReason = membership.removeDisabledReason
|
|
30884
30957
|
?? (!onRemoveAccess ? 'Removing access is not available in this view.' : undefined);
|
|
30885
|
-
return (jsxs("tr", { "data-test": `charters-access-row-${membershipKey}`, children: [jsx("td", { children: jsxs("div", { className: sx(personStyle$1), children: [jsx("span", { className: sx(avatarStyle), "aria-hidden": "true", children: membership.name.split(/\s+/).map((part) => part[0]).join('').slice(0, 2) }), jsxs("span", { children: [jsxs("span", { className: sx(nameStyle), children: [membership.name, isCurrentUser && jsx(Badge, { variant: "info", size: "sm", children: "You" })] }), membership.title && jsx("span", { className: sx(titleStyle$
|
|
30958
|
+
return (jsxs("tr", { "data-test": `charters-access-row-${membershipKey}`, children: [jsx("td", { children: jsxs("div", { className: sx(personStyle$1), children: [jsx("span", { className: sx(avatarStyle), "aria-hidden": "true", children: membership.name.split(/\s+/).map((part) => part[0]).join('').slice(0, 2) }), jsxs("span", { children: [jsxs("span", { className: sx(nameStyle$1), children: [membership.name, isCurrentUser && jsx(Badge, { variant: "info", size: "sm", children: "You" })] }), membership.title && jsx("span", { className: sx(titleStyle$e), children: membership.title })] })] }) }), jsx("td", { children: jsx("a", { href: `mailto:${membership.email}`, children: membership.email }) }), jsx("td", { children: canManageAccess ? (jsxs("div", { className: sx(roleControlStyle), children: [jsx(Select, { "aria-label": `Role for ${membership.name}`, options: ROLE_OPTIONS, value: membership.role, onChange: (event) => changeRole(membership, event.target.value), disabled: Boolean(roleDisabledReason) || Boolean(pendingAction), "data-test": `charters-access-role-${membershipKey}` }), rolePending && jsx(Spinner, { size: "xs", label: `Saving ${membership.name}'s role` }), roleDisabledReason && jsx("span", { className: sx(guardStyle), children: roleDisabledReason })] })) : (jsx(Badge, { variant: membership.role === 'admin' ? 'info' : 'default', children: membership.role === 'admin' ? 'Admin' : 'Member' })) }), canManageAccess && (jsxs("td", { className: sx(actionCellStyle$1), children: [jsx(Button, { type: "button", variant: "ghost", size: "sm", square: true, "aria-label": `Remove ${membership.name} from STM Charters`, title: removeDisabledReason, leftIcon: jsx(TrashIcon$2, { size: 16 }), disabled: Boolean(removeDisabledReason) || Boolean(pendingAction), loading: removePending, onClick: () => setRemoveTarget(membership), "data-test": `charters-access-remove-${membershipKey}` }), removeDisabledReason && (jsx("span", { className: cx(sx(guardStyle), sx(guardInActionCellStyle)), children: removeDisabledReason }))] }))] }, membership.membershipId));
|
|
30886
30959
|
}) })] }) }))] })] })), jsx(Modal, { isOpen: Boolean(removeTarget), onClose: () => {
|
|
30887
30960
|
if (!pendingAction)
|
|
30888
30961
|
setRemoveTarget(undefined);
|
|
@@ -30896,7 +30969,7 @@ ChartersAccessManagementPage.displayName = 'ChartersAccessManagementPage';
|
|
|
30896
30969
|
* `@media` block at the foot of the file is now nested inside `pageStyle`,
|
|
30897
30970
|
* which is the only rule it applied to.
|
|
30898
30971
|
*/
|
|
30899
|
-
const pageStyle$
|
|
30972
|
+
const pageStyle$l = {
|
|
30900
30973
|
label: 'ChartersHomePage-pageStyle',
|
|
30901
30974
|
display: 'flex',
|
|
30902
30975
|
flexDirection: 'column',
|
|
@@ -30913,7 +30986,7 @@ const headerStyle$f = {
|
|
|
30913
30986
|
alignItems: 'flex-start',
|
|
30914
30987
|
gap: 'var(--space-2)',
|
|
30915
30988
|
};
|
|
30916
|
-
const titleStyle$
|
|
30989
|
+
const titleStyle$d = {
|
|
30917
30990
|
label: 'ChartersHomePage-titleStyle',
|
|
30918
30991
|
margin: 0,
|
|
30919
30992
|
color: 'var(--fg-1)',
|
|
@@ -30942,7 +31015,7 @@ const cardsStyle = {
|
|
|
30942
31015
|
padding: 0,
|
|
30943
31016
|
listStyle: 'none',
|
|
30944
31017
|
};
|
|
30945
|
-
const cardStyle$
|
|
31018
|
+
const cardStyle$5 = {
|
|
30946
31019
|
label: 'ChartersHomePage-cardStyle',
|
|
30947
31020
|
display: 'flex',
|
|
30948
31021
|
alignItems: 'flex-start',
|
|
@@ -31164,7 +31237,7 @@ const CHARTER_CONTACT_GROUPS = [
|
|
|
31164
31237
|
* welcome paragraph and a PDF link; this keeps the same information architecture but
|
|
31165
31238
|
* puts a real card into each section with the queue count already visible.
|
|
31166
31239
|
*/
|
|
31167
|
-
const ChartersHomePage = ({ title = 'STM Charters', description = 'Bid on flight opportunities for regular season and NCAA championship travel.', sections = CHARTER_SECTIONS, contactGroups = CHARTER_CONTACT_GROUPS, tutorialLabel = 'Portal overview (PDF)', onOpenTutorial, onOpenSection, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$
|
|
31240
|
+
const ChartersHomePage = ({ title = 'STM Charters', description = 'Bid on flight opportunities for regular season and NCAA championship travel.', sections = CHARTER_SECTIONS, contactGroups = CHARTER_CONTACT_GROUPS, tutorialLabel = 'Portal overview (PDF)', onOpenTutorial, onOpenSection, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$l), className), "data-test": "charters-home-page", children: [jsxs("header", { className: sx(headerStyle$f), children: [jsx("h1", { className: sx(titleStyle$d), children: title }), description && jsx("p", { className: sx(descriptionStyle$5), children: description }), onOpenTutorial && (jsx(Button, { variant: "outline", size: "sm", className: sx(tutorialStyle), leftIcon: jsx(DocumentIcon, { size: 16 }), onClick: onOpenTutorial, "data-test": "charters-tutorial", children: tutorialLabel }))] }), jsx("ul", { className: sx(cardsStyle), children: sections.map((section) => (jsx("li", { children: jsxs("button", { type: "button", className: sx(cardStyle$5), onClick: () => onOpenSection?.(section.key), "data-test": `charters-section-${section.key}`, children: [jsx("span", { className: sx(cardIconStyle), "aria-hidden": "true", children: section.icon ?? SECTION_ICONS[section.key] ?? jsx(PlaneIcon$3, { size: 20 }) }), jsxs("span", { className: sx(cardBodyStyle$2), children: [jsx("span", { className: sx(cardTitleStyle$1), children: section.title }), jsx("span", { className: sx(cardDescriptionStyle), children: section.description }), section.loading ? (jsx("span", { className: sx(cardLoadingStyle), "data-test": `charters-section-${section.key}-loading`, children: jsx(Spinner, { size: "xs", label: `Loading ${section.title}` }) })) : section.count !== undefined ? (jsxs("span", { className: sx(cardCountStyle), children: [jsx("strong", { children: section.count }), " ", section.countLabel ?? 'items'] })) : null] }), jsx("span", { className: sx(cardArrowStyle), "aria-hidden": "true", children: jsx(ArrowUpRightIcon, { size: 16 }) })] }) }, section.key))) }), jsxs("section", { className: sx(contactsStyle), "aria-label": "Contact us", children: [jsx("h2", { className: sx(sectionTitleStyle$5), children: "Questions? Talk to us" }), jsx("div", { className: sx(contactGroupsStyle), children: contactGroups.map((group) => (jsxs("div", { className: sx(contactGroupStyle$1), children: [jsx("h3", { className: sx(contactGroupTitleStyle), children: group.title }), jsx("ul", { className: sx(contactListStyle), children: group.contacts.map((contact) => (jsxs("li", { className: sx(contactStyle), children: [jsx("span", { className: sx(contactNameStyle), children: contact.name }), contact.role && jsx("span", { className: sx(contactRoleStyle), children: contact.role }), jsxs("span", { className: sx(contactLinksStyle), children: [contact.email && (jsxs("a", { href: `mailto:${contact.email}`, className: sx(contactLinkStyle), children: [jsx(MailIcon, { size: 14, "aria-hidden": "true" }), contact.email] })), contact.phone && (jsxs("a", { href: `tel:${contact.phone}`, className: sx(contactLinkStyle), children: [jsx(PhoneIcon, { size: 14, "aria-hidden": "true" }), contact.phone] }))] })] }, contact.name))) })] }, group.title))) })] })] }));
|
|
31168
31241
|
ChartersHomePage.displayName = 'ChartersHomePage';
|
|
31169
31242
|
|
|
31170
31243
|
/**
|
|
@@ -31182,7 +31255,7 @@ ChartersHomePage.displayName = 'ChartersHomePage';
|
|
|
31182
31255
|
* rather than classes stacked on one element, so `emergencyLabelStyle` simply
|
|
31183
31256
|
* carries the merged result.
|
|
31184
31257
|
*/
|
|
31185
|
-
const pageStyle$
|
|
31258
|
+
const pageStyle$k = {
|
|
31186
31259
|
label: 'ContactUsPage-pageStyle',
|
|
31187
31260
|
color: 'var(--color-ink, #282828)',
|
|
31188
31261
|
'@media print': {
|
|
@@ -31243,7 +31316,7 @@ const stackStyle$1 = {
|
|
|
31243
31316
|
};
|
|
31244
31317
|
/* Outline card: a hairline border on white with a navy accent down the left
|
|
31245
31318
|
edge, and the section name as a small uppercase eyebrow over the content. */
|
|
31246
|
-
const cardStyle$
|
|
31319
|
+
const cardStyle$4 = {
|
|
31247
31320
|
label: 'ContactUsPage-cardStyle',
|
|
31248
31321
|
border: '1px solid var(--color-line, #dce5ef)',
|
|
31249
31322
|
borderLeft: '6px solid var(--color-primary, #19345f)',
|
|
@@ -31473,7 +31546,7 @@ const warningStyle = {
|
|
|
31473
31546
|
|
|
31474
31547
|
const cleanEmail = (email) => email?.replace('.invalid', '');
|
|
31475
31548
|
const ContactField = ({ label, children, emergency = false }) => (jsxs("div", { className: sx(fieldStyle$2), children: [jsxs("span", { className: emergency ? sx(emergencyLabelStyle) : sx(labelStyle$2), children: [label, emergency && jsx("span", { className: sx(emergencyDotStyle) })] }), jsx("div", { className: sx(fieldValueStyle), children: children })] }));
|
|
31476
|
-
const ContactCard = ({ title, children }) => (jsxs("section", { className: sx(cardStyle$
|
|
31549
|
+
const ContactCard = ({ title, children }) => (jsxs("section", { className: sx(cardStyle$4), children: [title && jsx("h2", { children: title }), jsx("div", { className: sx(cardBodyStyle$1), children: children })] }));
|
|
31477
31550
|
/**
|
|
31478
31551
|
* One account contact card: the row's own labels and values, in the order the
|
|
31479
31552
|
* caller put them in. Blank values are the caller's to drop — an empty line
|
|
@@ -31499,7 +31572,7 @@ const ContactUsPage = ({ title = 'Your Team of Experts', state, errorMessage = '
|
|
|
31499
31572
|
if (resolvedState === 'error' || resolvedState === 'empty') {
|
|
31500
31573
|
return (jsx("div", { className: sx(centeredStateStyle), "data-test": "contact-us-page", children: jsx("div", { "data-test": `contact-us-${resolvedState}`, role: resolvedState === 'error' ? 'alert' : 'status', className: resolvedState === 'error' ? sx(errorStyle) : sx(warningStyle), children: resolvedState === 'error' ? errorMessage : 'No contact information available.' }) }));
|
|
31501
31574
|
}
|
|
31502
|
-
return (jsx("div", { className: cx(sx(pageStyle$
|
|
31575
|
+
return (jsx("div", { className: cx(sx(pageStyle$k), className), "data-test": "contact-us-page", children: jsxs("div", { className: sx(containerStyle), children: [jsxs("div", { className: sx(headerRowStyle), children: [jsx(PageHeader, { title: title }), jsx("div", { className: sx(printRowStyle), children: jsxs("button", { type: "button", onClick: onPrint ?? (() => window.print()), children: [jsx(PrinterIcon, { size: 16 }), "Print"] }) })] }), children ?? (data ? (jsxs(Fragment, { children: [!!(data.accountManagers?.length || data.travelAgents?.length) && (jsxs("div", { className: sx(primaryGridStyle), children: [jsx(SimpleContactCard, { title: "Account Manager", contacts: data.accountManagers }), jsx(SimpleContactCard, { title: "Travel Agent", contacts: data.travelAgents })] })), jsxs("div", { className: sx(stackStyle$1), children: [data.accountContacts ? (data.accountContacts.map((section, index) => (
|
|
31503
31576
|
// Two rows can share a description, so position is the stable key.
|
|
31504
31577
|
jsx(AccountContactCard, { section: section }, `${section.title}-${index}`)))) : (jsxs(Fragment, { children: [jsxs(ContactCard, { title: "Group/Team Commercial Reservation Specialists", children: [jsx(ContactField, { label: "Business Hours:", children: jsx("span", { children: "Monday \u2013 Friday 8am-8pm ET" }) }), jsx(ContactField, { label: "Toll-Free Number:", children: jsx("span", { children: "866-902-9654" }) }), jsx(ContactField, { label: "After Hours/Emergency (24/7):", emergency: true, children: jsx("span", { className: sx(emergencyStyle), children: "866-902-9654" }) }), jsx(ContactField, { label: "Email:", children: jsx("a", { href: "mailto:teamtravel@shortstravel.com", children: "teamtravel@shortstravel.com" }) })] }), jsxs(ContactCard, { title: "Recruiting Travel Specialists", children: [jsx(ContactField, { label: "Business Hours:", children: jsx("span", { children: "Monday \u2013 Friday 8am-8pm ET" }) }), jsx(ContactField, { label: "Toll-Free Number:", children: jsx("span", { children: "866-902-9654" }) }), jsx(ContactField, { label: "After Hours/Emergency (24/7):", emergency: true, children: jsx("span", { className: sx(emergencyStyle), children: "866-902-9654" }) }), jsx(ContactField, { label: "Email:", children: jsx("a", { href: "mailto:recruiting@shortstravel.com", children: "recruiting@shortstravel.com" }) })] })] })), !!data.charterAirContacts?.length && jsx(ContactCard, { title: "Charter Air", children: jsx(PairedContacts, { contacts: data.charterAirContacts }) }), !!data.motorcoachContacts?.length && (jsxs(ContactCard, { title: "Charter Bus / Motorcoach", children: [jsx(PairedContacts, { contacts: data.motorcoachContacts }), jsx("p", { className: sx(motorcoachEmergencyStyle), children: "After Hours/Emergency (24/7): 319-423-3007" })] })), !!data.groupHotelContacts?.length && (jsx(ContactCard, { title: "Group Hotel", children: data.groupHotelContacts.map((contact, index) => (jsxs("div", { className: sx(contactPairStyle), children: [jsx(ContactColumn, { title: "Sales Contact", contact: contact }), jsx("div", { className: sx(contactColumnStyle) })] }, `${contact.email ?? contact.name}-${index}`))) }))] })] })) : jsx(GenericCards, { cards: cards })), showSupportFooter && (jsxs("footer", { className: sx(supportStyle), children: [jsx("h2", { children: "Short's Travel Website and Online Booking Tool Support" }), jsx("p", { children: "Monday \u2013 Friday 9am-9pm ET, except major holidays" }), jsxs("div", { children: [jsx("span", { children: "319-257-5309" }), jsx("a", { href: "mailto:onlinesupport@shortstravel.com", children: "onlinesupport@shortstravel.com" })] })] }))] }) }));
|
|
31505
31578
|
};
|
|
@@ -31521,7 +31594,7 @@ const ContactUsPage = ({ title = 'Your Team of Experts', state, errorMessage = '
|
|
|
31521
31594
|
* The `pulse` keyframes are namespaced `stm-pulse` — injected at runtime they
|
|
31522
31595
|
* would otherwise be global and collide with a host's own `pulse`.
|
|
31523
31596
|
*/
|
|
31524
|
-
const pageStyle$
|
|
31597
|
+
const pageStyle$j = {
|
|
31525
31598
|
label: 'DashboardPage-pageStyle',
|
|
31526
31599
|
color: 'var(--color-ink, #282828)',
|
|
31527
31600
|
};
|
|
@@ -32414,7 +32487,7 @@ const DashboardPage = ({ greeting = 'Good morning', firstName, accountName, widg
|
|
|
32414
32487
|
const [dragFrom, setDragFrom] = useState(null);
|
|
32415
32488
|
const dragGhost = useRef(null);
|
|
32416
32489
|
const presentTypes = new Set(widgets.map((widget) => widget.type));
|
|
32417
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
32490
|
+
return (jsxs("div", { className: cx(sx(pageStyle$j), className), children: [welcomeHero && heroOpen && (jsxs("section", { className: sx(welcomeHeroStyle), "aria-label": "Welcome", children: [jsx("button", { type: "button", className: sx(welcomeCloseStyle), "aria-label": "Dismiss welcome", onClick: () => setHeroOpen(false), children: jsx(CloseIcon, { size: 20 }) }), welcomeHero] })), jsx("div", { className: sx(pageBannersStyle), children: jsx(PageBanners, { systemBanners: systemBanners, alertBanners: alertBanners, fullWidth: true, onDismiss: onBannerDismiss }) }), standingMessage && (jsx("section", { className: sx(standingMessageStyle), "aria-label": "Message", children: standingMessage })), jsxs("header", { className: sx(pageHeaderStyle$1), children: [jsxs("div", { children: [jsxs("h1", { children: [greeting, firstName ? `, ${firstName}` : ''] }), accountName && jsxs("p", { children: ["Here's your personalized travel overview for ", accountName, "."] })] }), jsx("div", { className: sx(pageActionsStyle), children: editMode ? jsxs(Fragment, { children: [jsxs("button", { type: "button", className: sx(outlineButtonStyle), onClick: () => setCatalogOpen(true), children: [jsx(PlusIcon$2, { size: 20 }), "Add card"] }), jsx("button", { type: "button", className: sx(textButtonStyle$1), onClick: onReset, children: "Reset to default" }), jsxs("button", { type: "button", className: sx(primaryButtonStyle), onClick: () => { setEditMode(false); setCatalogOpen(false); }, children: [jsx(CheckIcon$2, { size: 20 }), "Done"] })] }) : jsxs("button", { type: "button", className: sx(customizeButtonStyle), onClick: () => setEditMode(true), children: [jsx(SettingsIcon, { size: 20 }), "Customize Your Home Page"] }) })] }), editMode && jsxs("div", { className: sx(editBannerStyle), children: [jsx(EditIcon$2, { size: 20 }), jsxs("span", { children: [jsx("strong", { children: "Customizing your home page." }), " Drag cards to reorder, resize with S / M / L, or remove cards. Your layout saves automatically."] })] }), syncStatus === 'saving' && jsx("p", { className: sx(syncStatusStyle), "aria-live": "polite", children: "Saving layout\u2026" }), syncStatus === 'error' && jsx("p", { className: cx(sx(syncStatusStyle), sx(syncErrorStyle)), role: "alert", children: "Layout couldn't be saved. Changes are preserved locally." }), widgets.length ? jsx("div", { className: sx(gridStyle$2), children: widgets.map((widget, index) => jsx("div", { className: sx(sizeStyles[widget.size]), draggable: editMode, onDragStart: (event) => { if (!editMode)
|
|
32418
32491
|
return; setDragFrom(index); const ghost = document.createElement('div'); ghost.className = sx(dragGhostStyle); document.body.appendChild(ghost); dragGhost.current = ghost; event.dataTransfer.setDragImage(ghost, 0, 0); }, onDragOver: (event) => event.preventDefault(), onDrop: () => { if (dragFrom !== null && dragFrom !== index)
|
|
32419
32492
|
onReorder?.(dragFrom, index); setDragFrom(null); }, onDragEnd: () => { setDragFrom(null); dragGhost.current?.remove(); dragGhost.current = null; }, children: jsx(WidgetCard, { widget: widget, editMode: editMode, index: index, count: widgets.length, onRefresh: onRefresh, onRemove: onRemove, onResize: onResize, onReorder: onReorder, onTravelerRangeChange: onTravelerRangeChange, onNavigate: onNavigate }) }, widget.id)) }) : jsxs("div", { className: sx(emptyPageStyle), children: [jsx(PlusIcon$2, { size: 28 }), jsx("strong", { children: "Your home page is empty" }), jsx("span", { children: "Use \"Customize\" to add cards from the catalog." })] }), catalogOpen && jsxs(Fragment, { children: [jsx("button", { type: "button", className: sx(scrimStyle), "aria-label": "Close card catalog", onClick: () => setCatalogOpen(false) }), jsxs("aside", { className: sx(catalogStyle), role: "dialog", "aria-modal": "true", "aria-label": "Add cards", children: [jsxs("header", { children: [jsxs("div", { children: [jsx("h2", { children: "Add a card" }), jsx("p", { children: "Cards available to your role for this account" })] }), jsx("button", { type: "button", "aria-label": "Close card catalog", onClick: () => setCatalogOpen(false), children: jsx(CloseIcon, { size: 20 }) })] }), jsx("div", { className: sx(catalogBodyStyle), children: CATALOG.map((item) => jsxs("div", { className: sx(catalogItemStyle), children: [jsx("span", { className: sx(catalogIconStyle), children: jsx(WidgetIcon, { type: item.type }) }), jsxs("div", { children: [jsx("strong", { children: item.title }), jsx("span", { children: "Account" }), jsx("p", { children: item.description })] }), presentTypes.has(item.type) ? jsxs("span", { className: sx(addedStyle), children: [jsx(CheckIcon$2, { size: 16 }), "Added"] }) : jsxs("button", { type: "button", onClick: () => onAddWidget?.(item.type), children: [jsx(PlusIcon$2, { size: 16 }), "Add"] })] }, item.type)) }), jsx("footer", { children: "Each card can appear once on your home page." })] })] })] }));
|
|
32420
32493
|
};
|
|
@@ -32427,7 +32500,7 @@ const DashboardPage = ({ greeting = 'Good morning', firstName, accountName, widg
|
|
|
32427
32500
|
* object, and the single `@media (max-width: 767px)` block is split across the
|
|
32428
32501
|
* nine objects it used to style.
|
|
32429
32502
|
*/
|
|
32430
|
-
const pageStyle$
|
|
32503
|
+
const pageStyle$i = {
|
|
32431
32504
|
label: 'FeatureFlagManagementPage-pageStyle',
|
|
32432
32505
|
maxWidth: 1440,
|
|
32433
32506
|
margin: '0 auto',
|
|
@@ -32453,7 +32526,7 @@ const headerStyle$e = {
|
|
|
32453
32526
|
'& h1': { fontSize: 36 },
|
|
32454
32527
|
},
|
|
32455
32528
|
};
|
|
32456
|
-
const eyebrowStyle$
|
|
32529
|
+
const eyebrowStyle$2 = {
|
|
32457
32530
|
label: 'FeatureFlagManagementPage-eyebrowStyle',
|
|
32458
32531
|
margin: '0 0 8px',
|
|
32459
32532
|
color: 'var(--color-primary, #0a53ef)',
|
|
@@ -33134,7 +33207,7 @@ const FeatureFlagManagementPage = ({ definitions, rules, targetOptions, loading
|
|
|
33134
33207
|
const hasRuleActions = Boolean(onEditRule || onDeactivateRule);
|
|
33135
33208
|
const currentUserSearchError = userSearchError ?? internalUserSearchError;
|
|
33136
33209
|
const currentAudienceError = audienceError ?? internalAudienceError;
|
|
33137
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
33210
|
+
return (jsxs("div", { className: cx(sx(pageStyle$i), className), "data-test": "feature-flag-management-page", "aria-busy": busy, children: [jsxs("header", { className: sx(headerStyle$e), children: [jsxs("div", { children: [jsx("p", { className: sx(eyebrowStyle$2), children: "Administration \u00B7 System" }), jsx("h1", { children: "Feature Flags" }), jsx("p", { className: sx(descriptionStyle$4), children: "Review the immutable feature catalog and manage prioritized audience rules." })] }), onCreateRule && !editor && !loading && !error && hasActiveDefinitions && rules.length > 0 && (jsx(Button, { type: "button", leftIcon: jsx(PlusIcon$2, { size: 16 }), onClick: openCreate, disabled: busy, "data-test": "feature-flag-create-rule", children: "Create rule" }))] }), busy && (jsxs("div", { className: sx(submittingStyle), role: "status", "data-test": "feature-flag-submitting", children: [jsx(Spinner, { size: "sm", label: "Saving feature rule" }), jsx("span", { children: "Saving feature rule\u2026" })] })), loading && (jsxs("div", { className: sx(pageStateStyle), "data-test": "feature-flag-loading", children: [jsx(Spinner, { size: "lg", label: "Loading feature flags" }), jsx("p", { children: "Loading feature flags\u2026" })] })), !loading && error && (jsxs("div", { className: sx(pageStateStyle), "data-test": "feature-flag-error", children: [jsx(Alert, { variant: "error", title: "Feature flags could not be loaded", children: error }), onRetry && (jsx(Button, { type: "button", variant: "outline", onClick: onRetry, "data-test": "feature-flag-retry", children: "Try again" }))] })), !loading && !error && definitions.length === 0 && (jsx("div", { "data-test": "feature-flag-definitions-empty", children: jsx(EmptyState$1, { title: "No feature definitions", description: "Publish immutable feature definitions before creating audience rules.", icon: jsx(SettingsIcon, { size: 30 }), size: "lg" }) })), !loading && !error && definitions.length > 0 && (jsxs(Fragment, { children: [actionError && (jsx(Alert, { variant: "error", title: "Feature rule change failed", dismissible: true, onDismiss: () => setActionError(undefined), className: sx(actionErrorStyle), children: jsx("span", { "data-test": "feature-flag-action-error", children: actionError }) })), jsxs("section", { className: sx(catalogPanelStyle), "aria-labelledby": "feature-catalog-heading", children: [jsxs("div", { className: sx(sectionHeadingStyle), children: [jsxs("div", { children: [jsx("h2", { id: "feature-catalog-heading", children: "Feature catalog" }), jsx("p", { children: "Definitions and hierarchy are read-only in this view." })] }), jsxs(Badge, { size: "sm", children: [definitions.length, " definitions"] })] }), jsx("div", { className: sx(definitionListStyle), "data-test": "feature-flag-definitions", children: definitionRows.map(({ definition, depth }) => (jsxs("article", { className: cx(sx(definitionStyle), definition.isActive === false && sx(inactiveDefinitionStyle)), style: { marginInlineStart: `${depth * 24}px` }, "data-test": `feature-flag-definition-${definition.featureKey}`, "data-depth": depth, children: [jsxs("div", { className: sx(definitionCopyStyle), children: [jsxs("div", { className: sx(definitionTitleStyle), children: [jsx("strong", { children: definition.name }), jsx("code", { children: definition.featureKey })] }), jsx("p", { children: definition.description }), definition.isActive === false && (jsx("p", { className: sx(killSwitchStyle), children: "Kill switch active. Targeting rules cannot enable this feature." }))] }), jsxs("div", { className: sx(definitionBadgesStyle), children: [jsx(Badge, { variant: definition.isActive === false ? 'error' : 'success', size: "sm", children: definition.isActive === false ? 'Inactive kill switch' : 'Active definition' }), jsxs(Badge, { variant: definition.defaultEnabled ? 'success' : 'default', size: "sm", children: ["Default ", definition.defaultEnabled ? 'enabled' : 'disabled'] })] })] }, definition.featureKey))) })] }), editor && (jsxs("section", { className: sx(editorPanelStyle), "data-test": "feature-flag-rule-editor", children: [jsxs("div", { className: sx(sectionHeadingStyle), children: [jsxs("div", { children: [jsx("h2", { children: editor.mode === 'create' ? 'Create targeting rule' : 'Edit targeting rule' }), jsx("p", { children: "The most specific target wins, then account scope, then priority; deny wins an exact tie. Changes require an audit reason." })] }), editor.mode === 'edit' && (jsxs("code", { className: sx(versionStyle), children: ["Version ", editor.rule.rowVersion] }))] }), jsxs("form", { className: sx(ruleFormStyle), onSubmit: submitRule, noValidate: true, children: [jsx(Select, { label: "Feature", options: definitions.map((definition) => ({
|
|
33138
33211
|
value: definition.featureKey,
|
|
33139
33212
|
label: `${definition.name} · ${definition.featureKey}`,
|
|
33140
33213
|
disabled: definition.isActive === false,
|
|
@@ -33675,7 +33748,7 @@ GroupTravelRequestPage.displayName = 'GroupTravelRequestPage';
|
|
|
33675
33748
|
* split across the objects it styled: each `@media` lives inside the one style
|
|
33676
33749
|
* it applies to, so a rule and its responsive override stay together.
|
|
33677
33750
|
*/
|
|
33678
|
-
const pageStyle$
|
|
33751
|
+
const pageStyle$h = {
|
|
33679
33752
|
label: 'IndividualTravelPage-pageStyle',
|
|
33680
33753
|
minHeight: '100%',
|
|
33681
33754
|
padding: 24,
|
|
@@ -33699,7 +33772,7 @@ const headerStyle$d = {
|
|
|
33699
33772
|
flexDirection: 'column',
|
|
33700
33773
|
},
|
|
33701
33774
|
};
|
|
33702
|
-
const titleStyle$
|
|
33775
|
+
const titleStyle$c = {
|
|
33703
33776
|
label: 'IndividualTravelPage-titleStyle',
|
|
33704
33777
|
margin: 0,
|
|
33705
33778
|
color: 'var(--fg-1, #282828)',
|
|
@@ -34413,7 +34486,7 @@ const IndividualTravelPage = ({ trips, tabCounts, enabledTabs = ['current', 'pas
|
|
|
34413
34486
|
: activeFilters
|
|
34414
34487
|
? 'No trips match the selected filters. Clear a filter or widen the date range.'
|
|
34415
34488
|
: emptyMessage;
|
|
34416
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
34489
|
+
return (jsxs("div", { className: cx(sx(pageStyle$h), className), "data-test": "individual-travel-page", "aria-busy": loading || refreshing, children: [jsxs("div", { className: sx(headerStyle$d), children: [jsx("h1", { className: sx(titleStyle$c), children: "Individual & Small Group Travel" }), onCreateRequest && (jsx(Button
|
|
34417
34490
|
// Explicit: the atom has no default, and inside a host form a
|
|
34418
34491
|
// bare <button> would submit it.
|
|
34419
34492
|
, {
|
|
@@ -34439,7 +34512,7 @@ const IndividualTravelPage = ({ trips, tabCounts, enabledTabs = ['current', 'pas
|
|
|
34439
34512
|
* the three columns and the narrow-screen tab strip — still comes from the
|
|
34440
34513
|
* RequestFormLayout organism, and the blocks from the FormSection molecule.
|
|
34441
34514
|
*/
|
|
34442
|
-
const pageStyle$
|
|
34515
|
+
const pageStyle$g = {
|
|
34443
34516
|
label: 'IndividualTravelRequestPage-pageStyle',
|
|
34444
34517
|
color: 'var(--color-ink, #282828)',
|
|
34445
34518
|
};
|
|
@@ -34533,14 +34606,14 @@ const pageHeaderStyle = {
|
|
|
34533
34606
|
flexDirection: 'column',
|
|
34534
34607
|
},
|
|
34535
34608
|
};
|
|
34536
|
-
const eyebrowStyle = {
|
|
34609
|
+
const eyebrowStyle$1 = {
|
|
34537
34610
|
label: 'IndividualTravelRequestPage-eyebrowStyle',
|
|
34538
34611
|
margin: '0 0 4px',
|
|
34539
34612
|
color: 'var(--color-slate, #5c5c5c)',
|
|
34540
34613
|
fontSize: 13,
|
|
34541
34614
|
fontWeight: 600,
|
|
34542
34615
|
};
|
|
34543
|
-
const titleStyle$
|
|
34616
|
+
const titleStyle$b = {
|
|
34544
34617
|
label: 'IndividualTravelRequestPage-titleStyle',
|
|
34545
34618
|
margin: 0,
|
|
34546
34619
|
color: 'var(--color-ink, #282828)',
|
|
@@ -34879,17 +34952,17 @@ const choiceTextStyle = {
|
|
|
34879
34952
|
},
|
|
34880
34953
|
};
|
|
34881
34954
|
/** `.travelerCard, .segmentCard` — one selector list, two homes. */
|
|
34882
|
-
const cardStyle$
|
|
34955
|
+
const cardStyle$3 = {
|
|
34883
34956
|
padding: 18,
|
|
34884
34957
|
border: '1px solid var(--border-color, #ededed)',
|
|
34885
34958
|
borderRadius: 9,
|
|
34886
34959
|
background: 'var(--color-basecolor, #fafafa)',
|
|
34887
34960
|
};
|
|
34888
34961
|
const travelerCardStyle = {
|
|
34889
|
-
label: 'IndividualTravelRequestPage-travelerCardStyle', ...cardStyle$
|
|
34962
|
+
label: 'IndividualTravelRequestPage-travelerCardStyle', ...cardStyle$3
|
|
34890
34963
|
};
|
|
34891
34964
|
const segmentCardStyle$1 = {
|
|
34892
|
-
label: 'IndividualTravelRequestPage-segmentCardStyle', ...cardStyle$
|
|
34965
|
+
label: 'IndividualTravelRequestPage-segmentCardStyle', ...cardStyle$3
|
|
34893
34966
|
};
|
|
34894
34967
|
const cardHeaderStyle = {
|
|
34895
34968
|
label: 'IndividualTravelRequestPage-cardHeaderStyle',
|
|
@@ -35907,9 +35980,9 @@ const IndividualTravelRequestFormPage = ({ currentTraveler, configuration, value
|
|
|
35907
35980
|
}
|
|
35908
35981
|
};
|
|
35909
35982
|
if (loading) {
|
|
35910
|
-
return (jsx(RequestFormLayout, { className: cx(sx(pageStyle$
|
|
35983
|
+
return (jsx(RequestFormLayout, { className: cx(sx(pageStyle$g), className), header: jsx(RequestFormHeader, { title: "Individual Travel Request" }), children: jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-form-loading", children: [jsx(Spinner, { label: "Loading travel request form" }), jsx("span", { children: "Loading request options\u2026" })] }) }));
|
|
35911
35984
|
}
|
|
35912
|
-
return (jsx("form", { ref: formRef, className: sx(formStyle), onSubmit: (event) => void handleSubmit(event), noValidate: true, "data-test": "individual-travel-request-form", "aria-busy": busy, children: jsxs(RequestFormLayout, { className: cx(sx(pageStyle$
|
|
35985
|
+
return (jsx("form", { ref: formRef, className: sx(formStyle), onSubmit: (event) => void handleSubmit(event), noValidate: true, "data-test": "individual-travel-request-form", "aria-busy": busy, children: jsxs(RequestFormLayout, { className: cx(sx(pageStyle$g), className), header: jsx(RequestFormHeader, { title: "Individual Travel Request", eventName: currentTraveler.displayName }), activePane: activePane, onPaneChange: setActivePane, mobileServices: availableServices.map((service) => (jsxs("button", { type: "button", "aria-pressed": activeService === service.key, onClick: () => navigateToService(service.key), "data-test": `individual-travel-request-mobile-service-${service.key}`, children: [service.icon, jsx("span", { children: service.label })] }, service.key))), sidebar: (jsxs("div", { "aria-label": "Travel types", "data-test": "individual-travel-request-service-sidebar", children: [jsx(ServiceToggleList, { services: availableServices, enabledServices: selectedServices, onToggle: (service, checked) => toggleService(service, checked), onClick: navigateToService, className: sx(serviceNavigationStyle), disabled: disabled }), jsxs("div", { className: sx(travelerRailStyle), children: [jsx("h3", { children: "Travelling" }), jsxs("p", { children: [jsx(UsersIcon$1, { size: 17 }), " ", travelerRailSummary] })] })] })), summary: (jsx(RequestSummary, { sections: summarySections, values: {}, dataTest: "individual-travel-request-summary" })), footer: (onCancel || onSubmit) ? (jsx(RequestFormFooter, { onPrevious: onCancel, submitsForm: Boolean(onSubmit), isFirstPage: true, isLastPage: true, isSubmitting: busy, previousText: "Cancel", nextText: submitLabel, previousButtonDataTest: "individual-travel-request-cancel", nextButtonDataTest: "individual-travel-request-submit" })) : undefined, children: [notice && jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-form-notice", children: jsx(Alert, { variant: "warning", children: notice }) }), error && (jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-form-error", children: jsxs(Alert, { variant: "error", title: "The request form needs attention", children: [jsx("div", { children: error }), onRetry && jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, "data-test": "individual-travel-request-form-retry", children: "Try again" })] }) })), readOnly && (jsx("p", { className: sx(readOnlyNoticeStyle), "data-test": "individual-travel-request-form-read-only", children: "Request submission is unavailable. Form fields are shown for reference only." })), (Object.keys(allErrors).length > 0 || submitError) && (jsxs("div", { ref: errorSummaryRef, className: sx(errorSummaryStyle), role: "alert", tabIndex: -1, "data-test": "individual-travel-request-form-validation", children: [jsx("h2", { children: "Review the request before submitting" }), submitError && jsx("p", { "data-test": "individual-travel-request-form-submit-error", children: submitError }), Object.keys(allErrors).length > 0 && jsx("ul", { children: Object.values(allErrors).map((message, index) => jsx("li", { children: message }, `${message}-${index}`)) })] })), activeService !== 'general' && !selectedServices[activeService] && (jsxs("div", { className: sx(mobileEnableStyle), "data-test": "individual-travel-request-mobile-enable", children: [jsxs("span", { children: ["Add ", SERVICE_LABELS[activeService], " to this request"] }), jsx(Toggle, { "aria-label": `Enable ${SERVICE_LABELS[activeService]}`, checked: false, onChange: () => enableFromStrip(activeService), size: "sm" })] })), jsxs(Section, { title: "Traveler information", description: "Tell the travel team who is traveling. Required fields are marked with an asterisk.", icon: jsx(UsersIcon$1, { size: 24 }), dataTest: "individual-travel-request-section-travelers", children: [jsxs("fieldset", { className: sx(choiceGroupStyle), children: [jsx("legend", { className: sx(legendStyle), children: "Travel for" }), jsxs("label", { className: sx(choiceStyle), children: [jsx("input", { type: "radio", name: "travelerType", value: "self", checked: resolvedValues.travelerType === 'self' || !configuration.allowOtherTravelers, disabled: disabled, onChange: () => commit({ ...resolvedValues, travelerType: 'self', travelers: [] }), "data-test": "individual-travel-request-traveler-self" }), jsxs("span", { className: sx(choiceTextStyle), children: [jsx("strong", { children: currentTraveler.displayName }), jsx("small", { children: currentTraveler.email || 'Authenticated traveler' })] })] }), configuration.allowOtherTravelers && (jsxs("label", { className: sx(choiceStyle), children: [jsx("input", { type: "radio", name: "travelerType", value: "other", checked: resolvedValues.travelerType === 'other', disabled: disabled, onChange: () => commit({
|
|
35913
35986
|
...resolvedValues,
|
|
35914
35987
|
travelerType: 'other',
|
|
35915
35988
|
travelers: resolvedValues.travelers.length ? resolvedValues.travelers : [emptyTraveler()],
|
|
@@ -35981,7 +36054,7 @@ const IndividualTravelRequestDetailPage = ({ request, loading = false, error, no
|
|
|
35981
36054
|
: request
|
|
35982
36055
|
? `Travel request ${request.requestId}`
|
|
35983
36056
|
: 'Travel request';
|
|
35984
|
-
return (jsxs("main", { className: cx(sx(pageStyle$f), className), "data-test": "individual-travel-request-detail", "aria-busy": loading, children: [jsxs("header", { className: sx(pageHeaderStyle), children: [jsxs("div", { children: [jsx("p", { className: sx(eyebrowStyle), children: "Individual travel" }), jsx("h1", { className: sx(titleStyle$a), children: title }), request && !loading && !error && (jsxs("div", { className: sx(detailMetaStyle), "data-test": "individual-travel-request-detail-meta", children: [jsxs("span", { children: ["Submitted ", jsx("time", { dateTime: request.submittedAt, children: formatDateTime$1(request.submittedAt) })] }), request.completedAt && jsxs("span", { children: ["Completed ", jsx("time", { dateTime: request.completedAt, children: formatDateTime$1(request.completedAt) })] })] }))] }), onBack && (jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "individual-travel-request-detail-back", children: backLabel }))] }), jsxs("div", { className: sx(contentStyle$3), children: [loading && (jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-loading", children: [jsx(Spinner, { label: "Loading travel request" }), jsx("span", { children: "Loading request details\u2026" })] })), !loading && error && (jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-error", children: [jsx(Alert, { variant: "error", title: "The travel request could not be loaded", children: error }), onRetry && jsx(Button, { type: "button", variant: "secondary", onClick: onRetry, "data-test": "individual-travel-request-detail-retry", children: "Try again" })] })), !loading && !error && !request && (jsx("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-empty", children: jsx("p", { children: "No travel request was supplied." }) })), !loading && !error && request && (jsxs("div", { className: sx(formStyle), children: [notice && jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-detail-notice", children: jsx(Alert, { variant: "warning", children: notice }) }), jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-general", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Request information" }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Request number", dataTest: "individual-travel-request-detail-request-id", children: request.requestId }), jsx(DetailField, { label: "Traveler type", children: request.travelerType === 'self' ? 'Self' : 'Other traveler' }), jsx(DetailField, { label: "Submitted by", children: request.submittedBy?.name }), jsx(DetailField, { label: "Submitter email", children: request.submittedBy?.email }), request.submittedBy?.phone && jsx(DetailField, { label: "Submitter phone", children: request.submittedBy.phone }), request.additionalEmails && jsx(DetailField, { label: "Additional email addresses", children: request.additionalEmails })] })] }), jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-travelers", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Travelers" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Name" }), jsx("th", { scope: "col", children: "Date of birth" }), jsx("th", { scope: "col", children: "Gender" })] }) }), jsxs("tbody", { children: [request.travelers.map((traveler, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-traveler-${index + 1}`, children: [jsx("td", { children: travelerName(traveler) || '—' }), jsx("td", { children: formatDate(traveler.dateOfBirth) }), jsx("td", { children: traveler.gender || '—' })] }, `${travelerName(traveler)}-${index}`))), !request.travelers.length && jsx("tr", { children: jsx("td", { colSpan: 3, className: sx(emptyValueStyle), children: "No traveler details were supplied." }) })] })] }) })] }), Boolean(request.organizationAnswers?.length) && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-organization", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Organization information" }) }), jsx(AnswerList, { answers: request.organizationAnswers, prefix: "individual-travel-request-detail-organization-answer" })] })), Boolean(request.billingAnswers?.length) && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-billing", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Billing information" }) }), jsx(AnswerList, { answers: request.billingAnswers, prefix: "individual-travel-request-detail-billing-answer" })] })), request.airRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-air", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsxs("div", { children: [jsx("h2", { className: sx(sectionTitleStyle$4), children: "Air Request" }), jsx("p", { className: sx(sectionDescriptionStyle), children: request.airRequest.tripType.replace('-', ' ') })] }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "From" }), jsx("th", { scope: "col", children: "To" }), jsx("th", { scope: "col", children: "Depart" }), request.airRequest.tripType === 'round-trip' && jsx("th", { scope: "col", children: "Return" })] }) }), jsx("tbody", { children: request.airRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-air-leg-${index + 1}`, children: [jsx("td", { children: leg.departureLocation }), jsx("td", { children: leg.arrivalLocation }), jsxs("td", { children: [formatDate(leg.departureDate), " \u00B7 ", leg.departureTime] }), request.airRequest?.tripType === 'round-trip' && jsxs("td", { children: [formatDate(leg.returnDate), " \u00B7 ", leg.returnTime || '—'] })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Fare preference", children: request.airRequest.farePreference }), jsx(DetailField, { label: "Flight preference", children: request.airRequest.flightPreference }), jsx(DetailField, { label: "Preferred airline", children: request.airRequest.preferredAirline }), jsx(DetailField, { label: "Most important factor", children: request.airRequest.priority }), request.airRequest.details && jsx(DetailField, { label: "Air details", children: request.airRequest.details })] })] })), request.hotelRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-hotel", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Hotel Request" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "City" }), jsx("th", { scope: "col", children: "Check in" }), jsx("th", { scope: "col", children: "Check out" })] }) }), jsx("tbody", { children: request.hotelRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-hotel-leg-${index + 1}`, children: [jsx("td", { children: leg.city }), jsx("td", { children: formatDate(leg.checkInDate) }), jsx("td", { children: formatDate(leg.checkOutDate) })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Bed preference", children: request.hotelRequest.bedPreference }), jsx(DetailField, { label: "Smoking preference", children: request.hotelRequest.smokingPreference }), jsx(DetailField, { label: "Preferred hotel", children: request.hotelRequest.preferredHotel })] })] })), request.carRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-car", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Vehicle Rental Request" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Pickup" }), jsx("th", { scope: "col", children: "Pickup date" }), jsx("th", { scope: "col", children: "Drop-off" }), jsx("th", { scope: "col", children: "Drop-off date" })] }) }), jsx("tbody", { children: request.carRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-car-leg-${index + 1}`, children: [jsxs("td", { children: [leg.pickupCity, leg.pickupLocation ? ` · ${leg.pickupLocation}` : ''] }), jsxs("td", { children: [formatDate(leg.pickupDate), " \u00B7 ", leg.pickupTime] }), jsx("td", { children: leg.dropoffLocation || leg.pickupCity }), jsxs("td", { children: [formatDate(leg.dropoffDate), " \u00B7 ", leg.dropoffTime] })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Vehicle type", children: request.carRequest.vehicleType }), jsx(DetailField, { label: "Rental company", children: request.carRequest.rentalCompany }), jsx(DetailField, { label: "Flight number or tail number", children: request.carRequest.flightNumberOrTailNumber })] })] })), request.busRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-bus", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Bus Request" }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Pickup city", children: request.busRequest.pickupCity }), jsx(DetailField, { label: "Pickup location", children: request.busRequest.pickupLocation }), jsx(DetailField, { label: "Pickup date and time", children: formatDateTime$1(request.busRequest.pickupDateTime) }), jsx(DetailField, { label: "Drop-off city", children: request.busRequest.dropoffCity }), jsx(DetailField, { label: "Drop-off location", children: request.busRequest.dropoffLocation }), jsx(DetailField, { label: "Drop-off date and time", children: formatDateTime$1(request.busRequest.dropoffDateTime) }), jsx(DetailField, { label: "Vehicle type", children: request.busRequest.vehicleType }), request.busRequest.specialRequests && jsx(DetailField, { label: "Bus requests", children: request.busRequest.specialRequests })] })] })), request.specialRequests && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-special-requests", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Additional requests" }) }), jsx("p", { children: request.specialRequests })] }))] }))] })] }));
|
|
36057
|
+
return (jsxs("main", { className: cx(sx(pageStyle$g), className), "data-test": "individual-travel-request-detail", "aria-busy": loading, children: [jsxs("header", { className: sx(pageHeaderStyle), children: [jsxs("div", { children: [jsx("p", { className: sx(eyebrowStyle$1), children: "Individual travel" }), jsx("h1", { className: sx(titleStyle$b), children: title }), request && !loading && !error && (jsxs("div", { className: sx(detailMetaStyle), "data-test": "individual-travel-request-detail-meta", children: [jsxs("span", { children: ["Submitted ", jsx("time", { dateTime: request.submittedAt, children: formatDateTime$1(request.submittedAt) })] }), request.completedAt && jsxs("span", { children: ["Completed ", jsx("time", { dateTime: request.completedAt, children: formatDateTime$1(request.completedAt) })] })] }))] }), onBack && (jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "individual-travel-request-detail-back", children: backLabel }))] }), jsxs("div", { className: sx(contentStyle$3), children: [loading && (jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-loading", children: [jsx(Spinner, { label: "Loading travel request" }), jsx("span", { children: "Loading request details\u2026" })] })), !loading && error && (jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-error", children: [jsx(Alert, { variant: "error", title: "The travel request could not be loaded", children: error }), onRetry && jsx(Button, { type: "button", variant: "secondary", onClick: onRetry, "data-test": "individual-travel-request-detail-retry", children: "Try again" })] })), !loading && !error && !request && (jsx("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-empty", children: jsx("p", { children: "No travel request was supplied." }) })), !loading && !error && request && (jsxs("div", { className: sx(formStyle), children: [notice && jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-detail-notice", children: jsx(Alert, { variant: "warning", children: notice }) }), jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-general", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Request information" }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Request number", dataTest: "individual-travel-request-detail-request-id", children: request.requestId }), jsx(DetailField, { label: "Traveler type", children: request.travelerType === 'self' ? 'Self' : 'Other traveler' }), jsx(DetailField, { label: "Submitted by", children: request.submittedBy?.name }), jsx(DetailField, { label: "Submitter email", children: request.submittedBy?.email }), request.submittedBy?.phone && jsx(DetailField, { label: "Submitter phone", children: request.submittedBy.phone }), request.additionalEmails && jsx(DetailField, { label: "Additional email addresses", children: request.additionalEmails })] })] }), jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-travelers", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Travelers" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Name" }), jsx("th", { scope: "col", children: "Date of birth" }), jsx("th", { scope: "col", children: "Gender" })] }) }), jsxs("tbody", { children: [request.travelers.map((traveler, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-traveler-${index + 1}`, children: [jsx("td", { children: travelerName(traveler) || '—' }), jsx("td", { children: formatDate(traveler.dateOfBirth) }), jsx("td", { children: traveler.gender || '—' })] }, `${travelerName(traveler)}-${index}`))), !request.travelers.length && jsx("tr", { children: jsx("td", { colSpan: 3, className: sx(emptyValueStyle), children: "No traveler details were supplied." }) })] })] }) })] }), Boolean(request.organizationAnswers?.length) && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-organization", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Organization information" }) }), jsx(AnswerList, { answers: request.organizationAnswers, prefix: "individual-travel-request-detail-organization-answer" })] })), Boolean(request.billingAnswers?.length) && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-billing", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Billing information" }) }), jsx(AnswerList, { answers: request.billingAnswers, prefix: "individual-travel-request-detail-billing-answer" })] })), request.airRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-air", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsxs("div", { children: [jsx("h2", { className: sx(sectionTitleStyle$4), children: "Air Request" }), jsx("p", { className: sx(sectionDescriptionStyle), children: request.airRequest.tripType.replace('-', ' ') })] }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "From" }), jsx("th", { scope: "col", children: "To" }), jsx("th", { scope: "col", children: "Depart" }), request.airRequest.tripType === 'round-trip' && jsx("th", { scope: "col", children: "Return" })] }) }), jsx("tbody", { children: request.airRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-air-leg-${index + 1}`, children: [jsx("td", { children: leg.departureLocation }), jsx("td", { children: leg.arrivalLocation }), jsxs("td", { children: [formatDate(leg.departureDate), " \u00B7 ", leg.departureTime] }), request.airRequest?.tripType === 'round-trip' && jsxs("td", { children: [formatDate(leg.returnDate), " \u00B7 ", leg.returnTime || '—'] })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Fare preference", children: request.airRequest.farePreference }), jsx(DetailField, { label: "Flight preference", children: request.airRequest.flightPreference }), jsx(DetailField, { label: "Preferred airline", children: request.airRequest.preferredAirline }), jsx(DetailField, { label: "Most important factor", children: request.airRequest.priority }), request.airRequest.details && jsx(DetailField, { label: "Air details", children: request.airRequest.details })] })] })), request.hotelRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-hotel", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Hotel Request" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "City" }), jsx("th", { scope: "col", children: "Check in" }), jsx("th", { scope: "col", children: "Check out" })] }) }), jsx("tbody", { children: request.hotelRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-hotel-leg-${index + 1}`, children: [jsx("td", { children: leg.city }), jsx("td", { children: formatDate(leg.checkInDate) }), jsx("td", { children: formatDate(leg.checkOutDate) })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Bed preference", children: request.hotelRequest.bedPreference }), jsx(DetailField, { label: "Smoking preference", children: request.hotelRequest.smokingPreference }), jsx(DetailField, { label: "Preferred hotel", children: request.hotelRequest.preferredHotel })] })] })), request.carRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-car", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Vehicle Rental Request" }) }), jsx("div", { className: sx(detailTableWrapStyle), children: jsxs("table", { className: sx(detailTableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Pickup" }), jsx("th", { scope: "col", children: "Pickup date" }), jsx("th", { scope: "col", children: "Drop-off" }), jsx("th", { scope: "col", children: "Drop-off date" })] }) }), jsx("tbody", { children: request.carRequest.legs.map((leg, index) => (jsxs("tr", { "data-test": `individual-travel-request-detail-car-leg-${index + 1}`, children: [jsxs("td", { children: [leg.pickupCity, leg.pickupLocation ? ` · ${leg.pickupLocation}` : ''] }), jsxs("td", { children: [formatDate(leg.pickupDate), " \u00B7 ", leg.pickupTime] }), jsx("td", { children: leg.dropoffLocation || leg.pickupCity }), jsxs("td", { children: [formatDate(leg.dropoffDate), " \u00B7 ", leg.dropoffTime] })] }, index))) })] }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Vehicle type", children: request.carRequest.vehicleType }), jsx(DetailField, { label: "Rental company", children: request.carRequest.rentalCompany }), jsx(DetailField, { label: "Flight number or tail number", children: request.carRequest.flightNumberOrTailNumber })] })] })), request.busRequest && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-bus", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Bus Request" }) }), jsxs("dl", { className: sx(detailGridStyle), children: [jsx(DetailField, { label: "Pickup city", children: request.busRequest.pickupCity }), jsx(DetailField, { label: "Pickup location", children: request.busRequest.pickupLocation }), jsx(DetailField, { label: "Pickup date and time", children: formatDateTime$1(request.busRequest.pickupDateTime) }), jsx(DetailField, { label: "Drop-off city", children: request.busRequest.dropoffCity }), jsx(DetailField, { label: "Drop-off location", children: request.busRequest.dropoffLocation }), jsx(DetailField, { label: "Drop-off date and time", children: formatDateTime$1(request.busRequest.dropoffDateTime) }), jsx(DetailField, { label: "Vehicle type", children: request.busRequest.vehicleType }), request.busRequest.specialRequests && jsx(DetailField, { label: "Bus requests", children: request.busRequest.specialRequests })] })] })), request.specialRequests && (jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-special-requests", children: [jsx("div", { className: sx(sectionHeaderStyle), children: jsx("h2", { className: sx(sectionTitleStyle$4), children: "Additional requests" }) }), jsx("p", { children: request.specialRequests })] }))] }))] })] }));
|
|
35985
36058
|
};
|
|
35986
36059
|
|
|
35987
36060
|
/**
|
|
@@ -35993,7 +36066,7 @@ const IndividualTravelRequestDetailPage = ({ request, loading = false, error, no
|
|
|
35993
36066
|
* the first place, and `'& p'` / `'& ul, & ol'` say what `:global` was working
|
|
35994
36067
|
* around.
|
|
35995
36068
|
*/
|
|
35996
|
-
const pageStyle$
|
|
36069
|
+
const pageStyle$f = {
|
|
35997
36070
|
label: 'InfoCenterPage-pageStyle',
|
|
35998
36071
|
display: 'flex',
|
|
35999
36072
|
flexDirection: 'column',
|
|
@@ -36038,7 +36111,7 @@ const headerTextStyle = {
|
|
|
36038
36111
|
label: 'InfoCenterPage-headerTextStyle',
|
|
36039
36112
|
flex: 1,
|
|
36040
36113
|
};
|
|
36041
|
-
const titleStyle$
|
|
36114
|
+
const titleStyle$a = {
|
|
36042
36115
|
label: 'InfoCenterPage-titleStyle',
|
|
36043
36116
|
fontSize: 'var(--fs-2xl)',
|
|
36044
36117
|
lineHeight: 'var(--lh-2xl)',
|
|
@@ -36090,7 +36163,7 @@ const gridStyle = {
|
|
|
36090
36163
|
gap: 'var(--space-4)',
|
|
36091
36164
|
};
|
|
36092
36165
|
/* Article card */
|
|
36093
|
-
const cardStyle$
|
|
36166
|
+
const cardStyle$2 = {
|
|
36094
36167
|
label: 'InfoCenterPage-cardStyle',
|
|
36095
36168
|
position: 'relative',
|
|
36096
36169
|
display: 'flex',
|
|
@@ -36240,7 +36313,7 @@ const CATEGORY_ORDER = ['Alert', 'General', 'Air', 'Car', 'Hotel', 'Policy', 'ST
|
|
|
36240
36313
|
const ArticleCard = ({ article, isAdmin, onOpen, onEdit }) => {
|
|
36241
36314
|
const meta = metaFor(article.category);
|
|
36242
36315
|
const CategoryIcon = meta.icon;
|
|
36243
|
-
return (jsxs("div", { className: cx(sx(cardStyle$
|
|
36316
|
+
return (jsxs("div", { className: cx(sx(cardStyle$2), meta.alert && sx(cardAlertStyle)), children: [jsxs("span", { className: cx(sx(categoryBadgeStyle), meta.alert && sx(categoryAlertStyle)), children: [jsx(CategoryIcon, { size: 13 }), meta.label] }), jsx("h3", { className: sx(cardTitleStyle), children: article.title }), article.body && jsx("p", { className: sx(cardBodyStyle), children: article.body }), jsxs("button", { type: "button", className: sx(readMoreStyle), onClick: () => onOpen(article), children: ["Read more", jsx(ChevronRightIcon$1, { size: 14 })] }), isAdmin && (jsx("button", { type: "button", className: sx(editButtonStyle), onClick: () => onEdit?.(article), title: "Edit article", "aria-label": "Edit article", children: jsx(EditIcon$2, { size: 14 }) }))] }));
|
|
36244
36317
|
};
|
|
36245
36318
|
/**
|
|
36246
36319
|
* InfoCenterPage - Info Center article browser
|
|
@@ -36293,7 +36366,7 @@ const InfoCenterPage = ({ title = 'Info Center', accountName, articles = [], sta
|
|
|
36293
36366
|
};
|
|
36294
36367
|
const modalMeta = modalArticle ? metaFor(modalArticle.category) : null;
|
|
36295
36368
|
const ModalCategoryIcon = modalMeta?.icon;
|
|
36296
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
36369
|
+
return (jsxs("div", { className: cx(sx(pageStyle$f), className), children: [showBreadcrumb && (jsxs("nav", { className: sx(breadcrumbStyle$3), "aria-label": "Breadcrumb", children: [jsxs("a", { href: homeHref, children: [jsx(HomeIcon, { size: 14 }), "Home"] }), jsx("span", { children: "/" }), jsx("span", { children: "Info Center" })] })), jsxs("div", { className: sx(headerStyle$c), children: [jsxs("div", { className: sx(headerTextStyle), children: [jsx("h1", { className: sx(titleStyle$a), children: title }), accountName && (jsxs("p", { className: sx(subtitleStyle$3), children: ["Travel resources and program information for ", accountName, "."] }))] }), isAdmin && (jsxs(Button, { variant: "primary", size: "sm", onClick: onAddArticle, children: [jsx(PlusIcon$2, { size: 15 }), "Add Article"] }))] }), pageState === 'loading' && (jsxs("div", { className: sx(stateBlockStyle), children: [jsx(Spinner, { size: "md" }), jsx("span", { children: "Loading\u2026" })] })), pageState === 'error' && (jsxs("div", { className: cx(sx(stateBlockStyle), sx(stateErrorStyle)), children: [jsx(WarningIcon$1, { size: 28 }), jsx("p", { className: sx(stateTextStyle), children: "Unable to load Info Center resources." })] })), pageState === 'empty' && (jsxs("div", { className: sx(stateBlockStyle), children: [jsx(InfoIcon$1, { size: 28 }), jsx("p", { className: sx(stateTextStyle), children: "No resources available." })] })), pageState === 'data' && (jsxs(Fragment, { children: [jsx(TabStrip, { className: sx(tabsStyle$1), tabs: [
|
|
36297
36370
|
{ id: 'All', label: 'All', icon: jsx(GridIcon, { size: 15 }) },
|
|
36298
36371
|
...categories.map((cat) => {
|
|
36299
36372
|
const m = metaFor(cat);
|
|
@@ -36317,7 +36390,7 @@ const InfoCenterPage = ({ title = 'Info Center', accountName, articles = [], sta
|
|
|
36317
36390
|
* between two module classes (`.costTotal .costLabel/.costValue`) becomes
|
|
36318
36391
|
* `costTotalTextStyle` — see the note there.
|
|
36319
36392
|
*/
|
|
36320
|
-
const pageStyle$
|
|
36393
|
+
const pageStyle$e = {
|
|
36321
36394
|
label: 'ItineraryPage-pageStyle',
|
|
36322
36395
|
display: 'flex',
|
|
36323
36396
|
flexDirection: 'column',
|
|
@@ -36767,13 +36840,13 @@ const ItineraryPage = ({ tripName, recordLocator, travelers, startDate, endDate,
|
|
|
36767
36840
|
const agentCard = agent && (jsxs("section", { className: sx(agentCardStyle), "aria-label": "Your travel team", children: [jsx("div", { className: sx(agentHeaderStyle), children: jsx("h2", { className: sx(agentTitleStyle), children: "Your Travel Team" }) }), jsxs("div", { className: sx(agentRowStyle), children: [jsxs("div", { className: sx(agentInfoStyle), children: [jsx("p", { className: sx(agentNameStyle), children: agent.name }), agent.role && jsx("p", { className: sx(agentRoleStyle), children: agent.role })] }), jsxs("ul", { className: sx(agentLinksStyle), children: [agent.email && (jsx(AgentContact, { icon: jsx(MailIcon, { size: 16 }), label: "Email", children: jsx("a", { className: sx(agentLinkStyle), href: `mailto:${agent.email}`, children: agent.email }) })), agent.businessHours && (jsx(AgentContact, { icon: jsx(CalendarIcon$1, { size: 16 }), label: "Business Hours", children: agent.businessHours })), agent.tollFreeNumber && (jsx(AgentContact, { icon: jsx(PhoneIcon, { size: 16 }), label: "Toll Free Number", children: jsx("a", { className: sx(agentLinkStyle), href: telHref(agent.tollFreeNumber), children: agent.tollFreeNumber }) })), agent.afterHoursPhone && (jsxs(AgentContact, { icon: jsx(HeadsetIcon, { size: 16 }), label: "After-Hours/Emergency Service", children: [jsx("a", { className: sx(agentLinkStyle), href: telHref(agent.afterHoursPhone), children: agent.afterHoursPhone }), agent.afterHoursNote && jsxs(Fragment, { children: [" ", agent.afterHoursNote] })] }))] })] })] }));
|
|
36768
36841
|
const titleRow = (jsxs("div", { className: sx(titleRowStyle), children: [jsx("h2", { className: sx(sectionTitleStyle$3), children: "Air Invoice Details" }), showStatus && jsx(StatusBadge, { status: badge.variant, label: badge.label })] }));
|
|
36769
36842
|
const actions = showActions && (jsxs("div", { className: sx(actionsStyle$1), "aria-label": "Itinerary actions", children: [onPrint && jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsx(PrinterIcon, { size: 16 }), "data-test": "itinerary-print", onClick: onPrint, children: "Print" }), onEmail && jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsx(MailIcon, { size: 16 }), "data-test": "itinerary-email", onClick: onEmail, children: "Email" }), onAddToCalendar && jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsx(CalendarIcon$1, { size: 16 }), "data-test": "itinerary-add-to-calendar", onClick: onAddToCalendar, children: "Add to calendar" }), onDownloadInvoice && jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsx(DocumentIcon, { size: 16 }), "data-test": "itinerary-download-invoice", onClick: onDownloadInvoice, children: "Invoice PDF" })] }));
|
|
36770
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
36843
|
+
return (jsxs("div", { className: cx(sx(pageStyle$e), className), "data-test": "itinerary-page", children: [jsx(PageHeaderSubsection, { sectionName: sectionName, pageName: pageName ?? (travelers.length > 0 ? `Itinerary for ${itineraryPageName(travelers)}` : 'Itinerary'), meta: startDate && endDate ? jsx(TravelDateRange, { startDate: startDate, endDate: endDate }) : undefined, onBack: onBack, backLabel: backLabel }), !showInvoice && notices, !showInvoice && agentCard, showInvoice ? (jsxs("section", { className: sx(invoiceSectionStyle), "aria-label": "Booking and invoice", children: [jsxs("div", { className: sx(invoiceActionsStyle), children: [jsx(Segment, { size: "sm", options: VIEW_OPTIONS, value: view, onChange: changeView, "aria-label": "Itinerary view" }), actions] }), !itineraryOnly && notices, !itineraryOnly && agentCard, !itineraryOnly && bookingCard, !itineraryOnly && invoice && jsx(AirInvoiceCard, { ...invoice, title: "Air Invoice Details" })] })) : (jsxs("header", { className: sx(headerStyle$b), children: [jsxs("div", { className: sx(headerMainStyle$1), children: [titleRow, jsxs("dl", { className: sx(factsStyle$1), children: [recordLocator && (jsxs("div", { className: sx(factStyle), children: [jsx("dt", { className: sx(factLabelStyle), children: "Confirmation" }), jsx("dd", { className: cx(sx(factValueStyle), sx(monoStyle$1)), children: recordLocator })] })), startDate && endDate && (jsxs("div", { className: sx(factStyle), children: [jsx("dt", { className: sx(factLabelStyle), children: "Travel dates" }), jsx("dd", { className: sx(factValueStyle), children: formatItineraryDateRange(startDate, endDate) })] })), travelers.length > 0 && (jsxs("div", { className: sx(factStyle), children: [jsx("dt", { className: sx(factLabelStyle), children: travelers.length === 1 ? 'Traveler' : 'Travelers' }), jsx("dd", { className: sx(factValueStyle), title: travelers.join(', '), children: travelerLabel })] })), sportCode && (jsxs("div", { className: sx(factStyle), children: [jsx("dt", { className: sx(factLabelStyle), children: "Program" }), jsx("dd", { className: sx(factValueStyle), children: sportCode })] }))] })] }), actions] })), !showInvoice && bookingCard, !itineraryOnly && travelers.length > 1 && (jsxs("section", { className: sx(travelersStyle), "aria-label": "Travelers on this itinerary", children: [jsx("h2", { className: sx(sectionTitleStyle$3), children: "Travelers" }), jsx("ul", { className: sx(travelerListStyle), children: travelers.map((traveler) => jsx("li", { className: sx(travelerChipStyle), children: traveler }, traveler)) })] })), !itineraryOnly && !loading && !error && notice && (jsx("div", { "data-test": "itinerary-notice", children: jsx(Alert, { variant: "warning", title: "Additional booking details", children: notice }) })), jsxs("div", { className: sx(bodyStyle$1), children: [jsx("div", { className: sx(mainStyle$1), children: jsxs("div", { "data-test": loading ? 'itinerary-loading' : error ? 'itinerary-error' : undefined, children: [jsx(ItineraryTimeline, { segments: segments, loading: loading, error: error, onCheckIn: onCheckIn, showTypeTabs: true }), error && onRetry && (jsx("div", { className: sx(retryRowStyle), children: jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: onRetry, "data-test": "itinerary-retry", children: "Try again" }) }))] }) }), !loading && !error && (closingBanners.length > 0 || closingNotes) && (jsxs("div", { className: sx(noticesStyle), "data-test": "itinerary-closing", children: [closingBanners.length > 0 && jsx(PageBanners, { className: sx(bannersStyle), systemBanners: closingBanners, alertBanners: [] }), closingNotes && jsx("div", { className: sx(closingNotesStyle), children: closingNotes })] }))] })] }));
|
|
36771
36844
|
};
|
|
36772
36845
|
ItineraryPage.displayName = 'ItineraryPage';
|
|
36773
36846
|
|
|
36774
36847
|
/** NotFoundPage's compiled rules. A straight translation — nothing in the
|
|
36775
36848
|
* stylesheet overlapped, so no specificity work was needed. */
|
|
36776
|
-
const pageStyle$
|
|
36849
|
+
const pageStyle$d = {
|
|
36777
36850
|
label: 'NotFoundPage-pageStyle',
|
|
36778
36851
|
display: 'flex',
|
|
36779
36852
|
alignItems: 'center',
|
|
@@ -36782,7 +36855,7 @@ const pageStyle$c = {
|
|
|
36782
36855
|
padding: 'var(--space-4)',
|
|
36783
36856
|
backgroundColor: 'var(--color-gray-100)',
|
|
36784
36857
|
};
|
|
36785
|
-
const cardStyle = {
|
|
36858
|
+
const cardStyle$1 = {
|
|
36786
36859
|
label: 'NotFoundPage-cardStyle',
|
|
36787
36860
|
width: '100%',
|
|
36788
36861
|
maxWidth: 400,
|
|
@@ -36811,7 +36884,7 @@ const errorCodeStyle = {
|
|
|
36811
36884
|
color: 'var(--color-gray-800)',
|
|
36812
36885
|
margin: '0 0 var(--space-4) 0',
|
|
36813
36886
|
};
|
|
36814
|
-
const titleStyle$
|
|
36887
|
+
const titleStyle$9 = {
|
|
36815
36888
|
label: 'NotFoundPage-titleStyle',
|
|
36816
36889
|
fontSize: 'var(--text-xl)',
|
|
36817
36890
|
fontWeight: 'var(--font-medium)',
|
|
@@ -36840,13 +36913,13 @@ const DefaultIllustration = () => (jsxs("svg", { width: "120", height: "120", vi
|
|
|
36840
36913
|
* - Optional illustration
|
|
36841
36914
|
*/
|
|
36842
36915
|
const NotFoundPage = ({ errorCode = '404', title = 'Page Not Found', message = 'The page you are looking for does not exist or you do not have permission to access it.', action, illustration, className = '', }) => {
|
|
36843
|
-
const pageClasses = cx(sx(pageStyle$
|
|
36844
|
-
return (jsx("div", { className: pageClasses, children: jsxs("div", { className: sx(cardStyle), children: [jsx("div", { className: sx(illustrationStyle), children: illustration || jsx(DefaultIllustration, {}) }), jsx("h1", { className: sx(errorCodeStyle), children: errorCode }), jsx("h2", { className: sx(titleStyle$
|
|
36916
|
+
const pageClasses = cx(sx(pageStyle$d), className);
|
|
36917
|
+
return (jsx("div", { className: pageClasses, children: jsxs("div", { className: sx(cardStyle$1), children: [jsx("div", { className: sx(illustrationStyle), children: illustration || jsx(DefaultIllustration, {}) }), jsx("h1", { className: sx(errorCodeStyle), children: errorCode }), jsx("h2", { className: sx(titleStyle$9), children: title }), jsx("p", { className: sx(messageStyle), children: message }), action && (jsx("div", { className: sx(actionStyle), children: action }))] }) }));
|
|
36845
36918
|
};
|
|
36846
36919
|
NotFoundPage.displayName = 'NotFoundPage';
|
|
36847
36920
|
|
|
36848
36921
|
/** OffFleetLearnedExamplesPage's compiled rules — flat, no specificity ladder. */
|
|
36849
|
-
const pageStyle$
|
|
36922
|
+
const pageStyle$c = {
|
|
36850
36923
|
label: 'OffFleetLearnedExamplesPage-pageStyle',
|
|
36851
36924
|
display: 'flex',
|
|
36852
36925
|
flexDirection: 'column',
|
|
@@ -36862,7 +36935,7 @@ const headerStyle$a = {
|
|
|
36862
36935
|
flexDirection: 'column',
|
|
36863
36936
|
gap: 'var(--space-2)',
|
|
36864
36937
|
};
|
|
36865
|
-
const titleStyle$
|
|
36938
|
+
const titleStyle$8 = {
|
|
36866
36939
|
label: 'OffFleetLearnedExamplesPage-titleStyle',
|
|
36867
36940
|
margin: 0,
|
|
36868
36941
|
color: 'var(--fg-1)',
|
|
@@ -36941,7 +37014,7 @@ const pairTitleStyle = {
|
|
|
36941
37014
|
letterSpacing: '0.06em',
|
|
36942
37015
|
textTransform: 'uppercase',
|
|
36943
37016
|
};
|
|
36944
|
-
const codeStyle = {
|
|
37017
|
+
const codeStyle$1 = {
|
|
36945
37018
|
label: 'OffFleetLearnedExamplesPage-codeStyle',
|
|
36946
37019
|
maxHeight: 260,
|
|
36947
37020
|
margin: 0,
|
|
@@ -36966,7 +37039,7 @@ const OFF_FLEET_LEARNED_EMPTY_COPY = 'The corpus starts empty and only /api/Repr
|
|
|
36966
37039
|
* Learned examples — the corrections corpus. The empty state explains the mechanism
|
|
36967
37040
|
* rather than apologising, because an empty corpus is the correct starting state.
|
|
36968
37041
|
*/
|
|
36969
|
-
const OffFleetLearnedExamplesPage = ({ examples = [], onOpenExample, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$
|
|
37042
|
+
const OffFleetLearnedExamplesPage = ({ examples = [], onOpenExample, className = '', }) => (jsxs("div", { className: cx(sx(pageStyle$c), className), "data-test": "off-fleet-learned-examples-page", children: [jsxs("header", { className: sx(headerStyle$a), children: [jsx("h1", { className: sx(titleStyle$8), children: "Learned examples" }), jsx("p", { className: sx(descriptionStyle$3), children: OFF_FLEET_LEARNED_DESCRIPTION })] }), examples.length === 0 ? (jsx(EmptyState$1, { title: "No examples yet", description: OFF_FLEET_LEARNED_EMPTY_COPY, icon: jsx(LightbulbIcon, { size: 32 }) })) : (jsx("ul", { className: sx(examplesStyle), children: examples.map((example) => (jsxs("li", { className: sx(exampleStyle), "data-test": "off-fleet-learned-example", children: [jsxs("div", { className: sx(exampleHeaderStyle), children: [jsx("span", { className: sx(operatorStyle), children: example.operator }), jsxs("span", { className: sx(metaStyle), children: [example.sourceFileName, " \u00B7 learned ", example.learnedLabel] }), onOpenExample && (jsx(Button, { variant: "outline", size: "sm", className: sx(openButtonStyle), onClick: () => onOpenExample(example.id), "data-test": "off-fleet-open-example", children: "Open" }))] }), jsxs("div", { className: sx(pairStyle), children: [jsxs("div", { className: sx(pairSideStyle), children: [jsx("h2", { className: sx(pairTitleStyle), children: "Raw text" }), jsx("pre", { className: sx(codeStyle$1), "data-test": "off-fleet-example-raw", children: example.rawText })] }), jsxs("div", { className: sx(pairSideStyle), children: [jsx("h2", { className: sx(pairTitleStyle), children: "Corrected JSON" }), jsx("pre", { className: sx(codeStyle$1), "data-test": "off-fleet-example-json", children: example.correctedJson })] })] })] }, example.id))) }))] }));
|
|
36970
37043
|
OffFleetLearnedExamplesPage.displayName = 'OffFleetLearnedExamplesPage';
|
|
36971
37044
|
|
|
36972
37045
|
/**
|
|
@@ -36975,7 +37048,7 @@ OffFleetLearnedExamplesPage.displayName = 'OffFleetLearnedExamplesPage';
|
|
|
36975
37048
|
* One rule per element, no shared properties between them, so no selector
|
|
36976
37049
|
* needed doubling on the way across.
|
|
36977
37050
|
*/
|
|
36978
|
-
const pageStyle$
|
|
37051
|
+
const pageStyle$b = {
|
|
36979
37052
|
label: 'OffFleetReviewQueuePage-pageStyle',
|
|
36980
37053
|
display: 'flex',
|
|
36981
37054
|
flexDirection: 'column',
|
|
@@ -36991,7 +37064,7 @@ const headerStyle$9 = {
|
|
|
36991
37064
|
flexDirection: 'column',
|
|
36992
37065
|
gap: 'var(--space-2)',
|
|
36993
37066
|
};
|
|
36994
|
-
const titleStyle$
|
|
37067
|
+
const titleStyle$7 = {
|
|
36995
37068
|
label: 'OffFleetReviewQueuePage-titleStyle',
|
|
36996
37069
|
margin: 0,
|
|
36997
37070
|
color: 'var(--fg-1)',
|
|
@@ -37138,7 +37211,7 @@ const OffFleetReviewQueuePage = ({ submissions, counts, onReview, onOpenRawText,
|
|
|
37138
37211
|
render: (_value, submission) => (jsx(Button, { size: "sm", onClick: () => onReview?.(submission.id), "data-test": "off-fleet-review", children: "Review" })),
|
|
37139
37212
|
},
|
|
37140
37213
|
];
|
|
37141
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
37214
|
+
return (jsxs("div", { className: cx(sx(pageStyle$b), className), "data-test": "off-fleet-review-queue-page", children: [jsxs("header", { className: sx(headerStyle$9), children: [jsx("h1", { className: sx(titleStyle$7), children: "Review queue" }), jsx("p", { className: sx(descriptionStyle$2), children: OFF_FLEET_QUEUE_DESCRIPTION })] }), jsxs("div", { className: sx(statsStyle), "data-test": "off-fleet-stats", children: [jsx(Metric, { label: "Needs review", value: tally['needs-review'] }), jsx(Metric, { label: "Received", value: tally.received }), jsx(Metric, { label: "Processing", value: tally.processing }), jsx(Metric, { label: "Parsed", value: tally.parsed }), jsx(Metric, { label: "All submissions", value: tally.all })] }), jsx(Table, { columns: columns, data: submissions, rowKey: "id", loading: loading, emptyContent: jsx(EmptyState$1, { size: "sm", title: "Nothing waiting on review", description: "Submissions land here only when the parser cannot reconcile a quote against a Trip segment. An empty queue means every off-fleet quote matched." }) })] }));
|
|
37142
37215
|
};
|
|
37143
37216
|
OffFleetReviewQueuePage.displayName = 'OffFleetReviewQueuePage';
|
|
37144
37217
|
|
|
@@ -37151,7 +37224,7 @@ OffFleetReviewQueuePage.displayName = 'OffFleetReviewQueuePage';
|
|
|
37151
37224
|
* `.section` together, is now split across the two style objects it applied to
|
|
37152
37225
|
* — an object owns every rule that targets it.
|
|
37153
37226
|
*/
|
|
37154
|
-
const pageStyle$
|
|
37227
|
+
const pageStyle$a = {
|
|
37155
37228
|
label: 'OffFleetSubmissionDetailPage-pageStyle',
|
|
37156
37229
|
display: 'flex',
|
|
37157
37230
|
flexDirection: 'column',
|
|
@@ -37184,7 +37257,7 @@ const headerStyle$8 = {
|
|
|
37184
37257
|
flexDirection: 'column',
|
|
37185
37258
|
gap: 'var(--space-1)',
|
|
37186
37259
|
};
|
|
37187
|
-
const titleStyle$
|
|
37260
|
+
const titleStyle$6 = {
|
|
37188
37261
|
label: 'OffFleetSubmissionDetailPage-titleStyle',
|
|
37189
37262
|
margin: 0,
|
|
37190
37263
|
color: 'var(--fg-1)',
|
|
@@ -37506,13 +37579,13 @@ const OffFleetSubmissionDetailPage = ({ submissionId, fileName, statusLabel = 'N
|
|
|
37506
37579
|
target?.querySelector('input')?.focus();
|
|
37507
37580
|
};
|
|
37508
37581
|
const blocked = Boolean(blockedReason);
|
|
37509
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
37582
|
+
return (jsxs("div", { className: cx(sx(pageStyle$a), className), "data-test": "off-fleet-submission-detail-page", children: [jsxs("div", { className: sx(topRowStyle), children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$2), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "off-fleet-detail-back", children: backLabel })), jsx(StatusBadge, { status: "in-review", label: statusLabel })] }), jsxs("header", { className: sx(headerStyle$8), children: [jsx("h1", { className: sx(titleStyle$6), children: fileName }), jsx("p", { className: sx(subtitleStyle$2), children: submissionId })] }), jsx(Alert, { variant: "warning", title: "Why this needs review", children: jsx("span", { className: sx(reasonStyle), "data-test": "off-fleet-detail-reason", children: failureReason }) }), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Source document", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Source document" }), jsx("p", { className: sx(sectionHelpStyle$1), children: "Text the parser actually read \u2014 OCR damage included." }), jsx("pre", { className: sx(rawTextStyle), "data-test": "off-fleet-raw-text", children: rawText })] }), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Submission", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Submission" }), jsxs("dl", { className: sx(factsStyle), children: [jsxs("div", { children: [jsx("dt", { children: "File name" }), jsx("dd", { children: fileName })] }), jsxs("div", { children: [jsx("dt", { children: "Carrier" }), jsx("dd", { children: carrier })] }), jsxs("div", { children: [jsx("dt", { children: "Carrier Union" }), jsx("dd", { className: sx(monoStyle), children: carrierUnion })] }), jsxs("div", { children: [jsx("dt", { children: "Flight Program" }), jsx("dd", { className: sx(monoStyle), children: flightProgram })] }), jsxs("div", { children: [jsx("dt", { children: "Received" }), jsx("dd", { children: receivedAt })] }), jsxs("div", { children: [jsx("dt", { children: "Updated" }), jsx("dd", { children: updatedAt })] })] })] }), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Segments", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Segments" }), jsxs("p", { className: sx(sectionHelpStyle$1), children: [charterSegmentCount, " charter segment(s) on this Flight Program"] }), jsx(Accordion, { defaultOpen: false, header: jsxs("span", { className: sx(accordionHeaderStyle), children: ["Trip segments available for matching (", charterSegmentCount, ")"] }), children: jsx("div", { className: sx(tableScrollStyle), children: jsxs("table", { className: sx(segmentTableStyle), "data-test": "off-fleet-segments", children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Departs" }), jsx("th", { scope: "col", children: "Route" }), jsx("th", { scope: "col", children: "Trip" })] }) }), jsx("tbody", { children: tripSegments.map((segment) => (jsxs("tr", { children: [jsx("td", { children: segment.departs }), jsxs("td", { children: [segment.origin, " \u2192 ", segment.destination] }), jsx("td", { className: sx(monoStyle), children: segment.tripGuid })] }, segment.id))) })] }) }) })] }), extractionJson && (jsx("section", { className: sx(sectionStyle$2), "aria-label": "Extraction JSON", children: jsx(Accordion, { defaultOpen: false, header: jsx("span", { className: sx(accordionHeaderStyle), children: "Extraction JSON as stored" }), children: jsx("pre", { className: sx(rawTextStyle), "data-test": "off-fleet-extraction-json", children: extractionJson }) }) })), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Quote header", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Quote header" }), jsx("p", { className: sx(sectionHelpStyle$1), children: "Fields the parser maps onto the Salesforce Flight Quote. Blank means null." }), jsxs("div", { className: sx(headerGridStyle), children: [jsx(Input, { id: "off-fleet-operator", label: "Operator", helperText: "As stated in the document", value: quoteHeader.operator, onChange: (event) => updateHeader('operator', event.target.value), "data-test": "off-fleet-operator" }), jsx(Input, { id: "off-fleet-charterer", label: "Charterer", helperText: "School or organisation, only if explicit", value: quoteHeader.charterer, onChange: (event) => updateHeader('charterer', event.target.value), "data-test": "off-fleet-charterer" }), jsx(Input, { id: "off-fleet-quote-date", type: "date", label: "Quote date", helperText: "Date of the quote, not of a flight", value: quoteHeader.quoteDate, onChange: (event) => updateHeader('quoteDate', event.target.value), "data-test": "off-fleet-quote-date" }), jsx(Input, { id: "off-fleet-currency", label: "Currency", helperText: "ISO code the document prices in", value: quoteHeader.currency, onChange: (event) => updateHeader('currency', event.target.value), "data-test": "off-fleet-currency" }), jsx(Input, { id: "off-fleet-fuel-base", label: "Fuel base price", helperText: "Numeric, no currency symbol", value: quoteHeader.fuelBasePrice, onChange: (event) => updateHeader('fuelBasePrice', event.target.value), "data-test": "off-fleet-fuel-base" }), jsx(Input, { id: "off-fleet-unit-price", label: "Unit price", helperText: "Only if distinct from the leg table", value: quoteHeader.unitPrice, onChange: (event) => updateHeader('unitPrice', event.target.value), "data-test": "off-fleet-unit-price" }), jsx(Select, { id: "off-fleet-price-basis", label: "Price basis", helperText: "How the stated prices group onto legs. Changing this changes every per-leg price.", options: PRICE_BASIS_OPTIONS, value: quoteHeader.priceBasis, onChange: (event) => updateHeader('priceBasis', event.target.value), className: sx(wideFieldStyle), "data-test": "off-fleet-price-basis" }), jsx(Input, { id: "off-fleet-stated-total", label: "Stated total", helperText: "Only if the document states one. Checked to \u00B1$1 after normalization.", value: quoteHeader.statedTotal, onChange: (event) => updateHeader('statedTotal', event.target.value), "data-test": "off-fleet-stated-total" })] })] }), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Flight legs", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Flight legs" }), jsx("p", { className: sx(sectionHelpStyle$1), children: "One row per leg \u2014 one takeoff, one landing. Order matters for per round trip: legs are paired top-down." }), jsx("ol", { className: sx(legsStyle$1), children: legs.map((leg, index) => (jsxs("li", { className: sx(legStyle$1), ref: (node) => {
|
|
37510
37583
|
legRefs.current[leg.id] = node;
|
|
37511
37584
|
}, "data-test": "off-fleet-leg", children: [jsxs("div", { className: sx(legHeaderStyle), children: [jsxs("span", { className: sx(legIndexStyle), children: ["Leg ", index + 1] }), jsx(StatusBadge, { status: MATCH_BADGES[leg.match].status, label: MATCH_BADGES[leg.match].label }), jsx(Button, { variant: "ghost", size: "sm", className: sx(removeLegStyle), onClick: () => removeLeg(leg.id), "data-test": "off-fleet-remove-leg", children: "Remove leg" })] }), jsxs("div", { className: sx(legGridStyle), children: [jsx(Input, { id: `${leg.id}-date`, size: "sm", type: "date", label: "Date", value: leg.date, onChange: (event) => updateLeg(leg.id, { date: event.target.value }), "data-test": "off-fleet-leg-date" }), jsx(Input, { id: `${leg.id}-from`, size: "sm", label: "From", value: leg.from, onChange: (event) => updateLeg(leg.id, { from: event.target.value.toUpperCase() }), "data-test": "off-fleet-leg-from" }), jsx(Input, { id: `${leg.id}-to`, size: "sm", label: "To", value: leg.to, onChange: (event) => updateLeg(leg.id, { to: event.target.value.toUpperCase() }), "data-test": "off-fleet-leg-to" }), jsx(Input, { id: `${leg.id}-etd`, size: "sm", label: "ETD", value: leg.etd, onChange: (event) => updateLeg(leg.id, { etd: event.target.value }), "data-test": "off-fleet-leg-etd" }), jsx(Input, { id: `${leg.id}-eta`, size: "sm", label: "ETA", value: leg.eta, onChange: (event) => updateLeg(leg.id, { eta: event.target.value }), "data-test": "off-fleet-leg-eta" }), jsx(Input, { id: `${leg.id}-aircraft`, size: "sm", label: "Aircraft", value: leg.aircraft, onChange: (event) => updateLeg(leg.id, { aircraft: event.target.value }), "data-test": "off-fleet-leg-aircraft" }), jsx(Input, { id: `${leg.id}-seats`, size: "sm", label: "Seats", value: leg.seats, onChange: (event) => updateLeg(leg.id, { seats: event.target.value }), "data-test": "off-fleet-leg-seats" }), jsx(Input, { id: `${leg.id}-price`, size: "sm", label: "Price", value: leg.price, onChange: (event) => updateLeg(leg.id, { price: event.target.value }), "data-test": "off-fleet-leg-price" })] })] }, leg.id))) }), jsx(Button, { variant: "outline", size: "sm", onClick: addLeg, "data-test": "off-fleet-add-leg", children: "Add leg" })] }), jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Ambiguity flag", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Ambiguity flag" }), jsx(Textarea, { id: "off-fleet-ambiguity", label: "Ambiguity reason", helperText: "What a human still cannot tell from the document. Left blank, the extraction is treated as unambiguous.", rows: 3, value: ambiguityReason, onChange: (event) => setAmbiguityReason(event.target.value), "data-test": "off-fleet-ambiguity" })] }), preflight && (jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Pre-flight check", children: [jsx("h2", { className: sx(sectionTitleStyle$2), children: "Pre-flight check" }), jsx("div", { className: sx(tableScrollStyle), children: jsxs("table", { className: sx(preflightTableStyle), "data-test": "off-fleet-preflight", children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { scope: "col", children: "Leg" }), jsx("th", { scope: "col", children: "As stated" }), jsx("th", { scope: "col", children: "Per leg after normalization" })] }) }), jsx("tbody", { children: preflight.rows.map((row) => (jsxs("tr", { children: [jsx("th", { scope: "row", children: row.leg }), jsx("td", { children: row.asStated }), jsx("td", { children: row.perLegAfterNormalization })] }, row.leg))) }), jsx("tfoot", { children: jsxs("tr", { children: [jsx("th", { scope: "row", children: "Total" }), jsx("td", {}), jsx("td", { "data-test": "off-fleet-preflight-total", children: preflight.total })] }) })] }) }), jsxs("p", { className: sx(unmatchedStyle), "data-test": "off-fleet-unmatched-count", children: [preflight.unmatchedCount, " of ", preflight.legCount, " leg(s) unmatched"] }), jsx("ul", { className: sx(groupingsStyle), "data-test": "off-fleet-trip-groupings", children: preflight.tripGroupings.map((grouping) => (jsxs("li", { className: sx(groupingStyle), children: [jsx("span", { className: sx(monoStyle), children: grouping.tripGuid }), jsxs("span", { children: [grouping.legCount, " leg(s) \u00B7 ", grouping.total] })] }, grouping.tripGuid))) }), jsx("p", { className: sx(consequenceStyle), children: "Each total becomes one QuoteLineItem against a new Flight Quote for that Trip." }), preflight.diagnostics?.map((diagnostic) => (jsxs("div", { className: sx(diagnosticStyle), children: [jsx("p", { className: sx(diagnosticMessageStyle), "data-test": "off-fleet-diagnostic", children: diagnostic.message }), jsx(Button, { variant: "outline", size: "sm", onClick: () => jumpToLeg(diagnostic.legId), "data-test": "off-fleet-jump-to-leg", children: "Jump to leg" })] }, diagnostic.legId))), preflight.warnings?.map((warning) => (jsx(Alert, { variant: "warning", children: jsx("span", { className: sx(reasonStyle), "data-test": "off-fleet-warning", children: warning }) }, warning)))] })), jsxs("div", { className: sx(actionsStyle), children: [jsx(Button, { disabled: blocked, onClick: () => onCheckCorrection?.({ quoteHeader, legs, ambiguityReason }), "data-test": "off-fleet-check-correction", children: "Check correction" }), jsx(Button, { variant: "secondary", disabled: blocked, onClick: onReprocess, "data-test": "off-fleet-reprocess", children: "Reprocess submission" }), blockedReason && (jsx("p", { className: sx(blockedReasonStyle), "data-test": "off-fleet-blocked-reason", children: blockedReason }))] })] }));
|
|
37512
37585
|
};
|
|
37513
37586
|
OffFleetSubmissionDetailPage.displayName = 'OffFleetSubmissionDetailPage';
|
|
37514
37587
|
|
|
37515
|
-
const pageStyle$
|
|
37588
|
+
const pageStyle$9 = {
|
|
37516
37589
|
label: 'RosterProgramNumbersPage-pageStyle',
|
|
37517
37590
|
display: 'flex',
|
|
37518
37591
|
minWidth: 0,
|
|
@@ -37688,11 +37761,11 @@ const RosterProgramNumbersPage = ({ programs, loading = false, saving = false, o
|
|
|
37688
37761
|
accountNumber: values[String(program.id)] ?? '',
|
|
37689
37762
|
})));
|
|
37690
37763
|
};
|
|
37691
|
-
return (jsxs("section", { className: sx(pageStyle$
|
|
37764
|
+
return (jsxs("section", { className: sx(pageStyle$9), "data-test": "roster-program-numbers-page", children: [jsxs("header", { className: sx(headerStyle$7), children: [jsxs("div", { className: sx(headingStyle$1), children: [jsx("h1", { children: "Edit Program Numbers" }), jsx("p", { children: "Update existing traveler loyalty-program numbers without changing the rest of the roster." })] }), jsx(Button, { type: "button", variant: "outline", size: "sm", "data-test": "program-numbers-back", onClick: onBack, children: "Back to Roster" })] }), jsx(Module, { title: "Roster Program Numbers", useToggle: false, children: jsxs("form", { onSubmit: submit, "data-test": "program-numbers-form", children: [loading ? (jsx("div", { className: sx(emptyStyle$2), role: "status", children: "Loading roster program numbers..." })) : programs.length ? (jsx("div", { className: sx(tableWrapStyle), children: jsxs("table", { className: sx(tableStyle), children: [jsx("thead", { children: jsxs("tr", { children: [jsx("th", { children: "Traveler" }), jsx("th", { children: "Program" }), jsx("th", { children: "Program Number" })] }) }), jsx("tbody", { children: programs.map((program) => (jsxs("tr", { "data-test": `program-number-row-${program.id}`, children: [jsx("td", { children: jsxs("div", { className: sx(travelerStyle), children: [jsx("strong", { children: program.travelerName }), program.travelerType && jsx("span", { children: program.travelerType })] }) }), jsx("td", { children: jsx("span", { className: sx(supplierStyle), children: program.supplierName }) }), jsx("td", { className: sx(inputCellStyle), children: jsx(Input, { id: `program-number-${program.id}`, "aria-label": `Program number for ${program.travelerName} — ${program.supplierName}`, "data-test": `program-number-input-${program.id}`, value: values[String(program.id)] ?? '', required: true, fullWidth: true, size: "sm", disabled: saving, onChange: (event) => setValues((current) => ({ ...current, [String(program.id)]: event.target.value })) }) })] }, program.id))) })] }) })) : (jsx("div", { className: sx(emptyStyle$2), children: "No existing membership programs are available to edit." })), !!programs.length && (jsxs("div", { className: sx(footerStyle$1), children: [jsx(Button, { type: "button", variant: "outline", disabled: saving, onClick: onBack, children: "Cancel" }), jsx(Button, { type: "submit", loading: saving, "data-test": "program-numbers-submit", children: "Submit" })] }))] }) })] }));
|
|
37692
37765
|
};
|
|
37693
37766
|
RosterProgramNumbersPage.displayName = 'RosterProgramNumbersPage';
|
|
37694
37767
|
|
|
37695
|
-
const pageStyle$
|
|
37768
|
+
const pageStyle$8 = {
|
|
37696
37769
|
label: 'RegularSeasonBidsPage-pageStyle',
|
|
37697
37770
|
display: 'flex',
|
|
37698
37771
|
flexDirection: 'column',
|
|
@@ -37714,7 +37787,7 @@ const headerStyle$6 = {
|
|
|
37714
37787
|
flexDirection: 'column',
|
|
37715
37788
|
gap: 'var(--space-1)',
|
|
37716
37789
|
};
|
|
37717
|
-
const titleStyle$
|
|
37790
|
+
const titleStyle$5 = {
|
|
37718
37791
|
label: 'RegularSeasonBidsPage-titleStyle',
|
|
37719
37792
|
margin: 0,
|
|
37720
37793
|
color: 'var(--fg-1)',
|
|
@@ -37755,11 +37828,11 @@ const RegularSeasonBidsPage = ({ bids, bidType: controlledBidType, defaultBidTyp
|
|
|
37755
37828
|
setInternalBidType(next);
|
|
37756
37829
|
onBidTypeChange?.(next);
|
|
37757
37830
|
};
|
|
37758
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
37831
|
+
return (jsxs("div", { className: cx(sx(pageStyle$8), className), "data-test": "regular-season-bids-page", children: [onBack && (jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$1), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "regular-season-bids-back", children: backLabel })), jsxs("header", { className: sx(headerStyle$6), children: [jsx("h1", { className: sx(titleStyle$5), children: headingFor(bidType) }), jsx("p", { className: sx(descriptionStyle$1), children: "Regular season flight programs released to you. Expand a program to bid trip by trip, or bid on the whole program at once." })] }), jsx(Segment, { options: TAB_OPTIONS, value: bidType, onChange: selectBidType, "aria-label": "Bid queue", className: sx(tabsStyle) }), bidType === 'Awarded' && (jsx(Alert, { variant: "success", title: "Congratulations", children: "For awarded bids, an Account Executive from STM Charters will reach out with next steps via email." })), jsx(RegularSeasonBidsTable, { bids: bids, bidType: bidType, acmiCarrier: acmiCarrier, today: today, loading: loading, locale: locale, onSubmitBid: onSubmitBid, onViewBid: onViewBid, onNoBid: onNoBid, onBulkNoBid: onBulkNoBid })] }));
|
|
37759
37832
|
};
|
|
37760
37833
|
RegularSeasonBidsPage.displayName = 'RegularSeasonBidsPage';
|
|
37761
37834
|
|
|
37762
|
-
const pageStyle$
|
|
37835
|
+
const pageStyle$7 = {
|
|
37763
37836
|
label: 'RosterReportsPage-pageStyle',
|
|
37764
37837
|
display: 'flex',
|
|
37765
37838
|
minWidth: 0,
|
|
@@ -37845,7 +37918,7 @@ const emptyStyle$1 = {
|
|
|
37845
37918
|
/**
|
|
37846
37919
|
* Lists the roster reports a user can run, and reports progress while one runs.
|
|
37847
37920
|
*/
|
|
37848
|
-
const RosterReportsPage = ({ reports, runningReportId, onBack, onRun }) => (jsxs("section", { className: sx(pageStyle$
|
|
37921
|
+
const RosterReportsPage = ({ reports, runningReportId, onBack, onRun }) => (jsxs("section", { className: sx(pageStyle$7), "data-test": "roster-reports-page", children: [jsxs("header", { className: sx(headerStyle$5), children: [jsxs("div", { className: sx(headingStyle), children: [jsx("h1", { children: "Roster Reports" }), jsx("p", { children: "Run the available reports for the selected team roster." })] }), jsx(Button, { type: "button", variant: "outline", size: "sm", "data-test": "roster-reports-back", onClick: onBack, children: "Back to Roster" })] }), jsx(Module, { title: "Team Reports", useToggle: false, children: reports.length ? (jsx("div", { className: sx(listStyle), "data-test": "roster-report-list", children: reports.map((report) => (jsxs("article", { className: sx(reportStyle), "data-test": `roster-report-${report.id}`, children: [jsxs("div", { className: sx(detailsStyle), children: [jsx("h2", { children: report.title }), report.description && jsx("p", { children: report.description })] }), jsx(Button, { type: "button", variant: "outline", size: "sm", loading: runningReportId === report.id, disabled: Boolean(runningReportId) && runningReportId !== report.id, "data-test": `run-roster-report-${report.id}`, onClick: () => void onRun?.(report), children: "Run Report" })] }, report.id))) })) : (jsx("div", { className: sx(emptyStyle$1), children: "No roster reports are currently available." })) })] }));
|
|
37849
37922
|
RosterReportsPage.displayName = 'RosterReportsPage';
|
|
37850
37923
|
|
|
37851
37924
|
/**
|
|
@@ -37853,7 +37926,7 @@ RosterReportsPage.displayName = 'RosterReportsPage';
|
|
|
37853
37926
|
* stylesheet it replaces. The one `@media (max-width: 767px)` block styled two
|
|
37854
37927
|
* classes, so it is split between `pageStyle` and `headerMainStyle`.
|
|
37855
37928
|
*/
|
|
37856
|
-
const pageStyle$
|
|
37929
|
+
const pageStyle$6 = {
|
|
37857
37930
|
label: 'SourcingQuoteDetailPage-pageStyle',
|
|
37858
37931
|
display: 'flex',
|
|
37859
37932
|
flexDirection: 'column',
|
|
@@ -37904,7 +37977,7 @@ const quoteIdStyle = {
|
|
|
37904
37977
|
letterSpacing: '0.06em',
|
|
37905
37978
|
textTransform: 'uppercase',
|
|
37906
37979
|
};
|
|
37907
|
-
const titleStyle$
|
|
37980
|
+
const titleStyle$4 = {
|
|
37908
37981
|
label: 'SourcingQuoteDetailPage-titleStyle',
|
|
37909
37982
|
margin: 0,
|
|
37910
37983
|
color: 'var(--fg-1)',
|
|
@@ -38248,11 +38321,11 @@ const SourcingQuoteDetailPage = ({ quote, backLabel = 'Sourcing Review Queue', o
|
|
|
38248
38321
|
return reasons;
|
|
38249
38322
|
}, [decided, quote.status, draft.lineItems, liveLegs, passengerCount]);
|
|
38250
38323
|
const blocked = blockingReasons.length > 0;
|
|
38251
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
38324
|
+
return (jsxs("div", { className: cx(sx(pageStyle$6), className), "data-test": "sourcing-quote-detail-page", children: [jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle), leftIcon: jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "sourcing-quote-back", children: backLabel }), jsxs("header", { className: sx(headerStyle$4), children: [jsxs("div", { className: sx(headerMainStyle), children: [jsxs("div", { className: sx(headerTitlesStyle), children: [jsx("span", { className: sx(quoteIdStyle), children: quote.id }), jsx("h1", { className: sx(titleStyle$4), children: draft.carrier }), jsxs("p", { className: sx(subtitleStyle$1), children: [quote.tripName, " \u00B7 ", quote.accountName, " \u00B7 ", quote.sport] })] }), jsx(StatusBadge, { status: quote.status, className: sx(statusStyle) })] }), jsxs("div", { className: sx(editGridStyle), children: [jsx(Input, { id: "sourcing-quote-carrier", label: "Carrier", helperText: "Operator as it should read on the Flight Quote, not the broker.", value: draft.carrier, disabled: decided || !editable, onChange: (event) => setDraft({ ...draft, carrier: event.target.value }), "data-test": "sourcing-quote-carrier-input" }), jsx(Input, { id: "sourcing-quote-passengers", type: "number", label: "Passengers", helperText: "Travel party the school asked to move, not the aircraft\u2019s seat count.", value: draft.passengers, disabled: decided || !editable, onChange: (event) => setDraft({ ...draft, passengers: event.target.value }), "data-test": "sourcing-quote-passengers-input" }), jsx(Input, { id: "sourcing-quote-departure", type: "date", label: "First departure", helperText: "First revenue departure. Positioning legs may run earlier.", value: draft.departureDate, disabled: decided || !editable, onChange: (event) => setDraft({ ...draft, departureDate: event.target.value }), "data-test": "sourcing-quote-departure-input" }), jsxs("div", { className: sx(totalFieldStyle), children: [jsx("span", { className: sx(totalLabelStyle), children: "Quoted total" }), jsx("span", { className: sx(factTotalStyle), "data-test": "sourcing-quote-total", children: formattedTotal }), jsx("span", { className: sx(factHelpStyle), children: "Derived from the line items below \u2014 never entered by hand." })] })] }), hasReviewActions && (jsx(QuoteReviewActions, { quoteId: quote.id, carrier: draft.carrier, formattedTotal: formattedTotal, changes: changes, disabled: blocked, disabledReason: blockingReasons[0], loading: actionsLoading, onApprove: (quoteId, approvedChanges) => onApprove?.(quoteId, approvedChanges, draft), onReject: onReject })), blocked && (jsx(Alert, { variant: "warning", title: decided ? 'Quote already decided' : 'Why this cannot be approved yet', children: jsx("ul", { className: sx(blockingListStyle), "data-test": "sourcing-quote-blocking-reasons", children: blockingReasons.map((reason) => (jsx("li", { children: reason }, reason))) }) }))] }), quote.carrierNote && (jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Carrier note", children: [jsx("h2", { className: sx(sectionTitleStyle$1), children: "Carrier note" }), jsx("p", { className: sx(sectionHelpStyle), children: "The carrier\u2019s own words, shown in full \u2014 anything they flagged here is the reason to read the breakdown twice." }), jsx("p", { className: sx(carrierNoteStyle), "data-test": "sourcing-quote-carrier-note", children: quote.carrierNote })] })), jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Leg breakdown", children: [jsx("h2", { className: sx(sectionTitleStyle$1), children: "Leg breakdown" }), jsx("p", { className: sx(sectionHelpStyle), children: "One row per leg. Live legs carry the travel party; ferry legs reposition the aircraft and carry nobody, but their block hours are still billed." }), legs.length > 0 ? (jsx("ul", { className: sx(legsStyle), children: legs.map((leg) => (jsx(LegRow, { leg: leg, locale: locale }, leg.id))) })) : (jsx("p", { className: sx(emptyLegsStyle), "data-test": "sourcing-quote-no-legs", children: "The carrier has not attached any legs to this quote." }))] }), jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Cost line items", children: [jsx("h2", { className: sx(sectionTitleStyle$1), children: "Cost line items" }), jsx("p", { className: sx(sectionHelpStyle), children: "Each row becomes one QuoteLineItem on the Salesforce Flight Quote. Correct a quantity or a unit price here and the quoted total follows \u2014 it is never typed in directly." }), jsx("ul", { className: sx(lineItemsStyle), children: draft.lineItems.map((lineItem) => (jsxs("li", { className: sx(lineItemStyle), "data-test": "sourcing-quote-line-item", children: [jsxs("div", { className: sx(lineItemHeadStyle), children: [jsx("span", { className: sx(lineItemLabelStyle), children: lineItem.label }), jsx("span", { className: sx(lineItemCategoryStyle), children: SOURCING_COST_CATEGORY_LABELS[lineItem.category ?? 'other'] })] }), jsxs("div", { className: sx(lineItemFieldsStyle), children: [jsx(Input, { id: `${lineItem.id}-quantity`, size: "sm", type: "number", label: `Quantity (${lineItem.unit})`, value: String(lineItem.quantity), disabled: decided || !editable, onChange: (event) => updateLineItem(lineItem.id, { quantity: Number(event.target.value) }), "data-test": "sourcing-quote-line-quantity" }), jsx(Input, { id: `${lineItem.id}-unit-price`, size: "sm", type: "number", label: "Unit price", value: String(lineItem.unitPrice), disabled: decided || !editable, onChange: (event) => updateLineItem(lineItem.id, { unitPrice: Number(event.target.value) }), "data-test": "sourcing-quote-line-unit-price" })] })] }, lineItem.id))) }), jsx(QuoteCostBreakdown, { lineItems: draft.lineItems, currency: quote.currency ?? 'USD', locale: locale, title: "", passengerCount: Number.isFinite(passengerCount) ? passengerCount : undefined })] })] }));
|
|
38252
38325
|
};
|
|
38253
38326
|
SourcingQuoteDetailPage.displayName = 'SourcingQuoteDetailPage';
|
|
38254
38327
|
|
|
38255
|
-
const pageStyle$
|
|
38328
|
+
const pageStyle$5 = {
|
|
38256
38329
|
label: 'SourcingReviewQueuePage-pageStyle',
|
|
38257
38330
|
display: 'flex',
|
|
38258
38331
|
flexDirection: 'column',
|
|
@@ -38268,7 +38341,7 @@ const headerStyle$3 = {
|
|
|
38268
38341
|
flexDirection: 'column',
|
|
38269
38342
|
gap: 'var(--space-1)',
|
|
38270
38343
|
};
|
|
38271
|
-
const titleStyle$
|
|
38344
|
+
const titleStyle$3 = {
|
|
38272
38345
|
label: 'SourcingReviewQueuePage-titleStyle',
|
|
38273
38346
|
margin: 0,
|
|
38274
38347
|
color: 'var(--fg-1)',
|
|
@@ -38301,7 +38374,7 @@ const SourcingReviewQueuePage = ({ title = 'Sourcing Review Queue', description
|
|
|
38301
38374
|
}, [quotes]);
|
|
38302
38375
|
// Metric coerces non-numeric values to 0, so the currency symbol goes through `prefix`.
|
|
38303
38376
|
const compactAmount = useMemo(() => new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }), [locale]);
|
|
38304
|
-
return (jsxs("div", { className: cx(sx(pageStyle$
|
|
38377
|
+
return (jsxs("div", { className: cx(sx(pageStyle$5), className), "data-test": "sourcing-review-queue-page", children: [jsxs("header", { className: sx(headerStyle$3), children: [jsx("h1", { className: sx(titleStyle$3), children: title }), description && jsx("p", { className: sx(descriptionStyle), children: description })] }), !hideSummary && (jsxs("div", { className: sx(summaryStyle), "data-test": "sourcing-review-queue-summary", children: [jsx(Metric, { label: "Awaiting review", value: summary.awaiting }), jsx(Metric, { label: "Approved this cycle", value: summary.approved }), jsx(Metric, { label: "Value awaiting review", prefix: "$", value: compactAmount.format(summary.awaitingValue) })] })), jsx(SourcingReviewQueueTable, { quotes: quotes, selectedQuoteIds: selectedQuoteIds, onSelectionChange: onSelectionChange, onOpenQuote: onOpenQuote, onBulkApprove: onBulkApprove, pageSize: pageSize, loading: loading, locale: locale })] }));
|
|
38305
38378
|
};
|
|
38306
38379
|
|
|
38307
38380
|
/**
|
|
@@ -38315,7 +38388,7 @@ const SourcingReviewQueuePage = ({ title = 'Sourcing Review Queue', description
|
|
|
38315
38388
|
* No `&&` was needed: every class lands on its own element, so nothing here
|
|
38316
38389
|
* ever depended on source order.
|
|
38317
38390
|
*/
|
|
38318
|
-
const pageStyle$
|
|
38391
|
+
const pageStyle$4 = {
|
|
38319
38392
|
label: 'TeamManagementPage-pageStyle',
|
|
38320
38393
|
minWidth: 0,
|
|
38321
38394
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38410,7 +38483,7 @@ const DEFAULT_TABS = [
|
|
|
38410
38483
|
* TeamManagementPage - Layout for team management with tabbed navigation
|
|
38411
38484
|
*/
|
|
38412
38485
|
const TeamManagementPage = ({ variant = 'team', title = 'Team Management', teamPanel, contactsTitle = 'School Contacts', contactAlert, contacts, header, tabs = DEFAULT_TABS, activeTab = 'profile', onTabChange, children, sidebar, footer, className = '', }) => {
|
|
38413
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38486
|
+
const pageClasses = cx(sx(pageStyle$4), className);
|
|
38414
38487
|
if (variant === 'overview') {
|
|
38415
38488
|
return (jsxs("div", { className: cx(sx(overviewStyle), className), children: [jsx("header", { className: sx(overviewHeaderStyle), children: jsx("h1", { children: title }) }), jsxs("div", { className: sx(overviewGridStyle), children: [jsx("aside", { children: teamPanel }), jsxs("section", { className: sx(contactsColumnStyle), children: [jsx("h2", { children: contactsTitle }), contactAlert, contacts] })] })] }));
|
|
38416
38489
|
}
|
|
@@ -38418,7 +38491,7 @@ const TeamManagementPage = ({ variant = 'team', title = 'Team Management', teamP
|
|
|
38418
38491
|
};
|
|
38419
38492
|
TeamManagementPage.displayName = 'TeamManagementPage';
|
|
38420
38493
|
|
|
38421
|
-
const pageStyle$
|
|
38494
|
+
const pageStyle$3 = {
|
|
38422
38495
|
label: 'TeamSchedulePage-pageStyle',
|
|
38423
38496
|
display: 'flex',
|
|
38424
38497
|
minWidth: 0,
|
|
@@ -38445,7 +38518,7 @@ const titleSectionStyle$1 = {
|
|
|
38445
38518
|
flexDirection: 'column',
|
|
38446
38519
|
gap: 12,
|
|
38447
38520
|
};
|
|
38448
|
-
const titleStyle$
|
|
38521
|
+
const titleStyle$2 = {
|
|
38449
38522
|
label: 'TeamSchedulePage-titleStyle',
|
|
38450
38523
|
margin: 0,
|
|
38451
38524
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38537,16 +38610,16 @@ const contentStyle$2 = {
|
|
|
38537
38610
|
* - Schedule table (compact or normal view)
|
|
38538
38611
|
*/
|
|
38539
38612
|
const TeamSchedulePage = ({ title = 'Season Schedule', mobileTitle = 'Season Schedule', subtitle, metrics = [], summary, teamFilter, serviceFilter, actions, compactView, normalView, expandedView, viewMode = 'compact', isMobile = false, className = '', }) => {
|
|
38540
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38613
|
+
const pageClasses = cx(sx(pageStyle$3), className);
|
|
38541
38614
|
// Back-compat: `expandedView`/`'expanded'` were renamed to `normalView`/`'normal'`.
|
|
38542
38615
|
const resolvedNormalView = normalView ?? expandedView;
|
|
38543
38616
|
const resolvedViewMode = viewMode === 'expanded' ? 'normal' : viewMode;
|
|
38544
38617
|
const headerClasses = cx(sx(headerStyle$2), isMobile && sx(headerMobileStyle$1));
|
|
38545
|
-
return (jsxs("div", { className: pageClasses, "data-test": "team-schedule-page", children: [jsxs("div", { className: headerClasses, children: [jsxs("div", { className: sx(titleSectionStyle$1), children: [jsx("h1", { className: sx(titleStyle$
|
|
38618
|
+
return (jsxs("div", { className: pageClasses, "data-test": "team-schedule-page", children: [jsxs("div", { className: headerClasses, children: [jsxs("div", { className: sx(titleSectionStyle$1), children: [jsx("h1", { className: sx(titleStyle$2), children: isMobile ? mobileTitle : title }), subtitle && jsx("div", { className: sx(subtitleStyle), children: subtitle }), (teamFilter || serviceFilter) && (jsxs("div", { className: sx(filtersStyle$1), children: [teamFilter, serviceFilter] }))] }), (summary || metrics.length > 0) && (jsx("div", { className: cx(sx(metricsStyle$1), isMobile && sx(metricsMobileStyle$1)), children: summary ?? metrics.map((metric, i) => (jsxs("div", { className: sx(metricStyle$1), children: [jsxs("span", { className: sx(metricValueStyle$1), children: [metric.prefix, metric.value, metric.suffix] }), jsx("span", { className: sx(metricLabelStyle$1), children: metric.label })] }, i))) }))] }), actions, jsx("div", { className: sx(contentStyle$2), children: resolvedViewMode === 'compact' ? compactView : resolvedNormalView })] }));
|
|
38546
38619
|
};
|
|
38547
38620
|
TeamSchedulePage.displayName = 'TeamSchedulePage';
|
|
38548
38621
|
|
|
38549
|
-
const pageStyle$
|
|
38622
|
+
const pageStyle$2 = {
|
|
38550
38623
|
label: 'TeamTravelCalendarPage-pageStyle',
|
|
38551
38624
|
display: 'flex',
|
|
38552
38625
|
minWidth: 0,
|
|
@@ -38573,7 +38646,7 @@ const titleSectionStyle = {
|
|
|
38573
38646
|
flexDirection: 'column',
|
|
38574
38647
|
gap: 12,
|
|
38575
38648
|
};
|
|
38576
|
-
const titleStyle = {
|
|
38649
|
+
const titleStyle$1 = {
|
|
38577
38650
|
label: 'TeamTravelCalendarPage-titleStyle',
|
|
38578
38651
|
margin: 0,
|
|
38579
38652
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38649,7 +38722,7 @@ const contentStyle$1 = {
|
|
|
38649
38722
|
* - Sidebar for due dates
|
|
38650
38723
|
*/
|
|
38651
38724
|
const TeamTravelCalendarPage = ({ title = 'Team Travel Calendar', mobileTitle = 'Travel Calendar', metrics = [], summary, teamFilter, serviceFilter, viewSelector, typeSelector, calendarView, cardView, listView, sidebar, view = 'calendar', sidebarOpen: _sidebarOpen = false, isMobile = false, className = '', }) => {
|
|
38652
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38725
|
+
const pageClasses = cx(sx(pageStyle$2), className);
|
|
38653
38726
|
const headerClasses = cx(sx(headerStyle$1), isMobile && sx(headerMobileStyle));
|
|
38654
38727
|
const renderView = () => {
|
|
38655
38728
|
switch (view) {
|
|
@@ -38663,14 +38736,14 @@ const TeamTravelCalendarPage = ({ title = 'Team Travel Calendar', mobileTitle =
|
|
|
38663
38736
|
return null;
|
|
38664
38737
|
}
|
|
38665
38738
|
};
|
|
38666
|
-
return (jsxs("div", { className: pageClasses, "data-test": "team-travel-calendar-page", children: [jsxs("div", { className: headerClasses, children: [jsxs("div", { className: sx(titleSectionStyle), children: [jsx("h1", { className: sx(titleStyle), children: isMobile ? mobileTitle : title }), jsxs("div", { className: sx(filtersStyle), children: [teamFilter, serviceFilter, viewSelector, typeSelector] })] }), (summary || metrics.length > 0) && (jsx("div", { className: cx(sx(metricsStyle), isMobile && sx(metricsMobileStyle)), children: summary ?? metrics.map((metric, i) => (jsxs("button", { className: sx(metricStyle), onClick: metric.onClick, type: "button", disabled: !metric.onClick, children: [jsx("span", { className: sx(metricValueStyle), children: metric.value }), jsx("span", { className: sx(metricLabelStyle), children: metric.label })] }, i))) }))] }), jsx("div", { className: sx(contentStyle$1), children: renderView() }), sidebar] }));
|
|
38739
|
+
return (jsxs("div", { className: pageClasses, "data-test": "team-travel-calendar-page", children: [jsxs("div", { className: headerClasses, children: [jsxs("div", { className: sx(titleSectionStyle), children: [jsx("h1", { className: sx(titleStyle$1), children: isMobile ? mobileTitle : title }), jsxs("div", { className: sx(filtersStyle), children: [teamFilter, serviceFilter, viewSelector, typeSelector] })] }), (summary || metrics.length > 0) && (jsx("div", { className: cx(sx(metricsStyle), isMobile && sx(metricsMobileStyle)), children: summary ?? metrics.map((metric, i) => (jsxs("button", { className: sx(metricStyle), onClick: metric.onClick, type: "button", disabled: !metric.onClick, children: [jsx("span", { className: sx(metricValueStyle), children: metric.value }), jsx("span", { className: sx(metricLabelStyle), children: metric.label })] }, i))) }))] }), jsx("div", { className: sx(contentStyle$1), children: renderView() }), sidebar] }));
|
|
38667
38740
|
};
|
|
38668
38741
|
TeamTravelCalendarPage.displayName = 'TeamTravelCalendarPage';
|
|
38669
38742
|
|
|
38670
38743
|
/** TripDetailPage's compiled rules. The two media queries move inside the
|
|
38671
38744
|
* styles they widen; nothing else in the stylesheet overlapped, so no
|
|
38672
38745
|
* specificity work was needed. */
|
|
38673
|
-
const pageStyle = {
|
|
38746
|
+
const pageStyle$1 = {
|
|
38674
38747
|
label: 'TripDetailPage-pageStyle',
|
|
38675
38748
|
display: 'flex',
|
|
38676
38749
|
flexDirection: 'column',
|
|
@@ -38769,10 +38842,183 @@ const sidebarSectionStyle = {
|
|
|
38769
38842
|
* - Right (3 cols): Events, Due Dates
|
|
38770
38843
|
*/
|
|
38771
38844
|
const TripDetailPage = ({ header, airSegment, groundSegment, hotelSegment, filesSection, teamSection, eventsSection, dueDatesSection, className = '', }) => {
|
|
38772
|
-
const pageClasses = cx(sx(pageStyle), className);
|
|
38845
|
+
const pageClasses = cx(sx(pageStyle$1), className);
|
|
38773
38846
|
return (jsxs("div", { className: pageClasses, children: [header && (jsx("div", { className: sx(headerStyle), children: header })), jsxs("div", { className: sx(contentStyle), children: [jsxs("div", { className: sx(mainColumnStyle), children: [jsxs("div", { className: sx(segmentsGridStyle), children: [jsxs("div", { className: sx(segmentCardStyle), children: [jsx("h3", { className: sx(segmentTitleStyle), children: "Air" }), airSegment || jsx("div", { className: sx(emptyStyle), children: "No flights" })] }), jsxs("div", { className: sx(segmentCardStyle), children: [jsx("h3", { className: sx(segmentTitleStyle), children: "Ground" }), groundSegment || jsx("div", { className: sx(emptyStyle), children: "No ground transportation" })] }), jsxs("div", { className: sx(segmentCardStyle), children: [jsx("h3", { className: sx(segmentTitleStyle), children: "Hotel" }), hotelSegment || jsx("div", { className: sx(emptyStyle), children: "No hotels" })] })] }), filesSection && (jsxs("div", { className: sx(sectionStyle), children: [jsx("h3", { className: sx(sectionTitleStyle), children: "Files" }), filesSection] })), teamSection && (jsxs("div", { className: sx(sectionStyle), children: [jsx("h3", { className: sx(sectionTitleStyle), children: "Team Roster" }), teamSection] }))] }), jsxs("div", { className: sx(sidebarStyle), children: [eventsSection && (jsxs("div", { className: sx(sidebarSectionStyle), children: [jsx("h3", { className: sx(sectionTitleStyle), children: "Events" }), eventsSection] })), dueDatesSection && (jsxs("div", { className: sx(sidebarSectionStyle), children: [jsx("h3", { className: sx(sectionTitleStyle), children: "Due Dates" }), dueDatesSection] }))] })] })] }));
|
|
38774
38847
|
};
|
|
38775
38848
|
TripDetailPage.displayName = 'TripDetailPage';
|
|
38776
38849
|
|
|
38777
|
-
|
|
38850
|
+
const pageStyle = {
|
|
38851
|
+
label: 'VirtualInvoicingPage-pageStyle',
|
|
38852
|
+
color: 'var(--fg-1)',
|
|
38853
|
+
fontFamily: 'var(--font-family-base)',
|
|
38854
|
+
display: 'flex',
|
|
38855
|
+
flexDirection: 'column',
|
|
38856
|
+
gap: 'var(--space-6)',
|
|
38857
|
+
};
|
|
38858
|
+
const titleStyle = {
|
|
38859
|
+
label: 'VirtualInvoicingPage-titleStyle',
|
|
38860
|
+
margin: 0,
|
|
38861
|
+
fontFamily: 'var(--font-family-display)',
|
|
38862
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38863
|
+
fontSize: 'var(--fs-4xl)',
|
|
38864
|
+
letterSpacing: '-0.02em',
|
|
38865
|
+
color: 'var(--color-primary)',
|
|
38866
|
+
};
|
|
38867
|
+
const eyebrowStyle = {
|
|
38868
|
+
label: 'VirtualInvoicingPage-eyebrowStyle',
|
|
38869
|
+
fontFamily: 'var(--font-family-label)',
|
|
38870
|
+
fontWeight: 'var(--fw-bold)',
|
|
38871
|
+
fontSize: 'var(--fs-xs)',
|
|
38872
|
+
letterSpacing: '0.18em',
|
|
38873
|
+
textTransform: 'uppercase',
|
|
38874
|
+
color: 'var(--color-accent-ink)',
|
|
38875
|
+
};
|
|
38876
|
+
const toolbarStyle = {
|
|
38877
|
+
label: 'VirtualInvoicingPage-toolbarStyle',
|
|
38878
|
+
display: 'flex',
|
|
38879
|
+
flexWrap: 'wrap',
|
|
38880
|
+
alignItems: 'center',
|
|
38881
|
+
justifyContent: 'space-between',
|
|
38882
|
+
gap: 'var(--space-3)',
|
|
38883
|
+
};
|
|
38884
|
+
const searchStyle = {
|
|
38885
|
+
label: 'VirtualInvoicingPage-searchStyle',
|
|
38886
|
+
flex: '1 1 280px',
|
|
38887
|
+
maxWidth: 420,
|
|
38888
|
+
};
|
|
38889
|
+
const toolbarActionsStyle = {
|
|
38890
|
+
label: 'VirtualInvoicingPage-toolbarActionsStyle',
|
|
38891
|
+
display: 'flex',
|
|
38892
|
+
gap: 'var(--space-2)',
|
|
38893
|
+
};
|
|
38894
|
+
const cardStyle = {
|
|
38895
|
+
label: 'VirtualInvoicingPage-cardStyle',
|
|
38896
|
+
background: 'var(--bg-surface)',
|
|
38897
|
+
border: '1px solid var(--border-color)',
|
|
38898
|
+
borderRadius: 'var(--radius-xl)',
|
|
38899
|
+
overflow: 'hidden',
|
|
38900
|
+
};
|
|
38901
|
+
const codeStyle = {
|
|
38902
|
+
label: 'VirtualInvoicingPage-codeStyle',
|
|
38903
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38904
|
+
color: 'var(--fg-1)',
|
|
38905
|
+
};
|
|
38906
|
+
const nameStyle = {
|
|
38907
|
+
label: 'VirtualInvoicingPage-nameStyle',
|
|
38908
|
+
marginLeft: 'var(--space-2)',
|
|
38909
|
+
color: 'var(--fg-2)',
|
|
38910
|
+
};
|
|
38911
|
+
const noNameStyle = {
|
|
38912
|
+
label: 'VirtualInvoicingPage-noNameStyle',
|
|
38913
|
+
marginLeft: 'var(--space-2)',
|
|
38914
|
+
color: 'var(--fg-3)',
|
|
38915
|
+
fontStyle: 'italic',
|
|
38916
|
+
};
|
|
38917
|
+
const typeStyle = {
|
|
38918
|
+
label: 'VirtualInvoicingPage-typeStyle',
|
|
38919
|
+
fontFamily: 'var(--font-family-label)',
|
|
38920
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38921
|
+
fontSize: 'var(--fs-xs)',
|
|
38922
|
+
letterSpacing: '0.08em',
|
|
38923
|
+
textTransform: 'uppercase',
|
|
38924
|
+
color: 'var(--fg-2)',
|
|
38925
|
+
};
|
|
38926
|
+
const rowActionsStyle = {
|
|
38927
|
+
label: 'VirtualInvoicingPage-rowActionsStyle',
|
|
38928
|
+
display: 'flex',
|
|
38929
|
+
justifyContent: 'flex-end',
|
|
38930
|
+
gap: 'var(--space-1)',
|
|
38931
|
+
};
|
|
38932
|
+
const countStyle = {
|
|
38933
|
+
label: 'VirtualInvoicingPage-countStyle',
|
|
38934
|
+
margin: 0,
|
|
38935
|
+
fontSize: 'var(--fs-sm)',
|
|
38936
|
+
color: 'var(--fg-3)',
|
|
38937
|
+
};
|
|
38938
|
+
const statusCellStyle = {
|
|
38939
|
+
label: 'VirtualInvoicingPage-statusCellStyle',
|
|
38940
|
+
display: 'flex',
|
|
38941
|
+
alignItems: 'center',
|
|
38942
|
+
gap: 'var(--space-2)',
|
|
38943
|
+
};
|
|
38944
|
+
|
|
38945
|
+
const blankHeader = (patch = {}) => ({
|
|
38946
|
+
accountId: '',
|
|
38947
|
+
branch: '',
|
|
38948
|
+
companyName: '',
|
|
38949
|
+
address: '',
|
|
38950
|
+
city: '',
|
|
38951
|
+
state: '',
|
|
38952
|
+
zipCode: '',
|
|
38953
|
+
phone: '',
|
|
38954
|
+
tollFree: '',
|
|
38955
|
+
afterHoursPhone: '',
|
|
38956
|
+
fax: '',
|
|
38957
|
+
defaultWebsite: '',
|
|
38958
|
+
email: '',
|
|
38959
|
+
hoursOfOperation: '',
|
|
38960
|
+
agentSurveyEndpoint: '',
|
|
38961
|
+
onlineSurveyEndpoint: '',
|
|
38962
|
+
surveyDelayDays: '0',
|
|
38963
|
+
description: '',
|
|
38964
|
+
...patch,
|
|
38965
|
+
});
|
|
38966
|
+
/**
|
|
38967
|
+
* Virtual Invoicing administration: every account and branch with its status
|
|
38968
|
+
* and VI header in one place. Edit opens the header form beside the list, so
|
|
38969
|
+
* nothing is a separate page to hunt for.
|
|
38970
|
+
*/
|
|
38971
|
+
const VirtualInvoicingPage = ({ entries, loading = false, supportEmail = 'productionsupport@shortstravel.com', onSaveHeader, onStatusChange, onDeleteEntry, onAddEntry, className = '', }) => {
|
|
38972
|
+
const [query, setQuery] = useState('');
|
|
38973
|
+
const [editing, setEditing] = useState(null);
|
|
38974
|
+
const [deleting, setDeleting] = useState(null);
|
|
38975
|
+
const visible = useMemo(() => {
|
|
38976
|
+
const q = query.trim().toLowerCase();
|
|
38977
|
+
if (!q)
|
|
38978
|
+
return entries;
|
|
38979
|
+
return entries.filter((e) => `${e.code} ${e.name ?? ''} ${e.type}`.toLowerCase().includes(q));
|
|
38980
|
+
}, [entries, query]);
|
|
38981
|
+
const columns = [
|
|
38982
|
+
{
|
|
38983
|
+
key: 'code',
|
|
38984
|
+
label: 'Branch/Account',
|
|
38985
|
+
render: (_, e) => (jsxs(Fragment, { children: [jsx("span", { className: sx(codeStyle), children: e.code }), e.name ? jsx("span", { className: sx(nameStyle), children: e.name }) : jsx("span", { className: sx(noNameStyle), children: "No name" })] })),
|
|
38986
|
+
},
|
|
38987
|
+
{ key: 'type', label: 'Type', render: (_, e) => jsx("span", { className: sx(typeStyle), children: e.type }) },
|
|
38988
|
+
{
|
|
38989
|
+
key: 'status',
|
|
38990
|
+
label: 'Status',
|
|
38991
|
+
render: (_, e) => (jsxs("div", { className: sx(statusCellStyle), children: [jsx(Toggle, { size: "sm", checked: e.status === 'LIVE', "aria-label": `Live: ${e.code}`, onChange: (live) => onStatusChange?.(e, live ? 'LIVE' : 'NOT_LIVE') }), e.status === 'LIVE' ? (jsx(StatusBadge, { status: "approved", label: "Live" })) : (jsx(StatusBadge, { status: "cancelled", label: "Not live" }))] })),
|
|
38992
|
+
},
|
|
38993
|
+
{
|
|
38994
|
+
key: 'header',
|
|
38995
|
+
label: 'VI header',
|
|
38996
|
+
render: (_, e) => e.header ? (jsx(StatusBadge, { status: "approved", label: "Configured" })) : (jsx(StatusBadge, { status: "not-ticketed", label: "Not configured" })),
|
|
38997
|
+
},
|
|
38998
|
+
{
|
|
38999
|
+
key: 'actions',
|
|
39000
|
+
label: 'Actions',
|
|
39001
|
+
align: 'right',
|
|
39002
|
+
render: (_, e) => (jsxs("div", { className: sx(rowActionsStyle), children: [jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${e.code}`, "data-test": `vi-edit-${e.code}`, onClick: () => setEditing({ entry: e }), children: jsx(EditIcon$2, { size: 16 }) }), jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${e.code}`, "data-test": `vi-delete-${e.code}`, onClick: () => setDeleting(e), children: jsx(TrashIcon$2, { size: 16 }) })] })),
|
|
39003
|
+
},
|
|
39004
|
+
];
|
|
39005
|
+
const editingEntry = editing?.entry;
|
|
39006
|
+
const formValue = editingEntry?.header ??
|
|
39007
|
+
blankHeader(editingEntry
|
|
39008
|
+
? editingEntry.type === 'ACCOUNT'
|
|
39009
|
+
? { accountId: editingEntry.code, companyName: editingEntry.name ?? '' }
|
|
39010
|
+
: { branch: editingEntry.code, companyName: editingEntry.name ?? '' }
|
|
39011
|
+
: {});
|
|
39012
|
+
return (jsxs("div", { className: cx(sx(pageStyle), className), children: [jsxs("header", { children: [jsx("span", { className: sx(eyebrowStyle), children: "Administration" }), jsx("h1", { className: sx(titleStyle), children: "Virtual Invoicing" })] }), jsxs(Alert, { variant: "primary", children: ["Please notify ", jsx("a", { href: `mailto:${supportEmail}`, children: supportEmail }), " after making any additions or changes to the Account/Branch status."] }), jsxs("div", { className: sx(toolbarStyle), children: [jsx(SearchField, { className: sx(searchStyle), placeholder: "Search by code, name or type", value: query, onChange: setQuery, onClear: () => setQuery(''), showClear: true }), jsxs("div", { className: sx(toolbarActionsStyle), children: [jsx(Button, { variant: "outline", leftIcon: jsx(PlusIcon$2, { size: 16 }), onClick: onAddEntry, "data-test": "vi-add-entry", children: "Add account/branch" }), jsx(Button, { variant: "primary", leftIcon: jsx(PlusIcon$2, { size: 16 }), onClick: () => setEditing({}), "data-test": "vi-add-header", children: "Add VI header" })] })] }), jsx("div", { className: sx(cardStyle), children: jsx(Table, { columns: columns, data: visible, rowKey: "id", loading: loading, emptyContent: jsx(EmptyState$1, { title: query ? 'No matching accounts or branches' : 'No accounts or branches yet', description: query ? 'Try a different code or name.' : 'Add an account or branch to get started.' }) }) }), !loading && (jsxs("p", { className: sx(countStyle), children: ["Showing ", visible.length, " of ", entries.length] })), jsxs(Drawer, { isOpen: !!editing, onClose: () => setEditing(null), size: "lg", children: [jsx(Drawer.Header, { title: editingEntry ? `VI header · ${editingEntry.code}` : 'New VI header', onClose: () => setEditing(null) }), jsx(Drawer.Body, { children: jsx(ViHeaderForm, { value: formValue, onCancel: () => setEditing(null), onSave: (header) => {
|
|
39013
|
+
onSaveHeader?.(header, editingEntry);
|
|
39014
|
+
setEditing(null);
|
|
39015
|
+
} }, editingEntry?.id ?? 'new') })] }), jsx(Modal, { isOpen: !!deleting, onClose: () => setDeleting(null), title: "Delete account/branch?", size: "sm", footer: jsxs(Fragment, { children: [jsx(Button, { variant: "outline", onClick: () => setDeleting(null), children: "Cancel" }), jsx(Button, { variant: "danger", "data-test": "vi-confirm-delete", onClick: () => {
|
|
39016
|
+
if (deleting)
|
|
39017
|
+
onDeleteEntry?.(deleting);
|
|
39018
|
+
setDeleting(null);
|
|
39019
|
+
}, children: "Delete" })] }), children: deleting && (jsxs("p", { children: [deleting.code, deleting.name ? ` – ${deleting.name}` : '', " will be removed from virtual invoicing. Remember to notify production support."] })) })] }));
|
|
39020
|
+
};
|
|
39021
|
+
VirtualInvoicingPage.displayName = 'VirtualInvoicingPage';
|
|
39022
|
+
|
|
39023
|
+
export { ACMI_AIRCRAFT_OPTIONS, ACMI_CARRIER_OPTIONS, ACMI_INSURANCE_FLAT, Accordion, AcmiQuoteCalculator, AdministrationPage, AgentGroupTravelRequestsPage, AgentGroupTravelRequestsTable, AirInvoiceCard, AirSegment, Alert, AppLayout, ArrowDownLeftIcon, ArrowUpRightIcon, Avatar, AvatarGroup, BID_TYPE_HEADINGS, BackLink, Badge, BookingDetailsCard, BuildingIcon, BusIcon$2 as BusIcon, Button, ButtonStyled, CARRIER_CATERING_OPTIONS, CARRIER_CONTACT_TYPES, CHAMPIONSHIP_BID_TYPES, CHAMPIONSHIP_HEADINGS, CHARTER_CONTACT_GROUPS, CHARTER_SECTIONS, CalendarIcon$1 as CalendarIcon, CalendarTypeSelector, CalendarViewSelector, CarIcon$1 as CarIcon, Card, CardBody, CardFooter, CardHeader, CarrierProfilePage, ChampionshipBidDetailPage, ChampionshipBidsPage, CharterBidResponsePage, CharterBidViewPage, CharterManifestPage, CharterSourcingEmailPreview, ChartersAccessManagementPage, ChartersHomePage, CheckIcon$2 as CheckIcon, Checkbox, ChevronDownIcon$1 as ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon$1 as ChevronRightIcon, ChevronUpIcon, ClientSelector, CloseIcon, ConfirmModal, ContactCard$1 as ContactCard, ContactList, ContactUsPage, CubeIcon, DOCUMENT_FILE_EXTENSIONS, DashboardIcon, DashboardPage, Datepicker, DetailList, DocumentIcon, DownloadIcon, Drawer, DrawerBody, DrawerFooter, DrawerHeader, Dropdown, DueDatesDrawer, EditIcon$2 as EditIcon, EmptyState$1 as EmptyState, EyeIcon, FeatureFlagManagementPage, FieldLayout, FileUploadButton, FilterChip, FilterIcon$1 as FilterIcon, FormField, FormRow, FormSection, FormStack, GridHeaderRow, GridIcon, GridTable, GroundSegment, GroupTravelRequestPage, HUB_ADMIN_ITEM, HUB_AGENTS_ITEM, HUB_INDIVIDUAL_TRAVEL_ITEM, HUB_NAV_ITEMS, HUB_OFF_FLEET_ITEM, HUB_SOURCING_ITEM, HUB_STM_CHARTERS_ITEM, HandIcon, HeadsetIcon, HomeIcon, HotelIcon$3 as HotelIcon, HotelSegment, HubAppShell, Icon, Icons, IndividualTravelPage, IndividualTravelRequestDetailPage, IndividualTravelRequestFormPage, InfoCenterPage, InfoIcon$1 as InfoIcon, InfoTile, Input, ItineraryPage, ItinerarySegmentCard, ItineraryTimeline, LightbulbIcon, LimoIcon, ListboxSelect, LockIcon$1 as LockIcon, LogoIcon, LogoutIcon, MailIcon, ManifestCapacityStats, ManifestViewToggle, MegaphoneIcon, MembershipPrograms, MenuIcon, Metric, MinusIcon, Modal, ModalFooter, Module, ModuleDivider, ModuleVerticalDivider, MultiUserSearch, NavCard, NavItem, NextTripCard, NotFoundPage, OFF_FLEET_LEARNED_DESCRIPTION, OFF_FLEET_LEARNED_EMPTY_COPY, OFF_FLEET_QUEUE_DESCRIPTION, OffFleetLearnedExamplesPage, OffFleetReviewQueuePage, OffFleetSubmissionDetailPage, PageBanners, PageHeader, PageHeaderSubsection, Pagination, PhoneIcon, PlaneIcon$3 as PlaneIcon, PlusIcon$2 as PlusIcon, PreferencesPanel, PrinterIcon, ProfileMenu, Progress, ProgressBar, ProgressCircle, QuoteCostBreakdown, QuoteReviewActions, REGULAR_SEASON_BID_TYPES, RailIcon, RefreshIcon, RegularSeasonBidsPage, RegularSeasonBidsTable, ReportIcon, RequestFormFooter, RequestFormHeader, RequestFormLayout, RequestSummary, ResultCount, RosterProgramNumbersPage, RosterReportsPage, RosterToolbar, SOURCING_COST_CATEGORIES, SOURCING_COST_CATEGORY_LABELS, SUPPLIER_TYPE_OPTIONS, SchoolContactForm, SearchField, SearchIcon$1 as SearchIcon, Segment, SegmentedSelector, Select, SelectFilter, ServiceToggle, ServiceToggleList, SettingsIcon, Sidenav, SingleTeamPanelSelector, SourcingQuoteDetailPage, SourcingReviewQueuePage, SourcingReviewQueueTable, Spinner, SportCodeBadge, StatusBadge, SummarySection, SupplierTypeToggle, TRIP_MONTH_OPTIONS, TabPanelStack, TabStrip, Table, TableCell, Tag, TeamCalendarHeader, TeamCard, TeamContactsPanel, TeamEquipmentForm, TeamHeader, TeamImportForm, TeamManagementPage, TeamPicker, TeamProgramForm, TeamRosterMemberForm, TeamScheduleActions, TeamScheduleCompactTable, TeamScheduleEditor, TeamScheduleExpandedTable, TeamSchedulePage, TeamSubMenu, TeamTravelCalendarCardView, TeamTravelCalendarListView, TeamTravelCalendarPage, TeamTravelCalendarToolbar, TeamTravelCalendarView, TeamUserAccessForm, Textarea, ThemeProvider, Timepicker, Title, Toggle, Tooltip, Topbar, TrashIcon$2 as TrashIcon, TravelBoard, TravelDateRange, TravelServiceIcon, TravelSummaryMetrics, TravelerForm, TrendDownIcon, TrendUpIcon, TripDetailPage, TripSegment, TripTable, TypeIcon, UploadIcon, UserIcon, UsersIcon$1 as UsersIcon, ViHeaderForm, VirtualInvoicingPage, WarningIcon$1 as WarningIcon, XIcon, absoluteFill, accentColors, alertBandTokens, alertTokens, boxShadow, brandColors, breakpoints, buildPaginationItems, buttonReset, computeLineItemTotal, computeQuoteTotals, computeTravelTypeCodes, css, cx, darkTheme, lightTheme as defaultTheme, deriveProgramBidStatus, flexCenter, flexCol, flexRow, font, fontFamily, fontSize, fontWeight, formatCompactTripCost, formatItineraryDate, formatItineraryDateRange, formatItineraryMoney, formatTeamScheduleDueDate, formatTeamScheduleTravelDates, getCharterSourcingEmailRoute, getCharterSourcingEmailSubject, getPageCount, getSegmentDate, getSegmentStartMinutes, getSegmentTitle, getTeamTravelCalendarPeriodLabel, groupSegmentsByDay, iconNames, iconRegistry, injectGlobal, isExpiringSoon, isProgramBiddable, isQuoteActionable, isTravelDueDateCompleted, isTravelDueDateOverdue, itineraryPageName, leading, lightTheme, lineClamp, lineHeight, matchesQuoteSearch, merge, moveTeamTravelCalendarPeriod, navyColors, neutralColors, ordinalDay, parseClockTime, parseItineraryDate, primaryColors, radius, rounded, semanticColors, shadow, size, space, spacing, sportCodeVariant, srOnly, statusColors, styled, sx, tabStripTabId, teamColors, textColors, tintColors, toInlineStyle, trans, transition, truncate$1 as truncate, useTheme, weight };
|
|
38778
39024
|
//# sourceMappingURL=index.esm.js.map
|