adjusted tabs and menu links
This commit is contained in:
36345
client/package-lock.json
generated
Normal file
36345
client/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -104,7 +104,9 @@ function Header({
|
|||||||
//theme="light"
|
//theme="light"
|
||||||
theme={"dark"}
|
theme={"dark"}
|
||||||
selectedKeys={[selectedHeader]}
|
selectedKeys={[selectedHeader]}
|
||||||
onClick={handleMenuClick}
|
onClick={(e) => {
|
||||||
|
handleMenuClick(e);
|
||||||
|
}}
|
||||||
subMenuCloseDelay={0.3}
|
subMenuCloseDelay={0.3}
|
||||||
items={[
|
items={[
|
||||||
{
|
{
|
||||||
@@ -527,7 +529,7 @@ function Header({
|
|||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
></Menu>
|
/>
|
||||||
</Layout.Header>
|
</Layout.Header>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,18 +11,18 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
|
|
||||||
export function HeaderContainer({ setUserLanguage }) {
|
export function HeaderContainer({ setUserLanguage }) {
|
||||||
const handleMenuClick = (e) => {
|
const handleMenuClick = (e) => {
|
||||||
if (e.item.props.actiontype === "lang-select") {
|
console.log("Language Switching is currently disabled.");
|
||||||
i18next.changeLanguage(e.key, (err, t) => {
|
// TODO Enable language switching
|
||||||
if (err) {
|
// if (e.item.props.actiontype === "lang-select") {
|
||||||
logImEXEvent("language_change_error", { error: err });
|
// i18next.changeLanguage(e.key, (err, t) => {
|
||||||
|
// if (err) {
|
||||||
return console.log("Error encountered when changing languages.", err);
|
// logImEXEvent("language_change_error", { error: err });
|
||||||
}
|
// return console.log("Error encountered when changing languages.", err);
|
||||||
logImEXEvent("language_change", { language: e.key });
|
// }
|
||||||
|
// logImEXEvent("language_change", { language: e.key });
|
||||||
setUserLanguage(e.key);
|
// setUserLanguage(e.key);
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
};
|
};
|
||||||
|
|
||||||
return <HeaderComponent handleMenuClick={handleMenuClick} />;
|
return <HeaderComponent handleMenuClick={handleMenuClick} />;
|
||||||
|
|||||||
@@ -241,7 +241,12 @@ export function JobsConvertButton({
|
|||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
<Button type="danger" onClick={() => form.submit()} loading={loading}>
|
<Button
|
||||||
|
type="primary"
|
||||||
|
onClick={() => form.submit()}
|
||||||
|
loading={loading}
|
||||||
|
danger
|
||||||
|
>
|
||||||
{t("jobs.actions.convert")}
|
{t("jobs.actions.convert")}
|
||||||
</Button>
|
</Button>
|
||||||
<Button onClick={() => setVisible(false)}>
|
<Button onClick={() => setVisible(false)}>
|
||||||
@@ -258,7 +263,8 @@ export function JobsConvertButton({
|
|||||||
<Popover open={visible} content={popMenu}>
|
<Popover open={visible} content={popMenu}>
|
||||||
<Button
|
<Button
|
||||||
key="convert"
|
key="convert"
|
||||||
type="danger"
|
type="primary"
|
||||||
|
danger
|
||||||
// style={{ display: job.converted ? "none" : "" }}
|
// style={{ display: job.converted ? "none" : "" }}
|
||||||
disabled={job.converted || jobRO}
|
disabled={job.converted || jobRO}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
|
|||||||
@@ -75,9 +75,10 @@ function OwnerDetailFormContainer({ owner, refetch }) {
|
|||||||
title={t("owners.labels.deleteconfirm")}
|
title={t("owners.labels.deleteconfirm")}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
type="danger"
|
type="primary"
|
||||||
loading={loading}
|
loading={loading}
|
||||||
disabled={owner.jobs.length !== 0}
|
disabled={owner.jobs.length !== 0}
|
||||||
|
danger
|
||||||
>
|
>
|
||||||
{t("general.actions.delete")}
|
{t("general.actions.delete")}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { Button, Form, Input, Space } from "antd";
|
import { Button, Form, Input, Space } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -65,10 +65,11 @@ export function PhonebookFormComponent({
|
|||||||
{t("general.actions.save")}
|
{t("general.actions.save")}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="danger"
|
type="primary"
|
||||||
disabled={hasNoAccess}
|
disabled={hasNoAccess}
|
||||||
onClick={handleDelete}
|
onClick={handleDelete}
|
||||||
loading={formLoading}
|
loading={formLoading}
|
||||||
|
danger
|
||||||
>
|
>
|
||||||
{t("general.actions.delete")}
|
{t("general.actions.delete")}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -76,7 +76,12 @@ export function ProductionListSaveConfigButton({
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
<Button type="danger" onClick={() => form.submit()} loading={loading}>
|
<Button
|
||||||
|
type="primary"
|
||||||
|
danger
|
||||||
|
onClick={() => form.submit()}
|
||||||
|
loading={loading}
|
||||||
|
>
|
||||||
{t("general.actions.save")}
|
{t("general.actions.save")}
|
||||||
</Button>
|
</Button>
|
||||||
<Button onClick={() => setVisible(false)}>
|
<Button onClick={() => setVisible(false)}>
|
||||||
|
|||||||
@@ -43,47 +43,62 @@ export function ShopInfoComponent({ bodyshop, form, saveLoading }) {
|
|||||||
</Button>
|
</Button>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<Tabs>
|
<Tabs
|
||||||
<Tabs.TabPane key="general" tab={t("bodyshop.labels.shopinfo")}>
|
items={[
|
||||||
<ShopInfoGeneral form={form} />
|
{
|
||||||
</Tabs.TabPane>
|
key: "general",
|
||||||
<Tabs.TabPane key="speedprint" tab={t("bodyshop.labels.speedprint")}>
|
children: <ShopInfoGeneral form={form} />,
|
||||||
<ShopInfoSpeedPrint form={form} />
|
label: <span>{t("bodyshop.labels.shopinfo")}</span>,
|
||||||
</Tabs.TabPane>
|
},
|
||||||
<Tabs.TabPane key="rbac" tab={t("bodyshop.labels.rbac")}>
|
{
|
||||||
<ShopInfoRbacComponent form={form} />
|
key: "speedprint",
|
||||||
</Tabs.TabPane>
|
children: <ShopInfoSpeedPrint form={form} />,
|
||||||
<Tabs.TabPane key="roStatus" tab={t("bodyshop.labels.jobstatuses")}>
|
label: <span>{t("bodyshop.labels.speedprint")}</span>,
|
||||||
<ShopInfoROStatusComponent form={form} />
|
},
|
||||||
</Tabs.TabPane>
|
{
|
||||||
<Tabs.TabPane key="scheduling" tab={t("bodyshop.labels.scheduling")}>
|
key: "rbac",
|
||||||
<ShopInfoSchedulingComponent form={form} />
|
children: <ShopInfoRbacComponent form={form} />,
|
||||||
</Tabs.TabPane>
|
label: <span>{t("bodyshop.labels.rbac")}</span>,
|
||||||
<Tabs.TabPane
|
},
|
||||||
key="orderStatus"
|
{
|
||||||
tab={t("bodyshop.labels.orderstatuses")}
|
key: "roStatus",
|
||||||
>
|
children: <ShopInfoROStatusComponent form={form} />,
|
||||||
<ShopInfoOrderStatusComponent form={form} />
|
label: <span>{t("bodyshop.labels.jobstatuses")}</span>,
|
||||||
</Tabs.TabPane>
|
},
|
||||||
<Tabs.TabPane
|
{
|
||||||
key="responsibilityCenters"
|
key: "scheduling",
|
||||||
tab={t("bodyshop.labels.responsibilitycenters.title")}
|
children: <ShopInfoSchedulingComponent form={form} />,
|
||||||
>
|
label: <span>{t("bodyshop.labels.scheduling")}</span>,
|
||||||
<ShopInfoResponsibilityCenterComponent form={form} />
|
},
|
||||||
</Tabs.TabPane>
|
{
|
||||||
|
key: "orderStatus",
|
||||||
<Tabs.TabPane key="checklists" tab={t("bodyshop.labels.checklists")}>
|
children: <ShopInfoOrderStatusComponent form={form} />,
|
||||||
<ShopInfoIntakeChecklistComponent form={form} />
|
label: <span>{t("bodyshop.labels.orderstatuses")}</span>,
|
||||||
</Tabs.TabPane>
|
},
|
||||||
<Tabs.TabPane key="laborrates" tab={t("bodyshop.labels.laborrates")}>
|
{
|
||||||
<ShopInfoLaborRates form={form} />
|
key: "responsibilityCenters",
|
||||||
</Tabs.TabPane>
|
children: <ShopInfoResponsibilityCenterComponent form={form} />,
|
||||||
{CriticalPartsScanning.treatment === "on" && (
|
label: (
|
||||||
<Tabs.TabPane key="partsscan" tab={t("bodyshop.labels.partsscan")}>
|
<span>{t("bodyshop.labels.responsibilitycenters.title")}</span>
|
||||||
<ShopInfoPartsScan form={form} />
|
),
|
||||||
</Tabs.TabPane>
|
},
|
||||||
)}
|
{
|
||||||
</Tabs>
|
key: "checklists",
|
||||||
|
children: <ShopInfoIntakeChecklistComponent form={form} />,
|
||||||
|
label: <span>{t("bodyshop.labels.checklists")}</span>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "laborrates",
|
||||||
|
children: <ShopInfoLaborRates form={form} />,
|
||||||
|
label: <span>{t("bodyshop.labels.laborrates")}</span>,
|
||||||
|
},
|
||||||
|
CriticalPartsScanning.treatment === "on" && {
|
||||||
|
key: "partsscan",
|
||||||
|
children: <ShopInfoPartsScan form={form} />,
|
||||||
|
label: <span>{t("bodyshop.labels.partsscan")}</span>,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,8 @@ function VehicleDetailFormContainer({ vehicle, refetch }) {
|
|||||||
title={t("vehicles.labels.deleteconfirm")}
|
title={t("vehicles.labels.deleteconfirm")}
|
||||||
>
|
>
|
||||||
<Button
|
<Button
|
||||||
type="danger"
|
type="primary"
|
||||||
|
danger
|
||||||
loading={loading}
|
loading={loading}
|
||||||
disabled={vehicle.jobs.length !== 0}
|
disabled={vehicle.jobs.length !== 0}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled } from "@ant-design/icons";
|
||||||
import { useApolloClient } from "@apollo/client";
|
import { useApolloClient } from "@apollo/client";
|
||||||
import { useTreatments } from "@splitsoftware/splitio-react";
|
import { useTreatments } from "@splitsoftware/splitio-react";
|
||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { Button, Divider, Form, Input, InputNumber, Space, Switch } from "antd";
|
import { Button, Divider, Form, Input, InputNumber, Space, Switch } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -69,7 +69,8 @@ export function VendorsFormComponent({
|
|||||||
{t("general.actions.save")}
|
{t("general.actions.save")}
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="danger"
|
type="primary"
|
||||||
|
danger
|
||||||
disabled={selectedvendor === "new"}
|
disabled={selectedvendor === "new"}
|
||||||
onClick={handleDelete}
|
onClick={handleDelete}
|
||||||
loading={formLoading}
|
loading={formLoading}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DeleteFilled } from "@ant-design/icons";
|
import { DeleteFilled } from "@ant-design/icons";
|
||||||
import { useApolloClient, useMutation } from "@apollo/client";
|
import { useApolloClient, useMutation } from "@apollo/client";
|
||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import {
|
import {
|
||||||
Alert,
|
Alert,
|
||||||
Button,
|
Button,
|
||||||
@@ -164,7 +164,12 @@ export function JobsCloseComponent({ job, bodyshop, jobRO }) {
|
|||||||
cancelText={t("general.labels.no")}
|
cancelText={t("general.labels.no")}
|
||||||
title={t("jobs.labels.closeconfirm")}
|
title={t("jobs.labels.closeconfirm")}
|
||||||
>
|
>
|
||||||
<Button loading={loading} type="danger" disabled={jobRO}>
|
<Button
|
||||||
|
loading={loading}
|
||||||
|
type="primary"
|
||||||
|
danger
|
||||||
|
disabled={jobRO}
|
||||||
|
>
|
||||||
{t("general.actions.close")}
|
{t("general.actions.close")}
|
||||||
</Button>
|
</Button>
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import Icon, {
|
|||||||
HistoryOutlined,
|
HistoryOutlined,
|
||||||
SyncOutlined,
|
SyncOutlined,
|
||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from "@ant-design/pro-layout";
|
||||||
import { Button, Divider, Form, notification, Space, Tabs } from "antd";
|
import { Button, Divider, Form, notification, Space, Tabs } from "antd";
|
||||||
import Axios from "axios";
|
import Axios from "axios";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
@@ -90,7 +90,11 @@ export function JobsDetailPage({
|
|||||||
variables: {
|
variables: {
|
||||||
jobId: job.id,
|
jobId: job.id,
|
||||||
job: {
|
job: {
|
||||||
...UndefinedToNull(values, ["alt_transport", "category", "referral_source"]),
|
...UndefinedToNull(values, [
|
||||||
|
"alt_transport",
|
||||||
|
"category",
|
||||||
|
"referral_source",
|
||||||
|
]),
|
||||||
parts_tax_rates: {
|
parts_tax_rates: {
|
||||||
...job.parts_tax_rates,
|
...job.parts_tax_rates,
|
||||||
...values.parts_tax_rates,
|
...values.parts_tax_rates,
|
||||||
@@ -240,135 +244,126 @@ export function JobsDetailPage({
|
|||||||
<JobsDetailHeader job={job} />
|
<JobsDetailHeader job={job} />
|
||||||
<Divider type="horizontal" />
|
<Divider type="horizontal" />
|
||||||
<FormFieldsChanged form={form} />
|
<FormFieldsChanged form={form} />
|
||||||
|
|
||||||
<Tabs
|
<Tabs
|
||||||
defaultActiveKey={search.tab}
|
defaultActiveKey={search.tab}
|
||||||
onChange={(key) => history.push({ search: `?tab=${key}` })}
|
onChange={(key) => history.push({ search: `?tab=${key}` })}
|
||||||
tabBarStyle={{ fontWeight: "bold", borderBottom: "10px" }}
|
tabBarStyle={{ fontWeight: "bold", borderBottom: "10px" }}
|
||||||
>
|
items={[
|
||||||
<Tabs.TabPane
|
{
|
||||||
forceRender
|
key: "general",
|
||||||
tab={
|
children: <JobsDetailGeneral job={job} form={form} />,
|
||||||
<span>
|
label: (
|
||||||
<Icon component={FaShieldAlt} />
|
<span>
|
||||||
{t("menus.jobsdetail.general")}
|
<Icon component={FaShieldAlt} />
|
||||||
</span>
|
{t("menus.jobsdetail.general")}
|
||||||
}
|
</span>
|
||||||
key="general"
|
),
|
||||||
>
|
},
|
||||||
<JobsDetailGeneral job={job} form={form} />
|
{
|
||||||
</Tabs.TabPane>
|
key: "repairdata",
|
||||||
<Tabs.TabPane
|
children: (
|
||||||
forceRender
|
<JobsLinesContainer
|
||||||
tab={
|
job={job}
|
||||||
<span>
|
joblines={job.joblines}
|
||||||
<BarsOutlined />
|
refetch={refetch}
|
||||||
{t("menus.jobsdetail.repairdata")}
|
form={form}
|
||||||
</span>
|
/>
|
||||||
}
|
),
|
||||||
key="repairdata"
|
label: (
|
||||||
>
|
<span>
|
||||||
<JobsLinesContainer
|
<BarsOutlined />
|
||||||
job={job}
|
{t("menus.jobsdetail.repairdata")}
|
||||||
joblines={job.joblines}
|
</span>
|
||||||
refetch={refetch}
|
),
|
||||||
form={form}
|
},
|
||||||
/>
|
{
|
||||||
</Tabs.TabPane>
|
key: "rates",
|
||||||
<Tabs.TabPane
|
children: <JobsDetailRates job={job} form={form} />,
|
||||||
forceRender
|
label: (
|
||||||
tab={
|
<span>
|
||||||
<span>
|
<DollarCircleOutlined />
|
||||||
<DollarCircleOutlined />
|
{t("menus.jobsdetail.rates")}
|
||||||
{t("menus.jobsdetail.rates")}
|
</span>
|
||||||
</span>
|
),
|
||||||
}
|
},
|
||||||
key="rates"
|
{
|
||||||
>
|
key: "totals",
|
||||||
<JobsDetailRates job={job} form={form} />
|
children: <JobsDetailTotals job={job} refetch={refetch} />,
|
||||||
</Tabs.TabPane>
|
label: (
|
||||||
<Tabs.TabPane
|
<span>
|
||||||
tab={
|
<DollarCircleOutlined />
|
||||||
<span>
|
{t("menus.jobsdetail.totals")}
|
||||||
<DollarCircleOutlined />
|
</span>
|
||||||
{t("menus.jobsdetail.totals")}
|
),
|
||||||
</span>
|
},
|
||||||
}
|
{
|
||||||
key="totals"
|
key: "partssublet",
|
||||||
>
|
children: <JobsDetailPliContainer job={job} />,
|
||||||
<JobsDetailTotals job={job} refetch={refetch} />
|
label: (
|
||||||
</Tabs.TabPane>
|
<span>
|
||||||
<Tabs.TabPane
|
<ToolFilled />
|
||||||
tab={
|
{t("menus.jobsdetail.partssublet")}
|
||||||
<span>
|
</span>
|
||||||
<ToolFilled />
|
),
|
||||||
{t("menus.jobsdetail.partssublet")}
|
},
|
||||||
</span>
|
{
|
||||||
}
|
key: "labor",
|
||||||
key="partssublet"
|
children: <JobsDetailLaborContainer job={job} jobId={job.id} />,
|
||||||
>
|
label: (
|
||||||
<JobsDetailPliContainer job={job} />
|
<span>
|
||||||
</Tabs.TabPane>
|
<Icon component={FaHardHat} />
|
||||||
<Tabs.TabPane
|
{t("menus.jobsdetail.labor")}
|
||||||
tab={
|
</span>
|
||||||
<span>
|
),
|
||||||
<Icon component={FaHardHat} />
|
},
|
||||||
{t("menus.jobsdetail.labor")}
|
{
|
||||||
</span>
|
key: "dates",
|
||||||
}
|
children: <JobsDetailDatesComponent job={job} />,
|
||||||
key="labor"
|
label: (
|
||||||
>
|
<span>
|
||||||
<JobsDetailLaborContainer job={job} jobId={job.id} />
|
<CalendarFilled />
|
||||||
</Tabs.TabPane>
|
{t("menus.jobsdetail.dates")}
|
||||||
<Tabs.TabPane
|
</span>
|
||||||
forceRender
|
),
|
||||||
tab={
|
},
|
||||||
<span>
|
{
|
||||||
<CalendarFilled />
|
key: "documents",
|
||||||
{t("menus.jobsdetail.dates")}
|
children: bodyshop.uselocalmediaserver ? (
|
||||||
</span>
|
<JobsDocumentsLocalGallery job={job} />
|
||||||
}
|
) : (
|
||||||
key="dates"
|
<JobsDocumentsGalleryContainer jobId={job.id} />
|
||||||
>
|
),
|
||||||
<JobsDetailDatesComponent job={job} />
|
|
||||||
</Tabs.TabPane>
|
label: (
|
||||||
<Tabs.TabPane
|
<span>
|
||||||
tab={
|
<FileImageFilled />
|
||||||
<span>
|
{t("jobs.labels.documents")}
|
||||||
<FileImageFilled />
|
</span>
|
||||||
{t("jobs.labels.documents")}
|
),
|
||||||
</span>
|
},
|
||||||
}
|
{
|
||||||
key="documents"
|
key: "notes",
|
||||||
>
|
children: <JobNotesContainer jobId={job.id} />,
|
||||||
{bodyshop.uselocalmediaserver ? (
|
label: (
|
||||||
<JobsDocumentsLocalGallery job={job} />
|
<span>
|
||||||
) : (
|
<Icon component={FaRegStickyNote} />
|
||||||
<JobsDocumentsGalleryContainer jobId={job.id} />
|
{t("jobs.labels.notes")}
|
||||||
)}
|
</span>
|
||||||
</Tabs.TabPane>
|
),
|
||||||
<Tabs.TabPane
|
},
|
||||||
tab={
|
{
|
||||||
<span>
|
key: "audit",
|
||||||
<Icon component={FaRegStickyNote} />
|
children: <JobAuditTrail jobId={job.id} />,
|
||||||
{t("jobs.labels.notes")}
|
label: (
|
||||||
</span>
|
<span>
|
||||||
}
|
<HistoryOutlined />
|
||||||
key="notes"
|
{t("jobs.labels.audit")}
|
||||||
>
|
</span>
|
||||||
<JobNotesContainer jobId={job.id} />
|
),
|
||||||
</Tabs.TabPane>
|
},
|
||||||
<Tabs.TabPane
|
]}
|
||||||
tab={
|
/>
|
||||||
<span>
|
|
||||||
<HistoryOutlined />
|
|
||||||
{t("jobs.labels.audit")}
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
key="audit"
|
|
||||||
>
|
|
||||||
<JobAuditTrail jobId={job.id} />
|
|
||||||
</Tabs.TabPane>
|
|
||||||
</Tabs>
|
|
||||||
</Form>
|
</Form>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -37,20 +37,30 @@ export function ShopPage({ bodyshop, setSelectedHeader, setBreadcrumbs }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<RbacWrapper action="shop:config">
|
<RbacWrapper action="shop:config">
|
||||||
<Tabs>
|
<Tabs
|
||||||
<Tabs.TabPane tab={t("bodyshop.labels.shopinfo")} key="info">
|
items={[
|
||||||
<ShopInfoContainer />
|
{
|
||||||
</Tabs.TabPane>
|
key: "info",
|
||||||
<Tabs.TabPane tab={t("bodyshop.labels.employees")} key="employees">
|
children: <ShopInfoContainer />,
|
||||||
<ShopEmployeesContainer />
|
label: <span>{t("bodyshop.labels.shopinfo")}</span>,
|
||||||
</Tabs.TabPane>
|
},
|
||||||
<Tabs.TabPane tab={t("bodyshop.labels.licensing")} key="licensing">
|
{
|
||||||
<ShopInfoUsersComponent />
|
key: "employees",
|
||||||
</Tabs.TabPane>
|
children: <ShopEmployeesContainer />,
|
||||||
<Tabs.TabPane tab={t("bodyshop.labels.csiq")} key="csiq">
|
label: <span>{t("bodyshop.labels.employees")}</span>,
|
||||||
<ShopCsiConfig />
|
},
|
||||||
</Tabs.TabPane>
|
{
|
||||||
</Tabs>
|
key: "licensing",
|
||||||
|
children: <ShopInfoUsersComponent />,
|
||||||
|
label: <span>{t("bodyshop.labels.licensing")}</span>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "csiq",
|
||||||
|
children: <ShopCsiConfig />,
|
||||||
|
label: <span>{t("bodyshop.labels.csiq")}</span>,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
18084
client/yarn.lock
18084
client/yarn.lock
File diff suppressed because it is too large
Load Diff
11667
package-lock.json
generated
11667
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user