adjusted tabs and menu links

This commit is contained in:
swtmply
2023-03-22 23:20:27 +08:00
parent a9c2502f33
commit 4e90534e69
16 changed files with 60621 additions and 12343 deletions

36345
client/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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>
); );
} }

View File

@@ -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} />;

View File

@@ -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}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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)}>

View File

@@ -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>
); );
} }

View File

@@ -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}
> >

View File

@@ -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}

View File

@@ -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>

View File

@@ -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>
); );

View File

@@ -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>
); );
} }

File diff suppressed because it is too large Load Diff

11667
package-lock.json generated

File diff suppressed because it is too large Load Diff

6412
yarn.lock

File diff suppressed because it is too large Load Diff