From fe5505079692057b3bfbed89ac7c3755d2f025b0 Mon Sep 17 00:00:00 2001 From: Mahabbat Huseynov Date: Mon, 12 Sep 2022 11:28:53 +0400 Subject: [PATCH] New boarding: save draft functionality --- .../basic-info/basic-info.section.js | 4 +- .../boarding-new/boarding-new.component.js | 1 + .../boardings/boarding-new/catch/CatchItem.js | 4 +- .../boarding-new/vessel/vessel.section.js | 4 +- .../boarding-new/violations/ViolationItem.js | 6 +- .../dashboards/draft-boarding.component.js | 77 +++++++++++++++++++ .../dashboards/field-dashboard.component.js | 2 + src/helpers/i18n/en/translation.json | 1 + src/services/boarding.service.js | 18 +++++ 9 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 src/components/dashboards/draft-boarding.component.js diff --git a/src/components/boardings/boarding-new/basic-info/basic-info.section.js b/src/components/boardings/boarding-new/basic-info/basic-info.section.js index 7973627..68b886b 100644 --- a/src/components/boardings/boarding-new/basic-info/basic-info.section.js +++ b/src/components/boardings/boarding-new/basic-info/basic-info.section.js @@ -89,7 +89,7 @@ class BasicInfoSection extends Component { id="latitude" label={t("BOARDING_PAGE.VIEW_BOARDING.LATITUDE")} value={location[0]} - onChange={({ target: { value } }) => this.handleLocationChange('lat', value)} + onChange={({ target }) => this.handleLocationChange('lat', parseFloat(target.value))} type="number" /> @@ -100,7 +100,7 @@ class BasicInfoSection extends Component { id="longitude" label={t("BOARDING_PAGE.VIEW_BOARDING.LONGITUDE")} value={location[1]} - onChange={({ target: { value } }) => this.handleLocationChange('long', value)} + onChange={({ target }) => this.handleLocationChange('long', parseFloat(target.value))} type="number" /> diff --git a/src/components/boardings/boarding-new/boarding-new.component.js b/src/components/boardings/boarding-new/boarding-new.component.js index d63cc4f..38ac5e5 100644 --- a/src/components/boardings/boarding-new/boarding-new.component.js +++ b/src/components/boardings/boarding-new/boarding-new.component.js @@ -176,6 +176,7 @@ class BoardingNewPage extends Component { let formData = { ...this.state.dataToSave, crew: this.state.dataToSave.crew.map(x => ({ name: x.name, license: x.license })), + timestamp: Date.now(), inspection: { ...this.state.dataToSave.inspection, actualCatch: this.state.dataToSave.inspection.actualCatch.map(x => { diff --git a/src/components/boardings/boarding-new/catch/CatchItem.js b/src/components/boardings/boarding-new/catch/CatchItem.js index 6039d73..3717b9d 100644 --- a/src/components/boardings/boarding-new/catch/CatchItem.js +++ b/src/components/boardings/boarding-new/catch/CatchItem.js @@ -45,7 +45,7 @@ export const CatchItem = ({ catchItem, species, onChange, handleAdd, handleDelet className="new-boarding__catch--weight" name="weight" value={catchItem.weight} - onChange={e => onChange({ ...catchItem, weight: e.target.value })} + onChange={e => onChange({ ...catchItem, weight: parseFloat(e.target.value) })} /> @@ -72,7 +72,7 @@ export const CatchItem = ({ catchItem, species, onChange, handleAdd, handleDelet className="new-boarding__catch--count" name="number" value={catchItem.number} - onChange={e => onChange({ ...catchItem, number: e.target.value })} + onChange={e => onChange({ ...catchItem, number: e.target.valueAsNumber })} />

diff --git a/src/components/boardings/boarding-new/vessel/vessel.section.js b/src/components/boardings/boarding-new/vessel/vessel.section.js index c5f4eb2..88ab86e 100644 --- a/src/components/boardings/boarding-new/vessel/vessel.section.js +++ b/src/components/boardings/boarding-new/vessel/vessel.section.js @@ -182,14 +182,14 @@ class VesselSection extends Component { required disableToolbar variant="inline" - format="yyyy/MM/DD" + format="YYYY/MM/DD" margin="normal" id="ldd-date-picker" className="third-row-view last-date-delivery" label={t("TABLE.DATE")} value={date} onChange={(date) => - this.handleChange("lastDelivery", "date", date) + this.handleChange("lastDelivery", "date", date.toDate()) } KeyboardButtonProps={{ "aria-label": "change date", diff --git a/src/components/boardings/boarding-new/violations/ViolationItem.js b/src/components/boardings/boarding-new/violations/ViolationItem.js index a73be75..6d50e54 100644 --- a/src/components/boardings/boarding-new/violations/ViolationItem.js +++ b/src/components/boardings/boarding-new/violations/ViolationItem.js @@ -59,9 +59,9 @@ export const ViolationItem = ({ const values = e.target.value.split("@@@"); onChange({ ...violation, - offence: { - code: values[0], - explanation: values[1], + crewMember: { + name: values[0], + license: values[1], } }) }} diff --git a/src/components/dashboards/draft-boarding.component.js b/src/components/dashboards/draft-boarding.component.js new file mode 100644 index 0000000..a1a57e4 --- /dev/null +++ b/src/components/dashboards/draft-boarding.component.js @@ -0,0 +1,77 @@ +import React from 'react'; +import BoardingService from "./../../services/boarding.service"; +import withRouter from "../../helpers/withRouter"; +import moment from 'moment'; +import { useTranslation } from 'react-i18next'; +import { EDIT_BOARDING_PAGE } from "../../root/root.constants.js"; + +const boardingService = BoardingService.getInstance(); + + +const DraftBoardingList = ({ router }) => { + const [drafts, setDrafts] = React.useState([]); + React.useEffect(() => { + boardingService.getDraftBoardings().then(setDrafts); + }, []); + const { t } = useTranslation(); + + const goEdit = (id) => { + router.navigate(EDIT_BOARDING_PAGE.replace(":id", id)); + } + return ( +

+
+
+
+ {t("HOME_PAGE.MY_DRAFT_BOARDINGS")} +
+
+
+
+ + + + + + + + + + + {drafts.map((draft, ind) => ( + + + + + + + ))} + +
{t("TABLE.DATE")}{t("TABLE.TIME")}{t("TABLE.VESSEL")}
{moment(draft.date).format("l LT")} {moment(draft.date).format("LT")} {draft.vessel ? draft.vessel.name : ""} +
+
goEdit(draft._id)} + style={{ + marginRight: 10 + }} + > + {t("BUTTONS.EDIT")} +
+
boardingService.deleteBoarding(draft._id)} + > + {t("BUTTONS.DELETE")} +
+
+
+
+
+ ) +} + +export default withRouter(DraftBoardingList); \ No newline at end of file diff --git a/src/components/dashboards/field-dashboard.component.js b/src/components/dashboards/field-dashboard.component.js index e5ea158..8bfc9ff 100644 --- a/src/components/dashboards/field-dashboard.component.js +++ b/src/components/dashboards/field-dashboard.component.js @@ -12,6 +12,7 @@ import { getHighlightedText } from "./../../helpers/get-data"; import BoardingService from "./../../services/boarding.service"; import AuthService from "./../../services/auth.service"; import AgencyService from "./../../services/agency.service"; +import DraftBoardingList from "./draft-boarding.component"; const authService = AuthService.getInstance(); const boardingService = BoardingService.getInstance(); @@ -158,6 +159,7 @@ class FieldDashboard extends Component { + {!isFromActivities && }
diff --git a/src/helpers/i18n/en/translation.json b/src/helpers/i18n/en/translation.json index ab08e12..acea809 100644 --- a/src/helpers/i18n/en/translation.json +++ b/src/helpers/i18n/en/translation.json @@ -28,6 +28,7 @@ "HOME_PAGE": { "DASHBOARD": "Dashboard", "MY_BOARDINGS": "My Boardings", + "MY_DRAFT_BOARDINGS": "My Draft Boardings", "MY_ACTIVITY": "My Activity", "OVERVIEW": "Overview for", "COMPLIANCE_RATE": "Compliance Rate", diff --git a/src/services/boarding.service.js b/src/services/boarding.service.js index f39c1f8..2647b25 100644 --- a/src/services/boarding.service.js +++ b/src/services/boarding.service.js @@ -1,6 +1,8 @@ import { BSON } from "mongodb-stitch-browser-sdk"; import StitchService from "./stitch.service"; +import AuthService from "./auth.service"; +const authService = AuthService.getInstance(); const stitchService = StitchService.getInstance(); const sampleData = { @@ -132,6 +134,22 @@ export default class BoardingService { ]); } + getDraftBoardings() { + return stitchService.database + .collection("BoardingReports") + .find({ draft: true, "reportingOfficer.email": authService.user.email }).toArray(); + } + + deleteBoarding(id) { + + + const objectId = new BSON.ObjectId(id); + + return stitchService.database + .collection("BoardingReports") + .deleteOne({ _id: objectId }); + } + getBoardingsWithFacet(limit, offset, search, filter, agenciesToShareData) { return stitchService.client.callFunction("searchFacetByBoardings", [ limit,