shify ,cycle , co-driver (date and time)

dilmurod
Dilmurod 4 days ago
parent 428d4a7137
commit a2a90b1184

@ -26,6 +26,7 @@
"lodash": "^4.17.21",
"moment-timezone": "^0.5.43",
"react": "^18.2.0",
"react-country-flag": "^3.1.0",
"react-dom": "^18.2.0",
"react-final-form": "^6.5.9",
"react-icons": "^4.11.0",

@ -638,6 +638,7 @@ const AccountingCurrent: React.FC = () => {
placeholder="Team"
onChange={(value: any) => setTeam(value)}
options={teamOptions}
allowClear
/>
<Select
style={{ width: 260 }}

@ -1,6 +1,6 @@
import { Modal, Form, Input, DatePicker, Switch } from "antd";
import { Modal, Form, Input, Switch, Row, Col } from "antd";
import { useState } from "react";
import dayjs from "dayjs";
import { TTask } from "../../../types/Tasks/TTasks";
interface ShiftAndCoDriverCreateModalProps {
@ -21,14 +21,7 @@ const ShiftAndCoDriverCreateModal: React.FC<
try {
const values = await form.validateFields();
const formattedValues = Object.fromEntries(
Object.entries(values).map(([key, value]) => [
key,
dayjs.isDayjs(value) ? value.format("YYYY-MM-DD HH:mm:ss") : value,
])
);
onOk(formattedValues);
onOk(values);
form.resetFields();
} catch (err) {
console.log("Validation error:", err);
@ -56,11 +49,7 @@ const ShiftAndCoDriverCreateModal: React.FC<
name="shift_date"
rules={[{ required: true, message: "Please select date" }]}
>
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
<Input placeholder="Date and Time" />
</Form.Item>
<Form.Item
@ -78,11 +67,7 @@ const ShiftAndCoDriverCreateModal: React.FC<
name="cycle_date"
rules={[{ required: true, message: "Please select date" }]}
>
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
<Input placeholder="Date and Time" />
</Form.Item>
<Form.Item
@ -101,7 +86,11 @@ const ShiftAndCoDriverCreateModal: React.FC<
onChange={(checked) => {
setNeedsPickUp(checked);
if (!checked) {
form.resetFields(["pickup_date", "cycle_location"]);
form.resetFields([
"pickup_date",
"pickup_location",
"pickup_time",
]);
}
}}
/>
@ -109,21 +98,30 @@ const ShiftAndCoDriverCreateModal: React.FC<
{needsPickUp && (
<>
<Form.Item
label="Pick Up Date"
name="pickup_date"
rules={[{ required: true, message: "Please select date" }]}
>
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
</Form.Item>
<Row gutter={8}>
<Col span={12}>
<Form.Item
label="Pick Up Date"
name="pickup_date"
rules={[{ required: true, message: "Please select date" }]}
>
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Pick Up Time"
name="pickup_time"
rules={[{ required: true, message: "Please select time" }]}
>
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item
label="Pick Up Location"
name="cycle_location"
name="pickup_location"
rules={[{ required: true, message: "Please enter location" }]}
>
<Input placeholder="Enter location" />
@ -133,7 +131,7 @@ const ShiftAndCoDriverCreateModal: React.FC<
{/* DRIVER INFO */}
<Form.Item label="CO-Driver Info">
<Form.Item label="Co-Driver Info">
<Switch
checked={needsDriver}
onChange={(checked) => {
@ -143,8 +141,10 @@ const ShiftAndCoDriverCreateModal: React.FC<
"driver_name",
"co_driver_name",
"co_driver_pickup_date",
"co_driver_pickup_time",
"co_driver_pickup_location",
"co_driver_drop_date",
"co_driver_drop_time",
"co_driver_drop_location",
]);
}
@ -154,26 +154,45 @@ const ShiftAndCoDriverCreateModal: React.FC<
{needsDriver && (
<>
<Form.Item label="Driver Name" name="driver_name">
<Form.Item
label="Driver Name"
name="driver_name"
rules={[{ required: true, message: "Please enter driver name" }]}
>
<Input placeholder="Driver name" />
</Form.Item>
<Form.Item label="Co-Driver Name" name="co_driver_name">
<Input placeholder="Co-driver name" />
</Form.Item>
<Form.Item
label="Co-Driver Pick Up Date"
name="co_driver_pickup_date"
rules={[{ required: true, message: "Please select pickup date" }]}
label="Co-Driver Name"
name="co_driver_name"
rules={[
{ required: true, message: "Please enter co driver name" },
]}
>
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
<Input placeholder="Co-driver name" />
</Form.Item>
<Row gutter={8}>
<Col span={12}>
<Form.Item
label="Co-Driver Pick Up Date"
name="co_driver_pickup_date"
rules={[{ required: true, message: "Please select date" }]}
>
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Co-Driver Pick Up Time"
name="co_driver_pickup_time"
rules={[{ required: true, message: "Please select time" }]}
>
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item
label="Co-Driver Pick Up Location"
name="co_driver_pickup_location"
@ -184,17 +203,27 @@ const ShiftAndCoDriverCreateModal: React.FC<
<Input placeholder="Enter pickup location" />
</Form.Item>
<Form.Item
label="Co-Driver Drop Date"
name="co_driver_drop_date"
rules={[{ required: true, message: "Please select date" }]}
>
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
</Form.Item>
<Row gutter={8}>
<Col span={12}>
<Form.Item
label="Co-Driver Drop Date"
name="co_driver_drop_date"
rules={[{ required: true, message: "Please select date" }]}
>
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Co-Driver Drop Time"
name="co_driver_drop_time"
rules={[{ required: true, message: "Please select time" }]}
>
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item
label="Co-Driver Drop Location"
name="co_driver_drop_location"

@ -1,6 +1,6 @@
import React, { useEffect } from "react";
import { Modal, Form, Input, DatePicker } from "antd";
import dayjs from "dayjs";
import { Modal, Form, Input, Row, Col } from "antd";
import { taskController } from "../../../API/LayoutApi/tasks";
interface ShiftAndCoDriverEditModalProps {
@ -19,26 +19,23 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
useEffect(() => {
if (recordTask) {
form.setFieldsValue({
shift_date: recordTask.shift_date ? dayjs(recordTask.shift_date) : null,
shift_date: recordTask.shift_date,
shift_location: recordTask.shift_location,
cycle_date: recordTask.cycle_date ? dayjs(recordTask.cycle_date) : null,
cycle_date: recordTask.cycle_date,
cycle_location: recordTask.cycle_location,
pickup_date: recordTask.pickup_date
? dayjs(recordTask.pickup_date)
: null,
pickup_date: recordTask.pickup_date,
pickup_time: recordTask.pickup_time,
pickup_location: recordTask.pickup_location,
driver_name: recordTask.driver_name,
co_driver_name: recordTask.co_driver_name,
co_driver_pickup_date: recordTask.co_driver_pickup_date,
co_driver_pickup_time: recordTask.co_driver_pickup_time,
co_driver_pickup_location: recordTask.co_driver_pickup_location,
co_driver_pickup_date: recordTask.co_driver_pickup_date
? dayjs(recordTask.co_driver_pickup_date)
: null,
co_driver_drop_date: recordTask.co_driver_drop_date
? dayjs(recordTask.co_driver_drop_date)
: null,
co_driver_drop_date: recordTask.co_driver_drop_date,
co_driver_drop_time: recordTask.co_driver_drop_time,
co_driver_drop_location: recordTask.co_driver_drop_location,
});
}
@ -47,22 +44,7 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
const handleOk = async () => {
try {
const values = await form.validateFields();
// Date fieldlarni string formatga o'tkazib yuboramiz
const formattedValues = {
...values,
shift_date: values.shift_date ? values.shift_date.toISOString() : null,
pickup_date: values.pickup_date
? values.pickup_date.toISOString()
: null,
cycle_date: values.cycle_date ? values.cycle_date.toISOString() : null,
co_driver_pickup_date: values.co_driver_pickup_date
? values.co_driver_pickup_date.toISOString()
: null,
co_driver_drop_date: values.co_driver_drop_date
? values.co_driver_drop_date.toISOString()
: null,
};
taskController.taskPatch(formattedValues, recordTask.id);
taskController.taskPatch(values, recordTask.id);
onCancel();
form.resetFields();
} catch (error) {
@ -83,11 +65,7 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
<Form form={form} layout="vertical">
{/* shift */}
<Form.Item label="Shift Date" name="shift_date">
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
<Input placeholder="Date and Time" />
</Form.Item>
<Form.Item label="Shift Location" name="shift_location">
@ -97,11 +75,7 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
{/* cycle */}
<Form.Item label="Cycle Date" name="cycle_date">
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
<Input placeholder="Date and Time" />
</Form.Item>
<Form.Item label="Cycle Location" name="cycle_location">
@ -110,15 +84,20 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
{/* pick up */}
<Form.Item label="Pick Up Date" name="pickup_date">
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
</Form.Item>
<Form.Item label="Pick Up Location" name="cycle_location">
<Row gutter={8}>
<Col span={12}>
<Form.Item label="Pick Up Date" name="pickup_date">
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="Pick Up Time" name="pickup_time">
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item label="Pick Up Location" name="pickup_location">
<Input placeholder="Enter location" />
</Form.Item>
@ -132,13 +111,24 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
<Input placeholder="Co-driver name" />
</Form.Item>
<Form.Item label="Co-Driver Pick Up Date" name="co_driver_pickup_date">
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
</Form.Item>
<Row gutter={8}>
<Col span={12}>
<Form.Item
label="Co-Driver Pick Up Date"
name="co_driver_pickup_date"
>
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item
label="Co-Driver Pick Up Time"
name="co_driver_pickup_time"
>
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item
label="Co-Driver Pick Up Location"
@ -147,13 +137,19 @@ const ShiftAndCoDriverEditModal: React.FC<ShiftAndCoDriverEditModalProps> = ({
<Input placeholder="Enter pickup location" />
</Form.Item>
<Form.Item label="Co-Driver Drop Date" name="co_driver_drop_date">
<DatePicker
style={{ width: "100%" }}
format="MM-DD-YYYY hh:mm:ss A"
showTime={{ format: "hh:mm:ss A" }}
/>
</Form.Item>
<Row gutter={8}>
<Col span={12}>
<Form.Item label="Co-Driver Drop Date" name="co_driver_drop_date">
<Input placeholder="Date" />
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="Co-Driver Drop Date" name="co_driver_drop_time">
<Input placeholder="Time" />
</Form.Item>
</Col>
</Row>
<Form.Item
label="Co-Driver Drop Location"
name="co_driver_drop_location"

@ -1,6 +1,5 @@
import { Button, Card, message } from "antd";
import { CopyOutlined, EditOutlined } from "@ant-design/icons";
import dayjs from "dayjs";
import { useState } from "react";
import ShiftAndCoDriverEditModal from "./ShiftAndCoDriverEditModal";
@ -11,17 +10,12 @@ interface ShiftDataTabProps {
const ShiftDataTab: React.FC<ShiftDataTabProps> = ({ recordTask }) => {
const [isModalOpen, setIsModalOpen] = useState(false);
const formatDateTime = (date?: string) =>
date ? dayjs(date).format("MM-DD-YYYY hh:mm:ss A") : null;
const displayValue = (val?: string | null) => val ?? "—";
const shiftInfo = {
pickUpDate: formatDateTime(recordTask?.pickup_date),
pickUpDate: recordTask?.pickup_date,
pickUpLocation: recordTask?.pickup_location ?? null,
shiftDate: formatDateTime(recordTask?.shift_date),
shiftDate: recordTask?.shift_date,
shiftLocation: recordTask?.shift_location ?? null,
cycleDate: formatDateTime(recordTask?.cycle_date),
cycleDate: recordTask?.cycle_date,
cycleLocation: recordTask?.cycle_location ?? null,
};
@ -29,9 +23,9 @@ const ShiftDataTab: React.FC<ShiftDataTabProps> = ({ recordTask }) => {
driverName: recordTask?.driver_name ?? null,
coDriverName: recordTask?.co_driver_name ?? null,
coDriverPickUpLocation: recordTask?.co_driver_pickup_location ?? null,
coDriverPickUpDate: formatDateTime(recordTask?.co_driver_pickup_date),
coDriverPickUpDate: recordTask?.co_driver_pickup_date,
coDriverDropLocation: recordTask?.co_driver_drop_location ?? null,
coDriverDropDate: formatDateTime(recordTask?.co_driver_drop_date),
coDriverDropDate: recordTask?.co_driver_drop_date,
};
const buildTextBlock = (title: string, items: [string, string | null][]) => {
@ -75,7 +69,7 @@ const ShiftDataTab: React.FC<ShiftDataTabProps> = ({ recordTask }) => {
["Дата сайкла", shiftInfo.cycleDate],
["Место сайкла", shiftInfo.cycleLocation],
]),
buildTextBlock("ИНФОРМАЦИЯ О СО-ВОДИТЕЛЕ", [
buildTextBlock("ИНФОРМАЦИЯ О КО-ДРАЙВЕРЕ", [
["Имя драйвера", coDriverInfo.driverName],
["Имя ко-драйвера", coDriverInfo.coDriverName],
["Время пикапа ко-драйвера", coDriverInfo.coDriverPickUpDate],
@ -154,7 +148,7 @@ const ShiftDataTab: React.FC<ShiftDataTabProps> = ({ recordTask }) => {
<p>Дата пикапа: {shiftInfo.pickUpDate}</p>
<p>Место пикапа: {shiftInfo.pickUpLocation}</p>
<h4>ИНФОРМАЦИЯ О СО-ВОДИТЕЛЕ</h4>
<h4>ИНФОРМАЦИЯ О КО-ДРАЙВЕРЕ</h4>
<p>Имя драйвера: {coDriverInfo.driverName}</p>
<p>Имя ко-драйвера: {coDriverInfo.coDriverName}</p>
<p>Место пикапа ко-драйвера: {coDriverInfo.coDriverPickUpLocation}</p>

@ -19,52 +19,40 @@ import { useTeamData } from "../../Hooks/Teams";
import { TTeam } from "../../types/Team/TTeam";
import {
ArrowRightOutlined,
CaretRightOutlined,
CloseOutlined,
CopyOutlined,
DatabaseOutlined,
EditOutlined,
ForwardOutlined,
RotateRightOutlined,
UploadOutlined,
} from "@ant-design/icons";
import ShiftAndCoDriverCreateModal from "./ShiftInfo/ShiftAndCoDriverCreateModal";
import { TSocket } from "../../types/common/TSocket";
// @ts-ignore
import closeIcon from "../../assets/closeIcon.png";
// @ts-ignore
import editIcon from "../../assets/editIcon.png";
// @ts-ignore
import historyIcon from "../../assets/hisoryIcon.png";
// @ts-ignore
import attachmentIcon from "../../assets/attachmentIcon.png";
// @ts-ignore
import infoIcon from "../../assets/infoIcon.png";
// @ts-ignore
import uploadIcon from "../../assets/uploadIcon.png";
// @ts-ignore
import pdficon from "../../assets/pdficon.png";
// @ts-ignore
import letssee from "../../assets/letssee.png";
// @ts-ignore
import svgicon from "../../assets/svgicon.png";
// @ts-ignore
import pngicon from "../../assets/pngicon.png";
// @ts-ignore
import jpgicon from "../../assets/jpgicon.png";
// @ts-ignore
import jpegicon from "../../assets/jpegicon.png";
// @ts-ignore
import xlsicon from "../../assets/xlsicon.png";
// @ts-ignore
import docicon from "../../assets/docicon.png";
// @ts-ignore
import forwardIcon from "../../assets/forward.png";
// @ts-ignore
import driverIcon from "../../assets/drivericon.png";
// @ts-ignore
import userIcon from "../../assets/userIcon.png";
import ShiftDataTab from "./ShiftInfo/ShiftDataTab";

@ -1,4 +1,5 @@
import { Button, message, Modal, Space, Table, Tooltip } from "antd";
import ReactCountryFlag from "react-country-flag";
import "../../App.css";
import { useEffect, useMemo, useState } from "react";
import { taskController } from "../../API/LayoutApi/tasks";
@ -18,13 +19,13 @@ import tt from "../../assets/tticon.svg";
import tagIcon from "../../assets/tagIcon.svg";
// @ts-ignore
import tgIcon from "../../assets/telegram.png";
//
import webIcon from "../../assets/web.png";
//
import { isMobile, role } from "../../App";
import { theme } from "antd";
import dayjs from "dayjs";
import ShiftAndCoDriverCreateModal from "./ShiftInfo/ShiftAndCoDriverCreateModal";
const admin_id = localStorage.getItem("admin_id");
@ -58,7 +59,7 @@ const TaskTable = ({
status: "Checking",
};
taskController.taskPatch(value, record?.id).then((response: any) => {
if (response?.status == 403) {
if (response?.status === 403) {
showErrorModal(response);
}
});
@ -81,7 +82,7 @@ const TaskTable = ({
// }
if (record.status === "Checking") {
// 1) Break / PTI holati
// 1) Break / PTI
if (
record?.service?.title === "Break" ||
record?.service?.title === "PTI"
@ -92,12 +93,12 @@ const TaskTable = ({
);
if (response?.status === 400) {
setRecordTask(record);
setIsModalOpen(true); // ❌ error qaytsa modal ochiladi
setIsModalOpen(true);
}
return;
}
// 2) needs_extra_info false bolsa
// 2) needs_extra_info false
if (record?.company?.needs_extra_info === false) {
const response = await taskController.taskPatch(
{ status: "Done" },
@ -105,12 +106,11 @@ const TaskTable = ({
);
if (response?.status === 400) {
setRecordTask(record);
setIsModalOpen(true); // ❌ error qaytsa modal ochiladi
setIsModalOpen(true);
}
return;
}
// 3) boshqa hollarda -> bevosita modal
setRecordTask(record);
setIsModalOpen(true);
}
@ -180,16 +180,13 @@ const TaskTable = ({
return "";
};
const formatDateTime = (date?: string) =>
date ? dayjs(date).format("MM-DD-YYYY hh:mm:ss A") : null;
const handleCopy = (record: any, lang: "en" | "ru") => {
const shiftInfo = {
pickUpDate: formatDateTime(record?.pickup_date),
pickUpDate: record?.pickup_date,
pickUpLocation: record?.pickup_location ?? null,
shiftDate: formatDateTime(record?.shift_date),
shiftDate: record?.shift_date,
shiftLocation: record?.shift_location ?? null,
cycleDate: formatDateTime(record?.cycle_date),
cycleDate: record?.cycle_date,
cycleLocation: record?.cycle_location ?? null,
};
@ -197,9 +194,9 @@ const TaskTable = ({
driverName: record?.driver_name ?? null,
coDriverName: record?.co_driver_name ?? null,
coDriverPickUpLocation: record?.co_driver_pickup_location ?? null,
coDriverPickUpDate: formatDateTime(record?.co_driver_pickup_date),
coDriverPickUpDate: record?.co_driver_pickup_date,
coDriverDropLocation: record?.co_driver_drop_location ?? null,
coDriverDropDate: formatDateTime(record?.co_driver_drop_date),
coDriverDropDate: record?.co_driver_drop_date,
};
const buildTextBlock = (
@ -245,7 +242,7 @@ const TaskTable = ({
["Дата сайкла", shiftInfo.cycleDate],
["Место сайкла", shiftInfo.cycleLocation],
]),
buildTextBlock("ИНФОРМАЦИЯ О СО-ВОДИТЕЛЕ", [
buildTextBlock("ИНФОРМАЦИЯ О КО-ДРАЙВЕРЕ", [
["Имя драйвера", coDriverInfo.driverName],
["Имя ко-драйвера", coDriverInfo.coDriverName],
["Время пикапа ко-драйвера", coDriverInfo.coDriverPickUpDate],
@ -511,7 +508,14 @@ const TaskTable = ({
placement="topLeft"
title={"Copy shift data in English"}
>
🇬🇧
<ReactCountryFlag
countryCode="GB"
svg
style={{
width: "1.2em",
height: "1.2em",
}}
/>
</Tooltip>
</Button>
<Button onClick={() => handleCopy(record, "ru")} type="text">
@ -519,7 +523,14 @@ const TaskTable = ({
placement="topLeft"
title={"Copy shift data in Russian"}
>
🇷🇺
<ReactCountryFlag
countryCode="RU"
svg
style={{
width: "1.2em",
height: "1.2em",
}}
/>
</Tooltip>
</Button>
</>
@ -633,7 +644,7 @@ const TaskTable = ({
taskController
.taskPatch(payload, recordTask.id)
.then((response: any) => {
if (response?.status == 403) {
if (response?.status === 403) {
showErrorModal(response);
} else {
setIsModalOpen(false);

@ -8610,6 +8610,11 @@ react-app-polyfill@^3.0.0:
regenerator-runtime "^0.13.9"
whatwg-fetch "^3.6.2"
react-country-flag@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/react-country-flag/-/react-country-flag-3.1.0.tgz#f0c4c332934a77d3e894ba4800634f7a887e53d4"
integrity sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g==
react-dev-utils@^12.0.1:
version "12.0.1"
resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz"

Loading…
Cancel
Save