Ability to delete non-exported payment IO-559
This commit is contained in:
@@ -1541,6 +1541,27 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>deleting</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>exporting</name>
|
||||
<definition_loaded>false</definition_loaded>
|
||||
@@ -2312,6 +2333,27 @@
|
||||
</translation>
|
||||
</translations>
|
||||
</concept_node>
|
||||
<concept_node>
|
||||
<name>deleted</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>
|
||||
</children>
|
||||
</folder_node>
|
||||
<folder_node>
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import { useMutation } from "@apollo/react-hooks";
|
||||
import { Button, notification } from "antd";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { DELETE_BILL } from "../../graphql/bills.queries";
|
||||
|
||||
export default function BillDeleteButton({ bill }) {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const { t } = useTranslation();
|
||||
const [deleteBill] = useMutation(DELETE_BILL);
|
||||
|
||||
const handleDelete = async () => {
|
||||
setLoading(true);
|
||||
const result = await deleteBill({
|
||||
variables: { billId: bill.id },
|
||||
update(cache) {
|
||||
cache.modify({
|
||||
fields: {
|
||||
bills(existingBills, { readField }) {
|
||||
return existingBills.filter(
|
||||
(billref) => bill.id !== readField("id", billref)
|
||||
);
|
||||
},
|
||||
search_bills(existingBills, { readField }) {
|
||||
return existingBills.filter(
|
||||
(billref) => bill.id !== readField("id", billref)
|
||||
);
|
||||
},
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
if (!!!result.errors) {
|
||||
notification["success"]({ message: t("bills.successes.deleted") });
|
||||
} else {
|
||||
notification["error"]({
|
||||
message: t("bills.errors.deleting", {
|
||||
error: JSON.stringify(result.errors),
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<Button disabled={bill.exported} onClick={handleDelete} loading={loading}>
|
||||
{t("general.actions.delete")}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,13 @@
|
||||
import { SyncOutlined } from "@ant-design/icons";
|
||||
import { Button, Checkbox, Descriptions, Input, Table, Typography } from "antd";
|
||||
import {
|
||||
Button,
|
||||
Checkbox,
|
||||
Descriptions,
|
||||
Input,
|
||||
Space,
|
||||
Table,
|
||||
Typography,
|
||||
} from "antd";
|
||||
import queryString from "query-string";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
@@ -10,6 +18,7 @@ import { setModalContext } from "../../redux/modals/modals.actions";
|
||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||
import { DateFormatter } from "../../utils/DateFormatter";
|
||||
import { alphaSort } from "../../utils/sorters";
|
||||
import BillDeleteButton from "../bill-delete-button/bill-delete-button.component";
|
||||
|
||||
const mapStateToProps = createStructuredSelector({
|
||||
//jobRO: selectJobReadOnly,
|
||||
@@ -106,7 +115,7 @@ export function BillsListTableComponent({
|
||||
dataIndex: "actions",
|
||||
key: "actions",
|
||||
render: (text, record) => (
|
||||
<div>
|
||||
<Space>
|
||||
{record.exported ? (
|
||||
<Button disabled>{t("bills.actions.edit")}</Button>
|
||||
) : (
|
||||
@@ -116,7 +125,8 @@ export function BillsListTableComponent({
|
||||
<Button>{t("bills.actions.edit")}</Button>
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
<BillDeleteButton bill={record} />
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
@@ -10,6 +10,14 @@ export const INSERT_NEW_BILL = gql`
|
||||
}
|
||||
`;
|
||||
|
||||
export const DELETE_BILL = gql`
|
||||
mutation DELETE_BILL($billId: uuid!) {
|
||||
delete_bills_by_pk(id: $billId) {
|
||||
id
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const QUERY_ALL_BILLS_PAGINATED = gql`
|
||||
query QUERY_ALL_BILLS_PAGINATED(
|
||||
$search: String
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { SyncOutlined } from "@ant-design/icons";
|
||||
import { Button, Checkbox, Input, Table, Typography } from "antd";
|
||||
import { Button, Checkbox, Input, Space, Table, Typography } from "antd";
|
||||
import queryString from "query-string";
|
||||
import React, { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { connect } from "react-redux";
|
||||
import { Link, useHistory, useLocation } from "react-router-dom";
|
||||
import BillDeleteButton from "../../components/bill-delete-button/bill-delete-button.component";
|
||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||
import { DateFormatter } from "../../utils/DateFormatter";
|
||||
@@ -98,7 +99,7 @@ export function BillsListPage({
|
||||
dataIndex: "actions",
|
||||
key: "actions",
|
||||
render: (text, record) => (
|
||||
<div>
|
||||
<Space>
|
||||
<Link to={`/manage/bills?billid=${record.id}`}>
|
||||
<Button>{t("bills.actions.edit")}</Button>
|
||||
</Link>
|
||||
@@ -128,7 +129,8 @@ export function BillsListPage({
|
||||
>
|
||||
{t("bills.actions.return")}
|
||||
</Button>
|
||||
</div>
|
||||
<BillDeleteButton bill={record} />
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
||||
@@ -112,7 +112,8 @@
|
||||
"return": "Return Items"
|
||||
},
|
||||
"errors": {
|
||||
"creating": "Error adding bill.",
|
||||
"creating": "Error adding bill. {{error}}",
|
||||
"deleting": "Error deleting bill. {{error}}",
|
||||
"exporting": "Error exporting payable(s). {{error}}",
|
||||
"exporting-partner": "Unable to connect to ImEX Partner. Please ensure it is running and logged in.",
|
||||
"invalidro": "Not a valid RO.",
|
||||
@@ -154,7 +155,8 @@
|
||||
"subtotal": "Subtotal"
|
||||
},
|
||||
"successes": {
|
||||
"created": "Invoice added successfully."
|
||||
"created": "Invoice added successfully.",
|
||||
"deleted": "Bill deleted successfully."
|
||||
},
|
||||
"validation": {
|
||||
"unique_invoice_number": "This invoice number has already been entered for this vendor."
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
},
|
||||
"errors": {
|
||||
"creating": "",
|
||||
"deleting": "",
|
||||
"exporting": "",
|
||||
"exporting-partner": "",
|
||||
"invalidro": "",
|
||||
@@ -154,7 +155,8 @@
|
||||
"subtotal": ""
|
||||
},
|
||||
"successes": {
|
||||
"created": ""
|
||||
"created": "",
|
||||
"deleted": ""
|
||||
},
|
||||
"validation": {
|
||||
"unique_invoice_number": ""
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
},
|
||||
"errors": {
|
||||
"creating": "",
|
||||
"deleting": "",
|
||||
"exporting": "",
|
||||
"exporting-partner": "",
|
||||
"invalidro": "",
|
||||
@@ -154,7 +155,8 @@
|
||||
"subtotal": ""
|
||||
},
|
||||
"successes": {
|
||||
"created": ""
|
||||
"created": "",
|
||||
"deleted": ""
|
||||
},
|
||||
"validation": {
|
||||
"unique_invoice_number": ""
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
- args:
|
||||
role: user
|
||||
table:
|
||||
name: bills
|
||||
schema: public
|
||||
type: drop_delete_permission
|
||||
@@ -0,0 +1,21 @@
|
||||
- args:
|
||||
permission:
|
||||
backend_only: false
|
||||
filter:
|
||||
_and:
|
||||
- job:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- exported:
|
||||
_eq: false
|
||||
role: user
|
||||
table:
|
||||
name: bills
|
||||
schema: public
|
||||
type: create_delete_permission
|
||||
@@ -0,0 +1,12 @@
|
||||
- args:
|
||||
cascade: false
|
||||
read_only: false
|
||||
sql: |-
|
||||
alter table "public"."documents" drop constraint "documents_billid_fkey",
|
||||
add constraint "documents_invoiceid_fkey"
|
||||
foreign key ("billid")
|
||||
references "public"."bills"
|
||||
("id")
|
||||
on update restrict
|
||||
on delete restrict;
|
||||
type: run_sql
|
||||
@@ -0,0 +1,10 @@
|
||||
- args:
|
||||
cascade: false
|
||||
read_only: false
|
||||
sql: |-
|
||||
alter table "public"."documents" drop constraint "documents_invoiceid_fkey",
|
||||
add constraint "documents_billid_fkey"
|
||||
foreign key ("billid")
|
||||
references "public"."bills"
|
||||
("id") on update restrict on delete set null;
|
||||
type: run_sql
|
||||
@@ -587,6 +587,22 @@ tables:
|
||||
- active:
|
||||
_eq: true
|
||||
check: null
|
||||
delete_permissions:
|
||||
- role: user
|
||||
permission:
|
||||
filter:
|
||||
_and:
|
||||
- job:
|
||||
bodyshop:
|
||||
associations:
|
||||
_and:
|
||||
- user:
|
||||
authid:
|
||||
_eq: X-Hasura-User-Id
|
||||
- active:
|
||||
_eq: true
|
||||
- exported:
|
||||
_eq: false
|
||||
- table:
|
||||
schema: public
|
||||
name: bodyshops
|
||||
|
||||
Reference in New Issue
Block a user