@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.js
CHANGED
|
@@ -1080,7 +1080,7 @@ const iconStyle$h = {
|
|
|
1080
1080
|
const bodyStyle$d = {
|
|
1081
1081
|
label: 'Alert-bodyStyle', flex: 1, minWidth: 0
|
|
1082
1082
|
};
|
|
1083
|
-
const titleStyle$
|
|
1083
|
+
const titleStyle$I = {
|
|
1084
1084
|
label: 'Alert-titleStyle',
|
|
1085
1085
|
color: 'var(--alert-ink)',
|
|
1086
1086
|
fontWeight: 'var(--font-weight-semibold)',
|
|
@@ -1149,7 +1149,7 @@ const variantIcons = {
|
|
|
1149
1149
|
*/
|
|
1150
1150
|
const Alert = ({ variant = 'primary', title, children, dismissible = false, onDismiss, className = '', }) => {
|
|
1151
1151
|
const IconComponent = variantIcons[variant];
|
|
1152
|
-
return (jsxRuntime.jsx("div", { className: cx(sx(alertStyle$5), sx(variantStyles$8[variant]), className), role: "alert", children: jsxRuntime.jsxs("div", { className: sx(contentStyle$e), children: [jsxRuntime.jsx(IconComponent, { className: sx(iconStyle$h), size: 20 }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$d), children: [title && jsxRuntime.jsx("h4", { className: sx(titleStyle$
|
|
1152
|
+
return (jsxRuntime.jsx("div", { className: cx(sx(alertStyle$5), sx(variantStyles$8[variant]), className), role: "alert", children: jsxRuntime.jsxs("div", { className: sx(contentStyle$e), children: [jsxRuntime.jsx(IconComponent, { className: sx(iconStyle$h), size: 20 }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$d), children: [title && jsxRuntime.jsx("h4", { className: sx(titleStyle$I), children: title }), jsxRuntime.jsx("div", { className: sx(messageStyle$3), children: children })] }), dismissible && onDismiss && (jsxRuntime.jsx("button", { type: "button", onClick: onDismiss, className: sx(dismissButtonStyle), "aria-label": "Dismiss alert", children: jsxRuntime.jsx(CloseIcon, { size: 16 }) }))] }) }));
|
|
1153
1153
|
};
|
|
1154
1154
|
|
|
1155
1155
|
const avatarSizeStyles = {
|
|
@@ -2842,7 +2842,7 @@ const textareaSizeStyles = {
|
|
|
2842
2842
|
* The focus rules below restate the ring the base focus rules already set —
|
|
2843
2843
|
* they did in the sheet too, and they are carried across unchanged.
|
|
2844
2844
|
*/
|
|
2845
|
-
const errorStyle$
|
|
2845
|
+
const errorStyle$5 = {
|
|
2846
2846
|
label: 'Input-errorStyle',
|
|
2847
2847
|
'&&&': {
|
|
2848
2848
|
borderColor: 'var(--color-danger-accent)',
|
|
@@ -2984,7 +2984,7 @@ const Input = React.forwardRef(({ size = 'md', sizing = 'fixed', label, helperTe
|
|
|
2984
2984
|
const inputWrapperClasses = cx(sx(inputWrapperStyle$3),
|
|
2985
2985
|
// The fixed-height class still applies its horizontal padding and gap;
|
|
2986
2986
|
// the padded classes that follow override height and the vertical rhythm.
|
|
2987
|
-
sx(sizeStyles$8[size]), paddedClasses(sizing, size), error && sx(errorStyle$
|
|
2987
|
+
sx(sizeStyles$8[size]), paddedClasses(sizing, size), error && sx(errorStyle$5), disabled && sx(disabledStyle$7));
|
|
2988
2988
|
return (jsxRuntime.jsxs("div", { className: wrapperClasses, children: [label && (jsxRuntime.jsx("label", { htmlFor: inputId, className: sx(labelStyle$g), children: label })), jsxRuntime.jsxs("div", { className: inputWrapperClasses, children: [leftIcon && jsxRuntime.jsx("span", { className: sx(iconStyle$d), children: leftIcon }), jsxRuntime.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 && jsxRuntime.jsx("span", { className: sx(iconStyle$d), children: rightIcon })] }), error && (jsxRuntime.jsx("span", { id: `${inputId}-error`, className: sx(errorTextStyle$4), children: error })), helperText && !error && (jsxRuntime.jsx("span", { id: `${inputId}-helper`, className: sx(helperTextStyle$4), children: helperText }))] }));
|
|
2989
2989
|
});
|
|
2990
2990
|
Input.displayName = 'Input';
|
|
@@ -3000,7 +3000,7 @@ const Textarea = React.forwardRef(({ size = 'md', sizing = 'fixed', label, helpe
|
|
|
3000
3000
|
sx(textareaSizeStyles[size]), paddedClasses(sizing, size),
|
|
3001
3001
|
// `.textarea.paddedSm` — the type scale the padded rules put on a
|
|
3002
3002
|
// descendant `.input` that a bare <textarea> does not have.
|
|
3003
|
-
sizing === 'padded' && sx(textareaPaddedSizeStyles[size]), error && sx(errorStyle$
|
|
3003
|
+
sizing === 'padded' && sx(textareaPaddedSizeStyles[size]), error && sx(errorStyle$5), disabled && sx(disabledStyle$7));
|
|
3004
3004
|
return (jsxRuntime.jsxs("div", { className: wrapperClasses, children: [label && (jsxRuntime.jsx("label", { htmlFor: textareaId, className: sx(labelStyle$g), children: label })), jsxRuntime.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 && (jsxRuntime.jsx("span", { id: `${textareaId}-error`, className: sx(errorTextStyle$4), children: error })), helperText && !error && (jsxRuntime.jsx("span", { id: `${textareaId}-helper`, className: sx(helperTextStyle$4), children: helperText }))] }));
|
|
3005
3005
|
});
|
|
3006
3006
|
Textarea.displayName = 'Textarea';
|
|
@@ -3248,7 +3248,7 @@ const chevron$1 = `.${sx(chevronStyle$6)}`;
|
|
|
3248
3248
|
* `.selectWrapper:focus-within`, which is rewritten below as `&&:focus-within`
|
|
3249
3249
|
* (0,3,0) so it still clears the plain `&&` error border.
|
|
3250
3250
|
*/
|
|
3251
|
-
const errorStyle$
|
|
3251
|
+
const errorStyle$4 = {
|
|
3252
3252
|
label: 'Select-errorStyle',
|
|
3253
3253
|
'&&': { borderColor: 'var(--color-red-500)' },
|
|
3254
3254
|
'&&&:focus-within': {
|
|
@@ -3256,7 +3256,7 @@ const errorStyle$3 = {
|
|
|
3256
3256
|
boxShadow: '0 0 0 2px var(--color-accent-ink), 0 0 0 5px var(--color-accent-glow)',
|
|
3257
3257
|
},
|
|
3258
3258
|
};
|
|
3259
|
-
const error = `.${sx(errorStyle$
|
|
3259
|
+
const error = `.${sx(errorStyle$4)}`;
|
|
3260
3260
|
/**
|
|
3261
3261
|
* `&&` for the wrapper's own background/cursor, which beat `.selectWrapper` on
|
|
3262
3262
|
* source order; `&& .select` (0,3,0) for the inner colour, which had to clear
|
|
@@ -3420,7 +3420,7 @@ const Select = React.forwardRef(({ options, optionGroups, size = 'md', label, pl
|
|
|
3420
3420
|
* their padded sizes separately, so Input's objects are not this
|
|
3421
3421
|
* component's. The prop is the shared contract; the rules are local.
|
|
3422
3422
|
*/
|
|
3423
|
-
const selectWrapperClasses = cx(sx(selectWrapperStyle), sx(sizeStyles$7[size]), sizing === 'padded' && cx(sx(paddedStyle), sx(paddedSizeStyles[size])), error && sx(errorStyle$
|
|
3423
|
+
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));
|
|
3424
3424
|
const renderOptions = () => {
|
|
3425
3425
|
// Render grouped options
|
|
3426
3426
|
if (optionGroups && optionGroups.length > 0) {
|
|
@@ -3733,7 +3733,7 @@ const inputStyle$4 = {
|
|
|
3733
3733
|
* `.inputWrapper:focus-within` on specificity and won on source order — here it
|
|
3734
3734
|
* has to out-rank that rule's own `&&&:focus-within` (0,4,0) outright.
|
|
3735
3735
|
*/
|
|
3736
|
-
const errorStyle$
|
|
3736
|
+
const errorStyle$3 = {
|
|
3737
3737
|
label: 'Timepicker-errorStyle',
|
|
3738
3738
|
'&&': {
|
|
3739
3739
|
borderColor: 'var(--color-red-500)',
|
|
@@ -3783,7 +3783,7 @@ const inputWrapperStyle$2 = {
|
|
|
3783
3783
|
borderColor: 'var(--color-primary-500)',
|
|
3784
3784
|
boxShadow: '0 0 0 2px var(--color-accent-ink), 0 0 0 5px var(--color-accent-glow)',
|
|
3785
3785
|
},
|
|
3786
|
-
[`&&&&:hover:not(.${sx(disabledStyle$5)}):not(.${sx(errorStyle$
|
|
3786
|
+
[`&&&&:hover:not(.${sx(disabledStyle$5)}):not(.${sx(errorStyle$3)})`]: {
|
|
3787
3787
|
borderColor: 'var(--color-gray-400)',
|
|
3788
3788
|
},
|
|
3789
3789
|
};
|
|
@@ -3828,7 +3828,7 @@ const Timepicker = React.forwardRef(({ size = 'md', label, helperText, error, fu
|
|
|
3828
3828
|
const helperId = `${inputId}-helper`;
|
|
3829
3829
|
const errorId = `${inputId}-error`;
|
|
3830
3830
|
const wrapperClasses = cx(sx(wrapperStyle$6), fullWidth ? sx(fullWidthStyle$1) : '', className);
|
|
3831
|
-
const inputWrapperClasses = cx(sx(inputWrapperStyle$2), sx(sizeStyles$5[size]), error ? sx(errorStyle$
|
|
3831
|
+
const inputWrapperClasses = cx(sx(inputWrapperStyle$2), sx(sizeStyles$5[size]), error ? sx(errorStyle$3) : '', disabled ? sx(disabledStyle$5) : '');
|
|
3832
3832
|
return (jsxRuntime.jsxs("div", { className: wrapperClasses, children: [label && (jsxRuntime.jsx("label", { htmlFor: inputId, className: sx(labelStyle$d), children: label })), jsxRuntime.jsxs("div", { className: inputWrapperClasses, children: [jsxRuntime.jsx("span", { className: sx(iconStyle$c), children: jsxRuntime.jsx(ClockIcon$1, {}) }), jsxRuntime.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]
|
|
3833
3833
|
.filter(Boolean)
|
|
3834
3834
|
.join(' ') || undefined, ...props })] }), error && (jsxRuntime.jsx("span", { id: errorId, className: sx(errorTextStyle$2), children: error })), helperText && !error && (jsxRuntime.jsx("span", { id: helperId, className: sx(helperTextStyle$2), children: helperText }))] }));
|
|
@@ -3836,7 +3836,7 @@ const Timepicker = React.forwardRef(({ size = 'md', label, helperText, error, fu
|
|
|
3836
3836
|
Timepicker.displayName = 'Timepicker';
|
|
3837
3837
|
|
|
3838
3838
|
/** The page heading: display face, tightened tracking, and no default margin. */
|
|
3839
|
-
const titleStyle$
|
|
3839
|
+
const titleStyle$H = {
|
|
3840
3840
|
label: 'Title-titleStyle',
|
|
3841
3841
|
fontFamily: 'var(--font-family-display)',
|
|
3842
3842
|
fontSize: 36,
|
|
@@ -3863,7 +3863,7 @@ const weightStyles = {
|
|
|
3863
3863
|
* Large, prominent text for page titles.
|
|
3864
3864
|
*/
|
|
3865
3865
|
const Title = ({ children, weight = 'light', className = '', }) => {
|
|
3866
|
-
return (jsxRuntime.jsx("h1", { className: cx(sx(titleStyle$
|
|
3866
|
+
return (jsxRuntime.jsx("h1", { className: cx(sx(titleStyle$H), sx(weightStyles[weight]), className), children: children }));
|
|
3867
3867
|
};
|
|
3868
3868
|
Title.displayName = 'Title';
|
|
3869
3869
|
|
|
@@ -4720,11 +4720,11 @@ const identityStyle$2 = {
|
|
|
4720
4720
|
display: 'flex',
|
|
4721
4721
|
flexDirection: 'column',
|
|
4722
4722
|
};
|
|
4723
|
-
const nameStyle$
|
|
4723
|
+
const nameStyle$7 = {
|
|
4724
4724
|
label: 'ContactCard-nameStyle',
|
|
4725
4725
|
fontWeight: 600,
|
|
4726
4726
|
};
|
|
4727
|
-
const titleStyle$
|
|
4727
|
+
const titleStyle$G = {
|
|
4728
4728
|
label: 'ContactCard-titleStyle',
|
|
4729
4729
|
fontSize: 12,
|
|
4730
4730
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -4754,7 +4754,7 @@ const linkTextStyle = {
|
|
|
4754
4754
|
const ContactCard$1 = ({ name, title, phone, email, action, showAvatar = true, className = '', }) => {
|
|
4755
4755
|
if (!action && !name)
|
|
4756
4756
|
return null;
|
|
4757
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(contactStyle$1), className), children: [name && showAvatar && jsxRuntime.jsx(Avatar, { name: name, size: 36 }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$b), children: [jsxRuntime.jsxs("div", { className: sx(identityStyle$2), children: [action || jsxRuntime.jsx("span", { className: sx(nameStyle$
|
|
4757
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(contactStyle$1), className), children: [name && showAvatar && jsxRuntime.jsx(Avatar, { name: name, size: 36 }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$b), children: [jsxRuntime.jsxs("div", { className: sx(identityStyle$2), children: [action || jsxRuntime.jsx("span", { className: sx(nameStyle$7), children: name }), title && jsxRuntime.jsx("span", { className: sx(titleStyle$G), children: title })] }), phone && (jsxRuntime.jsxs("a", { href: `tel:${phone}`, className: sx(linkStyle$1), children: [jsxRuntime.jsx(PhoneIcon, { size: 16, "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: sx(linkTextStyle), children: phone })] })), email && (jsxRuntime.jsxs("a", { href: `mailto:${email}`, className: sx(linkStyle$1), children: [jsxRuntime.jsx(MailIcon, { size: 16, "aria-hidden": "true" }), jsxRuntime.jsx("span", { className: sx(linkTextStyle), children: email })] }))] })] }));
|
|
4758
4758
|
};
|
|
4759
4759
|
ContactCard$1.displayName = 'ContactCard';
|
|
4760
4760
|
|
|
@@ -5074,7 +5074,7 @@ const iconStyle$a = {
|
|
|
5074
5074
|
backgroundColor: 'var(--bg-subtle)',
|
|
5075
5075
|
color: 'var(--fg-4)',
|
|
5076
5076
|
};
|
|
5077
|
-
const titleStyle$
|
|
5077
|
+
const titleStyle$F = {
|
|
5078
5078
|
label: 'EmptyState-titleStyle',
|
|
5079
5079
|
margin: 0,
|
|
5080
5080
|
color: 'var(--fg-1)',
|
|
@@ -5090,7 +5090,7 @@ const descriptionStyle$a = {
|
|
|
5090
5090
|
fontSize: 'var(--fs-sm)',
|
|
5091
5091
|
lineHeight: 'var(--lh-sm)',
|
|
5092
5092
|
};
|
|
5093
|
-
const actionsStyle$
|
|
5093
|
+
const actionsStyle$e = {
|
|
5094
5094
|
label: 'EmptyState-actionsStyle',
|
|
5095
5095
|
display: 'flex',
|
|
5096
5096
|
flexWrap: 'wrap',
|
|
@@ -5100,7 +5100,7 @@ const actionsStyle$d = {
|
|
|
5100
5100
|
};
|
|
5101
5101
|
|
|
5102
5102
|
/** Placeholder shown when a list, table, or panel has nothing to display. */
|
|
5103
|
-
const EmptyState$1 = ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size = 'md', children, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(emptyStateStyle$1), sx(sizeStyles$4[size]), className), "data-test": "empty-state", children: [icon && jsxRuntime.jsx("div", { className: sx(iconStyle$a), "aria-hidden": "true", children: icon }), jsxRuntime.jsx("p", { className: sx(titleStyle$
|
|
5103
|
+
const EmptyState$1 = ({ title, description, icon, actionLabel, onAction, secondaryActionLabel, onSecondaryAction, size = 'md', children, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(emptyStateStyle$1), sx(sizeStyles$4[size]), className), "data-test": "empty-state", children: [icon && jsxRuntime.jsx("div", { className: sx(iconStyle$a), "aria-hidden": "true", children: icon }), jsxRuntime.jsx("p", { className: sx(titleStyle$F), children: title }), description && jsxRuntime.jsx("p", { className: sx(descriptionStyle$a), children: description }), (actionLabel || secondaryActionLabel) && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$e), children: [actionLabel && (jsxRuntime.jsx(Button, { size: "sm", onClick: onAction, "data-test": "empty-state-action", children: actionLabel })), secondaryActionLabel && (jsxRuntime.jsx(Button, { size: "sm", variant: "secondary", onClick: onSecondaryAction, "data-test": "empty-state-secondary-action", children: secondaryActionLabel }))] })), children] }));
|
|
5104
5104
|
|
|
5105
5105
|
/** FieldLayout's compiled rules. */
|
|
5106
5106
|
const fieldStyle$4 = {
|
|
@@ -5180,11 +5180,11 @@ const messageStyle$2 = {
|
|
|
5180
5180
|
label: 'FieldLayout-messageStyle', fontSize: 12
|
|
5181
5181
|
};
|
|
5182
5182
|
/** Paired with `messageStyle`, which sets no colour — no ranking to preserve. */
|
|
5183
|
-
const errorStyle$
|
|
5183
|
+
const errorStyle$2 = {
|
|
5184
5184
|
label: 'FieldLayout-errorStyle',
|
|
5185
5185
|
color: 'var(--color-error, #940000)',
|
|
5186
5186
|
};
|
|
5187
|
-
const noteStyle$
|
|
5187
|
+
const noteStyle$3 = {
|
|
5188
5188
|
label: 'FieldLayout-noteStyle',
|
|
5189
5189
|
color: 'var(--color-stone, #787878)',
|
|
5190
5190
|
};
|
|
@@ -5202,7 +5202,7 @@ const FieldLayout = ({ children, label, labelPosition = 'top', showLabel = true,
|
|
|
5202
5202
|
const id = React.useId();
|
|
5203
5203
|
const errorId = `${id}-error`;
|
|
5204
5204
|
const hasError = Boolean(error);
|
|
5205
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(fieldStyle$4), sx(labelPositionStyles[labelPosition]), className), children: [label && showLabel && (jsxRuntime.jsxs("label", { htmlFor: id, className: cx(sx(labelStyle$b), hasError ? sx(labelErrorStyle) : ''), children: [label, required && !disabled && (jsxRuntime.jsx("span", { className: sx(requiredStyle$2), "aria-hidden": "true", children: "*" })), tooltip && (jsxRuntime.jsx(Tooltip, { className: sx(tooltipStyle$1), content: tooltip, children: jsxRuntime.jsx(InfoIcon$1, { size: 16 }) }))] })), jsxRuntime.jsxs("div", { className: sx(controlStyle$2), children: [leftIcon && !disabled && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$9), sx(iconLeftStyle)), "aria-hidden": "true", children: leftIcon })), children({ id, describedBy: hasError ? errorId : undefined, hasError }), rightIcon && !disabled && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$9), sx(iconRightStyle)), "aria-hidden": "true", children: rightIcon }))] }), hasError && (jsxRuntime.jsx("p", { id: errorId, className: cx(sx(messageStyle$2), sx(errorStyle$
|
|
5205
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(fieldStyle$4), sx(labelPositionStyles[labelPosition]), className), children: [label && showLabel && (jsxRuntime.jsxs("label", { htmlFor: id, className: cx(sx(labelStyle$b), hasError ? sx(labelErrorStyle) : ''), children: [label, required && !disabled && (jsxRuntime.jsx("span", { className: sx(requiredStyle$2), "aria-hidden": "true", children: "*" })), tooltip && (jsxRuntime.jsx(Tooltip, { className: sx(tooltipStyle$1), content: tooltip, children: jsxRuntime.jsx(InfoIcon$1, { size: 16 }) }))] })), jsxRuntime.jsxs("div", { className: sx(controlStyle$2), children: [leftIcon && !disabled && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$9), sx(iconLeftStyle)), "aria-hidden": "true", children: leftIcon })), children({ id, describedBy: hasError ? errorId : undefined, hasError }), rightIcon && !disabled && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$9), sx(iconRightStyle)), "aria-hidden": "true", children: rightIcon }))] }), hasError && (jsxRuntime.jsx("p", { id: errorId, className: cx(sx(messageStyle$2), sx(errorStyle$2)), children: error })), note && jsxRuntime.jsx("p", { className: cx(sx(messageStyle$2), sx(noteStyle$3)), children: note })] }));
|
|
5206
5206
|
};
|
|
5207
5207
|
FieldLayout.displayName = 'FieldLayout';
|
|
5208
5208
|
|
|
@@ -5733,7 +5733,7 @@ const iconStyle$8 = {
|
|
|
5733
5733
|
display: 'flex',
|
|
5734
5734
|
},
|
|
5735
5735
|
};
|
|
5736
|
-
const titleStyle$
|
|
5736
|
+
const titleStyle$E = {
|
|
5737
5737
|
label: 'FormSection-titleStyle',
|
|
5738
5738
|
margin: 0,
|
|
5739
5739
|
fontSize: 16,
|
|
@@ -5800,7 +5800,7 @@ const statusStyles = {
|
|
|
5800
5800
|
const FormSection = ({ title, icon, description, action, status, disabled = false, children, className, id, dataTest, }) => {
|
|
5801
5801
|
const isSubmitted = status === 'submitted';
|
|
5802
5802
|
const isDisabled = disabled || isSubmitted;
|
|
5803
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(sectionStyle$a), className), id: id, "data-test": dataTest, children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$J), children: [icon && jsxRuntime.jsx("span", { className: sx(iconStyle$8), children: icon }), jsxRuntime.jsxs("div", { className: sx(headingStyle$5), children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
5803
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(sectionStyle$a), className), id: id, "data-test": dataTest, children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$J), children: [icon && jsxRuntime.jsx("span", { className: sx(iconStyle$8), children: icon }), jsxRuntime.jsxs("div", { className: sx(headingStyle$5), children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$E), children: title }), description && jsxRuntime.jsx("p", { className: sx(descriptionStyle$9), children: description })] }), action && jsxRuntime.jsx("div", { className: sx(actionStyle$1), children: action })] }), jsxRuntime.jsxs("fieldset", { disabled: isDisabled, className: cx(sx(fieldsetStyle), isDisabled && sx(disabledStyle$4)), children: [status && (jsxRuntime.jsxs("div", { className: sx(statusStyle$6), children: [jsxRuntime.jsx("span", { className: sx(statusLabelStyle), children: "Status:" }), jsxRuntime.jsx("span", { className: cx(sx(statusValueStyle), sx(statusStyles[status])), children: status === 'submitted' ? 'Submitted' : status === 'draft' ? 'Draft' : 'Not Submitted' })] })), children] })] }));
|
|
5804
5804
|
};
|
|
5805
5805
|
FormSection.displayName = 'FormSection';
|
|
5806
5806
|
|
|
@@ -5948,7 +5948,7 @@ const lockedActiveStyle = {
|
|
|
5948
5948
|
* and the tab picks one, which is exactly what the cascade resolved to and
|
|
5949
5949
|
* needs no ordering between the rules to hold.
|
|
5950
5950
|
*/
|
|
5951
|
-
const countStyle = {
|
|
5951
|
+
const countStyle$1 = {
|
|
5952
5952
|
label: 'ManifestViewToggle-countStyle',
|
|
5953
5953
|
fontSize: 11,
|
|
5954
5954
|
fontWeight: 'var(--fw-bold)',
|
|
@@ -5975,7 +5975,7 @@ const ManifestViewToggle = ({ view, onView, paxCount, eqCount, locked, className
|
|
|
5975
5975
|
// Locked reads before active, matching the descendant rules the
|
|
5976
5976
|
// stylesheet ordered the same way.
|
|
5977
5977
|
const countState = locked ? 'locked' : active ? 'active' : 'default';
|
|
5978
|
-
return (jsxRuntime.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: [jsxRuntime.jsx(Icon, { size: 16 }), tab.label, jsxRuntime.jsx("span", { className: cx(sx(countStyle), sx(countColorStyles[countState])), children: tab.count })] }, tab.key));
|
|
5978
|
+
return (jsxRuntime.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: [jsxRuntime.jsx(Icon, { size: 16 }), tab.label, jsxRuntime.jsx("span", { className: cx(sx(countStyle$1), sx(countColorStyles[countState])), children: tab.count })] }, tab.key));
|
|
5979
5979
|
}) }));
|
|
5980
5980
|
};
|
|
5981
5981
|
|
|
@@ -6908,7 +6908,7 @@ const pretitleStyle$1 = {
|
|
|
6908
6908
|
color: 'var(--color-slate, #5c5c5c)',
|
|
6909
6909
|
margin: 0,
|
|
6910
6910
|
};
|
|
6911
|
-
const titleStyle$
|
|
6911
|
+
const titleStyle$D = {
|
|
6912
6912
|
label: 'PageHeader-titleStyle',
|
|
6913
6913
|
fontSize: 36,
|
|
6914
6914
|
lineHeight: '48px',
|
|
@@ -6928,7 +6928,7 @@ const titleStyle$C = {
|
|
|
6928
6928
|
* The header keeps its height while `title` is empty and fades in once one
|
|
6929
6929
|
* arrives, so pages do not jump as their data loads.
|
|
6930
6930
|
*/
|
|
6931
|
-
const PageHeader = ({ title, pretitle, after, back, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$I), !title && sx(emptyStyle$m), className), children: [back, jsxRuntime.jsx("div", { className: sx(bodyStyle$a), children: jsxRuntime.jsxs("div", { className: sx(textStyle), children: [pretitle && jsxRuntime.jsx("h2", { className: sx(pretitleStyle$1), children: pretitle }), jsxRuntime.jsxs("h1", { className: sx(titleStyle$
|
|
6931
|
+
const PageHeader = ({ title, pretitle, after, back, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$I), !title && sx(emptyStyle$m), className), children: [back, jsxRuntime.jsx("div", { className: sx(bodyStyle$a), children: jsxRuntime.jsxs("div", { className: sx(textStyle), children: [pretitle && jsxRuntime.jsx("h2", { className: sx(pretitleStyle$1), children: pretitle }), jsxRuntime.jsxs("h1", { className: sx(titleStyle$D), children: [title, "\u00A0"] }), after] }) })] }));
|
|
6932
6932
|
PageHeader.displayName = 'PageHeader';
|
|
6933
6933
|
|
|
6934
6934
|
/**
|
|
@@ -6984,7 +6984,7 @@ const sectionStyle$9 = {
|
|
|
6984
6984
|
fontWeight: 400,
|
|
6985
6985
|
lineHeight: '28px',
|
|
6986
6986
|
};
|
|
6987
|
-
const titleStyle$
|
|
6987
|
+
const titleStyle$C = {
|
|
6988
6988
|
label: 'PageHeaderSubsection-titleStyle',
|
|
6989
6989
|
gridArea: 'title',
|
|
6990
6990
|
margin: 0,
|
|
@@ -7001,7 +7001,7 @@ const metaStyle$1 = {
|
|
|
7001
7001
|
minWidth: 0,
|
|
7002
7002
|
marginTop: 4,
|
|
7003
7003
|
};
|
|
7004
|
-
const actionsStyle$
|
|
7004
|
+
const actionsStyle$d = {
|
|
7005
7005
|
label: 'PageHeaderSubsection-actionsStyle',
|
|
7006
7006
|
gridArea: 'actions',
|
|
7007
7007
|
display: 'flex',
|
|
@@ -7021,7 +7021,7 @@ const PageHeaderSubsection = ({ sectionName, pageName, meta, onBack, backLabel =
|
|
|
7021
7021
|
else
|
|
7022
7022
|
window.history.back();
|
|
7023
7023
|
};
|
|
7024
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$H), className), "data-test": "page-header-subsection", children: [jsxRuntime.jsxs("div", { className: sx(sectionRowStyle), children: [!hideBack && (jsxRuntime.jsx("button", { type: "button", className: sx(backButtonStyle$1), onClick: handleBack, "aria-label": backLabel, "data-test": "page-header-subsection-back", children: jsxRuntime.jsx(BackIcon$1, {}) })), jsxRuntime.jsx("p", { className: sx(sectionStyle$9), children: sectionName })] }), jsxRuntime.jsx("h1", { className: sx(titleStyle$
|
|
7024
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$H), className), "data-test": "page-header-subsection", children: [jsxRuntime.jsxs("div", { className: sx(sectionRowStyle), children: [!hideBack && (jsxRuntime.jsx("button", { type: "button", className: sx(backButtonStyle$1), onClick: handleBack, "aria-label": backLabel, "data-test": "page-header-subsection-back", children: jsxRuntime.jsx(BackIcon$1, {}) })), jsxRuntime.jsx("p", { className: sx(sectionStyle$9), children: sectionName })] }), jsxRuntime.jsx("h1", { className: sx(titleStyle$C), children: pageName }), meta && jsxRuntime.jsx("div", { className: sx(metaStyle$1), children: meta }), actions && jsxRuntime.jsx("div", { className: sx(actionsStyle$d), children: actions })] }));
|
|
7025
7025
|
};
|
|
7026
7026
|
PageHeaderSubsection.displayName = 'PageHeaderSubsection';
|
|
7027
7027
|
|
|
@@ -7119,7 +7119,7 @@ const focusRing = {
|
|
|
7119
7119
|
* current page is matched on `[aria-current="page"]` instead — the component
|
|
7120
7120
|
* sets that attribute from the same expression that sets `currentStyle`.
|
|
7121
7121
|
*/
|
|
7122
|
-
const pageStyle$
|
|
7122
|
+
const pageStyle$v = {
|
|
7123
7123
|
label: 'Pagination-pageStyle',
|
|
7124
7124
|
...buttonBase,
|
|
7125
7125
|
'&:hover:not([aria-current="page"])': {
|
|
@@ -7202,7 +7202,7 @@ const Pagination = ({ page, pageSize, totalItems, siblingCount = 1, pageSizeOpti
|
|
|
7202
7202
|
return;
|
|
7203
7203
|
onPageChange?.(next);
|
|
7204
7204
|
};
|
|
7205
|
-
return (jsxRuntime.jsxs("nav", { className: cx(sx(paginationStyle$3), className), "aria-label": ariaLabel, "data-test": "pagination", children: [!hideSummary && (jsxRuntime.jsxs("p", { className: sx(summaryStyle$6), "data-test": "pagination-summary", children: ["Showing ", firstItem, "\u2013", lastItem, " of ", totalItems, " ", itemLabel] })), jsxRuntime.jsxs("div", { className: sx(controlsStyle), children: [showSizeSelector && (jsxRuntime.jsxs("label", { className: sx(pageSizeStyle), children: [jsxRuntime.jsx("span", { children: "Rows per page" }), jsxRuntime.jsx("select", { value: pageSize, onChange: (event) => onPageSizeChange?.(Number(event.target.value)), "data-test": "pagination-page-size", children: pageSizeOptions.map((option) => (jsxRuntime.jsx("option", { value: option, children: option }, option))) })] })), jsxRuntime.jsxs("ul", { className: sx(pagesStyle), children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage - 1), disabled: currentPage <= 1, "aria-label": "Previous page", "data-test": "pagination-previous", children: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }) }) }), items.map((item, index) => item === 'ellipsis' ? (jsxRuntime.jsx("li", { className: sx(ellipsisStyle), "aria-hidden": "true", children: "\u2026" }, `ellipsis-${index}`)) : (jsxRuntime.jsx("li", { children: jsxRuntime.jsx("button", { type: "button", className: cx(sx(pageStyle$
|
|
7205
|
+
return (jsxRuntime.jsxs("nav", { className: cx(sx(paginationStyle$3), className), "aria-label": ariaLabel, "data-test": "pagination", children: [!hideSummary && (jsxRuntime.jsxs("p", { className: sx(summaryStyle$6), "data-test": "pagination-summary", children: ["Showing ", firstItem, "\u2013", lastItem, " of ", totalItems, " ", itemLabel] })), jsxRuntime.jsxs("div", { className: sx(controlsStyle), children: [showSizeSelector && (jsxRuntime.jsxs("label", { className: sx(pageSizeStyle), children: [jsxRuntime.jsx("span", { children: "Rows per page" }), jsxRuntime.jsx("select", { value: pageSize, onChange: (event) => onPageSizeChange?.(Number(event.target.value)), "data-test": "pagination-page-size", children: pageSizeOptions.map((option) => (jsxRuntime.jsx("option", { value: option, children: option }, option))) })] })), jsxRuntime.jsxs("ul", { className: sx(pagesStyle), children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage - 1), disabled: currentPage <= 1, "aria-label": "Previous page", "data-test": "pagination-previous", children: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }) }) }), items.map((item, index) => item === 'ellipsis' ? (jsxRuntime.jsx("li", { className: sx(ellipsisStyle), "aria-hidden": "true", children: "\u2026" }, `ellipsis-${index}`)) : (jsxRuntime.jsx("li", { children: jsxRuntime.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))), jsxRuntime.jsx("li", { children: jsxRuntime.jsx("button", { type: "button", className: sx(stepStyle), onClick: () => goTo(currentPage + 1), disabled: currentPage >= pageCount, "aria-label": "Next page", "data-test": "pagination-next", children: jsxRuntime.jsx(ChevronRightIcon$1, { size: 16 }) }) })] })] })] }));
|
|
7206
7206
|
};
|
|
7207
7207
|
|
|
7208
7208
|
/* Progress Bar */
|
|
@@ -7373,7 +7373,7 @@ ResultCount.displayName = 'ResultCount';
|
|
|
7373
7373
|
* - `@keyframes spin` was scoped by the module; injected at runtime it is
|
|
7374
7374
|
* global, so it is namespaced `stm-spin` and the `animation` value follows.
|
|
7375
7375
|
*/
|
|
7376
|
-
const toolbarStyle$
|
|
7376
|
+
const toolbarStyle$5 = {
|
|
7377
7377
|
label: 'RosterToolbar-toolbarStyle',
|
|
7378
7378
|
display: 'flex',
|
|
7379
7379
|
alignItems: 'center',
|
|
@@ -7552,7 +7552,7 @@ const DropdownButton = ({ label, icon, options, }) => {
|
|
|
7552
7552
|
* RosterToolbar - Toolbar for roster management with import/export/save actions
|
|
7553
7553
|
*/
|
|
7554
7554
|
const RosterToolbar = ({ importOptions, exportOptions, lockToggle, saveButton, additionalActions, searchField, className = '', }) => {
|
|
7555
|
-
const toolbarClasses = cx(sx(toolbarStyle$
|
|
7555
|
+
const toolbarClasses = cx(sx(toolbarStyle$5), className);
|
|
7556
7556
|
return (jsxRuntime.jsxs("div", { className: toolbarClasses, children: [jsxRuntime.jsxs("div", { className: sx(leftSectionStyle), children: [searchField, additionalActions] }), jsxRuntime.jsxs("div", { className: sx(rightSectionStyle), children: [importOptions && importOptions.length > 0 && (jsxRuntime.jsx(DropdownButton, { label: "Import", icon: jsxRuntime.jsx(ImportIcon, {}), options: importOptions })), exportOptions && exportOptions.length > 0 && (jsxRuntime.jsx(DropdownButton, { label: "Export", icon: jsxRuntime.jsx(ExportIcon$1, {}), options: exportOptions })), lockToggle && (jsxRuntime.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 ? jsxRuntime.jsx(LockIcon, {}) : jsxRuntime.jsx(UnlockIcon, {}), jsxRuntime.jsx("span", { children: lockToggle.isLocked ? 'Locked' : 'Unlocked' })] })), saveButton && (jsxRuntime.jsxs("button", { type: "button", className: sx(saveButtonStyle), onClick: saveButton.onClick, disabled: saveButton.disabled || saveButton.loading, children: [saveButton.loading ? jsxRuntime.jsx(SpinnerIcon, {}) : jsxRuntime.jsx(SaveIcon, {}), jsxRuntime.jsx("span", { children: saveButton.label || 'Save' })] }))] })] }));
|
|
7557
7557
|
};
|
|
7558
7558
|
RosterToolbar.displayName = 'RosterToolbar';
|
|
@@ -7669,7 +7669,7 @@ const SearchField = React.forwardRef(({ placeholder = 'Search...', value, defaul
|
|
|
7669
7669
|
SearchField.displayName = 'SearchField';
|
|
7670
7670
|
|
|
7671
7671
|
/** The form's own vertical rhythm. */
|
|
7672
|
-
const formStyle$
|
|
7672
|
+
const formStyle$6 = {
|
|
7673
7673
|
label: 'SchoolContactForm-formStyle',
|
|
7674
7674
|
display: 'grid',
|
|
7675
7675
|
gap: 16,
|
|
@@ -7728,7 +7728,7 @@ const phoneFieldsStyle = {
|
|
|
7728
7728
|
* Layout for Hub's school-contact editor. Field controls stay injectable so
|
|
7729
7729
|
* consuming applications retain their form state, validation, and masking.
|
|
7730
7730
|
*/
|
|
7731
|
-
const SchoolContactForm = ({ mode, createFromPortalUser, firstNameField, middleInitialField, lastNameField, businessPhoneField, cellPhoneField, emailField, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(formStyle$
|
|
7731
|
+
const SchoolContactForm = ({ mode, createFromPortalUser, firstNameField, middleInitialField, lastNameField, businessPhoneField, cellPhoneField, emailField, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(formStyle$6), className), children: [mode === 'Add' && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("label", { className: sx(portalLabelStyle), children: "Create From Portal User" }), createFromPortalUser] }), jsxRuntime.jsx("div", { className: sx(dividerStyle$2), children: jsxRuntime.jsx("strong", { children: "OR" }) }), jsxRuntime.jsx("p", { className: sx(newContactLabelStyle), children: "Create New Contact Without Portal Access" })] })), jsxRuntime.jsxs("div", { className: sx(nameFieldsStyle), children: [firstNameField, middleInitialField, lastNameField] }), jsxRuntime.jsxs("div", { className: sx(phoneFieldsStyle), children: [businessPhoneField, cellPhoneField] }), jsxRuntime.jsx("div", { children: emailField })] }));
|
|
7732
7732
|
|
|
7733
7733
|
const segmentStyle$2 = {
|
|
7734
7734
|
label: 'Segment-segmentStyle',
|
|
@@ -7957,7 +7957,7 @@ const activeTabStyle$1 = {
|
|
|
7957
7957
|
},
|
|
7958
7958
|
};
|
|
7959
7959
|
/* Actions */
|
|
7960
|
-
const actionsStyle$
|
|
7960
|
+
const actionsStyle$c = {
|
|
7961
7961
|
label: 'SelectFilter-actionsStyle',
|
|
7962
7962
|
display: 'flex',
|
|
7963
7963
|
gap: 8,
|
|
@@ -8121,7 +8121,7 @@ const SelectFilter = ({ label, options = [], groupedOptions = {}, value = [], on
|
|
|
8121
8121
|
}
|
|
8122
8122
|
return `${selected.length} selected`;
|
|
8123
8123
|
};
|
|
8124
|
-
return (jsxRuntime.jsxs("div", { ref: dropdownRef, className: cx(sx(containerStyle$4), className), children: [jsxRuntime.jsxs("button", { type: "button", className: cx(sx(triggerStyle$1), disabled ? sx(disabledStyle) : '', isOpen ? sx(openStyle$2) : ''), onClick: () => !disabled && setIsOpen(!isOpen), children: [jsxRuntime.jsx("span", { className: cx(sx(triggerTextStyle), selectedValues.length === 0 ? sx(placeholderStyle) : ''), children: getDisplayText() }), jsxRuntime.jsx("span", { className: sx(chevronStyle$3), children: jsxRuntime.jsx(ChevronIcon$1, {}) })] }), isOpen && (jsxRuntime.jsxs("div", { className: sx(dropdownStyle$1), style: { width }, children: [grouped && tabs.length > 0 && (jsxRuntime.jsx("div", { className: sx(tabsStyle$8), children: tabs.map(tab => (jsxRuntime.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 && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$
|
|
8124
|
+
return (jsxRuntime.jsxs("div", { ref: dropdownRef, className: cx(sx(containerStyle$4), className), children: [jsxRuntime.jsxs("button", { type: "button", className: cx(sx(triggerStyle$1), disabled ? sx(disabledStyle) : '', isOpen ? sx(openStyle$2) : ''), onClick: () => !disabled && setIsOpen(!isOpen), children: [jsxRuntime.jsx("span", { className: cx(sx(triggerTextStyle), selectedValues.length === 0 ? sx(placeholderStyle) : ''), children: getDisplayText() }), jsxRuntime.jsx("span", { className: sx(chevronStyle$3), children: jsxRuntime.jsx(ChevronIcon$1, {}) })] }), isOpen && (jsxRuntime.jsxs("div", { className: sx(dropdownStyle$1), style: { width }, children: [grouped && tabs.length > 0 && (jsxRuntime.jsx("div", { className: sx(tabsStyle$8), children: tabs.map(tab => (jsxRuntime.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 && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$c), children: [jsxRuntime.jsx("button", { type: "button", className: sx(actionBtnStyle), onClick: handleSelectAll, children: "Select All" }), jsxRuntime.jsx("button", { type: "button", className: sx(actionBtnStyle), onClick: handleClear, children: "Clear" })] })), jsxRuntime.jsx("div", { className: sx(optionsStyle), children: currentOptions.map(option => (jsxRuntime.jsxs("div", { className: cx(sx(optionStyle), selectedValues.includes(option.value) ? sx(selectedStyle$3) : ''), onClick: () => handleSelect(option.value), children: [multiselect && (jsxRuntime.jsx("span", { className: sx(checkboxStyle$1), children: selectedValues.includes(option.value) && jsxRuntime.jsx(CheckIcon, {}) })), jsxRuntime.jsx("span", { className: sx(optionLabelStyle), children: option.label })] }, option.value))) }), multiselect && (jsxRuntime.jsx("div", { className: sx(footerStyle$d), children: jsxRuntime.jsx("button", { type: "button", className: sx(applyBtnStyle), onClick: () => setIsOpen(false), children: "Apply" }) }))] }))] }));
|
|
8125
8125
|
};
|
|
8126
8126
|
SelectFilter.displayName = 'SelectFilter';
|
|
8127
8127
|
|
|
@@ -8623,7 +8623,7 @@ const toggleRowStyle = {
|
|
|
8623
8623
|
'& [data-team-picker-only]': { opacity: 0 },
|
|
8624
8624
|
'&:hover [data-team-picker-only], &:focus-within [data-team-picker-only]': { opacity: 1 },
|
|
8625
8625
|
};
|
|
8626
|
-
const nameStyle$
|
|
8626
|
+
const nameStyle$6 = {
|
|
8627
8627
|
label: 'TeamPicker-nameStyle',
|
|
8628
8628
|
flex: 1,
|
|
8629
8629
|
// `&&`: see rootStyle — the name is a span, which host heading rules target.
|
|
@@ -8664,7 +8664,7 @@ const TeamPicker = ({ groups, groupOrder, activeGroup, onGroupChange, mode = 'si
|
|
|
8664
8664
|
const row = (team) => {
|
|
8665
8665
|
const chosen = selected.includes(team.code);
|
|
8666
8666
|
if (!multiple) {
|
|
8667
|
-
return (jsxRuntime.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: [jsxRuntime.jsx(SportCodeBadge, { code: team.code }), jsxRuntime.jsx("span", { className: sx(nameStyle$
|
|
8667
|
+
return (jsxRuntime.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: [jsxRuntime.jsx(SportCodeBadge, { code: team.code }), jsxRuntime.jsx("span", { className: sx(nameStyle$6), children: team.name })] }, team.code));
|
|
8668
8668
|
}
|
|
8669
8669
|
return (jsxRuntime.jsxs("div", { className: sx(toggleRowStyle),
|
|
8670
8670
|
// A click anywhere on the row toggles the team, except on the checkbox
|
|
@@ -8674,7 +8674,7 @@ const TeamPicker = ({ groups, groupOrder, activeGroup, onGroupChange, mode = 'si
|
|
|
8674
8674
|
if (event.target.closest('input, label'))
|
|
8675
8675
|
return;
|
|
8676
8676
|
onToggle?.(team.code);
|
|
8677
|
-
}, "data-testid": "team-picker-option", children: [jsxRuntime.jsx(Checkbox, { size: "sm", checked: chosen, onChange: () => onToggle?.(team.code), "aria-label": `${team.name} (${team.code})` }), jsxRuntime.jsx(SportCodeBadge, { code: team.code }), " ", jsxRuntime.jsx("span", { className: sx(nameStyle$
|
|
8677
|
+
}, "data-testid": "team-picker-option", children: [jsxRuntime.jsx(Checkbox, { size: "sm", checked: chosen, onChange: () => onToggle?.(team.code), "aria-label": `${team.name} (${team.code})` }), jsxRuntime.jsx(SportCodeBadge, { code: team.code }), " ", jsxRuntime.jsx("span", { className: sx(nameStyle$6), children: team.name }), onOnly && (jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", "data-team-picker-only": "", onClick: (event) => {
|
|
8678
8678
|
event.stopPropagation();
|
|
8679
8679
|
onOnly(team.code);
|
|
8680
8680
|
}, children: "Only" }))] }, team.code));
|
|
@@ -8730,7 +8730,7 @@ const identityStyle$1 = {
|
|
|
8730
8730
|
gap: 12,
|
|
8731
8731
|
},
|
|
8732
8732
|
};
|
|
8733
|
-
const codeStyle$
|
|
8733
|
+
const codeStyle$4 = {
|
|
8734
8734
|
label: 'TeamCalendarHeader-codeStyle',
|
|
8735
8735
|
background: '#fff',
|
|
8736
8736
|
borderRadius: 12,
|
|
@@ -8741,7 +8741,7 @@ const codeStyle$3 = {
|
|
|
8741
8741
|
fontWeight: 400,
|
|
8742
8742
|
},
|
|
8743
8743
|
};
|
|
8744
|
-
const nameStyle$
|
|
8744
|
+
const nameStyle$5 = {
|
|
8745
8745
|
label: 'TeamCalendarHeader-nameStyle',
|
|
8746
8746
|
color: 'var(--color-slate, #5c5c5c)',
|
|
8747
8747
|
fontSize: 20,
|
|
@@ -8767,7 +8767,7 @@ const contentStyle$8 = {
|
|
|
8767
8767
|
* It sticks to the top of its column so the team stays identifiable while the
|
|
8768
8768
|
* schedule scrolls.
|
|
8769
8769
|
*/
|
|
8770
|
-
const TeamCalendarHeader = ({ teamCode, teamFullName, children, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$G), className), children: [jsxRuntime.jsx("div", { className: sx(rowStyle$7), children: jsxRuntime.jsxs("div", { className: sx(identityStyle$1), children: [jsxRuntime.jsx("div", { className: sx(codeStyle$
|
|
8770
|
+
const TeamCalendarHeader = ({ teamCode, teamFullName, children, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$G), className), children: [jsxRuntime.jsx("div", { className: sx(rowStyle$7), children: jsxRuntime.jsxs("div", { className: sx(identityStyle$1), children: [jsxRuntime.jsx("div", { className: sx(codeStyle$4), children: teamCode }), teamFullName && jsxRuntime.jsx("span", { className: sx(nameStyle$5), children: teamFullName })] }) }), jsxRuntime.jsx("div", { className: sx(contentStyle$8), children: children })] }));
|
|
8771
8771
|
TeamCalendarHeader.displayName = 'TeamCalendarHeader';
|
|
8772
8772
|
|
|
8773
8773
|
/**
|
|
@@ -8837,7 +8837,7 @@ const pretitleStyle = {
|
|
|
8837
8837
|
fontSize: 20,
|
|
8838
8838
|
lineHeight: '32px',
|
|
8839
8839
|
};
|
|
8840
|
-
const titleStyle$
|
|
8840
|
+
const titleStyle$B = {
|
|
8841
8841
|
label: 'TeamHeader-titleStyle',
|
|
8842
8842
|
margin: 0,
|
|
8843
8843
|
overflowWrap: 'anywhere',
|
|
@@ -8850,7 +8850,7 @@ const titleStyle$A = {
|
|
|
8850
8850
|
lineHeight: '52px',
|
|
8851
8851
|
},
|
|
8852
8852
|
};
|
|
8853
|
-
const actionsStyle$
|
|
8853
|
+
const actionsStyle$b = {
|
|
8854
8854
|
label: 'TeamHeader-actionsStyle',
|
|
8855
8855
|
display: 'flex',
|
|
8856
8856
|
alignItems: 'center',
|
|
@@ -8875,7 +8875,7 @@ const TeamHeader = ({ title: suppliedTitle, teamCode, teamName, pretitle = 'Team
|
|
|
8875
8875
|
window.location.href = backHref;
|
|
8876
8876
|
}
|
|
8877
8877
|
};
|
|
8878
|
-
return (jsxRuntime.jsxs("div", { className: headerClasses, "data-test": "team-header", children: [jsxRuntime.jsxs("div", { className: sx(leftStyle$1), children: [(backHref || onBack) && (jsxRuntime.jsx("button", { type: "button", className: sx(backButtonStyle), onClick: handleBack, "aria-label": "Go back", "data-test": "team-header-back", children: jsxRuntime.jsx(BackIcon, {}) })), jsxRuntime.jsxs("div", { className: sx(titlesStyle), children: [pretitle && jsxRuntime.jsx("span", { className: sx(pretitleStyle), children: pretitle }), jsxRuntime.jsxs("h1", { className: sx(titleStyle$
|
|
8878
|
+
return (jsxRuntime.jsxs("div", { className: headerClasses, "data-test": "team-header", children: [jsxRuntime.jsxs("div", { className: sx(leftStyle$1), children: [(backHref || onBack) && (jsxRuntime.jsx("button", { type: "button", className: sx(backButtonStyle), onClick: handleBack, "aria-label": "Go back", "data-test": "team-header-back", children: jsxRuntime.jsx(BackIcon, {}) })), jsxRuntime.jsxs("div", { className: sx(titlesStyle), children: [pretitle && jsxRuntime.jsx("span", { className: sx(pretitleStyle), children: pretitle }), jsxRuntime.jsxs("h1", { className: sx(titleStyle$B), children: [title, "\u00A0"] })] })] }), actions && (jsxRuntime.jsx("div", { className: sx(actionsStyle$b), children: actions }))] }));
|
|
8879
8879
|
};
|
|
8880
8880
|
const DEFAULT_TABS$1 = [
|
|
8881
8881
|
{ id: 'profile', label: 'Profile' },
|
|
@@ -9228,7 +9228,7 @@ const legErrorStyle = {
|
|
|
9228
9228
|
color: 'var(--color-error)',
|
|
9229
9229
|
fontSize: 'var(--fs-sm)',
|
|
9230
9230
|
};
|
|
9231
|
-
const actionsStyle$
|
|
9231
|
+
const actionsStyle$a = {
|
|
9232
9232
|
label: 'AcmiQuoteCalculator-actionsStyle',
|
|
9233
9233
|
display: 'flex',
|
|
9234
9234
|
flexWrap: 'wrap',
|
|
@@ -9469,7 +9469,7 @@ const AcmiQuoteCalculator = ({ carrierOptions = ACMI_CARRIER_OPTIONS, aircraftOp
|
|
|
9469
9469
|
return (jsxRuntime.jsxs("div", { className: cx(sx(calculatorStyle$1), className), "data-test": "acmi-quote-calculator", children: [showErrors && errorList.length > 0 && (jsxRuntime.jsx(Alert, { variant: "error", title: "Fix these before calculating", children: jsxRuntime.jsx("ul", { className: sx(errorSummaryStyle$1), "data-test": "acmi-error-summary", children: errorList.map(([field, message]) => (jsxRuntime.jsx("li", { children: message }, field))) }) })), calculationError && (jsxRuntime.jsx(Alert, { variant: "error", title: "Quote could not be calculated", children: jsxRuntime.jsx("p", { className: sx(alertMessageStyle), "data-test": "acmi-calculation-error", children: calculationError }) })), jsxRuntime.jsxs("div", { className: sx(columnsStyle), children: [jsxRuntime.jsxs("section", { className: sx(panelStyle$6), "aria-label": "Quote configuration", children: [jsxRuntime.jsx("h3", { className: sx(panelTitleStyle), children: "Quote Configuration" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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 && (jsxRuntime.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" }))] }), jsxRuntime.jsxs("section", { className: sx(panelStyle$6), "aria-label": "Flight itinerary", children: [jsxRuntime.jsx("h3", { className: sx(panelTitleStyle), children: "Flight Itinerary" }), jsxRuntime.jsx(Alert, { variant: "primary", children: positioningMode === 'automatic' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["Enter ", jsxRuntime.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."] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["Enter ", jsxRuntime.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 && (jsxRuntime.jsx("p", { className: sx(legErrorStyle), role: "alert", "data-test": "acmi-legs-error", children: errors.legs })), jsxRuntime.jsx("ol", { className: sx(legsStyle$3), children: inputs.legs.map((leg, index) => (jsxRuntime.jsxs("li", { className: cx(sx(legStyle$2), positioningMode === 'automatic' && sx(automaticLegStyle)), "data-test": "acmi-leg", children: [jsxRuntime.jsxs("span", { className: sx(legIndexStyle$1), children: ["Leg ", index + 1] }), positioningMode === 'explicit' && (jsxRuntime.jsx(Select, { id: `${leg.id}-type`, size: "sm", label: "Leg type", options: [
|
|
9470
9470
|
{ value: 'live', label: 'Live' },
|
|
9471
9471
|
{ value: 'ferry', label: 'Ferry' },
|
|
9472
|
-
], value: leg.type ?? 'live', onChange: (event) => updateLeg(leg.id, { type: event.target.value }), "data-test": "acmi-leg-type" })), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) })] }, leg.id))) }), jsxRuntime.jsxs("div", { className: sx(actionsStyle$
|
|
9472
|
+
], value: leg.type ?? 'live', onChange: (event) => updateLeg(leg.id, { type: event.target.value }), "data-test": "acmi-leg-type" })), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) })] }, leg.id))) }), jsxRuntime.jsxs("div", { className: sx(actionsStyle$a), children: [jsxRuntime.jsx(Button, { variant: "outline", size: "sm", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 16 }), onClick: addLeg, "data-test": "acmi-add-leg", children: "Add Flight Leg" }), jsxRuntime.jsx(Button, { size: "sm", loading: calculating, onClick: calculate, "data-test": "acmi-calculate", children: calculating ? 'Calculating' : 'Calculate Quote' }), result && onSubmitForApproval && (jsxRuntime.jsx(Button, { variant: "secondary", size: "sm", onClick: () => onSubmitForApproval(inputs), "data-test": "acmi-submit-approval", children: "Use This Total" }))] })] })] }), result && (jsxRuntime.jsxs("section", { className: sx(resultsStyle), "aria-label": "Quote summary", "data-test": "acmi-results", children: [jsxRuntime.jsx("h3", { className: sx(panelTitleStyle), children: "Quote Summary" }), jsxRuntime.jsxs("dl", { className: sx(resultGridStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Operating Subtotal" }), jsxRuntime.jsx("dd", { children: currency.format(result.operatingSubtotal) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Markup Applied" }), jsxRuntime.jsx("dd", { children: currency.format(result.markupAmount) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Insurance (Flat Fee)" }), jsxRuntime.jsx("dd", { children: currency.format(result.insuranceAmount) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Pre-Tax Total" }), jsxRuntime.jsx("dd", { children: currency.format(result.preTaxTotal) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Federal Excise Tax" }), jsxRuntime.jsx("dd", { children: currency.format(result.fet) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Segment Fees" }), jsxRuntime.jsx("dd", { children: currency.format(result.segmentFees) })] })] }), jsxRuntime.jsxs("p", { className: sx(finalPriceStyle), "data-test": "acmi-final-price", children: [jsxRuntime.jsx("span", { children: "Total Quoted Price" }), jsxRuntime.jsx("strong", { children: currency.format(result.finalPrice) })] }), result.pricingDetails && (jsxRuntime.jsxs("dl", { className: sx(contractFactsStyle), "data-test": "acmi-pricing-details", children: [jsxRuntime.jsxs("div", { "data-test": "acmi-ferry-floor", children: [jsxRuntime.jsx("dt", { children: "Ferry block time" }), jsxRuntime.jsxs("dd", { children: [result.pricingDetails.ferryBlockHours.toFixed(2), " h", result.pricingDetails.ferryMinimumHours
|
|
9473
9473
|
? ` · ${result.pricingDetails.ferryMinimumHours.toFixed(2)} h minimum per estimated SkyWest ferry leg`
|
|
9474
9474
|
: ''] })] }), jsxRuntime.jsxs("div", { "data-test": "acmi-fuel-buffer", children: [jsxRuntime.jsx("dt", { children: "Fuel buffer" }), jsxRuntime.jsxs("dd", { children: [(result.pricingDetails.fuelBufferPercent * 100).toFixed(0), "% \u00B7 ", currency.format(result.pricingDetails.fuelBufferAmount)] })] }), jsxRuntime.jsxs("div", { "data-test": "acmi-screening", children: [jsxRuntime.jsx("dt", { children: "Security screening" }), jsxRuntime.jsx("dd", { children: currency.format(result.pricingDetails.screeningAmount) })] })] })), result.legs && result.legs.length > 0 && (jsxRuntime.jsxs("div", { className: sx(pricedLegsStyle), "data-test": "acmi-priced-legs", children: [jsxRuntime.jsx("h4", { children: "Backend-priced itinerary" }), jsxRuntime.jsxs("div", { className: sx(pricedLegHeaderStyle), "aria-hidden": "true", children: [jsxRuntime.jsx("span", { children: "Leg" }), jsxRuntime.jsx("span", { children: "Type" }), jsxRuntime.jsx("span", { children: "Block" }), jsxRuntime.jsx("span", { children: "Total" })] }), result.legs.map((leg) => (jsxRuntime.jsxs("div", { className: sx(pricedLegStyle), "data-test": "acmi-priced-leg", children: [jsxRuntime.jsxs("span", { children: [leg.origin, " \u2192 ", leg.destination] }), jsxRuntime.jsx("span", { "data-test": "acmi-priced-leg-type", children: leg.type === 'ferry' ? 'Ferry' : 'Live' }), jsxRuntime.jsxs("span", { "data-test": "acmi-priced-leg-block", children: [leg.blockHours.toFixed(2), " h"] }), jsxRuntime.jsx("span", { children: currency.format(leg.total) })] }, leg.id)))] }))] }))] }));
|
|
9475
9475
|
};
|
|
@@ -9482,7 +9482,7 @@ const wrapperStyle$2 = {
|
|
|
9482
9482
|
gap: 'var(--space-3)',
|
|
9483
9483
|
fontFamily: 'var(--font-family-base)',
|
|
9484
9484
|
};
|
|
9485
|
-
const toolbarStyle$
|
|
9485
|
+
const toolbarStyle$4 = {
|
|
9486
9486
|
label: 'AgentGroupTravelRequestsTable-toolbarStyle',
|
|
9487
9487
|
display: 'flex',
|
|
9488
9488
|
flexWrap: 'wrap',
|
|
@@ -9871,7 +9871,7 @@ const AgentGroupTravelRequestsTable = ({ requests, sports = [], views = [], toda
|
|
|
9871
9871
|
setDateEdits((current) => ({ ...current, [id]: { ...current[id], submittedDate: value } }));
|
|
9872
9872
|
onSubmittedDateChange?.(id, value);
|
|
9873
9873
|
};
|
|
9874
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(wrapperStyle$2), className), "data-test": "agent-gtr-table", children: [jsxRuntime.jsxs("div", { className: sx(toolbarStyle$
|
|
9874
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(wrapperStyle$2), className), "data-test": "agent-gtr-table", children: [jsxRuntime.jsxs("div", { className: sx(toolbarStyle$4), children: [jsxRuntime.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 ? jsxRuntime.jsx(ChevronUpIcon, { size: 16 }) : jsxRuntime.jsx(ChevronDownIcon$1, { size: 16 }), jsxRuntime.jsx("span", { children: allExpanded ? 'Collapse all PNRs' : 'Expand all PNRs' })] }), jsxRuntime.jsxs("div", { className: sx(filtersStyle$5), children: [jsxRuntime.jsxs("label", { className: sx(filterFieldStyle$1), children: [jsxRuntime.jsx("span", { children: "Filter by sport" }), jsxRuntime.jsxs("select", { value: sportFilter, onChange: (event) => setSportFilter(event.target.value), "data-test": "agent-gtr-sport-filter", children: [jsxRuntime.jsx("option", { value: "", children: "All Sports" }), sports.map((sport) => (jsxRuntime.jsx("option", { value: sport.code, children: sport.label }, sport.code)))] })] }), views.length > 0 && (jsxRuntime.jsxs("label", { className: sx(filterFieldStyle$1), children: [jsxRuntime.jsx("span", { children: "Filter by view" }), jsxRuntime.jsxs("select", { value: viewFilter, onChange: (event) => setViewFilter(event.target.value), "data-test": "agent-gtr-view-filter", children: [jsxRuntime.jsx("option", { value: "", children: "All Accounts" }), views.map((view) => (jsxRuntime.jsx("option", { value: view.id, children: view.label }, view.id)))] })] }))] })] }), jsxRuntime.jsx("div", { className: sx(tableScrollStyle$2), children: jsxRuntime.jsxs("table", { className: sx(tableStyle$b), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { className: sx(colExpandStyle), children: jsxRuntime.jsx("span", { className: "sr-only", children: "Expand" }) }), jsxRuntime.jsx("th", { children: "Source" }), jsxRuntime.jsx("th", { children: "Master Trip" }), jsxRuntime.jsx("th", { children: "ID" }), jsxRuntime.jsx("th", { children: "Start Date" }), jsxRuntime.jsx("th", { children: "Name" }), jsxRuntime.jsx("th", { children: "Sport" }), jsxRuntime.jsxs("th", { children: [jsxRuntime.jsx(PlaneIcon$3, { size: 16 }), jsxRuntime.jsx("span", { className: "sr-only", children: "Carrier" })] }), jsxRuntime.jsx("th", { children: "Routing" }), jsxRuntime.jsx("th", { children: "Submitted" }), jsxRuntime.jsx("th", { children: "Type" }), jsxRuntime.jsx("th", { children: "Quote Sent" }), jsxRuntime.jsx("th", { children: "Confirmation" }), jsxRuntime.jsx("th", { children: "Deposit" }), jsxRuntime.jsx("th", { children: "Utilization" }), jsxRuntime.jsx("th", { children: "Names" }), jsxRuntime.jsx("th", { children: "Ticketing" }), jsxRuntime.jsx("th", { children: "PNR" }), jsxRuntime.jsx("th", { className: sx(colDeleteStyle), children: jsxRuntime.jsx("span", { className: "sr-only", children: "Delete" }) })] }) }), jsxRuntime.jsxs("tbody", { children: [!groups.length && (jsxRuntime.jsx("tr", { children: jsxRuntime.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) => (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("tr", { className: sx(accountRowStyle), children: jsxRuntime.jsx("td", { colSpan: COLUMN_COUNT, children: group.accountName }) }), group.items.map((request) => {
|
|
9875
9875
|
const isMulti = request.pnrs.length > 1;
|
|
9876
9876
|
const isExpanded = expandedIds.has(request.id);
|
|
9877
9877
|
const startSoon = daysUntil(request.startDate, today) < 8;
|
|
@@ -10167,7 +10167,7 @@ const Table = ({ columns, data, rowKey = 'id', bordered = false, striped = false
|
|
|
10167
10167
|
* A bordered card: a header band with the title and Version control, then the
|
|
10168
10168
|
* invoice table with its total row and legend.
|
|
10169
10169
|
*/
|
|
10170
|
-
const cardStyle$
|
|
10170
|
+
const cardStyle$g = {
|
|
10171
10171
|
label: 'AirInvoiceCard-cardStyle',
|
|
10172
10172
|
overflow: 'hidden',
|
|
10173
10173
|
backgroundColor: 'var(--bg-surface, #fff)',
|
|
@@ -10193,7 +10193,7 @@ const headerStyle$D = {
|
|
|
10193
10193
|
padding: '12px 24px',
|
|
10194
10194
|
borderBottom: '1px solid var(--border-color-dark, #d5d5d5)',
|
|
10195
10195
|
};
|
|
10196
|
-
const titleStyle$
|
|
10196
|
+
const titleStyle$A = {
|
|
10197
10197
|
label: 'AirInvoiceCard-titleStyle',
|
|
10198
10198
|
margin: 0,
|
|
10199
10199
|
color: 'var(--fg-3, #6b7785)',
|
|
@@ -10350,7 +10350,7 @@ const AirInvoiceCard = ({ title, lines, paymentStatus, total, versions = [], sel
|
|
|
10350
10350
|
const legend = (jsxRuntime.jsxs("span", { className: sx(legendStyle$1), "data-test": "air-invoice-legend", children: [jsxRuntime.jsx("span", { className: sx(knownTravelerStyle), children: jsxRuntime.jsx(CheckIcon$2, { size: 16 }) }), "= Known Traveler Number Loaded"] }));
|
|
10351
10351
|
const hasHeader = Boolean(title || versionControlShown(versions));
|
|
10352
10352
|
const versionControl = versionControlShown(versions) && (jsxRuntime.jsx(Dropdown, { label: "Version", alignment: "right", trigger: ({ isOpen, toggle }) => (jsxRuntime.jsxs("button", { type: "button", className: sx(versionButtonStyle), onClick: toggle, "aria-expanded": isOpen, "aria-haspopup": "menu", "data-test": "air-invoice-version", children: [jsxRuntime.jsx(LayersIcon, {}), "Version", jsxRuntime.jsx("span", { className: sx(versionCountStyle), children: versions.length }), jsxRuntime.jsx(ChevronDownIcon$1, { size: 16 })] })), children: versions.map((version) => (jsxRuntime.jsx(Dropdown.Item, { icon: version.id === selectedVersionId ? jsxRuntime.jsx(CheckIcon$2, { size: 14 }) : undefined, onClick: () => onVersionChange?.(version.id), children: version.label }, version.id))) }));
|
|
10353
|
-
return (jsxRuntime.jsxs("section", { className: cx(sx(cardStyle$
|
|
10353
|
+
return (jsxRuntime.jsxs("section", { className: cx(sx(cardStyle$g), className), "aria-label": "Air invoice", "data-test": "air-invoice-card", children: [hasHeader && (jsxRuntime.jsxs("div", { className: sx(headerStyle$D), children: [title && jsxRuntime.jsx("h2", { className: sx(titleStyle$A), children: title }), jsxRuntime.jsx("div", { className: sx(headerEndStyle), children: versionControl })] })), jsxRuntime.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 && (jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("td", { colSpan: 6, children: jsxRuntime.jsxs("span", { className: sx(totalCellStyle$1), children: ["Total", showLegend && legend] }) }), jsxRuntime.jsx("td", { className: sx(upperStyle), children: paymentStatus }), jsxRuntime.jsx("td", { "data-test": "air-invoice-total", children: total })] })) }), showLegend && !total && (jsxRuntime.jsx("p", { className: sx(legendBlockStyle), children: legend }))] }));
|
|
10354
10354
|
};
|
|
10355
10355
|
AirInvoiceCard.displayName = 'AirInvoiceCard';
|
|
10356
10356
|
|
|
@@ -10803,7 +10803,7 @@ const noResultsStyle = {
|
|
|
10803
10803
|
fontSize: 14,
|
|
10804
10804
|
};
|
|
10805
10805
|
/* Actions */
|
|
10806
|
-
const actionsStyle$
|
|
10806
|
+
const actionsStyle$9 = {
|
|
10807
10807
|
label: 'Topbar-actionsStyle',
|
|
10808
10808
|
display: 'flex',
|
|
10809
10809
|
gap: 'var(--space-2, 8px)',
|
|
@@ -10868,7 +10868,7 @@ const Topbar = ({ account, accounts, onAccountSelect, onAccountClick, actions, l
|
|
|
10868
10868
|
const filteredAccounts = accounts?.filter(acc => acc.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
10869
10869
|
acc.code.toLowerCase().includes(searchQuery.toLowerCase())) || [];
|
|
10870
10870
|
const hasDropdown = accounts && accounts.length > 0;
|
|
10871
|
-
return (jsxRuntime.jsxs("header", { className: classNames, ...props, children: [jsxRuntime.jsxs("div", { className: sx(leftStyle), children: [leftContent, account && (jsxRuntime.jsxs("div", { className: sx(accountWrapperStyle), ref: dropdownRef, children: [jsxRuntime.jsxs("button", { className: cx(sx(accountSelectorStyle), isOpen && sx(openStyle$1)), onClick: handleToggle, "aria-expanded": isOpen, "aria-haspopup": hasDropdown ? 'listbox' : undefined, children: [jsxRuntime.jsx("span", { className: sx(accountCodeStyle), children: account.code }), jsxRuntime.jsx("span", { className: sx(accountNameStyle), children: account.name }), hasDropdown && (jsxRuntime.jsx(ChevronDownIcon$1, { size: 16, className: cx(sx(chevronStyle$2), isOpen && sx(chevronOpenStyle)) }))] }), isOpen && hasDropdown && (jsxRuntime.jsxs("div", { className: sx(dropdownStyle), role: "listbox", children: [jsxRuntime.jsxs("div", { className: sx(dropdownSearchStyle), children: [jsxRuntime.jsxs("svg", { className: sx(searchIconStyle$1), width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsxRuntime.jsx("circle", { cx: "11", cy: "11", r: "8" }), jsxRuntime.jsx("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })] }), jsxRuntime.jsx("input", { ref: searchInputRef, type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), placeholder: "Search accounts...", className: sx(searchInputStyle$1) })] }), jsxRuntime.jsx("div", { className: sx(dropdownListStyle), children: filteredAccounts.length > 0 ? (filteredAccounts.map((acc) => (jsxRuntime.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: [jsxRuntime.jsx("span", { className: sx(dropdownItemCodeStyle), children: acc.code }), jsxRuntime.jsx("span", { className: sx(dropdownItemNameStyle), children: acc.name })] }, acc.code)))) : (jsxRuntime.jsx("div", { className: sx(noResultsStyle), children: "No accounts found" })) })] }))] }))] }), actions && jsxRuntime.jsx("div", { className: sx(actionsStyle$
|
|
10871
|
+
return (jsxRuntime.jsxs("header", { className: classNames, ...props, children: [jsxRuntime.jsxs("div", { className: sx(leftStyle), children: [leftContent, account && (jsxRuntime.jsxs("div", { className: sx(accountWrapperStyle), ref: dropdownRef, children: [jsxRuntime.jsxs("button", { className: cx(sx(accountSelectorStyle), isOpen && sx(openStyle$1)), onClick: handleToggle, "aria-expanded": isOpen, "aria-haspopup": hasDropdown ? 'listbox' : undefined, children: [jsxRuntime.jsx("span", { className: sx(accountCodeStyle), children: account.code }), jsxRuntime.jsx("span", { className: sx(accountNameStyle), children: account.name }), hasDropdown && (jsxRuntime.jsx(ChevronDownIcon$1, { size: 16, className: cx(sx(chevronStyle$2), isOpen && sx(chevronOpenStyle)) }))] }), isOpen && hasDropdown && (jsxRuntime.jsxs("div", { className: sx(dropdownStyle), role: "listbox", children: [jsxRuntime.jsxs("div", { className: sx(dropdownSearchStyle), children: [jsxRuntime.jsxs("svg", { className: sx(searchIconStyle$1), width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsxRuntime.jsx("circle", { cx: "11", cy: "11", r: "8" }), jsxRuntime.jsx("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })] }), jsxRuntime.jsx("input", { ref: searchInputRef, type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), placeholder: "Search accounts...", className: sx(searchInputStyle$1) })] }), jsxRuntime.jsx("div", { className: sx(dropdownListStyle), children: filteredAccounts.length > 0 ? (filteredAccounts.map((acc) => (jsxRuntime.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: [jsxRuntime.jsx("span", { className: sx(dropdownItemCodeStyle), children: acc.code }), jsxRuntime.jsx("span", { className: sx(dropdownItemNameStyle), children: acc.name })] }, acc.code)))) : (jsxRuntime.jsx("div", { className: sx(noResultsStyle), children: "No accounts found" })) })] }))] }))] }), actions && jsxRuntime.jsx("div", { className: sx(actionsStyle$9), children: actions })] }));
|
|
10872
10872
|
};
|
|
10873
10873
|
Topbar.displayName = 'Topbar';
|
|
10874
10874
|
|
|
@@ -10921,7 +10921,7 @@ const AppLayout = ({ navItems = [], activeNavKey, logo, collapsedLogo, account,
|
|
|
10921
10921
|
* Shares the AirInvoiceCard's shell — bordered card, header band with a small
|
|
10922
10922
|
* uppercase title — so the two read as a set when stacked on a page.
|
|
10923
10923
|
*/
|
|
10924
|
-
const cardStyle$
|
|
10924
|
+
const cardStyle$f = {
|
|
10925
10925
|
label: 'BookingDetailsCard-cardStyle',
|
|
10926
10926
|
overflow: 'hidden',
|
|
10927
10927
|
backgroundColor: 'var(--bg-surface, #fff)',
|
|
@@ -10946,7 +10946,7 @@ const headerStyle$C = {
|
|
|
10946
10946
|
padding: '12px 24px',
|
|
10947
10947
|
borderBottom: '1px solid var(--border-color-dark, #d5d5d5)',
|
|
10948
10948
|
};
|
|
10949
|
-
const titleStyle$
|
|
10949
|
+
const titleStyle$z = {
|
|
10950
10950
|
label: 'BookingDetailsCard-titleStyle',
|
|
10951
10951
|
margin: 0,
|
|
10952
10952
|
color: 'var(--fg-3, #6b7785)',
|
|
@@ -11022,12 +11022,12 @@ const BookingDetailsCard = ({ details, title = 'Booking Details', refId, childre
|
|
|
11022
11022
|
if (details.length === 0 && !children)
|
|
11023
11023
|
return null;
|
|
11024
11024
|
const rows = Math.ceil(details.length / 2);
|
|
11025
|
-
return (jsxRuntime.jsxs("section", { className: cx(sx(cardStyle$
|
|
11025
|
+
return (jsxRuntime.jsxs("section", { className: cx(sx(cardStyle$f), className), "aria-label": "Booking details", "data-test": "booking-details-card", children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$C), children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$z), children: title }), refId && (jsxRuntime.jsxs("p", { className: sx(refStyle), "data-test": "booking-details-ref", children: ["Short\u2019s ID: ", jsxRuntime.jsx("span", { className: sx(refValueStyle), children: refId })] }))] }), details.length > 0 && (jsxRuntime.jsx("dl", { className: sx(detailsStyle$2), style: { gridTemplateRows: `repeat(${rows}, auto)` }, children: details.map((detail) => (jsxRuntime.jsxs("div", { className: sx(detailStyle$2), children: [jsxRuntime.jsx("dt", { className: sx(detailLabelStyle$1), children: detail.label }), jsxRuntime.jsx("dd", { className: sx(detailValueStyle$1), children: detail.value })] }, detail.label))) })), children && jsxRuntime.jsx("div", { className: cx(sx(sectionStyle$8), details.length > 0 && sx(sectionRuleStyle)), "data-test": "booking-details-section", children: children })] }));
|
|
11026
11026
|
};
|
|
11027
11027
|
BookingDetailsCard.displayName = 'BookingDetailsCard';
|
|
11028
11028
|
|
|
11029
11029
|
/* Card Component Styles */
|
|
11030
|
-
const cardStyle$
|
|
11030
|
+
const cardStyle$e = {
|
|
11031
11031
|
label: 'Card-cardStyle',
|
|
11032
11032
|
background: 'var(--bg-surface)',
|
|
11033
11033
|
borderRadius: 'var(--radius-2xl)',
|
|
@@ -11089,7 +11089,7 @@ const headerContentStyle$1 = {
|
|
|
11089
11089
|
flex: 1,
|
|
11090
11090
|
minWidth: 0,
|
|
11091
11091
|
};
|
|
11092
|
-
const titleStyle$
|
|
11092
|
+
const titleStyle$y = {
|
|
11093
11093
|
label: 'Card-titleStyle',
|
|
11094
11094
|
margin: 0,
|
|
11095
11095
|
fontSize: 'var(--fs-lg)',
|
|
@@ -11103,7 +11103,7 @@ const subtitleStyle$7 = {
|
|
|
11103
11103
|
fontSize: 'var(--fs-sm)',
|
|
11104
11104
|
color: 'var(--fg-3)',
|
|
11105
11105
|
};
|
|
11106
|
-
const actionsStyle$
|
|
11106
|
+
const actionsStyle$8 = {
|
|
11107
11107
|
label: 'Card-actionsStyle',
|
|
11108
11108
|
display: 'flex',
|
|
11109
11109
|
gap: 'var(--space-2)',
|
|
@@ -11138,7 +11138,7 @@ const footerStyle$b = {
|
|
|
11138
11138
|
* Card component for grouping related content.
|
|
11139
11139
|
*/
|
|
11140
11140
|
const Card = React.forwardRef(({ variant = 'default', padding = 'md', interactive = false, className = '', children, ...props }, ref) => {
|
|
11141
|
-
const classNames = cx(sx(cardStyle$
|
|
11141
|
+
const classNames = cx(sx(cardStyle$e), sx(variantStyles[variant]), sx(paddingStyles[padding]), interactive && sx(interactiveStyle), className);
|
|
11142
11142
|
return (jsxRuntime.jsx("div", { ref: ref, className: classNames, ...props, children: children }));
|
|
11143
11143
|
});
|
|
11144
11144
|
Card.displayName = 'Card';
|
|
@@ -11147,7 +11147,7 @@ Card.displayName = 'Card';
|
|
|
11147
11147
|
*/
|
|
11148
11148
|
const CardHeader = ({ title, subtitle, actions, className = '', children, ...props }) => {
|
|
11149
11149
|
const classNames = cx(sx(headerStyle$B), className);
|
|
11150
|
-
return (jsxRuntime.jsxs("div", { className: classNames, ...props, children: [jsxRuntime.jsxs("div", { className: sx(headerContentStyle$1), children: [title && jsxRuntime.jsx("h3", { className: sx(titleStyle$
|
|
11150
|
+
return (jsxRuntime.jsxs("div", { className: classNames, ...props, children: [jsxRuntime.jsxs("div", { className: sx(headerContentStyle$1), children: [title && jsxRuntime.jsx("h3", { className: sx(titleStyle$y), children: title }), subtitle && jsxRuntime.jsx("p", { className: sx(subtitleStyle$7), children: subtitle }), children] }), actions && jsxRuntime.jsx("div", { className: sx(actionsStyle$8), children: actions })] }));
|
|
11151
11151
|
};
|
|
11152
11152
|
CardHeader.displayName = 'CardHeader';
|
|
11153
11153
|
/**
|
|
@@ -11850,7 +11850,7 @@ const alertStyle$4 = {
|
|
|
11850
11850
|
label: 'ContactList-alertStyle', width: '100%'
|
|
11851
11851
|
};
|
|
11852
11852
|
/* Card */
|
|
11853
|
-
const cardStyle$
|
|
11853
|
+
const cardStyle$d = {
|
|
11854
11854
|
label: 'ContactList-cardStyle',
|
|
11855
11855
|
backgroundColor: 'var(--color-white)',
|
|
11856
11856
|
border: '1px solid var(--color-gray-200)',
|
|
@@ -11869,7 +11869,7 @@ const titleRowStyle$3 = {
|
|
|
11869
11869
|
alignItems: 'center',
|
|
11870
11870
|
gap: 'var(--space-2)',
|
|
11871
11871
|
};
|
|
11872
|
-
const titleStyle$
|
|
11872
|
+
const titleStyle$x = {
|
|
11873
11873
|
label: 'ContactList-titleStyle',
|
|
11874
11874
|
fontSize: 'var(--text-base)',
|
|
11875
11875
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -12055,7 +12055,7 @@ const PlusIcon$1 = () => (jsxRuntime.jsxs("svg", { width: "16", height: "16", vi
|
|
|
12055
12055
|
*/
|
|
12056
12056
|
const ContactList = ({ title = 'Contacts', tooltip, contacts, onEdit, onRemove, onAdd, showAdd = true, addLabel = 'Add Contact', alert, className = '', }) => {
|
|
12057
12057
|
const listClasses = cx(sx(containerStyle$3), className);
|
|
12058
|
-
return (jsxRuntime.jsxs("div", { className: listClasses, children: [alert && (jsxRuntime.jsx("div", { className: sx(alertStyle$4), children: alert })), jsxRuntime.jsxs("div", { className: sx(cardStyle$
|
|
12058
|
+
return (jsxRuntime.jsxs("div", { className: listClasses, children: [alert && (jsxRuntime.jsx("div", { className: sx(alertStyle$4), children: alert })), jsxRuntime.jsxs("div", { className: sx(cardStyle$d), children: [jsxRuntime.jsx("div", { className: sx(headerStyle$A), children: jsxRuntime.jsxs("div", { className: sx(titleRowStyle$3), children: [jsxRuntime.jsx("h3", { className: sx(titleStyle$x), children: title }), tooltip && (jsxRuntime.jsx("span", { className: sx(tooltipStyle), children: jsxRuntime.jsx(InfoIcon, {}) }))] }) }), jsxRuntime.jsxs("div", { className: sx(listStyle$4), children: [contacts.map((contact) => (jsxRuntime.jsxs("div", { className: sx(contactItemStyle), children: [jsxRuntime.jsxs("div", { className: sx(contactInfoStyle), children: [jsxRuntime.jsxs("div", { className: sx(contactNameStyle$1), children: [contact.name, contact.isPrimary && (jsxRuntime.jsx("span", { className: sx(badgeStyle$2), children: "Primary" })), contact.isSecondary && (jsxRuntime.jsx("span", { className: cx(sx(badgeStyle$2), sx(badgeSecondaryStyle)), children: "Secondary" }))] }), contact.role && (jsxRuntime.jsx("div", { className: sx(contactRoleStyle$1), children: contact.role })), jsxRuntime.jsxs("div", { className: sx(contactDetailsStyle$1), children: [contact.email && (jsxRuntime.jsx("a", { href: `mailto:${contact.email}`, className: sx(contactLinkStyle$2), children: contact.email })), contact.phone && (jsxRuntime.jsx("span", { className: sx(contactPhoneStyle), children: contact.phone }))] })] }), jsxRuntime.jsxs("div", { className: sx(contactActionsStyle), children: [onEdit && (jsxRuntime.jsx("button", { type: "button", className: sx(actionButtonStyle$1), onClick: () => onEdit(contact), "aria-label": "Edit contact", children: jsxRuntime.jsx(EditIcon$1, {}) })), onRemove && (jsxRuntime.jsx("button", { type: "button", className: cx(sx(actionButtonStyle$1), sx(actionButtonDangerStyle)), onClick: () => onRemove(contact), "aria-label": "Remove contact", children: jsxRuntime.jsx(TrashIcon$1, {}) }))] })] }, contact.id))), contacts.length === 0 && (jsxRuntime.jsx("div", { className: sx(emptyStyle$f), children: "No contacts added" }))] }), showAdd && onAdd && (jsxRuntime.jsx("div", { className: sx(footerStyle$a), children: jsxRuntime.jsxs("button", { type: "button", className: sx(addButtonStyle$1), onClick: onAdd, children: [jsxRuntime.jsx(PlusIcon$1, {}), addLabel] }) }))] })] }));
|
|
12059
12059
|
};
|
|
12060
12060
|
ContactList.displayName = 'ContactList';
|
|
12061
12061
|
|
|
@@ -12191,7 +12191,7 @@ const headerContentStyle = {
|
|
|
12191
12191
|
label: 'Drawer-headerContentStyle',
|
|
12192
12192
|
flex: 1,
|
|
12193
12193
|
};
|
|
12194
|
-
const titleStyle$
|
|
12194
|
+
const titleStyle$w = {
|
|
12195
12195
|
label: 'Drawer-titleStyle',
|
|
12196
12196
|
margin: 0,
|
|
12197
12197
|
fontSize: 18,
|
|
@@ -12237,7 +12237,7 @@ const footerStyle$9 = {
|
|
|
12237
12237
|
/**
|
|
12238
12238
|
* Top of a Drawer: title and the close affordance.
|
|
12239
12239
|
*/
|
|
12240
|
-
const DrawerHeader = ({ title, children, showClose = true, onClose, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$z), className), children: [jsxRuntime.jsxs("div", { className: sx(headerContentStyle), children: [title && jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
12240
|
+
const DrawerHeader = ({ title, children, showClose = true, onClose, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$z), className), children: [jsxRuntime.jsxs("div", { className: sx(headerContentStyle), children: [title && jsxRuntime.jsx("h2", { className: sx(titleStyle$w), children: title }), children] }), showClose && (jsxRuntime.jsx("button", { type: "button", className: sx(closeButtonStyle$2), onClick: onClose, "aria-label": "Close drawer", children: jsxRuntime.jsx("svg", { width: "20", height: "20", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) }))] }));
|
|
12241
12241
|
/**
|
|
12242
12242
|
* Scrollable content region of a Drawer.
|
|
12243
12243
|
*/
|
|
@@ -12372,7 +12372,7 @@ const bodyStyle$6 = {
|
|
|
12372
12372
|
fontWeight: 500,
|
|
12373
12373
|
},
|
|
12374
12374
|
};
|
|
12375
|
-
const searchStyle$
|
|
12375
|
+
const searchStyle$2 = {
|
|
12376
12376
|
label: 'DueDatesDrawer-searchStyle',
|
|
12377
12377
|
display: 'flex',
|
|
12378
12378
|
width: '100%',
|
|
@@ -12407,7 +12407,7 @@ const emptyStyle$e = {
|
|
|
12407
12407
|
padding: '16px 8px 0',
|
|
12408
12408
|
color: 'var(--color-stone, #787878)',
|
|
12409
12409
|
};
|
|
12410
|
-
const cardStyle$
|
|
12410
|
+
const cardStyle$c = {
|
|
12411
12411
|
label: 'DueDatesDrawer-cardStyle',
|
|
12412
12412
|
display: 'flex',
|
|
12413
12413
|
flexDirection: 'column',
|
|
@@ -12531,7 +12531,7 @@ const DueDateCard$1 = ({ item, onToggle, onTaskClick }) => {
|
|
|
12531
12531
|
const completed = isTravelDueDateCompleted(item);
|
|
12532
12532
|
const dueDate = parseLocalDate$1(item.duedate);
|
|
12533
12533
|
const pastDue = !!dueDate && dueDate < new Date() && !completed;
|
|
12534
|
-
return (jsxRuntime.jsxs("article", { className: sx(cardStyle$
|
|
12534
|
+
return (jsxRuntime.jsxs("article", { className: sx(cardStyle$c), children: [jsxRuntime.jsxs("div", { className: sx(cardTitleStyle$3), children: [onToggle ? (jsxRuntime.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 ? jsxRuntime.jsx(CheckIcon$2, { size: 12 }) : null })) : (jsxRuntime.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 ? jsxRuntime.jsx(CheckIcon$2, { size: 12 }) : null })), jsxRuntime.jsx("h5", { children: item.tasktitle })] }), item.description && jsxRuntime.jsx("p", { children: item.description }), jsxRuntime.jsxs("div", { className: sx(tagsStyle), children: [jsxRuntime.jsx("span", { style: { backgroundColor: sportColor$1(item.sportCode) }, children: item.sportCode }), jsxRuntime.jsx("button", { type: "button", disabled: !item.masterTripGUID || !onTaskClick, onClick: () => item.masterTripGUID && onTaskClick?.(item.masterTripGUID), children: item.tripName })] }), completed && item.completeddatetime && jsxRuntime.jsxs("div", { className: sx(completionStyle), children: [jsxRuntime.jsx(CheckIcon$2, { size: 14 }), jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx("em", { children: "on" }), " ", formatDate$8(item.completeddatetime, { month: 'numeric', day: 'numeric', year: '2-digit' }), " ", jsxRuntime.jsx("em", { children: "by" }), " ", item.completedby] })] })] }));
|
|
12535
12535
|
};
|
|
12536
12536
|
/** Hub's searchable, status-aware due-dates drawer. */
|
|
12537
12537
|
const DueDatesDrawer = ({ isOpen, dueDates, selectedDate, selectedTrip, overdueOnly, onClose, onToggle, onTaskClick, className = '' }) => {
|
|
@@ -12543,7 +12543,7 @@ const DueDatesDrawer = ({ isOpen, dueDates, selectedDate, selectedTrip, overdueO
|
|
|
12543
12543
|
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)));
|
|
12544
12544
|
return matches.length ? [[date, matches]] : [];
|
|
12545
12545
|
})), [dueDates, search, selectedDate, selectedTrip, overdueOnly]);
|
|
12546
|
-
return (jsxRuntime.jsxs("aside", { className: cx(sx(drawerStyle), isOpen && sx(openStyle), className), "aria-hidden": !isOpen, "aria-label": "Due Dates", children: [jsxRuntime.jsxs("header", { children: [jsxRuntime.jsx("h3", { children: "Due Dates" }), jsxRuntime.jsx("button", { type: "button", "aria-label": "Close due dates", onClick: onClose, children: jsxRuntime.jsx(CloseIcon, { size: 24 }) })] }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$6), children: [jsxRuntime.jsxs("label", { className: sx(searchStyle$
|
|
12546
|
+
return (jsxRuntime.jsxs("aside", { className: cx(sx(drawerStyle), isOpen && sx(openStyle), className), "aria-hidden": !isOpen, "aria-label": "Due Dates", children: [jsxRuntime.jsxs("header", { children: [jsxRuntime.jsx("h3", { children: "Due Dates" }), jsxRuntime.jsx("button", { type: "button", "aria-label": "Close due dates", onClick: onClose, children: jsxRuntime.jsx(CloseIcon, { size: 24 }) })] }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$6), children: [jsxRuntime.jsxs("label", { className: sx(searchStyle$2), children: [jsxRuntime.jsx(SearchIcon$1, { size: 16 }), jsxRuntime.jsx("input", { type: "search", placeholder: "Search", value: search, onChange: (event) => setSearch(event.target.value) })] }), !Object.keys(filtered).length ? jsxRuntime.jsx("div", { className: sx(emptyStyle$e), children: "No due dates found." }) : Object.entries(filtered).map(([date, items]) => (jsxRuntime.jsxs("section", { children: [jsxRuntime.jsx("h4", { children: formatDate$8(date, { month: 'long', day: 'numeric', year: 'numeric' }) }), jsxRuntime.jsx("div", { className: sx(cardsStyle$2), children: items.map((item) => jsxRuntime.jsx(DueDateCard$1, { item: item, onToggle: onToggle, onTaskClick: onTaskClick }, `${date}-${item.taskid}`)) })] }, date)))] })] }));
|
|
12547
12547
|
};
|
|
12548
12548
|
|
|
12549
12549
|
/**
|
|
@@ -13831,7 +13831,7 @@ const HubAppShell = ({ children, navItems, individualTravelItem, agentsItem, sou
|
|
|
13831
13831
|
* Explicit specificity keeps service and cancellation border colors stable
|
|
13832
13832
|
* regardless of style injection order: base < type (`&&`) < cancelled (`&&&`).
|
|
13833
13833
|
*/
|
|
13834
|
-
const cardStyle$
|
|
13834
|
+
const cardStyle$b = {
|
|
13835
13835
|
label: 'ItinerarySegmentCard-cardStyle',
|
|
13836
13836
|
display: 'flex',
|
|
13837
13837
|
flexDirection: 'column',
|
|
@@ -13909,7 +13909,7 @@ const confirmationHeaderStyle = {
|
|
|
13909
13909
|
},
|
|
13910
13910
|
},
|
|
13911
13911
|
};
|
|
13912
|
-
const eyebrowStyle$
|
|
13912
|
+
const eyebrowStyle$9 = {
|
|
13913
13913
|
label: 'ItinerarySegmentCard-eyebrowStyle',
|
|
13914
13914
|
fontSize: 'var(--fs-xs)',
|
|
13915
13915
|
lineHeight: 'var(--lh-xs)',
|
|
@@ -13919,7 +13919,7 @@ const eyebrowStyle$8 = {
|
|
|
13919
13919
|
letterSpacing: '0.06em',
|
|
13920
13920
|
};
|
|
13921
13921
|
/** Declared before `isCancelledStyle`, which reaches it as a descendant. */
|
|
13922
|
-
const titleStyle$
|
|
13922
|
+
const titleStyle$v = {
|
|
13923
13923
|
label: 'ItinerarySegmentCard-titleStyle',
|
|
13924
13924
|
margin: 0,
|
|
13925
13925
|
fontSize: 'var(--fs-lg)',
|
|
@@ -13953,7 +13953,7 @@ const isCancelledStyle = {
|
|
|
13953
13953
|
backgroundColor: 'var(--bg-subtle)',
|
|
13954
13954
|
},
|
|
13955
13955
|
/* `.isCancelled .title` */
|
|
13956
|
-
[`&&& .${sx(titleStyle$
|
|
13956
|
+
[`&&& .${sx(titleStyle$v)}`]: {
|
|
13957
13957
|
textDecoration: 'line-through',
|
|
13958
13958
|
},
|
|
13959
13959
|
};
|
|
@@ -14145,7 +14145,7 @@ const flightStatusStyle = {
|
|
|
14145
14145
|
lineHeight: 'var(--lh-sm)',
|
|
14146
14146
|
fontWeight: 'var(--fw-medium)',
|
|
14147
14147
|
};
|
|
14148
|
-
const actionsStyle$
|
|
14148
|
+
const actionsStyle$7 = {
|
|
14149
14149
|
label: 'ItinerarySegmentCard-actionsStyle',
|
|
14150
14150
|
display: 'flex',
|
|
14151
14151
|
flexWrap: 'wrap',
|
|
@@ -14451,7 +14451,7 @@ const ItinerarySegmentCard = ({ segment, headingLevel = 3, onCheckIn, showCheckI
|
|
|
14451
14451
|
...(segment.type === 'limo' ? [{ label: 'Cancellation policy', lines: segment.cancellationPolicies }] : []),
|
|
14452
14452
|
{ label: 'Segment Notes', lines: segment.type === 'limo' ? [...(segment.comments ?? []), ...(segment.notes ?? [])] : segment.notes },
|
|
14453
14453
|
];
|
|
14454
|
-
return (jsxRuntime.jsxs("article", { className: cx(sx(cardStyle$
|
|
14454
|
+
return (jsxRuntime.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: [jsxRuntime.jsxs("div", { className: cx(sx(headerStyle$w), pillConfirmation && sx(confirmationHeaderStyle)), children: [jsxRuntime.jsx("span", { className: sx(iconStyle$2), "aria-hidden": "true", children: jsxRuntime.jsx(TravelServiceIcon, { type: meta.code, vendor: vendorCode, size: 48 }) }), jsxRuntime.jsxs("span", { className: sx(headingsStyle), children: [jsxRuntime.jsx("span", { className: sx(eyebrowStyle$9), children: meta.label }), jsxRuntime.jsx("span", { className: sx(titleRowStyle$2), children: jsxRuntime.jsx(Heading, { className: sx(titleStyle$v), children: getSegmentTitle(segment) }) }), segment.type === 'air' && segment.operatedBy?.trim() && jsxRuntime.jsxs("span", { className: sx(operatedByStyle), children: ["Operated by ", segment.operatedBy] }), (segment.type === 'car' || segment.type === 'hotel') && segment.reservationName?.trim() && (jsxRuntime.jsxs("span", { className: sx(operatedByStyle), "data-test": `itinerary-reserved-for-${segment.id}`, children: ["Reserved for ", segment.reservationName] }))] }), headerCheckIn && (jsxRuntime.jsx(Button, { size: "sm", variant: "primary", "aria-label": checkInLabel, "data-test": `itinerary-check-in-${segment.id}`, onClick: () => onCheckIn?.(segment), children: "Check In" })), jsxRuntime.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) && jsxRuntime.jsxs("div", { className: sx(routeStyle$2), children: [hasStart && jsxRuntime.jsxs("div", { className: sx(endpointStyle), children: [jsxRuntime.jsx("span", { className: sx(endpointLabelStyle), children: endpoints.startLabel }), segment.type === 'car' && jsxRuntime.jsx("span", { className: sx(endpointTimeStyle), children: endpoints.startCode }), endpoints.startTime && jsxRuntime.jsx("span", { className: sx(segment.type === 'car' ? endpointCodeStyle : endpointTimeStyle), children: endpoints.startTime }), segment.type !== 'car' && endpoints.startCode && jsxRuntime.jsx("span", { className: sx(endpointCodeStyle), children: endpoints.startCode }), endpoints.startPlace && jsxRuntime.jsx("span", { className: sx(endpointPlaceStyle), children: endpoints.startPlace })] }), hasStart && hasEnd && jsxRuntime.jsxs("div", { className: sx(connectorStyle), children: [duration && jsxRuntime.jsx("span", { className: sx(connectorLabelStyle), children: duration }), jsxRuntime.jsx("span", { className: sx(connectorArrowStyle), "aria-hidden": "true", children: jsxRuntime.jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntime.jsx("line", { x1: "5", y1: "12", x2: "19", y2: "12" }), jsxRuntime.jsx("polyline", { points: "12 5 19 12 12 19" })] }) }), (segment.type === 'air' || segment.type === 'rail') && !!segment.miles && jsxRuntime.jsxs("span", { className: sx(connectorLabelStyle), children: [segment.miles.toLocaleString('en-US'), " miles"] }), segment.type === 'car' && !!segment.carCount && jsxRuntime.jsxs("span", { className: sx(connectorLabelStyle), children: [segment.carCount, " ", segment.carCount === 1 ? 'Vehicle' : 'Vehicles'] }), segment.type === 'hotel' && !!segment.rooms && jsxRuntime.jsxs("span", { className: sx(connectorLabelStyle), children: [segment.rooms, " ", segment.rooms === 1 ? 'Room' : 'Rooms'] })] }), hasEnd && jsxRuntime.jsxs("div", { className: sx(endpointStyle), children: [jsxRuntime.jsx("span", { className: sx(endpointLabelStyle), children: endpoints.endLabel }), segment.type === 'car' && jsxRuntime.jsx("span", { className: sx(endpointTimeStyle), children: endpoints.endCode }), endpoints.endTime && (jsxRuntime.jsxs("span", { className: sx(segment.type === 'car' ? endpointCodeStyle : endpointTimeStyle), children: [endpoints.endTime, dayOffset > 0 && jsxRuntime.jsxs("span", { className: sx(nextDayStyle), children: ["+", dayOffset, " day", dayOffset === 1 ? '' : 's'] })] })), segment.type !== 'car' && endpoints.endCode && jsxRuntime.jsx("span", { className: sx(endpointCodeStyle), children: endpoints.endCode }), endpoints.endPlace && jsxRuntime.jsx("span", { className: sx(endpointPlaceStyle), children: endpoints.endPlace })] })] }), details.length > 0 && (jsxRuntime.jsx("dl", { className: sx(detailsStyle$1), children: details.map((detail) => (jsxRuntime.jsxs("div", { className: cx(sx(detailStyle$1), detail.fullRow && sx(detailFullRowStyle)), children: [jsxRuntime.jsx("dt", { className: sx(detailLabelStyle), children: detail.label }), jsxRuntime.jsx("dd", { className: cx(sx(detailValueStyle), detail.mono && sx(monoStyle$2)), children: detail.value }), detail.below && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("dt", { className: cx(sx(detailLabelStyle), sx(detailBelowLabelStyle)), children: detail.below.label }), jsxRuntime.jsx("dd", { className: sx(detailValueStyle), children: detail.below.value })] })] }, detail.label))) })), segment.type === 'air' && segment.flightStatus && (jsxRuntime.jsx("p", { className: sx(flightStatusStyle), "data-test": `itinerary-flight-status-${segment.id}`, children: segment.flightStatus })), segment.type === 'air' && segment.checkInAvailable && onCheckIn && !headerCheckIn && (jsxRuntime.jsx("div", { className: sx(actionsStyle$7), children: jsxRuntime.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 }) => {
|
|
14455
14455
|
const content = lines?.filter((line) => line.trim());
|
|
14456
14456
|
return content?.length ? (jsxRuntime.jsxs("section", { "aria-label": label, className: sx(footerStyle$7), children: [jsxRuntime.jsx("div", { className: sx(noteLabelStyle), children: label }), content.map((line, index) => jsxRuntime.jsx("p", { className: sx(noteLineStyle), children: line }, index))] }, label)) : null;
|
|
14457
14457
|
}), footer && jsxRuntime.jsx("div", { className: sx(footerStyle$7), children: footer })] }));
|
|
@@ -14758,7 +14758,7 @@ const headerStyle$v = {
|
|
|
14758
14758
|
justifyContent: 'space-between',
|
|
14759
14759
|
gap: 'var(--space-4)',
|
|
14760
14760
|
};
|
|
14761
|
-
const titleStyle$
|
|
14761
|
+
const titleStyle$u = {
|
|
14762
14762
|
label: 'MembershipPrograms-titleStyle',
|
|
14763
14763
|
fontSize: 'var(--text-lg)',
|
|
14764
14764
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -14954,7 +14954,7 @@ const MembershipPrograms = ({ title = 'Membership Programs', programs, onEdit, o
|
|
|
14954
14954
|
return acc;
|
|
14955
14955
|
}, {});
|
|
14956
14956
|
const typeOrder = ['airline', 'hotel', 'car', 'other'];
|
|
14957
|
-
return (jsxRuntime.jsxs("div", { className: containerClasses, children: [alert && jsxRuntime.jsx("div", { className: sx(alertStyle$3), children: alert }), jsxRuntime.jsxs("div", { className: sx(headerStyle$v), children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
14957
|
+
return (jsxRuntime.jsxs("div", { className: containerClasses, children: [alert && jsxRuntime.jsx("div", { className: sx(alertStyle$3), children: alert }), jsxRuntime.jsxs("div", { className: sx(headerStyle$v), children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$u), children: title }), onAdd && (jsxRuntime.jsxs("button", { type: "button", className: sx(addButtonStyle), onClick: onAdd, "aria-label": "Add membership program", children: [jsxRuntime.jsx(PlusIcon, {}), jsxRuntime.jsx("span", { children: "Add Program" })] }))] }), programs.length === 0 ? (jsxRuntime.jsx("div", { className: sx(emptyStyle$c), children: jsxRuntime.jsx("p", { children: emptyMessage }) })) : (jsxRuntime.jsx("div", { className: sx(listStyle$3), children: typeOrder.map((type) => {
|
|
14958
14958
|
const typePrograms = groupedPrograms[type];
|
|
14959
14959
|
if (!typePrograms || typePrograms.length === 0)
|
|
14960
14960
|
return null;
|
|
@@ -15123,7 +15123,7 @@ const dialogStyle = {
|
|
|
15123
15123
|
},
|
|
15124
15124
|
};
|
|
15125
15125
|
/** The Module card inside it: fills the box and lets its body scroll. */
|
|
15126
|
-
const cardStyle$
|
|
15126
|
+
const cardStyle$a = {
|
|
15127
15127
|
label: 'Modal-cardStyle',
|
|
15128
15128
|
flex: 1,
|
|
15129
15129
|
minHeight: 0,
|
|
@@ -15142,7 +15142,7 @@ const sizeStyles$1 = {
|
|
|
15142
15142
|
},
|
|
15143
15143
|
};
|
|
15144
15144
|
/** The title inherits the Module header's type (16px semibold, ink). */
|
|
15145
|
-
const titleStyle$
|
|
15145
|
+
const titleStyle$t = {
|
|
15146
15146
|
label: 'Modal-titleStyle',
|
|
15147
15147
|
margin: 0,
|
|
15148
15148
|
font: 'inherit',
|
|
@@ -15247,7 +15247,7 @@ const iconStyle$1 = {
|
|
|
15247
15247
|
const iconSpacedStyle = {
|
|
15248
15248
|
label: 'Module-iconSpacedStyle', margin: 4
|
|
15249
15249
|
};
|
|
15250
|
-
const titleStyle$
|
|
15250
|
+
const titleStyle$s = {
|
|
15251
15251
|
label: 'Module-titleStyle', color: 'var(--fg-1, #282828)'
|
|
15252
15252
|
};
|
|
15253
15253
|
const badgeStyle$1 = {
|
|
@@ -15365,7 +15365,7 @@ const Module = ({ title, icon, iconClassName = '', badge, before, children, afte
|
|
|
15365
15365
|
setOpen(!open);
|
|
15366
15366
|
}
|
|
15367
15367
|
};
|
|
15368
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(moduleStyle), className), children: [title && (jsxRuntime.jsx("div", { className: cx(sx(headerStyle$u), sx(headerSizeStyles[size]), !open && sx(closedStyle), headerClassName), children: jsxRuntime.jsxs("div", { className: cx(sx(titleRowStyle$1), sx(titleRowSizeStyles[size]), titleClassName), children: [icon && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$1), size !== 'sm' && sx(iconSpacedStyle), iconClassName), children: icon })), jsxRuntime.jsx("div", { className: sx(titleStyle$
|
|
15368
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(moduleStyle), className), children: [title && (jsxRuntime.jsx("div", { className: cx(sx(headerStyle$u), sx(headerSizeStyles[size]), !open && sx(closedStyle), headerClassName), children: jsxRuntime.jsxs("div", { className: cx(sx(titleRowStyle$1), sx(titleRowSizeStyles[size]), titleClassName), children: [icon && (jsxRuntime.jsx("span", { className: cx(sx(iconStyle$1), size !== 'sm' && sx(iconSpacedStyle), iconClassName), children: icon })), jsxRuntime.jsx("div", { className: sx(titleStyle$s), children: title }), badge && jsxRuntime.jsx("span", { className: sx(badgeStyle$1), children: badge }), jsxRuntime.jsxs("div", { className: sx(toolsStyle), children: [tools, useToggle && (jsxRuntime.jsx("button", { type: "button", className: sx(toggleBtnStyle), onClick: handleToggle, "aria-expanded": open, children: jsxRuntime.jsx(ChevronIcon, { direction: open ? 'up' : 'down' }) }))] })] }) })), jsxRuntime.jsxs("div", { className: cx(sx(bodyWrapperStyle), scrollBody && sx(scrollBodyStyle)), children: [before, jsxRuntime.jsx("div", { className: cx(sx(bodyStyle$4), sx(bodySizeStyles[size]), !open && sx(hiddenStyle), bodyClassName), children: children }), after] }), footer && (jsxRuntime.jsx("div", { className: cx(sx(footerStyle$6), !open && sx(hiddenStyle)), children: footer }))] }));
|
|
15369
15369
|
};
|
|
15370
15370
|
/**
|
|
15371
15371
|
* Horizontal divider for Module content
|
|
@@ -15417,8 +15417,8 @@ const Modal = ({ isOpen, onClose, title, subtitle, icon, children, size = 'md',
|
|
|
15417
15417
|
const close = showCloseButton ? (jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", square: true, className: sx(closeButtonStyle$1), onClick: onClose, "aria-label": "Close modal", children: jsxRuntime.jsx(CloseIcon, { size: 16 }) })) : undefined;
|
|
15418
15418
|
// Module draws its header only when it has a title; a close button alone
|
|
15419
15419
|
// still needs one, so it gets an empty title slot.
|
|
15420
|
-
const heading = title || subtitle ? (jsxRuntime.jsxs("div", { children: [title && (jsxRuntime.jsx("h2", { id: titleId, className: sx(titleStyle$
|
|
15421
|
-
return (jsxRuntime.jsx("div", { className: [sx(overlayStyle), overlayClassName].filter(Boolean).join(' '), onClick: handleBackdropClick, children: jsxRuntime.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: jsxRuntime.jsx(Module, { className: sx(cardStyle$
|
|
15420
|
+
const heading = title || subtitle ? (jsxRuntime.jsxs("div", { children: [title && (jsxRuntime.jsx("h2", { id: titleId, className: sx(titleStyle$t), children: title })), subtitle && jsxRuntime.jsx("p", { className: sx(subtitleStyle$6), children: subtitle })] })) : close ? (jsxRuntime.jsx("span", {})) : undefined;
|
|
15421
|
+
return (jsxRuntime.jsx("div", { className: [sx(overlayStyle), overlayClassName].filter(Boolean).join(' '), onClick: handleBackdropClick, children: jsxRuntime.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: jsxRuntime.jsx(Module, { className: sx(cardStyle$a), title: heading, icon: icon, tools: close, footer: footer, useToggle: false, scrollBody: true, bodyClassName: bodyClassName, children: children }) }) }));
|
|
15422
15422
|
};
|
|
15423
15423
|
/**
|
|
15424
15424
|
* Action row for the bottom of a Modal, keeping button order consistent across dialogs.
|
|
@@ -15438,7 +15438,7 @@ const ConfirmModal = ({ message, confirmText = 'Confirm', cancelText = 'Cancel',
|
|
|
15438
15438
|
|
|
15439
15439
|
The three `--nt-*` custom properties are declared on the card and inherited
|
|
15440
15440
|
by everything below it, so their names are carried across verbatim. */
|
|
15441
|
-
const cardStyle$
|
|
15441
|
+
const cardStyle$9 = {
|
|
15442
15442
|
label: 'NextTripCard-cardStyle',
|
|
15443
15443
|
'--nt-sky': '#5bade6',
|
|
15444
15444
|
'--nt-muted': 'rgb(255 255 255 / 55%)',
|
|
@@ -15462,7 +15462,7 @@ const topStyle = {
|
|
|
15462
15462
|
justifyContent: 'space-between',
|
|
15463
15463
|
gap: 12,
|
|
15464
15464
|
};
|
|
15465
|
-
const eyebrowStyle$
|
|
15465
|
+
const eyebrowStyle$8 = {
|
|
15466
15466
|
label: 'NextTripCard-eyebrowStyle',
|
|
15467
15467
|
color: 'var(--color-accent, #00bcd0)',
|
|
15468
15468
|
fontFamily: 'var(--font-family-label)',
|
|
@@ -15556,7 +15556,7 @@ const travelerStyle$1 = {
|
|
|
15556
15556
|
gap: 10,
|
|
15557
15557
|
marginBottom: 8,
|
|
15558
15558
|
};
|
|
15559
|
-
const nameStyle$
|
|
15559
|
+
const nameStyle$4 = {
|
|
15560
15560
|
label: 'NextTripCard-nameStyle',
|
|
15561
15561
|
fontSize: 17,
|
|
15562
15562
|
fontWeight: 700,
|
|
@@ -15725,7 +15725,7 @@ const btnStyle = {
|
|
|
15725
15725
|
fontWeight: 700,
|
|
15726
15726
|
cursor: 'pointer',
|
|
15727
15727
|
};
|
|
15728
|
-
const actionsStyle$
|
|
15728
|
+
const actionsStyle$6 = {
|
|
15729
15729
|
label: 'NextTripCard-actionsStyle',
|
|
15730
15730
|
display: 'flex',
|
|
15731
15731
|
flexWrap: 'wrap',
|
|
@@ -15789,7 +15789,7 @@ const NextTripCard = ({ eyebrow = 'Your Next Trip', countdownLabel, date, origin
|
|
|
15789
15789
|
const expanded = expandedProp ?? autoExpanded;
|
|
15790
15790
|
const hasDetail = expanded && (details.length > 0 || !!checkIn || !!onAddToCalendar);
|
|
15791
15791
|
const viewItineraryButton = (jsxRuntime.jsxs("button", { type: "button", className: cx(sx(btnStyle), sx(btnPrimaryStyle)), onClick: onViewItinerary, children: [viewItineraryLabel, " \u2192"] }));
|
|
15792
|
-
return (jsxRuntime.jsxs("div", { ref: ref, className: cx(sx(cardStyle$
|
|
15792
|
+
return (jsxRuntime.jsxs("div", { ref: ref, className: cx(sx(cardStyle$9), className), ...props, children: [jsxRuntime.jsxs("div", { className: sx(topStyle), children: [jsxRuntime.jsx("span", { className: sx(eyebrowStyle$8), children: eyebrow }), countdownLabel != null && (jsxRuntime.jsxs("span", { className: sx(countdownStyle), children: [jsxRuntime.jsx(ClockGlyph, {}), countdownLabel] }))] }), jsxRuntime.jsxs("div", { className: sx(headStyle), children: [jsxRuntime.jsx("span", { className: sx(dateStyle), children: date }), jsxRuntime.jsxs("div", { className: sx(routeStyle$1), children: [jsxRuntime.jsxs("div", { style: { textAlign: 'right' }, children: [jsxRuntime.jsx("div", { className: sx(aptCodeStyle), children: origin.code }), jsxRuntime.jsx("div", { className: sx(aptCityStyle), children: origin.city.toUpperCase() })] }), jsxRuntime.jsxs("div", { className: sx(pathStyle), children: [jsxRuntime.jsxs("svg", { width: "92", height: "34", viewBox: "0 0 92 34", fill: "none", "aria-hidden": "true", children: [jsxRuntime.jsx("circle", { cx: "5", cy: "27", r: "3.5", stroke: "var(--color-accent, #00bcd0)", strokeWidth: "2" }), jsxRuntime.jsx("circle", { cx: "87", cy: "27", r: "3.5", stroke: "var(--color-accent, #00bcd0)", strokeWidth: "2" }), jsxRuntime.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" })] }), jsxRuntime.jsx("span", { className: sx(planeStyle), children: jsxRuntime.jsx(PlaneIcon$3, { size: 16 }) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: sx(aptCodeStyle), children: destination.code }), jsxRuntime.jsx("div", { className: sx(aptCityStyle), children: destination.city.toUpperCase() })] })] })] }), jsxRuntime.jsx("div", { className: sx(dividerStyle) }), jsxRuntime.jsxs("div", { className: sx(summaryStyle$5), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("div", { className: sx(travelerStyle$1), children: [jsxRuntime.jsx("span", { className: sx(nameStyle$4), children: traveler }), status && (jsxRuntime.jsxs("span", { className: cx(sx(statusStyle$3), sx(toneStyles$1[status.tone ?? 'ontime'])), children: [jsxRuntime.jsx("span", { className: sx(statusDotStyle$1) }), status.label] }))] }), jsxRuntime.jsxs("div", { className: sx(timesStyle), children: [jsxRuntime.jsx("span", { className: sx(timeStyle), children: departTime }), jsxRuntime.jsx("span", { className: sx(arrowStyle), children: "\u2192" }), jsxRuntime.jsx("span", { className: sx(timeStyle), children: arriveTime })] }), jsxRuntime.jsxs("div", { className: sx(legsStyle$2), children: [jsxRuntime.jsxs("span", { children: ["Depart \u00B7 ", origin.code] }), jsxRuntime.jsxs("span", { children: ["Arrive \u00B7 ", destination.code] })] })] }), !hasDetail && viewItineraryButton] }), hasDetail && (jsxRuntime.jsxs("div", { className: sx(moreStyle), children: [details.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: sx(moreLabelStyle), children: [jsxRuntime.jsx("span", { children: "Flight details" }), jsxRuntime.jsx("span", { className: sx(ruleStyle) })] }), jsxRuntime.jsx("div", { className: sx(gridStyle$6), children: details.map((f) => (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: sx(fieldKStyle), children: f.label }), jsxRuntime.jsxs("div", { className: sx(fieldVStyle), children: [f.value, f.note && jsxRuntime.jsxs("span", { className: sx(fieldNoteStyle), children: [" ", f.note] })] })] }, f.label))) })] })), checkIn && (jsxRuntime.jsxs("div", { className: sx(checkinStyle), children: [jsxRuntime.jsx("span", { className: sx(checkinIconStyle), children: jsxRuntime.jsx(CalendarGlyph$1, {}) }), jsxRuntime.jsxs("span", { className: sx(checkinTextStyle), children: [jsxRuntime.jsx("strong", { children: checkIn.title }), checkIn.note && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" ", jsxRuntime.jsx("span", { children: checkIn.note })] })] })] })), jsxRuntime.jsxs("div", { className: sx(actionsStyle$6), children: [viewItineraryButton, onAddToCalendar && (jsxRuntime.jsx("button", { type: "button", className: cx(sx(btnStyle), sx(btnGhostStyle)), onClick: onAddToCalendar, children: addToCalendarLabel }))] })] }))] }));
|
|
15793
15793
|
};
|
|
15794
15794
|
|
|
15795
15795
|
/* "Your travel board": a full-width (L-only) home widget showing the week's
|
|
@@ -15797,7 +15797,7 @@ const NextTripCard = ({ eyebrow = 'Your Next Trip', countdownLabel, date, origin
|
|
|
15797
15797
|
Individual view is flight-centric (route + time + traveller). Team view, drawn
|
|
15798
15798
|
from the Team Travel Calendar, de-emphasises flights and shows each team trip
|
|
15799
15799
|
as a bar spanning its travel dates. Selecting an item fills the footer. */
|
|
15800
|
-
const cardStyle$
|
|
15800
|
+
const cardStyle$8 = {
|
|
15801
15801
|
label: 'TravelBoard-cardStyle',
|
|
15802
15802
|
display: 'flex',
|
|
15803
15803
|
width: '100%',
|
|
@@ -15820,7 +15820,7 @@ const headerStyle$t = {
|
|
|
15820
15820
|
gap: '14px 20px',
|
|
15821
15821
|
padding: '18px 22px',
|
|
15822
15822
|
};
|
|
15823
|
-
const titleStyle$
|
|
15823
|
+
const titleStyle$r = {
|
|
15824
15824
|
label: 'TravelBoard-titleStyle',
|
|
15825
15825
|
margin: 0,
|
|
15826
15826
|
flex: '0 0 auto',
|
|
@@ -16224,7 +16224,7 @@ const footerEyebrowStyle = {
|
|
|
16224
16224
|
* `footerTitleStyle`, which resolves this class name to build that descendant
|
|
16225
16225
|
* selector.
|
|
16226
16226
|
*/
|
|
16227
|
-
const codeStyle$
|
|
16227
|
+
const codeStyle$3 = {
|
|
16228
16228
|
label: 'TravelBoard-codeStyle',
|
|
16229
16229
|
};
|
|
16230
16230
|
const footerTitleStyle = {
|
|
@@ -16237,7 +16237,7 @@ const footerTitleStyle = {
|
|
|
16237
16237
|
whiteSpace: 'nowrap',
|
|
16238
16238
|
/* `.footerTitle .code` — the child's class is content-hashed, so it is
|
|
16239
16239
|
resolved here rather than written out. */
|
|
16240
|
-
[`& .${sx(codeStyle$
|
|
16240
|
+
[`& .${sx(codeStyle$3)}`]: {
|
|
16241
16241
|
color: 'var(--color-accent-strong, #0097a8)',
|
|
16242
16242
|
},
|
|
16243
16243
|
};
|
|
@@ -16373,14 +16373,14 @@ const TravelBoard = ({ title = "This Week's Travel", weekDays, periodLabel, trip
|
|
|
16373
16373
|
if (!selectedTrip)
|
|
16374
16374
|
return jsxRuntime.jsx("span", { className: sx(footerEmptyStyle), children: "Select a trip to see its details." });
|
|
16375
16375
|
const t = selectedTrip;
|
|
16376
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, children: t.travelerInitials ?? initialsOf(t.travelerFull ?? t.traveler) }), jsxRuntime.jsxs("span", { className: sx(footerMetaStyle), children: [jsxRuntime.jsxs("span", { className: sx(footerEyebrowStyle), children: [t.travelerFull ?? t.traveler, t.sportCode ? ` - ${t.sportCode}` : ''] }), jsxRuntime.jsxs("span", { className: sx(footerTitleStyle), children: [t.originCity ?? t.origin, " ", jsxRuntime.jsx("span", { className: sx(codeStyle$
|
|
16376
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, children: t.travelerInitials ?? initialsOf(t.travelerFull ?? t.traveler) }), jsxRuntime.jsxs("span", { className: sx(footerMetaStyle), children: [jsxRuntime.jsxs("span", { className: sx(footerEyebrowStyle), children: [t.travelerFull ?? t.traveler, t.sportCode ? ` - ${t.sportCode}` : ''] }), jsxRuntime.jsxs("span", { className: sx(footerTitleStyle), children: [t.originCity ?? t.origin, " ", jsxRuntime.jsx("span", { className: sx(codeStyle$3), children: t.origin }), " \u2192 ", t.destinationCity ?? t.destination, " ", jsxRuntime.jsx("span", { className: sx(codeStyle$3), children: t.destination })] }), jsxRuntime.jsxs("span", { className: sx(footerSubStyle), children: [t.time, t.arriveTime ? ` – ${t.arriveTime}` : '', t.airline ? jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" \u00B7 ", t.airline] }) : null, t.confirmation ? jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" \u00B7 Confirmation: ", jsxRuntime.jsx("b", { children: t.confirmation })] }) : null] })] }), jsxRuntime.jsxs("button", { type: "button", className: sx(footerBtnStyle), onClick: () => onViewItinerary?.(t), children: ["View itinerary ", chevron] })] }));
|
|
16377
16377
|
}
|
|
16378
16378
|
if (!selectedTeamTrip)
|
|
16379
16379
|
return jsxRuntime.jsx("span", { className: sx(footerEmptyStyle), children: "Select a team trip to see its details." });
|
|
16380
16380
|
const t = selectedTeamTrip;
|
|
16381
16381
|
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: sx(footerAvatarStyle), "aria-hidden": true, style: t.accent ? { color: t.accent } : undefined, children: t.teamInitials ?? initialsOf(t.team) }), jsxRuntime.jsxs("span", { className: sx(footerMetaStyle), children: [jsxRuntime.jsx("span", { className: sx(footerEyebrowStyle), children: "Team Travel" }), jsxRuntime.jsxs("span", { className: sx(footerTitleStyle), children: [t.team, t.destination ? jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" \u00B7 ", t.destination] }) : null] }), jsxRuntime.jsxs("span", { className: sx(footerSubStyle), children: [periodLabelForTeam(t), t.travelerCount != null ? jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" \u00B7 ", jsxRuntime.jsx("b", { children: t.travelerCount }), " travelers"] }) : null] })] }), jsxRuntime.jsxs("button", { type: "button", className: sx(footerBtnStyle), onClick: () => onViewTeamTrip?.(t), children: ["View trip ", chevron] })] }));
|
|
16382
16382
|
};
|
|
16383
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(cardStyle$
|
|
16383
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(cardStyle$8), className), "data-test": "travel-board", ...props, children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$t), children: [jsxRuntime.jsx("h3", { className: sx(titleStyle$r), children: title }), jsxRuntime.jsx("div", { className: sx(togglesStyle), children: jsxRuntime.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' }] }) }), jsxRuntime.jsxs("div", { className: sx(periodStyle), children: [jsxRuntime.jsx("span", { className: sx(periodLabelStyle), children: periodLabel }), jsxRuntime.jsx("button", { type: "button", className: sx(navBtnStyle), "aria-label": "Previous week", onClick: onPrev, children: jsxRuntime.jsx(ChevronLeftIcon, { size: 18 }) }), jsxRuntime.jsx("button", { type: "button", className: sx(navBtnStyle), "aria-label": "Next week", onClick: onNext, children: jsxRuntime.jsx(ChevronRightIcon$1, { size: 18 }) })] })] }), mode === 'individual' ? renderIndividualBoard() : renderTeamBoard(), jsxRuntime.jsx("div", { className: sx(footerStyle$5), children: renderFooter() })] }));
|
|
16384
16384
|
};
|
|
16385
16385
|
/** Formats a team trip's travel span for the footer, collapsing the repeated month. */
|
|
16386
16386
|
const periodLabelForTeam = (t) => {
|
|
@@ -16478,7 +16478,7 @@ const contentStyle$5 = {
|
|
|
16478
16478
|
flex: 1,
|
|
16479
16479
|
minWidth: 0,
|
|
16480
16480
|
};
|
|
16481
|
-
const titleStyle$
|
|
16481
|
+
const titleStyle$q = {
|
|
16482
16482
|
label: 'PageBanners-titleStyle',
|
|
16483
16483
|
'&&': {
|
|
16484
16484
|
margin: 0,
|
|
@@ -16592,8 +16592,8 @@ const PageBanners = ({ systemBanners, alertBanners, fullWidth = false, className
|
|
|
16592
16592
|
const visibleAlerts = alertBanners.filter((banner) => !dismissed.has(banner.id));
|
|
16593
16593
|
if (!visibleSystem.length && !visibleAlerts.length)
|
|
16594
16594
|
return null;
|
|
16595
|
-
return (jsxRuntime.jsxs("div", { className: classes(sx(stackStyle$3), fullWidth && sx(flushStyle), className), role: "region", "aria-label": "Page notices", children: [visibleSystem.map((banner) => (jsxRuntime.jsxs("div", { className: classes(sx(bannerStyle$1), sx(systemStyle)), role: "status", children: [jsxRuntime.jsx(InfoIcon$1, { className: sx(systemIconStyle), size: 20, "aria-hidden": "true" }), jsxRuntime.jsxs("div", { className: sx(contentStyle$5), children: [jsxRuntime.jsx("p", { className: sx(titleStyle$
|
|
16596
|
-
const content = (jsxRuntime.jsxs("div", { className: sx(contentStyle$5), children: [jsxRuntime.jsx("p", { className: classes(sx(titleStyle$
|
|
16595
|
+
return (jsxRuntime.jsxs("div", { className: classes(sx(stackStyle$3), fullWidth && sx(flushStyle), className), role: "region", "aria-label": "Page notices", children: [visibleSystem.map((banner) => (jsxRuntime.jsxs("div", { className: classes(sx(bannerStyle$1), sx(systemStyle)), role: "status", children: [jsxRuntime.jsx(InfoIcon$1, { className: sx(systemIconStyle), size: 20, "aria-hidden": "true" }), jsxRuntime.jsxs("div", { className: sx(contentStyle$5), children: [jsxRuntime.jsx("p", { className: sx(titleStyle$q), children: decodeEntities(banner.html) }), banner.detailHtml && jsxRuntime.jsx("p", { className: sx(detailStyle), children: decodeEntities(banner.detailHtml) })] }), jsxRuntime.jsx("button", { type: "button", className: sx(dismissStyle), "aria-label": "Dismiss notice", onClick: () => dismiss(banner.id), children: jsxRuntime.jsx(CloseIcon, { size: 16 }) })] }, banner.id))), visibleAlerts.map((banner) => {
|
|
16596
|
+
const content = (jsxRuntime.jsxs("div", { className: sx(contentStyle$5), children: [jsxRuntime.jsx("p", { className: classes(sx(titleStyle$q), sx(alertTitleStyle)), children: decodeEntities(banner.title) }), banner.body && jsxRuntime.jsx("p", { className: classes(sx(detailStyle), sx(clampStyle)), children: decodeEntities(banner.body) })] }));
|
|
16597
16597
|
return (jsxRuntime.jsxs("div", { className: classes(sx(bannerStyle$1), sx(alertStyle$1)), role: "alert", children: [jsxRuntime.jsx(WarningIcon$1, { className: sx(alertIconStyle), size: 20, "aria-hidden": "true" }), banner.href ? (jsxRuntime.jsx("a", { href: banner.href, className: sx(alertLinkStyle), children: content })) : (content), jsxRuntime.jsx("button", { type: "button", className: classes(sx(dismissStyle), sx(alertDismissStyle)), "aria-label": "Dismiss alert", onClick: () => dismiss(banner.id), children: jsxRuntime.jsx(CloseIcon, { size: 16 }) })] }, banner.id));
|
|
16598
16598
|
})] }));
|
|
16599
16599
|
};
|
|
@@ -16625,7 +16625,7 @@ const alertStyle = {
|
|
|
16625
16625
|
label: 'PreferencesPanel-alertStyle',
|
|
16626
16626
|
width: '100%',
|
|
16627
16627
|
};
|
|
16628
|
-
const titleStyle$
|
|
16628
|
+
const titleStyle$p = {
|
|
16629
16629
|
label: 'PreferencesPanel-titleStyle',
|
|
16630
16630
|
fontSize: 'var(--text-lg)',
|
|
16631
16631
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -16734,7 +16734,7 @@ const DEFAULT_ICONS = {
|
|
|
16734
16734
|
*/
|
|
16735
16735
|
const PreferencesPanel = ({ title, sections, alert, footer, isLoading = false, className = '', }) => {
|
|
16736
16736
|
const panelClasses = cx(sx(panelStyle$4), isLoading && sx(loadingStyle$2), className);
|
|
16737
|
-
return (jsxRuntime.jsxs("div", { className: panelClasses, children: [alert && (jsxRuntime.jsx("div", { className: sx(alertStyle), children: alert })), title && jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
16737
|
+
return (jsxRuntime.jsxs("div", { className: panelClasses, children: [alert && (jsxRuntime.jsx("div", { className: sx(alertStyle), children: alert })), title && jsxRuntime.jsx("h2", { className: sx(titleStyle$p), children: title }), jsxRuntime.jsx("div", { className: sx(gridStyle$5), children: sections.map((section, i) => (jsxRuntime.jsxs("div", { className: sx(sectionStyle$7), children: [jsxRuntime.jsxs("div", { className: sx(sectionHeaderStyle$2), children: [(section.icon || DEFAULT_ICONS[section.title.toLowerCase()]) && (jsxRuntime.jsx("span", { className: sx(sectionIconStyle$2), children: section.icon || DEFAULT_ICONS[section.title.toLowerCase()] })), jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle$a), children: section.title })] }), jsxRuntime.jsx("div", { className: sx(fieldsStyle$1), children: section.fields.map((field, j) => (jsxRuntime.jsxs("div", { className: sx(fieldStyle$3), children: [jsxRuntime.jsx("label", { className: sx(fieldLabelStyle$1), children: field.label }), field.input ? (jsxRuntime.jsx("div", { className: sx(fieldInputStyle), children: field.input })) : (jsxRuntime.jsx("div", { className: sx(fieldValueStyle$1), children: field.value || '—' }))] }, j))) })] }, i))) }), footer && (jsxRuntime.jsx("div", { className: sx(footerStyle$4), children: footer }))] }));
|
|
16738
16738
|
};
|
|
16739
16739
|
PreferencesPanel.displayName = 'PreferencesPanel';
|
|
16740
16740
|
|
|
@@ -16786,7 +16786,7 @@ const identityTextStyle = {
|
|
|
16786
16786
|
flexDirection: 'column',
|
|
16787
16787
|
gap: 2,
|
|
16788
16788
|
};
|
|
16789
|
-
const nameStyle$
|
|
16789
|
+
const nameStyle$3 = {
|
|
16790
16790
|
label: 'ProfileMenu-nameStyle',
|
|
16791
16791
|
overflow: 'hidden',
|
|
16792
16792
|
fontSize: 18,
|
|
@@ -16860,7 +16860,7 @@ const dangerStyle$1 = {
|
|
|
16860
16860
|
* user, the rows, and their handlers, and positions the menu (e.g. as the
|
|
16861
16861
|
* `profileMenu` popover of HubAppShell).
|
|
16862
16862
|
*/
|
|
16863
|
-
const ProfileMenu = ({ name, email, initials, avatarSrc, profileLabel = 'Profile', accountLabel = 'Account', items, className = '', ...props }) => (jsxRuntime.jsxs("div", { className: cx(sx(menuStyle), className), role: "menu", "aria-label": profileLabel, "data-test": "profile-menu", ...props, children: [jsxRuntime.jsxs("div", { className: sx(identityBlockStyle), children: [jsxRuntime.jsx("p", { className: sx(sectionLabelStyle), children: profileLabel }), jsxRuntime.jsxs("div", { className: sx(identityStyle), children: [jsxRuntime.jsx(Avatar, { name: name, initials: initials, src: avatarSrc, size: "lg" }), jsxRuntime.jsxs("div", { className: sx(identityTextStyle), children: [jsxRuntime.jsx("span", { className: sx(nameStyle$
|
|
16863
|
+
const ProfileMenu = ({ name, email, initials, avatarSrc, profileLabel = 'Profile', accountLabel = 'Account', items, className = '', ...props }) => (jsxRuntime.jsxs("div", { className: cx(sx(menuStyle), className), role: "menu", "aria-label": profileLabel, "data-test": "profile-menu", ...props, children: [jsxRuntime.jsxs("div", { className: sx(identityBlockStyle), children: [jsxRuntime.jsx("p", { className: sx(sectionLabelStyle), children: profileLabel }), jsxRuntime.jsxs("div", { className: sx(identityStyle), children: [jsxRuntime.jsx(Avatar, { name: name, initials: initials, src: avatarSrc, size: "lg" }), jsxRuntime.jsxs("div", { className: sx(identityTextStyle), children: [jsxRuntime.jsx("span", { className: sx(nameStyle$3), children: name }), jsxRuntime.jsx("span", { className: sx(emailStyle), children: email })] })] })] }), jsxRuntime.jsxs("div", { className: sx(sectionStyle$6), children: [jsxRuntime.jsx("p", { className: sx(sectionLabelStyle), children: accountLabel }), items.map((item) => (jsxRuntime.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 && jsxRuntime.jsx("span", { className: sx(itemIconStyle), children: item.icon }), jsxRuntime.jsx("span", { children: item.label })] }, item.key)))] })] }));
|
|
16864
16864
|
|
|
16865
16865
|
/**
|
|
16866
16866
|
* QuoteCostBreakdown's compiled rules.
|
|
@@ -16884,7 +16884,7 @@ const breakdownStyle = {
|
|
|
16884
16884
|
flexDirection: 'column',
|
|
16885
16885
|
gap: 'var(--space-3)',
|
|
16886
16886
|
};
|
|
16887
|
-
const titleStyle$
|
|
16887
|
+
const titleStyle$o = {
|
|
16888
16888
|
label: 'QuoteCostBreakdown-titleStyle',
|
|
16889
16889
|
margin: 0,
|
|
16890
16890
|
color: 'var(--fg-1)',
|
|
@@ -17030,11 +17030,11 @@ const QuoteCostBreakdown = ({ lineItems, adjustments = [], currency = 'USD', loc
|
|
|
17030
17030
|
const quantityFormatter = React.useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
17031
17031
|
const totals = React.useMemo(() => computeQuoteTotals(lineItems, adjustments), [lineItems, adjustments]);
|
|
17032
17032
|
const perPassenger = passengerCount && passengerCount > 0 ? totals.total / passengerCount : undefined;
|
|
17033
|
-
return (jsxRuntime.jsxs("section", { className: cx(sx(breakdownStyle), className), "aria-label": title || 'Cost breakdown', "data-test": "quote-cost-breakdown", children: [title && jsxRuntime.jsx("h3", { className: sx(titleStyle$
|
|
17033
|
+
return (jsxRuntime.jsxs("section", { className: cx(sx(breakdownStyle), className), "aria-label": title || 'Cost breakdown', "data-test": "quote-cost-breakdown", children: [title && jsxRuntime.jsx("h3", { className: sx(titleStyle$o), children: title }), jsxRuntime.jsx("div", { className: sx(tableScrollStyle$1), children: jsxRuntime.jsxs("table", { className: sx(tableStyle$7), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Item" }), jsxRuntime.jsx("th", { scope: "col", className: sx(numericStyle), children: "Qty" }), jsxRuntime.jsx("th", { scope: "col", className: sx(numericStyle), children: "Unit price" }), jsxRuntime.jsx("th", { scope: "col", className: sx(numericStyle), children: "Amount" })] }) }), jsxRuntime.jsxs("tbody", { children: [lineItems.length === 0 && (jsxRuntime.jsx("tr", { children: jsxRuntime.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) => (jsxRuntime.jsxs("tr", { "data-test": "quote-cost-line-item", children: [jsxRuntime.jsxs("th", { scope: "row", className: sx(itemCellStyle), children: [jsxRuntime.jsx("span", { className: sx(itemLabelStyle), children: lineItem.label }), jsxRuntime.jsxs("span", { className: sx(itemMetaStyle), children: [CATEGORY_LABELS[lineItem.category ?? 'other'], lineItem.description ? ` · ${lineItem.description}` : ''] })] }), jsxRuntime.jsxs("td", { className: sx(numericStyle), children: [quantityFormatter.format(lineItem.quantity), " ", lineItem.unit] }), jsxRuntime.jsx("td", { className: sx(numericStyle), children: currencyFormatter.format(lineItem.unitPrice) }), jsxRuntime.jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), children: currencyFormatter.format(computeLineItemTotal(lineItem)) })] }, lineItem.id)))] }), jsxRuntime.jsxs("tfoot", { children: [jsxRuntime.jsxs("tr", { className: sx(subtotalRowStyle), children: [jsxRuntime.jsx("th", { scope: "row", colSpan: 3, children: "Subtotal" }), jsxRuntime.jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), "data-test": "quote-cost-subtotal", children: currencyFormatter.format(totals.subtotal) })] }), adjustments.map((adjustment) => (jsxRuntime.jsxs("tr", { "data-test": "quote-cost-adjustment", children: [jsxRuntime.jsxs("th", { scope: "row", colSpan: 3, className: sx(itemCellStyle), children: [jsxRuntime.jsx("span", { className: sx(itemLabelStyle), children: adjustment.label }), adjustment.note && jsxRuntime.jsx("span", { className: sx(itemMetaStyle), children: adjustment.note })] }), jsxRuntime.jsx("td", { className: cx(sx(numericStyle), sx(amountStyle), adjustment.amount < 0 && sx(creditStyle)), children: currencyFormatter.format(adjustment.amount) })] }, adjustment.id))), jsxRuntime.jsxs("tr", { className: sx(totalRowStyle), children: [jsxRuntime.jsx("th", { scope: "row", colSpan: 3, children: "Quoted total" }), jsxRuntime.jsx("td", { className: cx(sx(numericStyle), sx(amountStyle)), "data-test": "quote-cost-total", children: currencyFormatter.format(totals.total) })] }), perPassenger !== undefined && (jsxRuntime.jsxs("tr", { className: sx(perPassengerRowStyle), children: [jsxRuntime.jsxs("th", { scope: "row", colSpan: 3, children: ["Per passenger (", quantityFormatter.format(passengerCount), " pax)"] }), jsxRuntime.jsx("td", { className: sx(numericStyle), "data-test": "quote-cost-per-passenger", children: currencyFormatter.format(perPassenger) })] }))] })] }) })] }));
|
|
17034
17034
|
};
|
|
17035
17035
|
|
|
17036
17036
|
/** The button row itself; it wraps so the disabled reason can take a line of its own. */
|
|
17037
|
-
const actionsStyle$
|
|
17037
|
+
const actionsStyle$5 = {
|
|
17038
17038
|
label: 'QuoteReviewActions-actionsStyle',
|
|
17039
17039
|
display: 'flex',
|
|
17040
17040
|
flexWrap: 'wrap',
|
|
@@ -17193,7 +17193,7 @@ const QuoteReviewActions = ({ quoteId, carrier, formattedTotal, changes = [], di
|
|
|
17193
17193
|
const appendReason = (reason) => {
|
|
17194
17194
|
setNote((current) => (current.trim() ? `${current.trim()}\n${reason}` : reason));
|
|
17195
17195
|
};
|
|
17196
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(actionsStyle$
|
|
17196
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(actionsStyle$5), className), "data-test": "quote-review-actions", children: [jsxRuntime.jsx(Button, { disabled: disabled, onClick: () => setIsApproveOpen(true), "data-test": "quote-review-approve", children: approveLabel }), jsxRuntime.jsx(Button, { variant: "secondary", disabled: disabled, onClick: () => setIsRejectOpen(true), "data-test": "quote-review-reject", children: rejectLabel }), changes.length > 0 && (jsxRuntime.jsxs("span", { className: sx(changeCountStyle), "data-test": "quote-review-change-count", children: [changes.length, " field", changes.length === 1 ? '' : 's', " edited"] })), disabled && disabledReason && (jsxRuntime.jsx("p", { className: sx(disabledReasonStyle), "data-test": "quote-review-disabled-reason", children: disabledReason })), jsxRuntime.jsx(ConfirmModal, { isOpen: isApproveOpen, onClose: () => setIsApproveOpen(false), title: "Approve this quote?", confirmText: approveLabel, cancelText: "Cancel", loading: loading, onConfirm: confirmApprove, message: jsxRuntime.jsxs("span", { "data-test": "quote-review-approve-message", children: [jsxRuntime.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 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.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."] }), jsxRuntime.jsx("span", { className: sx(changeListStyle), "data-test": "quote-review-change-list", children: changes.map((change) => (jsxRuntime.jsxs("span", { className: sx(changeStyle), "data-test": "quote-review-change", children: [jsxRuntime.jsx("span", { className: sx(changeLabelStyle), children: change.label }), jsxRuntime.jsxs("span", { className: sx(changeValuesStyle), children: [jsxRuntime.jsx("s", { className: sx(changeFromStyle), children: change.from }), jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\u2192" }), jsxRuntime.jsx("strong", { className: sx(changeToStyle), children: change.to })] })] }, change.field))) })] })) : (jsxRuntime.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." }))] }) }), jsxRuntime.jsxs(Drawer, { isOpen: isRejectOpen, onClose: closeReject, position: "right", size: "md", children: [jsxRuntime.jsx(Drawer.Header, { title: `Reject ${quoteId}` }), jsxRuntime.jsx(Drawer.Body, { children: jsxRuntime.jsxs("div", { className: sx(changesBodyStyle), children: [jsxRuntime.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 && (jsxRuntime.jsx("div", { className: sx(reasonsStyle), role: "group", "aria-label": "Common reasons", children: rejectReasons.map((reason) => (jsxRuntime.jsx("button", { type: "button", className: sx(reasonStyle$2), onClick: () => appendReason(reason), "data-test": "quote-review-reason", children: reason }, reason))) })), jsxRuntime.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" })] }) }), jsxRuntime.jsx(Drawer.Footer, { children: jsxRuntime.jsxs("div", { className: sx(drawerFooterStyle), children: [jsxRuntime.jsx(Button, { variant: "secondary", onClick: closeReject, "data-test": "quote-review-cancel-reject", children: "Cancel" }), jsxRuntime.jsx(Button, { variant: "danger", disabled: !note.trim(), onClick: submitReject, "data-test": "quote-review-send-reject", children: "Confirm rejection" })] }) })] })] }));
|
|
17197
17197
|
};
|
|
17198
17198
|
QuoteReviewActions.displayName = 'QuoteReviewActions';
|
|
17199
17199
|
|
|
@@ -17214,7 +17214,7 @@ const summaryStyle$4 = {
|
|
|
17214
17214
|
background: 'var(--color-white, #fff)',
|
|
17215
17215
|
boxShadow: '0 1px 3px rgb(0 0 0 / 5%)',
|
|
17216
17216
|
};
|
|
17217
|
-
const titleStyle$
|
|
17217
|
+
const titleStyle$n = {
|
|
17218
17218
|
label: 'RequestSummary-titleStyle',
|
|
17219
17219
|
fontSize: 18,
|
|
17220
17220
|
fontWeight: 600,
|
|
@@ -17332,7 +17332,7 @@ const RequestSummary = ({ sections, values, enabledSections = {}, submissionInfo
|
|
|
17332
17332
|
const visibleSections = sections.filter(section => enabledSections[section.key] !== false);
|
|
17333
17333
|
const populatedSections = visibleSections.filter((section) => (section.items?.some((item) => hasDisplayValue(resolveItemValue(item, values, `${section.key}_${item.label}`)))
|
|
17334
17334
|
|| section.segments?.some((segment) => segment.items.some((item) => (hasDisplayValue(resolveItemValue(item, values, `${section.key}_${segment.label}_${item.label}`)))))));
|
|
17335
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(summaryStyle$4), className), "data-test": dataTest, children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
17335
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(summaryStyle$4), className), "data-test": dataTest, children: [jsxRuntime.jsx("h2", { className: sx(titleStyle$n), children: title }), submissionInfo && (jsxRuntime.jsxs("div", { className: sx(submissionInfoStyle), children: [jsxRuntime.jsx("span", { className: sx(labelStyle$3), children: "Submitted by" }), jsxRuntime.jsx("span", { className: sx(valueStyle), children: submissionInfo.submittedBy }), jsxRuntime.jsx("span", { className: sx(labelStyle$3), children: "on" }), jsxRuntime.jsx("span", { className: sx(valueStyle), children: submissionInfo.submittedOn })] })), jsxRuntime.jsx("div", { className: sx(sectionsStyle$1), children: populatedSections.map((section) => (jsxRuntime.jsx(SummarySection, { section: section, values: values }, section.key))) }), populatedSections.length === 0 && (jsxRuntime.jsx("p", { className: sx(emptyStyle$9), children: "No services selected" }))] }));
|
|
17336
17336
|
};
|
|
17337
17337
|
RequestSummary.displayName = 'RequestSummary';
|
|
17338
17338
|
|
|
@@ -18250,14 +18250,14 @@ const selectedStyle = {
|
|
|
18250
18250
|
fontWeight: 500,
|
|
18251
18251
|
},
|
|
18252
18252
|
};
|
|
18253
|
-
const nameStyle$
|
|
18253
|
+
const nameStyle$2 = {
|
|
18254
18254
|
label: 'SingleTeamPanelSelector-nameStyle',
|
|
18255
18255
|
overflow: 'hidden',
|
|
18256
18256
|
textOverflow: 'ellipsis',
|
|
18257
18257
|
whiteSpace: 'nowrap',
|
|
18258
18258
|
};
|
|
18259
18259
|
/* The sport code, held a step back from the name. */
|
|
18260
|
-
const codeStyle$
|
|
18260
|
+
const codeStyle$2 = {
|
|
18261
18261
|
label: 'SingleTeamPanelSelector-codeStyle',
|
|
18262
18262
|
flex: '0 0 auto',
|
|
18263
18263
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -18289,7 +18289,7 @@ const SingleTeamPanelSelector = ({ categories, activeCategoryKey, defaultCategor
|
|
|
18289
18289
|
setInternalKey(key);
|
|
18290
18290
|
onCategoryChange?.(key);
|
|
18291
18291
|
};
|
|
18292
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(panelStyle$3), className), role: "dialog", "aria-label": "Book team travel", "data-test": "single-team-panel-selector", ...props, children: [jsxRuntime.jsx("div", { className: sx(tabsStyle$7), children: jsxRuntime.jsx(Segment, { options: options, value: activeCategory?.key ?? '', onChange: changeCategory, fullWidth: true, "aria-label": tabsLabel }) }), jsxRuntime.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) => (jsxRuntime.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: [jsxRuntime.jsx("span", { className: sx(nameStyle$
|
|
18292
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(panelStyle$3), className), role: "dialog", "aria-label": "Book team travel", "data-test": "single-team-panel-selector", ...props, children: [jsxRuntime.jsx("div", { className: sx(tabsStyle$7), children: jsxRuntime.jsx(Segment, { options: options, value: activeCategory?.key ?? '', onChange: changeCategory, fullWidth: true, "aria-label": tabsLabel }) }), jsxRuntime.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) => (jsxRuntime.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: [jsxRuntime.jsx("span", { className: sx(nameStyle$2), children: team.name }), jsxRuntime.jsxs("span", { className: sx(codeStyle$2), children: ["(", team.code, ")"] })] }, team.id)))) : (jsxRuntime.jsx("p", { className: sx(emptyStyle$8), role: "status", children: emptyMessage })) })] }));
|
|
18293
18293
|
};
|
|
18294
18294
|
|
|
18295
18295
|
/**
|
|
@@ -18306,7 +18306,7 @@ const queueStyle = {
|
|
|
18306
18306
|
flexDirection: 'column',
|
|
18307
18307
|
gap: 'var(--space-3)',
|
|
18308
18308
|
};
|
|
18309
|
-
const toolbarStyle$
|
|
18309
|
+
const toolbarStyle$3 = {
|
|
18310
18310
|
label: 'SourcingReviewQueueTable-toolbarStyle',
|
|
18311
18311
|
display: 'flex',
|
|
18312
18312
|
flexWrap: 'wrap',
|
|
@@ -18522,7 +18522,7 @@ const SourcingReviewQueueTable = ({ quotes, selectedQuoteIds, onSelectionChange,
|
|
|
18522
18522
|
render: (_value, quote) => jsxRuntime.jsx(StatusBadge, { status: quote.status }),
|
|
18523
18523
|
},
|
|
18524
18524
|
];
|
|
18525
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(queueStyle), className), "data-test": "sourcing-review-queue", children: [jsxRuntime.jsxs("div", { className: sx(toolbarStyle$
|
|
18525
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(queueStyle), className), "data-test": "sourcing-review-queue", children: [jsxRuntime.jsxs("div", { className: sx(toolbarStyle$3), children: [!hideFilters && (jsxRuntime.jsxs("div", { className: sx(filtersStyle$3), children: [jsxRuntime.jsx(Input, { size: "sm", type: "search", "aria-label": "Search quotes", placeholder: "Search carrier, trip, or school", leftIcon: jsxRuntime.jsx(SearchIcon$1, { size: 16 }), value: searchTerm, onChange: (event) => {
|
|
18526
18526
|
setSearchTerm(event.target.value);
|
|
18527
18527
|
setPage(1);
|
|
18528
18528
|
}, "data-test": "sourcing-queue-search" }), jsxRuntime.jsxs("label", { className: sx(statusFilterStyle), children: [jsxRuntime.jsx("span", { className: sx(statusFilterLabelStyle), children: "Status" }), jsxRuntime.jsx("select", { value: statusFilter, onChange: (event) => {
|
|
@@ -18550,7 +18550,7 @@ const SourcingReviewQueueTable = ({ quotes, selectedQuoteIds, onSelectionChange,
|
|
|
18550
18550
|
* - `.teamItem:hover .chevron` names two generated classes, so the chevron's
|
|
18551
18551
|
* name is resolved here and used as a computed key.
|
|
18552
18552
|
*/
|
|
18553
|
-
const cardStyle$
|
|
18553
|
+
const cardStyle$7 = {
|
|
18554
18554
|
label: 'TeamCard-cardStyle',
|
|
18555
18555
|
overflow: 'hidden',
|
|
18556
18556
|
border: '1px solid var(--border-color-dark, #ababab)',
|
|
@@ -18571,7 +18571,7 @@ const iconStyle = {
|
|
|
18571
18571
|
display: 'flex',
|
|
18572
18572
|
color: 'var(--color-primary, #005eb8)',
|
|
18573
18573
|
};
|
|
18574
|
-
const titleStyle$
|
|
18574
|
+
const titleStyle$m = {
|
|
18575
18575
|
label: 'TeamCard-titleStyle',
|
|
18576
18576
|
margin: 0,
|
|
18577
18577
|
color: 'var(--color-slate, #5c5c5c)',
|
|
@@ -18721,8 +18721,8 @@ const TeamCard = ({ title = 'Administer Teams', icon, teams, onTeamSelect, class
|
|
|
18721
18721
|
return teams;
|
|
18722
18722
|
return teams.filter(team => team.category === activeTab);
|
|
18723
18723
|
}, [teams, activeTab]);
|
|
18724
|
-
const cardClasses = cx(sx(cardStyle$
|
|
18725
|
-
return (jsxRuntime.jsxs("div", { className: cardClasses, "data-test": "team-card", children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$r), children: [jsxRuntime.jsx("span", { className: sx(iconStyle), children: icon || jsxRuntime.jsx(UsersIcon, {}) }), jsxRuntime.jsx("h3", { className: sx(titleStyle$
|
|
18724
|
+
const cardClasses = cx(sx(cardStyle$7), className);
|
|
18725
|
+
return (jsxRuntime.jsxs("div", { className: cardClasses, "data-test": "team-card", children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$r), children: [jsxRuntime.jsx("span", { className: sx(iconStyle), children: icon || jsxRuntime.jsx(UsersIcon, {}) }), jsxRuntime.jsx("h3", { className: sx(titleStyle$m), children: title })] }), jsxRuntime.jsxs("div", { className: sx(bodyStyle$3), children: [jsxRuntime.jsx("div", { className: sx(tabsStyle$6), children: TEAM_GROUPS.map(({ label, key }) => (jsxRuntime.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))) }), jsxRuntime.jsxs("div", { className: sx(listStyle$1), children: [filteredTeams.map((team) => (jsxRuntime.jsxs("button", { type: "button", className: sx(teamItemStyle), "data-test": `team-card-team-${team.id}`, onClick: () => onTeamSelect?.(team), children: [jsxRuntime.jsx("span", { className: sx(teamCodeStyle$1), style: { backgroundColor: getTeamColor(team.code) }, children: team.code }), jsxRuntime.jsx("span", { className: sx(teamNameStyle), children: team.description }), jsxRuntime.jsx("span", { className: sx(chevronStyle$1), children: jsxRuntime.jsx(ChevronRightIcon, {}) })] }, team.id))), filteredTeams.length === 0 && (jsxRuntime.jsx("div", { className: sx(emptyStyle$7), children: "No teams found" }))] })] })] }));
|
|
18726
18726
|
};
|
|
18727
18727
|
TeamCard.displayName = 'TeamCard';
|
|
18728
18728
|
|
|
@@ -19122,7 +19122,7 @@ const TeamContactsPanel = ({ contacts, value, onChange, disabled = false, loadin
|
|
|
19122
19122
|
};
|
|
19123
19123
|
TeamContactsPanel.displayName = 'TeamContactsPanel';
|
|
19124
19124
|
|
|
19125
|
-
const actionsStyle$
|
|
19125
|
+
const actionsStyle$4 = {
|
|
19126
19126
|
label: 'TeamScheduleActions-actionsStyle', margin: '16px 0'
|
|
19127
19127
|
};
|
|
19128
19128
|
const primaryRowStyle = {
|
|
@@ -19211,7 +19211,7 @@ const secondaryRowStyle = {
|
|
|
19211
19211
|
};
|
|
19212
19212
|
|
|
19213
19213
|
/** Exact presentational counterpart of Hub's Team Schedule action controls. */
|
|
19214
|
-
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(actionsStyle$
|
|
19214
|
+
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(actionsStyle$4), className), "data-test": "team-schedule-actions", children: [jsxRuntime.jsxs("div", { className: sx(primaryRowStyle), children: [!isCompactView ? (onViewSchedule && jsxRuntime.jsx(Button, { "data-test": "team-schedule-view-edit", size: "sm", onClick: onViewSchedule, children: "View/Edit Schedule" })) : (onBack && jsxRuntime.jsx(Button, { "data-test": "team-schedule-back", size: "sm", onClick: onBack, leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 14 }), children: "Back" })), jsxRuntime.jsxs("div", { className: sx(seasonNavigatorStyle), children: [onPreviousSeason && jsxRuntime.jsx(Button, { "data-test": "team-schedule-previous-season", variant: "secondary", size: "sm", square: true, "aria-label": "Previous Season", disabled: previousSeasonDisabled, onClick: onPreviousSeason, children: jsxRuntime.jsx(ChevronLeftIcon, { size: 18 }) }), jsxRuntime.jsxs("div", { className: sx(seasonLabelStyle), children: [jsxRuntime.jsx("span", { className: sx(seasonValueStyle), children: seasonLabel }), !!seasonOptions.length && onSeasonChange && (jsxRuntime.jsx("select", { "data-test": "team-schedule-season", "aria-label": "Season", value: seasonValue, onChange: (event) => onSeasonChange(event.target.value), children: seasonOptions.map((option) => jsxRuntime.jsx("option", { value: option.value, children: option.label }, option.value)) }))] }), onNextSeason && jsxRuntime.jsx(Button, { "data-test": "team-schedule-next-season", variant: "secondary", size: "sm", square: true, "aria-label": "Next Season", onClick: onNextSeason, children: jsxRuntime.jsx(ChevronRightIcon$1, { size: 18 }) })] }), onExport && jsxRuntime.jsx(Button, { "data-test": "team-schedule-export", variant: "outline", size: "sm", loading: exporting, disabled: exportDisabled, rightIcon: jsxRuntime.jsx(ArrowUpRightIcon, { size: 14 }), onClick: onExport, children: "Export XLS" }), jsxRuntime.jsxs("span", { className: sx(tripCountStyle), "data-test": "team-schedule-trip-count", children: [tripCount, " trips displayed"] })] }), isCompactView && (onGroupTravelRequest || onMergeEvents || onUnmergeEvents) && (jsxRuntime.jsxs("div", { className: sx(secondaryRowStyle), children: [onGroupTravelRequest && jsxRuntime.jsx(Button, { "data-test": "team-schedule-group-travel-request", variant: "outline", size: "sm", disabled: groupTravelDisabled, onClick: onGroupTravelRequest, children: "Group Travel Request" }), onMergeEvents && jsxRuntime.jsx(Button, { "data-test": "team-schedule-merge-events", variant: "outline", size: "sm", disabled: mergeDisabled, loading: merging, onClick: onMergeEvents, children: "Merge Events" }), onUnmergeEvents && jsxRuntime.jsx(Button, { "data-test": "team-schedule-unmerge-events", variant: "outline", size: "sm", disabled: unmergeDisabled, loading: unmerging, onClick: onUnmergeEvents, children: "Unmerge Events" })] }))] }));
|
|
19215
19215
|
|
|
19216
19216
|
//#region src/FlexRender.tsx
|
|
19217
19217
|
function isReactComponent(component) {
|
|
@@ -26002,7 +26002,7 @@ const addRowStyle = {
|
|
|
26002
26002
|
paddingLeft: 0,
|
|
26003
26003
|
},
|
|
26004
26004
|
};
|
|
26005
|
-
const toolbarStyle$
|
|
26005
|
+
const toolbarStyle$2 = {
|
|
26006
26006
|
label: 'TeamScheduleCompactTable-toolbarStyle',
|
|
26007
26007
|
display: 'flex',
|
|
26008
26008
|
alignItems: 'center',
|
|
@@ -26013,7 +26013,7 @@ const toolbarStyle$1 = {
|
|
|
26013
26013
|
flexWrap: 'wrap',
|
|
26014
26014
|
},
|
|
26015
26015
|
};
|
|
26016
|
-
const searchStyle = {
|
|
26016
|
+
const searchStyle$1 = {
|
|
26017
26017
|
label: 'TeamScheduleCompactTable-searchStyle',
|
|
26018
26018
|
display: 'inline-flex',
|
|
26019
26019
|
alignItems: 'center',
|
|
@@ -26432,7 +26432,7 @@ const TeamScheduleCompactTable = ({ data, rows, tripHeaders = DEFAULT_TRIP_HEADE
|
|
|
26432
26432
|
return (jsxRuntime.jsxs("div", {
|
|
26433
26433
|
// The stylesheet never carried a `.schedule` rule, so this wrapper only
|
|
26434
26434
|
// ever wore the caller's class.
|
|
26435
|
-
className: className, "data-test": "team-schedule-editor", children: [(enableGlobalFilter || enableColumnVisibility) && (jsxRuntime.jsxs("div", { className: sx(toolbarStyle$
|
|
26435
|
+
className: className, "data-test": "team-schedule-editor", children: [(enableGlobalFilter || enableColumnVisibility) && (jsxRuntime.jsxs("div", { className: sx(toolbarStyle$2), children: [enableGlobalFilter ? (jsxRuntime.jsxs("label", { className: sx(searchStyle$1), children: [jsxRuntime.jsx(SearchIcon$1, { size: 16 }), jsxRuntime.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" })] })) : (jsxRuntime.jsx("span", {})), enableColumnVisibility && (jsxRuntime.jsxs("details", { className: sx(columnMenuStyle), "data-test": "team-schedule-column-menu", children: [jsxRuntime.jsxs("summary", { children: ["Columns ", jsxRuntime.jsx(ChevronDownIcon$1, { size: 14 })] }), jsxRuntime.jsx("div", { className: sx(columnMenuListStyle), children: table
|
|
26436
26436
|
.getAllLeafColumns()
|
|
26437
26437
|
.filter((column) => column.getCanHide())
|
|
26438
26438
|
.map((column) => (jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "checkbox", className: sx(checkboxStyle), checked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() }), typeof column.columnDef.header === "string" &&
|
|
@@ -27018,7 +27018,7 @@ const TeamScheduleEditor = ({ rows, initialRows = [], opponentOptions = [], onCh
|
|
|
27018
27018
|
/** The two responsive breakpoints, spelled exactly as the stylesheet had them. */
|
|
27019
27019
|
const COMPACT = '@media (max-width: 900px)';
|
|
27020
27020
|
const NARROW = '@media (max-width: 640px)';
|
|
27021
|
-
const toolbarStyle = {
|
|
27021
|
+
const toolbarStyle$1 = {
|
|
27022
27022
|
label: 'TeamTravelCalendarViews-toolbarStyle',
|
|
27023
27023
|
display: 'flex',
|
|
27024
27024
|
minWidth: 0,
|
|
@@ -27897,7 +27897,7 @@ const sportColor = (sportCode) => {
|
|
|
27897
27897
|
* Period controls shared by the calendar views: previous, next, today, and month/week.
|
|
27898
27898
|
* Stateless -- the host owns the active date and passes the label back in.
|
|
27899
27899
|
*/
|
|
27900
|
-
const TeamTravelCalendarToolbar = ({ duration, label = '', navigation, onDurationChange, onToday, onPrevious, onNext, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(toolbarStyle), className), "data-test": "calendar-toolbar", children: [jsxRuntime.jsx("button", { type: "button", className: sx(todayButtonStyle), onClick: onToday, "data-test": "calendar-today", children: "Today" }), jsxRuntime.jsx(SegmentedSelector, { value: duration, size: "sm", ariaLabel: "Calendar duration", onChange: (value) => onDurationChange?.(value), options: [{ id: 'month', label: 'Month' }, { id: 'week', label: 'Week' }] }), navigation ?? (jsxRuntime.jsxs("div", { className: sx(periodNavigationStyle), children: [jsxRuntime.jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Previous ${duration}`, onClick: onPrevious, children: jsxRuntime.jsx(ChevronLeft$1, {}) }), jsxRuntime.jsx("button", { type: "button", className: sx(periodButtonStyle), children: label }), jsxRuntime.jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Next ${duration}`, onClick: onNext, children: jsxRuntime.jsx(ChevronRight$2, {}) })] }))] }));
|
|
27900
|
+
const TeamTravelCalendarToolbar = ({ duration, label = '', navigation, onDurationChange, onToday, onPrevious, onNext, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(toolbarStyle$1), className), "data-test": "calendar-toolbar", children: [jsxRuntime.jsx("button", { type: "button", className: sx(todayButtonStyle), onClick: onToday, "data-test": "calendar-today", children: "Today" }), jsxRuntime.jsx(SegmentedSelector, { value: duration, size: "sm", ariaLabel: "Calendar duration", onChange: (value) => onDurationChange?.(value), options: [{ id: 'month', label: 'Month' }, { id: 'week', label: 'Week' }] }), navigation ?? (jsxRuntime.jsxs("div", { className: sx(periodNavigationStyle), children: [jsxRuntime.jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Previous ${duration}`, onClick: onPrevious, children: jsxRuntime.jsx(ChevronLeft$1, {}) }), jsxRuntime.jsx("button", { type: "button", className: sx(periodButtonStyle), children: label }), jsxRuntime.jsx("button", { type: "button", className: sx(navigationButtonStyle), "aria-label": `Next ${duration}`, onClick: onNext, children: jsxRuntime.jsx(ChevronRight$2, {}) })] }))] }));
|
|
27901
27901
|
const getVisibleDates = (activeDate, duration) => {
|
|
27902
27902
|
const active = parseDate(activeDate);
|
|
27903
27903
|
if (duration === 'week') {
|
|
@@ -28042,7 +28042,7 @@ const moveTeamTravelCalendarPeriod = (activeDate, duration, amount) => {
|
|
|
28042
28042
|
* later. Injected classes tie there, so the winner would be whichever object was
|
|
28043
28043
|
* injected first. Doubling the selector on the override restores the ranking.
|
|
28044
28044
|
*/
|
|
28045
|
-
const formStyle$
|
|
28045
|
+
const formStyle$5 = {
|
|
28046
28046
|
label: 'TeamManagementForms-formStyle',
|
|
28047
28047
|
display: 'flex',
|
|
28048
28048
|
flexDirection: 'column',
|
|
@@ -28074,7 +28074,7 @@ const threeColumnGridStyle = {
|
|
|
28074
28074
|
gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
|
|
28075
28075
|
},
|
|
28076
28076
|
};
|
|
28077
|
-
const actionsStyle$
|
|
28077
|
+
const actionsStyle$3 = {
|
|
28078
28078
|
label: 'TeamManagementForms-actionsStyle',
|
|
28079
28079
|
display: 'flex',
|
|
28080
28080
|
justifyContent: 'flex-end',
|
|
@@ -28245,10 +28245,10 @@ const useManagedValues = (controlledValues, initialValues, onChange) => {
|
|
|
28245
28245
|
};
|
|
28246
28246
|
const numericValue$1 = (value) => value === '' ? '' : Number(value);
|
|
28247
28247
|
const FormShell = ({ ariaLabel, children, className = '', disabled = false, onCancel, onSubmit, showActions = true, values, }) => {
|
|
28248
|
-
const content = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [children, showActions && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$
|
|
28248
|
+
const content = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [children, showActions && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$3), children: [jsxRuntime.jsx(Button, { type: "button", variant: "secondary", onClick: onCancel, disabled: disabled, children: "Cancel" }), jsxRuntime.jsx(Button, { type: "submit", disabled: disabled, children: "Save" })] }))] }));
|
|
28249
28249
|
if (!showActions)
|
|
28250
|
-
return jsxRuntime.jsx("div", { className: cx(sx(formStyle$
|
|
28251
|
-
return (jsxRuntime.jsx("form", { "aria-label": ariaLabel, className: cx(sx(formStyle$
|
|
28250
|
+
return jsxRuntime.jsx("div", { className: cx(sx(formStyle$5), className), children: content });
|
|
28251
|
+
return (jsxRuntime.jsx("form", { "aria-label": ariaLabel, className: cx(sx(formStyle$5), className), onSubmit: (event) => {
|
|
28252
28252
|
event.preventDefault();
|
|
28253
28253
|
onSubmit?.(values);
|
|
28254
28254
|
}, children: content }));
|
|
@@ -28402,11 +28402,11 @@ const IMPORT_COPY = {
|
|
|
28402
28402
|
const TeamImportForm = ({ kind, onSubmit, onCancel, disabled = false, className = '' }) => {
|
|
28403
28403
|
const [file, setFile] = React.useState(null);
|
|
28404
28404
|
const copy = IMPORT_COPY[kind];
|
|
28405
|
-
return (jsxRuntime.jsxs("form", { "aria-label": `Import ${kind}`, className: cx(sx(formStyle$
|
|
28405
|
+
return (jsxRuntime.jsxs("form", { "aria-label": `Import ${kind}`, className: cx(sx(formStyle$5), className), onSubmit: (event) => {
|
|
28406
28406
|
event.preventDefault();
|
|
28407
28407
|
if (file)
|
|
28408
28408
|
onSubmit?.(file);
|
|
28409
|
-
}, children: [jsxRuntime.jsx("ol", { className: sx(instructionsStyle), children: copy.instructions.map((instruction, index) => jsxRuntime.jsxs("li", { children: [index + 1, ". ", instruction] }, instruction)) }), jsxRuntime.jsx("a", { className: sx(sampleLinkStyle), href: `/${copy.sample}`, download: true, children: copy.sample }), jsxRuntime.jsxs("label", { className: sx(fileFieldStyle), children: [jsxRuntime.jsx(UploadIcon, { size: 24 }), jsxRuntime.jsx("span", { children: file?.name ?? 'Choose an Excel spreadsheet' }), jsxRuntime.jsx("input", { "aria-label": "Spreadsheet file", type: "file", accept: ".xlsx,.xls", onChange: (event) => setFile(event.target.files?.[0] ?? null), required: true, disabled: disabled })] }), jsxRuntime.jsxs("div", { className: sx(actionsStyle$
|
|
28409
|
+
}, children: [jsxRuntime.jsx("ol", { className: sx(instructionsStyle), children: copy.instructions.map((instruction, index) => jsxRuntime.jsxs("li", { children: [index + 1, ". ", instruction] }, instruction)) }), jsxRuntime.jsx("a", { className: sx(sampleLinkStyle), href: `/${copy.sample}`, download: true, children: copy.sample }), jsxRuntime.jsxs("label", { className: sx(fileFieldStyle), children: [jsxRuntime.jsx(UploadIcon, { size: 24 }), jsxRuntime.jsx("span", { children: file?.name ?? 'Choose an Excel spreadsheet' }), jsxRuntime.jsx("input", { "aria-label": "Spreadsheet file", type: "file", accept: ".xlsx,.xls", onChange: (event) => setFile(event.target.files?.[0] ?? null), required: true, disabled: disabled })] }), jsxRuntime.jsxs("div", { className: sx(actionsStyle$3), children: [jsxRuntime.jsx(Button, { type: "button", variant: "secondary", onClick: onCancel, disabled: disabled, children: "Cancel" }), jsxRuntime.jsx(Button, { type: "submit", disabled: disabled || !file, children: "Import" })] })] }));
|
|
28410
28410
|
};
|
|
28411
28411
|
|
|
28412
28412
|
/**
|
|
@@ -28460,7 +28460,7 @@ const TravelSummaryMetrics = ({ tripsTraveled, remainingTrips, seasonTripCosts,
|
|
|
28460
28460
|
};
|
|
28461
28461
|
|
|
28462
28462
|
/** The form column: header, content/sections and footer stacked with one gap. */
|
|
28463
|
-
const formStyle$
|
|
28463
|
+
const formStyle$4 = {
|
|
28464
28464
|
label: 'TravelerForm-formStyle',
|
|
28465
28465
|
display: 'flex',
|
|
28466
28466
|
flexDirection: 'column',
|
|
@@ -28488,7 +28488,7 @@ const headerStyle$p = {
|
|
|
28488
28488
|
flexDirection: 'column',
|
|
28489
28489
|
gap: 'var(--space-1)',
|
|
28490
28490
|
};
|
|
28491
|
-
const titleStyle$
|
|
28491
|
+
const titleStyle$l = {
|
|
28492
28492
|
label: 'TravelerForm-titleStyle',
|
|
28493
28493
|
fontSize: 'var(--text-lg)',
|
|
28494
28494
|
fontWeight: 'var(--font-semibold)',
|
|
@@ -28551,11 +28551,84 @@ const footerStyle$2 = {
|
|
|
28551
28551
|
* TravelerForm - Form layout for editing traveler/roster member details
|
|
28552
28552
|
*/
|
|
28553
28553
|
const TravelerForm = ({ values = {}, title, subtitle, children, renderNameSection, renderDetailsSection, renderPreferencesSection, footer, isLoading = false, className = '', }) => {
|
|
28554
|
-
const formClasses = cx(sx(formStyle$
|
|
28555
|
-
return (jsxRuntime.jsxs("div", { className: formClasses, children: [(title || subtitle) && (jsxRuntime.jsxs("div", { className: sx(headerStyle$p), children: [title && jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
28554
|
+
const formClasses = cx(sx(formStyle$4), isLoading && sx(loadingStyle$1), className);
|
|
28555
|
+
return (jsxRuntime.jsxs("div", { className: formClasses, children: [(title || subtitle) && (jsxRuntime.jsxs("div", { className: sx(headerStyle$p), children: [title && jsxRuntime.jsx("h2", { className: sx(titleStyle$l), children: title }), subtitle && jsxRuntime.jsx("p", { className: sx(subtitleStyle$5), children: subtitle })] })), children ? (jsxRuntime.jsx("div", { className: sx(contentStyle$4), children: children })) : (jsxRuntime.jsxs("div", { className: sx(sectionsStyle), children: [renderNameSection && (jsxRuntime.jsxs("div", { className: sx(sectionStyle$4), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle$8), children: "Name" }), jsxRuntime.jsx("div", { className: sx(sectionContentStyle), children: renderNameSection(values) })] })), renderDetailsSection && (jsxRuntime.jsxs("div", { className: sx(sectionStyle$4), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle$8), children: "Details" }), jsxRuntime.jsx("div", { className: sx(sectionContentStyle), children: renderDetailsSection(values) })] })), renderPreferencesSection && (jsxRuntime.jsxs("div", { className: sx(sectionStyle$4), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle$8), children: "Travel Preferences" }), jsxRuntime.jsx("div", { className: sx(sectionContentStyle), children: renderPreferencesSection(values) })] }))] })), footer && (jsxRuntime.jsx("div", { className: sx(footerStyle$2), children: footer }))] }));
|
|
28556
28556
|
};
|
|
28557
28557
|
TravelerForm.displayName = 'TravelerForm';
|
|
28558
28558
|
|
|
28559
|
+
const formStyle$3 = {
|
|
28560
|
+
label: 'ViHeaderForm-formStyle',
|
|
28561
|
+
display: 'flex',
|
|
28562
|
+
flexDirection: 'column',
|
|
28563
|
+
gap: 'var(--space-6)',
|
|
28564
|
+
fontFamily: 'var(--font-family-base)',
|
|
28565
|
+
color: 'var(--fg-1)',
|
|
28566
|
+
};
|
|
28567
|
+
const noteStyle$2 = {
|
|
28568
|
+
label: 'ViHeaderForm-noteStyle',
|
|
28569
|
+
margin: 0,
|
|
28570
|
+
fontSize: 'var(--fs-sm)',
|
|
28571
|
+
color: 'var(--fg-3)',
|
|
28572
|
+
lineHeight: 1.5,
|
|
28573
|
+
};
|
|
28574
|
+
const eyebrowNoteStyle = {
|
|
28575
|
+
label: 'ViHeaderForm-eyebrowNoteStyle',
|
|
28576
|
+
margin: 0,
|
|
28577
|
+
padding: 'var(--space-2) var(--space-3)',
|
|
28578
|
+
borderLeft: '3px solid var(--color-accent-ink)',
|
|
28579
|
+
background: 'var(--bg-subtle)',
|
|
28580
|
+
borderRadius: 'var(--radius-md)',
|
|
28581
|
+
fontSize: 'var(--fs-sm)',
|
|
28582
|
+
color: 'var(--fg-2)',
|
|
28583
|
+
};
|
|
28584
|
+
const errorStyle$1 = {
|
|
28585
|
+
label: 'ViHeaderForm-errorStyle',
|
|
28586
|
+
margin: 0,
|
|
28587
|
+
fontSize: 'var(--fs-sm)',
|
|
28588
|
+
fontWeight: 'var(--fw-medium)',
|
|
28589
|
+
color: 'var(--color-error)',
|
|
28590
|
+
};
|
|
28591
|
+
const actionsStyle$2 = {
|
|
28592
|
+
label: 'ViHeaderForm-actionsStyle',
|
|
28593
|
+
display: 'flex',
|
|
28594
|
+
justifyContent: 'flex-end',
|
|
28595
|
+
gap: 'var(--space-3)',
|
|
28596
|
+
paddingTop: 'var(--space-4)',
|
|
28597
|
+
borderTop: '1px solid var(--border-color)',
|
|
28598
|
+
};
|
|
28599
|
+
|
|
28600
|
+
/**
|
|
28601
|
+
* Editor for a virtual-invoice header: who the invoice comes from, how to reach
|
|
28602
|
+
* them, and the survey and message that go with it. An account or a branch is
|
|
28603
|
+
* required, and a branch header wins over its account's.
|
|
28604
|
+
*/
|
|
28605
|
+
const ViHeaderForm = ({ value, onSave, onCancel, saveLabel = 'Save header', className = '', }) => {
|
|
28606
|
+
const [draft, setDraft] = React.useState(value);
|
|
28607
|
+
const [error, setError] = React.useState('');
|
|
28608
|
+
const field = (key, label, extra = {}) => (jsxRuntime.jsx(FormField, { label: label, inputProps: {
|
|
28609
|
+
value: draft[key],
|
|
28610
|
+
onChange: (e) => setDraft({ ...draft, [key]: e.target.value }),
|
|
28611
|
+
'data-test': `vi-header-${String(key).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)}`,
|
|
28612
|
+
...extra,
|
|
28613
|
+
} }));
|
|
28614
|
+
const handleSubmit = (e) => {
|
|
28615
|
+
e.preventDefault();
|
|
28616
|
+
if (!draft.accountId.trim() && !draft.branch.trim()) {
|
|
28617
|
+
setError('Enter an Account ID or a Branch.');
|
|
28618
|
+
return;
|
|
28619
|
+
}
|
|
28620
|
+
setError('');
|
|
28621
|
+
onSave?.(draft);
|
|
28622
|
+
};
|
|
28623
|
+
return (jsxRuntime.jsxs("form", { className: cx(sx(formStyle$3), className), onSubmit: handleSubmit, noValidate: true, children: [jsxRuntime.jsx("p", { className: sx(eyebrowNoteStyle), children: "Enter an Account OR a Branch. The header configured for a branch takes precedence." }), jsxRuntime.jsxs(FormSection, { title: "Applies to", children: [jsxRuntime.jsxs(FormRow, { columns: 2, stackOnMobile: false, children: [field('accountId', 'Account ID'), field('branch', 'Branch')] }), error && (jsxRuntime.jsx("p", { className: sx(errorStyle$1), role: "alert", children: error }))] }), jsxRuntime.jsxs(FormSection, { title: "Company & contact", children: [field('companyName', 'Company name'), field('address', 'Address'), jsxRuntime.jsxs(FormRow, { columns: 3, stackOnMobile: false, children: [field('city', 'City'), field('state', 'State'), field('zipCode', 'Zip code')] }), jsxRuntime.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')] })] }), jsxRuntime.jsxs(FormSection, { title: "Web & hours", children: [field('defaultWebsite', 'Default website'), jsxRuntime.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')] }), jsxRuntime.jsxs(FormSection, { title: "Survey Sparrow", children: [field('agentSurveyEndpoint', 'Agent survey API endpoint'), field('onlineSurveyEndpoint', 'Online survey API endpoint'), jsxRuntime.jsx(FormRow, { columns: 3, stackOnMobile: false, children: field('surveyDelayDays', 'Survey delay (days)', { type: 'number', min: 0 }) })] }), jsxRuntime.jsx(FormSection, { title: "Invoice message", children: jsxRuntime.jsx(FormField, { label: "Description", helperText: "Printed on the invoice. Paste one line at a time.", as: "textarea", textareaProps: {
|
|
28624
|
+
value: draft.description,
|
|
28625
|
+
rows: 5,
|
|
28626
|
+
onChange: (e) => setDraft({ ...draft, description: e.target.value }),
|
|
28627
|
+
'data-test': 'vi-header-description',
|
|
28628
|
+
} }) }), jsxRuntime.jsxs("div", { className: sx(actionsStyle$2), children: [jsxRuntime.jsx(Button, { type: "button", variant: "outline", onClick: onCancel, "data-test": "vi-header-cancel", children: "Cancel" }), jsxRuntime.jsx(Button, { type: "submit", variant: "primary", "data-test": "vi-header-save", children: saveLabel })] })] }));
|
|
28629
|
+
};
|
|
28630
|
+
ViHeaderForm.displayName = 'ViHeaderForm';
|
|
28631
|
+
|
|
28559
28632
|
/**
|
|
28560
28633
|
* TripTable's compiled rules.
|
|
28561
28634
|
*
|
|
@@ -28890,7 +28963,7 @@ const TripTable = ({ trips, variant = 'current', density = 'comfortable', vendor
|
|
|
28890
28963
|
* `.card:hover .chevron`), so the icon and the chevron are declared first and
|
|
28891
28964
|
* their generated class names resolved into `cardStyle` as computed keys.
|
|
28892
28965
|
*/
|
|
28893
|
-
const pageStyle$
|
|
28966
|
+
const pageStyle$u = {
|
|
28894
28967
|
label: 'AdministrationPage-pageStyle',
|
|
28895
28968
|
color: 'var(--color-ink)',
|
|
28896
28969
|
};
|
|
@@ -28945,7 +29018,7 @@ const chevronStyle = {
|
|
|
28945
29018
|
flex: '0 0 auto',
|
|
28946
29019
|
color: 'var(--border-color-dark)',
|
|
28947
29020
|
};
|
|
28948
|
-
const cardStyle$
|
|
29021
|
+
const cardStyle$6 = {
|
|
28949
29022
|
label: 'AdministrationPage-cardStyle',
|
|
28950
29023
|
display: 'flex',
|
|
28951
29024
|
alignItems: 'center',
|
|
@@ -29027,10 +29100,10 @@ const AdministrationPage = ({ activeTab = 'system', enabledTabs = ADMINISTRATION
|
|
|
29027
29100
|
const resolvedActiveTab = visibleTabs.some((tab) => tab.key === activeTab)
|
|
29028
29101
|
? activeTab
|
|
29029
29102
|
: visibleTabs[0]?.key;
|
|
29030
|
-
return jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29103
|
+
return jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$u), className), children: [jsxRuntime.jsx("header", { className: sx(headerStyle$n), children: jsxRuntime.jsx("h1", { children: "Administration\u00A0" }) }), visibleTabs.length > 0 && (jsxRuntime.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' ? (jsxRuntime.jsx("div", { className: sx(cardsStyle$1), children: resolvedCards.map((card) => (jsxRuntime.jsxs("button", { type: "button", className: sx(cardStyle$6), onClick: () => onCardClick?.(card), children: [jsxRuntime.jsx("span", { className: sx(cardIconStyle$1), children: card.icon }), jsxRuntime.jsxs("span", { className: sx(cardCopyStyle), children: [jsxRuntime.jsx("span", { className: sx(cardTitleStyle$2), children: card.title }), jsxRuntime.jsx("span", { className: sx(cardDescriptionStyle$1), children: card.description })] }), jsxRuntime.jsx(ChevronRightIcon$1, { className: sx(chevronStyle), size: 14 })] }, card.key))) })) : resolvedActiveTab === 'client' ? (jsxRuntime.jsx("p", { className: sx(comingSoonStyle), children: "Client administration settings coming soon." })) : (jsxRuntime.jsx("p", { className: sx(comingSoonStyle), "data-test": "administration-empty-tabs", children: "No administration sections are available." })))] });
|
|
29031
29104
|
};
|
|
29032
29105
|
|
|
29033
|
-
const pageStyle$
|
|
29106
|
+
const pageStyle$t = {
|
|
29034
29107
|
label: 'AgentGroupTravelRequestsPage-pageStyle',
|
|
29035
29108
|
display: 'flex',
|
|
29036
29109
|
flexDirection: 'column',
|
|
@@ -29046,7 +29119,7 @@ const breadcrumbStyle$9 = {
|
|
|
29046
29119
|
alignSelf: 'flex-start',
|
|
29047
29120
|
paddingLeft: '0 !important',
|
|
29048
29121
|
};
|
|
29049
|
-
const titleStyle$
|
|
29122
|
+
const titleStyle$k = {
|
|
29050
29123
|
label: 'AgentGroupTravelRequestsPage-titleStyle',
|
|
29051
29124
|
margin: 0,
|
|
29052
29125
|
color: 'var(--fg-1)',
|
|
@@ -29067,12 +29140,12 @@ const quickLinksStyle = {
|
|
|
29067
29140
|
};
|
|
29068
29141
|
|
|
29069
29142
|
/** Hub's agent-facing Group Travel Request screen — the "Book a Trip" quick links plus the open-requests list. */
|
|
29070
|
-
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29143
|
+
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$t), className), "data-test": "agent-gtr-page", children: [jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$9), onClick: onBackToBookATrip, children: "Book a Trip" }), jsxRuntime.jsx("h1", { className: sx(titleStyle$k), children: title }), jsxRuntime.jsxs("ul", { className: sx(quickLinksStyle), children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onSubmitNewRequest, children: "Submit a new group travel request" }) }), isStmEmployee && (jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onSubmitAgentRequest, children: "Submit a new group travel request (agent use only)" }) })), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onSearchPastRequests, children: "Search past travel requests/Non-agent-only requests" }) }), isStmEmployee && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onShowCdsRequests, children: "Show all open CDS group travel requests" }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onShowActionableItems, children: "Show this week's actionable items" }) }), jsxRuntime.jsx("li", { children: jsxRuntime.jsx(Button, { variant: "ghost", onClick: onAdministerViews, children: "Administer your views" }) })] }))] }), jsxRuntime.jsx(AgentGroupTravelRequestsTable, { requests: requests, sports: sports, views: views, today: today, onOpenRequest: onOpenRequest, onViewMasterTrip: onViewMasterTrip, onDeleteRequest: onDeleteRequest, onCopyPnr: onCopyPnr, onToggleDueStatus: onToggleDueStatus, onSubmittedDateChange: onSubmittedDateChange, onQuoteSentDateChange: onQuoteSentDateChange })] }));
|
|
29071
29144
|
|
|
29072
29145
|
/** CarrierProfilePage's compiled rules. A straight translation: the only
|
|
29073
29146
|
* overrides are the mobile media query, which is nested into the two styles
|
|
29074
29147
|
* it repadded, and an at-rule always outranks the declaration beside it. */
|
|
29075
|
-
const pageStyle$
|
|
29148
|
+
const pageStyle$s = {
|
|
29076
29149
|
label: 'CarrierProfilePage-pageStyle',
|
|
29077
29150
|
display: 'flex',
|
|
29078
29151
|
flexDirection: 'column',
|
|
@@ -29093,7 +29166,7 @@ const headerStyle$m = {
|
|
|
29093
29166
|
flexDirection: 'column',
|
|
29094
29167
|
gap: 'var(--space-1)',
|
|
29095
29168
|
};
|
|
29096
|
-
const titleStyle$
|
|
29169
|
+
const titleStyle$j = {
|
|
29097
29170
|
label: 'CarrierProfilePage-titleStyle',
|
|
29098
29171
|
margin: 0,
|
|
29099
29172
|
color: 'var(--fg-1)',
|
|
@@ -29159,7 +29232,7 @@ const formStyle$2 = {
|
|
|
29159
29232
|
const saveStyle = {
|
|
29160
29233
|
label: 'CarrierProfilePage-saveStyle', alignSelf: 'flex-start'
|
|
29161
29234
|
};
|
|
29162
|
-
const rowActionsStyle = {
|
|
29235
|
+
const rowActionsStyle$1 = {
|
|
29163
29236
|
label: 'CarrierProfilePage-rowActionsStyle',
|
|
29164
29237
|
display: 'inline-flex',
|
|
29165
29238
|
gap: 'var(--space-1)',
|
|
@@ -29291,7 +29364,7 @@ const CarrierProfilePage = ({ carrierName, preferences: initialPreferences, cate
|
|
|
29291
29364
|
key: 'contactId',
|
|
29292
29365
|
label: 'Actions',
|
|
29293
29366
|
align: 'right',
|
|
29294
|
-
render: (_value, contact) => (jsxRuntime.jsxs("span", { className: sx(rowActionsStyle), children: [canEditContacts && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${contact.name}`, onClick: () => onEditContact?.(contact.contactId), "data-test": "carrier-contact-edit", children: jsxRuntime.jsx(EditIcon$2, { size: 16 }) })), canDeleteContacts && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${contact.name}`, onClick: () => onDeleteContact?.(contact.contactId), "data-test": "carrier-contact-delete", children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29367
|
+
render: (_value, contact) => (jsxRuntime.jsxs("span", { className: sx(rowActionsStyle$1), children: [canEditContacts && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${contact.name}`, onClick: () => onEditContact?.(contact.contactId), "data-test": "carrier-contact-edit", children: jsxRuntime.jsx(EditIcon$2, { size: 16 }) })), canDeleteContacts && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${contact.name}`, onClick: () => onDeleteContact?.(contact.contactId), "data-test": "carrier-contact-delete", children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29295
29368
|
}] : []),
|
|
29296
29369
|
];
|
|
29297
29370
|
const aircraftColumns = [
|
|
@@ -29320,15 +29393,15 @@ const CarrierProfilePage = ({ carrierName, preferences: initialPreferences, cate
|
|
|
29320
29393
|
key: 'aircraftId',
|
|
29321
29394
|
label: 'Actions',
|
|
29322
29395
|
align: 'right',
|
|
29323
|
-
render: (_value, item) => (jsxRuntime.jsxs("span", { className: sx(rowActionsStyle), children: [canEditAircraft && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${item.name}`, onClick: () => onEditAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-edit", children: jsxRuntime.jsx(EditIcon$2, { size: 16 }) })), canDeleteAircraft && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${item.name}`, onClick: () => onDeleteAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-delete", children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29396
|
+
render: (_value, item) => (jsxRuntime.jsxs("span", { className: sx(rowActionsStyle$1), children: [canEditAircraft && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${item.name}`, onClick: () => onEditAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-edit", children: jsxRuntime.jsx(EditIcon$2, { size: 16 }) })), canDeleteAircraft && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${item.name}`, onClick: () => onDeleteAircraft?.(item.aircraftId), "data-test": "carrier-aircraft-delete", children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }))] })),
|
|
29324
29397
|
}] : []),
|
|
29325
29398
|
];
|
|
29326
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29399
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$s), className), "data-test": "carrier-profile-page", children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$8), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "carrier-profile-back", children: backLabel })), jsxRuntime.jsxs("header", { className: sx(headerStyle$m), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$j), children: "My Profile" }), jsxRuntime.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." })] }), jsxRuntime.jsx(Segment, { options: TAB_OPTIONS$2, value: tab, onChange: selectTab, "aria-label": "Profile section", className: sx(tabsStyle$4) }), tab === 'profile' && (jsxRuntime.jsxs("section", { className: sx(panelStyle$1), "aria-label": "Preferences", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$7), children: "Preferences" }), jsxRuntime.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." }), jsxRuntime.jsxs("div", { className: sx(formStyle$2), children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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 && (jsxRuntime.jsx(Button, { className: sx(saveStyle), onClick: () => onSavePreferences?.(preferences), "data-test": "carrier-save-preferences", children: "Save" }))] })), tab === 'contacts' && (jsxRuntime.jsxs("section", { className: sx(panelStyle$1), "aria-label": "Contacts", children: [jsxRuntime.jsxs("h2", { className: sx(sectionTitleStyle$7), children: [carrierName, " contacts"] }), jsxRuntime.jsx(Table, { columns: contactColumns, data: contacts, rowKey: "contactId", emptyContent: jsxRuntime.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 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("h3", { className: sx(subTitleStyle), children: "Add a contact" }), jsxRuntime.jsxs("div", { className: sx(formStyle$2), children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" })] }), jsxRuntime.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" }), jsxRuntime.jsx(Button, { className: sx(saveStyle), onClick: submitContact, "data-test": "carrier-contact-submit", children: "Add contact" })] }))] })), tab === 'aircraft' && (jsxRuntime.jsxs("section", { className: sx(panelStyle$1), "aria-label": "Aircraft", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$7), children: "Aircraft and seat maps" }), jsxRuntime.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." }), jsxRuntime.jsx(Table, { columns: aircraftColumns, data: aircraft, rowKey: "aircraftId", emptyContent: jsxRuntime.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." }) })] }))] }));
|
|
29327
29400
|
};
|
|
29328
29401
|
CarrierProfilePage.displayName = 'CarrierProfilePage';
|
|
29329
29402
|
|
|
29330
29403
|
/** ChampionshipBidDetailPage's compiled rules. */
|
|
29331
|
-
const pageStyle$
|
|
29404
|
+
const pageStyle$r = {
|
|
29332
29405
|
label: 'ChampionshipBidDetailPage-pageStyle',
|
|
29333
29406
|
display: 'flex',
|
|
29334
29407
|
flexDirection: 'column',
|
|
@@ -29354,7 +29427,7 @@ const headerStyle$l = {
|
|
|
29354
29427
|
flexDirection: 'column',
|
|
29355
29428
|
},
|
|
29356
29429
|
};
|
|
29357
|
-
const eyebrowStyle$
|
|
29430
|
+
const eyebrowStyle$7 = {
|
|
29358
29431
|
label: 'ChampionshipBidDetailPage-eyebrowStyle',
|
|
29359
29432
|
color: 'var(--fg-4)',
|
|
29360
29433
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29362,7 +29435,7 @@ const eyebrowStyle$6 = {
|
|
|
29362
29435
|
letterSpacing: '.06em',
|
|
29363
29436
|
textTransform: 'uppercase',
|
|
29364
29437
|
};
|
|
29365
|
-
const titleStyle$
|
|
29438
|
+
const titleStyle$i = {
|
|
29366
29439
|
label: 'ChampionshipBidDetailPage-titleStyle',
|
|
29367
29440
|
margin: 'var(--space-1) 0 0',
|
|
29368
29441
|
color: 'var(--fg-1)',
|
|
@@ -29483,7 +29556,7 @@ const ChampionshipBidDetailPage = ({ bid, loading = false, backLabel = 'NCAA Cha
|
|
|
29483
29556
|
const currency = React.useMemo(() => new Intl.NumberFormat(locale, { style: 'currency', currency: 'USD' }), [locale]);
|
|
29484
29557
|
const numbers = React.useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
29485
29558
|
const status = bid ? detailStatus(bid) : undefined;
|
|
29486
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29559
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$r), className), "data-test": "championship-bid-detail-page", children: [onBack && (jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: sx(breadcrumbStyle$7), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "championship-bid-detail-back", children: backLabel })), loading ? (jsxRuntime.jsxs("div", { className: sx(loadingStyle), "data-test": "championship-bid-detail-loading", children: [jsxRuntime.jsx(Spinner, { size: "lg", label: "Loading championship bid detail" }), jsxRuntime.jsx("p", { children: "Loading championship bid detail\u2026" })] })) : bid && status ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$l), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("span", { className: sx(eyebrowStyle$7), children: ["NCAA Championship bid \u00B7 ", bid.bidId] }), jsxRuntime.jsx("h1", { className: sx(titleStyle$i), children: bid.bidName })] }), jsxRuntime.jsx("span", { "data-test": "championship-bid-detail-status", children: jsxRuntime.jsx(StatusBadge, { status: status.status, label: status.label }) })] }), jsxRuntime.jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-details-heading", children: [jsxRuntime.jsx("h2", { id: "championship-bid-details-heading", children: "Bid details" }), jsxRuntime.jsxs("dl", { className: sx(factsStyle$4), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Aircraft" }), jsxRuntime.jsx("dd", { children: bid.aircraftName || 'Not provided' })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Seats" }), jsxRuntime.jsx("dd", { children: bid.seats === undefined ? 'Not provided' : numbers.format(bid.seats) })] }), jsxRuntime.jsxs("div", { className: sx(totalFactStyle$1), children: [jsxRuntime.jsx("dt", { children: "Total cost" }), jsxRuntime.jsx("dd", { "data-test": "championship-bid-detail-total", children: bid.totalCost === undefined ? 'Not provided' : currency.format(bid.totalCost) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Cities" }), jsxRuntime.jsx("dd", { children: bid.cities || 'Not provided' })] })] })] }), jsxRuntime.jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-notes-heading", children: [jsxRuntime.jsx("h2", { id: "championship-bid-notes-heading", children: "Carrier notes" }), jsxRuntime.jsxs("div", { className: sx(notesGridStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h3", { children: "Restrictions" }), jsxRuntime.jsx("p", { children: bid.restrictions || 'No restrictions provided.' })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h3", { children: "Comments" }), jsxRuntime.jsx("p", { children: bid.comments || 'No comments provided.' })] })] })] }), jsxRuntime.jsxs("section", { className: sx(panelStyle), "aria-labelledby": "championship-bid-contract-heading", children: [jsxRuntime.jsx("h2", { id: "championship-bid-contract-heading", children: "Contract" }), jsxRuntime.jsxs("div", { className: sx(contractStyle), "data-test": "championship-bid-detail-contract", children: [jsxRuntime.jsx(DocumentIcon, { size: 20, "aria-hidden": "true" }), jsxRuntime.jsx("span", { children: bid.contractFileName || 'No contract on file' })] })] })] })) : (jsxRuntime.jsx("div", { "data-test": "championship-bid-detail-empty", children: jsxRuntime.jsx(EmptyState$1, { title: "Championship bid detail unavailable", description: "Return to the championship queue and select an available opportunity.", icon: jsxRuntime.jsx(DocumentIcon, { size: 30 }) }) }))] }));
|
|
29487
29560
|
};
|
|
29488
29561
|
ChampionshipBidDetailPage.displayName = 'ChampionshipBidDetailPage';
|
|
29489
29562
|
|
|
@@ -29495,7 +29568,7 @@ ChampionshipBidDetailPage.displayName = 'ChampionshipBidDetailPage';
|
|
|
29495
29568
|
* declaration block in the sheet; they are separate elements, so each keeps its
|
|
29496
29569
|
* own object.
|
|
29497
29570
|
*/
|
|
29498
|
-
const pageStyle$
|
|
29571
|
+
const pageStyle$q = {
|
|
29499
29572
|
label: 'ChampionshipBidsPage-pageStyle',
|
|
29500
29573
|
display: 'flex',
|
|
29501
29574
|
flexDirection: 'column',
|
|
@@ -29516,7 +29589,7 @@ const headerStyle$k = {
|
|
|
29516
29589
|
flexDirection: 'column',
|
|
29517
29590
|
gap: 'var(--space-1)',
|
|
29518
29591
|
};
|
|
29519
|
-
const titleStyle$
|
|
29592
|
+
const titleStyle$h = {
|
|
29520
29593
|
label: 'ChampionshipBidsPage-titleStyle',
|
|
29521
29594
|
margin: 0,
|
|
29522
29595
|
color: 'var(--fg-1)',
|
|
@@ -29694,7 +29767,7 @@ const ChampionshipBidsPage = ({ bids, bidType: controlledBidType, defaultBidType
|
|
|
29694
29767
|
render: (_value, bid) => onOpenBid ? (jsxRuntime.jsx(Button, { variant: "outline", size: "sm", onClick: () => onOpenBid(bid.bidId), "data-test": "championship-rebid", children: "Bid anyway" })) : jsxRuntime.jsx("span", { className: sx(mutedStyle), children: "\u2014" }),
|
|
29695
29768
|
});
|
|
29696
29769
|
}
|
|
29697
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29770
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$q), className), "data-test": "championship-bids-page", children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$6), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "championship-bids-back", children: backLabel })), jsxRuntime.jsxs("header", { className: sx(headerStyle$k), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$h), children: CHAMPIONSHIP_HEADINGS[bidType] }), jsxRuntime.jsx("p", { className: sx(descriptionStyle$7), children: "NCAA championship charter opportunities released to you. Award confirmations and signed contracts live in the Awarded queue." })] }), jsxRuntime.jsx(Segment, { options: TAB_OPTIONS$1, value: bidType, onChange: selectBidType, "aria-label": "Championship bid queue", className: sx(tabsStyle$3) }), jsxRuntime.jsx(Table, { columns: columns, data: pageBids, rowKey: "bidId", loading: loading, emptyContent: jsxRuntime.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." }) }), jsxRuntime.jsx(Pagination, { page: currentPage, pageSize: pageSize, totalItems: bids.length, itemLabel: "bids", ariaLabel: "Championship bids pagination", onPageChange: setPage, onPageSizeChange: (nextSize) => {
|
|
29698
29771
|
setPageSize(nextSize);
|
|
29699
29772
|
setPage(1);
|
|
29700
29773
|
} })] }));
|
|
@@ -29709,7 +29782,7 @@ ChampionshipBidsPage.displayName = 'ChampionshipBidsPage';
|
|
|
29709
29782
|
* eye on is `.breadcrumb`'s `!important`, which overrides the Breadcrumb
|
|
29710
29783
|
* component's own padding and has to survive the move verbatim.
|
|
29711
29784
|
*/
|
|
29712
|
-
const pageStyle$
|
|
29785
|
+
const pageStyle$p = {
|
|
29713
29786
|
label: 'CharterBidResponsePage-pageStyle',
|
|
29714
29787
|
display: 'flex',
|
|
29715
29788
|
flexDirection: 'column',
|
|
@@ -29730,7 +29803,7 @@ const headerStyle$j = {
|
|
|
29730
29803
|
flexDirection: 'column',
|
|
29731
29804
|
gap: 'var(--space-1)',
|
|
29732
29805
|
};
|
|
29733
|
-
const eyebrowStyle$
|
|
29806
|
+
const eyebrowStyle$6 = {
|
|
29734
29807
|
label: 'CharterBidResponsePage-eyebrowStyle',
|
|
29735
29808
|
color: 'var(--fg-4)',
|
|
29736
29809
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29738,7 +29811,7 @@ const eyebrowStyle$5 = {
|
|
|
29738
29811
|
letterSpacing: '0.06em',
|
|
29739
29812
|
textTransform: 'uppercase',
|
|
29740
29813
|
};
|
|
29741
|
-
const titleStyle$
|
|
29814
|
+
const titleStyle$g = {
|
|
29742
29815
|
label: 'CharterBidResponsePage-titleStyle',
|
|
29743
29816
|
margin: 0,
|
|
29744
29817
|
color: 'var(--fg-1)',
|
|
@@ -29857,12 +29930,12 @@ const CharterBidResponsePage = ({ program, trips, accountName, tripLevel = true,
|
|
|
29857
29930
|
const blockedReason = noBid || pricedInputs
|
|
29858
29931
|
? undefined
|
|
29859
29932
|
: 'Price the trip with the calculator before submitting, or tick “No Bid” to decline.';
|
|
29860
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
29933
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$p), className), "data-test": "charter-bid-response-page", children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$5), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charter-bid-back", children: backLabel })), jsxRuntime.jsxs("header", { className: sx(headerStyle$j), children: [jsxRuntime.jsx("span", { className: sx(eyebrowStyle$6), children: "Bid response" }), jsxRuntime.jsx("h1", { className: sx(titleStyle$g), children: tripLevel ? trips[0]?.tripName : program.bidName })] }), jsxRuntime.jsxs("section", { className: sx(summaryStyle$3), "aria-label": "Team overview", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$6), children: "Team Overview" }), jsxRuntime.jsxs("dl", { className: sx(factsStyle$3), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Team" }), jsxRuntime.jsx("dd", { children: accountName })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Sport" }), jsxRuntime.jsx("dd", { children: program.sport })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Season" }), jsxRuntime.jsx("dd", { children: program.season })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Year" }), jsxRuntime.jsx("dd", { children: program.year })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Due Date" }), jsxRuntime.jsx("dd", { children: formatDate$3(program.dueDate, locale) })] })] })] }), trips.map((trip, index) => (jsxRuntime.jsxs("section", { className: sx(summaryStyle$3), "aria-label": `Trip ${index + 1}`, children: [jsxRuntime.jsxs("h2", { className: sx(sectionTitleStyle$6), children: ["Trip ", index + 1] }), jsxRuntime.jsxs("p", { className: sx(tripMetaStyle), children: [jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx("strong", { children: "Bid Type:" }), " ", trip.bidType] }), acmiCarrier && requestedCarrier && (jsxRuntime.jsxs("span", { "data-test": "charter-bid-requested-carrier", children: [jsxRuntime.jsx("strong", { children: "Requested Carrier:" }), " ", requestedCarrier] }))] }), jsxRuntime.jsxs("dl", { className: sx(factsStyle$3), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Depart Date" }), jsxRuntime.jsx("dd", { children: formatDate$3(trip.departureDate, locale) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Travel Party Size" }), jsxRuntime.jsx("dd", { children: trip.travelPartySize })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Route" }), jsxRuntime.jsx("dd", { children: trip.route })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Expires" }), jsxRuntime.jsx("dd", { children: formatDate$3(trip.expirationDate, locale) })] })] })] }, trip.tripGuid))), jsxRuntime.jsxs("section", { className: sx(calculatorStyle), "aria-label": "ACMI calculator", children: [jsxRuntime.jsxs("div", { className: sx(calculatorHeaderStyle), children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$6), children: "Price this trip" }), jsxRuntime.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 ? (jsxRuntime.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." })) : (jsxRuntime.jsx(AcmiQuoteCalculator, { defaultInputs: defaultInputs, result: acmiResult, onCalculate: handleCalculate, locale: locale }))] }), jsxRuntime.jsxs("div", { className: sx(submitBarStyle), children: [jsxRuntime.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" }), jsxRuntime.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 && (jsxRuntime.jsx("p", { className: sx(blockedReasonStyle$1), "data-test": "charter-bid-blocked-reason", children: blockedReason }))] })] }));
|
|
29861
29934
|
};
|
|
29862
29935
|
CharterBidResponsePage.displayName = 'CharterBidResponsePage';
|
|
29863
29936
|
|
|
29864
29937
|
/** CharterBidViewPage's compiled rules. */
|
|
29865
|
-
const pageStyle$
|
|
29938
|
+
const pageStyle$o = {
|
|
29866
29939
|
label: 'CharterBidViewPage-pageStyle',
|
|
29867
29940
|
display: 'flex',
|
|
29868
29941
|
flexDirection: 'column',
|
|
@@ -29883,7 +29956,7 @@ const headerStyle$i = {
|
|
|
29883
29956
|
flexDirection: 'column',
|
|
29884
29957
|
gap: 'var(--space-1)',
|
|
29885
29958
|
};
|
|
29886
|
-
const eyebrowStyle$
|
|
29959
|
+
const eyebrowStyle$5 = {
|
|
29887
29960
|
label: 'CharterBidViewPage-eyebrowStyle',
|
|
29888
29961
|
color: 'var(--fg-4)',
|
|
29889
29962
|
fontSize: 'var(--fs-xs)',
|
|
@@ -29891,7 +29964,7 @@ const eyebrowStyle$4 = {
|
|
|
29891
29964
|
letterSpacing: '0.06em',
|
|
29892
29965
|
textTransform: 'uppercase',
|
|
29893
29966
|
};
|
|
29894
|
-
const titleStyle$
|
|
29967
|
+
const titleStyle$f = {
|
|
29895
29968
|
label: 'CharterBidViewPage-titleStyle',
|
|
29896
29969
|
margin: 0,
|
|
29897
29970
|
color: 'var(--fg-1)',
|
|
@@ -30046,7 +30119,7 @@ const SUBMISSION_LABELS = {
|
|
|
30046
30119
|
const CharterBidViewPage = ({ program, trip, bids = [], processingSubmission, onRefresh, backLabel = 'Regular Season Bids', onBack, locale = 'en-US', className = '', }) => {
|
|
30047
30120
|
const currency = React.useMemo(() => new Intl.NumberFormat(locale, { style: 'currency', currency: 'USD' }), [locale]);
|
|
30048
30121
|
const numbers = React.useMemo(() => new Intl.NumberFormat(locale), [locale]);
|
|
30049
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
30122
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$o), className), "data-test": "charter-bid-view-page", children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$4), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charter-bid-view-back", children: backLabel })), jsxRuntime.jsxs("header", { className: sx(headerStyle$i), children: [jsxRuntime.jsx("span", { className: sx(eyebrowStyle$5), children: "Bid response" }), jsxRuntime.jsx("h1", { className: sx(titleStyle$f), children: trip ? trip.tripName : program.bidName }), jsxRuntime.jsxs("p", { className: sx(subtitleStyle$4), children: [program.team, " \u00B7 ", program.sport, " \u00B7 ", program.season, " ", program.year] })] }), bids.length > 0 && (jsxRuntime.jsx("ol", { className: sx(bidsStyle), children: bids.map((bid, index) => (jsxRuntime.jsxs("li", { className: sx(bidStyle), "data-test": "charter-submitted-bid", children: [jsxRuntime.jsxs("div", { className: sx(bidHeaderStyle), children: [jsxRuntime.jsxs("h2", { className: sx(bidTitleStyle), children: ["Bid ", index + 1] }), jsxRuntime.jsx(StatusBadge, { status: "submitted" })] }), jsxRuntime.jsxs("dl", { className: sx(factsStyle$2), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Seats" }), jsxRuntime.jsx("dd", { children: bid.seats })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Max Payload (lbs)" }), jsxRuntime.jsx("dd", { children: numbers.format(bid.maxPayloadLbs) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Fuel Base ($)" }), jsxRuntime.jsx("dd", { children: currency.format(bid.fuelBasePrice) })] }), jsxRuntime.jsxs("div", { className: sx(totalFactStyle), children: [jsxRuntime.jsx("dt", { children: "Total Cost ($)" }), jsxRuntime.jsx("dd", { "data-test": "charter-bid-total", children: currency.format(bid.totalCost) })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Catering Options" }), jsxRuntime.jsx("dd", { children: bid.cateringAvailable })] })] }), bid.notesFromOperator && bid.notesFromOperator.length > 0 && (jsxRuntime.jsxs("div", { className: sx(notesStyle), children: [jsxRuntime.jsx("h3", { className: sx(notesTitleStyle), children: "Notes from Operator" }), jsxRuntime.jsx("ul", { className: sx(notesListStyle), "data-test": "charter-bid-notes", children: bid.notesFromOperator.map((note) => (jsxRuntime.jsx("li", { children: note }, note))) })] }))] }, bid.id))) })), bids.length === 0 && processingSubmission && (jsxRuntime.jsxs("div", { className: sx(processingStyle), "data-test": "charter-bid-processing", children: [jsxRuntime.jsx(Spinner, { size: "lg", label: "Parsing your submission" }), jsxRuntime.jsx("h2", { className: sx(processingTitleStyle), children: "We are still reading your bid" }), jsxRuntime.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 && (jsxRuntime.jsx(Button, { variant: "outline", size: "sm", onClick: onRefresh, "data-test": "charter-bid-refresh", children: "Check again" }))] })), bids.length === 0 && !processingSubmission && (jsxRuntime.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." }))] }));
|
|
30050
30123
|
};
|
|
30051
30124
|
CharterBidViewPage.displayName = 'CharterBidViewPage';
|
|
30052
30125
|
|
|
@@ -30059,7 +30132,7 @@ CharterBidViewPage.displayName = 'CharterBidViewPage';
|
|
|
30059
30132
|
* members here, with the group's declarations first and the member's own after,
|
|
30060
30133
|
* so the last value still wins.
|
|
30061
30134
|
*/
|
|
30062
|
-
const pageStyle$
|
|
30135
|
+
const pageStyle$n = {
|
|
30063
30136
|
label: 'CharterManifestPage-pageStyle',
|
|
30064
30137
|
display: 'flex',
|
|
30065
30138
|
flexDirection: 'column',
|
|
@@ -30194,7 +30267,7 @@ const railStyle = {
|
|
|
30194
30267
|
width: '100%',
|
|
30195
30268
|
},
|
|
30196
30269
|
};
|
|
30197
|
-
const eyebrowStyle$
|
|
30270
|
+
const eyebrowStyle$4 = {
|
|
30198
30271
|
label: 'CharterManifestPage-eyebrowStyle',
|
|
30199
30272
|
marginBottom: 8,
|
|
30200
30273
|
color: 'var(--color-slate)',
|
|
@@ -30479,7 +30552,7 @@ const CharterManifestPage = ({ tripName, travelStartDate, travelEndDate, seats,
|
|
|
30479
30552
|
}
|
|
30480
30553
|
return a.lastName.localeCompare(b.lastName);
|
|
30481
30554
|
}), [passengers, sort]);
|
|
30482
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
30555
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$n), className), "data-screen-label": "Charter Trip Manifest", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$h), children: [jsxRuntime.jsxs("div", { className: sx(headerRowStyle$1), children: [jsxRuntime.jsx("button", { type: "button", "aria-label": "Back", className: sx(backStyle), onClick: onBack, children: jsxRuntime.jsx(ChevronLeftIcon, { size: 28 }) }), jsxRuntime.jsxs("h1", { children: [jsxRuntime.jsx("strong", { children: "Manifest" }), jsxRuntime.jsx(ChevronRightIcon$1, { size: 24 }), jsxRuntime.jsx("span", { children: tripName })] }), jsxRuntime.jsxs("div", { className: sx(headerActionsStyle), children: [jsxRuntime.jsx(StatusPill, { sendState: sendState, locked: locked }), jsxRuntime.jsx(Button, { variant: "outline", leftIcon: jsxRuntime.jsx(DocumentIcon, { size: 16 }), disabled: carrierName === 'No carrier selected', onClick: onGenerateFile, children: "Generate File" })] })] }), (travelStartDate || travelEndDate) && (jsxRuntime.jsxs("div", { className: sx(dateRowStyle), children: [jsxRuntime.jsx("span", { children: formatDate$2(travelStartDate) }), jsxRuntime.jsx("span", { className: sx(dateLineStyle), children: "\u25B6" }), jsxRuntime.jsx("span", { children: formatDate$2(travelEndDate) })] })), jsxRuntime.jsxs("div", { className: sx(metaRowStyle), children: [jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx(PlaneIcon$3, { size: 16 }), seats, " seats"] }), jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx(CubeIcon, { size: 16 }), "Payload limit ", payloadLimit.toLocaleString(), " lb"] })] })] }), jsxRuntime.jsxs("div", { className: sx(layoutStyle), children: [jsxRuntime.jsxs("aside", { className: sx(railStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: sx(eyebrowStyle$4), children: "Flight Manifest" }), jsxRuntime.jsx("div", { className: sx(scopeListStyle), children: [{ id: 'all', label: 'Full Trip', detail: 'All flight segments' }, ...segments].map((item) => (jsxRuntime.jsxs("button", { type: "button", className: cx(sx(scopeStyle), scope === item.id ? sx(activeScopeStyle) : ''), onClick: () => setScope(item.id), children: [jsxRuntime.jsx("strong", { children: item.label }), jsxRuntime.jsx("span", { children: item.detail })] }, item.id))) })] }), segments.length > 0 && (jsxRuntime.jsx(Button, { variant: "outline", size: "sm", disabled: locked, onClick: onSplitSegments, children: "Split by Segment" })), jsxRuntime.jsxs("div", { className: sx(carrierCardStyle), children: [jsxRuntime.jsx("div", { className: sx(eyebrowStyle$4), children: "Carrier" }), jsxRuntime.jsx("strong", { children: carrierName }), jsxRuntime.jsx("p", { children: carrierNote }), jsxRuntime.jsx(Button, { variant: "outline", size: "sm", fullWidth: true, disabled: locked, leftIcon: jsxRuntime.jsx(SettingsIcon, { size: 15 }), onClick: onChangeCarrier, children: "Change Carrier" })] })] }), jsxRuntime.jsxs("main", { className: sx(mainStyle$2), children: [jsxRuntime.jsx("section", { className: sx(capacityCardStyle), children: jsxRuntime.jsx(ManifestCapacityStats, { paxCount: passengers.length, seats: seats, paxWeight: passengerWeight, cargoWeight: cargoWeight, payloadLimit: payloadLimit }) }), jsxRuntime.jsxs("div", { className: sx(viewRowStyle), children: [jsxRuntime.jsx(ManifestViewToggle, { view: view, onView: setView, paxCount: passengers.length, eqCount: equipment.length, locked: locked }), locked && jsxRuntime.jsx("span", { className: sx(lockedMessageStyle), children: "Locked \u2014 coordinate any changes directly with the carrier." })] }), view === 'passengers' ? (jsxRuntime.jsxs("section", { children: [!locked && (jsxRuntime.jsxs("div", { className: sx(tableActionsStyle), children: [jsxRuntime.jsxs("strong", { children: [passengers.length, " Passengers"] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { children: "Order by" }), jsxRuntime.jsx("span", { className: sx(sortToggleStyle), children: ['name', 'type'].map((option) => (jsxRuntime.jsx("button", { type: "button", className: sort === option ? sx(activeSortStyle) : '', onClick: () => setSort(option), children: option }, option))) }), jsxRuntime.jsx(Button, { size: "sm", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 15 }), onClick: onAddPassengers, children: "Add Passengers" })] })] })), jsxRuntime.jsx("div", { className: sx(tableWrapStyle$3), children: jsxRuntime.jsxs("table", { children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { children: "#" }), jsxRuntime.jsx("th", { children: "Passenger" }), jsxRuntime.jsx("th", { children: "Type" }), jsxRuntime.jsx("th", { children: "TSA Screening" }), jsxRuntime.jsx("th", { children: "Personal" }), jsxRuntime.jsx("th", { children: "Carry-On" }), jsxRuntime.jsx("th", { children: "Checked" }), jsxRuntime.jsx("th", { children: "Seat" }), jsxRuntime.jsx("th", {})] }) }), jsxRuntime.jsxs("tbody", { children: [!sortedPassengers.length && jsxRuntime.jsx("tr", { children: jsxRuntime.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) => (jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("td", { children: index + 1 }), jsxRuntime.jsxs("td", { children: [jsxRuntime.jsx("strong", { children: passenger.lastName }), jsxRuntime.jsxs("span", { children: [", ", passenger.firstName] })] }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(TypeTag, { type: passenger.travelerType }) }), jsxRuntime.jsx("td", { children: passenger.screeningType || '—' }), jsxRuntime.jsxs("td", { children: [passenger.personalWeight ?? 0, " lb"] }), jsxRuntime.jsxs("td", { children: [passenger.carryOnWeight ?? 0, " lb"] }), jsxRuntime.jsxs("td", { children: [passenger.checkedWeight ?? 0, " lb"] }), jsxRuntime.jsx("td", { children: passenger.seatAssignment || '—' }), jsxRuntime.jsx("td", { children: !locked && jsxRuntime.jsx("button", { type: "button", "aria-label": `Remove ${passenger.firstName} ${passenger.lastName}`, className: sx(removeStyle), onClick: () => onRemovePassenger?.(passenger), children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }) })] }, passenger.id)))] })] }) })] })) : (jsxRuntime.jsxs("section", { children: [!locked && jsxRuntime.jsxs("div", { className: sx(tableActionsStyle), children: [jsxRuntime.jsxs("strong", { children: [equipment.length, " Equipment Items"] }), jsxRuntime.jsx(Button, { size: "sm", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 15 }), onClick: onAddEquipment, children: "Add Equipment" })] }), jsxRuntime.jsx("div", { className: sx(tableWrapStyle$3), children: jsxRuntime.jsxs("table", { children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { children: "Equipment" }), jsxRuntime.jsx("th", { children: "Quantity" }), jsxRuntime.jsx("th", { children: "Weight" }), jsxRuntime.jsx("th", { children: "Total" }), jsxRuntime.jsx("th", {})] }) }), jsxRuntime.jsx("tbody", { children: equipment.map((item) => jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsx("strong", { children: item.name }) }), jsxRuntime.jsx("td", { children: item.quantity }), jsxRuntime.jsxs("td", { children: [item.weight.toLocaleString(), " lb"] }), jsxRuntime.jsxs("td", { children: [(item.quantity * item.weight).toLocaleString(), " lb"] }), jsxRuntime.jsx("td", { children: !locked && jsxRuntime.jsx("button", { type: "button", "aria-label": `Remove ${item.name}`, className: sx(removeStyle), onClick: () => onRemoveEquipment?.(item), children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) }) })] }, item.id)) })] }) })] })), !locked && (jsxRuntime.jsxs("section", { className: sx(finalizeStyle), children: [jsxRuntime.jsx(StatusPill, { sendState: sendState, locked: false }), jsxRuntime.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.' }), jsxRuntime.jsxs("div", { className: sx(finalizeActionsStyle), children: [sendState === 'none' && jsxRuntime.jsx(Button, { onClick: onSendInitial, children: "Send Initial Manifest" }), sendState === 'initial-sent' && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button, { onClick: onSendFinal, children: "Send Final Manifest" }), jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", onClick: onUndoInitial, children: "Undo initial" })] })] })] }))] })] })] }));
|
|
30483
30556
|
};
|
|
30484
30557
|
|
|
30485
30558
|
/**
|
|
@@ -30498,7 +30571,7 @@ const mutedCopy = {
|
|
|
30498
30571
|
margin: 0,
|
|
30499
30572
|
color: 'var(--color-slate)',
|
|
30500
30573
|
};
|
|
30501
|
-
const pageStyle$
|
|
30574
|
+
const pageStyle$m = {
|
|
30502
30575
|
label: 'ChartersAccessManagementPage-pageStyle',
|
|
30503
30576
|
maxWidth: 1180,
|
|
30504
30577
|
margin: '0 auto',
|
|
@@ -30533,7 +30606,7 @@ const headingRowStyle = {
|
|
|
30533
30606
|
flexDirection: 'column',
|
|
30534
30607
|
},
|
|
30535
30608
|
};
|
|
30536
|
-
const eyebrowStyle$
|
|
30609
|
+
const eyebrowStyle$3 = {
|
|
30537
30610
|
label: 'ChartersAccessManagementPage-eyebrowStyle',
|
|
30538
30611
|
...mutedCopy,
|
|
30539
30612
|
marginBottom: 8,
|
|
@@ -30716,14 +30789,14 @@ const avatarStyle = {
|
|
|
30716
30789
|
fontSize: 12,
|
|
30717
30790
|
fontWeight: 'var(--fw-semibold)',
|
|
30718
30791
|
};
|
|
30719
|
-
const nameStyle = {
|
|
30792
|
+
const nameStyle$1 = {
|
|
30720
30793
|
label: 'ChartersAccessManagementPage-nameStyle',
|
|
30721
30794
|
display: 'flex',
|
|
30722
30795
|
alignItems: 'center',
|
|
30723
30796
|
gap: 7,
|
|
30724
30797
|
fontWeight: 'var(--fw-semibold)',
|
|
30725
30798
|
};
|
|
30726
|
-
const titleStyle$
|
|
30799
|
+
const titleStyle$e = {
|
|
30727
30800
|
label: 'ChartersAccessManagementPage-titleStyle',
|
|
30728
30801
|
display: 'block',
|
|
30729
30802
|
marginTop: 2,
|
|
@@ -30870,7 +30943,7 @@ const ChartersAccessManagementPage = ({ accountName, memberships, availableAccou
|
|
|
30870
30943
|
const addUnavailableReason = !onAddAccess
|
|
30871
30944
|
? 'Adding STM Charters access is not available in this view.'
|
|
30872
30945
|
: undefined;
|
|
30873
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
30946
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$m), className), "data-test": "charters-access-management-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$g), children: [onBack && (jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "charters-access-back", children: "STM Charters" })), jsxRuntime.jsxs("div", { className: sx(headingRowStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("p", { className: sx(eyebrowStyle$3), children: ["STM Charters \u00B7 ", accountName] }), jsxRuntime.jsx("h1", { children: "Access Management" }), jsxRuntime.jsx("p", { className: sx(descriptionStyle$6), children: "Grant account users access to charter bids and choose who can manage membership." })] }), jsxRuntime.jsxs("div", { className: sx(summaryStyle$2), "aria-label": "Access summary", children: [jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx("strong", { children: memberships.length }), " members"] }), jsxRuntime.jsxs("span", { children: [jsxRuntime.jsx("strong", { children: adminCount }), " admins"] })] })] })] }), loading && (jsxRuntime.jsxs("div", { className: sx(pageStateStyle$1), "data-test": "charters-access-loading", children: [jsxRuntime.jsx(Spinner, { size: "lg", label: "Loading STM Charters access" }), jsxRuntime.jsx("p", { children: "Loading STM Charters access\u2026" })] })), !loading && error && (jsxRuntime.jsxs("div", { className: sx(pageStateStyle$1), "data-test": "charters-access-error", children: [jsxRuntime.jsx(Alert, { variant: "error", title: "Access could not be loaded", children: error }), onRetry && (jsxRuntime.jsx(Button, { type: "button", variant: "outline", onClick: onRetry, "data-test": "charters-access-retry", children: "Try again" }))] })), !loading && !error && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [actionError && (jsxRuntime.jsx(Alert, { variant: "error", title: "Access change failed", dismissible: true, onDismiss: () => setActionError(undefined), className: sx(actionErrorStyle$1), children: jsxRuntime.jsx("span", { "data-test": "charters-access-action-error", children: actionError }) })), canManageAccess ? (jsxRuntime.jsxs("section", { className: sx(addPanelStyle), "data-test": "charters-access-add-panel", children: [jsxRuntime.jsxs("div", { className: sx(sectionHeadingStyle$1), children: [jsxRuntime.jsx("span", { className: sx(sectionIconStyle), children: jsxRuntime.jsx(UsersIcon$1, { size: 20 }) }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { children: "Add account users" }), jsxRuntime.jsxs("p", { children: ["Search and select one or more existing users of ", accountName, " to grant STM Charters access."] })] })] }), jsxRuntime.jsxs("div", { className: sx(addControlsStyle), children: [jsxRuntime.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" }), jsxRuntime.jsxs("div", { className: sx(addActionsRowStyle), children: [jsxRuntime.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" }), jsxRuntime.jsx(Button, { type: "button", onClick: addSelectedUsers, disabled: !hasSelectedUsers || Boolean(addUnavailableReason), loading: pendingAction === 'add', title: addUnavailableReason, "data-test": "charters-access-add", children: selectedUsers.length > 1
|
|
30874
30947
|
? `Add ${selectedUsers.length} users`
|
|
30875
30948
|
: 'Add access' })] })] })] })) : (jsxRuntime.jsx(Alert, { variant: "primary", title: "Read-only access", className: sx(readOnlyNoticeStyle$1), children: jsxRuntime.jsx("span", { "data-test": "charters-access-read-only", children: readOnlyMessage }) })), jsxRuntime.jsxs("section", { className: sx(membersPanelStyle), "aria-labelledby": "charters-access-members-heading", children: [jsxRuntime.jsxs("div", { className: sx(membersHeadingStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { id: "charters-access-members-heading", children: "People with STM Charters access" }), jsxRuntime.jsx("p", { children: "Members use carrier workflows. Admins can also manage this list." })] }), jsxRuntime.jsx(LockIcon$1, { size: 20, "aria-hidden": "true" })] }), memberships.length === 0 ? (jsxRuntime.jsx("div", { "data-test": "charters-access-empty", children: jsxRuntime.jsx(EmptyState$1, { title: "No STM Charters members", description: canManageAccess
|
|
30876
30949
|
? 'Search for an existing account user above to grant the first membership.'
|
|
@@ -30884,7 +30957,7 @@ const ChartersAccessManagementPage = ({ accountName, memberships, availableAccou
|
|
|
30884
30957
|
?? (!onChangeRole ? 'Changing roles is not available in this view.' : undefined);
|
|
30885
30958
|
const removeDisabledReason = membership.removeDisabledReason
|
|
30886
30959
|
?? (!onRemoveAccess ? 'Removing access is not available in this view.' : undefined);
|
|
30887
|
-
return (jsxRuntime.jsxs("tr", { "data-test": `charters-access-row-${membershipKey}`, children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsxs("div", { className: sx(personStyle$1), children: [jsxRuntime.jsx("span", { className: sx(avatarStyle), "aria-hidden": "true", children: membership.name.split(/\s+/).map((part) => part[0]).join('').slice(0, 2) }), jsxRuntime.jsxs("span", { children: [jsxRuntime.jsxs("span", { className: sx(nameStyle), children: [membership.name, isCurrentUser && jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "You" })] }), membership.title && jsxRuntime.jsx("span", { className: sx(titleStyle$
|
|
30960
|
+
return (jsxRuntime.jsxs("tr", { "data-test": `charters-access-row-${membershipKey}`, children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsxs("div", { className: sx(personStyle$1), children: [jsxRuntime.jsx("span", { className: sx(avatarStyle), "aria-hidden": "true", children: membership.name.split(/\s+/).map((part) => part[0]).join('').slice(0, 2) }), jsxRuntime.jsxs("span", { children: [jsxRuntime.jsxs("span", { className: sx(nameStyle$1), children: [membership.name, isCurrentUser && jsxRuntime.jsx(Badge, { variant: "info", size: "sm", children: "You" })] }), membership.title && jsxRuntime.jsx("span", { className: sx(titleStyle$e), children: membership.title })] })] }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx("a", { href: `mailto:${membership.email}`, children: membership.email }) }), jsxRuntime.jsx("td", { children: canManageAccess ? (jsxRuntime.jsxs("div", { className: sx(roleControlStyle), children: [jsxRuntime.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 && jsxRuntime.jsx(Spinner, { size: "xs", label: `Saving ${membership.name}'s role` }), roleDisabledReason && jsxRuntime.jsx("span", { className: sx(guardStyle), children: roleDisabledReason })] })) : (jsxRuntime.jsx(Badge, { variant: membership.role === 'admin' ? 'info' : 'default', children: membership.role === 'admin' ? 'Admin' : 'Member' })) }), canManageAccess && (jsxRuntime.jsxs("td", { className: sx(actionCellStyle$1), children: [jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", square: true, "aria-label": `Remove ${membership.name} from STM Charters`, title: removeDisabledReason, leftIcon: jsxRuntime.jsx(TrashIcon$2, { size: 16 }), disabled: Boolean(removeDisabledReason) || Boolean(pendingAction), loading: removePending, onClick: () => setRemoveTarget(membership), "data-test": `charters-access-remove-${membershipKey}` }), removeDisabledReason && (jsxRuntime.jsx("span", { className: cx(sx(guardStyle), sx(guardInActionCellStyle)), children: removeDisabledReason }))] }))] }, membership.membershipId));
|
|
30888
30961
|
}) })] }) }))] })] })), jsxRuntime.jsx(Modal, { isOpen: Boolean(removeTarget), onClose: () => {
|
|
30889
30962
|
if (!pendingAction)
|
|
30890
30963
|
setRemoveTarget(undefined);
|
|
@@ -30898,7 +30971,7 @@ ChartersAccessManagementPage.displayName = 'ChartersAccessManagementPage';
|
|
|
30898
30971
|
* `@media` block at the foot of the file is now nested inside `pageStyle`,
|
|
30899
30972
|
* which is the only rule it applied to.
|
|
30900
30973
|
*/
|
|
30901
|
-
const pageStyle$
|
|
30974
|
+
const pageStyle$l = {
|
|
30902
30975
|
label: 'ChartersHomePage-pageStyle',
|
|
30903
30976
|
display: 'flex',
|
|
30904
30977
|
flexDirection: 'column',
|
|
@@ -30915,7 +30988,7 @@ const headerStyle$f = {
|
|
|
30915
30988
|
alignItems: 'flex-start',
|
|
30916
30989
|
gap: 'var(--space-2)',
|
|
30917
30990
|
};
|
|
30918
|
-
const titleStyle$
|
|
30991
|
+
const titleStyle$d = {
|
|
30919
30992
|
label: 'ChartersHomePage-titleStyle',
|
|
30920
30993
|
margin: 0,
|
|
30921
30994
|
color: 'var(--fg-1)',
|
|
@@ -30944,7 +31017,7 @@ const cardsStyle = {
|
|
|
30944
31017
|
padding: 0,
|
|
30945
31018
|
listStyle: 'none',
|
|
30946
31019
|
};
|
|
30947
|
-
const cardStyle$
|
|
31020
|
+
const cardStyle$5 = {
|
|
30948
31021
|
label: 'ChartersHomePage-cardStyle',
|
|
30949
31022
|
display: 'flex',
|
|
30950
31023
|
alignItems: 'flex-start',
|
|
@@ -31166,7 +31239,7 @@ const CHARTER_CONTACT_GROUPS = [
|
|
|
31166
31239
|
* welcome paragraph and a PDF link; this keeps the same information architecture but
|
|
31167
31240
|
* puts a real card into each section with the queue count already visible.
|
|
31168
31241
|
*/
|
|
31169
|
-
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
31242
|
+
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 = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$l), className), "data-test": "charters-home-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$f), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$d), children: title }), description && jsxRuntime.jsx("p", { className: sx(descriptionStyle$5), children: description }), onOpenTutorial && (jsxRuntime.jsx(Button, { variant: "outline", size: "sm", className: sx(tutorialStyle), leftIcon: jsxRuntime.jsx(DocumentIcon, { size: 16 }), onClick: onOpenTutorial, "data-test": "charters-tutorial", children: tutorialLabel }))] }), jsxRuntime.jsx("ul", { className: sx(cardsStyle), children: sections.map((section) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", className: sx(cardStyle$5), onClick: () => onOpenSection?.(section.key), "data-test": `charters-section-${section.key}`, children: [jsxRuntime.jsx("span", { className: sx(cardIconStyle), "aria-hidden": "true", children: section.icon ?? SECTION_ICONS[section.key] ?? jsxRuntime.jsx(PlaneIcon$3, { size: 20 }) }), jsxRuntime.jsxs("span", { className: sx(cardBodyStyle$2), children: [jsxRuntime.jsx("span", { className: sx(cardTitleStyle$1), children: section.title }), jsxRuntime.jsx("span", { className: sx(cardDescriptionStyle), children: section.description }), section.loading ? (jsxRuntime.jsx("span", { className: sx(cardLoadingStyle), "data-test": `charters-section-${section.key}-loading`, children: jsxRuntime.jsx(Spinner, { size: "xs", label: `Loading ${section.title}` }) })) : section.count !== undefined ? (jsxRuntime.jsxs("span", { className: sx(cardCountStyle), children: [jsxRuntime.jsx("strong", { children: section.count }), " ", section.countLabel ?? 'items'] })) : null] }), jsxRuntime.jsx("span", { className: sx(cardArrowStyle), "aria-hidden": "true", children: jsxRuntime.jsx(ArrowUpRightIcon, { size: 16 }) })] }) }, section.key))) }), jsxRuntime.jsxs("section", { className: sx(contactsStyle), "aria-label": "Contact us", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$5), children: "Questions? Talk to us" }), jsxRuntime.jsx("div", { className: sx(contactGroupsStyle), children: contactGroups.map((group) => (jsxRuntime.jsxs("div", { className: sx(contactGroupStyle$1), children: [jsxRuntime.jsx("h3", { className: sx(contactGroupTitleStyle), children: group.title }), jsxRuntime.jsx("ul", { className: sx(contactListStyle), children: group.contacts.map((contact) => (jsxRuntime.jsxs("li", { className: sx(contactStyle), children: [jsxRuntime.jsx("span", { className: sx(contactNameStyle), children: contact.name }), contact.role && jsxRuntime.jsx("span", { className: sx(contactRoleStyle), children: contact.role }), jsxRuntime.jsxs("span", { className: sx(contactLinksStyle), children: [contact.email && (jsxRuntime.jsxs("a", { href: `mailto:${contact.email}`, className: sx(contactLinkStyle), children: [jsxRuntime.jsx(MailIcon, { size: 14, "aria-hidden": "true" }), contact.email] })), contact.phone && (jsxRuntime.jsxs("a", { href: `tel:${contact.phone}`, className: sx(contactLinkStyle), children: [jsxRuntime.jsx(PhoneIcon, { size: 14, "aria-hidden": "true" }), contact.phone] }))] })] }, contact.name))) })] }, group.title))) })] })] }));
|
|
31170
31243
|
ChartersHomePage.displayName = 'ChartersHomePage';
|
|
31171
31244
|
|
|
31172
31245
|
/**
|
|
@@ -31184,7 +31257,7 @@ ChartersHomePage.displayName = 'ChartersHomePage';
|
|
|
31184
31257
|
* rather than classes stacked on one element, so `emergencyLabelStyle` simply
|
|
31185
31258
|
* carries the merged result.
|
|
31186
31259
|
*/
|
|
31187
|
-
const pageStyle$
|
|
31260
|
+
const pageStyle$k = {
|
|
31188
31261
|
label: 'ContactUsPage-pageStyle',
|
|
31189
31262
|
color: 'var(--color-ink, #282828)',
|
|
31190
31263
|
'@media print': {
|
|
@@ -31245,7 +31318,7 @@ const stackStyle$1 = {
|
|
|
31245
31318
|
};
|
|
31246
31319
|
/* Outline card: a hairline border on white with a navy accent down the left
|
|
31247
31320
|
edge, and the section name as a small uppercase eyebrow over the content. */
|
|
31248
|
-
const cardStyle$
|
|
31321
|
+
const cardStyle$4 = {
|
|
31249
31322
|
label: 'ContactUsPage-cardStyle',
|
|
31250
31323
|
border: '1px solid var(--color-line, #dce5ef)',
|
|
31251
31324
|
borderLeft: '6px solid var(--color-primary, #19345f)',
|
|
@@ -31475,7 +31548,7 @@ const warningStyle = {
|
|
|
31475
31548
|
|
|
31476
31549
|
const cleanEmail = (email) => email?.replace('.invalid', '');
|
|
31477
31550
|
const ContactField = ({ label, children, emergency = false }) => (jsxRuntime.jsxs("div", { className: sx(fieldStyle$2), children: [jsxRuntime.jsxs("span", { className: emergency ? sx(emergencyLabelStyle) : sx(labelStyle$2), children: [label, emergency && jsxRuntime.jsx("span", { className: sx(emergencyDotStyle) })] }), jsxRuntime.jsx("div", { className: sx(fieldValueStyle), children: children })] }));
|
|
31478
|
-
const ContactCard = ({ title, children }) => (jsxRuntime.jsxs("section", { className: sx(cardStyle$
|
|
31551
|
+
const ContactCard = ({ title, children }) => (jsxRuntime.jsxs("section", { className: sx(cardStyle$4), children: [title && jsxRuntime.jsx("h2", { children: title }), jsxRuntime.jsx("div", { className: sx(cardBodyStyle$1), children: children })] }));
|
|
31479
31552
|
/**
|
|
31480
31553
|
* One account contact card: the row's own labels and values, in the order the
|
|
31481
31554
|
* caller put them in. Blank values are the caller's to drop — an empty line
|
|
@@ -31501,7 +31574,7 @@ const ContactUsPage = ({ title = 'Your Team of Experts', state, errorMessage = '
|
|
|
31501
31574
|
if (resolvedState === 'error' || resolvedState === 'empty') {
|
|
31502
31575
|
return (jsxRuntime.jsx("div", { className: sx(centeredStateStyle), "data-test": "contact-us-page", children: jsxRuntime.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.' }) }));
|
|
31503
31576
|
}
|
|
31504
|
-
return (jsxRuntime.jsx("div", { className: cx(sx(pageStyle$
|
|
31577
|
+
return (jsxRuntime.jsx("div", { className: cx(sx(pageStyle$k), className), "data-test": "contact-us-page", children: jsxRuntime.jsxs("div", { className: sx(containerStyle), children: [jsxRuntime.jsxs("div", { className: sx(headerRowStyle), children: [jsxRuntime.jsx(PageHeader, { title: title }), jsxRuntime.jsx("div", { className: sx(printRowStyle), children: jsxRuntime.jsxs("button", { type: "button", onClick: onPrint ?? (() => window.print()), children: [jsxRuntime.jsx(PrinterIcon, { size: 16 }), "Print"] }) })] }), children ?? (data ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!(data.accountManagers?.length || data.travelAgents?.length) && (jsxRuntime.jsxs("div", { className: sx(primaryGridStyle), children: [jsxRuntime.jsx(SimpleContactCard, { title: "Account Manager", contacts: data.accountManagers }), jsxRuntime.jsx(SimpleContactCard, { title: "Travel Agent", contacts: data.travelAgents })] })), jsxRuntime.jsxs("div", { className: sx(stackStyle$1), children: [data.accountContacts ? (data.accountContacts.map((section, index) => (
|
|
31505
31578
|
// Two rows can share a description, so position is the stable key.
|
|
31506
31579
|
jsxRuntime.jsx(AccountContactCard, { section: section }, `${section.title}-${index}`)))) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(ContactCard, { title: "Group/Team Commercial Reservation Specialists", children: [jsxRuntime.jsx(ContactField, { label: "Business Hours:", children: jsxRuntime.jsx("span", { children: "Monday \u2013 Friday 8am-8pm ET" }) }), jsxRuntime.jsx(ContactField, { label: "Toll-Free Number:", children: jsxRuntime.jsx("span", { children: "866-902-9654" }) }), jsxRuntime.jsx(ContactField, { label: "After Hours/Emergency (24/7):", emergency: true, children: jsxRuntime.jsx("span", { className: sx(emergencyStyle), children: "866-902-9654" }) }), jsxRuntime.jsx(ContactField, { label: "Email:", children: jsxRuntime.jsx("a", { href: "mailto:teamtravel@shortstravel.com", children: "teamtravel@shortstravel.com" }) })] }), jsxRuntime.jsxs(ContactCard, { title: "Recruiting Travel Specialists", children: [jsxRuntime.jsx(ContactField, { label: "Business Hours:", children: jsxRuntime.jsx("span", { children: "Monday \u2013 Friday 8am-8pm ET" }) }), jsxRuntime.jsx(ContactField, { label: "Toll-Free Number:", children: jsxRuntime.jsx("span", { children: "866-902-9654" }) }), jsxRuntime.jsx(ContactField, { label: "After Hours/Emergency (24/7):", emergency: true, children: jsxRuntime.jsx("span", { className: sx(emergencyStyle), children: "866-902-9654" }) }), jsxRuntime.jsx(ContactField, { label: "Email:", children: jsxRuntime.jsx("a", { href: "mailto:recruiting@shortstravel.com", children: "recruiting@shortstravel.com" }) })] })] })), !!data.charterAirContacts?.length && jsxRuntime.jsx(ContactCard, { title: "Charter Air", children: jsxRuntime.jsx(PairedContacts, { contacts: data.charterAirContacts }) }), !!data.motorcoachContacts?.length && (jsxRuntime.jsxs(ContactCard, { title: "Charter Bus / Motorcoach", children: [jsxRuntime.jsx(PairedContacts, { contacts: data.motorcoachContacts }), jsxRuntime.jsx("p", { className: sx(motorcoachEmergencyStyle), children: "After Hours/Emergency (24/7): 319-423-3007" })] })), !!data.groupHotelContacts?.length && (jsxRuntime.jsx(ContactCard, { title: "Group Hotel", children: data.groupHotelContacts.map((contact, index) => (jsxRuntime.jsxs("div", { className: sx(contactPairStyle), children: [jsxRuntime.jsx(ContactColumn, { title: "Sales Contact", contact: contact }), jsxRuntime.jsx("div", { className: sx(contactColumnStyle) })] }, `${contact.email ?? contact.name}-${index}`))) }))] })] })) : jsxRuntime.jsx(GenericCards, { cards: cards })), showSupportFooter && (jsxRuntime.jsxs("footer", { className: sx(supportStyle), children: [jsxRuntime.jsx("h2", { children: "Short's Travel Website and Online Booking Tool Support" }), jsxRuntime.jsx("p", { children: "Monday \u2013 Friday 9am-9pm ET, except major holidays" }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("span", { children: "319-257-5309" }), jsxRuntime.jsx("a", { href: "mailto:onlinesupport@shortstravel.com", children: "onlinesupport@shortstravel.com" })] })] }))] }) }));
|
|
31507
31580
|
};
|
|
@@ -31523,7 +31596,7 @@ const ContactUsPage = ({ title = 'Your Team of Experts', state, errorMessage = '
|
|
|
31523
31596
|
* The `pulse` keyframes are namespaced `stm-pulse` — injected at runtime they
|
|
31524
31597
|
* would otherwise be global and collide with a host's own `pulse`.
|
|
31525
31598
|
*/
|
|
31526
|
-
const pageStyle$
|
|
31599
|
+
const pageStyle$j = {
|
|
31527
31600
|
label: 'DashboardPage-pageStyle',
|
|
31528
31601
|
color: 'var(--color-ink, #282828)',
|
|
31529
31602
|
};
|
|
@@ -32416,7 +32489,7 @@ const DashboardPage = ({ greeting = 'Good morning', firstName, accountName, widg
|
|
|
32416
32489
|
const [dragFrom, setDragFrom] = React.useState(null);
|
|
32417
32490
|
const dragGhost = React.useRef(null);
|
|
32418
32491
|
const presentTypes = new Set(widgets.map((widget) => widget.type));
|
|
32419
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
32492
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$j), className), children: [welcomeHero && heroOpen && (jsxRuntime.jsxs("section", { className: sx(welcomeHeroStyle), "aria-label": "Welcome", children: [jsxRuntime.jsx("button", { type: "button", className: sx(welcomeCloseStyle), "aria-label": "Dismiss welcome", onClick: () => setHeroOpen(false), children: jsxRuntime.jsx(CloseIcon, { size: 20 }) }), welcomeHero] })), jsxRuntime.jsx("div", { className: sx(pageBannersStyle), children: jsxRuntime.jsx(PageBanners, { systemBanners: systemBanners, alertBanners: alertBanners, fullWidth: true, onDismiss: onBannerDismiss }) }), standingMessage && (jsxRuntime.jsx("section", { className: sx(standingMessageStyle), "aria-label": "Message", children: standingMessage })), jsxRuntime.jsxs("header", { className: sx(pageHeaderStyle$1), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("h1", { children: [greeting, firstName ? `, ${firstName}` : ''] }), accountName && jsxRuntime.jsxs("p", { children: ["Here's your personalized travel overview for ", accountName, "."] })] }), jsxRuntime.jsx("div", { className: sx(pageActionsStyle), children: editMode ? jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("button", { type: "button", className: sx(outlineButtonStyle), onClick: () => setCatalogOpen(true), children: [jsxRuntime.jsx(PlusIcon$2, { size: 20 }), "Add card"] }), jsxRuntime.jsx("button", { type: "button", className: sx(textButtonStyle$1), onClick: onReset, children: "Reset to default" }), jsxRuntime.jsxs("button", { type: "button", className: sx(primaryButtonStyle), onClick: () => { setEditMode(false); setCatalogOpen(false); }, children: [jsxRuntime.jsx(CheckIcon$2, { size: 20 }), "Done"] })] }) : jsxRuntime.jsxs("button", { type: "button", className: sx(customizeButtonStyle), onClick: () => setEditMode(true), children: [jsxRuntime.jsx(SettingsIcon, { size: 20 }), "Customize Your Home Page"] }) })] }), editMode && jsxRuntime.jsxs("div", { className: sx(editBannerStyle), children: [jsxRuntime.jsx(EditIcon$2, { size: 20 }), jsxRuntime.jsxs("span", { children: [jsxRuntime.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' && jsxRuntime.jsx("p", { className: sx(syncStatusStyle), "aria-live": "polite", children: "Saving layout\u2026" }), syncStatus === 'error' && jsxRuntime.jsx("p", { className: cx(sx(syncStatusStyle), sx(syncErrorStyle)), role: "alert", children: "Layout couldn't be saved. Changes are preserved locally." }), widgets.length ? jsxRuntime.jsx("div", { className: sx(gridStyle$2), children: widgets.map((widget, index) => jsxRuntime.jsx("div", { className: sx(sizeStyles[widget.size]), draggable: editMode, onDragStart: (event) => { if (!editMode)
|
|
32420
32493
|
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)
|
|
32421
32494
|
onReorder?.(dragFrom, index); setDragFrom(null); }, onDragEnd: () => { setDragFrom(null); dragGhost.current?.remove(); dragGhost.current = null; }, children: jsxRuntime.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)) }) : jsxRuntime.jsxs("div", { className: sx(emptyPageStyle), children: [jsxRuntime.jsx(PlusIcon$2, { size: 28 }), jsxRuntime.jsx("strong", { children: "Your home page is empty" }), jsxRuntime.jsx("span", { children: "Use \"Customize\" to add cards from the catalog." })] }), catalogOpen && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", className: sx(scrimStyle), "aria-label": "Close card catalog", onClick: () => setCatalogOpen(false) }), jsxRuntime.jsxs("aside", { className: sx(catalogStyle), role: "dialog", "aria-modal": "true", "aria-label": "Add cards", children: [jsxRuntime.jsxs("header", { children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { children: "Add a card" }), jsxRuntime.jsx("p", { children: "Cards available to your role for this account" })] }), jsxRuntime.jsx("button", { type: "button", "aria-label": "Close card catalog", onClick: () => setCatalogOpen(false), children: jsxRuntime.jsx(CloseIcon, { size: 20 }) })] }), jsxRuntime.jsx("div", { className: sx(catalogBodyStyle), children: CATALOG.map((item) => jsxRuntime.jsxs("div", { className: sx(catalogItemStyle), children: [jsxRuntime.jsx("span", { className: sx(catalogIconStyle), children: jsxRuntime.jsx(WidgetIcon, { type: item.type }) }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("strong", { children: item.title }), jsxRuntime.jsx("span", { children: "Account" }), jsxRuntime.jsx("p", { children: item.description })] }), presentTypes.has(item.type) ? jsxRuntime.jsxs("span", { className: sx(addedStyle), children: [jsxRuntime.jsx(CheckIcon$2, { size: 16 }), "Added"] }) : jsxRuntime.jsxs("button", { type: "button", onClick: () => onAddWidget?.(item.type), children: [jsxRuntime.jsx(PlusIcon$2, { size: 16 }), "Add"] })] }, item.type)) }), jsxRuntime.jsx("footer", { children: "Each card can appear once on your home page." })] })] })] }));
|
|
32422
32495
|
};
|
|
@@ -32429,7 +32502,7 @@ const DashboardPage = ({ greeting = 'Good morning', firstName, accountName, widg
|
|
|
32429
32502
|
* object, and the single `@media (max-width: 767px)` block is split across the
|
|
32430
32503
|
* nine objects it used to style.
|
|
32431
32504
|
*/
|
|
32432
|
-
const pageStyle$
|
|
32505
|
+
const pageStyle$i = {
|
|
32433
32506
|
label: 'FeatureFlagManagementPage-pageStyle',
|
|
32434
32507
|
maxWidth: 1440,
|
|
32435
32508
|
margin: '0 auto',
|
|
@@ -32455,7 +32528,7 @@ const headerStyle$e = {
|
|
|
32455
32528
|
'& h1': { fontSize: 36 },
|
|
32456
32529
|
},
|
|
32457
32530
|
};
|
|
32458
|
-
const eyebrowStyle$
|
|
32531
|
+
const eyebrowStyle$2 = {
|
|
32459
32532
|
label: 'FeatureFlagManagementPage-eyebrowStyle',
|
|
32460
32533
|
margin: '0 0 8px',
|
|
32461
32534
|
color: 'var(--color-primary, #0a53ef)',
|
|
@@ -33136,7 +33209,7 @@ const FeatureFlagManagementPage = ({ definitions, rules, targetOptions, loading
|
|
|
33136
33209
|
const hasRuleActions = Boolean(onEditRule || onDeactivateRule);
|
|
33137
33210
|
const currentUserSearchError = userSearchError ?? internalUserSearchError;
|
|
33138
33211
|
const currentAudienceError = audienceError ?? internalAudienceError;
|
|
33139
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
33212
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$i), className), "data-test": "feature-flag-management-page", "aria-busy": busy, children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$e), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("p", { className: sx(eyebrowStyle$2), children: "Administration \u00B7 System" }), jsxRuntime.jsx("h1", { children: "Feature Flags" }), jsxRuntime.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 && (jsxRuntime.jsx(Button, { type: "button", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 16 }), onClick: openCreate, disabled: busy, "data-test": "feature-flag-create-rule", children: "Create rule" }))] }), busy && (jsxRuntime.jsxs("div", { className: sx(submittingStyle), role: "status", "data-test": "feature-flag-submitting", children: [jsxRuntime.jsx(Spinner, { size: "sm", label: "Saving feature rule" }), jsxRuntime.jsx("span", { children: "Saving feature rule\u2026" })] })), loading && (jsxRuntime.jsxs("div", { className: sx(pageStateStyle), "data-test": "feature-flag-loading", children: [jsxRuntime.jsx(Spinner, { size: "lg", label: "Loading feature flags" }), jsxRuntime.jsx("p", { children: "Loading feature flags\u2026" })] })), !loading && error && (jsxRuntime.jsxs("div", { className: sx(pageStateStyle), "data-test": "feature-flag-error", children: [jsxRuntime.jsx(Alert, { variant: "error", title: "Feature flags could not be loaded", children: error }), onRetry && (jsxRuntime.jsx(Button, { type: "button", variant: "outline", onClick: onRetry, "data-test": "feature-flag-retry", children: "Try again" }))] })), !loading && !error && definitions.length === 0 && (jsxRuntime.jsx("div", { "data-test": "feature-flag-definitions-empty", children: jsxRuntime.jsx(EmptyState$1, { title: "No feature definitions", description: "Publish immutable feature definitions before creating audience rules.", icon: jsxRuntime.jsx(SettingsIcon, { size: 30 }), size: "lg" }) })), !loading && !error && definitions.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [actionError && (jsxRuntime.jsx(Alert, { variant: "error", title: "Feature rule change failed", dismissible: true, onDismiss: () => setActionError(undefined), className: sx(actionErrorStyle), children: jsxRuntime.jsx("span", { "data-test": "feature-flag-action-error", children: actionError }) })), jsxRuntime.jsxs("section", { className: sx(catalogPanelStyle), "aria-labelledby": "feature-catalog-heading", children: [jsxRuntime.jsxs("div", { className: sx(sectionHeadingStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { id: "feature-catalog-heading", children: "Feature catalog" }), jsxRuntime.jsx("p", { children: "Definitions and hierarchy are read-only in this view." })] }), jsxRuntime.jsxs(Badge, { size: "sm", children: [definitions.length, " definitions"] })] }), jsxRuntime.jsx("div", { className: sx(definitionListStyle), "data-test": "feature-flag-definitions", children: definitionRows.map(({ definition, depth }) => (jsxRuntime.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: [jsxRuntime.jsxs("div", { className: sx(definitionCopyStyle), children: [jsxRuntime.jsxs("div", { className: sx(definitionTitleStyle), children: [jsxRuntime.jsx("strong", { children: definition.name }), jsxRuntime.jsx("code", { children: definition.featureKey })] }), jsxRuntime.jsx("p", { children: definition.description }), definition.isActive === false && (jsxRuntime.jsx("p", { className: sx(killSwitchStyle), children: "Kill switch active. Targeting rules cannot enable this feature." }))] }), jsxRuntime.jsxs("div", { className: sx(definitionBadgesStyle), children: [jsxRuntime.jsx(Badge, { variant: definition.isActive === false ? 'error' : 'success', size: "sm", children: definition.isActive === false ? 'Inactive kill switch' : 'Active definition' }), jsxRuntime.jsxs(Badge, { variant: definition.defaultEnabled ? 'success' : 'default', size: "sm", children: ["Default ", definition.defaultEnabled ? 'enabled' : 'disabled'] })] })] }, definition.featureKey))) })] }), editor && (jsxRuntime.jsxs("section", { className: sx(editorPanelStyle), "data-test": "feature-flag-rule-editor", children: [jsxRuntime.jsxs("div", { className: sx(sectionHeadingStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { children: editor.mode === 'create' ? 'Create targeting rule' : 'Edit targeting rule' }), jsxRuntime.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' && (jsxRuntime.jsxs("code", { className: sx(versionStyle), children: ["Version ", editor.rule.rowVersion] }))] }), jsxRuntime.jsxs("form", { className: sx(ruleFormStyle), onSubmit: submitRule, noValidate: true, children: [jsxRuntime.jsx(Select, { label: "Feature", options: definitions.map((definition) => ({
|
|
33140
33213
|
value: definition.featureKey,
|
|
33141
33214
|
label: `${definition.name} · ${definition.featureKey}`,
|
|
33142
33215
|
disabled: definition.isActive === false,
|
|
@@ -33677,7 +33750,7 @@ GroupTravelRequestPage.displayName = 'GroupTravelRequestPage';
|
|
|
33677
33750
|
* split across the objects it styled: each `@media` lives inside the one style
|
|
33678
33751
|
* it applies to, so a rule and its responsive override stay together.
|
|
33679
33752
|
*/
|
|
33680
|
-
const pageStyle$
|
|
33753
|
+
const pageStyle$h = {
|
|
33681
33754
|
label: 'IndividualTravelPage-pageStyle',
|
|
33682
33755
|
minHeight: '100%',
|
|
33683
33756
|
padding: 24,
|
|
@@ -33701,7 +33774,7 @@ const headerStyle$d = {
|
|
|
33701
33774
|
flexDirection: 'column',
|
|
33702
33775
|
},
|
|
33703
33776
|
};
|
|
33704
|
-
const titleStyle$
|
|
33777
|
+
const titleStyle$c = {
|
|
33705
33778
|
label: 'IndividualTravelPage-titleStyle',
|
|
33706
33779
|
margin: 0,
|
|
33707
33780
|
color: 'var(--fg-1, #282828)',
|
|
@@ -34415,7 +34488,7 @@ const IndividualTravelPage = ({ trips, tabCounts, enabledTabs = ['current', 'pas
|
|
|
34415
34488
|
: activeFilters
|
|
34416
34489
|
? 'No trips match the selected filters. Clear a filter or widen the date range.'
|
|
34417
34490
|
: emptyMessage;
|
|
34418
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
34491
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$h), className), "data-test": "individual-travel-page", "aria-busy": loading || refreshing, children: [jsxRuntime.jsxs("div", { className: sx(headerStyle$d), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$c), children: "Individual & Small Group Travel" }), onCreateRequest && (jsxRuntime.jsx(Button
|
|
34419
34492
|
// Explicit: the atom has no default, and inside a host form a
|
|
34420
34493
|
// bare <button> would submit it.
|
|
34421
34494
|
, {
|
|
@@ -34441,7 +34514,7 @@ const IndividualTravelPage = ({ trips, tabCounts, enabledTabs = ['current', 'pas
|
|
|
34441
34514
|
* the three columns and the narrow-screen tab strip — still comes from the
|
|
34442
34515
|
* RequestFormLayout organism, and the blocks from the FormSection molecule.
|
|
34443
34516
|
*/
|
|
34444
|
-
const pageStyle$
|
|
34517
|
+
const pageStyle$g = {
|
|
34445
34518
|
label: 'IndividualTravelRequestPage-pageStyle',
|
|
34446
34519
|
color: 'var(--color-ink, #282828)',
|
|
34447
34520
|
};
|
|
@@ -34535,14 +34608,14 @@ const pageHeaderStyle = {
|
|
|
34535
34608
|
flexDirection: 'column',
|
|
34536
34609
|
},
|
|
34537
34610
|
};
|
|
34538
|
-
const eyebrowStyle = {
|
|
34611
|
+
const eyebrowStyle$1 = {
|
|
34539
34612
|
label: 'IndividualTravelRequestPage-eyebrowStyle',
|
|
34540
34613
|
margin: '0 0 4px',
|
|
34541
34614
|
color: 'var(--color-slate, #5c5c5c)',
|
|
34542
34615
|
fontSize: 13,
|
|
34543
34616
|
fontWeight: 600,
|
|
34544
34617
|
};
|
|
34545
|
-
const titleStyle$
|
|
34618
|
+
const titleStyle$b = {
|
|
34546
34619
|
label: 'IndividualTravelRequestPage-titleStyle',
|
|
34547
34620
|
margin: 0,
|
|
34548
34621
|
color: 'var(--color-ink, #282828)',
|
|
@@ -34881,17 +34954,17 @@ const choiceTextStyle = {
|
|
|
34881
34954
|
},
|
|
34882
34955
|
};
|
|
34883
34956
|
/** `.travelerCard, .segmentCard` — one selector list, two homes. */
|
|
34884
|
-
const cardStyle$
|
|
34957
|
+
const cardStyle$3 = {
|
|
34885
34958
|
padding: 18,
|
|
34886
34959
|
border: '1px solid var(--border-color, #ededed)',
|
|
34887
34960
|
borderRadius: 9,
|
|
34888
34961
|
background: 'var(--color-basecolor, #fafafa)',
|
|
34889
34962
|
};
|
|
34890
34963
|
const travelerCardStyle = {
|
|
34891
|
-
label: 'IndividualTravelRequestPage-travelerCardStyle', ...cardStyle$
|
|
34964
|
+
label: 'IndividualTravelRequestPage-travelerCardStyle', ...cardStyle$3
|
|
34892
34965
|
};
|
|
34893
34966
|
const segmentCardStyle$1 = {
|
|
34894
|
-
label: 'IndividualTravelRequestPage-segmentCardStyle', ...cardStyle$
|
|
34967
|
+
label: 'IndividualTravelRequestPage-segmentCardStyle', ...cardStyle$3
|
|
34895
34968
|
};
|
|
34896
34969
|
const cardHeaderStyle = {
|
|
34897
34970
|
label: 'IndividualTravelRequestPage-cardHeaderStyle',
|
|
@@ -35909,9 +35982,9 @@ const IndividualTravelRequestFormPage = ({ currentTraveler, configuration, value
|
|
|
35909
35982
|
}
|
|
35910
35983
|
};
|
|
35911
35984
|
if (loading) {
|
|
35912
|
-
return (jsxRuntime.jsx(RequestFormLayout, { className: cx(sx(pageStyle$
|
|
35985
|
+
return (jsxRuntime.jsx(RequestFormLayout, { className: cx(sx(pageStyle$g), className), header: jsxRuntime.jsx(RequestFormHeader, { title: "Individual Travel Request" }), children: jsxRuntime.jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-form-loading", children: [jsxRuntime.jsx(Spinner, { label: "Loading travel request form" }), jsxRuntime.jsx("span", { children: "Loading request options\u2026" })] }) }));
|
|
35913
35986
|
}
|
|
35914
|
-
return (jsxRuntime.jsx("form", { ref: formRef, className: sx(formStyle), onSubmit: (event) => void handleSubmit(event), noValidate: true, "data-test": "individual-travel-request-form", "aria-busy": busy, children: jsxRuntime.jsxs(RequestFormLayout, { className: cx(sx(pageStyle$
|
|
35987
|
+
return (jsxRuntime.jsx("form", { ref: formRef, className: sx(formStyle), onSubmit: (event) => void handleSubmit(event), noValidate: true, "data-test": "individual-travel-request-form", "aria-busy": busy, children: jsxRuntime.jsxs(RequestFormLayout, { className: cx(sx(pageStyle$g), className), header: jsxRuntime.jsx(RequestFormHeader, { title: "Individual Travel Request", eventName: currentTraveler.displayName }), activePane: activePane, onPaneChange: setActivePane, mobileServices: availableServices.map((service) => (jsxRuntime.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, jsxRuntime.jsx("span", { children: service.label })] }, service.key))), sidebar: (jsxRuntime.jsxs("div", { "aria-label": "Travel types", "data-test": "individual-travel-request-service-sidebar", children: [jsxRuntime.jsx(ServiceToggleList, { services: availableServices, enabledServices: selectedServices, onToggle: (service, checked) => toggleService(service, checked), onClick: navigateToService, className: sx(serviceNavigationStyle), disabled: disabled }), jsxRuntime.jsxs("div", { className: sx(travelerRailStyle), children: [jsxRuntime.jsx("h3", { children: "Travelling" }), jsxRuntime.jsxs("p", { children: [jsxRuntime.jsx(UsersIcon$1, { size: 17 }), " ", travelerRailSummary] })] })] })), summary: (jsxRuntime.jsx(RequestSummary, { sections: summarySections, values: {}, dataTest: "individual-travel-request-summary" })), footer: (onCancel || onSubmit) ? (jsxRuntime.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 && jsxRuntime.jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-form-notice", children: jsxRuntime.jsx(Alert, { variant: "warning", children: notice }) }), error && (jsxRuntime.jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-form-error", children: jsxRuntime.jsxs(Alert, { variant: "error", title: "The request form needs attention", children: [jsxRuntime.jsx("div", { children: error }), onRetry && jsxRuntime.jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onRetry, "data-test": "individual-travel-request-form-retry", children: "Try again" })] }) })), readOnly && (jsxRuntime.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) && (jsxRuntime.jsxs("div", { ref: errorSummaryRef, className: sx(errorSummaryStyle), role: "alert", tabIndex: -1, "data-test": "individual-travel-request-form-validation", children: [jsxRuntime.jsx("h2", { children: "Review the request before submitting" }), submitError && jsxRuntime.jsx("p", { "data-test": "individual-travel-request-form-submit-error", children: submitError }), Object.keys(allErrors).length > 0 && jsxRuntime.jsx("ul", { children: Object.values(allErrors).map((message, index) => jsxRuntime.jsx("li", { children: message }, `${message}-${index}`)) })] })), activeService !== 'general' && !selectedServices[activeService] && (jsxRuntime.jsxs("div", { className: sx(mobileEnableStyle), "data-test": "individual-travel-request-mobile-enable", children: [jsxRuntime.jsxs("span", { children: ["Add ", SERVICE_LABELS[activeService], " to this request"] }), jsxRuntime.jsx(Toggle, { "aria-label": `Enable ${SERVICE_LABELS[activeService]}`, checked: false, onChange: () => enableFromStrip(activeService), size: "sm" })] })), jsxRuntime.jsxs(Section, { title: "Traveler information", description: "Tell the travel team who is traveling. Required fields are marked with an asterisk.", icon: jsxRuntime.jsx(UsersIcon$1, { size: 24 }), dataTest: "individual-travel-request-section-travelers", children: [jsxRuntime.jsxs("fieldset", { className: sx(choiceGroupStyle), children: [jsxRuntime.jsx("legend", { className: sx(legendStyle), children: "Travel for" }), jsxRuntime.jsxs("label", { className: sx(choiceStyle), children: [jsxRuntime.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" }), jsxRuntime.jsxs("span", { className: sx(choiceTextStyle), children: [jsxRuntime.jsx("strong", { children: currentTraveler.displayName }), jsxRuntime.jsx("small", { children: currentTraveler.email || 'Authenticated traveler' })] })] }), configuration.allowOtherTravelers && (jsxRuntime.jsxs("label", { className: sx(choiceStyle), children: [jsxRuntime.jsx("input", { type: "radio", name: "travelerType", value: "other", checked: resolvedValues.travelerType === 'other', disabled: disabled, onChange: () => commit({
|
|
35915
35988
|
...resolvedValues,
|
|
35916
35989
|
travelerType: 'other',
|
|
35917
35990
|
travelers: resolvedValues.travelers.length ? resolvedValues.travelers : [emptyTraveler()],
|
|
@@ -35983,7 +36056,7 @@ const IndividualTravelRequestDetailPage = ({ request, loading = false, error, no
|
|
|
35983
36056
|
: request
|
|
35984
36057
|
? `Travel request ${request.requestId}`
|
|
35985
36058
|
: 'Travel request';
|
|
35986
|
-
return (jsxRuntime.jsxs("main", { className: cx(sx(pageStyle$f), className), "data-test": "individual-travel-request-detail", "aria-busy": loading, children: [jsxRuntime.jsxs("header", { className: sx(pageHeaderStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("p", { className: sx(eyebrowStyle), children: "Individual travel" }), jsxRuntime.jsx("h1", { className: sx(titleStyle$a), children: title }), request && !loading && !error && (jsxRuntime.jsxs("div", { className: sx(detailMetaStyle), "data-test": "individual-travel-request-detail-meta", children: [jsxRuntime.jsxs("span", { children: ["Submitted ", jsxRuntime.jsx("time", { dateTime: request.submittedAt, children: formatDateTime$1(request.submittedAt) })] }), request.completedAt && jsxRuntime.jsxs("span", { children: ["Completed ", jsxRuntime.jsx("time", { dateTime: request.completedAt, children: formatDateTime$1(request.completedAt) })] })] }))] }), onBack && (jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "individual-travel-request-detail-back", children: backLabel }))] }), jsxRuntime.jsxs("div", { className: sx(contentStyle$3), children: [loading && (jsxRuntime.jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-loading", children: [jsxRuntime.jsx(Spinner, { label: "Loading travel request" }), jsxRuntime.jsx("span", { children: "Loading request details\u2026" })] })), !loading && error && (jsxRuntime.jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-error", children: [jsxRuntime.jsx(Alert, { variant: "error", title: "The travel request could not be loaded", children: error }), onRetry && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", onClick: onRetry, "data-test": "individual-travel-request-detail-retry", children: "Try again" })] })), !loading && !error && !request && (jsxRuntime.jsx("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-empty", children: jsxRuntime.jsx("p", { children: "No travel request was supplied." }) })), !loading && !error && request && (jsxRuntime.jsxs("div", { className: sx(formStyle), children: [notice && jsxRuntime.jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-detail-notice", children: jsxRuntime.jsx(Alert, { variant: "warning", children: notice }) }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-general", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Request information" }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Request number", dataTest: "individual-travel-request-detail-request-id", children: request.requestId }), jsxRuntime.jsx(DetailField, { label: "Traveler type", children: request.travelerType === 'self' ? 'Self' : 'Other traveler' }), jsxRuntime.jsx(DetailField, { label: "Submitted by", children: request.submittedBy?.name }), jsxRuntime.jsx(DetailField, { label: "Submitter email", children: request.submittedBy?.email }), request.submittedBy?.phone && jsxRuntime.jsx(DetailField, { label: "Submitter phone", children: request.submittedBy.phone }), request.additionalEmails && jsxRuntime.jsx(DetailField, { label: "Additional email addresses", children: request.additionalEmails })] })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-travelers", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Travelers" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Name" }), jsxRuntime.jsx("th", { scope: "col", children: "Date of birth" }), jsxRuntime.jsx("th", { scope: "col", children: "Gender" })] }) }), jsxRuntime.jsxs("tbody", { children: [request.travelers.map((traveler, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-traveler-${index + 1}`, children: [jsxRuntime.jsx("td", { children: travelerName(traveler) || '—' }), jsxRuntime.jsx("td", { children: formatDate(traveler.dateOfBirth) }), jsxRuntime.jsx("td", { children: traveler.gender || '—' })] }, `${travelerName(traveler)}-${index}`))), !request.travelers.length && jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: 3, className: sx(emptyValueStyle), children: "No traveler details were supplied." }) })] })] }) })] }), Boolean(request.organizationAnswers?.length) && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-organization", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Organization information" }) }), jsxRuntime.jsx(AnswerList, { answers: request.organizationAnswers, prefix: "individual-travel-request-detail-organization-answer" })] })), Boolean(request.billingAnswers?.length) && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-billing", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Billing information" }) }), jsxRuntime.jsx(AnswerList, { answers: request.billingAnswers, prefix: "individual-travel-request-detail-billing-answer" })] })), request.airRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-air", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Air Request" }), jsxRuntime.jsx("p", { className: sx(sectionDescriptionStyle), children: request.airRequest.tripType.replace('-', ' ') })] }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "From" }), jsxRuntime.jsx("th", { scope: "col", children: "To" }), jsxRuntime.jsx("th", { scope: "col", children: "Depart" }), request.airRequest.tripType === 'round-trip' && jsxRuntime.jsx("th", { scope: "col", children: "Return" })] }) }), jsxRuntime.jsx("tbody", { children: request.airRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-air-leg-${index + 1}`, children: [jsxRuntime.jsx("td", { children: leg.departureLocation }), jsxRuntime.jsx("td", { children: leg.arrivalLocation }), jsxRuntime.jsxs("td", { children: [formatDate(leg.departureDate), " \u00B7 ", leg.departureTime] }), request.airRequest?.tripType === 'round-trip' && jsxRuntime.jsxs("td", { children: [formatDate(leg.returnDate), " \u00B7 ", leg.returnTime || '—'] })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Fare preference", children: request.airRequest.farePreference }), jsxRuntime.jsx(DetailField, { label: "Flight preference", children: request.airRequest.flightPreference }), jsxRuntime.jsx(DetailField, { label: "Preferred airline", children: request.airRequest.preferredAirline }), jsxRuntime.jsx(DetailField, { label: "Most important factor", children: request.airRequest.priority }), request.airRequest.details && jsxRuntime.jsx(DetailField, { label: "Air details", children: request.airRequest.details })] })] })), request.hotelRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-hotel", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Hotel Request" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "City" }), jsxRuntime.jsx("th", { scope: "col", children: "Check in" }), jsxRuntime.jsx("th", { scope: "col", children: "Check out" })] }) }), jsxRuntime.jsx("tbody", { children: request.hotelRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-hotel-leg-${index + 1}`, children: [jsxRuntime.jsx("td", { children: leg.city }), jsxRuntime.jsx("td", { children: formatDate(leg.checkInDate) }), jsxRuntime.jsx("td", { children: formatDate(leg.checkOutDate) })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Bed preference", children: request.hotelRequest.bedPreference }), jsxRuntime.jsx(DetailField, { label: "Smoking preference", children: request.hotelRequest.smokingPreference }), jsxRuntime.jsx(DetailField, { label: "Preferred hotel", children: request.hotelRequest.preferredHotel })] })] })), request.carRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-car", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Vehicle Rental Request" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Pickup" }), jsxRuntime.jsx("th", { scope: "col", children: "Pickup date" }), jsxRuntime.jsx("th", { scope: "col", children: "Drop-off" }), jsxRuntime.jsx("th", { scope: "col", children: "Drop-off date" })] }) }), jsxRuntime.jsx("tbody", { children: request.carRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-car-leg-${index + 1}`, children: [jsxRuntime.jsxs("td", { children: [leg.pickupCity, leg.pickupLocation ? ` · ${leg.pickupLocation}` : ''] }), jsxRuntime.jsxs("td", { children: [formatDate(leg.pickupDate), " \u00B7 ", leg.pickupTime] }), jsxRuntime.jsx("td", { children: leg.dropoffLocation || leg.pickupCity }), jsxRuntime.jsxs("td", { children: [formatDate(leg.dropoffDate), " \u00B7 ", leg.dropoffTime] })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Vehicle type", children: request.carRequest.vehicleType }), jsxRuntime.jsx(DetailField, { label: "Rental company", children: request.carRequest.rentalCompany }), jsxRuntime.jsx(DetailField, { label: "Flight number or tail number", children: request.carRequest.flightNumberOrTailNumber })] })] })), request.busRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-bus", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Bus Request" }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Pickup city", children: request.busRequest.pickupCity }), jsxRuntime.jsx(DetailField, { label: "Pickup location", children: request.busRequest.pickupLocation }), jsxRuntime.jsx(DetailField, { label: "Pickup date and time", children: formatDateTime$1(request.busRequest.pickupDateTime) }), jsxRuntime.jsx(DetailField, { label: "Drop-off city", children: request.busRequest.dropoffCity }), jsxRuntime.jsx(DetailField, { label: "Drop-off location", children: request.busRequest.dropoffLocation }), jsxRuntime.jsx(DetailField, { label: "Drop-off date and time", children: formatDateTime$1(request.busRequest.dropoffDateTime) }), jsxRuntime.jsx(DetailField, { label: "Vehicle type", children: request.busRequest.vehicleType }), request.busRequest.specialRequests && jsxRuntime.jsx(DetailField, { label: "Bus requests", children: request.busRequest.specialRequests })] })] })), request.specialRequests && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-special-requests", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Additional requests" }) }), jsxRuntime.jsx("p", { children: request.specialRequests })] }))] }))] })] }));
|
|
36059
|
+
return (jsxRuntime.jsxs("main", { className: cx(sx(pageStyle$g), className), "data-test": "individual-travel-request-detail", "aria-busy": loading, children: [jsxRuntime.jsxs("header", { className: sx(pageHeaderStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("p", { className: sx(eyebrowStyle$1), children: "Individual travel" }), jsxRuntime.jsx("h1", { className: sx(titleStyle$b), children: title }), request && !loading && !error && (jsxRuntime.jsxs("div", { className: sx(detailMetaStyle), "data-test": "individual-travel-request-detail-meta", children: [jsxRuntime.jsxs("span", { children: ["Submitted ", jsxRuntime.jsx("time", { dateTime: request.submittedAt, children: formatDateTime$1(request.submittedAt) })] }), request.completedAt && jsxRuntime.jsxs("span", { children: ["Completed ", jsxRuntime.jsx("time", { dateTime: request.completedAt, children: formatDateTime$1(request.completedAt) })] })] }))] }), onBack && (jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "individual-travel-request-detail-back", children: backLabel }))] }), jsxRuntime.jsxs("div", { className: sx(contentStyle$3), children: [loading && (jsxRuntime.jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-loading", children: [jsxRuntime.jsx(Spinner, { label: "Loading travel request" }), jsxRuntime.jsx("span", { children: "Loading request details\u2026" })] })), !loading && error && (jsxRuntime.jsxs("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-error", children: [jsxRuntime.jsx(Alert, { variant: "error", title: "The travel request could not be loaded", children: error }), onRetry && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", onClick: onRetry, "data-test": "individual-travel-request-detail-retry", children: "Try again" })] })), !loading && !error && !request && (jsxRuntime.jsx("div", { className: sx(stateStyle), "data-test": "individual-travel-request-detail-empty", children: jsxRuntime.jsx("p", { children: "No travel request was supplied." }) })), !loading && !error && request && (jsxRuntime.jsxs("div", { className: sx(formStyle), children: [notice && jsxRuntime.jsx("div", { className: sx(bannerStyle), "data-test": "individual-travel-request-detail-notice", children: jsxRuntime.jsx(Alert, { variant: "warning", children: notice }) }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-general", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Request information" }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Request number", dataTest: "individual-travel-request-detail-request-id", children: request.requestId }), jsxRuntime.jsx(DetailField, { label: "Traveler type", children: request.travelerType === 'self' ? 'Self' : 'Other traveler' }), jsxRuntime.jsx(DetailField, { label: "Submitted by", children: request.submittedBy?.name }), jsxRuntime.jsx(DetailField, { label: "Submitter email", children: request.submittedBy?.email }), request.submittedBy?.phone && jsxRuntime.jsx(DetailField, { label: "Submitter phone", children: request.submittedBy.phone }), request.additionalEmails && jsxRuntime.jsx(DetailField, { label: "Additional email addresses", children: request.additionalEmails })] })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-travelers", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Travelers" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Name" }), jsxRuntime.jsx("th", { scope: "col", children: "Date of birth" }), jsxRuntime.jsx("th", { scope: "col", children: "Gender" })] }) }), jsxRuntime.jsxs("tbody", { children: [request.travelers.map((traveler, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-traveler-${index + 1}`, children: [jsxRuntime.jsx("td", { children: travelerName(traveler) || '—' }), jsxRuntime.jsx("td", { children: formatDate(traveler.dateOfBirth) }), jsxRuntime.jsx("td", { children: traveler.gender || '—' })] }, `${travelerName(traveler)}-${index}`))), !request.travelers.length && jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: 3, className: sx(emptyValueStyle), children: "No traveler details were supplied." }) })] })] }) })] }), Boolean(request.organizationAnswers?.length) && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-organization", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Organization information" }) }), jsxRuntime.jsx(AnswerList, { answers: request.organizationAnswers, prefix: "individual-travel-request-detail-organization-answer" })] })), Boolean(request.billingAnswers?.length) && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-billing", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Billing information" }) }), jsxRuntime.jsx(AnswerList, { answers: request.billingAnswers, prefix: "individual-travel-request-detail-billing-answer" })] })), request.airRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-air", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Air Request" }), jsxRuntime.jsx("p", { className: sx(sectionDescriptionStyle), children: request.airRequest.tripType.replace('-', ' ') })] }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "From" }), jsxRuntime.jsx("th", { scope: "col", children: "To" }), jsxRuntime.jsx("th", { scope: "col", children: "Depart" }), request.airRequest.tripType === 'round-trip' && jsxRuntime.jsx("th", { scope: "col", children: "Return" })] }) }), jsxRuntime.jsx("tbody", { children: request.airRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-air-leg-${index + 1}`, children: [jsxRuntime.jsx("td", { children: leg.departureLocation }), jsxRuntime.jsx("td", { children: leg.arrivalLocation }), jsxRuntime.jsxs("td", { children: [formatDate(leg.departureDate), " \u00B7 ", leg.departureTime] }), request.airRequest?.tripType === 'round-trip' && jsxRuntime.jsxs("td", { children: [formatDate(leg.returnDate), " \u00B7 ", leg.returnTime || '—'] })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Fare preference", children: request.airRequest.farePreference }), jsxRuntime.jsx(DetailField, { label: "Flight preference", children: request.airRequest.flightPreference }), jsxRuntime.jsx(DetailField, { label: "Preferred airline", children: request.airRequest.preferredAirline }), jsxRuntime.jsx(DetailField, { label: "Most important factor", children: request.airRequest.priority }), request.airRequest.details && jsxRuntime.jsx(DetailField, { label: "Air details", children: request.airRequest.details })] })] })), request.hotelRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-hotel", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Hotel Request" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "City" }), jsxRuntime.jsx("th", { scope: "col", children: "Check in" }), jsxRuntime.jsx("th", { scope: "col", children: "Check out" })] }) }), jsxRuntime.jsx("tbody", { children: request.hotelRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-hotel-leg-${index + 1}`, children: [jsxRuntime.jsx("td", { children: leg.city }), jsxRuntime.jsx("td", { children: formatDate(leg.checkInDate) }), jsxRuntime.jsx("td", { children: formatDate(leg.checkOutDate) })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Bed preference", children: request.hotelRequest.bedPreference }), jsxRuntime.jsx(DetailField, { label: "Smoking preference", children: request.hotelRequest.smokingPreference }), jsxRuntime.jsx(DetailField, { label: "Preferred hotel", children: request.hotelRequest.preferredHotel })] })] })), request.carRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-car", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Vehicle Rental Request" }) }), jsxRuntime.jsx("div", { className: sx(detailTableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(detailTableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Pickup" }), jsxRuntime.jsx("th", { scope: "col", children: "Pickup date" }), jsxRuntime.jsx("th", { scope: "col", children: "Drop-off" }), jsxRuntime.jsx("th", { scope: "col", children: "Drop-off date" })] }) }), jsxRuntime.jsx("tbody", { children: request.carRequest.legs.map((leg, index) => (jsxRuntime.jsxs("tr", { "data-test": `individual-travel-request-detail-car-leg-${index + 1}`, children: [jsxRuntime.jsxs("td", { children: [leg.pickupCity, leg.pickupLocation ? ` · ${leg.pickupLocation}` : ''] }), jsxRuntime.jsxs("td", { children: [formatDate(leg.pickupDate), " \u00B7 ", leg.pickupTime] }), jsxRuntime.jsx("td", { children: leg.dropoffLocation || leg.pickupCity }), jsxRuntime.jsxs("td", { children: [formatDate(leg.dropoffDate), " \u00B7 ", leg.dropoffTime] })] }, index))) })] }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Vehicle type", children: request.carRequest.vehicleType }), jsxRuntime.jsx(DetailField, { label: "Rental company", children: request.carRequest.rentalCompany }), jsxRuntime.jsx(DetailField, { label: "Flight number or tail number", children: request.carRequest.flightNumberOrTailNumber })] })] })), request.busRequest && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-bus", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Bus Request" }) }), jsxRuntime.jsxs("dl", { className: sx(detailGridStyle), children: [jsxRuntime.jsx(DetailField, { label: "Pickup city", children: request.busRequest.pickupCity }), jsxRuntime.jsx(DetailField, { label: "Pickup location", children: request.busRequest.pickupLocation }), jsxRuntime.jsx(DetailField, { label: "Pickup date and time", children: formatDateTime$1(request.busRequest.pickupDateTime) }), jsxRuntime.jsx(DetailField, { label: "Drop-off city", children: request.busRequest.dropoffCity }), jsxRuntime.jsx(DetailField, { label: "Drop-off location", children: request.busRequest.dropoffLocation }), jsxRuntime.jsx(DetailField, { label: "Drop-off date and time", children: formatDateTime$1(request.busRequest.dropoffDateTime) }), jsxRuntime.jsx(DetailField, { label: "Vehicle type", children: request.busRequest.vehicleType }), request.busRequest.specialRequests && jsxRuntime.jsx(DetailField, { label: "Bus requests", children: request.busRequest.specialRequests })] })] })), request.specialRequests && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$3), "data-test": "individual-travel-request-detail-special-requests", children: [jsxRuntime.jsx("div", { className: sx(sectionHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$4), children: "Additional requests" }) }), jsxRuntime.jsx("p", { children: request.specialRequests })] }))] }))] })] }));
|
|
35987
36060
|
};
|
|
35988
36061
|
|
|
35989
36062
|
/**
|
|
@@ -35995,7 +36068,7 @@ const IndividualTravelRequestDetailPage = ({ request, loading = false, error, no
|
|
|
35995
36068
|
* the first place, and `'& p'` / `'& ul, & ol'` say what `:global` was working
|
|
35996
36069
|
* around.
|
|
35997
36070
|
*/
|
|
35998
|
-
const pageStyle$
|
|
36071
|
+
const pageStyle$f = {
|
|
35999
36072
|
label: 'InfoCenterPage-pageStyle',
|
|
36000
36073
|
display: 'flex',
|
|
36001
36074
|
flexDirection: 'column',
|
|
@@ -36040,7 +36113,7 @@ const headerTextStyle = {
|
|
|
36040
36113
|
label: 'InfoCenterPage-headerTextStyle',
|
|
36041
36114
|
flex: 1,
|
|
36042
36115
|
};
|
|
36043
|
-
const titleStyle$
|
|
36116
|
+
const titleStyle$a = {
|
|
36044
36117
|
label: 'InfoCenterPage-titleStyle',
|
|
36045
36118
|
fontSize: 'var(--fs-2xl)',
|
|
36046
36119
|
lineHeight: 'var(--lh-2xl)',
|
|
@@ -36092,7 +36165,7 @@ const gridStyle = {
|
|
|
36092
36165
|
gap: 'var(--space-4)',
|
|
36093
36166
|
};
|
|
36094
36167
|
/* Article card */
|
|
36095
|
-
const cardStyle$
|
|
36168
|
+
const cardStyle$2 = {
|
|
36096
36169
|
label: 'InfoCenterPage-cardStyle',
|
|
36097
36170
|
position: 'relative',
|
|
36098
36171
|
display: 'flex',
|
|
@@ -36242,7 +36315,7 @@ const CATEGORY_ORDER = ['Alert', 'General', 'Air', 'Car', 'Hotel', 'Policy', 'ST
|
|
|
36242
36315
|
const ArticleCard = ({ article, isAdmin, onOpen, onEdit }) => {
|
|
36243
36316
|
const meta = metaFor(article.category);
|
|
36244
36317
|
const CategoryIcon = meta.icon;
|
|
36245
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(cardStyle$
|
|
36318
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(cardStyle$2), meta.alert && sx(cardAlertStyle)), children: [jsxRuntime.jsxs("span", { className: cx(sx(categoryBadgeStyle), meta.alert && sx(categoryAlertStyle)), children: [jsxRuntime.jsx(CategoryIcon, { size: 13 }), meta.label] }), jsxRuntime.jsx("h3", { className: sx(cardTitleStyle), children: article.title }), article.body && jsxRuntime.jsx("p", { className: sx(cardBodyStyle), children: article.body }), jsxRuntime.jsxs("button", { type: "button", className: sx(readMoreStyle), onClick: () => onOpen(article), children: ["Read more", jsxRuntime.jsx(ChevronRightIcon$1, { size: 14 })] }), isAdmin && (jsxRuntime.jsx("button", { type: "button", className: sx(editButtonStyle), onClick: () => onEdit?.(article), title: "Edit article", "aria-label": "Edit article", children: jsxRuntime.jsx(EditIcon$2, { size: 14 }) }))] }));
|
|
36246
36319
|
};
|
|
36247
36320
|
/**
|
|
36248
36321
|
* InfoCenterPage - Info Center article browser
|
|
@@ -36295,7 +36368,7 @@ const InfoCenterPage = ({ title = 'Info Center', accountName, articles = [], sta
|
|
|
36295
36368
|
};
|
|
36296
36369
|
const modalMeta = modalArticle ? metaFor(modalArticle.category) : null;
|
|
36297
36370
|
const ModalCategoryIcon = modalMeta?.icon;
|
|
36298
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
36371
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$f), className), children: [showBreadcrumb && (jsxRuntime.jsxs("nav", { className: sx(breadcrumbStyle$3), "aria-label": "Breadcrumb", children: [jsxRuntime.jsxs("a", { href: homeHref, children: [jsxRuntime.jsx(HomeIcon, { size: 14 }), "Home"] }), jsxRuntime.jsx("span", { children: "/" }), jsxRuntime.jsx("span", { children: "Info Center" })] })), jsxRuntime.jsxs("div", { className: sx(headerStyle$c), children: [jsxRuntime.jsxs("div", { className: sx(headerTextStyle), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$a), children: title }), accountName && (jsxRuntime.jsxs("p", { className: sx(subtitleStyle$3), children: ["Travel resources and program information for ", accountName, "."] }))] }), isAdmin && (jsxRuntime.jsxs(Button, { variant: "primary", size: "sm", onClick: onAddArticle, children: [jsxRuntime.jsx(PlusIcon$2, { size: 15 }), "Add Article"] }))] }), pageState === 'loading' && (jsxRuntime.jsxs("div", { className: sx(stateBlockStyle), children: [jsxRuntime.jsx(Spinner, { size: "md" }), jsxRuntime.jsx("span", { children: "Loading\u2026" })] })), pageState === 'error' && (jsxRuntime.jsxs("div", { className: cx(sx(stateBlockStyle), sx(stateErrorStyle)), children: [jsxRuntime.jsx(WarningIcon$1, { size: 28 }), jsxRuntime.jsx("p", { className: sx(stateTextStyle), children: "Unable to load Info Center resources." })] })), pageState === 'empty' && (jsxRuntime.jsxs("div", { className: sx(stateBlockStyle), children: [jsxRuntime.jsx(InfoIcon$1, { size: 28 }), jsxRuntime.jsx("p", { className: sx(stateTextStyle), children: "No resources available." })] })), pageState === 'data' && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TabStrip, { className: sx(tabsStyle$1), tabs: [
|
|
36299
36372
|
{ id: 'All', label: 'All', icon: jsxRuntime.jsx(GridIcon, { size: 15 }) },
|
|
36300
36373
|
...categories.map((cat) => {
|
|
36301
36374
|
const m = metaFor(cat);
|
|
@@ -36319,7 +36392,7 @@ const InfoCenterPage = ({ title = 'Info Center', accountName, articles = [], sta
|
|
|
36319
36392
|
* between two module classes (`.costTotal .costLabel/.costValue`) becomes
|
|
36320
36393
|
* `costTotalTextStyle` — see the note there.
|
|
36321
36394
|
*/
|
|
36322
|
-
const pageStyle$
|
|
36395
|
+
const pageStyle$e = {
|
|
36323
36396
|
label: 'ItineraryPage-pageStyle',
|
|
36324
36397
|
display: 'flex',
|
|
36325
36398
|
flexDirection: 'column',
|
|
@@ -36769,13 +36842,13 @@ const ItineraryPage = ({ tripName, recordLocator, travelers, startDate, endDate,
|
|
|
36769
36842
|
const agentCard = agent && (jsxRuntime.jsxs("section", { className: sx(agentCardStyle), "aria-label": "Your travel team", children: [jsxRuntime.jsx("div", { className: sx(agentHeaderStyle), children: jsxRuntime.jsx("h2", { className: sx(agentTitleStyle), children: "Your Travel Team" }) }), jsxRuntime.jsxs("div", { className: sx(agentRowStyle), children: [jsxRuntime.jsxs("div", { className: sx(agentInfoStyle), children: [jsxRuntime.jsx("p", { className: sx(agentNameStyle), children: agent.name }), agent.role && jsxRuntime.jsx("p", { className: sx(agentRoleStyle), children: agent.role })] }), jsxRuntime.jsxs("ul", { className: sx(agentLinksStyle), children: [agent.email && (jsxRuntime.jsx(AgentContact, { icon: jsxRuntime.jsx(MailIcon, { size: 16 }), label: "Email", children: jsxRuntime.jsx("a", { className: sx(agentLinkStyle), href: `mailto:${agent.email}`, children: agent.email }) })), agent.businessHours && (jsxRuntime.jsx(AgentContact, { icon: jsxRuntime.jsx(CalendarIcon$1, { size: 16 }), label: "Business Hours", children: agent.businessHours })), agent.tollFreeNumber && (jsxRuntime.jsx(AgentContact, { icon: jsxRuntime.jsx(PhoneIcon, { size: 16 }), label: "Toll Free Number", children: jsxRuntime.jsx("a", { className: sx(agentLinkStyle), href: telHref(agent.tollFreeNumber), children: agent.tollFreeNumber }) })), agent.afterHoursPhone && (jsxRuntime.jsxs(AgentContact, { icon: jsxRuntime.jsx(HeadsetIcon, { size: 16 }), label: "After-Hours/Emergency Service", children: [jsxRuntime.jsx("a", { className: sx(agentLinkStyle), href: telHref(agent.afterHoursPhone), children: agent.afterHoursPhone }), agent.afterHoursNote && jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [" ", agent.afterHoursNote] })] }))] })] })] }));
|
|
36770
36843
|
const titleRow = (jsxRuntime.jsxs("div", { className: sx(titleRowStyle), children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$3), children: "Air Invoice Details" }), showStatus && jsxRuntime.jsx(StatusBadge, { status: badge.variant, label: badge.label })] }));
|
|
36771
36844
|
const actions = showActions && (jsxRuntime.jsxs("div", { className: sx(actionsStyle$1), "aria-label": "Itinerary actions", children: [onPrint && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsxRuntime.jsx(PrinterIcon, { size: 16 }), "data-test": "itinerary-print", onClick: onPrint, children: "Print" }), onEmail && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsxRuntime.jsx(MailIcon, { size: 16 }), "data-test": "itinerary-email", onClick: onEmail, children: "Email" }), onAddToCalendar && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsxRuntime.jsx(CalendarIcon$1, { size: 16 }), "data-test": "itinerary-add-to-calendar", onClick: onAddToCalendar, children: "Add to calendar" }), onDownloadInvoice && jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", leftIcon: jsxRuntime.jsx(DocumentIcon, { size: 16 }), "data-test": "itinerary-download-invoice", onClick: onDownloadInvoice, children: "Invoice PDF" })] }));
|
|
36772
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
36845
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$e), className), "data-test": "itinerary-page", children: [jsxRuntime.jsx(PageHeaderSubsection, { sectionName: sectionName, pageName: pageName ?? (travelers.length > 0 ? `Itinerary for ${itineraryPageName(travelers)}` : 'Itinerary'), meta: startDate && endDate ? jsxRuntime.jsx(TravelDateRange, { startDate: startDate, endDate: endDate }) : undefined, onBack: onBack, backLabel: backLabel }), !showInvoice && notices, !showInvoice && agentCard, showInvoice ? (jsxRuntime.jsxs("section", { className: sx(invoiceSectionStyle), "aria-label": "Booking and invoice", children: [jsxRuntime.jsxs("div", { className: sx(invoiceActionsStyle), children: [jsxRuntime.jsx(Segment, { size: "sm", options: VIEW_OPTIONS, value: view, onChange: changeView, "aria-label": "Itinerary view" }), actions] }), !itineraryOnly && notices, !itineraryOnly && agentCard, !itineraryOnly && bookingCard, !itineraryOnly && invoice && jsxRuntime.jsx(AirInvoiceCard, { ...invoice, title: "Air Invoice Details" })] })) : (jsxRuntime.jsxs("header", { className: sx(headerStyle$b), children: [jsxRuntime.jsxs("div", { className: sx(headerMainStyle$1), children: [titleRow, jsxRuntime.jsxs("dl", { className: sx(factsStyle$1), children: [recordLocator && (jsxRuntime.jsxs("div", { className: sx(factStyle), children: [jsxRuntime.jsx("dt", { className: sx(factLabelStyle), children: "Confirmation" }), jsxRuntime.jsx("dd", { className: cx(sx(factValueStyle), sx(monoStyle$1)), children: recordLocator })] })), startDate && endDate && (jsxRuntime.jsxs("div", { className: sx(factStyle), children: [jsxRuntime.jsx("dt", { className: sx(factLabelStyle), children: "Travel dates" }), jsxRuntime.jsx("dd", { className: sx(factValueStyle), children: formatItineraryDateRange(startDate, endDate) })] })), travelers.length > 0 && (jsxRuntime.jsxs("div", { className: sx(factStyle), children: [jsxRuntime.jsx("dt", { className: sx(factLabelStyle), children: travelers.length === 1 ? 'Traveler' : 'Travelers' }), jsxRuntime.jsx("dd", { className: sx(factValueStyle), title: travelers.join(', '), children: travelerLabel })] })), sportCode && (jsxRuntime.jsxs("div", { className: sx(factStyle), children: [jsxRuntime.jsx("dt", { className: sx(factLabelStyle), children: "Program" }), jsxRuntime.jsx("dd", { className: sx(factValueStyle), children: sportCode })] }))] })] }), actions] })), !showInvoice && bookingCard, !itineraryOnly && travelers.length > 1 && (jsxRuntime.jsxs("section", { className: sx(travelersStyle), "aria-label": "Travelers on this itinerary", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$3), children: "Travelers" }), jsxRuntime.jsx("ul", { className: sx(travelerListStyle), children: travelers.map((traveler) => jsxRuntime.jsx("li", { className: sx(travelerChipStyle), children: traveler }, traveler)) })] })), !itineraryOnly && !loading && !error && notice && (jsxRuntime.jsx("div", { "data-test": "itinerary-notice", children: jsxRuntime.jsx(Alert, { variant: "warning", title: "Additional booking details", children: notice }) })), jsxRuntime.jsxs("div", { className: sx(bodyStyle$1), children: [jsxRuntime.jsx("div", { className: sx(mainStyle$1), children: jsxRuntime.jsxs("div", { "data-test": loading ? 'itinerary-loading' : error ? 'itinerary-error' : undefined, children: [jsxRuntime.jsx(ItineraryTimeline, { segments: segments, loading: loading, error: error, onCheckIn: onCheckIn, showTypeTabs: true }), error && onRetry && (jsxRuntime.jsx("div", { className: sx(retryRowStyle), children: jsxRuntime.jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: onRetry, "data-test": "itinerary-retry", children: "Try again" }) }))] }) }), !loading && !error && (closingBanners.length > 0 || closingNotes) && (jsxRuntime.jsxs("div", { className: sx(noticesStyle), "data-test": "itinerary-closing", children: [closingBanners.length > 0 && jsxRuntime.jsx(PageBanners, { className: sx(bannersStyle), systemBanners: closingBanners, alertBanners: [] }), closingNotes && jsxRuntime.jsx("div", { className: sx(closingNotesStyle), children: closingNotes })] }))] })] }));
|
|
36773
36846
|
};
|
|
36774
36847
|
ItineraryPage.displayName = 'ItineraryPage';
|
|
36775
36848
|
|
|
36776
36849
|
/** NotFoundPage's compiled rules. A straight translation — nothing in the
|
|
36777
36850
|
* stylesheet overlapped, so no specificity work was needed. */
|
|
36778
|
-
const pageStyle$
|
|
36851
|
+
const pageStyle$d = {
|
|
36779
36852
|
label: 'NotFoundPage-pageStyle',
|
|
36780
36853
|
display: 'flex',
|
|
36781
36854
|
alignItems: 'center',
|
|
@@ -36784,7 +36857,7 @@ const pageStyle$c = {
|
|
|
36784
36857
|
padding: 'var(--space-4)',
|
|
36785
36858
|
backgroundColor: 'var(--color-gray-100)',
|
|
36786
36859
|
};
|
|
36787
|
-
const cardStyle = {
|
|
36860
|
+
const cardStyle$1 = {
|
|
36788
36861
|
label: 'NotFoundPage-cardStyle',
|
|
36789
36862
|
width: '100%',
|
|
36790
36863
|
maxWidth: 400,
|
|
@@ -36813,7 +36886,7 @@ const errorCodeStyle = {
|
|
|
36813
36886
|
color: 'var(--color-gray-800)',
|
|
36814
36887
|
margin: '0 0 var(--space-4) 0',
|
|
36815
36888
|
};
|
|
36816
|
-
const titleStyle$
|
|
36889
|
+
const titleStyle$9 = {
|
|
36817
36890
|
label: 'NotFoundPage-titleStyle',
|
|
36818
36891
|
fontSize: 'var(--text-xl)',
|
|
36819
36892
|
fontWeight: 'var(--font-medium)',
|
|
@@ -36842,13 +36915,13 @@ const DefaultIllustration = () => (jsxRuntime.jsxs("svg", { width: "120", height
|
|
|
36842
36915
|
* - Optional illustration
|
|
36843
36916
|
*/
|
|
36844
36917
|
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 = '', }) => {
|
|
36845
|
-
const pageClasses = cx(sx(pageStyle$
|
|
36846
|
-
return (jsxRuntime.jsx("div", { className: pageClasses, children: jsxRuntime.jsxs("div", { className: sx(cardStyle), children: [jsxRuntime.jsx("div", { className: sx(illustrationStyle), children: illustration || jsxRuntime.jsx(DefaultIllustration, {}) }), jsxRuntime.jsx("h1", { className: sx(errorCodeStyle), children: errorCode }), jsxRuntime.jsx("h2", { className: sx(titleStyle$
|
|
36918
|
+
const pageClasses = cx(sx(pageStyle$d), className);
|
|
36919
|
+
return (jsxRuntime.jsx("div", { className: pageClasses, children: jsxRuntime.jsxs("div", { className: sx(cardStyle$1), children: [jsxRuntime.jsx("div", { className: sx(illustrationStyle), children: illustration || jsxRuntime.jsx(DefaultIllustration, {}) }), jsxRuntime.jsx("h1", { className: sx(errorCodeStyle), children: errorCode }), jsxRuntime.jsx("h2", { className: sx(titleStyle$9), children: title }), jsxRuntime.jsx("p", { className: sx(messageStyle), children: message }), action && (jsxRuntime.jsx("div", { className: sx(actionStyle), children: action }))] }) }));
|
|
36847
36920
|
};
|
|
36848
36921
|
NotFoundPage.displayName = 'NotFoundPage';
|
|
36849
36922
|
|
|
36850
36923
|
/** OffFleetLearnedExamplesPage's compiled rules — flat, no specificity ladder. */
|
|
36851
|
-
const pageStyle$
|
|
36924
|
+
const pageStyle$c = {
|
|
36852
36925
|
label: 'OffFleetLearnedExamplesPage-pageStyle',
|
|
36853
36926
|
display: 'flex',
|
|
36854
36927
|
flexDirection: 'column',
|
|
@@ -36864,7 +36937,7 @@ const headerStyle$a = {
|
|
|
36864
36937
|
flexDirection: 'column',
|
|
36865
36938
|
gap: 'var(--space-2)',
|
|
36866
36939
|
};
|
|
36867
|
-
const titleStyle$
|
|
36940
|
+
const titleStyle$8 = {
|
|
36868
36941
|
label: 'OffFleetLearnedExamplesPage-titleStyle',
|
|
36869
36942
|
margin: 0,
|
|
36870
36943
|
color: 'var(--fg-1)',
|
|
@@ -36943,7 +37016,7 @@ const pairTitleStyle = {
|
|
|
36943
37016
|
letterSpacing: '0.06em',
|
|
36944
37017
|
textTransform: 'uppercase',
|
|
36945
37018
|
};
|
|
36946
|
-
const codeStyle = {
|
|
37019
|
+
const codeStyle$1 = {
|
|
36947
37020
|
label: 'OffFleetLearnedExamplesPage-codeStyle',
|
|
36948
37021
|
maxHeight: 260,
|
|
36949
37022
|
margin: 0,
|
|
@@ -36968,7 +37041,7 @@ const OFF_FLEET_LEARNED_EMPTY_COPY = 'The corpus starts empty and only /api/Repr
|
|
|
36968
37041
|
* Learned examples — the corrections corpus. The empty state explains the mechanism
|
|
36969
37042
|
* rather than apologising, because an empty corpus is the correct starting state.
|
|
36970
37043
|
*/
|
|
36971
|
-
const OffFleetLearnedExamplesPage = ({ examples = [], onOpenExample, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
37044
|
+
const OffFleetLearnedExamplesPage = ({ examples = [], onOpenExample, className = '', }) => (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$c), className), "data-test": "off-fleet-learned-examples-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$a), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$8), children: "Learned examples" }), jsxRuntime.jsx("p", { className: sx(descriptionStyle$3), children: OFF_FLEET_LEARNED_DESCRIPTION })] }), examples.length === 0 ? (jsxRuntime.jsx(EmptyState$1, { title: "No examples yet", description: OFF_FLEET_LEARNED_EMPTY_COPY, icon: jsxRuntime.jsx(LightbulbIcon, { size: 32 }) })) : (jsxRuntime.jsx("ul", { className: sx(examplesStyle), children: examples.map((example) => (jsxRuntime.jsxs("li", { className: sx(exampleStyle), "data-test": "off-fleet-learned-example", children: [jsxRuntime.jsxs("div", { className: sx(exampleHeaderStyle), children: [jsxRuntime.jsx("span", { className: sx(operatorStyle), children: example.operator }), jsxRuntime.jsxs("span", { className: sx(metaStyle), children: [example.sourceFileName, " \u00B7 learned ", example.learnedLabel] }), onOpenExample && (jsxRuntime.jsx(Button, { variant: "outline", size: "sm", className: sx(openButtonStyle), onClick: () => onOpenExample(example.id), "data-test": "off-fleet-open-example", children: "Open" }))] }), jsxRuntime.jsxs("div", { className: sx(pairStyle), children: [jsxRuntime.jsxs("div", { className: sx(pairSideStyle), children: [jsxRuntime.jsx("h2", { className: sx(pairTitleStyle), children: "Raw text" }), jsxRuntime.jsx("pre", { className: sx(codeStyle$1), "data-test": "off-fleet-example-raw", children: example.rawText })] }), jsxRuntime.jsxs("div", { className: sx(pairSideStyle), children: [jsxRuntime.jsx("h2", { className: sx(pairTitleStyle), children: "Corrected JSON" }), jsxRuntime.jsx("pre", { className: sx(codeStyle$1), "data-test": "off-fleet-example-json", children: example.correctedJson })] })] })] }, example.id))) }))] }));
|
|
36972
37045
|
OffFleetLearnedExamplesPage.displayName = 'OffFleetLearnedExamplesPage';
|
|
36973
37046
|
|
|
36974
37047
|
/**
|
|
@@ -36977,7 +37050,7 @@ OffFleetLearnedExamplesPage.displayName = 'OffFleetLearnedExamplesPage';
|
|
|
36977
37050
|
* One rule per element, no shared properties between them, so no selector
|
|
36978
37051
|
* needed doubling on the way across.
|
|
36979
37052
|
*/
|
|
36980
|
-
const pageStyle$
|
|
37053
|
+
const pageStyle$b = {
|
|
36981
37054
|
label: 'OffFleetReviewQueuePage-pageStyle',
|
|
36982
37055
|
display: 'flex',
|
|
36983
37056
|
flexDirection: 'column',
|
|
@@ -36993,7 +37066,7 @@ const headerStyle$9 = {
|
|
|
36993
37066
|
flexDirection: 'column',
|
|
36994
37067
|
gap: 'var(--space-2)',
|
|
36995
37068
|
};
|
|
36996
|
-
const titleStyle$
|
|
37069
|
+
const titleStyle$7 = {
|
|
36997
37070
|
label: 'OffFleetReviewQueuePage-titleStyle',
|
|
36998
37071
|
margin: 0,
|
|
36999
37072
|
color: 'var(--fg-1)',
|
|
@@ -37140,7 +37213,7 @@ const OffFleetReviewQueuePage = ({ submissions, counts, onReview, onOpenRawText,
|
|
|
37140
37213
|
render: (_value, submission) => (jsxRuntime.jsx(Button, { size: "sm", onClick: () => onReview?.(submission.id), "data-test": "off-fleet-review", children: "Review" })),
|
|
37141
37214
|
},
|
|
37142
37215
|
];
|
|
37143
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
37216
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$b), className), "data-test": "off-fleet-review-queue-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$9), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$7), children: "Review queue" }), jsxRuntime.jsx("p", { className: sx(descriptionStyle$2), children: OFF_FLEET_QUEUE_DESCRIPTION })] }), jsxRuntime.jsxs("div", { className: sx(statsStyle), "data-test": "off-fleet-stats", children: [jsxRuntime.jsx(Metric, { label: "Needs review", value: tally['needs-review'] }), jsxRuntime.jsx(Metric, { label: "Received", value: tally.received }), jsxRuntime.jsx(Metric, { label: "Processing", value: tally.processing }), jsxRuntime.jsx(Metric, { label: "Parsed", value: tally.parsed }), jsxRuntime.jsx(Metric, { label: "All submissions", value: tally.all })] }), jsxRuntime.jsx(Table, { columns: columns, data: submissions, rowKey: "id", loading: loading, emptyContent: jsxRuntime.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." }) })] }));
|
|
37144
37217
|
};
|
|
37145
37218
|
OffFleetReviewQueuePage.displayName = 'OffFleetReviewQueuePage';
|
|
37146
37219
|
|
|
@@ -37153,7 +37226,7 @@ OffFleetReviewQueuePage.displayName = 'OffFleetReviewQueuePage';
|
|
|
37153
37226
|
* `.section` together, is now split across the two style objects it applied to
|
|
37154
37227
|
* — an object owns every rule that targets it.
|
|
37155
37228
|
*/
|
|
37156
|
-
const pageStyle$
|
|
37229
|
+
const pageStyle$a = {
|
|
37157
37230
|
label: 'OffFleetSubmissionDetailPage-pageStyle',
|
|
37158
37231
|
display: 'flex',
|
|
37159
37232
|
flexDirection: 'column',
|
|
@@ -37186,7 +37259,7 @@ const headerStyle$8 = {
|
|
|
37186
37259
|
flexDirection: 'column',
|
|
37187
37260
|
gap: 'var(--space-1)',
|
|
37188
37261
|
};
|
|
37189
|
-
const titleStyle$
|
|
37262
|
+
const titleStyle$6 = {
|
|
37190
37263
|
label: 'OffFleetSubmissionDetailPage-titleStyle',
|
|
37191
37264
|
margin: 0,
|
|
37192
37265
|
color: 'var(--fg-1)',
|
|
@@ -37508,13 +37581,13 @@ const OffFleetSubmissionDetailPage = ({ submissionId, fileName, statusLabel = 'N
|
|
|
37508
37581
|
target?.querySelector('input')?.focus();
|
|
37509
37582
|
};
|
|
37510
37583
|
const blocked = Boolean(blockedReason);
|
|
37511
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
37584
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$a), className), "data-test": "off-fleet-submission-detail-page", children: [jsxRuntime.jsxs("div", { className: sx(topRowStyle), children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$2), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "off-fleet-detail-back", children: backLabel })), jsxRuntime.jsx(StatusBadge, { status: "in-review", label: statusLabel })] }), jsxRuntime.jsxs("header", { className: sx(headerStyle$8), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$6), children: fileName }), jsxRuntime.jsx("p", { className: sx(subtitleStyle$2), children: submissionId })] }), jsxRuntime.jsx(Alert, { variant: "warning", title: "Why this needs review", children: jsxRuntime.jsx("span", { className: sx(reasonStyle), "data-test": "off-fleet-detail-reason", children: failureReason }) }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Source document", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Source document" }), jsxRuntime.jsx("p", { className: sx(sectionHelpStyle$1), children: "Text the parser actually read \u2014 OCR damage included." }), jsxRuntime.jsx("pre", { className: sx(rawTextStyle), "data-test": "off-fleet-raw-text", children: rawText })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Submission", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Submission" }), jsxRuntime.jsxs("dl", { className: sx(factsStyle), children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "File name" }), jsxRuntime.jsx("dd", { children: fileName })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Carrier" }), jsxRuntime.jsx("dd", { children: carrier })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Carrier Union" }), jsxRuntime.jsx("dd", { className: sx(monoStyle), children: carrierUnion })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Flight Program" }), jsxRuntime.jsx("dd", { className: sx(monoStyle), children: flightProgram })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Received" }), jsxRuntime.jsx("dd", { children: receivedAt })] }), jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("dt", { children: "Updated" }), jsxRuntime.jsx("dd", { children: updatedAt })] })] })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Segments", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Segments" }), jsxRuntime.jsxs("p", { className: sx(sectionHelpStyle$1), children: [charterSegmentCount, " charter segment(s) on this Flight Program"] }), jsxRuntime.jsx(Accordion, { defaultOpen: false, header: jsxRuntime.jsxs("span", { className: sx(accordionHeaderStyle), children: ["Trip segments available for matching (", charterSegmentCount, ")"] }), children: jsxRuntime.jsx("div", { className: sx(tableScrollStyle), children: jsxRuntime.jsxs("table", { className: sx(segmentTableStyle), "data-test": "off-fleet-segments", children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Departs" }), jsxRuntime.jsx("th", { scope: "col", children: "Route" }), jsxRuntime.jsx("th", { scope: "col", children: "Trip" })] }) }), jsxRuntime.jsx("tbody", { children: tripSegments.map((segment) => (jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("td", { children: segment.departs }), jsxRuntime.jsxs("td", { children: [segment.origin, " \u2192 ", segment.destination] }), jsxRuntime.jsx("td", { className: sx(monoStyle), children: segment.tripGuid })] }, segment.id))) })] }) }) })] }), extractionJson && (jsxRuntime.jsx("section", { className: sx(sectionStyle$2), "aria-label": "Extraction JSON", children: jsxRuntime.jsx(Accordion, { defaultOpen: false, header: jsxRuntime.jsx("span", { className: sx(accordionHeaderStyle), children: "Extraction JSON as stored" }), children: jsxRuntime.jsx("pre", { className: sx(rawTextStyle), "data-test": "off-fleet-extraction-json", children: extractionJson }) }) })), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Quote header", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Quote header" }), jsxRuntime.jsx("p", { className: sx(sectionHelpStyle$1), children: "Fields the parser maps onto the Salesforce Flight Quote. Blank means null." }), jsxRuntime.jsxs("div", { className: sx(headerGridStyle), children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" })] })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Flight legs", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Flight legs" }), jsxRuntime.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." }), jsxRuntime.jsx("ol", { className: sx(legsStyle$1), children: legs.map((leg, index) => (jsxRuntime.jsxs("li", { className: sx(legStyle$1), ref: (node) => {
|
|
37512
37585
|
legRefs.current[leg.id] = node;
|
|
37513
37586
|
}, "data-test": "off-fleet-leg", children: [jsxRuntime.jsxs("div", { className: sx(legHeaderStyle), children: [jsxRuntime.jsxs("span", { className: sx(legIndexStyle), children: ["Leg ", index + 1] }), jsxRuntime.jsx(StatusBadge, { status: MATCH_BADGES[leg.match].status, label: MATCH_BADGES[leg.match].label }), jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(removeLegStyle), onClick: () => removeLeg(leg.id), "data-test": "off-fleet-remove-leg", children: "Remove leg" })] }), jsxRuntime.jsxs("div", { className: sx(legGridStyle), children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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))) }), jsxRuntime.jsx(Button, { variant: "outline", size: "sm", onClick: addLeg, "data-test": "off-fleet-add-leg", children: "Add leg" })] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Ambiguity flag", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Ambiguity flag" }), jsxRuntime.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 && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$2), "aria-label": "Pre-flight check", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$2), children: "Pre-flight check" }), jsxRuntime.jsx("div", { className: sx(tableScrollStyle), children: jsxRuntime.jsxs("table", { className: sx(preflightTableStyle), "data-test": "off-fleet-preflight", children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "col", children: "Leg" }), jsxRuntime.jsx("th", { scope: "col", children: "As stated" }), jsxRuntime.jsx("th", { scope: "col", children: "Per leg after normalization" })] }) }), jsxRuntime.jsx("tbody", { children: preflight.rows.map((row) => (jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "row", children: row.leg }), jsxRuntime.jsx("td", { children: row.asStated }), jsxRuntime.jsx("td", { children: row.perLegAfterNormalization })] }, row.leg))) }), jsxRuntime.jsx("tfoot", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { scope: "row", children: "Total" }), jsxRuntime.jsx("td", {}), jsxRuntime.jsx("td", { "data-test": "off-fleet-preflight-total", children: preflight.total })] }) })] }) }), jsxRuntime.jsxs("p", { className: sx(unmatchedStyle), "data-test": "off-fleet-unmatched-count", children: [preflight.unmatchedCount, " of ", preflight.legCount, " leg(s) unmatched"] }), jsxRuntime.jsx("ul", { className: sx(groupingsStyle), "data-test": "off-fleet-trip-groupings", children: preflight.tripGroupings.map((grouping) => (jsxRuntime.jsxs("li", { className: sx(groupingStyle), children: [jsxRuntime.jsx("span", { className: sx(monoStyle), children: grouping.tripGuid }), jsxRuntime.jsxs("span", { children: [grouping.legCount, " leg(s) \u00B7 ", grouping.total] })] }, grouping.tripGuid))) }), jsxRuntime.jsx("p", { className: sx(consequenceStyle), children: "Each total becomes one QuoteLineItem against a new Flight Quote for that Trip." }), preflight.diagnostics?.map((diagnostic) => (jsxRuntime.jsxs("div", { className: sx(diagnosticStyle), children: [jsxRuntime.jsx("p", { className: sx(diagnosticMessageStyle), "data-test": "off-fleet-diagnostic", children: diagnostic.message }), jsxRuntime.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) => (jsxRuntime.jsx(Alert, { variant: "warning", children: jsxRuntime.jsx("span", { className: sx(reasonStyle), "data-test": "off-fleet-warning", children: warning }) }, warning)))] })), jsxRuntime.jsxs("div", { className: sx(actionsStyle), children: [jsxRuntime.jsx(Button, { disabled: blocked, onClick: () => onCheckCorrection?.({ quoteHeader, legs, ambiguityReason }), "data-test": "off-fleet-check-correction", children: "Check correction" }), jsxRuntime.jsx(Button, { variant: "secondary", disabled: blocked, onClick: onReprocess, "data-test": "off-fleet-reprocess", children: "Reprocess submission" }), blockedReason && (jsxRuntime.jsx("p", { className: sx(blockedReasonStyle), "data-test": "off-fleet-blocked-reason", children: blockedReason }))] })] }));
|
|
37514
37587
|
};
|
|
37515
37588
|
OffFleetSubmissionDetailPage.displayName = 'OffFleetSubmissionDetailPage';
|
|
37516
37589
|
|
|
37517
|
-
const pageStyle$
|
|
37590
|
+
const pageStyle$9 = {
|
|
37518
37591
|
label: 'RosterProgramNumbersPage-pageStyle',
|
|
37519
37592
|
display: 'flex',
|
|
37520
37593
|
minWidth: 0,
|
|
@@ -37690,11 +37763,11 @@ const RosterProgramNumbersPage = ({ programs, loading = false, saving = false, o
|
|
|
37690
37763
|
accountNumber: values[String(program.id)] ?? '',
|
|
37691
37764
|
})));
|
|
37692
37765
|
};
|
|
37693
|
-
return (jsxRuntime.jsxs("section", { className: sx(pageStyle$
|
|
37766
|
+
return (jsxRuntime.jsxs("section", { className: sx(pageStyle$9), "data-test": "roster-program-numbers-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$7), children: [jsxRuntime.jsxs("div", { className: sx(headingStyle$1), children: [jsxRuntime.jsx("h1", { children: "Edit Program Numbers" }), jsxRuntime.jsx("p", { children: "Update existing traveler loyalty-program numbers without changing the rest of the roster." })] }), jsxRuntime.jsx(Button, { type: "button", variant: "outline", size: "sm", "data-test": "program-numbers-back", onClick: onBack, children: "Back to Roster" })] }), jsxRuntime.jsx(Module, { title: "Roster Program Numbers", useToggle: false, children: jsxRuntime.jsxs("form", { onSubmit: submit, "data-test": "program-numbers-form", children: [loading ? (jsxRuntime.jsx("div", { className: sx(emptyStyle$2), role: "status", children: "Loading roster program numbers..." })) : programs.length ? (jsxRuntime.jsx("div", { className: sx(tableWrapStyle), children: jsxRuntime.jsxs("table", { className: sx(tableStyle), children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { children: "Traveler" }), jsxRuntime.jsx("th", { children: "Program" }), jsxRuntime.jsx("th", { children: "Program Number" })] }) }), jsxRuntime.jsx("tbody", { children: programs.map((program) => (jsxRuntime.jsxs("tr", { "data-test": `program-number-row-${program.id}`, children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsxs("div", { className: sx(travelerStyle), children: [jsxRuntime.jsx("strong", { children: program.travelerName }), program.travelerType && jsxRuntime.jsx("span", { children: program.travelerType })] }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx("span", { className: sx(supplierStyle), children: program.supplierName }) }), jsxRuntime.jsx("td", { className: sx(inputCellStyle), children: jsxRuntime.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))) })] }) })) : (jsxRuntime.jsx("div", { className: sx(emptyStyle$2), children: "No existing membership programs are available to edit." })), !!programs.length && (jsxRuntime.jsxs("div", { className: sx(footerStyle$1), children: [jsxRuntime.jsx(Button, { type: "button", variant: "outline", disabled: saving, onClick: onBack, children: "Cancel" }), jsxRuntime.jsx(Button, { type: "submit", loading: saving, "data-test": "program-numbers-submit", children: "Submit" })] }))] }) })] }));
|
|
37694
37767
|
};
|
|
37695
37768
|
RosterProgramNumbersPage.displayName = 'RosterProgramNumbersPage';
|
|
37696
37769
|
|
|
37697
|
-
const pageStyle$
|
|
37770
|
+
const pageStyle$8 = {
|
|
37698
37771
|
label: 'RegularSeasonBidsPage-pageStyle',
|
|
37699
37772
|
display: 'flex',
|
|
37700
37773
|
flexDirection: 'column',
|
|
@@ -37716,7 +37789,7 @@ const headerStyle$6 = {
|
|
|
37716
37789
|
flexDirection: 'column',
|
|
37717
37790
|
gap: 'var(--space-1)',
|
|
37718
37791
|
};
|
|
37719
|
-
const titleStyle$
|
|
37792
|
+
const titleStyle$5 = {
|
|
37720
37793
|
label: 'RegularSeasonBidsPage-titleStyle',
|
|
37721
37794
|
margin: 0,
|
|
37722
37795
|
color: 'var(--fg-1)',
|
|
@@ -37757,11 +37830,11 @@ const RegularSeasonBidsPage = ({ bids, bidType: controlledBidType, defaultBidTyp
|
|
|
37757
37830
|
setInternalBidType(next);
|
|
37758
37831
|
onBidTypeChange?.(next);
|
|
37759
37832
|
};
|
|
37760
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
37833
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$8), className), "data-test": "regular-season-bids-page", children: [onBack && (jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle$1), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "regular-season-bids-back", children: backLabel })), jsxRuntime.jsxs("header", { className: sx(headerStyle$6), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$5), children: headingFor(bidType) }), jsxRuntime.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." })] }), jsxRuntime.jsx(Segment, { options: TAB_OPTIONS, value: bidType, onChange: selectBidType, "aria-label": "Bid queue", className: sx(tabsStyle) }), bidType === 'Awarded' && (jsxRuntime.jsx(Alert, { variant: "success", title: "Congratulations", children: "For awarded bids, an Account Executive from STM Charters will reach out with next steps via email." })), jsxRuntime.jsx(RegularSeasonBidsTable, { bids: bids, bidType: bidType, acmiCarrier: acmiCarrier, today: today, loading: loading, locale: locale, onSubmitBid: onSubmitBid, onViewBid: onViewBid, onNoBid: onNoBid, onBulkNoBid: onBulkNoBid })] }));
|
|
37761
37834
|
};
|
|
37762
37835
|
RegularSeasonBidsPage.displayName = 'RegularSeasonBidsPage';
|
|
37763
37836
|
|
|
37764
|
-
const pageStyle$
|
|
37837
|
+
const pageStyle$7 = {
|
|
37765
37838
|
label: 'RosterReportsPage-pageStyle',
|
|
37766
37839
|
display: 'flex',
|
|
37767
37840
|
minWidth: 0,
|
|
@@ -37847,7 +37920,7 @@ const emptyStyle$1 = {
|
|
|
37847
37920
|
/**
|
|
37848
37921
|
* Lists the roster reports a user can run, and reports progress while one runs.
|
|
37849
37922
|
*/
|
|
37850
|
-
const RosterReportsPage = ({ reports, runningReportId, onBack, onRun }) => (jsxRuntime.jsxs("section", { className: sx(pageStyle$
|
|
37923
|
+
const RosterReportsPage = ({ reports, runningReportId, onBack, onRun }) => (jsxRuntime.jsxs("section", { className: sx(pageStyle$7), "data-test": "roster-reports-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$5), children: [jsxRuntime.jsxs("div", { className: sx(headingStyle), children: [jsxRuntime.jsx("h1", { children: "Roster Reports" }), jsxRuntime.jsx("p", { children: "Run the available reports for the selected team roster." })] }), jsxRuntime.jsx(Button, { type: "button", variant: "outline", size: "sm", "data-test": "roster-reports-back", onClick: onBack, children: "Back to Roster" })] }), jsxRuntime.jsx(Module, { title: "Team Reports", useToggle: false, children: reports.length ? (jsxRuntime.jsx("div", { className: sx(listStyle), "data-test": "roster-report-list", children: reports.map((report) => (jsxRuntime.jsxs("article", { className: sx(reportStyle), "data-test": `roster-report-${report.id}`, children: [jsxRuntime.jsxs("div", { className: sx(detailsStyle), children: [jsxRuntime.jsx("h2", { children: report.title }), report.description && jsxRuntime.jsx("p", { children: report.description })] }), jsxRuntime.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))) })) : (jsxRuntime.jsx("div", { className: sx(emptyStyle$1), children: "No roster reports are currently available." })) })] }));
|
|
37851
37924
|
RosterReportsPage.displayName = 'RosterReportsPage';
|
|
37852
37925
|
|
|
37853
37926
|
/**
|
|
@@ -37855,7 +37928,7 @@ RosterReportsPage.displayName = 'RosterReportsPage';
|
|
|
37855
37928
|
* stylesheet it replaces. The one `@media (max-width: 767px)` block styled two
|
|
37856
37929
|
* classes, so it is split between `pageStyle` and `headerMainStyle`.
|
|
37857
37930
|
*/
|
|
37858
|
-
const pageStyle$
|
|
37931
|
+
const pageStyle$6 = {
|
|
37859
37932
|
label: 'SourcingQuoteDetailPage-pageStyle',
|
|
37860
37933
|
display: 'flex',
|
|
37861
37934
|
flexDirection: 'column',
|
|
@@ -37906,7 +37979,7 @@ const quoteIdStyle = {
|
|
|
37906
37979
|
letterSpacing: '0.06em',
|
|
37907
37980
|
textTransform: 'uppercase',
|
|
37908
37981
|
};
|
|
37909
|
-
const titleStyle$
|
|
37982
|
+
const titleStyle$4 = {
|
|
37910
37983
|
label: 'SourcingQuoteDetailPage-titleStyle',
|
|
37911
37984
|
margin: 0,
|
|
37912
37985
|
color: 'var(--fg-1)',
|
|
@@ -38250,11 +38323,11 @@ const SourcingQuoteDetailPage = ({ quote, backLabel = 'Sourcing Review Queue', o
|
|
|
38250
38323
|
return reasons;
|
|
38251
38324
|
}, [decided, quote.status, draft.lineItems, liveLegs, passengerCount]);
|
|
38252
38325
|
const blocked = blockingReasons.length > 0;
|
|
38253
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
38326
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$6), className), "data-test": "sourcing-quote-detail-page", children: [jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", className: sx(breadcrumbStyle), leftIcon: jsxRuntime.jsx(ChevronLeftIcon, { size: 16 }), onClick: onBack, "data-test": "sourcing-quote-back", children: backLabel }), jsxRuntime.jsxs("header", { className: sx(headerStyle$4), children: [jsxRuntime.jsxs("div", { className: sx(headerMainStyle), children: [jsxRuntime.jsxs("div", { className: sx(headerTitlesStyle), children: [jsxRuntime.jsx("span", { className: sx(quoteIdStyle), children: quote.id }), jsxRuntime.jsx("h1", { className: sx(titleStyle$4), children: draft.carrier }), jsxRuntime.jsxs("p", { className: sx(subtitleStyle$1), children: [quote.tripName, " \u00B7 ", quote.accountName, " \u00B7 ", quote.sport] })] }), jsxRuntime.jsx(StatusBadge, { status: quote.status, className: sx(statusStyle) })] }), jsxRuntime.jsxs("div", { className: sx(editGridStyle), children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.jsxs("div", { className: sx(totalFieldStyle), children: [jsxRuntime.jsx("span", { className: sx(totalLabelStyle), children: "Quoted total" }), jsxRuntime.jsx("span", { className: sx(factTotalStyle), "data-test": "sourcing-quote-total", children: formattedTotal }), jsxRuntime.jsx("span", { className: sx(factHelpStyle), children: "Derived from the line items below \u2014 never entered by hand." })] })] }), hasReviewActions && (jsxRuntime.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 && (jsxRuntime.jsx(Alert, { variant: "warning", title: decided ? 'Quote already decided' : 'Why this cannot be approved yet', children: jsxRuntime.jsx("ul", { className: sx(blockingListStyle), "data-test": "sourcing-quote-blocking-reasons", children: blockingReasons.map((reason) => (jsxRuntime.jsx("li", { children: reason }, reason))) }) }))] }), quote.carrierNote && (jsxRuntime.jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Carrier note", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$1), children: "Carrier note" }), jsxRuntime.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." }), jsxRuntime.jsx("p", { className: sx(carrierNoteStyle), "data-test": "sourcing-quote-carrier-note", children: quote.carrierNote })] })), jsxRuntime.jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Leg breakdown", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$1), children: "Leg breakdown" }), jsxRuntime.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 ? (jsxRuntime.jsx("ul", { className: sx(legsStyle), children: legs.map((leg) => (jsxRuntime.jsx(LegRow, { leg: leg, locale: locale }, leg.id))) })) : (jsxRuntime.jsx("p", { className: sx(emptyLegsStyle), "data-test": "sourcing-quote-no-legs", children: "The carrier has not attached any legs to this quote." }))] }), jsxRuntime.jsxs("section", { className: sx(sectionStyle$1), "aria-label": "Cost line items", children: [jsxRuntime.jsx("h2", { className: sx(sectionTitleStyle$1), children: "Cost line items" }), jsxRuntime.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." }), jsxRuntime.jsx("ul", { className: sx(lineItemsStyle), children: draft.lineItems.map((lineItem) => (jsxRuntime.jsxs("li", { className: sx(lineItemStyle), "data-test": "sourcing-quote-line-item", children: [jsxRuntime.jsxs("div", { className: sx(lineItemHeadStyle), children: [jsxRuntime.jsx("span", { className: sx(lineItemLabelStyle), children: lineItem.label }), jsxRuntime.jsx("span", { className: sx(lineItemCategoryStyle), children: SOURCING_COST_CATEGORY_LABELS[lineItem.category ?? 'other'] })] }), jsxRuntime.jsxs("div", { className: sx(lineItemFieldsStyle), children: [jsxRuntime.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" }), jsxRuntime.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))) }), jsxRuntime.jsx(QuoteCostBreakdown, { lineItems: draft.lineItems, currency: quote.currency ?? 'USD', locale: locale, title: "", passengerCount: Number.isFinite(passengerCount) ? passengerCount : undefined })] })] }));
|
|
38254
38327
|
};
|
|
38255
38328
|
SourcingQuoteDetailPage.displayName = 'SourcingQuoteDetailPage';
|
|
38256
38329
|
|
|
38257
|
-
const pageStyle$
|
|
38330
|
+
const pageStyle$5 = {
|
|
38258
38331
|
label: 'SourcingReviewQueuePage-pageStyle',
|
|
38259
38332
|
display: 'flex',
|
|
38260
38333
|
flexDirection: 'column',
|
|
@@ -38270,7 +38343,7 @@ const headerStyle$3 = {
|
|
|
38270
38343
|
flexDirection: 'column',
|
|
38271
38344
|
gap: 'var(--space-1)',
|
|
38272
38345
|
};
|
|
38273
|
-
const titleStyle$
|
|
38346
|
+
const titleStyle$3 = {
|
|
38274
38347
|
label: 'SourcingReviewQueuePage-titleStyle',
|
|
38275
38348
|
margin: 0,
|
|
38276
38349
|
color: 'var(--fg-1)',
|
|
@@ -38303,7 +38376,7 @@ const SourcingReviewQueuePage = ({ title = 'Sourcing Review Queue', description
|
|
|
38303
38376
|
}, [quotes]);
|
|
38304
38377
|
// Metric coerces non-numeric values to 0, so the currency symbol goes through `prefix`.
|
|
38305
38378
|
const compactAmount = React.useMemo(() => new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: 1 }), [locale]);
|
|
38306
|
-
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$
|
|
38379
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle$5), className), "data-test": "sourcing-review-queue-page", children: [jsxRuntime.jsxs("header", { className: sx(headerStyle$3), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$3), children: title }), description && jsxRuntime.jsx("p", { className: sx(descriptionStyle), children: description })] }), !hideSummary && (jsxRuntime.jsxs("div", { className: sx(summaryStyle), "data-test": "sourcing-review-queue-summary", children: [jsxRuntime.jsx(Metric, { label: "Awaiting review", value: summary.awaiting }), jsxRuntime.jsx(Metric, { label: "Approved this cycle", value: summary.approved }), jsxRuntime.jsx(Metric, { label: "Value awaiting review", prefix: "$", value: compactAmount.format(summary.awaitingValue) })] })), jsxRuntime.jsx(SourcingReviewQueueTable, { quotes: quotes, selectedQuoteIds: selectedQuoteIds, onSelectionChange: onSelectionChange, onOpenQuote: onOpenQuote, onBulkApprove: onBulkApprove, pageSize: pageSize, loading: loading, locale: locale })] }));
|
|
38307
38380
|
};
|
|
38308
38381
|
|
|
38309
38382
|
/**
|
|
@@ -38317,7 +38390,7 @@ const SourcingReviewQueuePage = ({ title = 'Sourcing Review Queue', description
|
|
|
38317
38390
|
* No `&&` was needed: every class lands on its own element, so nothing here
|
|
38318
38391
|
* ever depended on source order.
|
|
38319
38392
|
*/
|
|
38320
|
-
const pageStyle$
|
|
38393
|
+
const pageStyle$4 = {
|
|
38321
38394
|
label: 'TeamManagementPage-pageStyle',
|
|
38322
38395
|
minWidth: 0,
|
|
38323
38396
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38412,7 +38485,7 @@ const DEFAULT_TABS = [
|
|
|
38412
38485
|
* TeamManagementPage - Layout for team management with tabbed navigation
|
|
38413
38486
|
*/
|
|
38414
38487
|
const TeamManagementPage = ({ variant = 'team', title = 'Team Management', teamPanel, contactsTitle = 'School Contacts', contactAlert, contacts, header, tabs = DEFAULT_TABS, activeTab = 'profile', onTabChange, children, sidebar, footer, className = '', }) => {
|
|
38415
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38488
|
+
const pageClasses = cx(sx(pageStyle$4), className);
|
|
38416
38489
|
if (variant === 'overview') {
|
|
38417
38490
|
return (jsxRuntime.jsxs("div", { className: cx(sx(overviewStyle), className), children: [jsxRuntime.jsx("header", { className: sx(overviewHeaderStyle), children: jsxRuntime.jsx("h1", { children: title }) }), jsxRuntime.jsxs("div", { className: sx(overviewGridStyle), children: [jsxRuntime.jsx("aside", { children: teamPanel }), jsxRuntime.jsxs("section", { className: sx(contactsColumnStyle), children: [jsxRuntime.jsx("h2", { children: contactsTitle }), contactAlert, contacts] })] })] }));
|
|
38418
38491
|
}
|
|
@@ -38420,7 +38493,7 @@ const TeamManagementPage = ({ variant = 'team', title = 'Team Management', teamP
|
|
|
38420
38493
|
};
|
|
38421
38494
|
TeamManagementPage.displayName = 'TeamManagementPage';
|
|
38422
38495
|
|
|
38423
|
-
const pageStyle$
|
|
38496
|
+
const pageStyle$3 = {
|
|
38424
38497
|
label: 'TeamSchedulePage-pageStyle',
|
|
38425
38498
|
display: 'flex',
|
|
38426
38499
|
minWidth: 0,
|
|
@@ -38447,7 +38520,7 @@ const titleSectionStyle$1 = {
|
|
|
38447
38520
|
flexDirection: 'column',
|
|
38448
38521
|
gap: 12,
|
|
38449
38522
|
};
|
|
38450
|
-
const titleStyle$
|
|
38523
|
+
const titleStyle$2 = {
|
|
38451
38524
|
label: 'TeamSchedulePage-titleStyle',
|
|
38452
38525
|
margin: 0,
|
|
38453
38526
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38539,16 +38612,16 @@ const contentStyle$2 = {
|
|
|
38539
38612
|
* - Schedule table (compact or normal view)
|
|
38540
38613
|
*/
|
|
38541
38614
|
const TeamSchedulePage = ({ title = 'Season Schedule', mobileTitle = 'Season Schedule', subtitle, metrics = [], summary, teamFilter, serviceFilter, actions, compactView, normalView, expandedView, viewMode = 'compact', isMobile = false, className = '', }) => {
|
|
38542
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38615
|
+
const pageClasses = cx(sx(pageStyle$3), className);
|
|
38543
38616
|
// Back-compat: `expandedView`/`'expanded'` were renamed to `normalView`/`'normal'`.
|
|
38544
38617
|
const resolvedNormalView = normalView ?? expandedView;
|
|
38545
38618
|
const resolvedViewMode = viewMode === 'expanded' ? 'normal' : viewMode;
|
|
38546
38619
|
const headerClasses = cx(sx(headerStyle$2), isMobile && sx(headerMobileStyle$1));
|
|
38547
|
-
return (jsxRuntime.jsxs("div", { className: pageClasses, "data-test": "team-schedule-page", children: [jsxRuntime.jsxs("div", { className: headerClasses, children: [jsxRuntime.jsxs("div", { className: sx(titleSectionStyle$1), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$
|
|
38620
|
+
return (jsxRuntime.jsxs("div", { className: pageClasses, "data-test": "team-schedule-page", children: [jsxRuntime.jsxs("div", { className: headerClasses, children: [jsxRuntime.jsxs("div", { className: sx(titleSectionStyle$1), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$2), children: isMobile ? mobileTitle : title }), subtitle && jsxRuntime.jsx("div", { className: sx(subtitleStyle), children: subtitle }), (teamFilter || serviceFilter) && (jsxRuntime.jsxs("div", { className: sx(filtersStyle$1), children: [teamFilter, serviceFilter] }))] }), (summary || metrics.length > 0) && (jsxRuntime.jsx("div", { className: cx(sx(metricsStyle$1), isMobile && sx(metricsMobileStyle$1)), children: summary ?? metrics.map((metric, i) => (jsxRuntime.jsxs("div", { className: sx(metricStyle$1), children: [jsxRuntime.jsxs("span", { className: sx(metricValueStyle$1), children: [metric.prefix, metric.value, metric.suffix] }), jsxRuntime.jsx("span", { className: sx(metricLabelStyle$1), children: metric.label })] }, i))) }))] }), actions, jsxRuntime.jsx("div", { className: sx(contentStyle$2), children: resolvedViewMode === 'compact' ? compactView : resolvedNormalView })] }));
|
|
38548
38621
|
};
|
|
38549
38622
|
TeamSchedulePage.displayName = 'TeamSchedulePage';
|
|
38550
38623
|
|
|
38551
|
-
const pageStyle$
|
|
38624
|
+
const pageStyle$2 = {
|
|
38552
38625
|
label: 'TeamTravelCalendarPage-pageStyle',
|
|
38553
38626
|
display: 'flex',
|
|
38554
38627
|
minWidth: 0,
|
|
@@ -38575,7 +38648,7 @@ const titleSectionStyle = {
|
|
|
38575
38648
|
flexDirection: 'column',
|
|
38576
38649
|
gap: 12,
|
|
38577
38650
|
};
|
|
38578
|
-
const titleStyle = {
|
|
38651
|
+
const titleStyle$1 = {
|
|
38579
38652
|
label: 'TeamTravelCalendarPage-titleStyle',
|
|
38580
38653
|
margin: 0,
|
|
38581
38654
|
color: 'var(--color-ink, #282828)',
|
|
@@ -38651,7 +38724,7 @@ const contentStyle$1 = {
|
|
|
38651
38724
|
* - Sidebar for due dates
|
|
38652
38725
|
*/
|
|
38653
38726
|
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 = '', }) => {
|
|
38654
|
-
const pageClasses = cx(sx(pageStyle$
|
|
38727
|
+
const pageClasses = cx(sx(pageStyle$2), className);
|
|
38655
38728
|
const headerClasses = cx(sx(headerStyle$1), isMobile && sx(headerMobileStyle));
|
|
38656
38729
|
const renderView = () => {
|
|
38657
38730
|
switch (view) {
|
|
@@ -38665,14 +38738,14 @@ const TeamTravelCalendarPage = ({ title = 'Team Travel Calendar', mobileTitle =
|
|
|
38665
38738
|
return null;
|
|
38666
38739
|
}
|
|
38667
38740
|
};
|
|
38668
|
-
return (jsxRuntime.jsxs("div", { className: pageClasses, "data-test": "team-travel-calendar-page", children: [jsxRuntime.jsxs("div", { className: headerClasses, children: [jsxRuntime.jsxs("div", { className: sx(titleSectionStyle), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle), children: isMobile ? mobileTitle : title }), jsxRuntime.jsxs("div", { className: sx(filtersStyle), children: [teamFilter, serviceFilter, viewSelector, typeSelector] })] }), (summary || metrics.length > 0) && (jsxRuntime.jsx("div", { className: cx(sx(metricsStyle), isMobile && sx(metricsMobileStyle)), children: summary ?? metrics.map((metric, i) => (jsxRuntime.jsxs("button", { className: sx(metricStyle), onClick: metric.onClick, type: "button", disabled: !metric.onClick, children: [jsxRuntime.jsx("span", { className: sx(metricValueStyle), children: metric.value }), jsxRuntime.jsx("span", { className: sx(metricLabelStyle), children: metric.label })] }, i))) }))] }), jsxRuntime.jsx("div", { className: sx(contentStyle$1), children: renderView() }), sidebar] }));
|
|
38741
|
+
return (jsxRuntime.jsxs("div", { className: pageClasses, "data-test": "team-travel-calendar-page", children: [jsxRuntime.jsxs("div", { className: headerClasses, children: [jsxRuntime.jsxs("div", { className: sx(titleSectionStyle), children: [jsxRuntime.jsx("h1", { className: sx(titleStyle$1), children: isMobile ? mobileTitle : title }), jsxRuntime.jsxs("div", { className: sx(filtersStyle), children: [teamFilter, serviceFilter, viewSelector, typeSelector] })] }), (summary || metrics.length > 0) && (jsxRuntime.jsx("div", { className: cx(sx(metricsStyle), isMobile && sx(metricsMobileStyle)), children: summary ?? metrics.map((metric, i) => (jsxRuntime.jsxs("button", { className: sx(metricStyle), onClick: metric.onClick, type: "button", disabled: !metric.onClick, children: [jsxRuntime.jsx("span", { className: sx(metricValueStyle), children: metric.value }), jsxRuntime.jsx("span", { className: sx(metricLabelStyle), children: metric.label })] }, i))) }))] }), jsxRuntime.jsx("div", { className: sx(contentStyle$1), children: renderView() }), sidebar] }));
|
|
38669
38742
|
};
|
|
38670
38743
|
TeamTravelCalendarPage.displayName = 'TeamTravelCalendarPage';
|
|
38671
38744
|
|
|
38672
38745
|
/** TripDetailPage's compiled rules. The two media queries move inside the
|
|
38673
38746
|
* styles they widen; nothing else in the stylesheet overlapped, so no
|
|
38674
38747
|
* specificity work was needed. */
|
|
38675
|
-
const pageStyle = {
|
|
38748
|
+
const pageStyle$1 = {
|
|
38676
38749
|
label: 'TripDetailPage-pageStyle',
|
|
38677
38750
|
display: 'flex',
|
|
38678
38751
|
flexDirection: 'column',
|
|
@@ -38771,11 +38844,184 @@ const sidebarSectionStyle = {
|
|
|
38771
38844
|
* - Right (3 cols): Events, Due Dates
|
|
38772
38845
|
*/
|
|
38773
38846
|
const TripDetailPage = ({ header, airSegment, groundSegment, hotelSegment, filesSection, teamSection, eventsSection, dueDatesSection, className = '', }) => {
|
|
38774
|
-
const pageClasses = cx(sx(pageStyle), className);
|
|
38847
|
+
const pageClasses = cx(sx(pageStyle$1), className);
|
|
38775
38848
|
return (jsxRuntime.jsxs("div", { className: pageClasses, children: [header && (jsxRuntime.jsx("div", { className: sx(headerStyle), children: header })), jsxRuntime.jsxs("div", { className: sx(contentStyle), children: [jsxRuntime.jsxs("div", { className: sx(mainColumnStyle), children: [jsxRuntime.jsxs("div", { className: sx(segmentsGridStyle), children: [jsxRuntime.jsxs("div", { className: sx(segmentCardStyle), children: [jsxRuntime.jsx("h3", { className: sx(segmentTitleStyle), children: "Air" }), airSegment || jsxRuntime.jsx("div", { className: sx(emptyStyle), children: "No flights" })] }), jsxRuntime.jsxs("div", { className: sx(segmentCardStyle), children: [jsxRuntime.jsx("h3", { className: sx(segmentTitleStyle), children: "Ground" }), groundSegment || jsxRuntime.jsx("div", { className: sx(emptyStyle), children: "No ground transportation" })] }), jsxRuntime.jsxs("div", { className: sx(segmentCardStyle), children: [jsxRuntime.jsx("h3", { className: sx(segmentTitleStyle), children: "Hotel" }), hotelSegment || jsxRuntime.jsx("div", { className: sx(emptyStyle), children: "No hotels" })] })] }), filesSection && (jsxRuntime.jsxs("div", { className: sx(sectionStyle), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle), children: "Files" }), filesSection] })), teamSection && (jsxRuntime.jsxs("div", { className: sx(sectionStyle), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle), children: "Team Roster" }), teamSection] }))] }), jsxRuntime.jsxs("div", { className: sx(sidebarStyle), children: [eventsSection && (jsxRuntime.jsxs("div", { className: sx(sidebarSectionStyle), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle), children: "Events" }), eventsSection] })), dueDatesSection && (jsxRuntime.jsxs("div", { className: sx(sidebarSectionStyle), children: [jsxRuntime.jsx("h3", { className: sx(sectionTitleStyle), children: "Due Dates" }), dueDatesSection] }))] })] })] }));
|
|
38776
38849
|
};
|
|
38777
38850
|
TripDetailPage.displayName = 'TripDetailPage';
|
|
38778
38851
|
|
|
38852
|
+
const pageStyle = {
|
|
38853
|
+
label: 'VirtualInvoicingPage-pageStyle',
|
|
38854
|
+
color: 'var(--fg-1)',
|
|
38855
|
+
fontFamily: 'var(--font-family-base)',
|
|
38856
|
+
display: 'flex',
|
|
38857
|
+
flexDirection: 'column',
|
|
38858
|
+
gap: 'var(--space-6)',
|
|
38859
|
+
};
|
|
38860
|
+
const titleStyle = {
|
|
38861
|
+
label: 'VirtualInvoicingPage-titleStyle',
|
|
38862
|
+
margin: 0,
|
|
38863
|
+
fontFamily: 'var(--font-family-display)',
|
|
38864
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38865
|
+
fontSize: 'var(--fs-4xl)',
|
|
38866
|
+
letterSpacing: '-0.02em',
|
|
38867
|
+
color: 'var(--color-primary)',
|
|
38868
|
+
};
|
|
38869
|
+
const eyebrowStyle = {
|
|
38870
|
+
label: 'VirtualInvoicingPage-eyebrowStyle',
|
|
38871
|
+
fontFamily: 'var(--font-family-label)',
|
|
38872
|
+
fontWeight: 'var(--fw-bold)',
|
|
38873
|
+
fontSize: 'var(--fs-xs)',
|
|
38874
|
+
letterSpacing: '0.18em',
|
|
38875
|
+
textTransform: 'uppercase',
|
|
38876
|
+
color: 'var(--color-accent-ink)',
|
|
38877
|
+
};
|
|
38878
|
+
const toolbarStyle = {
|
|
38879
|
+
label: 'VirtualInvoicingPage-toolbarStyle',
|
|
38880
|
+
display: 'flex',
|
|
38881
|
+
flexWrap: 'wrap',
|
|
38882
|
+
alignItems: 'center',
|
|
38883
|
+
justifyContent: 'space-between',
|
|
38884
|
+
gap: 'var(--space-3)',
|
|
38885
|
+
};
|
|
38886
|
+
const searchStyle = {
|
|
38887
|
+
label: 'VirtualInvoicingPage-searchStyle',
|
|
38888
|
+
flex: '1 1 280px',
|
|
38889
|
+
maxWidth: 420,
|
|
38890
|
+
};
|
|
38891
|
+
const toolbarActionsStyle = {
|
|
38892
|
+
label: 'VirtualInvoicingPage-toolbarActionsStyle',
|
|
38893
|
+
display: 'flex',
|
|
38894
|
+
gap: 'var(--space-2)',
|
|
38895
|
+
};
|
|
38896
|
+
const cardStyle = {
|
|
38897
|
+
label: 'VirtualInvoicingPage-cardStyle',
|
|
38898
|
+
background: 'var(--bg-surface)',
|
|
38899
|
+
border: '1px solid var(--border-color)',
|
|
38900
|
+
borderRadius: 'var(--radius-xl)',
|
|
38901
|
+
overflow: 'hidden',
|
|
38902
|
+
};
|
|
38903
|
+
const codeStyle = {
|
|
38904
|
+
label: 'VirtualInvoicingPage-codeStyle',
|
|
38905
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38906
|
+
color: 'var(--fg-1)',
|
|
38907
|
+
};
|
|
38908
|
+
const nameStyle = {
|
|
38909
|
+
label: 'VirtualInvoicingPage-nameStyle',
|
|
38910
|
+
marginLeft: 'var(--space-2)',
|
|
38911
|
+
color: 'var(--fg-2)',
|
|
38912
|
+
};
|
|
38913
|
+
const noNameStyle = {
|
|
38914
|
+
label: 'VirtualInvoicingPage-noNameStyle',
|
|
38915
|
+
marginLeft: 'var(--space-2)',
|
|
38916
|
+
color: 'var(--fg-3)',
|
|
38917
|
+
fontStyle: 'italic',
|
|
38918
|
+
};
|
|
38919
|
+
const typeStyle = {
|
|
38920
|
+
label: 'VirtualInvoicingPage-typeStyle',
|
|
38921
|
+
fontFamily: 'var(--font-family-label)',
|
|
38922
|
+
fontWeight: 'var(--fw-semibold)',
|
|
38923
|
+
fontSize: 'var(--fs-xs)',
|
|
38924
|
+
letterSpacing: '0.08em',
|
|
38925
|
+
textTransform: 'uppercase',
|
|
38926
|
+
color: 'var(--fg-2)',
|
|
38927
|
+
};
|
|
38928
|
+
const rowActionsStyle = {
|
|
38929
|
+
label: 'VirtualInvoicingPage-rowActionsStyle',
|
|
38930
|
+
display: 'flex',
|
|
38931
|
+
justifyContent: 'flex-end',
|
|
38932
|
+
gap: 'var(--space-1)',
|
|
38933
|
+
};
|
|
38934
|
+
const countStyle = {
|
|
38935
|
+
label: 'VirtualInvoicingPage-countStyle',
|
|
38936
|
+
margin: 0,
|
|
38937
|
+
fontSize: 'var(--fs-sm)',
|
|
38938
|
+
color: 'var(--fg-3)',
|
|
38939
|
+
};
|
|
38940
|
+
const statusCellStyle = {
|
|
38941
|
+
label: 'VirtualInvoicingPage-statusCellStyle',
|
|
38942
|
+
display: 'flex',
|
|
38943
|
+
alignItems: 'center',
|
|
38944
|
+
gap: 'var(--space-2)',
|
|
38945
|
+
};
|
|
38946
|
+
|
|
38947
|
+
const blankHeader = (patch = {}) => ({
|
|
38948
|
+
accountId: '',
|
|
38949
|
+
branch: '',
|
|
38950
|
+
companyName: '',
|
|
38951
|
+
address: '',
|
|
38952
|
+
city: '',
|
|
38953
|
+
state: '',
|
|
38954
|
+
zipCode: '',
|
|
38955
|
+
phone: '',
|
|
38956
|
+
tollFree: '',
|
|
38957
|
+
afterHoursPhone: '',
|
|
38958
|
+
fax: '',
|
|
38959
|
+
defaultWebsite: '',
|
|
38960
|
+
email: '',
|
|
38961
|
+
hoursOfOperation: '',
|
|
38962
|
+
agentSurveyEndpoint: '',
|
|
38963
|
+
onlineSurveyEndpoint: '',
|
|
38964
|
+
surveyDelayDays: '0',
|
|
38965
|
+
description: '',
|
|
38966
|
+
...patch,
|
|
38967
|
+
});
|
|
38968
|
+
/**
|
|
38969
|
+
* Virtual Invoicing administration: every account and branch with its status
|
|
38970
|
+
* and VI header in one place. Edit opens the header form beside the list, so
|
|
38971
|
+
* nothing is a separate page to hunt for.
|
|
38972
|
+
*/
|
|
38973
|
+
const VirtualInvoicingPage = ({ entries, loading = false, supportEmail = 'productionsupport@shortstravel.com', onSaveHeader, onStatusChange, onDeleteEntry, onAddEntry, className = '', }) => {
|
|
38974
|
+
const [query, setQuery] = React.useState('');
|
|
38975
|
+
const [editing, setEditing] = React.useState(null);
|
|
38976
|
+
const [deleting, setDeleting] = React.useState(null);
|
|
38977
|
+
const visible = React.useMemo(() => {
|
|
38978
|
+
const q = query.trim().toLowerCase();
|
|
38979
|
+
if (!q)
|
|
38980
|
+
return entries;
|
|
38981
|
+
return entries.filter((e) => `${e.code} ${e.name ?? ''} ${e.type}`.toLowerCase().includes(q));
|
|
38982
|
+
}, [entries, query]);
|
|
38983
|
+
const columns = [
|
|
38984
|
+
{
|
|
38985
|
+
key: 'code',
|
|
38986
|
+
label: 'Branch/Account',
|
|
38987
|
+
render: (_, e) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: sx(codeStyle), children: e.code }), e.name ? jsxRuntime.jsx("span", { className: sx(nameStyle), children: e.name }) : jsxRuntime.jsx("span", { className: sx(noNameStyle), children: "No name" })] })),
|
|
38988
|
+
},
|
|
38989
|
+
{ key: 'type', label: 'Type', render: (_, e) => jsxRuntime.jsx("span", { className: sx(typeStyle), children: e.type }) },
|
|
38990
|
+
{
|
|
38991
|
+
key: 'status',
|
|
38992
|
+
label: 'Status',
|
|
38993
|
+
render: (_, e) => (jsxRuntime.jsxs("div", { className: sx(statusCellStyle), children: [jsxRuntime.jsx(Toggle, { size: "sm", checked: e.status === 'LIVE', "aria-label": `Live: ${e.code}`, onChange: (live) => onStatusChange?.(e, live ? 'LIVE' : 'NOT_LIVE') }), e.status === 'LIVE' ? (jsxRuntime.jsx(StatusBadge, { status: "approved", label: "Live" })) : (jsxRuntime.jsx(StatusBadge, { status: "cancelled", label: "Not live" }))] })),
|
|
38994
|
+
},
|
|
38995
|
+
{
|
|
38996
|
+
key: 'header',
|
|
38997
|
+
label: 'VI header',
|
|
38998
|
+
render: (_, e) => e.header ? (jsxRuntime.jsx(StatusBadge, { status: "approved", label: "Configured" })) : (jsxRuntime.jsx(StatusBadge, { status: "not-ticketed", label: "Not configured" })),
|
|
38999
|
+
},
|
|
39000
|
+
{
|
|
39001
|
+
key: 'actions',
|
|
39002
|
+
label: 'Actions',
|
|
39003
|
+
align: 'right',
|
|
39004
|
+
render: (_, e) => (jsxRuntime.jsxs("div", { className: sx(rowActionsStyle), children: [jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Edit ${e.code}`, "data-test": `vi-edit-${e.code}`, onClick: () => setEditing({ entry: e }), children: jsxRuntime.jsx(EditIcon$2, { size: 16 }) }), jsxRuntime.jsx(Button, { variant: "ghost", size: "sm", square: true, "aria-label": `Delete ${e.code}`, "data-test": `vi-delete-${e.code}`, onClick: () => setDeleting(e), children: jsxRuntime.jsx(TrashIcon$2, { size: 16 }) })] })),
|
|
39005
|
+
},
|
|
39006
|
+
];
|
|
39007
|
+
const editingEntry = editing?.entry;
|
|
39008
|
+
const formValue = editingEntry?.header ??
|
|
39009
|
+
blankHeader(editingEntry
|
|
39010
|
+
? editingEntry.type === 'ACCOUNT'
|
|
39011
|
+
? { accountId: editingEntry.code, companyName: editingEntry.name ?? '' }
|
|
39012
|
+
: { branch: editingEntry.code, companyName: editingEntry.name ?? '' }
|
|
39013
|
+
: {});
|
|
39014
|
+
return (jsxRuntime.jsxs("div", { className: cx(sx(pageStyle), className), children: [jsxRuntime.jsxs("header", { children: [jsxRuntime.jsx("span", { className: sx(eyebrowStyle), children: "Administration" }), jsxRuntime.jsx("h1", { className: sx(titleStyle), children: "Virtual Invoicing" })] }), jsxRuntime.jsxs(Alert, { variant: "primary", children: ["Please notify ", jsxRuntime.jsx("a", { href: `mailto:${supportEmail}`, children: supportEmail }), " after making any additions or changes to the Account/Branch status."] }), jsxRuntime.jsxs("div", { className: sx(toolbarStyle), children: [jsxRuntime.jsx(SearchField, { className: sx(searchStyle), placeholder: "Search by code, name or type", value: query, onChange: setQuery, onClear: () => setQuery(''), showClear: true }), jsxRuntime.jsxs("div", { className: sx(toolbarActionsStyle), children: [jsxRuntime.jsx(Button, { variant: "outline", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 16 }), onClick: onAddEntry, "data-test": "vi-add-entry", children: "Add account/branch" }), jsxRuntime.jsx(Button, { variant: "primary", leftIcon: jsxRuntime.jsx(PlusIcon$2, { size: 16 }), onClick: () => setEditing({}), "data-test": "vi-add-header", children: "Add VI header" })] })] }), jsxRuntime.jsx("div", { className: sx(cardStyle), children: jsxRuntime.jsx(Table, { columns: columns, data: visible, rowKey: "id", loading: loading, emptyContent: jsxRuntime.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 && (jsxRuntime.jsxs("p", { className: sx(countStyle), children: ["Showing ", visible.length, " of ", entries.length] })), jsxRuntime.jsxs(Drawer, { isOpen: !!editing, onClose: () => setEditing(null), size: "lg", children: [jsxRuntime.jsx(Drawer.Header, { title: editingEntry ? `VI header · ${editingEntry.code}` : 'New VI header', onClose: () => setEditing(null) }), jsxRuntime.jsx(Drawer.Body, { children: jsxRuntime.jsx(ViHeaderForm, { value: formValue, onCancel: () => setEditing(null), onSave: (header) => {
|
|
39015
|
+
onSaveHeader?.(header, editingEntry);
|
|
39016
|
+
setEditing(null);
|
|
39017
|
+
} }, editingEntry?.id ?? 'new') })] }), jsxRuntime.jsx(Modal, { isOpen: !!deleting, onClose: () => setDeleting(null), title: "Delete account/branch?", size: "sm", footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button, { variant: "outline", onClick: () => setDeleting(null), children: "Cancel" }), jsxRuntime.jsx(Button, { variant: "danger", "data-test": "vi-confirm-delete", onClick: () => {
|
|
39018
|
+
if (deleting)
|
|
39019
|
+
onDeleteEntry?.(deleting);
|
|
39020
|
+
setDeleting(null);
|
|
39021
|
+
}, children: "Delete" })] }), children: deleting && (jsxRuntime.jsxs("p", { children: [deleting.code, deleting.name ? ` – ${deleting.name}` : '', " will be removed from virtual invoicing. Remember to notify production support."] })) })] }));
|
|
39022
|
+
};
|
|
39023
|
+
VirtualInvoicingPage.displayName = 'VirtualInvoicingPage';
|
|
39024
|
+
|
|
38779
39025
|
exports.ACMI_AIRCRAFT_OPTIONS = ACMI_AIRCRAFT_OPTIONS;
|
|
38780
39026
|
exports.ACMI_CARRIER_OPTIONS = ACMI_CARRIER_OPTIONS;
|
|
38781
39027
|
exports.ACMI_INSURANCE_FLAT = ACMI_INSURANCE_FLAT;
|
|
@@ -39023,6 +39269,8 @@ exports.TypeIcon = TypeIcon;
|
|
|
39023
39269
|
exports.UploadIcon = UploadIcon;
|
|
39024
39270
|
exports.UserIcon = UserIcon;
|
|
39025
39271
|
exports.UsersIcon = UsersIcon$1;
|
|
39272
|
+
exports.ViHeaderForm = ViHeaderForm;
|
|
39273
|
+
exports.VirtualInvoicingPage = VirtualInvoicingPage;
|
|
39026
39274
|
exports.WarningIcon = WarningIcon$1;
|
|
39027
39275
|
exports.XIcon = XIcon;
|
|
39028
39276
|
exports.absoluteFill = absoluteFill;
|