Skip to content

Commit e14561c

Browse files
authored
Merge pull request nus-cs2103-AY2021S1#72 from shadowezz/add-milestone
Add milestone attribute for deliverable.
2 parents 41da9ff + 5d7f1b5 commit e14561c

File tree

18 files changed

+213
-28
lines changed

18 files changed

+213
-28
lines changed

src/main/java/seedu/address/logic/commands/deliverable/AddCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_CONTACTS;
55
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_DEADLINE;
66
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_DESCRIPTION;
7+
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_MILESTONE;
78
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_TITLE;
89

910
import seedu.address.logic.commands.CommandResult;
@@ -21,11 +22,13 @@ public class AddCommand extends Command {
2122
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a deliverable to the deliverable book. "
2223
+ "Parameters: "
2324
+ PREFIX_TITLE + "TITLE "
25+
+ PREFIX_MILESTONE + "MILESTONE "
2426
+ "[" + PREFIX_DESCRIPTION + "DESCRIPTION] "
2527
+ "[" + PREFIX_DEADLINE + "DEADLINE] "
2628
+ "[" + PREFIX_CONTACTS + "CONTACTS]\n"
2729
+ "Example: " + COMMAND_WORD + " "
2830
+ PREFIX_TITLE + "Login screen "
31+
+ PREFIX_MILESTONE + "1.0 "
2932
+ PREFIX_DESCRIPTION + "Must include username and password fields "
3033
+ PREFIX_DEADLINE + "12-12-2020 23:59 "
3134
+ PREFIX_CONTACTS + "2,4";

src/main/java/seedu/address/logic/commands/deliverable/DoneCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import seedu.address.model.deliverable.ModelDeliverable;
1313
import seedu.address.model.deliverable.deliverable.Deadline;
1414
import seedu.address.model.deliverable.deliverable.Deliverable;
15+
import seedu.address.model.deliverable.deliverable.Milestone;
1516
import seedu.address.model.util.Description;
1617
import seedu.address.model.util.Title;
1718

@@ -57,10 +58,11 @@ public CommandResult execute(ModelDeliverable modelDeliverable) throws CommandEx
5758

5859
private Deliverable createCompletedDeliverable(Deliverable deliverableToComplete) {
5960
Title title = deliverableToComplete.getTitle();
61+
Milestone milestone = deliverableToComplete.getMilestone();
6062
Description description = deliverableToComplete.getDescription();
6163
Deadline deadline = deliverableToComplete.getDeadline();
6264
String contacts = deliverableToComplete.getContacts();
63-
return new Deliverable(title, description, deadline, COMPLETED, contacts);
65+
return new Deliverable(title, milestone, description, deadline, COMPLETED, contacts);
6466
}
6567

6668

src/main/java/seedu/address/logic/parser/deliverable/AddCommandParser.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_CONTACTS;
55
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_DEADLINE;
66
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_DESCRIPTION;
7+
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_MILESTONE;
78
import static seedu.address.logic.parser.deliverable.CliSyntax.PREFIX_TITLE;
89

910
import java.util.stream.Stream;
@@ -16,6 +17,7 @@
1617
import seedu.address.logic.parser.exceptions.ParseException;
1718
import seedu.address.model.deliverable.deliverable.Deadline;
1819
import seedu.address.model.deliverable.deliverable.Deliverable;
20+
import seedu.address.model.deliverable.deliverable.Milestone;
1921
import seedu.address.model.util.Description;
2022
import seedu.address.model.util.Title;
2123

@@ -30,14 +32,15 @@ public class AddCommandParser implements Parser<AddCommand> {
3032
* @throws ParseException if the user input does not conform the expected format
3133
*/
3234
public AddCommand parse(String args) throws ParseException {
33-
ArgumentMultimap argMultimap =
34-
ArgumentTokenizer.tokenize(args, PREFIX_TITLE, PREFIX_DESCRIPTION, PREFIX_DEADLINE, PREFIX_CONTACTS);
35+
ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_TITLE, PREFIX_MILESTONE,
36+
PREFIX_DESCRIPTION, PREFIX_DEADLINE, PREFIX_CONTACTS);
3537

36-
if (!arePrefixesPresent(argMultimap, PREFIX_TITLE) || !argMultimap.getPreamble().isEmpty()) {
38+
if (!arePrefixesPresent(argMultimap, PREFIX_TITLE, PREFIX_MILESTONE) || !argMultimap.getPreamble().isEmpty()) {
3739
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
3840
}
3941

4042
Title title = ParserUtil.parseTitle(argMultimap.getValue(PREFIX_TITLE).get());
43+
Milestone milestone = ParserUtil.parseMilestone(argMultimap.getValue(PREFIX_MILESTONE).get());
4144
Description description = argMultimap.getValue(PREFIX_DESCRIPTION).isEmpty()
4245
? Description.createEmptyDescription()
4346
: ParserUtil.parseDescription(argMultimap.getValue(PREFIX_DESCRIPTION).get());
@@ -48,7 +51,7 @@ public AddCommand parse(String args) throws ParseException {
4851
? "NIL"
4952
: ParserUtil.parseContacts(argMultimap.getValue(PREFIX_CONTACTS).get());
5053

51-
Deliverable deliverable = new Deliverable(title, description, deadline, contacts);
54+
Deliverable deliverable = new Deliverable(title, milestone, description, deadline, contacts);
5255

5356
return new AddCommand(deliverable);
5457
}

src/main/java/seedu/address/logic/parser/deliverable/CliSyntax.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class CliSyntax {
99

1010
/* Prefix definitions */
1111
public static final Prefix PREFIX_TITLE = new Prefix("t/");
12+
public static final Prefix PREFIX_MILESTONE = new Prefix("m/");
1213
public static final Prefix PREFIX_DESCRIPTION = new Prefix("desc/");
1314
public static final Prefix PREFIX_DEADLINE = new Prefix("dead/");
1415
public static final Prefix PREFIX_CONTACTS = new Prefix("c/");

src/main/java/seedu/address/logic/parser/deliverable/ParserUtil.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import seedu.address.commons.util.StringUtil;
77
import seedu.address.logic.parser.exceptions.ParseException;
88
import seedu.address.model.deliverable.deliverable.Deadline;
9+
import seedu.address.model.deliverable.deliverable.Milestone;
910
import seedu.address.model.util.Description;
1011
import seedu.address.model.util.Title;
1112

@@ -44,6 +45,21 @@ public static Title parseTitle(String title) throws ParseException {
4445
return new Title(trimmedTitle);
4546
}
4647

48+
/**
49+
* Parses a {@code String milestone} into a {@code Milestone}.
50+
* Leading and trailing whitespaces will be trimmed.
51+
*
52+
* @throws ParseException
53+
*/
54+
public static Milestone parseMilestone(String milestone) throws ParseException {
55+
requireNonNull(milestone);
56+
String trimmedMilestone = milestone.trim();
57+
if (!Milestone.isValidMilestone(trimmedMilestone)) {
58+
throw new ParseException(Milestone.MESSAGE_CONSTRAINTS);
59+
}
60+
return new Milestone(trimmedMilestone);
61+
}
62+
4763
/**
4864
* Parses a {@code String description} into a {@code Description}.
4965
* Leading and trailing whitespaces will be trimmed.

src/main/java/seedu/address/model/deliverable/deliverable/Deliverable.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class Deliverable {
1717
private final Title title;
1818

1919
// Data fields
20+
private final Milestone milestone;
2021
private final Description description;
2122
private final Deadline deadline;
2223
private final boolean isComplete;
@@ -27,9 +28,11 @@ public class Deliverable {
2728
/**
2829
* Only title field must be present. Used when adding new deliverable.
2930
*/
30-
public Deliverable(Title title, Description description, Deadline deadline, String contacts) {
31+
public Deliverable(Title title, Milestone milestone, Description description,
32+
Deadline deadline, String contacts) {
3133
requireAllNonNull(title);
3234
this.title = title;
35+
this.milestone = milestone;
3336
this.description = description;
3437
this.deadline = deadline;
3538
this.isComplete = false;
@@ -39,10 +42,11 @@ public Deliverable(Title title, Description description, Deadline deadline, Stri
3942
/**
4043
* Used when editing or completing existing deliverable.
4144
*/
42-
public Deliverable(Title title, Description description, Deadline deadline,
45+
public Deliverable(Title title, Milestone milestone, Description description, Deadline deadline,
4346
boolean isComplete, String contacts) {
4447
requireAllNonNull(title);
4548
this.title = title;
49+
this.milestone = milestone;
4650
this.description = description;
4751
this.deadline = deadline;
4852
this.isComplete = isComplete;
@@ -53,6 +57,10 @@ public Title getTitle() {
5357
return title;
5458
}
5559

60+
public Milestone getMilestone() {
61+
return milestone;
62+
}
63+
5664
public Description getDescription() {
5765
return description;
5866
}
@@ -98,6 +106,7 @@ public boolean equals(Object other) {
98106

99107
Deliverable otherDeliverable = (Deliverable) other;
100108
return otherDeliverable.getTitle().equals(getTitle())
109+
&& otherDeliverable.getMilestone().equals(getMilestone())
101110
&& otherDeliverable.getDescription().equals(getDescription())
102111
&& otherDeliverable.getDeadline().equals(getDeadline())
103112
&& otherDeliverable.getContacts().equals(getContacts())
@@ -107,14 +116,16 @@ public boolean equals(Object other) {
107116
@Override
108117
public int hashCode() {
109118
// use this method for custom fields hashing instead of implementing your own
110-
return Objects.hash(title, description, deadline, contacts, isComplete);
119+
return Objects.hash(title, milestone, description, deadline, contacts, isComplete);
111120

112121
}
113122

114123
@Override
115124
public String toString() {
116125
final StringBuilder builder = new StringBuilder();
117126
builder.append(getTitle())
127+
.append(" Milestone: ")
128+
.append(getMilestone())
118129
.append(" Description: ")
119130
.append(getDescription())
120131
.append(" Deadline: ")
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package seedu.address.model.deliverable.deliverable;
2+
3+
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.commons.util.AppUtil.checkArgument;
5+
6+
/**
7+
* Represents a deliverable's milestone in the deliverable book.
8+
* Guarantees: immutable; is valid as declared in {@link #isValidMilestone(String)}
9+
*/
10+
public class Milestone {
11+
12+
public static final String MESSAGE_CONSTRAINTS =
13+
"Milestone can only take numerical values separated by dots.";
14+
15+
/*
16+
* Milestone can only take numerical values separated with dots.
17+
* First and last characters must both be numbers.
18+
*/
19+
public static final String VALIDATION_REGEX = "^\\d+(\\.\\d+)*$";
20+
21+
public static final String PREFIX = "v";
22+
23+
public final String value;
24+
25+
/**
26+
* Constructs a {@code Milestone}.
27+
*
28+
* @param milestone A valid milestone.
29+
*/
30+
public Milestone(String milestone) {
31+
requireNonNull(milestone);
32+
checkArgument(isValidMilestone(milestone), MESSAGE_CONSTRAINTS);
33+
value = milestone;
34+
}
35+
36+
/**
37+
* Returns true if a given string is a valid milestone.
38+
*/
39+
public static boolean isValidMilestone(String test) {
40+
return test.matches(VALIDATION_REGEX);
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return PREFIX + value;
46+
}
47+
48+
@Override
49+
public boolean equals(Object other) {
50+
return other == this
51+
|| (other instanceof Milestone)
52+
&& value.equals(((Milestone) other).value);
53+
}
54+
55+
@Override
56+
public int hashCode() {
57+
return value.hashCode();
58+
}
59+
}

src/main/java/seedu/address/model/util/SampleDataUtil.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import seedu.address.model.deliverable.ReadOnlyDeliverableBook;
55
import seedu.address.model.deliverable.deliverable.Deadline;
66
import seedu.address.model.deliverable.deliverable.Deliverable;
7+
import seedu.address.model.deliverable.deliverable.Milestone;
78
import seedu.address.model.meeting.MeetingBook;
89
import seedu.address.model.meeting.ReadOnlyMeetingBook;
910
import seedu.address.model.meeting.meeting.From;
@@ -41,11 +42,14 @@ public static Person[] getSamplePersons() {
4142

4243
public static Deliverable[] getSampleDeliverables() {
4344
return new Deliverable[] {
44-
new Deliverable(new Title("Settle login screens"), new Description("Include forget password option"),
45+
new Deliverable(new Title("Settle login screens"), new Milestone("1.1"),
46+
new Description("Include forget password option"),
4547
new Deadline("04-11-2020 15:00"), true, "2,4"),
46-
new Deliverable(new Title("Settle profile page"), new Description("Include change password option"),
48+
new Deliverable(new Title("Settle profile page"), new Milestone("1.2"),
49+
new Description("Include change password option"),
4750
new Deadline("15-11-2020 12:00"), true, "1,2,3"),
48-
new Deliverable(new Title("Finalise v1.1 app design"), new Description("Include forget password option"),
51+
new Deliverable(new Title("Finalise v1.1 app design"), new Milestone("1.2.1"),
52+
new Description("Include forget password option"),
4953
new Deadline("12-12-2020 23:59"), false, "2,5"),
5054
};
5155
}

src/main/java/seedu/address/storage/deliverable/JsonAdaptedDeliverable.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import seedu.address.commons.exceptions.IllegalValueException;
77
import seedu.address.model.deliverable.deliverable.Deadline;
88
import seedu.address.model.deliverable.deliverable.Deliverable;
9+
import seedu.address.model.deliverable.deliverable.Milestone;
910
import seedu.address.model.util.Description;
1011
import seedu.address.model.util.Title;
1112

@@ -17,6 +18,7 @@ public class JsonAdaptedDeliverable {
1718
public static final String MISSING_FIELD_MESSAGE_FORMAT = "Deliverable's %s field is missing!";
1819

1920
private final String title;
21+
private final String milestone;
2022
private final String description;
2123
private final String deadline;
2224
private final String contacts;
@@ -26,10 +28,12 @@ public class JsonAdaptedDeliverable {
2628
* Constructs a {@code JsonAdaptedDeliverable} with the given deliverable details
2729
*/
2830
@JsonCreator
29-
public JsonAdaptedDeliverable(@JsonProperty("title") String title, @JsonProperty("description") String description,
30-
@JsonProperty("deadline") String deadline, @JsonProperty("contacts") String contacts,
31+
public JsonAdaptedDeliverable(@JsonProperty("title") String title, @JsonProperty("milestone") String milestone,
32+
@JsonProperty("description") String description,
33+
@JsonProperty("deadline") String deadline, @JsonProperty("contacts") String contacts,
3134
@JsonProperty("isComplete") String isComplete) {
3235
this.title = title;
36+
this.milestone = milestone;
3337
this.description = description;
3438
this.deadline = deadline;
3539
this.contacts = contacts;
@@ -41,6 +45,7 @@ public JsonAdaptedDeliverable(@JsonProperty("title") String title, @JsonProperty
4145
*/
4246
public JsonAdaptedDeliverable(Deliverable source) {
4347
title = source.getTitle().value;
48+
milestone = source.getMilestone().value;
4449
description = source.getDescription().value;
4550
deadline = source.getDeadline().value;
4651
contacts = source.getContacts();
@@ -61,6 +66,15 @@ public Deliverable toModelType() throws IllegalValueException {
6166
}
6267
final Title modelTitle = new Title(title);
6368

69+
if (milestone == null) {
70+
throw new IllegalValueException(
71+
String.format(MISSING_FIELD_MESSAGE_FORMAT, Milestone.class.getSimpleName()));
72+
}
73+
if (!Milestone.isValidMilestone(milestone)) {
74+
throw new IllegalValueException(Milestone.MESSAGE_CONSTRAINTS);
75+
}
76+
final Milestone modelMilestone = new Milestone(milestone);
77+
6478
if (!Description.isValidDescription(description)) {
6579
throw new IllegalValueException(Description.MESSAGE_CONSTRAINTS);
6680
}
@@ -80,6 +94,6 @@ public Deliverable toModelType() throws IllegalValueException {
8094
modelIsComplete = false;
8195
}
8296

83-
return new Deliverable(modelTitle, modelDescription, modelDeadline, modelIsComplete, contacts);
97+
return new Deliverable(modelTitle, modelMilestone, modelDescription, modelDeadline, modelIsComplete, contacts);
8498
}
8599
}

src/main/java/seedu/address/ui/DeliverableCard.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class DeliverableCard extends UiPart<Region> {
3636
@FXML
3737
private Label contacts;
3838
@FXML
39+
private Label milestone;
40+
@FXML
3941
private Label isCompleted;
4042

4143
/**
@@ -56,6 +58,7 @@ public DeliverableCard(Deliverable deliverable, int displayedIndex) {
5658
isCompleted.setText("on-going");
5759
isCompleted.setStyle("-fx-background-color: #ffa500");
5860
}
61+
milestone.setText(deliverable.getMilestone().toString());
5962
}
6063

6164
@Override

src/main/resources/view/DarkTheme.css

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -308,19 +308,11 @@
308308
-fx-vgap: 3;
309309
}
310310

311-
#tags .label {
311+
#role, #isCompleted, #milestone {
312312
-fx-text-fill: white;
313313
-fx-background-color: #3e7b91;
314314
-fx-padding: 1 3 1 3;
315315
-fx-border-radius: 2;
316316
-fx-background-radius: 2;
317317
-fx-font-size: 11;
318318
}
319-
320-
.tag_label {
321-
-fx-text-fill: white;
322-
-fx-padding: 1 3 1 3;
323-
-fx-border-radius: 2;
324-
-fx-background-radius: 2;
325-
-fx-font-size: 11;
326-
}

0 commit comments

Comments
 (0)