IO-2733 Added countdown timer to PWA Refresh & cache busting meta.

This commit is contained in:
Patrick Fic
2024-09-10 15:54:15 -07:00
parent d0a7b87e04
commit 3bfa556b02
8 changed files with 12872 additions and 10722 deletions

View File

@@ -226,7 +226,9 @@ jobs:
command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
hasura migrate apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 5
hasura metadata apply --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
sleep 10
hasura metadata reload --endpoint https://db.test.romeonline.io/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Test (Rome) - Hasura
@@ -313,7 +315,9 @@ jobs:
command: |
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
hasura migrate apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 5
hasura metadata apply --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
sleep 10
hasura metadata reload --endpoint https://db.test.bodyshop.app/ --admin-secret << parameters.secret >>
- jira/notify:
environment: Test (ImEX) - Hasura
@@ -433,7 +437,7 @@ workflows:
branches:
only: master-AIO
- rome-hasura-migrate:
secret: ${HASURA_PROD_SECRET}
secret: ${HASURA_ROME_PROD_SECRET}
filters:
branches:
only: master-AIO

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,9 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<% if (env.VITE_APP_INSTANCE === 'IMEX') { %>
<link rel="icon" href="/favicon.png"/>
<% } %> <% if (env.VITE_APP_INSTANCE === 'ROME') { %>

View File

@@ -1,13 +1,14 @@
import { AlertOutlined } from "@ant-design/icons";
import { Alert, Button, Col, Row, Space } from "antd";
import { Alert, Button, Col, notification, Row, Space } from "antd";
import i18n from "i18next";
import React, { useEffect } from "react";
import React, { useCallback, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectUpdateAvailable } from "../../redux/application/application.selectors";
import { useRegisterSW } from "virtual:pwa-register/react";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
import useCountDown from "../../utils/countdownHook";
const mapStateToProps = createStructuredSelector({
updateAvailable: selectUpdateAvailable
@@ -19,6 +20,13 @@ const mapDispatchToProps = (dispatch) => ({
export function UpdateAlert({ updateAvailable }) {
const { t } = useTranslation();
const [
timeLeft,
{
start //pause, resume, reset
}
] = useCountDown(180000, 1000);
const {
offlineReady: [offlineReady],
needRefresh: [needRefresh],
@@ -40,11 +48,41 @@ export function UpdateAlert({ updateAvailable }) {
}
});
const ReloadNewVersion = useCallback(() => {
updateServiceWorker(true);
setTimeout(() => {
window.location.reload(true);
}, 2000);
}, [updateServiceWorker]);
useEffect(() => {
if (import.meta.env.DEV) {
console.log(`SW Status => Refresh? ${needRefresh} - offlineReady? ${offlineReady}`);
if (needRefresh) {
start();
}
}, [needRefresh, offlineReady]);
}, [start, needRefresh, offlineReady]);
useEffect(() => {
if (needRefresh && timeLeft < 60000) {
notification.open({
type: "warning",
closable: false,
duration: 65000,
key: "autoupdate",
message: t("general.actions.autoupdate", {
time: (timeLeft / 1000).toFixed(0),
app: InstanceRenderManager({
imex: "$t(titles.imexonline)",
rome: "$t(titles.romeonline)",
promanager: "$t(titles.promanager)"
})
}),
placement: "bottomRight"
});
}
if (needRefresh && timeLeft <= 0) {
ReloadNewVersion();
}
}, [timeLeft, t, needRefresh, ReloadNewVersion]);
if (!needRefresh) return null;
@@ -75,9 +113,10 @@ export function UpdateAlert({ updateAvailable }) {
<Button onClick={() => window.open("https://imex-online.noticeable.news/", "_blank")}>
{i18n.t("general.actions.viewreleasenotes")}
</Button>
<Button type="primary" onClick={() => updateServiceWorker(true)}>
{i18n.t("general.actions.refresh")}
<Button type="primary" onClick={() => ReloadNewVersion()}>
{i18n.t("general.actions.refresh")} {`(${(timeLeft / 1000).toFixed(0)} s)`}
</Button>
<Button onClick={() => start(300000)}>{i18n.t("general.actions.delay")}</Button>
</Space>
</Col>
</Row>

View File

@@ -230,7 +230,7 @@
"markexported": "Mark Exported",
"markforreexport": "Mark for Re-export",
"new": "New Bill",
"nobilllines": "This part has not yet been recieved.",
"nobilllines": "",
"noneselected": "No bill selected.",
"onlycmforinvoiced": "Only credit memos can be entered for any Job that has been invoiced, exported, or voided.",
"printlabels": "Print Labels",
@@ -270,9 +270,9 @@
"testrender": "Test Render"
},
"errors": {
"creatingdefaultview": "Error creating default view.",
"loading": "Unable to load shop details. Please call technical support.",
"saving": "Error encountered while saving. {{message}}",
"creatingdefaultview": "Error creating default view."
"saving": "Error encountered while saving. {{message}}"
},
"fields": {
"ReceivableCustomField": "QBO Receivable Custom Field {{number}}",
@@ -296,8 +296,8 @@
"dailypainttarget": "Scoreboard - Daily Paint Target",
"default_adjustment_rate": "Default Labor Deduction Adjustment Rate",
"deliver": {
"templates": "Delivery Templates",
"require_actual_delivery_date": "Require Actual Delivery"
"require_actual_delivery_date": "Require Actual Delivery",
"templates": "Delivery Templates"
},
"dms": {
"apcontrol": "AP Control Number",
@@ -700,10 +700,10 @@
"workingdays": "Working Days"
},
"successes": {
"save": "Shop configuration saved successfully. ",
"unsavedchanges": "Unsaved changes will be lost. Are you sure you want to continue?",
"areyousure": "Are you sure you want to continue?",
"defaultviewcreated": "Default view created successfully."
"defaultviewcreated": "Default view created successfully.",
"save": "Shop configuration saved successfully. ",
"unsavedchanges": "Unsaved changes will be lost. Are you sure you want to continue?"
},
"validation": {
"centermustexist": "The chosen responsibility center does not exist.",
@@ -1133,8 +1133,8 @@
},
"general": {
"actions": {
"defaults": "Defaults",
"add": "Add",
"autoupdate": "{{app}} will automatically update in {{time}} seconds. Please save all changes.",
"calculate": "Calculate",
"cancel": "Cancel",
"clear": "Clear",
@@ -1142,6 +1142,8 @@
"copied": "Copied!",
"copylink": "Copy Link",
"create": "Create",
"defaults": "Defaults",
"delay": "Delay Update (5 mins)",
"delete": "Delete",
"deleteall": "Delete All",
"deselectall": "Deselect All",
@@ -1153,10 +1155,12 @@
"print": "Print",
"refresh": "Refresh",
"remove": "Remove",
"remove_alert": "Are you sure you want to dismiss the alert?",
"reset": "Reset your changes.",
"resetpassword": "Reset Password",
"save": "Save",
"saveandnew": "Save and New",
"saveas": "Save As",
"selectall": "Select All",
"send": "Send",
"sendbysms": "Send by SMS",
@@ -1164,9 +1168,7 @@
"submit": "Submit",
"tryagain": "Try Again",
"view": "View",
"viewreleasenotes": "See What's Changed",
"remove_alert": "Are you sure you want to dismiss the alert?",
"saveas": "Save As"
"viewreleasenotes": "See What's Changed"
},
"errors": {
"fcm": "You must allow notification permissions to have real time messaging. Click to try again.",
@@ -1181,7 +1183,6 @@
"vehicle": "Vehicle"
},
"labels": {
"unsavedchanges": "Unsaved changes.",
"actions": "Actions",
"areyousure": "Are you sure?",
"barcode": "Barcode",
@@ -1250,6 +1251,7 @@
"tuesday": "Tuesday",
"tvmode": "TV Mode",
"unknown": "Unknown",
"unsavedchanges": "Unsaved changes.",
"username": "Username",
"view": "View",
"wednesday": "Wednesday",
@@ -2739,41 +2741,6 @@
}
},
"production": {
"constants": {
"main_profile": "Default"
},
"options": {
"small": "Small",
"medium": "Medium",
"large": "Large",
"vertical": "Vertical",
"horizontal": "Horizontal"
},
"settings": {
"layout": "Layout",
"information": "Information",
"statistics_title": "Statistics",
"board_settings": "Board Settings",
"filters_title": "Filters",
"filters": {
"md_ins_cos": "Insurance Companies",
"md_estimators": "Estimators"
},
"statistics": {
"total_hours_in_production": "Hours in Production",
"total_lab_in_production": "Body Hours in Production",
"total_lar_in_production": "Refinish Hours in Production",
"total_amount_in_production": "Dollars in Production",
"jobs_in_production": "Jobs in Production",
"total_hours_on_board": "Hours on Board",
"total_lab_on_board": "Body Hours on Board",
"total_lar_on_board": "Refinish Hours on Board",
"total_amount_on_board": "Dollars on Board",
"total_jobs_on_board": "Jobs on Board",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board"
}
},
"actions": {
"addcolumns": "Add Columns",
"bodypriority-clear": "Clear Body Priority",
@@ -2788,29 +2755,23 @@
"suspend": "Suspend",
"unsuspend": "Unsuspend"
},
"constants": {
"main_profile": "Default"
},
"errors": {
"boardupdate": "Error encountered updating Job. {{message}}",
"removing": "Error removing from production board. {{error}}",
"settings": "Error saving board settings: {{error}}",
"name_exists": "A Profile with this name already exists. Please choose a different name.",
"name_required": "Profile name is required."
"name_required": "Profile name is required.",
"removing": "Error removing from production board. {{error}}",
"settings": "Error saving board settings: {{error}}"
},
"labels": {
"kiosk_mode": "Kiosk Mode",
"on": "On",
"off": "Off",
"wide": "Wide",
"tall": "Tall",
"vertical": "Vertical",
"horizontal": "Horizontal",
"orientation": "Board Orientation",
"card_size": "Card Size",
"model_info": "Vehicle Info",
"actual_in": "Actual In",
"addnewprofile": "Add New Profile",
"alert": "Alert",
"tasks": "Tasks",
"alertoff": "Remove alert from Job",
"alerton": "Add alert to Job",
"alerts": "Alerts",
"ats": "Alternative Transportation",
"bodyhours": "B",
"bodypriority": "B/P",
@@ -2820,6 +2781,7 @@
"qbo_usa": "QBO USA"
}
},
"card_size": "Card Size",
"cardcolor": "Colored Cards",
"cardsettings": "Card Settings",
"clm_no": "Claim Number",
@@ -2828,48 +2790,88 @@
"detailpriority": "D/P",
"employeeassignments": "Employee Assignments",
"employeesearch": "Employee Search",
"estimator": "Estimator",
"horizontal": "Horizontal",
"ins_co_nm": "Insurance Company Name",
"jobdetail": "Job Details",
"kiosk_mode": "Kiosk Mode",
"laborhrs": "Labor Hours",
"legend": "Legend:",
"model_info": "Vehicle Info",
"note": "Production Note",
"off": "Off",
"on": "On",
"orientation": "Board Orientation",
"ownr_nm": "Customer Name",
"paintpriority": "P/P",
"partsstatus": "Parts Status",
"estimator": "Estimator",
"subtotal": "Subtotal",
"production_note": "Production Note",
"refinishhours": "R",
"scheduled_completion": "Scheduled Completion",
"selectview": "Select a View",
"stickyheader": "Sticky Header (BETA)",
"sublets": "Sublets",
"subtotal": "Subtotal",
"tall": "Tall",
"tasks": "Tasks",
"totalhours": "Total Hrs ",
"touchtime": "T/T",
"vertical": "Vertical",
"viewname": "View Name",
"alerts": "Alerts",
"addnewprofile": "Add New Profile"
"wide": "Wide"
},
"options": {
"horizontal": "Horizontal",
"large": "Large",
"medium": "Medium",
"small": "Small",
"vertical": "Vertical"
},
"settings": {
"board_settings": "Board Settings",
"filters": {
"md_estimators": "Estimators",
"md_ins_cos": "Insurance Companies"
},
"filters_title": "Filters",
"information": "Information",
"layout": "Layout",
"statistics": {
"jobs_in_production": "Jobs in Production",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"total_amount_in_production": "Dollars in Production",
"total_amount_on_board": "Dollars on Board",
"total_hours_in_production": "Hours in Production",
"total_hours_on_board": "Hours on Board",
"total_jobs_on_board": "Jobs on Board",
"total_lab_in_production": "Body Hours in Production",
"total_lab_on_board": "Body Hours on Board",
"total_lar_in_production": "Refinish Hours in Production",
"total_lar_on_board": "Refinish Hours on Board"
},
"statistics_title": "Statistics"
},
"statistics": {
"currency_symbol": "$",
"hours": "Hours",
"jobs": "Jobs",
"jobs_in_production": "Jobs in Production",
"tasks": "Tasks",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"total_amount_in_production": "Dollars in Production",
"total_amount_on_board": "Dollars on Board",
"total_hours_in_production": "Hours in Production",
"total_hours_on_board": "Hours on Board",
"total_jobs_on_board": "Jobs on Board",
"total_lab_in_production": "Body Hours in Production",
"total_lab_on_board": "Body Hours on Board",
"total_lar_in_production": "Refinish Hours in Production",
"total_lar_on_board": "Refinish Hours on Board"
},
"successes": {
"removed": "Job removed from production."
},
"statistics": {
"total_hours_in_production": "Hours in Production",
"total_lab_in_production": "Body Hours in Production",
"total_lar_in_production": "Refinish Hours in Production",
"total_amount_in_production": "Dollars in Production",
"jobs_in_production": "Jobs in Production",
"total_hours_on_board": "Hours on Board",
"total_lab_on_board": "Body Hours on Board",
"total_lar_on_board": "Refinish Hours on Board",
"total_amount_on_board": "Dollars on Board",
"total_jobs_on_board": "Jobs on Board",
"tasks_in_production": "Tasks in Production",
"tasks_on_board": "Tasks on Board",
"tasks": "Tasks",
"hours": "Hours",
"currency_symbol": "$",
"jobs": "Jobs"
}
},
"profile": {
@@ -3418,6 +3420,18 @@
"vehicledetail": "Vehicle Details {{vehicle}} | {{app}}",
"vehicles": "All Vehicles | {{app}}"
},
"trello": {
"labels": {
"add_card": "Add Card",
"add_lane": "Add Lane",
"cancel": "Cancel",
"delete_lane": "Delete Lane",
"description": "Description",
"label": "Label",
"lane_actions": "Lane Actions",
"title": "Title"
}
},
"tt_approvals": {
"actions": {
"approveselected": "Approve Selected"
@@ -3556,18 +3570,6 @@
"validation": {
"unique_vendor_name": "You must enter a unique vendor name."
}
},
"trello": {
"labels": {
"add_card": "Add Card",
"add_lane": "Add Lane",
"delete_lane": "Delete Lane",
"lane_actions": "Lane Actions",
"title": "Title",
"description": "Description",
"label": "Label",
"cancel": "Cancel"
}
}
}
}

View File

@@ -270,9 +270,9 @@
"testrender": ""
},
"errors": {
"creatingdefaultview": "",
"loading": "No se pueden cargar los detalles de la tienda. Por favor llame al soporte técnico.",
"saving": "",
"creatingdefaultview": ""
"saving": ""
},
"fields": {
"ReceivableCustomField": "",
@@ -296,8 +296,8 @@
"dailypainttarget": "",
"default_adjustment_rate": "",
"deliver": {
"templates": "",
"require_actual_delivery_date": ""
"require_actual_delivery_date": "",
"templates": ""
},
"dms": {
"apcontrol": "",
@@ -700,10 +700,10 @@
"workingdays": ""
},
"successes": {
"save": "",
"unsavedchanges": "",
"areyousure": "",
"defaultviewcreated": ""
"defaultviewcreated": "",
"save": "",
"unsavedchanges": ""
},
"validation": {
"centermustexist": "",
@@ -1133,8 +1133,8 @@
},
"general": {
"actions": {
"defaults": "defaults",
"add": "",
"autoupdate": "",
"calculate": "",
"cancel": "",
"clear": "",
@@ -1142,6 +1142,8 @@
"copied": "",
"copylink": "",
"create": "",
"defaults": "defaults",
"delay": "",
"delete": "Borrar",
"deleteall": "",
"deselectall": "",
@@ -1153,10 +1155,12 @@
"print": "",
"refresh": "",
"remove": "",
"remove_alert": "",
"reset": " Restablecer a original.",
"resetpassword": "",
"save": "Salvar",
"saveandnew": "",
"saveas": "",
"selectall": "",
"send": "",
"sendbysms": "",
@@ -1164,9 +1168,7 @@
"submit": "",
"tryagain": "",
"view": "",
"viewreleasenotes": "",
"remove_alert": "",
"saveas": ""
"viewreleasenotes": ""
},
"errors": {
"fcm": "",
@@ -1181,7 +1183,6 @@
"vehicle": ""
},
"labels": {
"unsavedchanges": "",
"actions": "Comportamiento",
"areyousure": "",
"barcode": "código de barras",
@@ -1250,6 +1251,7 @@
"tuesday": "",
"tvmode": "",
"unknown": "Desconocido",
"unsavedchanges": "",
"username": "",
"view": "",
"wednesday": "",
@@ -2739,41 +2741,6 @@
}
},
"production": {
"constants": {
"main_profile": ""
},
"options": {
"small": "",
"medium": "",
"large": "",
"vertical": "",
"horizontal": ""
},
"settings": {
"layout": "",
"information": "",
"statistics_title": "",
"board_settings": "",
"filters_title": "",
"filters": {
"md_ins_cos": "",
"md_estimators": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": ""
}
},
"actions": {
"addcolumns": "",
"bodypriority-clear": "",
@@ -2788,29 +2755,23 @@
"suspend": "",
"unsuspend": ""
},
"constants": {
"main_profile": ""
},
"errors": {
"boardupdate": "",
"removing": "",
"settings": "",
"name_exists": "",
"name_required": ""
"name_required": "",
"removing": "",
"settings": ""
},
"labels": {
"kiosk_mode": "",
"on": "",
"off": "",
"wide": "",
"tall": "",
"vertical": "",
"horizontal": "",
"orientation": "",
"card_size": "",
"model_info": "",
"actual_in": "",
"addnewprofile": "",
"alert": "",
"tasks": "",
"alertoff": "",
"alerton": "",
"alerts": "",
"ats": "",
"bodyhours": "",
"bodypriority": "",
@@ -2820,6 +2781,7 @@
"qbo_usa": ""
}
},
"card_size": "",
"cardcolor": "",
"cardsettings": "",
"clm_no": "",
@@ -2828,48 +2790,88 @@
"detailpriority": "",
"employeeassignments": "",
"employeesearch": "",
"estimator": "",
"horizontal": "",
"ins_co_nm": "",
"jobdetail": "",
"kiosk_mode": "",
"laborhrs": "",
"legend": "",
"model_info": "",
"note": "",
"off": "",
"on": "",
"orientation": "",
"ownr_nm": "",
"paintpriority": "",
"partsstatus": "",
"estimator": "",
"subtotal": "",
"production_note": "",
"refinishhours": "",
"scheduled_completion": "",
"selectview": "",
"stickyheader": "",
"sublets": "",
"subtotal": "",
"tall": "",
"tasks": "",
"totalhours": "",
"touchtime": "",
"vertical": "",
"viewname": "",
"alerts": "",
"addnewprofile": ""
"wide": ""
},
"options": {
"horizontal": "",
"large": "",
"medium": "",
"small": "",
"vertical": ""
},
"settings": {
"board_settings": "",
"filters": {
"md_estimators": "",
"md_ins_cos": ""
},
"filters_title": "",
"information": "",
"layout": "",
"statistics": {
"jobs_in_production": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"statistics_title": ""
},
"statistics": {
"currency_symbol": "",
"hours": "",
"jobs": "",
"jobs_in_production": "",
"tasks": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"successes": {
"removed": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": "",
"tasks": "",
"hours": "",
"currency_symbol": "",
"jobs": ""
}
},
"profile": {
@@ -3418,6 +3420,18 @@
"vehicledetail": "Detalles del vehículo {{vehicle}} | {{app}}",
"vehicles": "Todos los vehiculos | {{app}}"
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"cancel": "",
"delete_lane": "",
"description": "",
"label": "",
"lane_actions": "",
"title": ""
}
},
"tt_approvals": {
"actions": {
"approveselected": ""
@@ -3556,18 +3570,6 @@
"validation": {
"unique_vendor_name": ""
}
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"delete_lane": "",
"lane_actions": "",
"title": "",
"description": "",
"label": "",
"cancel": ""
}
}
}
}

