diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index 2437979b3..4655c701d 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -3,11 +3,10 @@ import * as Sentry from "@sentry/react"; import { SplitFactoryProvider, useSplitClient } from "@splitsoftware/splitio-react"; import { ConfigProvider } from "antd"; import enLocale from "antd/es/locale/en_US"; -import { useEffect, useMemo } from "react"; +import { useEffect } from "react"; import { CookiesProvider } from "react-cookie"; import { useTranslation } from "react-i18next"; -import { connect, useSelector } from "react-redux"; -import { createStructuredSelector } from "reselect"; +import { useDispatch, useSelector } from "react-redux"; import GlobalLoadingBar from "../components/global-loading-bar/global-loading-bar.component"; import { setDarkMode } from "../redux/application/application.actions"; import { selectDarkMode } from "../redux/application/application.selectors"; @@ -28,93 +27,99 @@ const config = { function SplitClientProvider({ children }) { const imexshopid = useSelector((state) => state.user.imexshopid); const splitClient = useSplitClient({ key: imexshopid || "anon" }); + useEffect(() => { - if (splitClient && imexshopid) { + if (import.meta.env.DEV && splitClient && imexshopid) { console.log(`Split client initialized with key: ${imexshopid}, isReady: ${splitClient.isReady}`); } }, [splitClient, imexshopid]); + return children; } -const mapStateToProps = createStructuredSelector({ - currentUser: selectCurrentUser -}); - -const mapDispatchToProps = (dispatch) => ({ - setDarkMode: (isDarkMode) => dispatch(setDarkMode(isDarkMode)), - signOutStart: () => dispatch(signOutStart()) -}); - -function AppContainer({ currentUser, setDarkMode, signOutStart }) { +function AppContainer() { const { t } = useTranslation(); + const dispatch = useDispatch(); + + const currentUser = useSelector(selectCurrentUser); const isDarkMode = useSelector(selectDarkMode); - const theme = useMemo(() => getTheme(isDarkMode), [isDarkMode]); + + const theme = () => getTheme(isDarkMode); + + const antdInput = () => ({ autoComplete: "new-password" }); + + const antdForm = () => ({ + validateMessages: { + required: t("general.validation.required", { label: "${label}" }) + } + }); // Global seamless logout listener with redirect to /signin useEffect(() => { const handleSeamlessLogout = (event) => { if (event.data?.type !== "seamlessLogoutRequest") return; - const requestOrigin = event.origin; + // Only accept messages from the parent window + if (event.source !== window.parent) return; + + const targetOrigin = event.origin || "*"; if (currentUser?.authorized !== true) { - window.parent.postMessage( - { type: "seamlessLogoutResponse", status: "already_logged_out" }, - requestOrigin || "*" - ); + window.parent?.postMessage({ type: "seamlessLogoutResponse", status: "already_logged_out" }, targetOrigin); return; } - signOutStart(); - window.parent.postMessage({ type: "seamlessLogoutResponse", status: "logged_out" }, requestOrigin || "*"); + dispatch(signOutStart()); + window.parent?.postMessage({ type: "seamlessLogoutResponse", status: "logged_out" }, targetOrigin); }; window.addEventListener("message", handleSeamlessLogout); return () => { window.removeEventListener("message", handleSeamlessLogout); }; - }, [signOutStart, currentUser]); + }, [dispatch, currentUser?.authorized]); - // Update data-theme attribute + // Update data-theme attribute (no cleanup to avoid transient style churn) useEffect(() => { - document.documentElement.setAttribute("data-theme", isDarkMode ? "dark" : "light"); - return () => document.documentElement.removeAttribute("data-theme"); + document.documentElement.dataset.theme = isDarkMode ? "dark" : "light"; }, [isDarkMode]); // Sync darkMode with localStorage useEffect(() => { - if (currentUser?.uid) { - const savedMode = localStorage.getItem(`dark-mode-${currentUser.uid}`); - if (savedMode !== null) { - setDarkMode(JSON.parse(savedMode)); - } else { - setDarkMode(false); - } - } else { - setDarkMode(false); + const uid = currentUser?.uid; + + if (!uid) { + dispatch(setDarkMode(false)); + return; } - }, [currentUser?.uid, setDarkMode]); + + const key = `dark-mode-${uid}`; + const raw = localStorage.getItem(key); + + if (raw == null) { + dispatch(setDarkMode(false)); + return; + } + + try { + dispatch(setDarkMode(Boolean(JSON.parse(raw)))); + } catch { + dispatch(setDarkMode(false)); + } + }, [currentUser?.uid, dispatch]); // Persist darkMode useEffect(() => { - if (currentUser?.uid) { - localStorage.setItem(`dark-mode-${currentUser.uid}`, JSON.stringify(isDarkMode)); - } + const uid = currentUser?.uid; + if (!uid) return; + + localStorage.setItem(`dark-mode-${uid}`, JSON.stringify(isDarkMode)); }, [isDarkMode, currentUser?.uid]); return ( - + @@ -127,4 +132,4 @@ function AppContainer({ currentUser, setDarkMode, signOutStart }) { ); } -export default Sentry.withProfiler(connect(mapStateToProps, mapDispatchToProps)(AppContainer)); +export default Sentry.withProfiler(AppContainer); diff --git a/client/src/components/bill-delete-button/bill-delete-button.component.jsx b/client/src/components/bill-delete-button/bill-delete-button.component.jsx index 9c591fd5a..a9741d088 100644 --- a/client/src/components/bill-delete-button/bill-delete-button.component.jsx +++ b/client/src/components/bill-delete-button/bill-delete-button.component.jsx @@ -77,13 +77,7 @@ export function BillDeleteButton({ bill, jobid, callback, insertAuditTrail }) { return ( }> - + + /> ); return ( @@ -196,6 +195,7 @@ export function BillFormItemsExtendedFormItem({ + /> ); } diff --git a/client/src/components/bill-form/bill-form.lines.component.jsx b/client/src/components/bill-form/bill-form.lines.component.jsx index 5b4a5ca8c..ad81b683e 100644 --- a/client/src/components/bill-form/bill-form.lines.component.jsx +++ b/client/src/components/bill-form/bill-form.lines.component.jsx @@ -564,11 +564,10 @@ export function BillEnterModalLinesComponent({ {() => ( + /> {Simple_Inventory.treatment === "on" && ( diff --git a/client/src/components/bills-list-table/bills-list-table.component.jsx b/client/src/components/bills-list-table/bills-list-table.component.jsx index 166cd0b5b..9de0b7b1c 100644 --- a/client/src/components/bills-list-table/bills-list-table.component.jsx +++ b/client/src/components/bills-list-table/bills-list-table.component.jsx @@ -84,15 +84,14 @@ export function BillsListTableComponent({ } }); }} - > - - + icon={} + /> + - {record.isinhouse && ( - + + ); } diff --git a/client/src/components/contracts-list/contracts-list.component.jsx b/client/src/components/contracts-list/contracts-list.component.jsx index 2a76d8630..6b7e69dd7 100644 --- a/client/src/components/contracts-list/contracts-list.component.jsx +++ b/client/src/components/contracts-list/contracts-list.component.jsx @@ -156,9 +156,8 @@ export function ContractsList({ bodyshop, loading, contracts, refetch, total, se )} - + + diff --git a/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx index fc47e3df6..5638b7a84 100644 --- a/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx +++ b/client/src/components/csi-response-list-paginated/csi-response-list-paginated.component.jsx @@ -85,13 +85,7 @@ export default function CsiResponseListPaginated({ refetch, loading, responses, }; return ( - refetch()}> - - - } - > + refetch()} icon={} />}> - + diff --git a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx index 2ca64d997..77e887d07 100644 --- a/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx +++ b/client/src/components/dms-allocations-summary-ap/dms-allocations-summary-ap.component.jsx @@ -1,6 +1,6 @@ import { SyncOutlined } from "@ant-design/icons"; import { Button, Card, Form, Input, Table } from "antd"; -import { useEffect, useState, useRef } from "react"; +import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -111,9 +111,8 @@ export function DmsAllocationsSummaryAp({ socket, bodyshop, billids, title }) { onClick={() => { socket.emit("pbs-calculate-allocations-ap", billids, (ack) => setAllocationsSummary(ack)); }} - > - - + icon={} + /> } >
- - - } + extra={ - } + extra={ + + icon={} + /> + ) @@ -155,9 +155,9 @@ export function JobsList({ refetch, loading, jobs, total, setInventoryUpsertCont context: {} }); }} - > - - + icon={} + /> + - + + + icon={} + /> } >
diff --git a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx index d84b8f526..907fe17d2 100644 --- a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx +++ b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx @@ -61,9 +61,12 @@ export default function JobIntakeTemplateList({ templates }) { renderItem={(template) => ( renderTemplate(template)}> - - + + icon={} + /> )} + icon={} + /> + {(record.manual_line || jobIsPrivate) && !technician && ( + icon={} + /> )} ) @@ -542,9 +540,7 @@ export function JobLinesComponent({ title={t("jobs.labels.estimatelines")} extra={ - + @@ -641,6 +637,7 @@ export function JobLinesComponent({ {!isPartsEntry && ( )} diff --git a/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx b/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx index d3807b615..4f088697d 100644 --- a/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx +++ b/client/src/components/job-line-convert-to-labor/job-line-convert-to-labor.component.jsx @@ -187,9 +187,8 @@ export function JobLineConvertToLabor({ loading={loading} onClick={handleClick} {...otherBtnProps} - > - - + icon={} + /> )} diff --git a/client/src/components/job-payments/job-payments.component.jsx b/client/src/components/job-payments/job-payments.component.jsx index 6afcb9ea7..37342aa83 100644 --- a/client/src/components/job-payments/job-payments.component.jsx +++ b/client/src/components/job-payments/job-payments.component.jsx @@ -107,9 +107,8 @@ export function JobPayments({ job, bodyshop, setPaymentContext, setCardPaymentCo context: record }); }} - > - - + icon={} + /> 0) return ( - ); diff --git a/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx index ce5c45ece..aa4c74d79 100644 --- a/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx +++ b/client/src/components/jobs-admin-change-status/jobs-admin-change.status.component.jsx @@ -53,10 +53,8 @@ export function JobsAdminStatus({ insertAuditTrail, bodyshop, job }) { return ( - ); diff --git a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx index c8dbd1065..23aa15168 100644 --- a/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx +++ b/client/src/components/jobs-available-scan/jobs-available-scan.component.jsx @@ -94,11 +94,7 @@ export function JobsAvailableScan({ partnerVersion, refetch }) { { title: t("general.labels.actions"), key: "actions", - render: (text, record) => ( - - ) + render: (text, record) => + /> - - + icon={} + /> {!isClosed && ( <> - - + + icon={} + /> ); diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx index 2cdd24a06..90efce131 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.predefined.component.jsx @@ -56,9 +56,8 @@ export default function JobsCreateVehicleInfoPredefined({ disabled, form }) { setOpen(false); setSearch(""); }} - > - - + icon={} + /> ) } ]} diff --git a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx index 8e62c5988..6855fdfe9 100644 --- a/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx +++ b/client/src/components/jobs-detail-header-actions/jobs-detail-header-actions.component.jsx @@ -1286,9 +1286,8 @@ export function JobsDetailHeaderActions({ open={dropdownOpen} onOpenChange={handleDropdownOpenChange} > - diff --git a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx index a6cd07770..969b49ea1 100644 --- a/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx +++ b/client/src/components/jobs-documents-gallery/jobs-documents-gallery.component.jsx @@ -128,9 +128,7 @@ function JobsDocumentsComponent({ - + + icon={} + /> {!billId && ( diff --git a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx index f4c40fee8..ff4c8dda8 100644 --- a/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx +++ b/client/src/components/jobs-documents-local-gallery/jobs-documents-local-gallery.container.jsx @@ -102,9 +102,8 @@ export function JobsDocumentsLocalGallery({ } } }} - > - - + icon={} + /> diff --git a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx index 0048ecdb2..47c8ffd5f 100644 --- a/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx +++ b/client/src/components/jobs-find-modal/jobs-find-modal.component.jsx @@ -179,9 +179,8 @@ export default function JobsFindModalComponent({ onClick={() => { jobsListRefetch(); }} - > - - + icon={} + /> { diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx index 70a2f27ef..ec9b77b59 100644 --- a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -224,9 +224,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) { )} - + + + + icon={} + /> ({readyStatuses && readyStatuses.join(", ")}) - + + icon={} + /> } > diff --git a/client/src/components/notification-center/notification-center.component.jsx b/client/src/components/notification-center/notification-center.component.jsx index 0702447c7..439335c40 100644 --- a/client/src/components/notification-center/notification-center.component.jsx +++ b/client/src/components/notification-center/notification-center.component.jsx @@ -24,6 +24,7 @@ const NotificationCenterComponent = ({ onNotificationClick, unreadCount, isEmployee, + isDarkMode, ref }) => { const { t } = useTranslation(); @@ -112,14 +113,16 @@ const NotificationCenterComponent = ({ ) : ( - +
+ +
)} ); diff --git a/client/src/components/notification-center/notification-center.container.jsx b/client/src/components/notification-center/notification-center.container.jsx index 617bf1569..c0bec13d0 100644 --- a/client/src/components/notification-center/notification-center.container.jsx +++ b/client/src/components/notification-center/notification-center.container.jsx @@ -5,6 +5,7 @@ import NotificationCenterComponent from "./notification-center.component"; import { GET_NOTIFICATIONS } from "../../graphql/notifications.queries"; import { createStructuredSelector } from "reselect"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js"; +import { selectDarkMode } from "../../redux/application/application.selectors.js"; import day from "../../utils/day.js"; import { INITIAL_NOTIFICATIONS, useSocket } from "../../contexts/SocketIO/useSocket.js"; import { useIsEmployee } from "../../utils/useIsEmployee.js"; @@ -22,7 +23,7 @@ const NOTIFICATION_POLL_INTERVAL_SECONDS = 60; * @returns {JSX.Element} * @constructor */ -const NotificationCenterContainer = ({ visible, onClose, bodyshop, unreadCount, currentUser }) => { +const NotificationCenterContainer = ({ visible, onClose, bodyshop, unreadCount, currentUser, isDarkMode }) => { const [showUnreadOnly, setShowUnreadOnly] = useState(false); const [notifications, setNotifications] = useState([]); const [isLoading, setIsLoading] = useState(false); @@ -213,13 +214,15 @@ const NotificationCenterContainer = ({ visible, onClose, bodyshop, unreadCount, loadMore={loadMore} onNotificationClick={handleNotificationClick} unreadCount={unreadCount} + isDarkMode={isDarkMode} /> ); }; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, - currentUser: selectCurrentUser + currentUser: selectCurrentUser, + isDarkMode: selectDarkMode }); export default connect(mapStateToProps, null)(NotificationCenterContainer); diff --git a/client/src/components/notification-center/notification-center.styles.scss b/client/src/components/notification-center/notification-center.styles.scss index 98e2c6890..f897df3d6 100644 --- a/client/src/components/notification-center/notification-center.styles.scss +++ b/client/src/components/notification-center/notification-center.styles.scss @@ -173,3 +173,11 @@ } } } + +.notification-center--dark { + color-scheme: dark; +} + +.notification-center--light { + color-scheme: light; +} diff --git a/client/src/components/owners-list/owners-list.component.jsx b/client/src/components/owners-list/owners-list.component.jsx index 9959af213..f495a04a4 100644 --- a/client/src/components/owners-list/owners-list.component.jsx +++ b/client/src/components/owners-list/owners-list.component.jsx @@ -99,9 +99,7 @@ export default function OwnersListComponent({ loading, owners, total, refetch }) )} - + - + + + icon={} + /> )} - + + /> setCaBcEtfTableContext()}>{t("payments.labels.ca_bc_etf_table")} )} - + + + icon={} + /> - - , + icon={} + />, + icon={} + /> ]} > diff --git a/client/src/components/report-center-modal/report-center-modal.component.jsx b/client/src/components/report-center-modal/report-center-modal.component.jsx index b0789e732..c02c5fb60 100644 --- a/client/src/components/report-center-modal/report-center-modal.component.jsx +++ b/client/src/components/report-center-modal/report-center-modal.component.jsx @@ -146,7 +146,9 @@ export function ReportCenterModalComponent({ reportCenterModal, bodyshop }) {
setSearch(e.target.value)} value={search} /> -
); diff --git a/client/src/components/task-center/task-center.container.jsx b/client/src/components/task-center/task-center.container.jsx index 5dd04b340..2aa2b403a 100644 --- a/client/src/components/task-center/task-center.container.jsx +++ b/client/src/components/task-center/task-center.container.jsx @@ -3,6 +3,7 @@ import { useQuery } from "@apollo/client/react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors"; +import { selectDarkMode } from "../../redux/application/application.selectors.js"; import { INITIAL_TASKS, TASKS_CENTER_POLL_INTERVAL, useSocket } from "../../contexts/SocketIO/useSocket"; import { useIsEmployee } from "../../utils/useIsEmployee"; import TaskCenterComponent from "./task-center.component"; @@ -11,7 +12,8 @@ import { QUERY_TASKS_NO_DUE_DATE_PAGINATED, QUERY_TASKS_WITH_DUE_DATES } from ". const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, - currentUser: selectCurrentUser + currentUser: selectCurrentUser, + isDarkMode: selectDarkMode }); const mapDispatchToProps = (dispatch) => ({ @@ -24,7 +26,8 @@ const TaskCenterContainer = ({ bodyshop, currentUser, setTaskUpsertContext, - incompleteTaskCount + incompleteTaskCount, + isDarkMode }) => { const [tasks, setTasks] = useState([]); const { isConnected } = useSocket(); @@ -128,6 +131,7 @@ const TaskCenterContainer = ({ hasMore={hasMore} createNewTask={createNewTask} incompleteTaskCount={incompleteTaskCount} + isDarkMode={isDarkMode} /> ); }; diff --git a/client/src/components/task-center/task-center.styles.scss b/client/src/components/task-center/task-center.styles.scss index 411158e54..aaa622d74 100644 --- a/client/src/components/task-center/task-center.styles.scss +++ b/client/src/components/task-center/task-center.styles.scss @@ -141,3 +141,11 @@ text-align: center; } } + +.task-center--dark { + color-scheme: dark; +} + +.task-center--light { + color-scheme: light; +} diff --git a/client/src/components/task-list/task-list.component.jsx b/client/src/components/task-list/task-list.component.jsx index 1bb350ca4..7aa0447e7 100644 --- a/client/src/components/task-list/task-list.component.jsx +++ b/client/src/components/task-list/task-list.component.jsx @@ -334,11 +334,9 @@ function TaskListComponent({ checked={deleted === "true"} onChange={(value) => handleSwitchChange("deleted", value)} /> - - diff --git a/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx index 529a5ffcb..de15aa46c 100644 --- a/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx +++ b/client/src/components/tech-lookup-jobs-drawer/tech-lookup-jobs-drawer.component.jsx @@ -76,6 +76,7 @@ export function TechLookupJobsDrawer({ bodyshop, setPrintCenterContext }) { title={data.jobs_by_pk.ro_number || t("general.labels.na")} extra={ } diff --git a/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx index b4c4785b5..ab5f73bed 100644 --- a/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx +++ b/client/src/components/tech-lookup-jobs-list/tech-lookup-jobs-list.component.jsx @@ -158,9 +158,7 @@ export function TechLookupJobsList({ bodyshop }) { - + @@ -112,11 +123,8 @@ export default function TimeTicketCalculatorComponent({ placement="right" destroyOnHidden > - ); diff --git a/client/src/components/time-ticket-list/time-ticket-list.component.jsx b/client/src/components/time-ticket-list/time-ticket-list.component.jsx index d166eeb68..43c222eee 100644 --- a/client/src/components/time-ticket-list/time-ticket-list.component.jsx +++ b/client/src/components/time-ticket-list/time-ticket-list.component.jsx @@ -322,9 +322,8 @@ export function TimeTicketList({ onClick={async () => { refetch(); }} - > - - + icon={} + /> } > diff --git a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx index a8d5a3384..35926e16c 100644 --- a/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx +++ b/client/src/components/time-ticket-modal/time-ticket-modal.component.jsx @@ -184,8 +184,8 @@ export function TimeTicketModalComponent({ }} -