Skip to content

Commit 5d2cd59

Browse files
committed
Add rank levels
1 parent a63edcf commit 5d2cd59

File tree

4 files changed

+125
-44
lines changed

4 files changed

+125
-44
lines changed

src/components/NewTodo.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,11 @@ export default defineComponent({
9696
repeatInterval: RepeatInterval.Once, //set default task repetition interval to one-time
9797
newId: 0, //initial task id is 0
9898
isCompleted: false, //task not completed if a task is created
99-
timesCompleted: 0,
99+
timesCompleted: 0, //set default task times completed to 0
100100
streak: 0, //set default task streak to 0
101+
rank: 0, //set default task rank to 0
102+
rankXp: 0, //set default task rank XP to 0
103+
rankProgress: 0, //set default rank progress to 0
101104
originalDueDate: currentLocalDate.toISOString().split("T")[0], //set a default original task due date to today
102105
};
103106
},
@@ -124,6 +127,9 @@ export default defineComponent({
124127
this.isCompleted = false;
125128
this.timesCompleted = 0;
126129
this.streak = 0;
130+
this.rank = 0;
131+
this.rankXp = 0;
132+
this.rankProgress = 0;
127133
this.originalDueDate = currentLocalDate.toISOString().split("T")[0];
128134
},
129135
},

src/components/TodoList.scss

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
@use "sass:math";
1+
@use "sass:math"; //use math functions
22

3-
$margin: 10px;
3+
$margin: 10px; //default margin value
44
h3 {
5-
margin: $margin 0 0;
5+
margin: $margin 0 0; //no left, right and bottom margins for displaying task list header
66
}
77

88
ul {
9-
list-style-type: none;
10-
padding: 0;
11-
line-height: 150%;
9+
list-style-type: none; //no bullets for unordered lists
10+
padding: 0; //no padding for unordered lists
11+
line-height: 150%; //more line spacing for easier to read text
1212
}
1313

1414
li {
1515
margin: #{math.div($margin, 2)} $margin; //add line spacing between tasks
1616
}
1717