View File

@@ -270,9 +270,9 @@
"testrender": ""
},
"errors": {
"creatingdefaultview": "",
"loading": "Impossible de charger les détails de la boutique. Veuillez appeler le support technique.",
"saving": "",
"creatingdefaultview": ""
"saving": ""
},
"fields": {
"ReceivableCustomField": "",
@@ -296,8 +296,8 @@
"dailypainttarget": "",
"default_adjustment_rate": "",
"deliver": {
"templates": "",
"require_actual_delivery_date": ""
"require_actual_delivery_date": "",
"templates": ""
},
"dms": {
"apcontrol": "",
@@ -700,10 +700,10 @@
"workingdays": ""
},
"successes": {
"save": "",
"unsavedchanges": "",
"areyousure": "",
"defaultviewcreated": ""
"defaultviewcreated": "",
"save": "",
"unsavedchanges": ""
},
"validation": {
"centermustexist": "",
@@ -1133,8 +1133,8 @@
},
"general": {
"actions": {
"defaults": "",
"add": "",
"autoupdate": "",
"calculate": "",
"cancel": "",
"clear": "",
@@ -1142,6 +1142,8 @@
"copied": "",
"copylink": "",
"create": "",
"defaults": "",
"delay": "",
"delete": "Effacer",
"deleteall": "",
"deselectall": "",
@@ -1153,10 +1155,12 @@
"print": "",
"refresh": "",
"remove": "",
"remove_alert": "",
"reset": " Rétablir l'original.",
"resetpassword": "",
"save": "sauvegarder",
"saveandnew": "",
"saveas": "",
"selectall": "",
"send": "",
"sendbysms": "",
@@ -1164,9 +1168,7 @@
"submit": "",
"tryagain": "",
"view": "",
"viewreleasenotes": "",
"remove_alert": "",
"saveas": ""
"viewreleasenotes": ""
},
"errors": {
"fcm": "",
@@ -1181,7 +1183,6 @@
"vehicle": ""
},
"labels": {
"unsavedchanges": "",
"actions": "actes",
"areyousure": "",
"barcode": "code à barre",
@@ -1250,6 +1251,7 @@
"tuesday": "",
"tvmode": "",
"unknown": "Inconnu",
"unsavedchanges": "",
"username": "",
"view": "",
"wednesday": "",
@@ -2739,41 +2741,6 @@
}
},
"production": {
"constants": {
"main_profile": ""
},
"options": {
"small": "",
"medium": "",
"large": "",
"vertical": "",
"horizontal": ""
},
"settings": {
"layout": "",
"information": "",
"statistics_title": "",
"board_settings": "",
"filters_title": "",
"filters": {
"md_ins_cos": "",
"md_estimators": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": ""
}
},
"actions": {
"addcolumns": "",
"bodypriority-clear": "",
@@ -2788,29 +2755,23 @@
"suspend": "",
"unsuspend": ""
},
"constants": {
"main_profile": ""
},
"errors": {
"boardupdate": "",
"removing": "",
"settings": "",
"name_exists": "",
"name_required": ""
"name_required": "",
"removing": "",
"settings": ""
},
"labels": {
"kiosk_mode": "",
"on": "",
"off": "",
"wide": "",
"tall": "",
"vertical": "",
"horizontal": "",
"orientation": "",
"card_size": "",
"model_info": "",
"actual_in": "",
"addnewprofile": "",
"alert": "",
"tasks": "",
"alertoff": "",
"alerton": "",
"alerts": "",
"ats": "",
"bodyhours": "",
"bodypriority": "",
@@ -2820,6 +2781,7 @@
"qbo_usa": ""
}
},
"card_size": "",
"cardcolor": "",
"cardsettings": "",
"clm_no": "",
@@ -2828,48 +2790,88 @@
"detailpriority": "",
"employeeassignments": "",
"employeesearch": "",
"estimator": "",
"horizontal": "",
"ins_co_nm": "",
"jobdetail": "",
"kiosk_mode": "",
"laborhrs": "",
"legend": "",
"model_info": "",
"note": "",
"off": "",
"on": "",
"orientation": "",
"ownr_nm": "",
"paintpriority": "",
"partsstatus": "",
"estimator": "",
"subtotal": "",
"production_note": "",
"refinishhours": "",
"scheduled_completion": "",
"selectview": "",
"stickyheader": "",
"sublets": "",
"subtotal": "",
"tall": "",
"tasks": "",
"totalhours": "",
"touchtime": "",
"vertical": "",
"viewname": "",
"alerts": "",
"addnewprofile": ""
"wide": ""
},
"options": {
"horizontal": "",
"large": "",
"medium": "",
"small": "",
"vertical": ""
},
"settings": {
"board_settings": "",
"filters": {
"md_estimators": "",
"md_ins_cos": ""
},
"filters_title": "",
"information": "",
"layout": "",
"statistics": {
"jobs_in_production": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"statistics_title": ""
},
"statistics": {
"currency_symbol": "",
"hours": "",
"jobs": "",
"jobs_in_production": "",
"tasks": "",
"tasks_in_production": "",
"tasks_on_board": "",
"total_amount_in_production": "",
"total_amount_on_board": "",
"total_hours_in_production": "",
"total_hours_on_board": "",
"total_jobs_on_board": "",
"total_lab_in_production": "",
"total_lab_on_board": "",
"total_lar_in_production": "",
"total_lar_on_board": ""
},
"successes": {
"removed": ""
},
"statistics": {
"total_hours_in_production": "",
"total_lab_in_production": "",
"total_lar_in_production": "",
"total_amount_in_production": "",
"jobs_in_production": "",
"total_hours_on_board": "",
"total_lab_on_board": "",
"total_lar_on_board": "",
"total_amount_on_board": "",
"total_jobs_on_board": "",
"tasks_in_production": "",
"tasks_on_board": "",
"tasks": "",
"hours": "",
"currency_symbol": "",
"jobs": ""
}
},
"profile": {
@@ -3418,6 +3420,18 @@
"vehicledetail": "Détails du véhicule {{vehicle} | {{app}}",
"vehicles": "Tous les véhicules | {{app}}"
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"cancel": "",
"delete_lane": "",
"description": "",
"label": "",
"lane_actions": "",
"title": ""
}
},
"tt_approvals": {
"actions": {
"approveselected": ""
@@ -3556,18 +3570,6 @@
"validation": {
"unique_vendor_name": ""
}
},
"trello": {
"labels": {
"add_card": "",
"add_lane": "",
"delete_lane": "",
"lane_actions": "",
"title": "",
"description": "",
"label": "",
"cancel": ""
}
}
}
}

