IO-3624 Extract shared title-row UI and polish config forms
This commit is contained in:
@@ -0,0 +1,66 @@
|
|||||||
|
export const inlineFormRowTitleStyles = Object.freeze({
|
||||||
|
input: Object.freeze({
|
||||||
|
background: "var(--imex-form-title-input-bg)",
|
||||||
|
border: "1px solid var(--imex-form-title-input-border)",
|
||||||
|
borderRadius: 6,
|
||||||
|
paddingInline: 10,
|
||||||
|
paddingBlock: 4,
|
||||||
|
lineHeight: 1.3
|
||||||
|
}),
|
||||||
|
row: Object.freeze({
|
||||||
|
display: "flex",
|
||||||
|
gap: 4,
|
||||||
|
flexWrap: "wrap",
|
||||||
|
alignItems: "center",
|
||||||
|
width: "100%",
|
||||||
|
paddingInline: 4
|
||||||
|
}),
|
||||||
|
group: Object.freeze({
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
gap: 6,
|
||||||
|
minWidth: 0
|
||||||
|
}),
|
||||||
|
label: Object.freeze({
|
||||||
|
color: "var(--ant-color-text)",
|
||||||
|
fontSize: "var(--ant-font-size)",
|
||||||
|
fontWeight: 500,
|
||||||
|
whiteSpace: "nowrap"
|
||||||
|
}),
|
||||||
|
handle: Object.freeze({
|
||||||
|
color: "var(--ant-color-text-tertiary)",
|
||||||
|
fontSize: 14,
|
||||||
|
flex: "0 0 auto",
|
||||||
|
marginRight: 4
|
||||||
|
}),
|
||||||
|
separator: Object.freeze({
|
||||||
|
width: 1,
|
||||||
|
height: 18,
|
||||||
|
background: "color-mix(in srgb, var(--imex-form-surface-border) 78%, transparent)",
|
||||||
|
borderRadius: 999,
|
||||||
|
flex: "0 0 auto",
|
||||||
|
marginInline: 2
|
||||||
|
}),
|
||||||
|
text: Object.freeze({
|
||||||
|
whiteSpace: "nowrap",
|
||||||
|
fontWeight: 500,
|
||||||
|
fontSize: "var(--ant-font-size-lg)",
|
||||||
|
lineHeight: 1.2
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
export const INLINE_TITLE_INPUT_STYLE = inlineFormRowTitleStyles.input;
|
||||||
|
export const INLINE_TITLE_ROW_STYLE = inlineFormRowTitleStyles.row;
|
||||||
|
export const INLINE_TITLE_GROUP_STYLE = inlineFormRowTitleStyles.group;
|
||||||
|
export const INLINE_TITLE_LABEL_STYLE = inlineFormRowTitleStyles.label;
|
||||||
|
export const INLINE_TITLE_HANDLE_STYLE = inlineFormRowTitleStyles.handle;
|
||||||
|
export const INLINE_TITLE_SEPARATOR_STYLE = inlineFormRowTitleStyles.separator;
|
||||||
|
export const INLINE_TITLE_TEXT_STYLE = inlineFormRowTitleStyles.text;
|
||||||
|
|
||||||
|
export const INLINE_FORM_ROW_WRAP_TITLE_STYLES = Object.freeze({
|
||||||
|
title: Object.freeze({
|
||||||
|
whiteSpace: "normal",
|
||||||
|
overflow: "visible",
|
||||||
|
textOverflow: "unset"
|
||||||
|
})
|
||||||
|
});
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Card, Col, Row } from "antd";
|
import { Card, Col, Row } from "antd";
|
||||||
import { Children, isValidElement } from "react";
|
import { Children, isValidElement } from "react";
|
||||||
|
import { INLINE_FORM_ROW_WRAP_TITLE_STYLES } from "./inline-form-row-title.utils.js";
|
||||||
import "./layout-form-row.styles.scss";
|
import "./layout-form-row.styles.scss";
|
||||||
|
|
||||||
export default function LayoutFormRow({
|
export default function LayoutFormRow({
|
||||||
@@ -7,6 +8,8 @@ export default function LayoutFormRow({
|
|||||||
children,
|
children,
|
||||||
grow = false,
|
grow = false,
|
||||||
noDivider = false,
|
noDivider = false,
|
||||||
|
titleOnly = false,
|
||||||
|
wrapTitle = false,
|
||||||
gutter,
|
gutter,
|
||||||
rowProps,
|
rowProps,
|
||||||
|
|
||||||
@@ -19,10 +22,14 @@ export default function LayoutFormRow({
|
|||||||
...cardProps
|
...cardProps
|
||||||
}) {
|
}) {
|
||||||
const items = Children.toArray(children).filter(Boolean);
|
const items = Children.toArray(children).filter(Boolean);
|
||||||
if (items.length === 0) return null;
|
|
||||||
const isCompactRow = noDivider;
|
const isCompactRow = noDivider;
|
||||||
|
|
||||||
const title = !noDivider && header ? header : undefined;
|
const title = !noDivider && header ? header : undefined;
|
||||||
|
const resolvedTitle = cardProps.title ?? title;
|
||||||
|
const isHeaderOnly = titleOnly || items.length === 0;
|
||||||
|
const hideBody = isHeaderOnly;
|
||||||
|
|
||||||
|
if (items.length === 0 && !resolvedTitle) return null;
|
||||||
const resolvedGutter = gutter ?? [16, isCompactRow ? 8 : 16];
|
const resolvedGutter = gutter ?? [16, isCompactRow ? 8 : 16];
|
||||||
|
|
||||||
const bg = surfaceBg ?? (surface ? "var(--imex-form-surface)" : undefined);
|
const bg = surfaceBg ?? (surface ? "var(--imex-form-surface)" : undefined);
|
||||||
@@ -31,13 +38,15 @@ export default function LayoutFormRow({
|
|||||||
|
|
||||||
const mergedStyles = mergeSemanticStyles(
|
const mergedStyles = mergeSemanticStyles(
|
||||||
{
|
{
|
||||||
|
...(wrapTitle ? INLINE_FORM_ROW_WRAP_TITLE_STYLES : null),
|
||||||
header: {
|
header: {
|
||||||
paddingInline: isCompactRow ? 12 : 16,
|
paddingInline: isHeaderOnly ? 8 : isCompactRow ? 12 : 16,
|
||||||
background: headBg,
|
background: headBg,
|
||||||
borderBottomColor: borderColor
|
borderBottomColor: borderColor
|
||||||
},
|
},
|
||||||
body: {
|
body: {
|
||||||
padding: isCompactRow ? 12 : 16,
|
padding: hideBody ? 0 : isCompactRow ? 12 : 16,
|
||||||
|
display: hideBody ? "none" : undefined,
|
||||||
background: bg
|
background: bg
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -45,31 +54,12 @@ export default function LayoutFormRow({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const baseCardStyle = {
|
const baseCardStyle = {
|
||||||
marginBottom: isCompactRow ? "8px" : ".8rem",
|
marginBottom: isHeaderOnly ? "0" : isCompactRow ? "8px" : ".8rem",
|
||||||
...(bg ? { background: bg } : null), // ensures the “circled area” is tinted
|
...(bg ? { background: bg } : null), // ensures the “circled area” is tinted
|
||||||
...(borderColor ? { borderColor } : null),
|
...(borderColor ? { borderColor } : null),
|
||||||
...cardProps.style
|
...cardProps.style
|
||||||
};
|
};
|
||||||
|
|
||||||
// single child => just render it
|
|
||||||
if (items.length === 1) {
|
|
||||||
return (
|
|
||||||
<Card
|
|
||||||
{...cardProps}
|
|
||||||
title={cardProps.title ?? title}
|
|
||||||
size={cardProps.size ?? "small"}
|
|
||||||
variant={cardProps.variant ?? "outlined"}
|
|
||||||
className={["imex-form-row", isCompactRow ? "imex-form-row--compact" : null, cardProps.className]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(" ")}
|
|
||||||
style={baseCardStyle}
|
|
||||||
styles={mergedStyles}
|
|
||||||
>
|
|
||||||
{items[0]}
|
|
||||||
</Card>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const count = items.length;
|
const count = items.length;
|
||||||
|
|
||||||
// Modern responsive strategy leveraging Ant Design 6:
|
// Modern responsive strategy leveraging Ant Design 6:
|
||||||
@@ -133,22 +123,32 @@ export default function LayoutFormRow({
|
|||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
{...cardProps}
|
{...cardProps}
|
||||||
title={cardProps.title ?? title}
|
title={resolvedTitle}
|
||||||
size={cardProps.size ?? "small"}
|
size={cardProps.size ?? "small"}
|
||||||
variant={cardProps.variant ?? "outlined"}
|
variant={cardProps.variant ?? "outlined"}
|
||||||
className={["imex-form-row", isCompactRow ? "imex-form-row--compact" : null, cardProps.className]
|
className={[
|
||||||
|
"imex-form-row",
|
||||||
|
isCompactRow ? "imex-form-row--compact" : null,
|
||||||
|
isHeaderOnly ? "imex-form-row--title-only" : null,
|
||||||
|
cardProps.className
|
||||||
|
]
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.join(" ")}
|
.join(" ")}
|
||||||
style={baseCardStyle}
|
style={baseCardStyle}
|
||||||
styles={mergedStyles}
|
styles={mergedStyles}
|
||||||
>
|
>
|
||||||
<Row gutter={resolvedGutter} wrap {...rowProps}>
|
{!isHeaderOnly &&
|
||||||
{items.map((child, idx) => (
|
(items.length === 1 ? (
|
||||||
<Col key={child?.key ?? idx} {...getColPropsForChild(child)}>
|
items[0]
|
||||||
{child}
|
) : (
|
||||||
</Col>
|
<Row gutter={resolvedGutter} wrap {...rowProps}>
|
||||||
|
{items.map((child, idx) => (
|
||||||
|
<Col key={child?.key ?? idx} {...getColPropsForChild(child)}>
|
||||||
|
{child}
|
||||||
|
</Col>
|
||||||
|
))}
|
||||||
|
</Row>
|
||||||
))}
|
))}
|
||||||
</Row>
|
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -162,6 +162,7 @@ function mergeSemanticStyles(defaults, userStyles) {
|
|||||||
return {
|
return {
|
||||||
...defaults,
|
...defaults,
|
||||||
...computed,
|
...computed,
|
||||||
|
title: { ...(defaults.title || {}), ...(computed.title || {}) },
|
||||||
header: { ...defaults.header, ...(computed.header || {}) },
|
header: { ...defaults.header, ...(computed.header || {}) },
|
||||||
body: { ...defaults.body, ...(computed.body || {}) }
|
body: { ...defaults.body, ...(computed.body || {}) }
|
||||||
};
|
};
|
||||||
@@ -171,6 +172,7 @@ function mergeSemanticStyles(defaults, userStyles) {
|
|||||||
return {
|
return {
|
||||||
...defaults,
|
...defaults,
|
||||||
...userStyles,
|
...userStyles,
|
||||||
|
title: { ...(defaults.title || {}), ...(userStyles.title || {}) },
|
||||||
header: { ...defaults.header, ...(userStyles.header || {}) },
|
header: { ...defaults.header, ...(userStyles.header || {}) },
|
||||||
body: { ...defaults.body, ...(userStyles.body || {}) }
|
body: { ...defaults.body, ...(userStyles.body || {}) }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
--imex-form-surface: #fafafa; /* subtle contrast vs white page */
|
--imex-form-surface: #fafafa; /* subtle contrast vs white page */
|
||||||
--imex-form-surface-head: #f5f5f5; /* header strip */
|
--imex-form-surface-head: #f5f5f5; /* header strip */
|
||||||
--imex-form-surface-border: #d9d9d9; /* matches AntD-ish border */
|
--imex-form-surface-border: #d9d9d9; /* matches AntD-ish border */
|
||||||
|
--imex-form-title-input-bg: rgba(255, 255, 255, 0.96);
|
||||||
|
--imex-form-title-input-border: rgba(0, 0, 0, 0.08);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pick the selector that matches your app and remove the rest */
|
/* Pick the selector that matches your app and remove the rest */
|
||||||
@@ -20,6 +22,8 @@ html[data-theme="dark"] {
|
|||||||
--imex-form-surface: rgba(255, 255, 255, 0.01); /* subtle lift off page bg */
|
--imex-form-surface: rgba(255, 255, 255, 0.01); /* subtle lift off page bg */
|
||||||
--imex-form-surface-head: rgba(255, 255, 255, 0.06); /* slightly stronger for header strip */
|
--imex-form-surface-head: rgba(255, 255, 255, 0.06); /* slightly stronger for header strip */
|
||||||
--imex-form-surface-border: rgba(5, 5, 5, 0.12);
|
--imex-form-surface-border: rgba(5, 5, 5, 0.12);
|
||||||
|
--imex-form-title-input-bg: rgba(255, 255, 255, 0.12);
|
||||||
|
--imex-form-title-input-border: rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.imex-form-row {
|
.imex-form-row {
|
||||||
@@ -58,6 +62,54 @@ html[data-theme="dark"] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.imex-form-row--title-only {
|
||||||
|
.ant-card-head {
|
||||||
|
min-height: auto;
|
||||||
|
padding-inline: 6px;
|
||||||
|
padding-block: 0;
|
||||||
|
border-radius: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-card-head-wrapper {
|
||||||
|
gap: 2px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-card-head-title,
|
||||||
|
.ant-card-extra {
|
||||||
|
padding-block: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-card-head-title {
|
||||||
|
white-space: normal;
|
||||||
|
overflow: visible;
|
||||||
|
text-overflow: unset;
|
||||||
|
font-size: var(--ant-font-size);
|
||||||
|
line-height: 1.1;
|
||||||
|
padding-inline: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-card-body {
|
||||||
|
display: none;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-input,
|
||||||
|
.ant-input-number,
|
||||||
|
.ant-input-affix-wrapper,
|
||||||
|
.ant-select-selector,
|
||||||
|
.ant-picker {
|
||||||
|
background: var(--imex-form-title-input-bg);
|
||||||
|
border-color: var(--imex-form-title-input-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-input-number-input {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.ant-card-body {
|
.ant-card-body {
|
||||||
background: var(--imex-form-surface);
|
background: var(--imex-form-surface);
|
||||||
}
|
}
|
||||||
@@ -68,7 +120,7 @@ html[data-theme="dark"] {
|
|||||||
|
|
||||||
/* Optional: tighter spacing on phones for better space usage */
|
/* Optional: tighter spacing on phones for better space usage */
|
||||||
@media (max-width: 575px) {
|
@media (max-width: 575px) {
|
||||||
.ant-card-head {
|
&:not(.imex-form-row--title-only) .ant-card-head {
|
||||||
padding-inline: 12px;
|
padding-inline: 12px;
|
||||||
padding-block: 12px;
|
padding-block: 12px;
|
||||||
}
|
}
|
||||||
@@ -89,10 +141,14 @@ html[data-theme="dark"] {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ant-form-item:has(> .imex-form-row--compact) {
|
.ant-form-item:has(.imex-form-row--compact) {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ant-form-item:has(.imex-form-row--title-only) {
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Better form item spacing on mobile */
|
/* Better form item spacing on mobile */
|
||||||
@media (max-width: 575px) {
|
@media (max-width: 575px) {
|
||||||
.ant-form-item {
|
.ant-form-item {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { useApolloClient, useMutation, useQuery } from "@apollo/client/react";
|
import { useApolloClient, useMutation, useQuery } from "@apollo/client/react";
|
||||||
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
||||||
import { Button, Card, Col, Form, Input, InputNumber, Row, Select, Space, Switch } from "antd";
|
import { Button, Card, Col, Form, Input, InputNumber, Row, Select, Space, Switch } from "antd";
|
||||||
@@ -27,8 +27,16 @@ import dayjs from "../../utils/day";
|
|||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
|
import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component.jsx";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE,
|
||||||
|
INLINE_TITLE_TEXT_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
import ShopEmployeeAddVacation from "./shop-employees-add-vacation.component";
|
import ShopEmployeeAddVacation from "./shop-employees-add-vacation.component";
|
||||||
import FormItemEmail from "../form-items-formatted/email-form-item.component.jsx";
|
import FormItemEmail from "../form-items-formatted/email-form-item.component.jsx";
|
||||||
|
|
||||||
@@ -42,17 +50,16 @@ const mapDispatchToProps = () => ({
|
|||||||
export function ShopEmployeesFormComponent({ bodyshop }) {
|
export function ShopEmployeesFormComponent({ bodyshop }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [form] = useForm();
|
const [form] = useForm();
|
||||||
const employeeRates = Form.useWatch(["rates"], form) || [];
|
|
||||||
const employeeNumber = Form.useWatch("employee_number", form);
|
const employeeNumber = Form.useWatch("employee_number", form);
|
||||||
const firstName = Form.useWatch("first_name", form);
|
const firstName = Form.useWatch("first_name", form);
|
||||||
const lastName = Form.useWatch("last_name", form);
|
const lastName = Form.useWatch("last_name", form);
|
||||||
const employeeOptionsColProps = {
|
const employeeOptionsColProps = {
|
||||||
xs: 24,
|
xs: 24,
|
||||||
sm: 12,
|
sm: 12,
|
||||||
md: 8,
|
md: 12,
|
||||||
lg: { flex: "0 0 320px" },
|
lg: 8,
|
||||||
xl: { flex: "0 0 280px" },
|
xl: 8,
|
||||||
xxl: { flex: "0 0 380px" }
|
xxl: 8
|
||||||
};
|
};
|
||||||
const history = useNavigate();
|
const history = useNavigate();
|
||||||
const search = queryString.parse(useLocation().search);
|
const search = queryString.parse(useLocation().search);
|
||||||
@@ -194,161 +201,200 @@ export function ShopEmployeesFormComponent({ bodyshop }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
||||||
<LayoutFormRow title={t("bodyshop.labels.employee_options")}>
|
<LayoutFormRow
|
||||||
<div style={{ display: "grid", rowGap: 16 }}>
|
title={
|
||||||
<Row gutter={[16, 16]} wrap>
|
<div
|
||||||
<Col {...employeeOptionsColProps}>
|
style={{
|
||||||
<Form.Item
|
...INLINE_TITLE_ROW_STYLE,
|
||||||
name="first_name"
|
justifyContent: "space-between"
|
||||||
label={t("employees.fields.first_name")}
|
}}
|
||||||
rules={[
|
>
|
||||||
{
|
<div
|
||||||
required: true
|
style={{
|
||||||
//message: t("general.validation.required"),
|
...INLINE_TITLE_TEXT_STYLE,
|
||||||
}
|
marginRight: "auto"
|
||||||
]}
|
}}
|
||||||
|
>
|
||||||
|
{t("bodyshop.labels.employee_options")}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
gap: 4,
|
||||||
|
flexWrap: "wrap",
|
||||||
|
marginLeft: "auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto"
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Input />
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employees.labels.active")}</div>
|
||||||
</Form.Item>
|
<Form.Item noStyle valuePropName="checked" name="active">
|
||||||
</Col>
|
<Switch />
|
||||||
<Col {...employeeOptionsColProps}>
|
</Form.Item>
|
||||||
<Form.Item
|
</div>
|
||||||
label={t("employees.fields.last_name")}
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
name="last_name"
|
<div
|
||||||
rules={[
|
style={{
|
||||||
{
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
required: true
|
flex: "0 0 auto"
|
||||||
//message: t("general.validation.required"),
|
}}
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
>
|
||||||
<Input />
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employees.fields.flat_rate")}</div>
|
||||||
</Form.Item>
|
<Form.Item noStyle valuePropName="checked" name="flat_rate">
|
||||||
</Col>
|
<Switch />
|
||||||
<Col {...employeeOptionsColProps}>
|
</Form.Item>
|
||||||
<Form.Item
|
</div>
|
||||||
name="employee_number"
|
</div>
|
||||||
label={t("employees.fields.employee_number")}
|
</div>
|
||||||
validateTrigger="onBlur"
|
}
|
||||||
hasFeedback
|
wrapTitle
|
||||||
rules={[
|
>
|
||||||
{
|
<Row gutter={[16, 16]} wrap>
|
||||||
required: true
|
<Col {...employeeOptionsColProps}>
|
||||||
//message: t("general.validation.required"),
|
<Form.Item
|
||||||
},
|
name="first_name"
|
||||||
() => ({
|
label={t("employees.fields.first_name")}
|
||||||
async validator(rule, value) {
|
rules={[
|
||||||
if (value) {
|
{
|
||||||
const response = await client.query({
|
required: true
|
||||||
query: CHECK_EMPLOYEE_NUMBER,
|
//message: t("general.validation.required"),
|
||||||
variables: {
|
}
|
||||||
employeenumber: value
|
]}
|
||||||
}
|
>
|
||||||
});
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
if (response.data.employees_aggregate.aggregate.count === 0) {
|
</Col>
|
||||||
return Promise.resolve();
|
<Col {...employeeOptionsColProps}>
|
||||||
} else if (
|
<Form.Item
|
||||||
response.data.employees_aggregate.nodes.length === 1 &&
|
label={t("employees.fields.last_name")}
|
||||||
response.data.employees_aggregate.nodes[0].id === form.getFieldValue("id")
|
name="last_name"
|
||||||
) {
|
rules={[
|
||||||
return Promise.resolve();
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
</Col>
|
||||||
|
<Col {...employeeOptionsColProps}>
|
||||||
|
<Form.Item
|
||||||
|
name="employee_number"
|
||||||
|
label={t("employees.fields.employee_number")}
|
||||||
|
validateTrigger="onBlur"
|
||||||
|
hasFeedback
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
},
|
||||||
|
() => ({
|
||||||
|
async validator(rule, value) {
|
||||||
|
if (value) {
|
||||||
|
const response = await client.query({
|
||||||
|
query: CHECK_EMPLOYEE_NUMBER,
|
||||||
|
variables: {
|
||||||
|
employeenumber: value
|
||||||
}
|
}
|
||||||
return Promise.reject(t("employees.validation.unique_employee_number"));
|
});
|
||||||
} else {
|
|
||||||
|
if (response.data.employees_aggregate.aggregate.count === 0) {
|
||||||
|
return Promise.resolve();
|
||||||
|
} else if (
|
||||||
|
response.data.employees_aggregate.nodes.length === 1 &&
|
||||||
|
response.data.employees_aggregate.nodes[0].id === form.getFieldValue("id")
|
||||||
|
) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
return Promise.reject(t("employees.validation.unique_employee_number"));
|
||||||
|
} else {
|
||||||
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
})
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
<Col {...employeeOptionsColProps}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("employees.fields.pin")}
|
|
||||||
name="pin"
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
}
|
||||||
]}
|
})
|
||||||
>
|
]}
|
||||||
<Input />
|
>
|
||||||
</Form.Item>
|
<Input />
|
||||||
</Col>
|
</Form.Item>
|
||||||
</Row>
|
</Col>
|
||||||
<Row gutter={[16, 16]} wrap>
|
<Col {...employeeOptionsColProps}>
|
||||||
<Col {...employeeOptionsColProps}>
|
<Form.Item
|
||||||
<Form.Item label={t("employees.fields.active")} valuePropName="checked" name="active">
|
label={t("employees.fields.pin")}
|
||||||
<Switch />
|
name="pin"
|
||||||
</Form.Item>
|
rules={[
|
||||||
</Col>
|
{
|
||||||
<Col {...employeeOptionsColProps}>
|
required: true
|
||||||
<Form.Item label={t("employees.fields.flat_rate")} name="flat_rate" valuePropName="checked">
|
//message: t("general.validation.required"),
|
||||||
<Switch />
|
}
|
||||||
</Form.Item>
|
]}
|
||||||
</Col>
|
>
|
||||||
<Col {...employeeOptionsColProps}>
|
<Input />
|
||||||
<Form.Item
|
</Form.Item>
|
||||||
name="hire_date"
|
</Col>
|
||||||
label={t("employees.fields.hire_date")}
|
<Col {...employeeOptionsColProps}>
|
||||||
rules={[
|
<Form.Item
|
||||||
{
|
name="hire_date"
|
||||||
required: true
|
label={t("employees.fields.hire_date")}
|
||||||
//message: t("general.validation.required"),
|
rules={[
|
||||||
}
|
{
|
||||||
]}
|
required: true
|
||||||
>
|
//message: t("general.validation.required"),
|
||||||
<DateTimePicker isDateOnly />
|
}
|
||||||
</Form.Item>
|
]}
|
||||||
</Col>
|
>
|
||||||
<Col {...employeeOptionsColProps}>
|
<DateTimePicker isDateOnly />
|
||||||
<Form.Item label={t("employees.fields.termination_date")} name="termination_date">
|
</Form.Item>
|
||||||
<DateTimePicker isDateOnly />
|
</Col>
|
||||||
</Form.Item>
|
<Col {...employeeOptionsColProps}>
|
||||||
</Col>
|
<Form.Item label={t("employees.fields.termination_date")} name="termination_date">
|
||||||
<Col {...employeeOptionsColProps}>
|
<DateTimePicker isDateOnly />
|
||||||
<Form.Item
|
</Form.Item>
|
||||||
label={t("employees.fields.user_email")}
|
</Col>
|
||||||
name="user_email"
|
<Col {...employeeOptionsColProps}>
|
||||||
validateTrigger="onBlur"
|
<Form.Item
|
||||||
rules={[
|
label={t("employees.fields.user_email")}
|
||||||
({ getFieldValue }) => ({
|
name="user_email"
|
||||||
async validator(rule, value) {
|
validateTrigger="onBlur"
|
||||||
const user_email = getFieldValue("user_email");
|
rules={[
|
||||||
|
({ getFieldValue }) => ({
|
||||||
|
async validator(rule, value) {
|
||||||
|
const user_email = getFieldValue("user_email");
|
||||||
|
|
||||||
if (user_email && value) {
|
if (user_email && value) {
|
||||||
const response = await client.query({
|
const response = await client.query({
|
||||||
query: QUERY_USERS_BY_EMAIL,
|
query: QUERY_USERS_BY_EMAIL,
|
||||||
variables: {
|
variables: {
|
||||||
email: user_email
|
email: user_email
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.data.users.length === 1) {
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
}
|
||||||
return Promise.reject(t("bodyshop.validation.useremailmustexist"));
|
});
|
||||||
} else {
|
|
||||||
|
if (response.data.users.length === 1) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
return Promise.reject(t("bodyshop.validation.useremailmustexist"));
|
||||||
|
} else {
|
||||||
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
]}
|
})
|
||||||
>
|
]}
|
||||||
<FormItemEmail />
|
>
|
||||||
</Form.Item>
|
<FormItemEmail />
|
||||||
</Col>
|
</Form.Item>
|
||||||
<Col {...employeeOptionsColProps}>
|
</Col>
|
||||||
<Form.Item label={t("employees.fields.external_id")} name="external_id">
|
<Col {...employeeOptionsColProps}>
|
||||||
<Input />
|
<Form.Item label={t("employees.fields.external_id")} name="external_id">
|
||||||
</Form.Item>
|
<Input />
|
||||||
</Col>
|
</Form.Item>
|
||||||
</Row>
|
</Col>
|
||||||
</div>
|
</Row>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<LayoutFormRow title={t("bodyshop.labels.employee_rates")}>
|
<LayoutFormRow title={t("bodyshop.labels.employee_rates")}>
|
||||||
<Form.List name={["rates"]}>
|
<Form.List name={["rates"]}>
|
||||||
@@ -356,17 +402,82 @@ export function ShopEmployeesFormComponent({ bodyshop }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const employeeRate = employeeRates[field.name] || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
grow
|
noDivider
|
||||||
title={getFormListItemTitle(
|
titleOnly
|
||||||
t("employees.fields.cost_center"),
|
title={
|
||||||
index,
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
employeeRate.cost_center
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
)}
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 260px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employees.fields.cost_center")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "cost_center"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
size="small"
|
||||||
|
options={[
|
||||||
|
{ value: "timetickets.labels.shift", label: t("timetickets.labels.shift") },
|
||||||
|
...(bodyshop.cdk_dealerid ||
|
||||||
|
bodyshop.pbs_serialnumber ||
|
||||||
|
bodyshop.rr_dealerid ||
|
||||||
|
Enhanced_Payroll.treatment === "on"
|
||||||
|
? CiecaSelect(false, true)
|
||||||
|
: bodyshop.md_responsibility_centers.costs.map((c) => ({
|
||||||
|
value: c.name,
|
||||||
|
label: c.name
|
||||||
|
})))
|
||||||
|
]}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
styles={{
|
||||||
|
selector: INLINE_TITLE_INPUT_STYLE
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 1 190px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employees.fields.rate")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "rate"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber
|
||||||
|
min={0}
|
||||||
|
precision={2}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -384,45 +495,7 @@ export function ShopEmployeesFormComponent({ bodyshop }) {
|
|||||||
/>
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
/>
|
||||||
<Form.Item
|
|
||||||
label={t("employees.fields.cost_center")}
|
|
||||||
name={[field.name, "cost_center"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Select
|
|
||||||
options={[
|
|
||||||
{ value: "timetickets.labels.shift", label: t("timetickets.labels.shift") },
|
|
||||||
...(bodyshop.cdk_dealerid ||
|
|
||||||
bodyshop.pbs_serialnumber ||
|
|
||||||
bodyshop.rr_dealerid ||
|
|
||||||
Enhanced_Payroll.treatment === "on"
|
|
||||||
? CiecaSelect(false, true)
|
|
||||||
: bodyshop.md_responsibility_centers.costs.map((c) => ({
|
|
||||||
value: c.name,
|
|
||||||
label: c.name
|
|
||||||
})))
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("employees.fields.rate")}
|
|
||||||
name={[field.name, "rate"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<InputNumber min={0} precision={2} />
|
|
||||||
</Form.Item>
|
|
||||||
</LayoutFormRow>
|
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import { Drawer, Grid } from "antd";
|
||||||
import { useQuery } from "@apollo/client/react";
|
import { useQuery } from "@apollo/client/react";
|
||||||
import queryString from "query-string";
|
import queryString from "query-string";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { useLocation } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { QUERY_EMPLOYEES } from "../../graphql/employees.queries";
|
import { QUERY_EMPLOYEES } from "../../graphql/employees.queries";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
@@ -13,34 +14,58 @@ import "./shop-employees.styles.scss";
|
|||||||
const mapStateToProps = createStructuredSelector({});
|
const mapStateToProps = createStructuredSelector({});
|
||||||
|
|
||||||
function ShopEmployeesContainer() {
|
function ShopEmployeesContainer() {
|
||||||
const search = queryString.parse(useLocation().search);
|
const location = useLocation();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const search = queryString.parse(location.search);
|
||||||
const { loading, error, data } = useQuery(QUERY_EMPLOYEES, {
|
const { loading, error, data } = useQuery(QUERY_EMPLOYEES, {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
nextFetchPolicy: "network-only"
|
nextFetchPolicy: "network-only"
|
||||||
});
|
});
|
||||||
|
const screens = Grid.useBreakpoint();
|
||||||
const hasSelectedEmployee = Boolean(search.employeeId);
|
const hasSelectedEmployee = Boolean(search.employeeId);
|
||||||
|
|
||||||
|
const bpoints = {
|
||||||
|
xs: "100%",
|
||||||
|
sm: "100%",
|
||||||
|
md: "92%",
|
||||||
|
lg: "80%",
|
||||||
|
xl: "80%",
|
||||||
|
xxl: "80%"
|
||||||
|
};
|
||||||
|
|
||||||
|
let drawerPercentage = "100%";
|
||||||
|
if (screens.xxl) drawerPercentage = bpoints.xxl;
|
||||||
|
else if (screens.xl) drawerPercentage = bpoints.xl;
|
||||||
|
else if (screens.lg) drawerPercentage = bpoints.lg;
|
||||||
|
else if (screens.md) drawerPercentage = bpoints.md;
|
||||||
|
else if (screens.sm) drawerPercentage = bpoints.sm;
|
||||||
|
else if (screens.xs) drawerPercentage = bpoints.xs;
|
||||||
|
|
||||||
|
const handleDrawerClose = () => {
|
||||||
|
delete search.employeeId;
|
||||||
|
navigate({
|
||||||
|
search: queryString.stringify(search)
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
if (error) return <AlertComponent title={error.message} type="error" />;
|
if (error) return <AlertComponent title={error.message} type="error" />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RbacWrapper action="employees:page">
|
<RbacWrapper action="employees:page">
|
||||||
<div
|
<div className="shop-employees-layout">
|
||||||
className={[
|
|
||||||
"shop-employees-layout",
|
|
||||||
hasSelectedEmployee ? "shop-employees-layout--with-detail" : null
|
|
||||||
]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(" ")}
|
|
||||||
>
|
|
||||||
<div className="shop-employees-layout__list">
|
<div className="shop-employees-layout__list">
|
||||||
<ShopEmployeesListComponent employees={data ? data.employees : []} loading={loading} />
|
<ShopEmployeesListComponent employees={data ? data.employees : []} loading={loading} />
|
||||||
</div>
|
</div>
|
||||||
{hasSelectedEmployee ? (
|
|
||||||
<div className="shop-employees-layout__details">
|
|
||||||
<ShopEmployeesFormComponent />
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
</div>
|
</div>
|
||||||
|
<Drawer
|
||||||
|
open={hasSelectedEmployee}
|
||||||
|
destroyOnHidden
|
||||||
|
placement="right"
|
||||||
|
size={drawerPercentage}
|
||||||
|
onClose={handleDrawerClose}
|
||||||
|
>
|
||||||
|
{hasSelectedEmployee ? <ShopEmployeesFormComponent /> : null}
|
||||||
|
</Drawer>
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,7 @@
|
|||||||
.shop-employees-layout {
|
.shop-employees-layout {
|
||||||
display: grid;
|
|
||||||
gap: 16px;
|
|
||||||
align-items: start;
|
|
||||||
}
|
|
||||||
|
|
||||||
.shop-employees-layout__list,
|
|
||||||
.shop-employees-layout__details {
|
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1700px) {
|
.shop-employees-layout__list {
|
||||||
.shop-employees-layout--with-detail {
|
min-width: 0;
|
||||||
grid-template-columns: minmax(420px, 500px) minmax(0, 1fr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,19 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd";
|
import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import ConfigFormTypes from "../config-form-components/config-form-types";
|
import ConfigFormTypes from "../config-form-components/config-form-types";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
|
|
||||||
const SelectorDiv = styled.div`
|
const SelectorDiv = styled.div`
|
||||||
.ant-form-item .ant-select {
|
.ant-form-item .ant-select {
|
||||||
@@ -18,8 +25,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const TemplateListGenerated = TemplateList();
|
const TemplateListGenerated = TemplateList();
|
||||||
const intakeChecklistItems = Form.useWatch(["intakechecklist", "form"], form) || [];
|
|
||||||
const deliverChecklistItems = Form.useWatch(["deliverchecklist", "form"], form) || [];
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<SelectorDiv>
|
<SelectorDiv>
|
||||||
@@ -88,18 +93,54 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const intakeChecklistItem = intakeChecklistItems[field.name] || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("jobs.fields.intake.name"),
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
index,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
intakeChecklistItem.name,
|
<div
|
||||||
intakeChecklistItem.label
|
style={{
|
||||||
)}
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 320px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("jobs.fields.intake.name")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "name"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("jobs.fields.intake.name")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("jobs.fields.intake.required")}</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "required"]} valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -118,19 +159,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("jobs.fields.intake.name")}
|
|
||||||
key={`${index}name`}
|
|
||||||
name={[field.name, "name"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.intake.type")}
|
label={t("jobs.fields.intake.type")}
|
||||||
key={`${index}type`}
|
key={`${index}type`}
|
||||||
@@ -195,14 +223,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
|
||||||
label={t("jobs.fields.intake.required")}
|
|
||||||
key={`${index}required`}
|
|
||||||
name={[field.name, "required"]}
|
|
||||||
valuePropName="checked"
|
|
||||||
>
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
@@ -229,18 +249,54 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const deliverChecklistItem = deliverChecklistItems[field.name] || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("jobs.fields.intake.name"),
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
index,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
deliverChecklistItem.name,
|
<div
|
||||||
deliverChecklistItem.label
|
style={{
|
||||||
)}
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 320px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("jobs.fields.intake.name")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "name"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("jobs.fields.intake.name")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("jobs.fields.intake.required")}</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "required"]} valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -259,20 +315,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("jobs.fields.intake.name")}
|
|
||||||
key={`${index}named`}
|
|
||||||
name={[field.name, "name"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.intake.type")}
|
label={t("jobs.fields.intake.type")}
|
||||||
key={`${index}typed`}
|
key={`${index}typed`}
|
||||||
@@ -339,14 +381,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
|
||||||
label={t("jobs.fields.intake.required")}
|
|
||||||
key={`${index}requiredd`}
|
|
||||||
name={[field.name, "required"]}
|
|
||||||
valuePropName="checked"
|
|
||||||
>
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,15 +1,19 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { Button, Form, Input, Space } from "antd";
|
import { Button, Form, Input, Space } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
|
|
||||||
export default function ShopInfoLaborRates() {
|
export default function ShopInfoLaborRates() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const form = Form.useFormInstance();
|
|
||||||
const laborRates = Form.useWatch(["md_labor_rates"], form) || [];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -27,13 +31,42 @@ export default function ShopInfoLaborRates() {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const laborRate = laborRates[field.name] || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider={index === 0}
|
noDivider={index === 0}
|
||||||
title={getFormListItemTitle(t("jobs.fields.labor_rate_desc"), index, laborRate.rate_label)}
|
title={
|
||||||
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 340px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("jobs.fields.labor_rate_desc")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "rate_label"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("jobs.fields.labor_rate_desc")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -52,294 +85,281 @@ export default function ShopInfoLaborRates() {
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.labor_rate_desc")}
|
label={t("jobs.fields.rate_laa")}
|
||||||
key={`${index}rate_label`}
|
key={`${index}rate_laa`}
|
||||||
name={[field.name, "rate_label"]}
|
name={[field.name, "rate_laa"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<Input />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_laa")}
|
label={t("jobs.fields.rate_lab")}
|
||||||
key={`${index}rate_laa`}
|
key={`${index}rate_lab`}
|
||||||
name={[field.name, "rate_laa"]}
|
name={[field.name, "rate_lab"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lab")}
|
label={t("jobs.fields.rate_lad")}
|
||||||
key={`${index}rate_lab`}
|
key={`${index}rate_lad`}
|
||||||
name={[field.name, "rate_lab"]}
|
name={[field.name, "rate_lad"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lad")}
|
label={t("jobs.fields.rate_lae")}
|
||||||
key={`${index}rate_lad`}
|
key={`${index}rate_lae`}
|
||||||
name={[field.name, "rate_lad"]}
|
name={[field.name, "rate_lae"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lae")}
|
label={t("jobs.fields.rate_laf")}
|
||||||
key={`${index}rate_lae`}
|
key={`${index}rate_laf`}
|
||||||
name={[field.name, "rate_lae"]}
|
name={[field.name, "rate_laf"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_laf")}
|
label={t("jobs.fields.rate_lag")}
|
||||||
key={`${index}rate_laf`}
|
key={`${index}rate_lag`}
|
||||||
name={[field.name, "rate_laf"]}
|
name={[field.name, "rate_lag"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lag")}
|
label={t("jobs.fields.rate_lam")}
|
||||||
key={`${index}rate_lag`}
|
key={`${index}rate_lam`}
|
||||||
name={[field.name, "rate_lag"]}
|
name={[field.name, "rate_lam"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lam")}
|
label={t("jobs.fields.rate_lar")}
|
||||||
key={`${index}rate_lam`}
|
key={`${index}rate_lar`}
|
||||||
name={[field.name, "rate_lam"]}
|
name={[field.name, "rate_lar"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_lar")}
|
label={t("jobs.fields.rate_las")}
|
||||||
key={`${index}rate_lar`}
|
key={`${index}rate_las`}
|
||||||
name={[field.name, "rate_lar"]}
|
name={[field.name, "rate_las"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_las")}
|
label={t("jobs.fields.rate_la1")}
|
||||||
key={`${index}rate_las`}
|
key={`${index}rate_la1`}
|
||||||
name={[field.name, "rate_las"]}
|
name={[field.name, "rate_la1"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_la1")}
|
label={t("jobs.fields.rate_la2")}
|
||||||
key={`${index}rate_la1`}
|
key={`${index}rate_la2`}
|
||||||
name={[field.name, "rate_la1"]}
|
name={[field.name, "rate_la2"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_la2")}
|
label={t("jobs.fields.rate_la3")}
|
||||||
key={`${index}rate_la2`}
|
key={`${index}rate_la3`}
|
||||||
name={[field.name, "rate_la2"]}
|
name={[field.name, "rate_la3"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_la3")}
|
label={t("jobs.fields.rate_la4")}
|
||||||
key={`${index}rate_la3`}
|
key={`${index}rate_la4`}
|
||||||
name={[field.name, "rate_la3"]}
|
name={[field.name, "rate_la4"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_la4")}
|
label={t("jobs.fields.rate_mash")}
|
||||||
key={`${index}rate_la4`}
|
key={`${index}rate_mash`}
|
||||||
name={[field.name, "rate_la4"]}
|
name={[field.name, "rate_mash"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_mash")}
|
label={t("jobs.fields.rate_mapa")}
|
||||||
key={`${index}rate_mash`}
|
key={`${index}rate_mapa`}
|
||||||
name={[field.name, "rate_mash"]}
|
name={[field.name, "rate_mapa"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_mapa")}
|
label={t("jobs.fields.rate_ma2s")}
|
||||||
key={`${index}rate_mapa`}
|
key={`${index}rate_ma2s`}
|
||||||
name={[field.name, "rate_mapa"]}
|
name={[field.name, "rate_ma2s"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_ma2s")}
|
label={t("jobs.fields.rate_ma3s")}
|
||||||
key={`${index}rate_ma2s`}
|
key={`${index}rate_ma3s`}
|
||||||
name={[field.name, "rate_ma2s"]}
|
name={[field.name, "rate_ma3s"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
{
|
||||||
label={t("jobs.fields.rate_ma3s")}
|
// <Form.Item
|
||||||
key={`${index}rate_ma3s`}
|
// label={t("jobs.fields.rate_mabl")}
|
||||||
name={[field.name, "rate_ma3s"]}
|
// key={`${index}rate_mabl`}
|
||||||
rules={[
|
// name={[field.name, "rate_mabl"]}
|
||||||
{
|
// rules={[
|
||||||
required: true
|
// {
|
||||||
//message: t("general.validation.required"),
|
// required: true,
|
||||||
}
|
// //message: t("general.validation.required"),
|
||||||
]}
|
// },
|
||||||
>
|
// ]}
|
||||||
<CurrencyInput min={0} />
|
// >
|
||||||
</Form.Item>
|
// <CurrencyInput min={0} />
|
||||||
{
|
// </Form.Item>
|
||||||
// <Form.Item
|
// <Form.Item
|
||||||
// label={t("jobs.fields.rate_mabl")}
|
// label={t("jobs.fields.rate_macs")}
|
||||||
// key={`${index}rate_mabl`}
|
// key={`${index}rate_macs`}
|
||||||
// name={[field.name, "rate_mabl"]}
|
// name={[field.name, "rate_macs"]}
|
||||||
// rules={[
|
// rules={[
|
||||||
// {
|
// {
|
||||||
// required: true,
|
// required: true,
|
||||||
// //message: t("general.validation.required"),
|
// //message: t("general.validation.required"),
|
||||||
// },
|
// },
|
||||||
// ]}
|
// ]}
|
||||||
// >
|
// >
|
||||||
// <CurrencyInput min={0} />
|
// <CurrencyInput min={0} />
|
||||||
// </Form.Item>
|
// </Form.Item>
|
||||||
// <Form.Item
|
}
|
||||||
// label={t("jobs.fields.rate_macs")}
|
<Form.Item
|
||||||
// key={`${index}rate_macs`}
|
label={t("jobs.fields.rate_matd")}
|
||||||
// name={[field.name, "rate_macs"]}
|
key={`${index}rate_matd`}
|
||||||
// rules={[
|
name={[field.name, "rate_matd"]}
|
||||||
// {
|
rules={[
|
||||||
// required: true,
|
{
|
||||||
// //message: t("general.validation.required"),
|
required: true
|
||||||
// },
|
//message: t("general.validation.required"),
|
||||||
// ]}
|
}
|
||||||
// >
|
]}
|
||||||
// <CurrencyInput min={0} />
|
>
|
||||||
// </Form.Item>
|
<CurrencyInput min={0} />
|
||||||
}
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.rate_matd")}
|
label={t("jobs.fields.rate_mahw")}
|
||||||
key={`${index}rate_matd`}
|
key={`${index}rate_mahw`}
|
||||||
name={[field.name, "rate_matd"]}
|
name={[field.name, "rate_mahw"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true
|
required: true
|
||||||
//message: t("general.validation.required"),
|
//message: t("general.validation.required"),
|
||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<CurrencyInput min={0} />
|
<CurrencyInput min={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
|
||||||
label={t("jobs.fields.rate_mahw")}
|
|
||||||
key={`${index}rate_mahw`}
|
|
||||||
name={[field.name, "rate_mahw"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<CurrencyInput min={0} />
|
|
||||||
</Form.Item>
|
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,10 +1,17 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { Button, Col, Form, Input, Row, Select, Space, Switch } from "antd";
|
import { Button, Col, Form, Input, Row, Select, Space, Switch } from "antd";
|
||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
import i18n from "i18next";
|
import i18n from "i18next";
|
||||||
|
|
||||||
const predefinedPartTypes = ["PAN", "PAC", "PAR", "PAL", "PAA", "PAM", "PAP", "PAS", "PASL", "PAG"];
|
const predefinedPartTypes = ["PAN", "PAC", "PAR", "PAL", "PAA", "PAM", "PAP", "PAS", "PASL", "PAG"];
|
||||||
@@ -76,23 +83,86 @@ export default function ShopInfoPartsScan({ form }) {
|
|||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const selectedField = watchedFields?.[index]?.field || "line_desc";
|
const selectedField = watchedFields?.[index]?.field || "line_desc";
|
||||||
const fieldType = getFieldType(selectedField);
|
const fieldType = getFieldType(selectedField);
|
||||||
const selectedFieldLabel =
|
|
||||||
fieldSelectOptions.find((option) => option.value === selectedField)?.label ||
|
|
||||||
t("bodyshop.fields.md_parts_scan.field");
|
|
||||||
const ruleTitle = watchedFields?.[index]?.value
|
|
||||||
? `${selectedFieldLabel}: ${watchedFields[index].value}`
|
|
||||||
: null;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("bodyshop.fields.md_parts_scan.field"),
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
index,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
ruleTitle,
|
<div
|
||||||
selectedFieldLabel
|
style={{
|
||||||
)}
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 260px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("bodyshop.fields.md_parts_scan.field")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "field"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: t("general.validation.required", {
|
||||||
|
label: t("bodyshop.fields.md_parts_scan.field")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
options={fieldSelectOptions}
|
||||||
|
onChange={() => {
|
||||||
|
form.setFields([
|
||||||
|
{ name: ["md_parts_scan", index, "operation"], value: "contains" },
|
||||||
|
{ name: ["md_parts_scan", index, "value"], value: undefined }
|
||||||
|
]);
|
||||||
|
}}
|
||||||
|
style={{
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
styles={{
|
||||||
|
selector: INLINE_TITLE_INPUT_STYLE
|
||||||
|
}}
|
||||||
|
size="small"
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
{fieldType === "string" && (
|
||||||
|
<>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.md_parts_scan.caseInsensitive")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "caseInsensitive"]} valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.md_parts_scan.mark_critical")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "mark_critical"]} valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -112,32 +182,6 @@ export default function ShopInfoPartsScan({ form }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Row gutter={[16, 16]} align="middle">
|
<Row gutter={[16, 16]} align="middle">
|
||||||
{/* Select Field */}
|
|
||||||
<Col span={6}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.md_parts_scan.field")}
|
|
||||||
name={[field.name, "field"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true,
|
|
||||||
message: t("general.validation.required", {
|
|
||||||
label: t("bodyshop.fields.md_parts_scan.field")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Select
|
|
||||||
options={fieldSelectOptions}
|
|
||||||
onChange={() => {
|
|
||||||
form.setFields([
|
|
||||||
{ name: ["md_parts_scan", index, "operation"], value: "contains" },
|
|
||||||
{ name: ["md_parts_scan", index, "value"], value: undefined }
|
|
||||||
]);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
|
|
||||||
{/* Operation */}
|
{/* Operation */}
|
||||||
{fieldType !== "predefined" && fieldType && (
|
{fieldType !== "predefined" && fieldType && (
|
||||||
<Col span={6}>
|
<Col span={6}>
|
||||||
@@ -194,34 +238,6 @@ export default function ShopInfoPartsScan({ form }) {
|
|||||||
</Col>
|
</Col>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Case Sensitivity */}
|
|
||||||
{fieldType === "string" && (
|
|
||||||
<Col span={4}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.md_parts_scan.caseInsensitive")}
|
|
||||||
name={[field.name, "caseInsensitive"]}
|
|
||||||
valuePropName="checked"
|
|
||||||
labelCol={{ span: 14 }}
|
|
||||||
wrapperCol={{ span: 10 }}
|
|
||||||
>
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Mark Line as Critical */}
|
|
||||||
<Col span={4}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.md_parts_scan.mark_critical")}
|
|
||||||
name={[field.name, "mark_critical"]}
|
|
||||||
valuePropName="checked"
|
|
||||||
labelCol={{ span: 14 }}
|
|
||||||
wrapperCol={{ span: 10 }}
|
|
||||||
>
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
|
|
||||||
{/* Update Field */}
|
{/* Update Field */}
|
||||||
<Col span={4}>
|
<Col span={4}>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
import { useTreatmentsWithConfig } from "@splitsoftware/splitio-react";
|
||||||
import { Button, DatePicker, Form, Input, InputNumber, Radio, Select, Space, Switch } from "antd";
|
import { Button, DatePicker, Form, Input, InputNumber, Radio, Select, Space, Switch } from "antd";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
@@ -13,6 +13,14 @@ import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
|||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component";
|
import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component";
|
||||||
import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component";
|
import ShopInfoResponsibilitycentersTaxesComponent from "./shop-info.responsibilitycenters.taxes.component";
|
||||||
import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js";
|
import { bodyshopHasDmsKey } from "../../utils/dmsUtils.js";
|
||||||
@@ -34,8 +42,6 @@ export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoResponsibili
|
|||||||
export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dmsPayers = Form.useWatch(["cdk_configuration", "payers"], form) || [];
|
const dmsPayers = Form.useWatch(["cdk_configuration", "payers"], form) || [];
|
||||||
const costResponsibilityCenters = Form.useWatch(["md_responsibility_centers", "costs"], form) || [];
|
|
||||||
const profitResponsibilityCenters = Form.useWatch(["md_responsibility_centers", "profits"], form) || [];
|
|
||||||
|
|
||||||
const hasDMSKey = bodyshopHasDmsKey(bodyshop);
|
const hasDMSKey = bodyshopHasDmsKey(bodyshop);
|
||||||
|
|
||||||
@@ -659,18 +665,116 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const responsibilityCenter = costResponsibilityCenters[field.name] || {};
|
const hasProfitCenterBodyFields =
|
||||||
|
(hasDMSKey && !bodyshop.rr_dealerid) || bodyshop.cdk_dealerid || bodyshop.rr_dealerid;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
titleOnly={!hasProfitCenterBodyFields}
|
||||||
t("bodyshop.fields.responsibilitycenter"),
|
title={
|
||||||
index,
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
responsibilityCenter.name,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
responsibilityCenter.accountname
|
<div
|
||||||
)}
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 340px",
|
||||||
|
maxWidth: 390
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "name"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 220px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter_accountname")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "accountname"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter_accountname")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 220px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "accountdesc"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
{!hasDMSKey && (
|
||||||
|
<>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0.9 1 220px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter_accountitem")}
|
||||||
|
</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "accountitem"]}
|
||||||
|
rules={[{ required: true }]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter_accountitem")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -689,31 +793,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter")}
|
|
||||||
key={`${index}name`}
|
|
||||||
name={[field.name, "name"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter_accountname")}
|
|
||||||
key={`${index}accountname`}
|
|
||||||
name={[field.name, "accountname"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
|
||||||
key={`${index}accountdesc`}
|
|
||||||
name={[field.name, "accountdesc"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
{hasDMSKey && !bodyshop.rr_dealerid && (
|
{hasDMSKey && !bodyshop.rr_dealerid && (
|
||||||
<>
|
<>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
@@ -774,18 +853,135 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const responsibilityCenter = profitResponsibilityCenters[field.name] || {};
|
const hasProfitCenterBodyFields =
|
||||||
|
(hasDMSKey && !bodyshop.rr_dealerid) || bodyshop.cdk_dealerid || bodyshop.rr_dealerid;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
titleOnly={!hasProfitCenterBodyFields}
|
||||||
t("bodyshop.fields.responsibilitycenter"),
|
title={
|
||||||
index,
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
responsibilityCenter.name,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
responsibilityCenter.accountdesc
|
<div
|
||||||
)}
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1.4 1 440px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "name"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 260px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "accountdesc"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
{!hasDMSKey && (
|
||||||
|
<>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0.9 1 220px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenter_accountitem")}
|
||||||
|
</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "accountitem"]}
|
||||||
|
rules={[{ required: true }]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenter_accountitem")}
|
||||||
|
onBlur={handleBlur}
|
||||||
|
size="small"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{bodyshop.rr_dealerid && (
|
||||||
|
<>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0.9 1 220px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenters.item_type")}
|
||||||
|
</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "rr_item_type"]}
|
||||||
|
rules={[{ required: true }]}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
size="small"
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
styles={{
|
||||||
|
selector: INLINE_TITLE_INPUT_STYLE
|
||||||
|
}}
|
||||||
|
options={[
|
||||||
|
{
|
||||||
|
value: "G",
|
||||||
|
label: t("bodyshop.fields.responsibilitycenters.item_type_gog")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "P",
|
||||||
|
label: t("bodyshop.fields.responsibilitycenters.item_type_paint")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "F",
|
||||||
|
label: t("bodyshop.fields.responsibilitycenters.item_type_freight")
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -804,32 +1000,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter")}
|
|
||||||
key={`${index}name`}
|
|
||||||
name={[field.name, "name"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter_accountdesc")}
|
|
||||||
key={`${index}accountdesc`}
|
|
||||||
name={[field.name, "accountdesc"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
{!hasDMSKey && (
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenter_accountitem")}
|
|
||||||
key={`${index}accountitem`}
|
|
||||||
name={[field.name, "accountitem"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input onBlur={handleBlur} />
|
|
||||||
</Form.Item>
|
|
||||||
)}
|
|
||||||
{hasDMSKey && !bodyshop.rr_dealerid && (
|
{hasDMSKey && !bodyshop.rr_dealerid && (
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.dms.dms_acctnumber")}
|
label={t("bodyshop.fields.dms.dms_acctnumber")}
|
||||||
@@ -849,53 +1019,31 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
<Input onBlur={handleBlur} />
|
<Input onBlur={handleBlur} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
)}
|
)}
|
||||||
{bodyshop.rr_dealerid && (
|
{bodyshop.rr_dealerid && [
|
||||||
<>
|
<Form.Item
|
||||||
<Form.Item
|
label={t("bodyshop.fields.responsibilitycenters.gogcode")}
|
||||||
label={t("bodyshop.fields.responsibilitycenters.gogcode")}
|
key={`${index}rr_gogcode`}
|
||||||
key={`${index}rr_gogcode`}
|
name={[field.name, "rr_gogcode"]}
|
||||||
name={[field.name, "rr_gogcode"]}
|
col={{ xs: 24, md: 8, lg: 8, xl: 8, xxl: 8 }}
|
||||||
rules={[{ required: true }]}
|
rules={[{ required: true }]}
|
||||||
>
|
>
|
||||||
<Input onBlur={handleBlur} />
|
<Input onBlur={handleBlur} />
|
||||||
</Form.Item>
|
</Form.Item>,
|
||||||
|
<Form.Item
|
||||||
<Form.Item
|
label={t("bodyshop.fields.responsibilitycenters.taxable_flag")}
|
||||||
label={t("bodyshop.fields.responsibilitycenters.item_type")}
|
key={`${index}rr_cust_txbl_flag`}
|
||||||
key={`${index}rr_item_type`}
|
name={[field.name, "rr_cust_txbl_flag"]}
|
||||||
name={[field.name, "rr_item_type"]}
|
col={{ xs: 24, md: 8, lg: 8, xl: 8, xxl: 8 }}
|
||||||
rules={[{ required: true }]}
|
rules={[{ required: true }]}
|
||||||
>
|
>
|
||||||
<Select
|
<Select
|
||||||
options={[
|
options={[
|
||||||
{ value: "G", label: t("bodyshop.fields.responsibilitycenters.item_type_gog") },
|
{ value: "T", label: t("bodyshop.fields.responsibilitycenters.taxable") },
|
||||||
{
|
{ value: "N", label: t("bodyshop.fields.responsibilitycenters.nontaxable") }
|
||||||
value: "P",
|
]}
|
||||||
label: t("bodyshop.fields.responsibilitycenters.item_type_paint")
|
/>
|
||||||
},
|
</Form.Item>
|
||||||
{
|
]}
|
||||||
value: "F",
|
|
||||||
label: t("bodyshop.fields.responsibilitycenters.item_type_freight")
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenters.taxable_flag")}
|
|
||||||
key={`${index}rr_cust_txbl_flag`}
|
|
||||||
name={[field.name, "rr_cust_txbl_flag"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Select
|
|
||||||
options={[
|
|
||||||
{ value: "T", label: t("bodyshop.fields.responsibilitycenters.taxable") },
|
|
||||||
{ value: "N", label: t("bodyshop.fields.responsibilitycenters.nontaxable") }
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
@@ -3459,20 +3607,61 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const salesTaxCode =
|
|
||||||
form.getFieldValue(["md_responsibility_centers", "sales_tax_codes", field.name]) || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
id="sales_tax_codes"
|
id="sales_tax_codes"
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("bodyshop.fields.responsibilitycenters.sales_tax_codes.description"),
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
index,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
salesTaxCode.description,
|
<div
|
||||||
salesTaxCode.code
|
style={{
|
||||||
)}
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1.2 1 320px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenters.sales_tax_codes.description")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "description"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t(
|
||||||
|
"bodyshop.fields.responsibilitycenters.sales_tax_codes.description"
|
||||||
|
)}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 1 140px",
|
||||||
|
maxWidth: 170
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.responsibilitycenters.sales_tax_codes.code")}
|
||||||
|
</div>
|
||||||
|
<Form.Item noStyle name={[field.name, "code"]} rules={[{ required: true }]}>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.code")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Button
|
<Button
|
||||||
type="text"
|
type="text"
|
||||||
@@ -3483,22 +3672,6 @@ export function ShopInfoResponsibilityCenterComponent({ bodyshop, form }) {
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.description")}
|
|
||||||
key={`${index}description`}
|
|
||||||
name={[field.name, "description"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.code")}
|
|
||||||
key={`${index}code`}
|
|
||||||
name={[field.name, "code"]}
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.federal")}
|
label={t("bodyshop.fields.responsibilitycenters.sales_tax_codes.federal")}
|
||||||
key={`${index}federal`}
|
key={`${index}federal`}
|
||||||
|
|||||||
@@ -25,6 +25,23 @@ const SelectorDiv = styled.div`
|
|||||||
.ant-form-item .ant-select {
|
.ant-form-item .ant-select {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.production-status-color-title-select {
|
||||||
|
min-width: 160px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.production-status-color-title-select .ant-select-selector {
|
||||||
|
background: transparent !important;
|
||||||
|
border: none !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
padding-inline: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.production-status-color-title-select .ant-select-selection-item,
|
||||||
|
.production-status-color-title-select .ant-select-selection-placeholder {
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export function ShopInfoROStatusComponent({ bodyshop, form }) {
|
export function ShopInfoROStatusComponent({ bodyshop, form }) {
|
||||||
@@ -264,7 +281,33 @@ export function ShopInfoROStatusComponent({ bodyshop, form }) {
|
|||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
key={field.key}
|
key={field.key}
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(t("jobs.fields.status"), index, productionColor.status)}
|
title={
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
key={`${index}status`}
|
||||||
|
name={[field.name, "status"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
className="production-status-color-title-select"
|
||||||
|
variant="borderless"
|
||||||
|
placeholder={getFormListItemTitle(
|
||||||
|
t("jobs.fields.status"),
|
||||||
|
index,
|
||||||
|
productionColor.status
|
||||||
|
)}
|
||||||
|
options={productionColorStatusOptions.map((item) => ({
|
||||||
|
value: item,
|
||||||
|
label: item
|
||||||
|
}))}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
}
|
||||||
extra={
|
extra={
|
||||||
<Button
|
<Button
|
||||||
type="text"
|
type="text"
|
||||||
@@ -279,22 +322,6 @@ export function ShopInfoROStatusComponent({ bodyshop, form }) {
|
|||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("jobs.fields.status")}
|
|
||||||
key={`${index}status`}
|
|
||||||
name={[field.name, "status"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Select
|
|
||||||
options={productionColorStatusOptions.map((item) => ({ value: item, label: item }))}
|
|
||||||
/>
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.statuses.color")}
|
|
||||||
key={`${index}color`}
|
key={`${index}color`}
|
||||||
name={[field.name, "color"]}
|
name={[field.name, "color"]}
|
||||||
rules={[
|
rules={[
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, ReloadOutlined } from "@ant-design/icons";
|
||||||
import { Button, Form, Input, InputNumber, Select, Space, Switch, TimePicker } from "antd";
|
import { Button, Form, Input, InputNumber, Select, Space, Switch, TimePicker, Tooltip } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
@@ -7,7 +7,6 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
|
|||||||
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
|
||||||
import ColorpickerFormItemComponent from "../form-items-formatted/colorpicker-form-item.component";
|
import ColorpickerFormItemComponent from "../form-items-formatted/colorpicker-form-item.component";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
import { ColorPicker } from "./shop-info.rostatus.component";
|
import { ColorPicker } from "./shop-info.rostatus.component";
|
||||||
import {
|
import {
|
||||||
@@ -15,6 +14,7 @@ import {
|
|||||||
DEFAULT_TRANSLUCENT_PICKER_COLOR,
|
DEFAULT_TRANSLUCENT_PICKER_COLOR,
|
||||||
getTintedCardSurfaceStyles
|
getTintedCardSurfaceStyles
|
||||||
} from "./shop-info.color.utils";
|
} from "./shop-info.color.utils";
|
||||||
|
import "./shop-info.scheduling.styles.scss";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop
|
bodyshop: selectBodyshop
|
||||||
@@ -33,6 +33,106 @@ const WORKING_DAYS = [
|
|||||||
{ key: "saturday", labelKey: "general.labels.saturday" }
|
{ key: "saturday", labelKey: "general.labels.saturday" }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const APPOINTMENT_COLOR_PICKER_STYLES = {
|
||||||
|
default: {
|
||||||
|
wrap: {
|
||||||
|
display: "flex",
|
||||||
|
flexWrap: "wrap",
|
||||||
|
gap: "12px",
|
||||||
|
alignItems: "flex-start"
|
||||||
|
},
|
||||||
|
hue: {
|
||||||
|
flex: "1 1 180px",
|
||||||
|
height: "12px",
|
||||||
|
position: "relative",
|
||||||
|
marginTop: "20px"
|
||||||
|
},
|
||||||
|
swatches: {
|
||||||
|
flex: "1 1 160px"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const SCHEDULING_BUCKET_COLOR_PICKER_STYLES = {
|
||||||
|
default: {
|
||||||
|
picker: {
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
background: "color-mix(in srgb, var(--imex-form-surface) 92%, transparent)",
|
||||||
|
boxShadow: "none",
|
||||||
|
border: "1px solid color-mix(in srgb, var(--imex-form-surface-border) 72%, transparent)",
|
||||||
|
borderRadius: "8px",
|
||||||
|
boxSizing: "border-box",
|
||||||
|
overflow: "hidden"
|
||||||
|
},
|
||||||
|
saturation: {
|
||||||
|
width: "100%",
|
||||||
|
paddingBottom: "48%",
|
||||||
|
position: "relative",
|
||||||
|
borderRadius: "8px 8px 0 0",
|
||||||
|
overflow: "hidden"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
padding: "12px"
|
||||||
|
},
|
||||||
|
controls: {
|
||||||
|
display: "flex",
|
||||||
|
gap: "10px"
|
||||||
|
},
|
||||||
|
color: {
|
||||||
|
width: "28px"
|
||||||
|
},
|
||||||
|
swatch: {
|
||||||
|
marginTop: "0",
|
||||||
|
width: "12px",
|
||||||
|
height: "12px",
|
||||||
|
borderRadius: "999px"
|
||||||
|
},
|
||||||
|
toggles: {
|
||||||
|
flex: "1"
|
||||||
|
},
|
||||||
|
hue: {
|
||||||
|
height: "10px",
|
||||||
|
position: "relative",
|
||||||
|
marginBottom: "8px"
|
||||||
|
},
|
||||||
|
alpha: {
|
||||||
|
height: "10px",
|
||||||
|
position: "relative"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const SECTION_TITLE_INPUT_STYLE = {
|
||||||
|
background: "color-mix(in srgb, var(--imex-form-surface) 78%, transparent)",
|
||||||
|
border: "1px solid color-mix(in srgb, var(--imex-form-surface-border) 72%, transparent)",
|
||||||
|
borderRadius: 6,
|
||||||
|
fontWeight: 500
|
||||||
|
};
|
||||||
|
|
||||||
|
const SECTION_TITLE_INPUT_ROW_STYLE = {
|
||||||
|
display: "flex",
|
||||||
|
gap: 8,
|
||||||
|
flexWrap: "wrap",
|
||||||
|
alignItems: "center",
|
||||||
|
minWidth: 180,
|
||||||
|
maxWidth: "100%"
|
||||||
|
};
|
||||||
|
|
||||||
|
const SECTION_TITLE_INPUT_GROUP_STYLE = {
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
gap: 6,
|
||||||
|
minWidth: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
const SECTION_TITLE_INPUT_LABEL_STYLE = {
|
||||||
|
fontSize: 12,
|
||||||
|
lineHeight: 1.1,
|
||||||
|
opacity: 0.75,
|
||||||
|
whiteSpace: "nowrap"
|
||||||
|
};
|
||||||
|
|
||||||
export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const appointmentColors = Form.useWatch(["appt_colors"], form) || form.getFieldValue(["appt_colors"]) || [];
|
const appointmentColors = Form.useWatch(["appt_colors"], form) || form.getFieldValue(["appt_colors"]) || [];
|
||||||
@@ -141,11 +241,27 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("bodyshop.fields.appt_colors.label"),
|
<div style={{ minWidth: 180, maxWidth: "100%" }}>
|
||||||
index,
|
<Form.Item
|
||||||
appointmentColor.label
|
noStyle
|
||||||
)}
|
key={`${index}aptcolorlabel`}
|
||||||
|
name={[field.name, "label"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.appt_colors.label")}
|
||||||
|
style={SECTION_TITLE_INPUT_STYLE}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -166,20 +282,6 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
{...appointmentColorSurfaceStyles}
|
{...appointmentColorSurfaceStyles}
|
||||||
>
|
>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.appt_colors.label")}
|
|
||||||
key={`${index}aptcolorlabel`}
|
|
||||||
name={[field.name, "label"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.appt_colors.color")}
|
|
||||||
key={`${index}aptcolorcolor`}
|
key={`${index}aptcolorcolor`}
|
||||||
name={[field.name, "color"]}
|
name={[field.name, "color"]}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -189,7 +291,7 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<ColorpickerFormItemComponent />
|
<ColorpickerFormItemComponent styles={APPOINTMENT_COLOR_PICKER_STYLES} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
@@ -231,12 +333,64 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
<Form.Item key={field.key}>
|
<Form.Item key={field.key}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
noDivider
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("bodyshop.fields.ssbuckets.label"),
|
<div style={SECTION_TITLE_INPUT_ROW_STYLE}>
|
||||||
index,
|
<div style={SECTION_TITLE_INPUT_GROUP_STYLE}>
|
||||||
schedulingBucket.label,
|
<div style={SECTION_TITLE_INPUT_LABEL_STYLE}>{t("bodyshop.fields.ssbuckets.id")}</div>
|
||||||
schedulingBucket.id
|
<Form.Item
|
||||||
)}
|
noStyle
|
||||||
|
key={`${index}id`}
|
||||||
|
name={[field.name, "id"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.ssbuckets.id")}
|
||||||
|
style={{
|
||||||
|
...SECTION_TITLE_INPUT_STYLE,
|
||||||
|
width: 72
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...SECTION_TITLE_INPUT_GROUP_STYLE,
|
||||||
|
flex: 1,
|
||||||
|
minWidth: 0
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={SECTION_TITLE_INPUT_LABEL_STYLE}>
|
||||||
|
{t("bodyshop.fields.ssbuckets.label")}
|
||||||
|
</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
key={`${index}label`}
|
||||||
|
name={[field.name, "label"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.ssbuckets.label")}
|
||||||
|
style={{
|
||||||
|
...SECTION_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -246,85 +400,10 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
remove(field.name);
|
remove(field.name);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<FormListMoveArrows
|
<Tooltip title={t("bodyshop.tooltips.reset-color")}>
|
||||||
move={move}
|
|
||||||
index={index}
|
|
||||||
total={fields.length}
|
|
||||||
orientation="horizontal"
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
}
|
|
||||||
{...schedulingBucketSurfaceStyles}
|
|
||||||
>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.id")}
|
|
||||||
key={`${index}id`}
|
|
||||||
name={[field.name, "id"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.label")}
|
|
||||||
key={`${index}label`}
|
|
||||||
name={[field.name, "label"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.gte")}
|
|
||||||
key={`${index}gte`}
|
|
||||||
name={[field.name, "gte"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.lt")}
|
|
||||||
key={`${index}lt`}
|
|
||||||
name={[field.name, "lt"]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.target")}
|
|
||||||
key={`${index}target`}
|
|
||||||
name={[field.name, "target"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={
|
|
||||||
<Space>
|
|
||||||
{t("bodyshop.fields.ssbuckets.color")}
|
|
||||||
<Button
|
<Button
|
||||||
size="small"
|
type="text"
|
||||||
|
icon={<ReloadOutlined />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
form.setFieldValue(["ssbuckets", field.name, "color"]);
|
form.setFieldValue(["ssbuckets", field.name, "color"]);
|
||||||
|
|
||||||
@@ -335,16 +414,62 @@ export function ShopInfoSchedulingComponent({ form, bodyshop }) {
|
|||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
Reset
|
</Tooltip>
|
||||||
</Button>
|
<FormListMoveArrows
|
||||||
</Space>
|
move={move}
|
||||||
}
|
index={index}
|
||||||
key={`${index}color`}
|
total={fields.length}
|
||||||
name={[field.name, "color"]}
|
orientation="horizontal"
|
||||||
>
|
/>
|
||||||
<ColorPicker />
|
</Space>
|
||||||
</Form.Item>
|
}
|
||||||
|
{...schedulingBucketSurfaceStyles}
|
||||||
|
>
|
||||||
|
<div className="shop-info-scheduling__bucket-card-body">
|
||||||
|
<div className="shop-info-scheduling__bucket-card-fields">
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.ssbuckets.gte")}
|
||||||
|
key={`${index}gte`}
|
||||||
|
name={[field.name, "gte"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.ssbuckets.lt")}
|
||||||
|
key={`${index}lt`}
|
||||||
|
name={[field.name, "lt"]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.ssbuckets.target")}
|
||||||
|
key={`${index}target`}
|
||||||
|
name={[field.name, "target"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div className="shop-info-scheduling__bucket-card-color">
|
||||||
|
<Form.Item key={`${index}color`} name={[field.name, "color"]}>
|
||||||
|
<ColorPicker styles={SCHEDULING_BUCKET_COLOR_PICKER_STYLES} />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
.shop-info-scheduling__bucket-card-body {
|
||||||
|
display: flex;
|
||||||
|
gap: 12px;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-fields {
|
||||||
|
flex: 1 1 0;
|
||||||
|
min-width: 0;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, minmax(92px, 1fr));
|
||||||
|
gap: 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-fields .ant-form-item {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-color {
|
||||||
|
flex: 0 0 360px;
|
||||||
|
min-width: 360px;
|
||||||
|
max-width: 360px;
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-color .ant-form-item {
|
||||||
|
margin-bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-color .ant-form-item-control,
|
||||||
|
.shop-info-scheduling__bucket-card-color .ant-form-item-control-input,
|
||||||
|
.shop-info-scheduling__bucket-card-color .ant-form-item-control-input-content {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1199px) {
|
||||||
|
.shop-info-scheduling__bucket-card-body {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-fields {
|
||||||
|
grid-template-columns: repeat(2, minmax(120px, 1fr));
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-info-scheduling__bucket-card-color {
|
||||||
|
flex-basis: auto;
|
||||||
|
min-width: 0;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 575px) {
|
||||||
|
.shop-info-scheduling__bucket-card-fields {
|
||||||
|
grid-template-columns: minmax(0, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,22 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { Button, Form, Input, Select, Space } from "antd";
|
import { Button, Form, Input, Select, Space } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { TemplateList } from "../../utils/TemplateConstants";
|
import { TemplateList } from "../../utils/TemplateConstants";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import { getFormListItemTitle } from "../form-list-move-arrows/form-list-item-title.utils";
|
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
import InstanceRenderManager from "../../utils/instanceRenderMgr";
|
||||||
|
|
||||||
export default function ShopInfoSpeedPrint() {
|
export default function ShopInfoSpeedPrint() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const form = Form.useFormInstance();
|
|
||||||
const allTemplates = TemplateList("job");
|
const allTemplates = TemplateList("job");
|
||||||
const speedPrintItems = Form.useWatch(["speedprint"], form) || [];
|
|
||||||
const TemplateListGenerated = InstanceRenderManager({
|
const TemplateListGenerated = InstanceRenderManager({
|
||||||
imex: Object.fromEntries(Object.entries(allTemplates).filter(([, { enhanced_payroll }]) => !enhanced_payroll)),
|
imex: Object.fromEntries(Object.entries(allTemplates).filter(([, { enhanced_payroll }]) => !enhanced_payroll)),
|
||||||
rome: allTemplates
|
rome: allTemplates
|
||||||
@@ -24,18 +29,71 @@ export default function ShopInfoSpeedPrint() {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const speedPrintItem = speedPrintItems[field.name] || {};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
grow
|
noDivider
|
||||||
title={getFormListItemTitle(
|
title={
|
||||||
t("bodyshop.fields.speedprint.label"),
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
index,
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
speedPrintItem.label,
|
<div
|
||||||
speedPrintItem.id
|
style={{
|
||||||
)}
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 1 180px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("bodyshop.fields.speedprint.id")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "id"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.speedprint.id")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 280px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("bodyshop.fields.speedprint.label")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "label"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
size="small"
|
||||||
|
placeholder={t("bodyshop.fields.speedprint.label")}
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -45,37 +103,15 @@ export default function ShopInfoSpeedPrint() {
|
|||||||
remove(field.name);
|
remove(field.name);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<FormListMoveArrows move={move} index={index} total={fields.length} orientation="horizontal" />
|
<FormListMoveArrows
|
||||||
|
move={move}
|
||||||
|
index={index}
|
||||||
|
total={fields.length}
|
||||||
|
orientation="horizontal"
|
||||||
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.speedprint.id")}
|
|
||||||
key={`${index}id`}
|
|
||||||
name={[field.name, "id"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.speedprint.label")}
|
|
||||||
key={`${index}label`}
|
|
||||||
name={[field.name, "label"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
//message: t("general.validation.required"),
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name={[field.name, "templates"]}
|
name={[field.name, "templates"]}
|
||||||
label={t("bodyshop.fields.speedprint.templates")}
|
label={t("bodyshop.fields.speedprint.templates")}
|
||||||
|
|||||||
@@ -18,17 +18,15 @@ export default connect(mapStateToProps, mapDispatchToProps)(ShopInfoIntellipay);
|
|||||||
// noinspection JSUnusedLocalSymbols
|
// noinspection JSUnusedLocalSymbols
|
||||||
export function ShopInfoIntellipay({ bodyshop, form }) {
|
export function ShopInfoIntellipay({ bodyshop, form }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const cashDiscountEnabled = Form.useWatch(["intellipay_config", "enable_cash_discount"], form);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form.Item dependencies={[["intellipay_config", "enable_cash_discount"]]} style={{ marginBottom: 20 }}>
|
{cashDiscountEnabled && (
|
||||||
{() => {
|
<div style={{ marginBottom: 12 }}>
|
||||||
const { intellipay_config } = form.getFieldsValue();
|
<Alert title={t("bodyshop.labels.intellipay_cash_discount")} />
|
||||||
|
</div>
|
||||||
if (intellipay_config?.enable_cash_discount)
|
)}
|
||||||
return <Alert title={t("bodyshop.labels.intellipay_cash_discount")} />;
|
|
||||||
}}
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
header={InstanceRenderManager({
|
header={InstanceRenderManager({
|
||||||
|
|||||||
@@ -1,20 +1,6 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled, HolderOutlined } from "@ant-design/icons";
|
||||||
import { useMutation, useQuery } from "@apollo/client/react";
|
import { useMutation, useQuery } from "@apollo/client/react";
|
||||||
import {
|
import { Button, Card, Col, Form, Input, InputNumber, Row, Select, Skeleton, Space, Switch, Typography } from "antd";
|
||||||
Button,
|
|
||||||
Card,
|
|
||||||
Col,
|
|
||||||
Form,
|
|
||||||
Input,
|
|
||||||
InputNumber,
|
|
||||||
Row,
|
|
||||||
Select,
|
|
||||||
Skeleton,
|
|
||||||
Space,
|
|
||||||
Switch,
|
|
||||||
Tag,
|
|
||||||
Typography
|
|
||||||
} from "antd";
|
|
||||||
|
|
||||||
import querystring from "query-string";
|
import querystring from "query-string";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
@@ -28,6 +14,14 @@ import AlertComponent from "../alert/alert.component";
|
|||||||
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import {
|
||||||
|
INLINE_TITLE_GROUP_STYLE,
|
||||||
|
INLINE_TITLE_HANDLE_STYLE,
|
||||||
|
INLINE_TITLE_INPUT_STYLE,
|
||||||
|
INLINE_TITLE_LABEL_STYLE,
|
||||||
|
INLINE_TITLE_ROW_STYLE,
|
||||||
|
INLINE_TITLE_SEPARATOR_STYLE
|
||||||
|
} from "../layout-form-row/inline-form-row-title.utils.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
INSERT_EMPLOYEE_TEAM,
|
INSERT_EMPLOYEE_TEAM,
|
||||||
@@ -37,11 +31,10 @@ import {
|
|||||||
import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component";
|
import EmployeeSearchSelectComponent from "../employee-search-select/employee-search-select.component";
|
||||||
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
import { useNotification } from "../../contexts/Notifications/notificationContext.jsx";
|
||||||
import {
|
import {
|
||||||
LABOR_TYPES,
|
|
||||||
getSplitTotal,
|
getSplitTotal,
|
||||||
hasExactSplitTotal,
|
hasExactSplitTotal,
|
||||||
|
LABOR_TYPES,
|
||||||
normalizeEmployeeTeam,
|
normalizeEmployeeTeam,
|
||||||
normalizeTeamMember,
|
|
||||||
validateEmployeeTeamMembers
|
validateEmployeeTeamMembers
|
||||||
} from "./shop-employee-teams.form.utils.js";
|
} from "./shop-employee-teams.form.utils.js";
|
||||||
|
|
||||||
@@ -55,24 +48,8 @@ const PAYOUT_METHOD_OPTIONS = [
|
|||||||
{ labelKey: "employee_teams.options.commission_percentage", value: "commission" }
|
{ labelKey: "employee_teams.options.commission_percentage", value: "commission" }
|
||||||
];
|
];
|
||||||
|
|
||||||
const TEAM_MEMBER_PRIMARY_FIELD_COLS = {
|
|
||||||
employee: { xs: 24, lg: 13, xxl: 14 },
|
|
||||||
allocation: { xs: 24, sm: 12, lg: 4, xxl: 4 },
|
|
||||||
payoutMethod: { xs: 24, sm: 12, lg: 7, xxl: 6 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const TEAM_MEMBER_RATE_FIELD_COLS = { xs: 24, sm: 12, md: 8, lg: 6, xxl: 4 };
|
const TEAM_MEMBER_RATE_FIELD_COLS = { xs: 24, sm: 12, md: 8, lg: 6, xxl: 4 };
|
||||||
|
|
||||||
const getPayoutMethodTagColor = (payoutMethod) => (payoutMethod === "commission" ? "gold" : "blue");
|
|
||||||
|
|
||||||
const getEmployeeDisplayName = (employees = [], employeeId) => {
|
|
||||||
const employee = employees.find((currentEmployee) => currentEmployee.id === employeeId);
|
|
||||||
if (!employee) return null;
|
|
||||||
|
|
||||||
const fullName = [employee.first_name, employee.last_name].filter(Boolean).join(" ").trim();
|
|
||||||
return fullName || employee.employee_number || null;
|
|
||||||
};
|
|
||||||
|
|
||||||
const formatAllocationPercentage = (percentage) => {
|
const formatAllocationPercentage = (percentage) => {
|
||||||
if (percentage === null || percentage === undefined || percentage === "") return null;
|
if (percentage === null || percentage === undefined || percentage === "") return null;
|
||||||
|
|
||||||
@@ -144,41 +121,19 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
const isAllocationTotalExact = hasExactSplitTotal(teamMembers);
|
const isAllocationTotalExact = hasExactSplitTotal(teamMembers);
|
||||||
const allocationTotalValue = formatAllocationPercentage(getSplitTotal(teamMembers))?.replace("%", "") || "0";
|
const allocationTotalValue = formatAllocationPercentage(getSplitTotal(teamMembers))?.replace("%", "") || "0";
|
||||||
const teamNameDisplay = teamName?.trim() || t("employee_teams.fields.name");
|
const teamNameDisplay = teamName?.trim() || t("employee_teams.fields.name");
|
||||||
const teamCardTitle = isTeamHydrating
|
const teamCardTitle = isTeamHydrating ? (
|
||||||
? t("employee_teams.fields.name")
|
t("employee_teams.fields.name")
|
||||||
: (
|
) : (
|
||||||
<span>
|
<span>
|
||||||
<span>{teamNameDisplay}</span>
|
<span>{teamNameDisplay}</span>
|
||||||
<span> - </span>
|
<span> - </span>
|
||||||
<Typography.Text type={isAllocationTotalExact ? undefined : "danger"}>
|
<Typography.Text type={isAllocationTotalExact ? undefined : "danger"}>
|
||||||
{t("employee_teams.labels.allocation_total", {
|
{t("employee_teams.labels.allocation_total", {
|
||||||
total: allocationTotalValue
|
total: allocationTotalValue
|
||||||
})}
|
})}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
|
|
||||||
const getTeamMemberTitle = (teamMember = {}) => {
|
|
||||||
const employeeName =
|
|
||||||
getEmployeeDisplayName(bodyshop.employees, teamMember.employeeid) || t("employee_teams.fields.employeeid");
|
|
||||||
const allocation = formatAllocationPercentage(teamMember.percentage);
|
|
||||||
const payoutMethod =
|
|
||||||
teamMember.payout_method === "commission"
|
|
||||||
? t("employee_teams.options.commission")
|
|
||||||
: t("employee_teams.options.hourly");
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div style={{ display: "flex", flexWrap: "wrap", alignItems: "center", gap: 8 }}>
|
|
||||||
<Typography.Text strong>{employeeName}</Typography.Text>
|
|
||||||
<Tag variant="filled" color="geekblue">
|
|
||||||
{`${t("employee_teams.fields.allocation")}: ${allocation || "--"}`}
|
|
||||||
</Tag>
|
|
||||||
<Tag variant="filled" color={getPayoutMethodTagColor(teamMember.payout_method)}>
|
|
||||||
{payoutMethod}
|
|
||||||
</Tag>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleFinish = async ({ employee_team_members = [], ...values }) => {
|
const handleFinish = async ({ employee_team_members = [], ...values }) => {
|
||||||
const { normalizedTeamMembers, errorKey } = validateEmployeeTeamMembers(employee_team_members);
|
const { normalizedTeamMembers, errorKey } = validateEmployeeTeamMembers(employee_team_members);
|
||||||
@@ -263,7 +218,42 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
<Skeleton active title={false} paragraph={{ rows: 12 }} />
|
<Skeleton active title={false} paragraph={{ rows: 12 }} />
|
||||||
) : (
|
) : (
|
||||||
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
<Form onFinish={handleFinish} autoComplete={"off"} layout="vertical" form={form}>
|
||||||
<LayoutFormRow title={t("employee_teams.labels.team_options")}>
|
<LayoutFormRow
|
||||||
|
title={
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_ROW_STYLE,
|
||||||
|
justifyContent: "space-between"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
whiteSpace: "nowrap",
|
||||||
|
fontWeight: 500,
|
||||||
|
fontSize: "var(--ant-font-size-lg)",
|
||||||
|
lineHeight: 1.2,
|
||||||
|
marginRight: "auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t("employee_teams.labels.team_options")}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 0 auto",
|
||||||
|
marginLeft: "auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employee_teams.fields.active")}</div>
|
||||||
|
<Form.Item noStyle name="active" valuePropName="checked">
|
||||||
|
<Switch />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
|
>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name="name"
|
name="name"
|
||||||
label={t("employee_teams.fields.name")}
|
label={t("employee_teams.fields.name")}
|
||||||
@@ -275,9 +265,6 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("employee_teams.fields.active")} name="active" valuePropName="checked">
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("employee_teams.fields.max_load")}
|
label={t("employee_teams.fields.max_load")}
|
||||||
name="max_load"
|
name="max_load"
|
||||||
@@ -287,7 +274,7 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
}
|
}
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<InputNumber min={0} precision={1} />
|
<InputNumber min={0} precision={1} suffix="%" />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<LayoutFormRow title={t("employee_teams.labels.members")}>
|
<LayoutFormRow title={t("employee_teams.labels.members")}>
|
||||||
@@ -296,8 +283,6 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => {
|
{fields.map((field, index) => {
|
||||||
const teamMember = normalizeTeamMember(teamMembers[field.name]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
||||||
<Form.Item name={[field.name, "id"]} hidden>
|
<Form.Item name={[field.name, "id"]} hidden>
|
||||||
@@ -305,7 +290,92 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
<LayoutFormRow
|
<LayoutFormRow
|
||||||
grow
|
grow
|
||||||
title={getTeamMemberTitle(teamMember)}
|
title={
|
||||||
|
<div style={INLINE_TITLE_ROW_STYLE}>
|
||||||
|
<HolderOutlined style={INLINE_TITLE_HANDLE_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "1 1 320px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employee_teams.fields.employeeid")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "employeeid"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<EmployeeSearchSelectComponent options={bodyshop.employees} />
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 1 170px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employee_teams.fields.allocation")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
name={[field.name, "percentage"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber
|
||||||
|
min={0}
|
||||||
|
max={100}
|
||||||
|
precision={2}
|
||||||
|
size="small"
|
||||||
|
aria-label={t("employee_teams.fields.allocation")}
|
||||||
|
suffix="%"
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_INPUT_STYLE,
|
||||||
|
width: "100%"
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
<div aria-hidden style={INLINE_TITLE_SEPARATOR_STYLE} />
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
...INLINE_TITLE_GROUP_STYLE,
|
||||||
|
flex: "0 1 260px"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div style={INLINE_TITLE_LABEL_STYLE}>{t("employee_teams.fields.payout_method")}</div>
|
||||||
|
<Form.Item
|
||||||
|
noStyle
|
||||||
|
key={`${index}-payout-method`}
|
||||||
|
name={[field.name, "payout_method"]}
|
||||||
|
initialValue="hourly"
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
aria-label={t("employee_teams.fields.payout_method")}
|
||||||
|
size="small"
|
||||||
|
options={payoutMethodOptions}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
styles={{
|
||||||
|
selector: INLINE_TITLE_INPUT_STYLE
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
wrapTitle
|
||||||
extra={
|
extra={
|
||||||
<Space align="center" size="small">
|
<Space align="center" size="small">
|
||||||
<Button
|
<Button
|
||||||
@@ -325,50 +395,10 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<Row gutter={[16, 0]}>
|
<Form.Item
|
||||||
<Col {...TEAM_MEMBER_PRIMARY_FIELD_COLS.employee}>
|
noStyle
|
||||||
<Form.Item
|
dependencies={[["employee_team_members", field.name, "payout_method"]]}
|
||||||
label={t("employee_teams.fields.employeeid")}
|
>
|
||||||
name={[field.name, "employeeid"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<EmployeeSearchSelectComponent options={bodyshop.employees} />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
<Col {...TEAM_MEMBER_PRIMARY_FIELD_COLS.allocation}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("employee_teams.fields.allocation_percentage")}
|
|
||||||
name={[field.name, "percentage"]}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<InputNumber min={0} max={100} precision={2} />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
<Col {...TEAM_MEMBER_PRIMARY_FIELD_COLS.payoutMethod}>
|
|
||||||
<Form.Item
|
|
||||||
label={t("employee_teams.fields.payout_method")}
|
|
||||||
key={`${index}-payout-method`}
|
|
||||||
name={[field.name, "payout_method"]}
|
|
||||||
initialValue="hourly"
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Select options={payoutMethodOptions} />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
<Form.Item noStyle dependencies={[["employee_team_members", field.name, "payout_method"]]}>
|
|
||||||
{() => {
|
{() => {
|
||||||
const payoutMethod =
|
const payoutMethod =
|
||||||
form.getFieldValue(["employee_team_members", field.name, "payout_method"]) ||
|
form.getFieldValue(["employee_team_members", field.name, "payout_method"]) ||
|
||||||
@@ -378,7 +408,10 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
return (
|
return (
|
||||||
<Row gutter={[16, 0]}>
|
<Row gutter={[16, 0]}>
|
||||||
{LABOR_TYPES.map((laborType) => (
|
{LABOR_TYPES.map((laborType) => (
|
||||||
<Col {...TEAM_MEMBER_RATE_FIELD_COLS} key={`${index}-${fieldName}-${laborType}`}>
|
<Col
|
||||||
|
{...TEAM_MEMBER_RATE_FIELD_COLS}
|
||||||
|
key={`${index}-${fieldName}-${laborType}`}
|
||||||
|
>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t(`joblines.fields.lbr_types.${laborType}`)}
|
label={t(`joblines.fields.lbr_types.${laborType}`)}
|
||||||
name={[field.name, fieldName, laborType]}
|
name={[field.name, fieldName, laborType]}
|
||||||
@@ -389,9 +422,9 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
|
|||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{payoutMethod === "commission" ? (
|
{payoutMethod === "commission" ? (
|
||||||
<InputNumber min={0} max={100} precision={2} />
|
<InputNumber min={0} max={100} precision={2} suffix="%" />
|
||||||
) : (
|
) : (
|
||||||
<CurrencyInput />
|
<CurrencyInput prefix="$" />
|
||||||
)}
|
)}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ const addBaseTeamMember = ({ employeeId = "emp-1", percentage = 100, rate = 25 }
|
|||||||
fireEvent.change(screen.getByLabelText("Employee"), {
|
fireEvent.change(screen.getByLabelText("Employee"), {
|
||||||
target: { value: employeeId }
|
target: { value: employeeId }
|
||||||
});
|
});
|
||||||
fireEvent.change(screen.getByRole("spinbutton", { name: "Allocation %" }), {
|
fireEvent.change(screen.getByRole("spinbutton", { name: "Allocation" }), {
|
||||||
target: { value: String(percentage) }
|
target: { value: String(percentage) }
|
||||||
});
|
});
|
||||||
fillHourlyRates(rate);
|
fillHourlyRates(rate);
|
||||||
|
|||||||
@@ -463,9 +463,13 @@
|
|||||||
"use_approvals": "Use Time Ticket Approval Queue"
|
"use_approvals": "Use Time Ticket Approval Queue"
|
||||||
},
|
},
|
||||||
"messaginglabel": "Messaging Preset Label",
|
"messaginglabel": "Messaging Preset Label",
|
||||||
|
"messaginglabel_short": "Label",
|
||||||
"messagingtext": "Messaging Preset Text",
|
"messagingtext": "Messaging Preset Text",
|
||||||
|
"messagingtext_short": "Text",
|
||||||
"noteslabel": "Note Label",
|
"noteslabel": "Note Label",
|
||||||
|
"noteslabel_short": "Label",
|
||||||
"notestext": "Note Text",
|
"notestext": "Note Text",
|
||||||
|
"notestext_short": "Text",
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"description": "Select employees to automatically follow new jobs and receive notifications for job updates.",
|
"description": "Select employees to automatically follow new jobs and receive notifications for job updates.",
|
||||||
"invalid_followers": "Invalid selection. Please select valid employees.",
|
"invalid_followers": "Invalid selection. Please select valid employees.",
|
||||||
@@ -832,7 +836,8 @@
|
|||||||
"tooltips": {
|
"tooltips": {
|
||||||
"md_parts_scan": {
|
"md_parts_scan": {
|
||||||
"update_value_tooltip": "Some fields require coded values in order to function properly (e.g. labor and part types). Please reach out to support if you have any questions."
|
"update_value_tooltip": "Some fields require coded values in order to function properly (e.g. labor and part types). Please reach out to support if you have any questions."
|
||||||
}
|
},
|
||||||
|
"reset-color": "Reset color"
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
"centermustexist": "The chosen responsibility center does not exist.",
|
"centermustexist": "The chosen responsibility center does not exist.",
|
||||||
@@ -1942,10 +1947,15 @@
|
|||||||
"employee_refinish": "Refinish",
|
"employee_refinish": "Refinish",
|
||||||
"est_addr1": "Estimator Address",
|
"est_addr1": "Estimator Address",
|
||||||
"est_co_nm": "Estimator Company",
|
"est_co_nm": "Estimator Company",
|
||||||
|
"est_co_nm_short": "Company",
|
||||||
"est_ct_fn": "Estimator First Name",
|
"est_ct_fn": "Estimator First Name",
|
||||||
|
"est_ct_fn_short": "First Name",
|
||||||
"est_ct_ln": "Estimator Last Name",
|
"est_ct_ln": "Estimator Last Name",
|
||||||
|
"est_ct_ln_short": "Last Name",
|
||||||
"est_ea": "Estimator Email",
|
"est_ea": "Estimator Email",
|
||||||
|
"est_ea_short": "Email",
|
||||||
"est_ph1": "Estimator Phone #",
|
"est_ph1": "Estimator Phone #",
|
||||||
|
"est_ph1_short": "Phone #",
|
||||||
"estimate_approved": "Estimate Approved",
|
"estimate_approved": "Estimate Approved",
|
||||||
"estimate_sent_approval": "Estimate Sent for Approval",
|
"estimate_sent_approval": "Estimate Sent for Approval",
|
||||||
"federal_tax_payable": "Federal Tax Payable",
|
"federal_tax_payable": "Federal Tax Payable",
|
||||||
@@ -1958,9 +1968,13 @@
|
|||||||
"ins_co_nm": "Insurance Company Name",
|
"ins_co_nm": "Insurance Company Name",
|
||||||
"ins_co_nm_short": "Ins. Co.",
|
"ins_co_nm_short": "Ins. Co.",
|
||||||
"ins_ct_fn": "Adjuster First Name",
|
"ins_ct_fn": "Adjuster First Name",
|
||||||
|
"ins_ct_fn_short": "First Name",
|
||||||
"ins_ct_ln": "Adjuster Last Name",
|
"ins_ct_ln": "Adjuster Last Name",
|
||||||
|
"ins_ct_ln_short": "Last Name",
|
||||||
"ins_ea": "Adjuster Email",
|
"ins_ea": "Adjuster Email",
|
||||||
|
"ins_ea_short": "Email",
|
||||||
"ins_ph1": "Adjuster Phone #",
|
"ins_ph1": "Adjuster Phone #",
|
||||||
|
"ins_ph1_short": "Phone #",
|
||||||
"intake": {
|
"intake": {
|
||||||
"label": "Label",
|
"label": "Label",
|
||||||
"max": "Maximum",
|
"max": "Maximum",
|
||||||
|
|||||||
@@ -463,9 +463,13 @@
|
|||||||
"use_approvals": ""
|
"use_approvals": ""
|
||||||
},
|
},
|
||||||
"messaginglabel": "",
|
"messaginglabel": "",
|
||||||
|
"messaginglabel_short": "",
|
||||||
"messagingtext": "",
|
"messagingtext": "",
|
||||||
|
"messagingtext_short": "",
|
||||||
"noteslabel": "",
|
"noteslabel": "",
|
||||||
|
"noteslabel_short": "",
|
||||||
"notestext": "",
|
"notestext": "",
|
||||||
|
"notestext_short": "",
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"invalid_followers": "",
|
"invalid_followers": "",
|
||||||
@@ -832,7 +836,8 @@
|
|||||||
"tooltips": {
|
"tooltips": {
|
||||||
"md_parts_scan": {
|
"md_parts_scan": {
|
||||||
"update_value_tooltip": ""
|
"update_value_tooltip": ""
|
||||||
}
|
},
|
||||||
|
"reset-color": ""
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
"centermustexist": "",
|
"centermustexist": "",
|
||||||
@@ -1942,10 +1947,15 @@
|
|||||||
"employee_refinish": "",
|
"employee_refinish": "",
|
||||||
"est_addr1": "Dirección del tasador",
|
"est_addr1": "Dirección del tasador",
|
||||||
"est_co_nm": "Tasador",
|
"est_co_nm": "Tasador",
|
||||||
|
"est_co_nm_short": "",
|
||||||
"est_ct_fn": "Nombre del tasador",
|
"est_ct_fn": "Nombre del tasador",
|
||||||
|
"est_ct_fn_short": "",
|
||||||
"est_ct_ln": "Apellido del tasador",
|
"est_ct_ln": "Apellido del tasador",
|
||||||
|
"est_ct_ln_short": "",
|
||||||
"est_ea": "Correo electrónico del tasador",
|
"est_ea": "Correo electrónico del tasador",
|
||||||
|
"est_ea_short": "",
|
||||||
"est_ph1": "Número de teléfono del tasador",
|
"est_ph1": "Número de teléfono del tasador",
|
||||||
|
"est_ph1_short": "",
|
||||||
"estimate_approved": "",
|
"estimate_approved": "",
|
||||||
"estimate_sent_approval": "",
|
"estimate_sent_approval": "",
|
||||||
"federal_tax_payable": "Impuesto federal por pagar",
|
"federal_tax_payable": "Impuesto federal por pagar",
|
||||||
@@ -1958,9 +1968,13 @@
|
|||||||
"ins_co_nm": "Nombre de la compañía de seguros",
|
"ins_co_nm": "Nombre de la compañía de seguros",
|
||||||
"ins_co_nm_short": "",
|
"ins_co_nm_short": "",
|
||||||
"ins_ct_fn": "Nombre del controlador de archivos",
|
"ins_ct_fn": "Nombre del controlador de archivos",
|
||||||
|
"ins_ct_fn_short": "",
|
||||||
"ins_ct_ln": "Apellido del manejador de archivos",
|
"ins_ct_ln": "Apellido del manejador de archivos",
|
||||||
|
"ins_ct_ln_short": "",
|
||||||
"ins_ea": "Correo electrónico del controlador de archivos",
|
"ins_ea": "Correo electrónico del controlador de archivos",
|
||||||
|
"ins_ea_short": "",
|
||||||
"ins_ph1": "File Handler Phone #",
|
"ins_ph1": "File Handler Phone #",
|
||||||
|
"ins_ph1_short": "",
|
||||||
"intake": {
|
"intake": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"max": "",
|
"max": "",
|
||||||
|
|||||||
@@ -463,9 +463,13 @@
|
|||||||
"use_approvals": ""
|
"use_approvals": ""
|
||||||
},
|
},
|
||||||
"messaginglabel": "",
|
"messaginglabel": "",
|
||||||
|
"messaginglabel_short": "",
|
||||||
"messagingtext": "",
|
"messagingtext": "",
|
||||||
|
"messagingtext_short": "",
|
||||||
"noteslabel": "",
|
"noteslabel": "",
|
||||||
|
"noteslabel_short": "",
|
||||||
"notestext": "",
|
"notestext": "",
|
||||||
|
"notestext_short": "",
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"invalid_followers": "",
|
"invalid_followers": "",
|
||||||
@@ -832,7 +836,8 @@
|
|||||||
"tooltips": {
|
"tooltips": {
|
||||||
"md_parts_scan": {
|
"md_parts_scan": {
|
||||||
"update_value_tooltip": ""
|
"update_value_tooltip": ""
|
||||||
}
|
},
|
||||||
|
"reset-color": ""
|
||||||
},
|
},
|
||||||
"validation": {
|
"validation": {
|
||||||
"centermustexist": "",
|
"centermustexist": "",
|
||||||
@@ -1942,10 +1947,15 @@
|
|||||||
"employee_refinish": "",
|
"employee_refinish": "",
|
||||||
"est_addr1": "Adresse de l'évaluateur",
|
"est_addr1": "Adresse de l'évaluateur",
|
||||||
"est_co_nm": "Expert",
|
"est_co_nm": "Expert",
|
||||||
|
"est_co_nm_short": "",
|
||||||
"est_ct_fn": "Prénom de l'évaluateur",
|
"est_ct_fn": "Prénom de l'évaluateur",
|
||||||
|
"est_ct_fn_short": "",
|
||||||
"est_ct_ln": "Nom de l'évaluateur",
|
"est_ct_ln": "Nom de l'évaluateur",
|
||||||
|
"est_ct_ln_short": "",
|
||||||
"est_ea": "Courriel de l'évaluateur",
|
"est_ea": "Courriel de l'évaluateur",
|
||||||
|
"est_ea_short": "",
|
||||||
"est_ph1": "Numéro de téléphone de l'évaluateur",
|
"est_ph1": "Numéro de téléphone de l'évaluateur",
|
||||||
|
"est_ph1_short": "",
|
||||||
"estimate_approved": "",
|
"estimate_approved": "",
|
||||||
"estimate_sent_approval": "",
|
"estimate_sent_approval": "",
|
||||||
"federal_tax_payable": "Impôt fédéral à payer",
|
"federal_tax_payable": "Impôt fédéral à payer",
|
||||||
@@ -1958,9 +1968,13 @@
|
|||||||
"ins_co_nm": "Nom de la compagnie d'assurance",
|
"ins_co_nm": "Nom de la compagnie d'assurance",
|
||||||
"ins_co_nm_short": "",
|
"ins_co_nm_short": "",
|
||||||
"ins_ct_fn": "Prénom du gestionnaire de fichiers",
|
"ins_ct_fn": "Prénom du gestionnaire de fichiers",
|
||||||
|
"ins_ct_fn_short": "",
|
||||||
"ins_ct_ln": "Nom du gestionnaire de fichiers",
|
"ins_ct_ln": "Nom du gestionnaire de fichiers",
|
||||||
|
"ins_ct_ln_short": "",
|
||||||
"ins_ea": "Courriel du gestionnaire de fichiers",
|
"ins_ea": "Courriel du gestionnaire de fichiers",
|
||||||
|
"ins_ea_short": "",
|
||||||
"ins_ph1": "Numéro de téléphone du gestionnaire de fichiers",
|
"ins_ph1": "Numéro de téléphone du gestionnaire de fichiers",
|
||||||
|
"ins_ph1_short": "",
|
||||||
"intake": {
|
"intake": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"max": "",
|
"max": "",
|
||||||
|
|||||||
448
package-lock.json
generated
448
package-lock.json
generated
@@ -9,16 +9,16 @@
|
|||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-cloudwatch-logs": "^3.1014.0",
|
"@aws-sdk/client-cloudwatch-logs": "^3.1016.0",
|
||||||
"@aws-sdk/client-elasticache": "^3.1014.0",
|
"@aws-sdk/client-elasticache": "^3.1016.0",
|
||||||
"@aws-sdk/client-s3": "^3.1014.0",
|
"@aws-sdk/client-s3": "^3.1016.0",
|
||||||
"@aws-sdk/client-secrets-manager": "^3.1014.0",
|
"@aws-sdk/client-secrets-manager": "^3.1016.0",
|
||||||
"@aws-sdk/client-ses": "^3.1014.0",
|
"@aws-sdk/client-ses": "^3.1016.0",
|
||||||
"@aws-sdk/client-sqs": "^3.1014.0",
|
"@aws-sdk/client-sqs": "^3.1016.0",
|
||||||
"@aws-sdk/client-textract": "^3.1014.0",
|
"@aws-sdk/client-textract": "^3.1016.0",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/lib-storage": "^3.1014.0",
|
"@aws-sdk/lib-storage": "^3.1016.0",
|
||||||
"@aws-sdk/s3-request-presigner": "^3.1014.0",
|
"@aws-sdk/s3-request-presigner": "^3.1016.0",
|
||||||
"@opensearch-project/opensearch": "^2.13.0",
|
"@opensearch-project/opensearch": "^2.13.0",
|
||||||
"@socket.io/admin-ui": "^0.5.1",
|
"@socket.io/admin-ui": "^0.5.1",
|
||||||
"@socket.io/redis-adapter": "^8.3.0",
|
"@socket.io/redis-adapter": "^8.3.0",
|
||||||
@@ -37,10 +37,10 @@
|
|||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
"express": "^4.21.1",
|
"express": "^4.21.1",
|
||||||
"fast-xml-parser": "^5.5.8",
|
"fast-xml-parser": "^5.5.9",
|
||||||
"firebase-admin": "^13.7.0",
|
"firebase-admin": "^13.7.0",
|
||||||
"fuse.js": "^7.1.0",
|
"fuse.js": "^7.1.0",
|
||||||
"graphql": "^16.13.1",
|
"graphql": "^16.13.2",
|
||||||
"graphql-request": "^6.1.0",
|
"graphql-request": "^6.1.0",
|
||||||
"intuit-oauth": "^4.2.2",
|
"intuit-oauth": "^4.2.2",
|
||||||
"ioredis": "^5.10.1",
|
"ioredis": "^5.10.1",
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
"socket.io": "^4.8.3",
|
"socket.io": "^4.8.3",
|
||||||
"socket.io-adapter": "^2.5.6",
|
"socket.io-adapter": "^2.5.6",
|
||||||
"ssh2-sftp-client": "^11.0.0",
|
"ssh2-sftp-client": "^11.0.0",
|
||||||
"twilio": "^5.13.0",
|
"twilio": "^5.13.1",
|
||||||
"uuid": "^11.1.0",
|
"uuid": "^11.1.0",
|
||||||
"winston": "^3.19.0",
|
"winston": "^3.19.0",
|
||||||
"winston-cloudwatch": "^6.3.0",
|
"winston-cloudwatch": "^6.3.0",
|
||||||
@@ -82,7 +82,7 @@
|
|||||||
"p-limit": "^3.1.0",
|
"p-limit": "^3.1.0",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"supertest": "^7.2.2",
|
"supertest": "^7.2.2",
|
||||||
"vitest": "^4.1.0"
|
"vitest": "^4.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=22.13.0",
|
"node": ">=22.13.0",
|
||||||
@@ -292,24 +292,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-cloudwatch-logs": {
|
"node_modules/@aws-sdk/client-cloudwatch-logs": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.1016.0.tgz",
|
||||||
"integrity": "sha512-T3TV8Rk4gyv18W5N1r/PeQaAbHTwJMV12JJ9KQEEdY0ZS1Bb/kx9JIPgMMlUjSQ7LeJ8FsdNRXDuAtCt3kCy+Q==",
|
"integrity": "sha512-ufI94kxGQDZJ+0EsnOjF3ZtTBYF2ZArfb5a8lExFRPwat99pBBAWny8tVpBT1bRfjlxnbBjUTH+ZThmzw1VgJw==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/eventstream-serde-browser": "^4.2.12",
|
"@smithy/eventstream-serde-browser": "^4.2.12",
|
||||||
@@ -345,24 +345,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-elasticache": {
|
"node_modules/@aws-sdk/client-elasticache": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.1016.0.tgz",
|
||||||
"integrity": "sha512-1gSai5MxtnmiGt80thfnmcfTWXRtj2vRDhDkSOa348e9MlSfFAttKuvp+bFb92M1FxbM9Dh8wQZxxluuQWu3wA==",
|
"integrity": "sha512-Y9hbJsU7QWX1dFMch1zOLRr7Ym6u8jAStP2rKluF9CQAkDSJGIO0xa6IdA2vjnrKh5H2tjC3A35zKJ8dKeJ9fQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -396,32 +396,32 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-s3": {
|
"node_modules/@aws-sdk/client-s3": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1016.0.tgz",
|
||||||
"integrity": "sha512-0XLrOT4Cm3NEhhiME7l/8LbTXS4KdsbR4dSrY207KNKTcHLLTZ9EXt4ZpgnTfLvWQF3pGP2us4Zi1fYLo0N+Ow==",
|
"integrity": "sha512-E9umet1PolP6I8TpjQQ2W88aIIguyiRQJE98ag6N6QeLgjSZsF+h9l3KclwCRvqUFU68x+HRwrgXxvbIBVFLbA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha1-browser": "5.2.0",
|
"@aws-crypto/sha1-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-bucket-endpoint": "^3.972.8",
|
"@aws-sdk/middleware-bucket-endpoint": "^3.972.8",
|
||||||
"@aws-sdk/middleware-expect-continue": "^3.972.8",
|
"@aws-sdk/middleware-expect-continue": "^3.972.8",
|
||||||
"@aws-sdk/middleware-flexible-checksums": "^3.974.3",
|
"@aws-sdk/middleware-flexible-checksums": "^3.974.4",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-location-constraint": "^3.972.8",
|
"@aws-sdk/middleware-location-constraint": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-sdk-s3": "^3.972.23",
|
"@aws-sdk/middleware-sdk-s3": "^3.972.24",
|
||||||
"@aws-sdk/middleware-ssec": "^3.972.8",
|
"@aws-sdk/middleware-ssec": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/signature-v4-multi-region": "^3.996.11",
|
"@aws-sdk/signature-v4-multi-region": "^3.996.12",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/eventstream-serde-browser": "^4.2.12",
|
"@smithy/eventstream-serde-browser": "^4.2.12",
|
||||||
@@ -462,24 +462,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-secrets-manager": {
|
"node_modules/@aws-sdk/client-secrets-manager": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1016.0.tgz",
|
||||||
"integrity": "sha512-XRp6t0AHGxmCWwYqfELxJUiHnOIR5yUyWBNXJjeEp4t9Pzdg86pQw1aXfmfZ4sVdebT06lL9+D0NsP12ztoSlQ==",
|
"integrity": "sha512-gDo0HdDDSUVJZICI5eYSkiTrDyKfzZhul88j0+1+JSQhiB6Yld+xVSsRHewkU0yc3w1adbHjQ9p9b0gv9sz04A==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -512,24 +512,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-ses": {
|
"node_modules/@aws-sdk/client-ses": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.1016.0.tgz",
|
||||||
"integrity": "sha512-HXLdpIDatHAzEHFoiwwcoYQ5Sx6FP1pkjTwvhgW5zQ+4E69/zC7quQ0dzxX8I38Itvyr8Dq/CmNLUM76XErAVw==",
|
"integrity": "sha512-vIGhTe07ihJs80SIvtWqETrFC0oLVJZ9+mtNuTs1WFeDg8YBGQU1ryaExi9spH2dibE/s4gKhBMFitWcTh1vUQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -563,25 +563,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-sqs": {
|
"node_modules/@aws-sdk/client-sqs": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1016.0.tgz",
|
||||||
"integrity": "sha512-xZ/yAd5FtpDyeIRRSXlRV7/PC0wC3vUENBEx5h/j06UkrOosoELp7YguC7ecwvKYeO7mvOO4I94iEhfJspp7Dw==",
|
"integrity": "sha512-31OP7m98ZXuHF7DbOapmjp2hJyrduwwNaZPYrPyDcSTZ+60Qg+F/AUA6snw+QpOPfVnxFqkofhxyBKPPbaQWig==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-sdk-sqs": "^3.972.17",
|
"@aws-sdk/middleware-sdk-sqs": "^3.972.17",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -615,24 +615,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/client-textract": {
|
"node_modules/@aws-sdk/client-textract": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.1016.0.tgz",
|
||||||
"integrity": "sha512-go4Wsbz6UrrtbsEMT0urj/zESL9CJ36B6cOMf+WxgOr3qUq/40+hLO30BtIN5C9psyAMVGgNi6Wv9abaejuezQ==",
|
"integrity": "sha512-OvG7BO0oBNX2t684v3gB00oL19cm7zxcA00RuacirVciLmhEEokqbcfHa00aa8X1aeiM89q1ZoEKOcd1BnSTFQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -665,9 +665,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/core": {
|
"node_modules/@aws-sdk/core": {
|
||||||
"version": "3.973.23",
|
"version": "3.973.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.24.tgz",
|
||||||
"integrity": "sha512-aoJncvD1XvloZ9JLnKqTRL9dBy+Szkryoag9VT+V1TqsuUgIxV9cnBVM/hrDi2vE8bDqLiDR8nirdRcCdtJu0w==",
|
"integrity": "sha512-vvf82RYQu2GidWAuQq+uIzaPz9V0gSCXVqdVzRosgl5rXcspXOpSD3wFreGGW6AYymPr97Z69kjVnLePBxloDw==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
@@ -702,12 +702,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-env": {
|
"node_modules/@aws-sdk/credential-provider-env": {
|
||||||
"version": "3.972.21",
|
"version": "3.972.22",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.21.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.22.tgz",
|
||||||
"integrity": "sha512-BkAfKq8Bd4shCtec1usNz//urPJF/SZy14qJyxkSaRJQ/Vv1gVh0VZSTmS7aE6aLMELkFV5wHHrS9ZcdG8Kxsg==",
|
"integrity": "sha512-cXp0VTDWT76p3hyK5D51yIKEfpf6/zsUvMfaB8CkyqadJxMQ8SbEeVroregmDlZbtG31wkj9ei0WnftmieggLg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/types": "^4.13.1",
|
"@smithy/types": "^4.13.1",
|
||||||
@@ -718,12 +718,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-http": {
|
"node_modules/@aws-sdk/credential-provider-http": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.24.tgz",
|
||||||
"integrity": "sha512-4XZ3+Gu5DY8/n8zQFHBgcKTF7hWQl42G6CY9xfXVo2d25FM/lYkpmuzhYopYoPL1ITWkJ2OSBQfYEu5JRfHOhA==",
|
"integrity": "sha512-h694K7+tRuepSRJr09wTvQfaEnjzsKZ5s7fbESrVds02GT/QzViJ94/HCNwM7bUfFxqpPXHxulZfL6Cou0dwPg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
"@smithy/node-http-handler": "^4.5.0",
|
"@smithy/node-http-handler": "^4.5.0",
|
||||||
@@ -739,19 +739,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-ini": {
|
"node_modules/@aws-sdk/credential-provider-ini": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.24.tgz",
|
||||||
"integrity": "sha512-PZLSmU0JFpNCDFReidBezsgL5ji9jOBry8CnZdw4Jj6d0K2z3Ftnp44NXgADqYx5BLMu/ZHujfeJReaDoV+IwQ==",
|
"integrity": "sha512-O46fFmv0RDFWiWEA9/e6oW92BnsyAXuEgTTasxHligjn2RCr9L/DK773m/NoFaL3ZdNAUz8WxgxunleMnHAkeQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/credential-provider-env": "^3.972.21",
|
"@aws-sdk/credential-provider-env": "^3.972.22",
|
||||||
"@aws-sdk/credential-provider-http": "^3.972.23",
|
"@aws-sdk/credential-provider-http": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-login": "^3.972.23",
|
"@aws-sdk/credential-provider-login": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-process": "^3.972.21",
|
"@aws-sdk/credential-provider-process": "^3.972.22",
|
||||||
"@aws-sdk/credential-provider-sso": "^3.972.23",
|
"@aws-sdk/credential-provider-sso": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-web-identity": "^3.972.23",
|
"@aws-sdk/credential-provider-web-identity": "^3.972.24",
|
||||||
"@aws-sdk/nested-clients": "^3.996.13",
|
"@aws-sdk/nested-clients": "^3.996.14",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/credential-provider-imds": "^4.2.12",
|
"@smithy/credential-provider-imds": "^4.2.12",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
@@ -764,13 +764,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-login": {
|
"node_modules/@aws-sdk/credential-provider-login": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.24.tgz",
|
||||||
"integrity": "sha512-OmE/pSkbMM3dCj1HdOnZ5kXnKK+R/Yz+kbBugraBecp0pGAs21eEURfQRz+1N2gzIHLVyGIP1MEjk/uSrFsngg==",
|
"integrity": "sha512-sIk8oa6AzDoUhxsR11svZESqvzGuXesw62Rl2oW6wguZx8i9cdGCvkFg+h5K7iucUZP8wyWibUbJMc+J66cu5g==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/nested-clients": "^3.996.13",
|
"@aws-sdk/nested-clients": "^3.996.14",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/protocol-http": "^5.3.12",
|
"@smithy/protocol-http": "^5.3.12",
|
||||||
@@ -783,17 +783,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-node": {
|
"node_modules/@aws-sdk/credential-provider-node": {
|
||||||
"version": "3.972.24",
|
"version": "3.972.25",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.24.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.25.tgz",
|
||||||
"integrity": "sha512-9Jwi7aps3AfUicJyF5udYadPypPpCwUZ6BSKr/QjRbVCpRVS1wc+1Q6AEZ/qz8J4JraeRd247pSzyMQSIHVebw==",
|
"integrity": "sha512-m7dR0Dsva2P+VUpL+VkC0WwiDby5pgmWXkRVDB5rlwv0jXJrQJf7YMtCoM8Wjk0H9jPeCYOxOXXcIgp/qp5Alg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/credential-provider-env": "^3.972.21",
|
"@aws-sdk/credential-provider-env": "^3.972.22",
|
||||||
"@aws-sdk/credential-provider-http": "^3.972.23",
|
"@aws-sdk/credential-provider-http": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-ini": "^3.972.23",
|
"@aws-sdk/credential-provider-ini": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-process": "^3.972.21",
|
"@aws-sdk/credential-provider-process": "^3.972.22",
|
||||||
"@aws-sdk/credential-provider-sso": "^3.972.23",
|
"@aws-sdk/credential-provider-sso": "^3.972.24",
|
||||||
"@aws-sdk/credential-provider-web-identity": "^3.972.23",
|
"@aws-sdk/credential-provider-web-identity": "^3.972.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/credential-provider-imds": "^4.2.12",
|
"@smithy/credential-provider-imds": "^4.2.12",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
@@ -806,12 +806,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-process": {
|
"node_modules/@aws-sdk/credential-provider-process": {
|
||||||
"version": "3.972.21",
|
"version": "3.972.22",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.21.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.22.tgz",
|
||||||
"integrity": "sha512-nRxbeOJ1E1gVA0lNQezuMVndx+ZcuyaW/RB05pUsznN5BxykSlH6KkZ/7Ca/ubJf3i5N3p0gwNO5zgPSCzj+ww==",
|
"integrity": "sha512-Os32s8/4gTZjBk5BtoS/cuTILaj+K72d0dVG7TCJX/fC4598cxwLDmf1AEHEpER5oL3K//yETjvFaz0V8oO5Xw==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/shared-ini-file-loader": "^4.4.7",
|
"@smithy/shared-ini-file-loader": "^4.4.7",
|
||||||
@@ -823,14 +823,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-sso": {
|
"node_modules/@aws-sdk/credential-provider-sso": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.24.tgz",
|
||||||
"integrity": "sha512-APUccADuYPLL0f2htpM8Z4czabSmHOdo4r41W6lKEZdy++cNJ42Radqy6x4TopENzr3hR6WYMyhiuiqtbf/nAA==",
|
"integrity": "sha512-PaFv7snEfypU2yXkpvfyWgddEbDLtgVe51wdZlinhc2doubBjUzJZZpgwuF2Jenl1FBydMhNpMjD6SBUM3qdSA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/nested-clients": "^3.996.13",
|
"@aws-sdk/nested-clients": "^3.996.14",
|
||||||
"@aws-sdk/token-providers": "3.1014.0",
|
"@aws-sdk/token-providers": "3.1015.0",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/shared-ini-file-loader": "^4.4.7",
|
"@smithy/shared-ini-file-loader": "^4.4.7",
|
||||||
@@ -842,13 +842,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/credential-provider-web-identity": {
|
"node_modules/@aws-sdk/credential-provider-web-identity": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.24.tgz",
|
||||||
"integrity": "sha512-H5JNqtIwOu/feInmMMWcK0dL5r897ReEn7n2m16Dd0DPD9gA2Hg8Cq4UDzZ/9OzaLh/uqBM6seixz0U6Fi2Eag==",
|
"integrity": "sha512-J6H4R1nvr3uBTqD/EeIPAskrBtET4WFfNhpFySr2xW7bVZOXpQfPjrLSIx65jcNjBmLXzWq8QFLdVoGxiGG/SA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/nested-clients": "^3.996.13",
|
"@aws-sdk/nested-clients": "^3.996.14",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/shared-ini-file-loader": "^4.4.7",
|
"@smithy/shared-ini-file-loader": "^4.4.7",
|
||||||
@@ -860,9 +860,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/lib-storage": {
|
"node_modules/@aws-sdk/lib-storage": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1016.0.tgz",
|
||||||
"integrity": "sha512-mM0/YpIEKKQ1hM9n1Q2HhN1ztjk3oNKqFMYP+cZ57FR3XVU4UOw9Npu7gnjfzkNrS7WTDZMe0wCMuDvvtq1Oeg==",
|
"integrity": "sha512-zSHj28SAKCinrxUiJp2fsAFMqc4AWM9WNOOMayysTgOAAticMip9nVcsbcDJCh0PCB9U+ikZdW7OWSCuw7E5xA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@smithy/abort-controller": "^4.2.12",
|
"@smithy/abort-controller": "^4.2.12",
|
||||||
@@ -877,7 +877,7 @@
|
|||||||
"node": ">=20.0.0"
|
"node": ">=20.0.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.1014.0"
|
"@aws-sdk/client-s3": "^3.1016.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/middleware-bucket-endpoint": {
|
"node_modules/@aws-sdk/middleware-bucket-endpoint": {
|
||||||
@@ -914,15 +914,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/middleware-flexible-checksums": {
|
"node_modules/@aws-sdk/middleware-flexible-checksums": {
|
||||||
"version": "3.974.3",
|
"version": "3.974.4",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.3.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.4.tgz",
|
||||||
"integrity": "sha512-fB7FNLH1+VPUs0QL3PLrHW+DD4gKu6daFgWtyq3R0Y0Lx8DLZPvyGAxCZNFBxH+M2xt9KvBJX6USwjuqvitmCQ==",
|
"integrity": "sha512-fhCbZXPAyy8btnNbnBlR7Cc1nD54cETSvGn2wey71ehsM89AKPO8Dpco9DBAAgvrUdLrdHQepBXcyX4vxC5OwA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/crc32": "5.2.0",
|
"@aws-crypto/crc32": "5.2.0",
|
||||||
"@aws-crypto/crc32c": "5.2.0",
|
"@aws-crypto/crc32c": "5.2.0",
|
||||||
"@aws-crypto/util": "5.2.0",
|
"@aws-crypto/util": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/crc64-nvme": "^3.972.5",
|
"@aws-sdk/crc64-nvme": "^3.972.5",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/is-array-buffer": "^4.2.2",
|
"@smithy/is-array-buffer": "^4.2.2",
|
||||||
@@ -998,12 +998,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/middleware-sdk-s3": {
|
"node_modules/@aws-sdk/middleware-sdk-s3": {
|
||||||
"version": "3.972.23",
|
"version": "3.972.24",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.23.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.24.tgz",
|
||||||
"integrity": "sha512-50QgHGPQAb2veqFOmTF1A3GsAklLHZXL47KbY35khIkfbXH5PLvqpEc/gOAEBPj/yFxrlgxz/8mqWcWTNxBkwQ==",
|
"integrity": "sha512-4sXxVC/enYgMkZefNMOzU6C6KtAXEvwVJLgNcUx1dvROH6GvKB5Sm2RGnGzTp0/PwkibIyMw4kOzF8tbLfaBAQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-arn-parser": "^3.972.3",
|
"@aws-sdk/util-arn-parser": "^3.972.3",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
@@ -1054,12 +1054,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/middleware-user-agent": {
|
"node_modules/@aws-sdk/middleware-user-agent": {
|
||||||
"version": "3.972.24",
|
"version": "3.972.25",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.24.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.25.tgz",
|
||||||
"integrity": "sha512-dLTWy6IfAMhNiSEvMr07g/qZ54be6pLqlxVblbF6AzafmmGAzMMj8qMoY9B4+YgT+gY9IcuxZslNh03L6PyMCQ==",
|
"integrity": "sha512-QxiMPofvOt8SwSynTOmuZfvvPM1S9QfkESBxB22NMHTRXCJhR5BygLl8IXfC4jELiisQgwsgUby21GtXfX3f/g==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
@@ -1073,23 +1073,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/nested-clients": {
|
"node_modules/@aws-sdk/nested-clients": {
|
||||||
"version": "3.996.13",
|
"version": "3.996.14",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.13.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.14.tgz",
|
||||||
"integrity": "sha512-ptZ1HF4yYHNJX8cgFF+8NdYO69XJKZn7ft0/ynV3c0hCbN+89fAbrLS+fqniU2tW8o9Kfqhj8FUh+IPXb2Qsuw==",
|
"integrity": "sha512-fSESKvh1VbfjtV3QMnRkCPZWkUbQof6T/DOpiLp33yP2wA+rbwwnZeG3XT3Ekljgw2I8X4XaQPnw+zSR8yxJ5Q==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-crypto/sha256-browser": "5.2.0",
|
"@aws-crypto/sha256-browser": "5.2.0",
|
||||||
"@aws-crypto/sha256-js": "5.2.0",
|
"@aws-crypto/sha256-js": "5.2.0",
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/middleware-host-header": "^3.972.8",
|
"@aws-sdk/middleware-host-header": "^3.972.8",
|
||||||
"@aws-sdk/middleware-logger": "^3.972.8",
|
"@aws-sdk/middleware-logger": "^3.972.8",
|
||||||
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/region-config-resolver": "^3.972.9",
|
"@aws-sdk/region-config-resolver": "^3.972.9",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-endpoints": "^3.996.5",
|
"@aws-sdk/util-endpoints": "^3.996.5",
|
||||||
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
"@aws-sdk/util-user-agent-browser": "^3.972.8",
|
||||||
"@aws-sdk/util-user-agent-node": "^3.973.10",
|
"@aws-sdk/util-user-agent-node": "^3.973.11",
|
||||||
"@smithy/config-resolver": "^4.4.13",
|
"@smithy/config-resolver": "^4.4.13",
|
||||||
"@smithy/core": "^3.23.12",
|
"@smithy/core": "^3.23.12",
|
||||||
"@smithy/fetch-http-handler": "^5.3.15",
|
"@smithy/fetch-http-handler": "^5.3.15",
|
||||||
@@ -1138,12 +1138,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/s3-request-presigner": {
|
"node_modules/@aws-sdk/s3-request-presigner": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1016.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.1016.0.tgz",
|
||||||
"integrity": "sha512-XEcK50lToSoLPrQztKQhONYQW45613H8oEL00mBUd/+OZgk0+3zJ8kSNDsIJioZ3H7Be+yC3CL6a22dZFIKUXQ==",
|
"integrity": "sha512-BROPno9Y8xYltQu5k1AupDPaWdFR9Ig8zfDSZzTE+MTvKpif6wyAHFJRW0C0xIwZckaHya2oFoTZbPHtyIlQkg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/signature-v4-multi-region": "^3.996.11",
|
"@aws-sdk/signature-v4-multi-region": "^3.996.12",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@aws-sdk/util-format-url": "^3.972.8",
|
"@aws-sdk/util-format-url": "^3.972.8",
|
||||||
"@smithy/middleware-endpoint": "^4.4.27",
|
"@smithy/middleware-endpoint": "^4.4.27",
|
||||||
@@ -1157,12 +1157,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/signature-v4-multi-region": {
|
"node_modules/@aws-sdk/signature-v4-multi-region": {
|
||||||
"version": "3.996.11",
|
"version": "3.996.12",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.11.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.12.tgz",
|
||||||
"integrity": "sha512-SKgZY7x6AloLUXO20FJGnkKJ3a6CXzNDt6PYs2yqoPzgU0xKWcUoGGJGEBTsfM5eihKW42lbwp+sXzACLbSsaA==",
|
"integrity": "sha512-abRObSqjVeKUUHIZfAp78PTYrEsxCgVKDs/YET357pzT5C02eDDEvmWyeEC2wglWcYC4UTbBFk22gd2YJUlCQg==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/middleware-sdk-s3": "^3.972.23",
|
"@aws-sdk/middleware-sdk-s3": "^3.972.24",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/protocol-http": "^5.3.12",
|
"@smithy/protocol-http": "^5.3.12",
|
||||||
"@smithy/signature-v4": "^5.3.12",
|
"@smithy/signature-v4": "^5.3.12",
|
||||||
@@ -1174,13 +1174,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/token-providers": {
|
"node_modules/@aws-sdk/token-providers": {
|
||||||
"version": "3.1014.0",
|
"version": "3.1015.0",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1014.0.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1015.0.tgz",
|
||||||
"integrity": "sha512-gHTHNUoaOGNrSWkl32A7wFsU78jlNTlqMccLu0byUk5CysYYXaxNMIonIVr4YcykC7vgtDS5ABuz83giy6fzJA==",
|
"integrity": "sha512-3OSD4y110nisRhHzFOjoEeHU4GQL4KpzkX9PxzWaiZe0Yg2+thZKM0Pn9DjYwezH5JYfh/K++xK/SE0IHGrmCQ==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/core": "^3.973.23",
|
"@aws-sdk/core": "^3.973.24",
|
||||||
"@aws-sdk/nested-clients": "^3.996.13",
|
"@aws-sdk/nested-clients": "^3.996.14",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/property-provider": "^4.2.12",
|
"@smithy/property-provider": "^4.2.12",
|
||||||
"@smithy/shared-ini-file-loader": "^4.4.7",
|
"@smithy/shared-ini-file-loader": "^4.4.7",
|
||||||
@@ -1272,12 +1272,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@aws-sdk/util-user-agent-node": {
|
"node_modules/@aws-sdk/util-user-agent-node": {
|
||||||
"version": "3.973.10",
|
"version": "3.973.11",
|
||||||
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.10.tgz",
|
"resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.11.tgz",
|
||||||
"integrity": "sha512-E99zeTscCc+pTMfsvnfi6foPpKmdD1cZfOC7/P8UUrjsoQdg9VEWPRD+xdFduKnfPXwcvby58AlO9jwwF6U96g==",
|
"integrity": "sha512-1qdXbXo2s5MMLpUvw00284LsbhtlQ4ul7Zzdn5n+7p4WVgCMLqhxImpHIrjSoc72E/fyc4Wq8dLtUld2Gsh+lA==",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/middleware-user-agent": "^3.972.24",
|
"@aws-sdk/middleware-user-agent": "^3.972.25",
|
||||||
"@aws-sdk/types": "^3.973.6",
|
"@aws-sdk/types": "^3.973.6",
|
||||||
"@smithy/node-config-provider": "^4.3.12",
|
"@smithy/node-config-provider": "^4.3.12",
|
||||||
"@smithy/types": "^4.13.1",
|
"@smithy/types": "^4.13.1",
|
||||||
@@ -1310,6 +1310,26 @@
|
|||||||
"node": ">=20.0.0"
|
"node": ">=20.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser": {
|
||||||
|
"version": "5.5.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
|
||||||
|
"integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/NaturalIntelligence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-xml-builder": "^1.1.4",
|
||||||
|
"path-expression-matcher": "^1.2.0",
|
||||||
|
"strnum": "^2.2.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"fxparser": "src/cli/cli.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@aws/lambda-invoke-store": {
|
"node_modules/@aws/lambda-invoke-store": {
|
||||||
"version": "0.2.4",
|
"version": "0.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
|
||||||
@@ -3964,16 +3984,16 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/expect": {
|
"node_modules/@vitest/expect": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.1.tgz",
|
||||||
"integrity": "sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==",
|
"integrity": "sha512-xAV0fqBTk44Rn6SjJReEQkHP3RrqbJo6JQ4zZ7/uVOiJZRarBtblzrOfFIZeYUrukp2YD6snZG6IBqhOoHTm+A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@standard-schema/spec": "^1.1.0",
|
"@standard-schema/spec": "^1.1.0",
|
||||||
"@types/chai": "^5.2.2",
|
"@types/chai": "^5.2.2",
|
||||||
"@vitest/spy": "4.1.0",
|
"@vitest/spy": "4.1.1",
|
||||||
"@vitest/utils": "4.1.0",
|
"@vitest/utils": "4.1.1",
|
||||||
"chai": "^6.2.2",
|
"chai": "^6.2.2",
|
||||||
"tinyrainbow": "^3.0.3"
|
"tinyrainbow": "^3.0.3"
|
||||||
},
|
},
|
||||||
@@ -3982,13 +4002,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/mocker": {
|
"node_modules/@vitest/mocker": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.1.tgz",
|
||||||
"integrity": "sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==",
|
"integrity": "sha512-h3BOylsfsCLPeceuCPAAJ+BvNwSENgJa4hXoXu4im0bs9Lyp4URc4JYK4pWLZ4pG/UQn7AT92K6IByi6rE6g3A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vitest/spy": "4.1.0",
|
"@vitest/spy": "4.1.1",
|
||||||
"estree-walker": "^3.0.3",
|
"estree-walker": "^3.0.3",
|
||||||
"magic-string": "^0.30.21"
|
"magic-string": "^0.30.21"
|
||||||
},
|
},
|
||||||
@@ -3997,7 +4017,7 @@
|
|||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"msw": "^2.4.9",
|
"msw": "^2.4.9",
|
||||||
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0"
|
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
"msw": {
|
"msw": {
|
||||||
@@ -4009,9 +4029,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/pretty-format": {
|
"node_modules/@vitest/pretty-format": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.1.tgz",
|
||||||
"integrity": "sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==",
|
"integrity": "sha512-GM+TEQN5WhOygr1lp7skeVjdLPqqWMHsfzXrcHAqZJi/lIVh63H0kaRCY8MDhNWikx19zBUK8ceaLB7X5AH9NQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -4022,13 +4042,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/runner": {
|
"node_modules/@vitest/runner": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.1.tgz",
|
||||||
"integrity": "sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==",
|
"integrity": "sha512-f7+FPy75vN91QGWsITueq0gedwUZy1fLtHOCMeQpjs8jTekAHeKP80zfDEnhrleviLHzVSDXIWuCIOFn3D3f8A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vitest/utils": "4.1.0",
|
"@vitest/utils": "4.1.1",
|
||||||
"pathe": "^2.0.3"
|
"pathe": "^2.0.3"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
@@ -4036,14 +4056,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/snapshot": {
|
"node_modules/@vitest/snapshot": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.1.tgz",
|
||||||
"integrity": "sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==",
|
"integrity": "sha512-kMVSgcegWV2FibXEx9p9WIKgje58lcTbXgnJixfcg15iK8nzCXhmalL0ZLtTWLW9PH1+1NEDShiFFedB3tEgWg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vitest/pretty-format": "4.1.0",
|
"@vitest/pretty-format": "4.1.1",
|
||||||
"@vitest/utils": "4.1.0",
|
"@vitest/utils": "4.1.1",
|
||||||
"magic-string": "^0.30.21",
|
"magic-string": "^0.30.21",
|
||||||
"pathe": "^2.0.3"
|
"pathe": "^2.0.3"
|
||||||
},
|
},
|
||||||
@@ -4052,9 +4072,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/spy": {
|
"node_modules/@vitest/spy": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.1.tgz",
|
||||||
"integrity": "sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==",
|
"integrity": "sha512-6Ti/KT5OVaiupdIZEuZN7l3CZcR0cxnxt70Z0//3CtwgObwA6jZhmVBA3yrXSVN3gmwjgd7oDNLlsXz526gpRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
@@ -4062,13 +4082,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vitest/utils": {
|
"node_modules/@vitest/utils": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.1.tgz",
|
||||||
"integrity": "sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==",
|
"integrity": "sha512-cNxAlaB3sHoCdL6pj6yyUXv9Gry1NHNg0kFTXdvSIZXLHsqKH7chiWOkwJ5s5+d/oMwcoG9T0bKU38JZWKusrQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vitest/pretty-format": "4.1.0",
|
"@vitest/pretty-format": "4.1.1",
|
||||||
"convert-source-map": "^2.0.0",
|
"convert-source-map": "^2.0.0",
|
||||||
"tinyrainbow": "^3.0.3"
|
"tinyrainbow": "^3.0.3"
|
||||||
},
|
},
|
||||||
@@ -6588,9 +6608,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fast-xml-parser": {
|
"node_modules/fast-xml-parser": {
|
||||||
"version": "5.5.8",
|
"version": "5.5.9",
|
||||||
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz",
|
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz",
|
||||||
"integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==",
|
"integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@@ -6601,7 +6621,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-xml-builder": "^1.1.4",
|
"fast-xml-builder": "^1.1.4",
|
||||||
"path-expression-matcher": "^1.2.0",
|
"path-expression-matcher": "^1.2.0",
|
||||||
"strnum": "^2.2.0"
|
"strnum": "^2.2.2"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"fxparser": "src/cli/cli.js"
|
"fxparser": "src/cli/cli.js"
|
||||||
@@ -7328,9 +7348,9 @@
|
|||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/graphql": {
|
"node_modules/graphql": {
|
||||||
"version": "16.13.1",
|
"version": "16.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz",
|
||||||
"integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==",
|
"integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
|
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
|
||||||
@@ -10945,9 +10965,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/strnum": {
|
"node_modules/strnum": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz",
|
||||||
"integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==",
|
"integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "github",
|
"type": "github",
|
||||||
@@ -11237,9 +11257,9 @@
|
|||||||
"license": "Unlicense"
|
"license": "Unlicense"
|
||||||
},
|
},
|
||||||
"node_modules/twilio": {
|
"node_modules/twilio": {
|
||||||
"version": "5.13.0",
|
"version": "5.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/twilio/-/twilio-5.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/twilio/-/twilio-5.13.1.tgz",
|
||||||
"integrity": "sha512-gg32vK+NGejPK7Txrnwp2lGmpihSfc+YW//WsoS+KiTtiEUe4jjRSK5v89dPhene2OHmnQNi+9SM6bVI47iA/g==",
|
"integrity": "sha512-sT+PkhptF4Mf7t8eXFFvPQx4w5VHnBIPXbltGPMFRe+R2GxfRdMuFbuNA/cEm0aQR6LFQOn33+fhClg+TjRVqQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.13.5",
|
"axios": "^1.13.5",
|
||||||
@@ -11600,19 +11620,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vitest": {
|
"node_modules/vitest": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.1.tgz",
|
||||||
"integrity": "sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==",
|
"integrity": "sha512-yF+o4POL41rpAzj5KVILUxm1GCjKnELvaqmU9TLLUbMfDzuN0UpUR9uaDs+mCtjPe+uYPksXDRLQGGPvj1cTmA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vitest/expect": "4.1.0",
|
"@vitest/expect": "4.1.1",
|
||||||
"@vitest/mocker": "4.1.0",
|
"@vitest/mocker": "4.1.1",
|
||||||
"@vitest/pretty-format": "4.1.0",
|
"@vitest/pretty-format": "4.1.1",
|
||||||
"@vitest/runner": "4.1.0",
|
"@vitest/runner": "4.1.1",
|
||||||
"@vitest/snapshot": "4.1.0",
|
"@vitest/snapshot": "4.1.1",
|
||||||
"@vitest/spy": "4.1.0",
|
"@vitest/spy": "4.1.1",
|
||||||
"@vitest/utils": "4.1.0",
|
"@vitest/utils": "4.1.1",
|
||||||
"es-module-lexer": "^2.0.0",
|
"es-module-lexer": "^2.0.0",
|
||||||
"expect-type": "^1.3.0",
|
"expect-type": "^1.3.0",
|
||||||
"magic-string": "^0.30.21",
|
"magic-string": "^0.30.21",
|
||||||
@@ -11624,7 +11644,7 @@
|
|||||||
"tinyexec": "^1.0.2",
|
"tinyexec": "^1.0.2",
|
||||||
"tinyglobby": "^0.2.15",
|
"tinyglobby": "^0.2.15",
|
||||||
"tinyrainbow": "^3.0.3",
|
"tinyrainbow": "^3.0.3",
|
||||||
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0",
|
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
|
||||||
"why-is-node-running": "^2.3.0"
|
"why-is-node-running": "^2.3.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -11640,13 +11660,13 @@
|
|||||||
"@edge-runtime/vm": "*",
|
"@edge-runtime/vm": "*",
|
||||||
"@opentelemetry/api": "^1.9.0",
|
"@opentelemetry/api": "^1.9.0",
|
||||||
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
|
"@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
|
||||||
"@vitest/browser-playwright": "4.1.0",
|
"@vitest/browser-playwright": "4.1.1",
|
||||||
"@vitest/browser-preview": "4.1.0",
|
"@vitest/browser-preview": "4.1.1",
|
||||||
"@vitest/browser-webdriverio": "4.1.0",
|
"@vitest/browser-webdriverio": "4.1.1",
|
||||||
"@vitest/ui": "4.1.0",
|
"@vitest/ui": "4.1.1",
|
||||||
"happy-dom": "*",
|
"happy-dom": "*",
|
||||||
"jsdom": "*",
|
"jsdom": "*",
|
||||||
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0-0"
|
"vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||||
},
|
},
|
||||||
"peerDependenciesMeta": {
|
"peerDependenciesMeta": {
|
||||||
"@edge-runtime/vm": {
|
"@edge-runtime/vm": {
|
||||||
|
|||||||
28
package.json
28
package.json
@@ -18,16 +18,16 @@
|
|||||||
"job-totals-fixtures:local": "docker exec node-app /usr/bin/node /app/download-job-totals-fixtures.js"
|
"job-totals-fixtures:local": "docker exec node-app /usr/bin/node /app/download-job-totals-fixtures.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-cloudwatch-logs": "^3.1014.0",
|
"@aws-sdk/client-cloudwatch-logs": "^3.1016.0",
|
||||||
"@aws-sdk/client-elasticache": "^3.1014.0",
|
"@aws-sdk/client-elasticache": "^3.1016.0",
|
||||||
"@aws-sdk/client-s3": "^3.1014.0",
|
"@aws-sdk/client-s3": "^3.1016.0",
|
||||||
"@aws-sdk/client-secrets-manager": "^3.1014.0",
|
"@aws-sdk/client-secrets-manager": "^3.1016.0",
|
||||||
"@aws-sdk/client-ses": "^3.1014.0",
|
"@aws-sdk/client-ses": "^3.1016.0",
|
||||||
"@aws-sdk/client-sqs": "^3.1014.0",
|
"@aws-sdk/client-sqs": "^3.1016.0",
|
||||||
"@aws-sdk/client-textract": "^3.1014.0",
|
"@aws-sdk/client-textract": "^3.1016.0",
|
||||||
"@aws-sdk/credential-provider-node": "^3.972.24",
|
"@aws-sdk/credential-provider-node": "^3.972.25",
|
||||||
"@aws-sdk/lib-storage": "^3.1014.0",
|
"@aws-sdk/lib-storage": "^3.1016.0",
|
||||||
"@aws-sdk/s3-request-presigner": "^3.1014.0",
|
"@aws-sdk/s3-request-presigner": "^3.1016.0",
|
||||||
"@opensearch-project/opensearch": "^2.13.0",
|
"@opensearch-project/opensearch": "^2.13.0",
|
||||||
"@socket.io/admin-ui": "^0.5.1",
|
"@socket.io/admin-ui": "^0.5.1",
|
||||||
"@socket.io/redis-adapter": "^8.3.0",
|
"@socket.io/redis-adapter": "^8.3.0",
|
||||||
@@ -46,10 +46,10 @@
|
|||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^17.3.1",
|
"dotenv": "^17.3.1",
|
||||||
"express": "^4.21.1",
|
"express": "^4.21.1",
|
||||||
"fast-xml-parser": "^5.5.8",
|
"fast-xml-parser": "^5.5.9",
|
||||||
"firebase-admin": "^13.7.0",
|
"firebase-admin": "^13.7.0",
|
||||||
"fuse.js": "^7.1.0",
|
"fuse.js": "^7.1.0",
|
||||||
"graphql": "^16.13.1",
|
"graphql": "^16.13.2",
|
||||||
"graphql-request": "^6.1.0",
|
"graphql-request": "^6.1.0",
|
||||||
"intuit-oauth": "^4.2.2",
|
"intuit-oauth": "^4.2.2",
|
||||||
"ioredis": "^5.10.1",
|
"ioredis": "^5.10.1",
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
"socket.io": "^4.8.3",
|
"socket.io": "^4.8.3",
|
||||||
"socket.io-adapter": "^2.5.6",
|
"socket.io-adapter": "^2.5.6",
|
||||||
"ssh2-sftp-client": "^11.0.0",
|
"ssh2-sftp-client": "^11.0.0",
|
||||||
"twilio": "^5.13.0",
|
"twilio": "^5.13.1",
|
||||||
"uuid": "^11.1.0",
|
"uuid": "^11.1.0",
|
||||||
"winston": "^3.19.0",
|
"winston": "^3.19.0",
|
||||||
"winston-cloudwatch": "^6.3.0",
|
"winston-cloudwatch": "^6.3.0",
|
||||||
@@ -91,6 +91,6 @@
|
|||||||
"p-limit": "^3.1.0",
|
"p-limit": "^3.1.0",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"supertest": "^7.2.2",
|
"supertest": "^7.2.2",
|
||||||
"vitest": "^4.1.0"
|
"vitest": "^4.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user