Skip to content

Commit 89ae58f

Browse files
committed
Add task original due to calculate the next task due date based on number of times completed and the task repetition for the specified task
1 parent b3a85f2 commit 89ae58f

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

src/components/NewTodo.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export interface todoTask {
7373
newId: number;
7474
completed: boolean;
7575
timesCompleted: number;
76+
originalDueDate: Date;
7677
}
7778
const currentUtcDate: Date = new Date();
7879
const currentLocalDate: Date = new Date(
@@ -93,6 +94,7 @@ export default defineComponent({
9394
newId: 0, //initial id is 0
9495
completed: false, //task not completed if task is created
9596
timesCompleted: 0,
97+
originalDueDate: currentLocalDate.toISOString().split("T")[0],
9698
};
9799
},
98100
mounted() {
@@ -101,6 +103,7 @@ export default defineComponent({
101103
},
102104
methods: {
103105
addTodo: function (): void | todoTask[] {
106+
this.originalDueDate = this.dueDate; //set task original due date to entered task due date
104107
store.dispatch("createTask", this);
105108
this.newId++;
106109
this.task = "";
@@ -111,6 +114,7 @@ export default defineComponent({
111114
this.repeatFrequency = repeatFrequency.Once;
112115
this.completed = false;
113116
this.timesCompleted = 0;
117+
this.originalDueDate = currentLocalDate.toISOString().split("T")[0];
114118
},
115119
},
116120
});

src/components/TodoList.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export default defineComponent({
7878
xp: Number,
7979
completed: Boolean,
8080
timesCompleted: Number,
81+
originalDueDate: Date,
8182
},
8283
computed: {
8384
todos() {

src/store/index.ts

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export default createStore({
9292
repeatOften: payload.repeatOften as number,
9393
repeatFrequency: payload.repeatFrequency as number,
9494
timesCompleted: payload.timesCompleted as number,
95+
originalDueDate: payload.originalDueDate as Date,
9596
};
9697
state.todos.unshift(createTask);
9798
},
@@ -100,9 +101,132 @@ export default createStore({
100101
(todo: { newId: number }) => todo.newId === payload
101102
);
102103
if (item.repeatFrequency == 5) {
104+
//if task is a one-time only
103105
item.completed = !item.completed; //complete task item
104106
} else {
105107
item.timesCompleted++; //increment number of times task has been completed by 1
108+
if (item.repeatFrequency == 1) {
109+
const newDueDate: Date = new Date(
110+
new Date(item.originalDueDate + " 23:59:59.999").setDate(
111+
new Date(item.originalDueDate + " 23:59:59.999").getDate() +
112+
item.timesCompleted * item.repeatOften
113+
)
114+
); //get new due date
115+
const adjustedNewDueDate: Date = new Date(
116+
newDueDate.setMinutes(
117+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
118+
)
119+
); //convert to local timezone
120+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0]; //convert due date to YYYY-MM-DD string
121+
} else if (item.repeatFrequency == 2) {
122+
const newDueDate: Date = new Date(
123+
new Date(item.originalDueDate + " 23:59:59.999").setDate(
124+
new Date(item.originalDueDate + " 23:59:59.999").getDate() +
125+
item.timesCompleted * item.repeatOften * 7
126+
)
127+
);
128+
const adjustedNewDueDate: Date = new Date(
129+
newDueDate.setMinutes(
130+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
131+
)
132+
);
133+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0];
134+
} else if (item.repeatFrequency == 3) {
135+
const monthsAfter: Date = new Date(
136+
new Date(item.originalDueDate + " 23:59:59.999").setMonth(
137+
new Date(item.originalDueDate + " 23:59:59.999").getMonth() +
138+
item.timesCompleted * item.repeatOften
139+
)
140+
);
141+
if (
142+
monthsAfter.getMonth() !=
143+
(new Date(item.originalDueDate + " 23:59:59.999").getMonth() +
144+
item.timesCompleted * item.repeatOften) %
145+
12
146+
) {
147+
//if task due date is more than days of the month, set to last day of month
148+
const newDueDate: Date = new Date(
149+
new Date(item.originalDueDate + " 23:59:59.999").getFullYear(),
150+
new Date(item.originalDueDate + " 23:59:59.999").getMonth() +
151+
item.timesCompleted * item.repeatOften +
152+
1,
153+
0,
154+
23,
155+
59,
156+
59,
157+
999
158+
);
159+
const adjustedNewDueDate: Date = new Date(
160+
newDueDate.setMinutes(
161+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
162+
)
163+
);
164+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0];
165+
} else {
166+
const newDueDate: Date = new Date(
167+
new Date(item.originalDueDate + " 23:59:59.999").getFullYear(),
168+
new Date(item.originalDueDate + " 23:59:59.999").getMonth() +
169+
item.timesCompleted * item.repeatOften,
170+
new Date(item.originalDueDate + " 23:59:59.999").getDate(),
171+
23,
172+
59,
173+
59,
174+
999
175+
);
176+
const adjustedNewDueDate: Date = new Date(
177+
newDueDate.setMinutes(
178+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
179+
)
180+
);
181+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0];
182+
}
183+
} else {
184+
const yearsAfter: Date = new Date(
185+
new Date(item.originalDueDate + " 23:59:59.999").setFullYear(
186+
new Date(item.originalDueDate + " 23:59:59.999").getFullYear() +
187+
item.timesCompleted * item.repeatOften
188+
)
189+
);
190+
if (
191+
yearsAfter.getMonth() !=
192+
new Date(item.originalDueDate + " 23:59:59.999").getMonth()
193+
) {
194+
//if task due date don't have leap year, set task due date to February 28
195+
const newDueDate: Date = new Date(
196+
new Date(item.originalDueDate + " 23:59:59.999").getFullYear() +
197+
item.timesCompleted * item.repeatOften,
198+
new Date(item.originalDueDate + " 23:59:59.999").getMonth() + 1,
199+
0,
200+
23,
201+
59,
202+
59,
203+
999
204+
);
205+
const adjustedNewDueDate: Date = new Date(
206+
newDueDate.setMinutes(
207+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
208+
)
209+
);
210+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0];
211+
} else {
212+
const newDueDate: Date = new Date(
213+
new Date(item.originalDueDate + " 23:59:59.999").getFullYear() +
214+
item.timesCompleted * item.repeatOften,
215+
new Date(item.originalDueDate + " 23:59:59.999").getMonth(),
216+
new Date(item.originalDueDate + " 23:59:59.999").getDate(),
217+
23,
218+
59,
219+
59,
220+
999
221+
);
222+
const adjustedNewDueDate: Date = new Date(
223+
newDueDate.setMinutes(
224+
newDueDate.getMinutes() - newDueDate.getTimezoneOffset()
225+
)
226+
);
227+
item.dueDate = adjustedNewDueDate.toISOString().split("T")[0];
228+
}
229+
}
106230
}
107231
},
108232
delete_Todo: (state, payload) => {

0 commit comments

Comments
 (0)