Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit b5145fb

Browse files
committed
refactor: job loading for RB
ref issue #90
1 parent c5679d8 commit b5145fb

File tree

4 files changed

+72
-72
lines changed

4 files changed

+72
-72
lines changed

src/routes/ResourceBookingDetails/ResourceDetails/index.jsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import IconComputer from "../../../assets/images/icon-computer.svg";
1212
import IconBag from "../../../assets/images/icon-bag.svg";
1313
import "./styles.module.scss";
1414

15-
const ResourceDetails = ({ resource }) => {
15+
const ResourceDetails = ({ resource, jobTitle }) => {
1616
return (
1717
<div styleName="resource-details">
1818
<div styleName="table">
@@ -21,7 +21,7 @@ const ResourceDetails = ({ resource }) => {
2121
<DataItem
2222
icon={<IconComputer />}
2323
title="Job Title"
24-
children={resource.title}
24+
children={jobTitle}
2525
/>
2626
</div>
2727
<div styleName="table-cell">
@@ -68,8 +68,8 @@ const ResourceDetails = ({ resource }) => {
6868
};
6969

7070
ResourceDetails.propTypes = {
71+
jobTitle: PT.string,
7172
resource: PT.shape({
72-
title: PT.string,
7373
startDate: PT.string,
7474
endDate: PT.string,
7575
id: PT.string,

src/routes/ResourceBookingDetails/ResourceSummary/index.jsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import PT from "prop-types";
88
import User from "components/User";
99
import "./styles.module.scss";
1010

11-
const ResourceSummary = ({ candidate }) => {
11+
const ResourceSummary = ({ member }) => {
1212
return (
1313
<div styleName="resource-summary">
1414
<div styleName="resource-summary-wrapper">
1515
<User
1616
user={{
17-
...candidate,
18-
photoUrl: candidate.photo_url,
17+
...member,
18+
photoUrl: member.photo_url,
1919
}}
2020
/>
2121
</div>
@@ -24,7 +24,7 @@ const ResourceSummary = ({ candidate }) => {
2424
};
2525

2626
ResourceSummary.propTypes = {
27-
candidate: PT.shape({
27+
member: PT.shape({
2828
firstName: PT.string,
2929
handle: PT.string,
3030
id: PT.string,

src/routes/ResourceBookingDetails/index.jsx

+33-27
Original file line numberDiff line numberDiff line change
@@ -20,48 +20,54 @@ import ResourceDetails from "./ResourceDetails";
2020
import "./styles.module.scss";
2121

2222
const ResourceBookingDetails = ({ teamId, resourceBookingId }) => {
23-
const [rb, loadingError] = useData(getReourceBookingById, resourceBookingId);
23+
const [resource, loadingError] = useData(getReourceBookingById, resourceBookingId);
2424
const [team, loadingTeamError] = useData(getTeamById, teamId);
25+
const [jobTitle, setJobTitle] = useState("")
26+
const [member, setMember] = useState("")
2527

26-
const member = useMemo(() => {
28+
useEffect(() => {
2729
if (team) {
28-
const resource = _.find(
30+
const resourceWithMemberDetails = _.find(
2931
team.resources,
30-
(r) => r.id === resourceBookingId
32+
{ id: resourceBookingId }
3133
);
32-
let job;
33-
if (resource.jobId) {
34-
job = _.find(team.jobs, { id: resource.jobId });
34+
35+
// resource inside Team object has all the member details we need
36+
setMember(resourceWithMemberDetails);
37+
38+
if (resourceWithMemberDetails.jobId) {
39+
const job = _.find(team.jobs, { id: resourceWithMemberDetails.jobId });
40+
setJobTitle(_.get(job, "title", `<Not Found> ${resourceWithMemberDetails.jobId}`));
41+
} else {
42+
setJobTitle("<Not Assigned>")
3543
}
36-
resource.jobTitle = _.get(job, "title", "<Not Assigned>");
37-
return resource;
3844
}
3945
}, [team, resourceBookingId]);
4046

4147
return (
4248
<Page title="Member Details">
4349
{!member ? (
44-
<LoadingIndicator error={loadingError} />
50+
<LoadingIndicator error={loadingError || loadingTeamError} />
4551
) : (
46-
<>
47-
<PageHeader
48-
title="Member Details"
49-
backTo={`/taas/myteams/${teamId}`}
50-
/>
51-
<div styleName="content-wrapper">
52-
<ResourceSummary candidate={member} />
53-
<ResourceDetails resource={{ ...rb, title: member.jobTitle }} />
54-
<div styleName="actions">
55-
<Button
56-
size="medium"
57-
routeTo={`/taas/myteams/${teamId}/rb/${rb.id}/edit`}
58-
>
59-
Edit Member Details
52+
<>
53+
<PageHeader
54+
title="Member Details"
55+
backTo={`/taas/myteams/${teamId}`}
56+
/>
57+
<div styleName="content-wrapper">
58+
<ResourceSummary member={member} />
59+
<ResourceDetails resource={resource} jobTitle={jobTitle} />
60+
<div styleName="actions">
61+
<Button
62+
size="medium"
63+
routeTo={`/taas/myteams/${teamId}/rb/${resource.id}/edit`}
64+
>
65+
Edit Member Details
6066
</Button>
67+
</div>
6168
</div>
62-
</div>
63-
</>
64-
)}
69+
</>
70+
)}
6571
</Page>
6672
);
6773
};

src/routes/ResourceBookingForm/index.jsx

+32-38
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Page for edit resource booking details.
55
* It gets `teamId` and `resourceBookingId` from the router.
66
*/
7-
import React, { useState, useEffect } from "react";
7+
import React, { useState, useMemo } from "react";
88
import PT from "prop-types";
99
import _ from "lodash";
1010
import { toastr } from "react-redux-toastr";
@@ -24,37 +24,31 @@ import "./styles.module.scss";
2424

2525
const ResourceBookingDetails = ({ teamId, resourceBookingId }) => {
2626
const [submitting, setSubmitting] = useState(false);
27-
const [jobId, setJobId] = useState(null);
28-
const [formData, setFormData] = useState(null);
2927
const [team, loadingTeamError] = useData(getTeamById, teamId);
3028
const [rb, loadingError] = useData(getReourceBookingById, resourceBookingId);
3129

32-
useEffect(() => {
33-
if (!!rb) {
34-
setJobId(rb.jobId);
35-
}
36-
}, [rb]);
37-
38-
useEffect(() => {
30+
const formData = useMemo(() => {
3931
if (team && rb) {
4032
const resource = _.find(
4133
team.resources,
42-
(r) => r.id === resourceBookingId
34+
{ id: resourceBookingId }
4335
);
4436

45-
let job;
46-
if (resource.jobId) {
47-
job = _.find(team.jobs, { id: resource.jobId });
48-
}
49-
50-
const jobTitle = _.get(job, "title", "<Not Assigned>");
51-
5237
const data = {
53-
jobTitle,
54-
...resource,
5538
...rb,
39+
// resource inside Team object has all the member details we need
40+
// so we can get user handle from there
41+
handle: resource.handle,
5642
};
57-
setFormData(data);
43+
44+
if (resource.jobId) {
45+
const job = _.find(team.jobs, { id: resource.jobId });
46+
data.jobTitle = _.get(job, "title", `<Not Found> ${resource.jobId}`);
47+
} else {
48+
data.jobTitle = "<Not Assigned>";
49+
}
50+
51+
return data;
5852
}
5953
}, [rb, team, resourceBookingId]);
6054

@@ -89,25 +83,25 @@ const ResourceBookingDetails = ({ teamId, resourceBookingId }) => {
8983
return (
9084
<Page title="Edit Member Details">
9185
{!formData ? (
92-
<LoadingIndicator error={loadingError} />
86+
<LoadingIndicator error={loadingError || loadingTeamError} />
9387
) : (
94-
<>
95-
<PageHeader
96-
title="Edit Member Details"
97-
backTo={`/taas/myteams/${teamId}/rb/${rb.id}`}
98-
/>
99-
<div styleName="rb-modification-details">
100-
<TCForm
101-
configuration={getEditResourceBookingConfig(onSubmit)}
102-
initialValue={formData}
103-
submitButton={{ text: "Save" }}
104-
backButton={{ text: "Cancel", backTo: `/taas/myteams/${teamId}` }}
105-
submitting={submitting}
106-
setSubmitting={setSubmitting}
88+
<>
89+
<PageHeader
90+
title="Edit Member Details"
91+
backTo={`/taas/myteams/${teamId}/rb/${rb.id}`}
10792
/>
108-
</div>
109-
</>
110-
)}
93+
<div styleName="rb-modification-details">
94+
<TCForm
95+
configuration={getEditResourceBookingConfig(onSubmit)}
96+
initialValue={formData}
97+
submitButton={{ text: "Save" }}
98+
backButton={{ text: "Cancel", backTo: `/taas/myteams/${teamId}` }}
99+
submitting={submitting}
100+
setSubmitting={setSubmitting}
101+
/>
102+
</div>
103+
</>
104+
)}
111105
</Page>
112106
);
113107
};

0 commit comments

Comments
 (0)