From 53ec5200e42d7f948300aa2e72461a86a86092ba Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 13 Apr 2021 14:12:41 -0700 Subject: [PATCH] IO-896 Fleet # Validation --- .../courtesy-car-form.component.jsx | 41 ++++++++++++++ client/src/graphql/courtesy-car.queries.js | 53 +++++++++++++------ .../down.yaml | 50 +++++++++++++++++ .../up.yaml | 50 +++++++++++++++++ hasura/migrations/metadata.yaml | 1 + 5 files changed, 178 insertions(+), 17 deletions(-) create mode 100644 hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/down.yaml create mode 100644 hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/up.yaml diff --git a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx index ed9c073c4..6f88df723 100644 --- a/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx +++ b/client/src/components/courtesy-car-form/courtesy-car-form.component.jsx @@ -8,9 +8,13 @@ import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed- import CurrencyInput from "../form-items-formatted/currency-form-item.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import InputNumberCalculator from "../form-input-number-calculator/form-input-number-calculator.component"; +import { useApolloClient } from "@apollo/client"; +import { CHECK_CC_FLEET_NUMBER } from "../../graphql/courtesy-car.queries"; export default function CourtesyCarCreateFormComponent({ form, saveLoading }) { const { t } = useTranslation(); + const client = useApolloClient(); + return (
({ + async validator(rule, value) { + if (value) { + const response = await client.query({ + query: CHECK_CC_FLEET_NUMBER, + variables: { + name: value, + }, + }); + + if ( + response.data.courtesycars_aggregate.aggregate.count === 0 + ) { + return Promise.resolve(); + } else if ( + response.data.courtesycars_aggregate.nodes.length === 1 && + response.data.courtesycars_aggregate.nodes[0].id === + form.getFieldValue("id") + ) { + return Promise.resolve(); + } + return Promise.reject( + t("vendors.validation.unique_vendor_name") + ); + } else { + return Promise.resolve(); + } + }, + }), + ]} > diff --git a/client/src/graphql/courtesy-car.queries.js b/client/src/graphql/courtesy-car.queries.js index d7299f21a..4f13adac8 100644 --- a/client/src/graphql/courtesy-car.queries.js +++ b/client/src/graphql/courtesy-car.queries.js @@ -13,26 +13,45 @@ export const INSERT_NEW_COURTESY_CAR = gql` `; export const QUERY_AVAILABLE_CC = gql` -query QUERY_AVAILABLE_CC($today: date) { - courtesycars(where: {_or: [{serviceenddate: {_is_null: true}}, {serviceenddate: {_gt: $today}}], status: {_eq: "courtesycars.status.in"}}) { - color - dailycost - damage - fleetnumber - fuel - id - make - model - plate - status - year - dailycost - mileage + query QUERY_AVAILABLE_CC($today: date) { + courtesycars( + where: { + _or: [ + { serviceenddate: { _is_null: true } } + { serviceenddate: { _gt: $today } } + ] + status: { _eq: "courtesycars.status.in" } + } + ) { + color + dailycost + damage + fleetnumber + fuel + id + make + model + plate + status + year + dailycost + mileage + } } -} - `; +export const CHECK_CC_FLEET_NUMBER = gql` + query CHECK_VENDOR_NAME($name: String!) { + courtesycars_aggregate(where: { fleetnumber: { _ilike: $name } }) { + aggregate { + count + } + nodes { + id + } + } + } +`; export const QUERY_ALL_CC = gql` query QUERY_ALL_CC { courtesycars { diff --git a/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/down.yaml b/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/down.yaml new file mode 100644 index 000000000..b0294a184 --- /dev/null +++ b/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/down.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: courtesycars + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - insuranceexpires + - leaseenddate + - nextservicedate + - purchasedate + - registrationexpires + - serviceenddate + - servicestartdate + - dailycost + - fuel + - mileage + - nextservicekm + - color + - damage + - fleetnumber + - make + - model + - notes + - plate + - status + - vin + - year + - created_at + - updated_at + - bodyshopid + - id + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: courtesycars + schema: public + type: create_select_permission diff --git a/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/up.yaml b/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/up.yaml new file mode 100644 index 000000000..53d407cf1 --- /dev/null +++ b/hasura/migrations/1618348212289_update_permission_user_public_table_courtesycars/up.yaml @@ -0,0 +1,50 @@ +- args: + role: user + table: + name: courtesycars + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: true + columns: + - insuranceexpires + - leaseenddate + - nextservicedate + - purchasedate + - registrationexpires + - serviceenddate + - servicestartdate + - dailycost + - fuel + - mileage + - nextservicekm + - color + - damage + - fleetnumber + - make + - model + - notes + - plate + - status + - vin + - year + - created_at + - updated_at + - bodyshopid + - id + computed_fields: [] + filter: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: courtesycars + schema: public + type: create_select_permission diff --git a/hasura/migrations/metadata.yaml b/hasura/migrations/metadata.yaml index 1ad5a03ba..a27a6869b 100644 --- a/hasura/migrations/metadata.yaml +++ b/hasura/migrations/metadata.yaml @@ -1215,6 +1215,7 @@ tables: _eq: X-Hasura-User-Id - active: _eq: true + allow_aggregations: true update_permissions: - role: user permission: