diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 4539439a1..f4b6ffd48 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -1085,6 +1085,48 @@ + + dailybodytarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + dailypainttarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + email false @@ -13167,6 +13209,27 @@ + + scoreboard + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + shop false @@ -16143,6 +16206,121 @@ + + scoreboard + + + labels + + + asoftodaytarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + dailytarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + monthlytarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + weeklytarget + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + workingdays + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + templates @@ -17024,6 +17202,27 @@ + + scoreboard + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + shop false @@ -17614,6 +17813,27 @@ + + scoreboard + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + shop false diff --git a/client/package.json b/client/package.json index 4a607e1df..5062a61e9 100644 --- a/client/package.json +++ b/client/package.json @@ -26,6 +26,7 @@ "i18next": "^19.4.5", "i18next-browser-languagedetector": "^4.2.0", "logrocket": "^1.0.7", + "moment-business-days": "^1.2.0", "node-sass": "^4.14.1", "phone": "^2.4.12", "query-string": "^6.13.1", @@ -50,6 +51,7 @@ "react-scripts": "3.4.1", "react-trello": "^2.2.6", "react-virtualized": "^9.21.2", + "recharts": "^1.8.5", "redux": "^4.0.5", "redux-persist": "^6.0.0", "redux-saga": "^1.1.3", diff --git a/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx index 510aeb89c..9486cbcc4 100644 --- a/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx +++ b/client/src/components/chat-conversation-title/chat-conversation-title.component.jsx @@ -5,11 +5,13 @@ import ChatConversationTitleTags from "../chat-conversation-title-tags/chat-conv export default function ChatConversationTitle({ conversation }) { return (
- {conversation.phone_num} + {conversation && conversation.phone_num} - +
); } diff --git a/client/src/components/header/header.component.jsx b/client/src/components/header/header.component.jsx index d8bdbab37..84c73f264 100644 --- a/client/src/components/header/header.component.jsx +++ b/client/src/components/header/header.component.jsx @@ -128,6 +128,11 @@ function Header({ {t("menus.header.productionboard")} + + + {t("menus.header.scoreboard")} + + {t("menus.header.activejobs")} diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index 4ab089e49..f4e1d885b 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -105,8 +105,6 @@ export function ProductionBoardKanbanComponent({ data, bodyshop }) { } }; - console.log("ismMoving", isMoving); - return (
diff --git a/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx new file mode 100644 index 000000000..6a0d781e0 --- /dev/null +++ b/client/src/components/scoreboard-chart/scoreboard-chart.component.jsx @@ -0,0 +1,113 @@ +import React from "react"; +import { + ComposedChart, + Line, + Area, + Bar, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + Legend, + ResponsiveContainer, +} from "recharts"; +import * as Utils from "../scoreboard-targets-table/scoreboard-targets-table.util"; +import moment from "moment"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardChart); + +export function ScoreboardChart({ sbEntriesByDate, bodyshop }) { + const listOfBusDays = Utils.ListOfDaysInCurrentMonth(); + + const data = listOfBusDays.reduce((acc, val) => { + //Sum up the current day. + let dayhrs; + if (!!sbEntriesByDate[val]) { + dayhrs = sbEntriesByDate[val].reduce( + (dayAcc, dayVal) => { + return { + bodyhrs: dayAcc.bodyhrs + dayVal.bodyhrs, + painthrs: dayAcc.painthrs + dayVal.painthrs, + }; + }, + { bodyhrs: 0, painthrs: 0 } + ); + } else { + dayhrs = { + bodyhrs: 0, + painthrs: 0, + }; + } + + const theValue = { + date: moment(val).format("D dd"), + paintHrs: dayhrs.painthrs, + bodyHrs: dayhrs.bodyhrs, + accTargetHrs: Utils.AsOfDateTargetHours( + bodyshop.scoreboard_target.dailyBodyTarget + + bodyshop.scoreboard_target.dailyPaintTarget, + val + ), + accHrs: + acc.length > 0 + ? acc[acc.length - 1].accHrs + dayhrs.painthrs + dayhrs.bodyhrs + : dayhrs.painthrs + dayhrs.bodyhrs, + }; + + return [...acc, theValue]; + }, []); + + return ( +
+ + + + + + + + + + + + + +
+ ); +} diff --git a/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx new file mode 100644 index 000000000..a621130ac --- /dev/null +++ b/client/src/components/scoreboard-day-stats/scoreboard-day-stats.component.jsx @@ -0,0 +1,47 @@ +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import { Statistic, Card } from "antd"; +import moment from "moment"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScoreboardDayStats({ bodyshop, date, entries }) { + const { + lastNumberWorkingDays, + dailyPaintTarget, + dailyBodyTarget, + } = bodyshop.scoreboard_target; + + let totalHrs = 0; + const paintHrs = entries.reduce((acc, value) => { + totalHrs = +value.painthrs; + return acc + value.painthrs; + }, 0); + + const bodyHrs = entries.reduce((acc, value) => { + totalHrs = +value.bodyhrs; + return acc + value.bodyhrs; + }, 0); + + return ( +
+ + bodyHrs ? "red" : "green" }} + value={bodyHrs.toFixed(1)} + /> + paintHrs ? "red" : "green" }} + value={paintHrs.toFixed(1)} + /> + +
+ ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardDayStats); diff --git a/client/src/components/scoreboard-display/scoreboard-display.component.jsx b/client/src/components/scoreboard-display/scoreboard-display.component.jsx new file mode 100644 index 000000000..759bfc2e5 --- /dev/null +++ b/client/src/components/scoreboard-display/scoreboard-display.component.jsx @@ -0,0 +1,31 @@ +import React from "react"; + +import ScoreboardTargetsTable from "../scoreboard-targets-table/scoreboard-targets-table.component"; +import ScoreboardLastDays from "../scoreboard-last-days/scoreboard-last-days.component"; +import ScoreboardChart from "../scoreboard-chart/scoreboard-chart.component"; + +export default function ScoreboardDisplayComponent({ scoreboardSubscription }) { + const { loading, error, data } = scoreboardSubscription; + + const scoreBoardlist = (data && data.scoreboard) || []; + console.log("ScoreboardDisplayComponent -> scoreBoardlist", scoreBoardlist); + + const sbEntriesByDate = {}; + + scoreBoardlist.forEach((i) => { + const entryDate = i.date; + if (!!!sbEntriesByDate[entryDate]) { + sbEntriesByDate[entryDate] = []; + } + sbEntriesByDate[entryDate].push(i); + }); + + console.log("ScoreboardDisplayComponent -> sbEntriesByDate", sbEntriesByDate); + return ( +
+ + + +
+ ); +} diff --git a/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx new file mode 100644 index 000000000..678ba545e --- /dev/null +++ b/client/src/components/scoreboard-last-days/scoreboard-last-days.component.jsx @@ -0,0 +1,41 @@ +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import moment from "moment"; +import ScoreboardDayStat from "../scoreboard-day-stats/scoreboard-day-stats.component"; +import { Row, Col } from "antd"; +import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +export function ScoreboardLastDays({ bodyshop, sbEntriesByDate }) { + const { lastNumberWorkingDays } = bodyshop.scoreboard_target; + + const ArrayOfDate = []; + for (var i = lastNumberWorkingDays - 1; i >= 0; i--) { + ArrayOfDate.push( + moment().businessSubtract(i, "day").toISOString().substr(0, 10) + ); + } + + return ( + + {ArrayOfDate.map((a) => ( + + {!!sbEntriesByDate ? ( + + ) : ( + + )} + + ))} + + ); +} +export default connect(mapStateToProps, mapDispatchToProps)(ScoreboardLastDays); diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx new file mode 100644 index 000000000..f0423a6b9 --- /dev/null +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.component.jsx @@ -0,0 +1,109 @@ +import React from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import * as Util from "./scoreboard-targets-table.util"; +import { Row, Col, Card, Statistic } from "antd"; +import { CalendarOutlined } from "@ant-design/icons"; +import { useTranslation } from "react-i18next"; +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); +const mapDispatchToProps = (dispatch) => ({ + //setUserLanguage: language => dispatch(setUserLanguage(language)) +}); + +const rowGutter = [16, 16]; +const statSpans = { xs: 24, sm: 6 }; + +export function ScoreboardTargetsTable({ bodyshop }) { + const { t } = useTranslation(); + + return ( +
+ + + } + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScoreboardTargetsTable); diff --git a/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js new file mode 100644 index 000000000..e683a3132 --- /dev/null +++ b/client/src/components/scoreboard-targets-table/scoreboard-targets-table.util.js @@ -0,0 +1,50 @@ +import moment from "moment"; +import momentbd from "moment-business-days"; + +moment.updateLocale("ca", { + workingWeekdays: [1, 2, 3, 4, 5], +}); + +export const CalculateWorkingDaysThisMonth = () => { + return moment().endOf("month").businessDaysIntoMonth(); +}; + +export const CalculateWorkingDaysAsOfToday = () => { + return moment().businessDaysIntoMonth(); +}; + +export const WeeklyTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * 5; +}; + +export const MonthlyTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * CalculateWorkingDaysThisMonth(); +}; + +export const AsOfTodayTargetHrs = (dailyTargetHrs, bodyshop) => { + return dailyTargetHrs * CalculateWorkingDaysAsOfToday(); +}; + +export const AsOfDateTargetHours = (dailyTargetHours, date) => { + return ( + dailyTargetHours * moment().startOf("month").businessDiff(moment(date)) + ); +}; + +export const ListOfBusinessDaysInCurrentMonth = () => { + const momentListOfDays = moment().monthBusinessDays(); + + return momentListOfDays.map((i) => i.format("YYYY-MM-DD")); +}; + +export const ListOfDaysInCurrentMonth = () => { + const days = []; + const dateStart = moment().startOf("month"); + const dateEnd = moment().endOf("month"); + while (dateEnd.diff(dateStart, "days") > 0) { + days.push(dateStart.format("YYYY-MM-DD")); + dateStart.add(1, "days"); + } + days.push(dateEnd.format("YYYY-MM-DD")); + return days; +}; diff --git a/client/src/components/shop-info/shop-info.component.jsx b/client/src/components/shop-info/shop-info.component.jsx index c72a56b92..7800096be 100644 --- a/client/src/components/shop-info/shop-info.component.jsx +++ b/client/src/components/shop-info/shop-info.component.jsx @@ -96,6 +96,45 @@ export default function ShopInfoComponent({ form }) { + + + + + + + + + + + + import("../payments-all/payments-all.container.page") ); +const Scoreboard = lazy(() => + import("../scoreboard/scoreboard.page.container.jsx") +); + const { Content } = Layout; const stripePromise = new Promise((resolve, reject) => { @@ -305,6 +309,11 @@ export function Manage({ match, conflict }) { path={`${match.path}/payments`} component={PaymentsAll} /> + )} diff --git a/client/src/pages/scoreboard/scoreboard.page.component.jsx b/client/src/pages/scoreboard/scoreboard.page.component.jsx new file mode 100644 index 000000000..2483346fa --- /dev/null +++ b/client/src/pages/scoreboard/scoreboard.page.component.jsx @@ -0,0 +1,10 @@ +import React from "react"; +import ScoreboardDisplay from "../../components/scoreboard-display/scoreboard-display.component"; + +export default function ProductionBoardComponent({ scoreboardSubscription }) { + return ( +
+ +
+ ); +} diff --git a/client/src/pages/scoreboard/scoreboard.page.container.jsx b/client/src/pages/scoreboard/scoreboard.page.container.jsx new file mode 100644 index 000000000..3feffc67e --- /dev/null +++ b/client/src/pages/scoreboard/scoreboard.page.container.jsx @@ -0,0 +1,47 @@ +import React, { useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { setBreadcrumbs } from "../../redux/application/application.actions"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ScoreboardPageComponent from "./scoreboard.page.component"; +import { useSubscription } from "@apollo/react-hooks"; +import { SUBSCRIPTION_SCOREBOARD } from "../../graphql/scoreboard.queries"; +import moment from "moment"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +const mapDispatchToProps = (dispatch) => ({ + setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), +}); + +export function ScoreboardContainer({ setBreadcrumbs }) { + const { t } = useTranslation(); + + const scoreboardSubscription = useSubscription(SUBSCRIPTION_SCOREBOARD, { + variables: { + start: moment().startOf("month"), + end: moment().endOf("month"), + }, + }); + + useEffect(() => { + document.title = t("titles.scoreboard"); + setBreadcrumbs([ + { + link: "/manage/scoreboard", + label: t("titles.bc.scoreboard"), + }, + ]); + }, [t, setBreadcrumbs]); + + return ( + + ); +} +export default connect( + mapStateToProps, + mapDispatchToProps +)(ScoreboardContainer); diff --git a/client/src/redux/application/application.reducer.js b/client/src/redux/application/application.reducer.js index 289d80356..fb9c30157 100644 --- a/client/src/redux/application/application.reducer.js +++ b/client/src/redux/application/application.reducer.js @@ -16,7 +16,7 @@ const applicationReducer = (state = INITIAL_STATE, action) => { case ApplicationActionTypes.ADD_RECENT_ITEM: return { ...state, - recentItems: [action.payload, ...state.scheduleLoad.slice(0, 9)], + recentItems: [action.payload, ...state.recentItems.slice(0, 9)], }; case ApplicationActionTypes.SET_BREAD_CRUMBS: return { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 625ec4fc3..6fda6319a 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -86,6 +86,8 @@ "appt_length": "Default Appointment Length", "city": "City", "country": "Country", + "dailybodytarget": "Scoreboard - Daily Body Target", + "dailypainttarget": "Scoreboard - Daily Paint Target", "email": "General Shop Email", "federal_tax_id": "Federal Tax ID (GST/HST)", "insurance_vendor_id": "Insurance Vendor ID", @@ -797,6 +799,7 @@ "productionboard": "Production Board", "productionlist": "Production - List", "schedule": "Schedule", + "scoreboard": "Scoreboard", "shop": "My Shop", "shop_config": "Configuration", "shop_csi": "CSI", @@ -1011,6 +1014,15 @@ "state": "Error reading page state. Please refresh." } }, + "scoreboard": { + "labels": { + "asoftodaytarget": "As of Today", + "dailytarget": "Daily", + "monthlytarget": "Monthly", + "weeklytarget": "Weekly", + "workingdays": "Working Days / Month" + } + }, "templates": { "errors": { "updating": "Error updating template {{error}}." @@ -1067,6 +1079,7 @@ "productionboard": "Production Board", "productionlist": "Production - List", "schedule": "Schedule", + "scoreboard": "Scoreboard", "shop": "Manage my Shop ({{shopname}})", "shop-csi": "CSI Responses", "shop-templates": "Shop Templates", @@ -1096,6 +1109,7 @@ "productionlist": "Production - List View | $t(titles.app)", "profile": "My Profile | $t(titles.app)", "schedule": "Schedule | $t(titles.app)", + "scoreboard": "Scoreboard | $t(titles.app)", "shop": "My Shop | $t(titles.app)", "shop-csi": "CSI Responses | $t(titles.app)", "shop-templates": "Shop Templates | $t(titles.app)", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 8dce19278..b4cddb936 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -86,6 +86,8 @@ "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", "federal_tax_id": "", "insurance_vendor_id": "", @@ -797,6 +799,7 @@ "productionboard": "", "productionlist": "", "schedule": "Programar", + "scoreboard": "", "shop": "Mi tienda", "shop_config": "Configuración", "shop_csi": "", @@ -1011,6 +1014,15 @@ "state": "Error al leer el estado de la página. Porfavor refresca." } }, + "scoreboard": { + "labels": { + "asoftodaytarget": "", + "dailytarget": "", + "monthlytarget": "", + "weeklytarget": "", + "workingdays": "" + } + }, "templates": { "errors": { "updating": "" @@ -1067,6 +1079,7 @@ "productionboard": "", "productionlist": "", "schedule": "", + "scoreboard": "", "shop": "", "shop-csi": "", "shop-templates": "", @@ -1096,6 +1109,7 @@ "productionlist": "", "profile": "Mi perfil | $t(titles.app)", "schedule": "Horario | $t(titles.app)", + "scoreboard": "", "shop": "Mi tienda | $t(titles.app)", "shop-csi": "", "shop-templates": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index c60dc5360..a6574ffec 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -86,6 +86,8 @@ "appt_length": "", "city": "", "country": "", + "dailybodytarget": "", + "dailypainttarget": "", "email": "", "federal_tax_id": "", "insurance_vendor_id": "", @@ -797,6 +799,7 @@ "productionboard": "", "productionlist": "", "schedule": "Programme", + "scoreboard": "", "shop": "Mon magasin", "shop_config": "Configuration", "shop_csi": "", @@ -1011,6 +1014,15 @@ "state": "Erreur lors de la lecture de l'état de la page. Rafraichissez, s'il vous plait." } }, + "scoreboard": { + "labels": { + "asoftodaytarget": "", + "dailytarget": "", + "monthlytarget": "", + "weeklytarget": "", + "workingdays": "" + } + }, "templates": { "errors": { "updating": "" @@ -1067,6 +1079,7 @@ "productionboard": "", "productionlist": "", "schedule": "", + "scoreboard": "", "shop": "", "shop-csi": "", "shop-templates": "", @@ -1096,6 +1109,7 @@ "productionlist": "", "profile": "Mon profil | $t(titles.app)", "schedule": "Horaire | $t(titles.app)", + "scoreboard": "", "shop": "Mon magasin | $t(titles.app)", "shop-csi": "", "shop-templates": "", diff --git a/client/yarn.lock b/client/yarn.lock index 0d19e6bad..87729e454 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -3369,6 +3369,11 @@ backo2@^1.0.2: resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -4304,7 +4309,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.0: +core-js@^2.4.0, core-js@^2.6.10: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== @@ -4704,6 +4709,16 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.4.0.tgz#87f8b9ad11088769c82b5ea846bcb1cc9393f242" integrity sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw== +d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + d3-color@1, d3-color@^1.2.3: version "1.4.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.0.tgz#89c45a995ed773b13314f06460df26d60ba0ecaf" @@ -4719,7 +4734,7 @@ d3-hierarchy@^1.1.8: resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== -d3-interpolate@1, d3-interpolate@^1.2.0, d3-interpolate@^1.3.2: +d3-interpolate@1, d3-interpolate@^1.2.0, d3-interpolate@^1.3.0, d3-interpolate@^1.3.2: version "1.4.0" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== @@ -4739,6 +4754,18 @@ d3-scale-chromatic@^1.3.3: d3-color "1" d3-interpolate "1" +d3-scale@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + d3-scale@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.1.tgz#da1684adce7261b4bc7a76fe193d887f0e909e69" @@ -4750,7 +4777,7 @@ d3-scale@^3.0.0: d3-time "1" d3-time-format "2" -d3-shape@^1.3.5: +d3-shape@^1.2.0, d3-shape@^1.3.5: version "1.3.7" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== @@ -4841,6 +4868,11 @@ decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js-light@^2.4.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.0.tgz#ca7faf504c799326df94b0ab920424fdfc125348" + integrity sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -8254,6 +8286,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" @@ -8304,12 +8341,17 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.12, lodash@~4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -8417,6 +8459,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +math-expression-evaluator@^1.2.14: + version "1.2.22" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz#c14dcb3d8b4d150e5dcea9c68c8dad80309b0d5e" + integrity sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ== + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8718,6 +8765,11 @@ mkdirp@^0.5.3: dependencies: minimist "^1.2.5" +moment-business-days@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/moment-business-days/-/moment-business-days-1.2.0.tgz#6172f9f38dbf443c2f859baabeabbd2935f63d65" + integrity sha512-QJlceLfMSxy/jZSOgJYCKeKw+qGYHj8W0jMa/fYruyoJ85+bJuLRiYv5DIaflyuRipmYRfD4kDlSwVYteLN+Jw== + moment@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" @@ -11416,6 +11468,16 @@ react-resizable@^1.10.1, react-resizable@^1.9.0: prop-types "15.x" react-draggable "^4.0.3" +react-resize-detector@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c" + integrity sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ== + dependencies: + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + prop-types "^15.6.0" + resize-observer-polyfill "^1.5.0" + react-router-dom@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" @@ -11513,6 +11575,16 @@ react-scrolllock@^2.0.1: exenv "^1.2.2" react-prop-toggle "^1.0.2" +react-smooth@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.5.tgz#94ae161d7951cdd893ccb7099d031d342cb762ad" + integrity sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w== + dependencies: + lodash "~4.17.4" + prop-types "^15.6.0" + raf "^3.4.0" + react-transition-group "^2.5.0" + react-test-renderer@^16.0.0-0: version "16.13.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.0.tgz#39ba3bf72cedc8210c3f81983f0bb061b14a3014" @@ -11523,7 +11595,7 @@ react-test-renderer@^16.0.0-0: react-is "^16.8.6" scheduler "^0.19.0" -react-transition-group@2: +react-transition-group@2, react-transition-group@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== @@ -11694,6 +11766,30 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" +recharts-scale@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.3.tgz#040b4f638ed687a530357292ecac880578384b59" + integrity sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^1.8.5: + version "1.8.5" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.8.5.tgz#ca94a3395550946334a802e35004ceb2583fdb12" + integrity sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg== + dependencies: + classnames "^2.2.5" + core-js "^2.6.10" + d3-interpolate "^1.3.0" + d3-scale "^2.1.0" + d3-shape "^1.2.0" + lodash "^4.17.5" + prop-types "^15.6.0" + react-resize-detector "^2.3.0" + react-smooth "^1.0.5" + recharts-scale "^0.4.2" + reduce-css-calc "^1.3.0" + recompose@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" @@ -11721,6 +11817,22 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +reduce-css-calc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.3.tgz#60350f7fb252c0a67eb10fd4694d16909971300f" + integrity sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ== + dependencies: + balanced-match "^1.0.0" + reduce-reducers@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" diff --git a/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml b/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml new file mode 100644 index 000000000..1f687f33a --- /dev/null +++ b/hasura/migrations/1593188899179_create_table_public_scoreboard/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: DROP TABLE "public"."scoreboard"; + type: run_sql diff --git a/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml b/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml new file mode 100644 index 000000000..632fd67db --- /dev/null +++ b/hasura/migrations/1593188899179_create_table_public_scoreboard/up.yaml @@ -0,0 +1,18 @@ +- 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"."scoreboard"("id" uuid NOT NULL DEFAULT gen_random_uuid(), + "jobid" uuid NOT NULL, "painthrs" numeric NOT NULL DEFAULT 0, "bodyhrs" numeric + NOT NULL DEFAULT 0, "date" date NOT NULL DEFAULT now(), PRIMARY KEY ("id") , + FOREIGN KEY ("jobid") REFERENCES "public"."jobs"("id") ON UPDATE cascade ON + DELETE cascade); + type: run_sql +- args: + name: scoreboard + schema: public + type: add_existing_table_or_view diff --git a/hasura/migrations/1593188907600_track_all_relationships/down.yaml b/hasura/migrations/1593188907600_track_all_relationships/down.yaml new file mode 100644 index 000000000..96d2abf1a --- /dev/null +++ b/hasura/migrations/1593188907600_track_all_relationships/down.yaml @@ -0,0 +1,12 @@ +- args: + relationship: scoreboards + table: + name: jobs + schema: public + type: drop_relationship +- args: + relationship: job + table: + name: scoreboard + schema: public + type: drop_relationship diff --git a/hasura/migrations/1593188907600_track_all_relationships/up.yaml b/hasura/migrations/1593188907600_track_all_relationships/up.yaml new file mode 100644 index 000000000..c52da5195 --- /dev/null +++ b/hasura/migrations/1593188907600_track_all_relationships/up.yaml @@ -0,0 +1,20 @@ +- args: + name: scoreboards + table: + name: jobs + schema: public + using: + foreign_key_constraint_on: + column: jobid + table: + name: scoreboard + schema: public + type: create_array_relationship +- args: + name: job + table: + name: scoreboard + schema: public + using: + foreign_key_constraint_on: jobid + type: create_object_relationship diff --git a/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..82df32845 --- /dev/null +++ b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_insert_permission diff --git a/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..2c510729e --- /dev/null +++ b/hasura/migrations/1593189016662_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,26 @@ +- args: + permission: + allow_upsert: true + backend_only: false + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - jobid + - painthrs + - bodyhrs + - date + set: {} + role: user + table: + name: scoreboard + schema: public + type: create_insert_permission diff --git a/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..c8cb9c8be --- /dev/null +++ b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_select_permission diff --git a/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..2a83db4ed --- /dev/null +++ b/hasura/migrations/1593189027209_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,27 @@ +- args: + permission: + allow_aggregations: true + backend_only: false + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + computed_fields: [] + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + limit: null + role: user + table: + name: scoreboard + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..db151710e --- /dev/null +++ b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_update_permission diff --git a/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..6228c75ad --- /dev/null +++ b/hasura/migrations/1593189034065_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,25 @@ +- args: + permission: + backend_only: false + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + set: {} + role: user + table: + name: scoreboard + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml new file mode 100644 index 000000000..ed7f1ec9a --- /dev/null +++ b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/down.yaml @@ -0,0 +1,6 @@ +- args: + role: user + table: + name: scoreboard + schema: public + type: drop_delete_permission diff --git a/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml new file mode 100644 index 000000000..7a0786450 --- /dev/null +++ b/hasura/migrations/1593189042050_update_permission_user_public_table_scoreboard/up.yaml @@ -0,0 +1,18 @@ +- args: + permission: + backend_only: false + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + role: user + table: + name: scoreboard + schema: public + type: create_delete_permission diff --git a/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml new file mode 100644 index 000000000..35cb79218 --- /dev/null +++ b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/down.yaml @@ -0,0 +1,5 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" DROP COLUMN "scoreboard_target"; + type: run_sql diff --git a/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml new file mode 100644 index 000000000..e448b94ad --- /dev/null +++ b/hasura/migrations/1593189072315_alter_table_public_bodyshops_add_column_scoreboard_target/up.yaml @@ -0,0 +1,6 @@ +- args: + cascade: false + read_only: false + sql: ALTER TABLE "public"."bodyshops" ADD COLUMN "scoreboard_target" jsonb NULL + DEFAULT jsonb_build_object(); + type: run_sql diff --git a/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..9b9cc2a17 --- /dev/null +++ b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,54 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..2ec6f434e --- /dev/null +++ b/hasura/migrations/1593189083426_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,55 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_select_permission +- args: + permission: + allow_aggregations: false + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - messagingservicesid + - production_config + - region_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - stripe_acct_id + - template_header + - textid + - updated_at + - zip_post + computed_fields: [] + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + role: user + table: + name: bodyshops + schema: public + type: create_select_permission diff --git a/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml new file mode 100644 index 000000000..96048ac73 --- /dev/null +++ b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/down.yaml @@ -0,0 +1,48 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml new file mode 100644 index 000000000..1466f0a71 --- /dev/null +++ b/hasura/migrations/1593189089211_update_permission_user_public_table_bodyshops/up.yaml @@ -0,0 +1,49 @@ +- args: + role: user + table: + name: bodyshops + schema: public + type: drop_update_permission +- args: + permission: + columns: + - accountingconfig + - address1 + - address2 + - appt_length + - city + - country + - created_at + - email + - federal_tax_id + - id + - inhousevendorid + - insurance_vendor_id + - intakechecklist + - invoice_tax_rates + - logo_img_path + - md_order_statuses + - md_responsibility_centers + - md_ro_statuses + - production_config + - scoreboard_target + - shopname + - shoprates + - ssbuckets + - state + - state_tax_id + - updated_at + - zip_post + filter: + associations: + bodyshop: + associations: + user: + authid: + _eq: X-Hasura-User-Id + set: {} + role: user + table: + name: bodyshops + schema: public + type: create_update_permission diff --git a/hasura/migrations/metadata.yaml b/hasura/migrations/metadata.yaml index e3053934d..53ca43aeb 100644 --- a/hasura/migrations/metadata.yaml +++ b/hasura/migrations/metadata.yaml @@ -472,6 +472,7 @@ tables: - messagingservicesid - production_config - region_config + - scoreboard_target - shopname - shoprates - ssbuckets @@ -512,6 +513,7 @@ tables: - md_responsibility_centers - md_ro_statuses - production_config + - scoreboard_target - shopname - shoprates - ssbuckets @@ -1897,6 +1899,13 @@ tables: table: schema: public name: payments + - name: scoreboards + using: + foreign_key_constraint_on: + column: jobid + table: + schema: public + name: scoreboard - name: timetickets using: foreign_key_constraint_on: @@ -3346,6 +3355,86 @@ tables: - active: _eq: true allow_aggregations: true +- table: + schema: public + name: scoreboard + object_relationships: + - name: job + using: + foreign_key_constraint_on: jobid + insert_permissions: + - role: user + permission: + check: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + columns: + - id + - jobid + - painthrs + - bodyhrs + - date + backend_only: false + select_permissions: + - role: user + permission: + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + allow_aggregations: true + update_permissions: + - role: user + permission: + columns: + - date + - bodyhrs + - painthrs + - id + - jobid + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true + check: null + delete_permissions: + - role: user + permission: + filter: + job: + bodyshop: + associations: + _and: + - user: + authid: + _eq: X-Hasura-User-Id + - active: + _eq: true - table: schema: public name: templates