View File

@@ -0,0 +1,84 @@
import React from "react";
const useCountDown = (timeToCount = 60 * 1000, interval = 1000) => {
const [timeLeft, setTimeLeft] = React.useState(0);
const timer = React.useRef({});
const run = (ts) => {
if (!timer.current.started) {
timer.current.started = ts;
timer.current.lastInterval = ts;
}
const localInterval = Math.min(interval, timer.current.timeLeft || Infinity);
if (ts - timer.current.lastInterval >= localInterval) {
timer.current.lastInterval += localInterval;
setTimeLeft((timeLeft) => {
timer.current.timeLeft = timeLeft - localInterval;
return timer.current.timeLeft;
});
}
if (ts - timer.current.started < timer.current.timeToCount) {
timer.current.requestId = window.requestAnimationFrame(run);
} else {
timer.current = {};
setTimeLeft(0);
}
};
const start = React.useCallback(
(ttc) => {
window.cancelAnimationFrame(timer.current.requestId);
const newTimeToCount = ttc !== undefined ? ttc : timeToCount;
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = newTimeToCount;
timer.current.requestId = window.requestAnimationFrame(run);
setTimeLeft(newTimeToCount);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const pause = React.useCallback(() => {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.started = null;
timer.current.lastInterval = null;
timer.current.timeToCount = timer.current.timeLeft;
}, []);
const resume = React.useCallback(
() => {
if (!timer.current.started && timer.current.timeLeft > 0) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current.requestId = window.requestAnimationFrame(run);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
const reset = React.useCallback(() => {
if (timer.current.timeLeft) {
window.cancelAnimationFrame(timer.current.requestId);
timer.current = {};
setTimeLeft(0);
}
}, []);
const actions = React.useMemo(
() => ({ start, pause, resume, reset }), // eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
React.useEffect(() => {
return () => window.cancelAnimationFrame(timer.current.requestId);
}, []);
return [timeLeft, actions];
};
export default useCountDown;