Merge branch 'release/2021-09-10' into feature/cdk-cert
This commit is contained in:
@@ -24800,6 +24800,27 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>relatedros</name>
|
||||
<definition_loaded>false</definition_loaded>
|
||||
<description></description>
|
||||
<comment></comment>
|
||||
<default_text></default_text>
|
||||
<translations>
|
||||
<translation>
|
||||
<language>en-US</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>es-MX</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
<translation>
|
||||
<language>fr-CA</language>
|
||||
<approved>false</approved>
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>returntotals</name>
|
||||
<definition_loaded>false</definition_loaded>
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
"@craco/craco": "^6.2.0",
|
||||
"@fingerprintjs/fingerprintjs": "^3.3.0",
|
||||
"@lourenci/react-kanban": "^2.1.0",
|
||||
"@openreplay/tracker": "^3.2.5",
|
||||
"@openreplay/tracker-assist": "^3.0.4",
|
||||
"@openreplay/tracker": "^3.3.1",
|
||||
"@openreplay/tracker-assist": "^3.1.1",
|
||||
"@openreplay/tracker-graphql": "^3.0.0",
|
||||
"@openreplay/tracker-redux": "^3.0.0",
|
||||
"@sentry/react": "^6.11.0",
|
||||
@@ -19,7 +19,7 @@
|
||||
"@tanem/react-nprogress": "^3.0.79",
|
||||
"antd": "^4.16.13",
|
||||
"apollo-link-logger": "^2.0.0",
|
||||
"axios": "^0.21.1",
|
||||
"axios": "^0.21.4",
|
||||
"craco-less": "^1.20.0",
|
||||
"dinero.js": "^1.9.0",
|
||||
"dotenv": "^10.0.0",
|
||||
@@ -27,12 +27,12 @@
|
||||
"env-cmd": "^10.1.0",
|
||||
"exifr": "^7.1.3",
|
||||
"firebase": "^9.0.0",
|
||||
"graphql": "^15.5.2",
|
||||
"graphql": "^15.5.3",
|
||||
"i18next": "^20.4.0",
|
||||
"i18next-browser-languagedetector": "^6.1.2",
|
||||
"jsoneditor": "^9.5.4",
|
||||
"jsreport-browser-client-dist": "^1.3.0",
|
||||
"libphonenumber-js": "^1.9.25",
|
||||
"libphonenumber-js": "^1.9.26",
|
||||
"logrocket": "^2.0.0",
|
||||
"markerjs2": "^2.11.2",
|
||||
"moment-business-days": "^1.2.0",
|
||||
@@ -53,9 +53,9 @@
|
||||
"react-i18next": "^11.11.4",
|
||||
"react-icons": "^4.2.0",
|
||||
"react-number-format": "^4.7.3",
|
||||
"react-redux": "^7.2.4",
|
||||
"react-redux": "^7.2.5",
|
||||
"react-resizable": "^3.0.4",
|
||||
"react-router-dom": "^5.2.1",
|
||||
"react-router-dom": "^5.3.0",
|
||||
"react-scripts": "^4.0.3",
|
||||
"react-sublime-video": "^0.2.5",
|
||||
"react-virtualized": "^9.22.3",
|
||||
|
||||
@@ -115,18 +115,18 @@ export default function JobLinesUpsertModalComponent({
|
||||
<Form.Item
|
||||
label={t("joblines.fields.mod_lb_hrs")}
|
||||
name="mod_lb_hrs"
|
||||
// rules={[
|
||||
// ({ getFieldValue }) => ({
|
||||
// validator(rule, value) {
|
||||
// if (!!getFieldValue("mod_lbr_ty") === !!value) {
|
||||
// return Promise.resolve();
|
||||
// }
|
||||
// return Promise.reject(
|
||||
// t("joblines.validations.hrsrequirediflbrtyp")
|
||||
// );
|
||||
// },
|
||||
// }),
|
||||
// ]}
|
||||
rules={[
|
||||
({ getFieldValue }) => ({
|
||||
validator(rule, value) {
|
||||
if (!!getFieldValue("mod_lbr_ty") === !!value) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject(
|
||||
t("joblines.validations.hrsrequirediflbrtyp")
|
||||
);
|
||||
},
|
||||
}),
|
||||
]}
|
||||
>
|
||||
<InputNumber precision={1} />
|
||||
</Form.Item>
|
||||
@@ -169,18 +169,18 @@ export default function JobLinesUpsertModalComponent({
|
||||
<Form.Item
|
||||
label={t("joblines.fields.part_qty")}
|
||||
name="part_qty"
|
||||
// rules={[
|
||||
// ({ getFieldValue }) => ({
|
||||
// validator(rule, value) {
|
||||
// if (!!getFieldValue("part_type") === !!value) {
|
||||
// return Promise.resolve();
|
||||
// }
|
||||
// return Promise.reject(
|
||||
// t("joblines.validations.requiredifparttype")
|
||||
// );
|
||||
// },
|
||||
// }),
|
||||
// ]}
|
||||
rules={[
|
||||
({ getFieldValue }) => ({
|
||||
validator(rule, value) {
|
||||
if (!!getFieldValue("part_type") === !!value) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject(
|
||||
t("joblines.validations.requiredifparttype")
|
||||
);
|
||||
},
|
||||
}),
|
||||
]}
|
||||
>
|
||||
<InputNumber precision={0} min={0} />
|
||||
</Form.Item>
|
||||
@@ -190,28 +190,28 @@ export default function JobLinesUpsertModalComponent({
|
||||
<Form.Item
|
||||
label={t("joblines.fields.act_price")}
|
||||
name="act_price"
|
||||
// rules={[
|
||||
// ({ getFieldValue }) => ({
|
||||
// validator(rule, value) {
|
||||
// if (!value || getFieldValue("part_type") !== "PAE") {
|
||||
// return Promise.resolve();
|
||||
// }
|
||||
// return Promise.reject(
|
||||
// t("joblines.validations.zeropriceexistingpart")
|
||||
// );
|
||||
// },
|
||||
// }),
|
||||
// ({ getFieldValue }) => ({
|
||||
// validator(rule, value) {
|
||||
// if (!!getFieldValue("part_type") === !!value) {
|
||||
// return Promise.resolve();
|
||||
// }
|
||||
// return Promise.reject(
|
||||
// t("joblines.validations.requiredifparttype")
|
||||
// );
|
||||
// },
|
||||
// }),
|
||||
// ]}
|
||||
rules={[
|
||||
({ getFieldValue }) => ({
|
||||
validator(rule, value) {
|
||||
if (!value || getFieldValue("part_type") !== "PAE") {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject(
|
||||
t("joblines.validations.zeropriceexistingpart")
|
||||
);
|
||||
},
|
||||
}),
|
||||
({ getFieldValue }) => ({
|
||||
validator(rule, value) {
|
||||
if (!!getFieldValue("part_type") === !!value) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return Promise.reject(
|
||||
t("joblines.validations.requiredifparttype")
|
||||
);
|
||||
},
|
||||
}),
|
||||
]}
|
||||
>
|
||||
<InputCurrency precision={2} min={0} />
|
||||
</Form.Item>
|
||||
|
||||
@@ -98,23 +98,7 @@ export function JobsAvailableContainer({
|
||||
return;
|
||||
}
|
||||
//IO-539 Check for Parts Rate on PAL for SGI use case.
|
||||
|
||||
if (
|
||||
estData.est_data.parts_tax_rates &&
|
||||
estData.est_data.parts_tax_rates.PAL &&
|
||||
(estData.est_data.parts_tax_rates.PAL.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_rt === 0)
|
||||
) {
|
||||
console.log("checking");
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for used parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}%.`
|
||||
);
|
||||
if (res) {
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
await CheckTaxRates(estData, bodyshop);
|
||||
|
||||
const newTotals = (
|
||||
await Axios.post("/job/totals", {
|
||||
@@ -215,22 +199,7 @@ export function JobsAvailableContainer({
|
||||
});
|
||||
} else {
|
||||
//IO-539 Check for Parts Rate on PAL for SGI use case.
|
||||
if (
|
||||
estData.est_data.parts_tax_rates &&
|
||||
estData.est_data.parts_tax_rates.PAL &&
|
||||
(estData.est_data.parts_tax_rates.PAL.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_rt === 0)
|
||||
) {
|
||||
console.log("checking");
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for used parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}%.`
|
||||
);
|
||||
if (res) {
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
await CheckTaxRates(estData, bodyshop);
|
||||
|
||||
//create upsert job
|
||||
let supp = replaceEmpty({ ...estData.est_data });
|
||||
@@ -432,3 +401,98 @@ function confirmDialog(msg) {
|
||||
return confirmed ? resolve(true) : resolve(false);
|
||||
});
|
||||
}
|
||||
|
||||
async function CheckTaxRates(estData, bodyshop) {
|
||||
//LKQ Check
|
||||
if (
|
||||
!estData.est_data.parts_tax_rates?.PAL ||
|
||||
estData.est_data.parts_tax_rates?.PAL?.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates?.PAL?.prt_tax_rt === 0
|
||||
) {
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for LKQ parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.`
|
||||
);
|
||||
if (res) {
|
||||
if (!estData.est_data.parts_tax_rates.PAL) {
|
||||
estData.est_data.parts_tax_rates.PAL = {
|
||||
prt_discp: 0,
|
||||
prt_mktyp: true,
|
||||
prt_mkupp: 0,
|
||||
prt_type: "PAL",
|
||||
};
|
||||
}
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAL.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
//PAC Check
|
||||
if (
|
||||
!estData.est_data.parts_tax_rates?.PAC ||
|
||||
estData.est_data.parts_tax_rates?.PAC?.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates?.PAC?.prt_tax_rt === 0
|
||||
) {
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for rechromed parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.`
|
||||
);
|
||||
if (res) {
|
||||
if (!estData.est_data.parts_tax_rates.PAC) {
|
||||
estData.est_data.parts_tax_rates.PAC = {
|
||||
prt_discp: 0,
|
||||
prt_mktyp: true,
|
||||
prt_mkupp: 0,
|
||||
prt_type: "PAC",
|
||||
};
|
||||
}
|
||||
estData.est_data.parts_tax_rates.PAC.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAC.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
//PAM Check
|
||||
if (
|
||||
!estData.est_data.parts_tax_rates?.PAM ||
|
||||
estData.est_data.parts_tax_rates?.PAM?.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates?.PAM?.prt_tax_rt === 0
|
||||
) {
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for remanufactured parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.`
|
||||
);
|
||||
if (res) {
|
||||
if (!estData.est_data.parts_tax_rates.PAM) {
|
||||
estData.est_data.parts_tax_rates.PAM = {
|
||||
prt_discp: 0,
|
||||
prt_mktyp: true,
|
||||
prt_mkupp: 0,
|
||||
prt_type: "PAM",
|
||||
};
|
||||
}
|
||||
estData.est_data.parts_tax_rates.PAM.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAM.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
!estData.est_data.parts_tax_rates?.PAR ||
|
||||
estData.est_data.parts_tax_rates?.PAR?.prt_tax_rt === null ||
|
||||
estData.est_data.parts_tax_rates?.PAR?.prt_tax_rt === 0
|
||||
) {
|
||||
const res = await confirmDialog(
|
||||
`ImEX Online has detected that there is a missing tax rate for recored parts. Pressing OK will set the tax rate to ${bodyshop.bill_tax_rates.state_tax_rate}% and enable the rate. Pressing cancel will keep the tax rate as is.`
|
||||
);
|
||||
if (res) {
|
||||
if (!estData.est_data.parts_tax_rates.PAR) {
|
||||
estData.est_data.parts_tax_rates.PAR = {
|
||||
prt_discp: 0,
|
||||
prt_mktyp: true,
|
||||
prt_mkupp: 0,
|
||||
prt_type: "PAR",
|
||||
};
|
||||
}
|
||||
estData.est_data.parts_tax_rates.PAR.prt_tax_rt =
|
||||
bodyshop.bill_tax_rates.state_tax_rate / 100;
|
||||
estData.est_data.parts_tax_rates.PAR.prt_tax_in = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import JobAltTransportChange from "../job-at-change/job-at-change.component";
|
||||
import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container";
|
||||
import ProductionListColumnProductionNote from "../production-list-columns/production-list-columns.productionnote.component";
|
||||
import "./jobs-detail-header.styles.scss";
|
||||
import JobsRelatedRos from "../jobs-related-ros/jobs-related-ros.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
jobRO: selectJobReadOnly,
|
||||
@@ -80,6 +81,11 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) {
|
||||
<span style={{ margin: "0rem .5rem" }}>/</span>
|
||||
<CurrencyFormatter>{job.owner_owing}</CurrencyFormatter>
|
||||
</DataLabel>
|
||||
{job.converted && (
|
||||
<DataLabel label={t("jobs.labels.relatedros")}>
|
||||
<JobsRelatedRos jobid={job.id} />
|
||||
</DataLabel>
|
||||
)}
|
||||
<DataLabel label={t("jobs.fields.alt_transport")}>
|
||||
{job.alt_transport}
|
||||
<JobAltTransportChange job={job} />
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
import React, { useState } from "react";
|
||||
import { useQuery, useMutation } from "@apollo/client";
|
||||
import { Tag, Space, Button, Popover, Card, Form } from "antd";
|
||||
import {
|
||||
DELETE_RELATED_RO,
|
||||
INSERT_RELATED_ROS,
|
||||
QUERY_RELATED_ROS,
|
||||
} from "../../graphql/jobs.queries";
|
||||
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
|
||||
import AlertComponent from "../alert/alert.component";
|
||||
import { PlusCircleOutlined } from "@ant-design/icons";
|
||||
import JobSearchSelectComponent from "../job-search-select/job-search-select.component";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
export default function JobsRelatedRos({ jobid }) {
|
||||
const [roSearchVisible, setRoSearchVisible] = useState(false);
|
||||
const [saveLoading, setSaveLoading] = useState(false);
|
||||
const [insertRelationship] = useMutation(INSERT_RELATED_ROS);
|
||||
const [deleteRelationship] = useMutation(DELETE_RELATED_RO);
|
||||
const { loading, error, data } = useQuery(QUERY_RELATED_ROS, {
|
||||
variables: { jobid },
|
||||
skip: !jobid,
|
||||
});
|
||||
const { t } = useTranslation();
|
||||
if (loading) return <LoadingSpinner />;
|
||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||
|
||||
const relatedJobs = data.relatedjobs.map((r) => {
|
||||
if (r.parentjob === jobid) {
|
||||
return { relationshipid: r.id, ...r.childjob_rel };
|
||||
}
|
||||
return { relationshipid: r.id, ...r.parentjob_rel };
|
||||
});
|
||||
|
||||
const handleAddRo = async ({ relatedjobid }) => {
|
||||
setSaveLoading(true);
|
||||
|
||||
await insertRelationship({
|
||||
variables: { relationship: { parentjob: jobid, childjob: relatedjobid } },
|
||||
update(cache, { data }) {
|
||||
cache.modify({
|
||||
fields: {
|
||||
relatedjobs(rj, { readField }) {
|
||||
return [rj, data.insert_relatedjobs_one];
|
||||
},
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
setSaveLoading(false);
|
||||
setRoSearchVisible(false);
|
||||
};
|
||||
const handleDelete = async (id) => {
|
||||
setSaveLoading(true);
|
||||
|
||||
await deleteRelationship({
|
||||
variables: {
|
||||
relationshipid: id,
|
||||
},
|
||||
|
||||
update(cache, { data }) {
|
||||
cache.modify({
|
||||
fields: {
|
||||
relatedjobs(rj, { readField }) {
|
||||
return rj.filter((r) => r.id !== id);
|
||||
},
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
setSaveLoading(false);
|
||||
setRoSearchVisible(false);
|
||||
};
|
||||
|
||||
const popContent = (
|
||||
<Card style={{ minWidth: "25rem" }}>
|
||||
<Form layout="vertical" onFinish={handleAddRo}>
|
||||
<Form.Item
|
||||
name="relatedjobid"
|
||||
label={t("jobs.fields.ro_number")}
|
||||
rules={[{ required: true }]}
|
||||
>
|
||||
<JobSearchSelectComponent convertedOnly />
|
||||
</Form.Item>
|
||||
<Space>
|
||||
<Button loading={saveLoading} htmlType="submit">
|
||||
{t("general.actions.add")}
|
||||
</Button>
|
||||
<Button onClick={() => setRoSearchVisible(false)}>
|
||||
{t("general.actions.cancel")}
|
||||
</Button>
|
||||
</Space>
|
||||
</Form>
|
||||
</Card>
|
||||
);
|
||||
|
||||
return (
|
||||
<Space wrap>
|
||||
{relatedJobs.map((r) => (
|
||||
<Tag key={r.id} closable onClose={() => handleDelete(r.relationshipid)}>
|
||||
<Link to={`/manage/jobs/${r?.id}`}>{r.ro_number}</Link>
|
||||
</Tag>
|
||||
))}
|
||||
<Popover content={popContent} visible={roSearchVisible}>
|
||||
<Button type="link" onClick={() => setRoSearchVisible(true)}>
|
||||
<PlusCircleOutlined />
|
||||
</Button>
|
||||
</Popover>
|
||||
</Space>
|
||||
);
|
||||
}
|
||||
@@ -1893,3 +1893,48 @@ export const QUERY_JOB_EXPORT_DMS = gql`
|
||||
}
|
||||
}
|
||||
`;
|
||||
export const QUERY_RELATED_ROS = gql`
|
||||
query QUERY_RELATED_ROS($jobid: uuid!) {
|
||||
relatedjobs(
|
||||
where: {
|
||||
_or: [{ childjob: { _eq: $jobid } }, { parentjob: { _eq: $jobid } }]
|
||||
}
|
||||
) {
|
||||
parentjob
|
||||
id
|
||||
parentjob_rel {
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
childjob
|
||||
childjob_rel {
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
export const INSERT_RELATED_ROS = gql`
|
||||
mutation INSERT_RELATED_ROS($relationship: relatedjobs_insert_input!) {
|
||||
insert_relatedjobs_one(object: $relationship) {
|
||||
parentjob
|
||||
id
|
||||
parentjob_rel {
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
childjob
|
||||
childjob_rel {
|
||||
id
|
||||
ro_number
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
export const DELETE_RELATED_RO = gql`
|
||||
mutation DELETE_RELATED_RO($relationshipid: uuid!) {
|
||||
delete_relatedjobs_by_pk(id: $relationshipid) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -1033,7 +1033,7 @@
|
||||
"PAP": "OEM Partial",
|
||||
"PAR": "Recored",
|
||||
"PAS": "Sublet",
|
||||
"PASL": "Sublet"
|
||||
"PASL": "Sublet (L)"
|
||||
},
|
||||
"profitcenter_labor": "Profit Center: Labor",
|
||||
"profitcenter_part": "Profit Center: Part",
|
||||
@@ -1469,6 +1469,7 @@
|
||||
"removedpartsstrikethrough": "Strike through lines represent parts that have been removed from the estimate. They are included for completeness of reconciliation."
|
||||
},
|
||||
"reconciliationheader": "Parts & Sublet Reconciliation",
|
||||
"relatedros": "Related ROs",
|
||||
"returntotals": "Return Totals",
|
||||
"rosaletotal": "RO Parts Total",
|
||||
"sale_labor": "Sales - Labor",
|
||||
|
||||
@@ -1469,6 +1469,7 @@
|
||||
"removedpartsstrikethrough": ""
|
||||
},
|
||||
"reconciliationheader": "",
|
||||
"relatedros": "",
|
||||
"returntotals": "",
|
||||
"rosaletotal": "",
|
||||
"sale_labor": "",
|
||||
|
||||
@@ -1469,6 +1469,7 @@
|
||||
"removedpartsstrikethrough": ""
|
||||
},
|
||||
"reconciliationheader": "",
|
||||
"relatedros": "",
|
||||
"returntotals": "",
|
||||
"rosaletotal": "",
|
||||
"sale_labor": "",
|
||||
|
||||
@@ -2003,10 +2003,10 @@
|
||||
mkdirp "^1.0.4"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
"@openreplay/tracker-assist@^3.0.4":
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@openreplay/tracker-assist/-/tracker-assist-3.1.0.tgz#3432c8d94c26955d73fe456e6ab957f3cb24419f"
|
||||
integrity sha512-CkAbrSukwVCfGFjFlGNMDmv7DxUdIbvC9bnFxFUegTnrcZEXge7SPH7ZYpqKGZr1Elr82MvsCZzpQTSsFnJMrw==
|
||||
"@openreplay/tracker-assist@^3.1.1":
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@openreplay/tracker-assist/-/tracker-assist-3.1.1.tgz#32bbadbeb17928b368baf6956d8ee27e380ec77f"
|
||||
integrity sha512-jOei1oEio88NqyPgsE2keRIB0lYhbBxKsJdEn0mhnacZ0dvGcoThHg4pdvq9qQnX+VZciJWbskXL0A56dvfuVg==
|
||||
dependencies:
|
||||
npm-dragndrop "^1.2.0"
|
||||
peerjs "^1.3.2"
|
||||
@@ -2021,10 +2021,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@openreplay/tracker-redux/-/tracker-redux-3.0.0.tgz#7d71c8d2b58b08229e6af2c677d53980cee0b9ef"
|
||||
integrity sha512-ctybOquoDj8QNj82pETftgXjEoAzwEoKSxIhwstJaUv5xUkBVv0rDIjMBgCSys8cB/vbRkI/QhvksDaFr9hY0g==
|
||||
|
||||
"@openreplay/tracker@^3.2.5":
|
||||
version "3.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@openreplay/tracker/-/tracker-3.3.0.tgz#e786dda078a4a353b41f1d1a4ee902964db60d5b"
|
||||
integrity sha512-g9sOG01VaiRLw4TcUbux8j3moa7gsGs8rjZPEVJ5SJqxjje9R7tpUD5UId9ne7QdHSoiHfrWFk3TNRLpXyvImg==
|
||||
"@openreplay/tracker@^3.3.1":
|
||||
version "3.3.1"
|
||||
resolved "https://registry.yarnpkg.com/@openreplay/tracker/-/tracker-3.3.1.tgz#a95afb6c95d52ff8a81f97f0eafb03c4b1464d9b"
|
||||
integrity sha512-6R2l7t75jeNJnFhbh46pOfKLRqiroRDMs9xiShpq8AFuY7/zfIIgWobbNTu17XYC3h4r95HcTQ4eSr/vyA/baQ==
|
||||
dependencies:
|
||||
"@medv/finder" "^2.0.0"
|
||||
error-stack-parser "^2.0.6"
|
||||
@@ -3478,12 +3478,12 @@ axe-core@^4.0.2:
|
||||
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.3.tgz#b55cd8e8ddf659fe89b064680e1c6a4dceab0325"
|
||||
integrity sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==
|
||||
|
||||
axios@^0.21.1:
|
||||
version "0.21.1"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
|
||||
integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
|
||||
axios@^0.21.4:
|
||||
version "0.21.4"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
|
||||
integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
|
||||
dependencies:
|
||||
follow-redirects "^1.10.0"
|
||||
follow-redirects "^1.14.0"
|
||||
|
||||
axobject-query@^2.2.0:
|
||||
version "2.2.0"
|
||||
@@ -6430,7 +6430,7 @@ flush-write-stream@^1.0.0:
|
||||
inherits "^2.0.3"
|
||||
readable-stream "^2.3.6"
|
||||
|
||||
follow-redirects@^1.0.0, follow-redirects@^1.10.0:
|
||||
follow-redirects@^1.0.0, follow-redirects@^1.14.0:
|
||||
version "1.14.3"
|
||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e"
|
||||
integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==
|
||||
@@ -6724,10 +6724,10 @@ graphql-tag@^2.12.3:
|
||||
dependencies:
|
||||
tslib "^2.1.0"
|
||||
|
||||
graphql@^15.5.2:
|
||||
version "15.5.2"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.2.tgz#efa19f8f2bf1a48eb7d5c85bf17e144ba8bb0480"
|
||||
integrity sha512-dZjLPWNQqYv0dqV2RNbiFed0LtSp6yd4jchsDGnuhDKa9OQHJYCfovaOEvY91w9gqbYO7Se9LKDTl3xxYva/3w==
|
||||
graphql@^15.5.3:
|
||||
version "15.5.3"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.3.tgz#c72349017d5c9f5446a897fe6908b3186db1da00"
|
||||
integrity sha512-sM+jXaO5KinTui6lbK/7b7H/Knj9BpjGxZ+Ki35v7YbUJxxdBCUqNM0h3CRVU1ZF9t5lNiBzvBCSYPvIwxPOQA==
|
||||
|
||||
growly@^1.3.0:
|
||||
version "1.3.0"
|
||||
@@ -8487,10 +8487,10 @@ levn@~0.3.0:
|
||||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
|
||||
libphonenumber-js@^1.9.25:
|
||||
version "1.9.25"
|
||||
resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.25.tgz#e54b570f03d36ce059a88ab01ec49b9037ec1c97"
|
||||
integrity sha512-LsSjcmXXGujESsrOsF2rrLdmuABj3OluCzPJKVNslJ2qc7xF5KdKXN8y0OcxHVurqosVf1/r4itrVrKSrlbVHA==
|
||||
libphonenumber-js@^1.9.26:
|
||||
version "1.9.26"
|
||||
resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.26.tgz#888aca88a4019d0b108e45db8e0509d55785ae45"
|
||||
integrity sha512-j0brmDsZLSKJCrcli1HjzHYP29VOf5P/Yz+xxe7WmKTe+0XVnKa0J+UEAaT96D21w1mfLPhlm0ZXBQ13EVF+XQ==
|
||||
|
||||
lie@~3.3.0:
|
||||
version "3.3.0"
|
||||
@@ -11461,7 +11461,7 @@ react-prop-toggle@^1.0.2:
|
||||
resolved "https://registry.yarnpkg.com/react-prop-toggle/-/react-prop-toggle-1.0.2.tgz#8b0b7e74653606b1427cfcf6c4eaa9198330568e"
|
||||
integrity sha512-JmerjAXs7qJ959+d0Ygt7Cb2+4fG+n3I2VXO6JO0AcAY1vkRN/JpZKAN67CMXY889xEJcfylmMPhzvf6nWO68Q==
|
||||
|
||||
react-redux@^7.2.0, react-redux@^7.2.4:
|
||||
react-redux@^7.2.0:
|
||||
version "7.2.4"
|
||||
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.4.tgz#1ebb474032b72d806de2e0519cd07761e222e225"
|
||||
integrity sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==
|
||||
@@ -11473,6 +11473,18 @@ react-redux@^7.2.0, react-redux@^7.2.4:
|
||||
prop-types "^15.7.2"
|
||||
react-is "^16.13.1"
|
||||
|
||||
react-redux@^7.2.5:
|
||||
version "7.2.5"
|
||||
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.5.tgz#213c1b05aa1187d9c940ddfc0b29450957f6a3b8"
|
||||
integrity sha512-Dt29bNyBsbQaysp6s/dN0gUodcq+dVKKER8Qv82UrpeygwYeX1raTtil7O/fftw/rFqzaf6gJhDZRkkZnn6bjg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.1"
|
||||
"@types/react-redux" "^7.1.16"
|
||||
hoist-non-react-statics "^3.3.2"
|
||||
loose-envify "^1.4.0"
|
||||
prop-types "^15.7.2"
|
||||
react-is "^16.13.1"
|
||||
|
||||
react-refresh@^0.8.3:
|
||||
version "0.8.3"
|
||||
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
|
||||
@@ -11496,10 +11508,10 @@ react-resize-detector@^6.6.3:
|
||||
lodash.throttle "^4.1.1"
|
||||
resize-observer-polyfill "^1.5.1"
|
||||
|
||||
react-router-dom@^5.2.1:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.1.tgz#34af8b551a4ce17487d3f80e651b91651978dff6"
|
||||
integrity sha512-xhFFkBGVcIVPbWM2KEYzED+nuHQPmulVa7sqIs3ESxzYd1pYg8N8rxPnQ4T2o1zu/2QeDUWcaqST131SO1LR3w==
|
||||
react-router-dom@^5.3.0:
|
||||
version "5.3.0"
|
||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363"
|
||||
integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.13"
|
||||
history "^4.9.0"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
- type: run_sql
|
||||
args:
|
||||
cascade: false
|
||||
read_only: false
|
||||
sql: DROP TABLE "public"."relatedjobs";
|
||||
@@ -0,0 +1,31 @@
|
||||
- type: run_sql
|
||||
args:
|
||||
cascade: false
|
||||
read_only: false
|
||||
sql: CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
- type: run_sql
|
||||
args:
|
||||
cascade: false
|
||||
read_only: false
|
||||
sql: |-
|
||||
CREATE TABLE "public"."relatedjobs"("id" uuid NOT NULL DEFAULT gen_random_uuid(), "created_at" timestamptz NOT NULL DEFAULT now(), "updated_at" timestamptz NOT NULL DEFAULT now(), "parentjob" uuid NOT NULL, "childjob" UUID NOT NULL, PRIMARY KEY ("id") , FOREIGN KEY ("parentjob") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON DELETE cascade, FOREIGN KEY ("childjob") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON DELETE cascade, UNIQUE ("id"));
|
||||
CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
|
||||
RETURNS TRIGGER AS $$
|
||||
DECLARE
|
||||
_new record;
|
||||
BEGIN
|
||||
_new := NEW;
|
||||
_new."updated_at" = NOW();
|
||||
RETURN _new;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
CREATE TRIGGER "set_public_relatedjobs_updated_at"
|
||||
BEFORE UPDATE ON "public"."relatedjobs"
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
|
||||
COMMENT ON TRIGGER "set_public_relatedjobs_updated_at" ON "public"."relatedjobs"
|
||||
IS 'trigger to set value of column "updated_at" to current timestamp on row update';
|
||||
- type: add_existing_table_or_view
|
||||
args:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,24 @@
|
||||
- type: drop_relationship
|
||||
args:
|
||||
relationship: relatedjobs
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
- type: drop_relationship
|
||||
args:
|
||||
relationship: relatedjobsByChildjob
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
- type: drop_relationship
|
||||
args:
|
||||
relationship: job
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
- type: drop_relationship
|
||||
args:
|
||||
relationship: jobByChildjob
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,40 @@
|
||||
- type: create_array_relationship
|
||||
args:
|
||||
name: relatedjobs
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
using:
|
||||
foreign_key_constraint_on:
|
||||
column: parentjob
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
- type: create_array_relationship
|
||||
args:
|
||||
name: relatedjobsByChildjob
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
using:
|
||||
foreign_key_constraint_on:
|
||||
column: childjob
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
- type: create_object_relationship
|
||||
args:
|
||||
name: job
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
using:
|
||||
foreign_key_constraint_on: parentjob
|
||||
- type: create_object_relationship
|
||||
args:
|
||||
name: jobByChildjob
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
using:
|
||||
foreign_key_constraint_on: childjob
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: parentjob_rel
|
||||
new_name: job
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: job
|
||||
new_name: parentjob_rel
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: childjob_rel
|
||||
new_name: jobByChildjob
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: jobByChildjob
|
||||
new_name: childjob_rel
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: relatedjobs_parent
|
||||
new_name: relatedjobs
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: relatedjobs
|
||||
new_name: relatedjobs_parent
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: relatedjobs_child
|
||||
new_name: relatedjobsByChildjob
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
@@ -0,0 +1,7 @@
|
||||
- type: rename_relationship
|
||||
args:
|
||||
name: relatedjobsByChildjob
|
||||
new_name: relatedjobs_child
|
||||
table:
|
||||
name: jobs
|
||||
schema: public
|
||||
@@ -0,0 +1,6 @@
|
||||
- type: drop_insert_permission
|
||||
args:
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,36 @@
|
||||
- type: create_insert_permission
|
||||
args:
|
||||
permission:
|
||||
allow_upsert: true
|
||||
backend_only: false
|
||||
check:
|
||||
_or:
|
||||
- parentjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- childjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
columns:
|
||||
- id
|
||||
- created_at
|
||||
- updated_at
|
||||
- parentjob
|
||||
- childjob
|
||||
set: {}
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,6 @@
|
||||
- type: drop_select_permission
|
||||
args:
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,37 @@
|
||||
- type: create_select_permission
|
||||
args:
|
||||
permission:
|
||||
allow_aggregations: false
|
||||
backend_only: false
|
||||
columns:
|
||||
- created_at
|
||||
- updated_at
|
||||
- childjob
|
||||
- id
|
||||
- parentjob
|
||||
computed_fields: []
|
||||
filter:
|
||||
_or:
|
||||
- parentjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- childjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
limit: null
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,6 @@
|
||||
- type: drop_update_permission
|
||||
args:
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,35 @@
|
||||
- type: create_update_permission
|
||||
args:
|
||||
permission:
|
||||
backend_only: false
|
||||
columns:
|
||||
- created_at
|
||||
- updated_at
|
||||
- childjob
|
||||
- id
|
||||
- parentjob
|
||||
filter:
|
||||
_or:
|
||||
- parentjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- childjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
set: {}
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,6 @@
|
||||
- type: drop_delete_permission
|
||||
args:
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -0,0 +1,28 @@
|
||||
- type: create_delete_permission
|
||||
args:
|
||||
permission:
|
||||
backend_only: false
|
||||
filter:
|
||||
_or:
|
||||
- parentjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- childjob_rel:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
role: user
|
||||
table:
|
||||
name: relatedjobs
|
||||
schema: public
|
||||
@@ -29,7 +29,7 @@
|
||||
"dotenv": "10.0.0",
|
||||
"express": "^4.16.4",
|
||||
"firebase-admin": "^9.11.1",
|
||||
"graphql": "^15.5.2",
|
||||
"graphql": "^15.5.3",
|
||||
"graphql-request": "^3.4.0",
|
||||
"graylog2": "^0.2.1",
|
||||
"inline-css": "^3.0.0",
|
||||
|
||||
@@ -1947,10 +1947,10 @@ graphql-request@^3.4.0:
|
||||
extract-files "^9.0.0"
|
||||
form-data "^3.0.0"
|
||||
|
||||
graphql@^15.5.2:
|
||||
version "15.5.2"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.2.tgz#efa19f8f2bf1a48eb7d5c85bf17e144ba8bb0480"
|
||||
integrity sha512-dZjLPWNQqYv0dqV2RNbiFed0LtSp6yd4jchsDGnuhDKa9OQHJYCfovaOEvY91w9gqbYO7Se9LKDTl3xxYva/3w==
|
||||
graphql@^15.5.3:
|
||||
version "15.5.3"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.3.tgz#c72349017d5c9f5446a897fe6908b3186db1da00"
|
||||
integrity sha512-sM+jXaO5KinTui6lbK/7b7H/Knj9BpjGxZ+Ki35v7YbUJxxdBCUqNM0h3CRVU1ZF9t5lNiBzvBCSYPvIwxPOQA==
|
||||
|
||||
graylog2@^0.2.1:
|
||||
version "0.2.1"
|
||||
|
||||
Reference in New Issue
Block a user