18-
a {
19-
color: #42b983;
18+
.overdue {
19+
//overdue tasks
20+
color: red; //set text color to red for overdue tasks
21+
font-weight: bold; //bold text for overdue tasks
2022
}
2123

22-
.overdue {
23-
color: red;
24-
font-weight: bold;
24+
#text-numeric-display {
25+
//text output and numeric values display
26+
font-weight: bold; //bold text for output and numeric values
2527
}

src/components/TodoList.vue

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,54 @@
11
<template>
22
<div class="todo-app">
3-
<p>Level: {{ getCurrentLevel.toLocaleString("en-US") }}</p>
4-
<p>XP: {{ getCurrentXp.toLocaleString("en-US") }}</p>
5-
<p>Daily Streak: {{ getCurrentDailyStreak.toLocaleString("en-US") }}</p>
3+
<!--task list app content-->
4+
<p>
5+
Level:
6+
<span id="text-numeric-display">{{
7+
getCurrentLevel.toLocaleString("en-US")
8+
}}</span>
9+
</p>
10+
<p>
11+
XP:
12+
<span id="text-numeric-display">{{
13+
getCurrentXp.toLocaleString("en-US")
14+
}}</span>
15+
</p>
16+
<p>
17+
Daily Streak:
18+
<span id="text-numeric-display">{{
19+
getCurrentDailyStreak.toLocaleString("en-US")
20+
}}</span>
21+
</p>
622
<p>
723
Tasks Completed Today:
8-
{{ getCurrentTasksCompletedToday.toLocaleString("en-US") }}
24+
<span id="text-numeric-display">{{
25+
getCurrentTasksCompletedToday.toLocaleString("en-US")
26+
}}</span>
927
</p>
1028
<p>
1129
Total Tasks Completed:
12-
{{ getCurrentTotalTasksCompleted.toLocaleString("en-US") }}
30+
<span id="text-numeric-display">{{
31+
getCurrentTotalTasksCompleted.toLocaleString("en-US")
32+
}}</span>
33+
</p>
34+
<p>
35+
Score:
36+
<span id="text-numeric-display">{{
37+
getCurrentScore.toLocaleString("en-US")
38+
}}</span>
1339
</p>
14-
<p>Score: {{ getCurrentScore.toLocaleString("en-US") }}</p>
1540
<p>
1641
Best Points Earned After Completing the Task:
17-
{{ getCurrentBestScoreEarned.toLocaleString("en-US") }}
42+
<span id="text-numeric-display">{{
43+
getCurrentBestScoreEarned.toLocaleString("en-US")
44+
}}</span>
1845
</p>
1946
<!--show circular progress bar filled with level progress--><ve-progress
2047
:progress="getCurrentProgress"
21-
>Level {{ getCurrentLevel.toLocaleString("en-US") }}</ve-progress
48+
>Level
49+
<span id="text-numeric-display">{{
50+
getCurrentLevel.toLocaleString("en-US")
51+
}}</span></ve-progress
2252
>
2353
<h3>Task list</h3>
2454
<ul class="todos">
@@ -28,13 +58,26 @@
2858
v-bind:class="{
2959
overdue: new Date(todo.dueDate + ' 23:59:59.999') < new Date(),
3060
}"
31-
>{{ todo.task }} <br />Streak:
32-
{{ todo.streak.toLocaleString("en-US") }} <br />Due date:
33-
{{ todo.dueDate }} <br />Priority: {{ todo.priority }}
34-
<br />Difficulty: {{ todo.difficulty }} <br />Repeat:
35-
<span v-if="todo.repeatInterval != 5">{{
36-
todo.repeatEvery.toLocaleString("en-US")
37-
}}</span
61+
><span id="text-numeric-display">{{ todo.task }}</span> <br />Streak:
62+
<span id="text-numeric-display">{{
63+
todo.streak.toLocaleString("en-US")
64+
}}</span>
65+
<br />Rank:
66+
<span id="text-numeric-display">{{
67+
todo.rank.toLocaleString("en-US")
68+
}}</span>
69+
<br /><progress max="100" :value="todo.rankProgress"></progress
70+
><br />Due date:
71+
<span id="text-numeric-display">{{ todo.dueDate }}</span>
72+
<br />Priority:
73+
<span id="text-numeric-display">{{ todo.priority }}</span>
74+
<br />Difficulty:
75+
<span id="text-numeric-display">{{ todo.difficulty }}</span>
76+
<br />Repeat:
77+
<span v-if="todo.repeatInterval != 5"
78+
><span id="text-numeric-display">{{
79+
todo.repeatEvery.toLocaleString("en-US")
80+
}}</span></span
3881
>&nbsp;<span v-if="todo.repeatInterval == 1">Day</span
3982
><span v-if="todo.repeatInterval == 2">Week</span
4083
><span v-if="todo.repeatInterval == 3">Month</span
@@ -94,6 +137,9 @@ export default defineComponent({
94137
timesCompleted: Number,
95138
streak: Number,
96139
dailyStreak: Number,
140+
rank: Number,
141+
rankXp: Number,
142+
rankProgress: Number,
97143
originalDueDate: Date,
98144
},
99145
computed: {
@@ -136,14 +182,14 @@ export default defineComponent({
136182
* Complete task based on task ID.
137183
* @param id task ID
138184
*/
139-
completeTodo: function (id: number) {
185+
completeTodo: function (id: number): void {
140186
store.dispatch("completeTask", id);
141187
},
142188
/**
143189
* Delete task based on task ID.
144190
* @param id task ID
145191
*/
146-
deleteTodo: function (id: number) {
192+
deleteTodo: function (id: number): void {
147193
store.dispatch("deleteTask", id);
148194
},
149195
},

src/store/index.ts

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@ import { createStore } from "vuex";
22
import createPersistedState from "vuex-persistedstate";
33
interface Todo {
44
//todos task interface
5-
newId: number;
6-
task: string;
7-
dueDate: string | Date;
8-
priority: number;
9-
difficulty: number;
10-
xp: number;
11-
isCompleted: boolean;
12-
repeatEvery: number;
13-
repeatInterval: number;
14-
timesCompleted: number;
15-
streak: number;
16-
originalDueDate: string | Date;
5+
newId: number; //task new id
6+
task: string; //task name
7+
dueDate: string | Date; //task due date
8+
priority: number; //task priority
9+
difficulty: number; //task difficulty
10+
xp: number; //task XP
11+
isCompleted: boolean; //is task completed for one-time tasks
12+
repeatEvery: number; //task repeat every
13+
repeatInterval: number; //task repeat interval
14+
timesCompleted: number; //number of times the task is completed
15+
streak: number; //task streak
16+
rank: number; //task rank
17+
rankXp: number; //task rank XP
18+
rankProgress: number; //task rank progress
19+
originalDueDate: string | Date; //task original due date
1720
}
1821
export default createStore({
1922
state: {
@@ -23,8 +26,8 @@ export default createStore({
2326
todos: [] as Todo[],
2427
user: {
2528
level: 1 as number, //set level to 1 as total XP is 0 when state is created
26-
xp: 0 as number,
27-
progress: 0 as number,
29+
xp: 0 as number, //set xp to 0 when state is created
30+
progress: 0 as number, //set level progress to 0 percent when state is created
2831
score: 0 as number, //set score to 0 when state is created
2932
bestScoreEarned: 0 as number, //the highest number of points earned achieved when the task is completed
3033
dailyStreak: 0 as number, //set daily streak to 0 and last completion date to undefined when state is created
@@ -392,6 +395,26 @@ export default createStore({
392395
activeTasksMultiplier = 27; //27x active task score multiplier from 10,000 active tasks
393396
}
394397
//calculate the amount of XP earned and points earned when the task is completed
398+
const rankXpEarned: number = Math.max(
399+
Math.floor(
400+
(dateMultiplier - 1) ** 2 *
401+
100 *
402+
task.rank *
403+
Math.max(task.streak, 1),
404+
),
405+
1,
406+
); //get at least 1 rank XP when the task is completed
407+
task.rankXp += rankXpEarned; //increase rank XP based on task due date, task streak and task rank
408+
const rankLevel: number = Math.max(
409+
Math.floor(Math.pow(task.rankXp / 100, 1 / 4)),
410+
1,
411+
); //update rank level
412+
task.rank = rankLevel; //set task rank level
413+
task.rankProgress =
414+
((task.rankXp / 100 - Math.pow(task.rank === 1 ? 0 : task.rank, 4)) /
415+
(Math.pow(task.rank + 1, 3) -
416+
Math.pow(task.rank === 1 ? 0 : task.rank, 4))) *
417+
100; //calculate rank level progress and if level is 1 set rank level at the start of level 1 to 0 XP
395418
const xpEarned: number = Math.max(
396419
Math.floor(
397420
task.difficulty *
@@ -416,7 +439,8 @@ export default createStore({
416439
dayTasksMultiplier *
417440
levelMultiplier *
418441
tasksMultiplier *
419-
activeTasksMultiplier,
442+
activeTasksMultiplier *
443+
(1 + task.rank / 10),
420444
),
421445
1,
422446
); //get at least 1 point when the task is completed
@@ -459,6 +483,9 @@ export default createStore({
459483
repeatInterval: payload.repeatInterval as number,
460484
timesCompleted: payload.timesCompleted as number,
461485
streak: payload.streak as number,
486+
rank: payload.rank as number,
487+
rankXp: payload.rankXp as number,
488+
rankProgress: payload.rankProgress as number,
462489
originalDueDate: payload.originalDueDate as Date,
463490
};
464491
state.todos.unshift(createTask);

0 commit comments

Comments
 (0)