Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
ca978ba
Move goal type to meta
jetkan-yk Aug 8, 2020
dc8e421
Add dashboard useEffect trigger state
jetkan-yk Aug 8, 2020
395aba5
Add handleGetOwnGoal in dashboard
jetkan-yk Aug 8, 2020
587fdb9
Add bulkUpdates
jetkan-yk Aug 8, 2020
71959ab
Initial refactor editor
jetkan-yk Aug 8, 2020
7bcc038
Remove obsolete snapshot tests
jetkan-yk Aug 8, 2020
fcdce94
Add bulkUpdateGoals
jetkan-yk Aug 9, 2020
b5b9d9e
Use isNaN as focusId default state
jetkan-yk Aug 9, 2020
1aeae0b
Specialise types
jetkan-yk Aug 9, 2020
bf6cc45
Use type assertion on goaldef, formatting
jetkan-yk Aug 9, 2020
55a5378
Edit publishState
jetkan-yk Aug 9, 2020
bb73f5b
controlId encapsulation
jetkan-yk Aug 9, 2020
d89231d
Merge branch 'master' into jet/control-2
jetkan-yk Aug 9, 2020
2406831
use cloneDeep for editable
jetkan-yk Aug 10, 2020
def41ac
useContext for inferencer
jetkan-yk Aug 10, 2020
9048cde
WIP card editor style update
jetkan-yk Aug 10, 2020
7e8bc4b
Refactor editable card
jetkan-yk Aug 11, 2020
e7f2a8e
Merge branch 'master' into jet/control-2
jetkan-yk Aug 11, 2020
13180f6
Fix test
jetkan-yk Aug 11, 2020
30a9621
Remove unused editable components
jetkan-yk Aug 11, 2020
42bede2
Implement change position, remove redundant items
jetkan-yk Aug 12, 2020
3b5eef3
Move publish handlers to achievement control
jetkan-yk Aug 12, 2020
e180110
Move files
jetkan-yk Aug 12, 2020
fdd4304
Implement prereqId editor
jetkan-yk Aug 12, 2020
301c355
Rename files
jetkan-yk Aug 12, 2020
68bba6d
Implement editableGoalIds
jetkan-yk Aug 12, 2020
d00bfd3
Implement goal editor
jetkan-yk Aug 12, 2020
0047e53
Move files
jetkan-yk Aug 12, 2020
0cf3d08
Move maxExp field to goalMeta and goalProgress
jetkan-yk Aug 13, 2020
9672325
Update goal types and inferencer
jetkan-yk Aug 13, 2020
dfe6c1b
Remove forceRender()
jetkan-yk Aug 13, 2020
2c609f3
Update achievement editor style
jetkan-yk Aug 14, 2020
009e451
Update dialog style
jetkan-yk Aug 14, 2020
4c3de9b
Update goal container style
jetkan-yk Aug 14, 2020
ef44b8a
Add titleToId and textToId
jetkan-yk Aug 14, 2020
e9b62b1
Goal style
jetkan-yk Aug 14, 2020
a808949
Rename tooltip
jetkan-yk Aug 14, 2020
b589a89
Add editableMeta
jetkan-yk Aug 15, 2020
4f45030
Declare boolean expression types
jetkan-yk Aug 15, 2020
6c9e304
Merge branch 'master' into jet/control-2
jetkan-yk Aug 15, 2020
09d369f
use DialogHelper & NotificationHelper
jetkan-yk Aug 15, 2020
299d386
Fix editable date style
jetkan-yk Aug 15, 2020
a6548bd
Use Collapse in task
jetkan-yk Aug 15, 2020
b76d4b5
Add prompt in achievementControl
jetkan-yk Aug 16, 2020
9f0df05
Restore milestone
jetkan-yk Aug 16, 2020
c47a4dc
Merge branch 'master' into jet/control-2
jetkan-yk Aug 16, 2020
7149efd
Rename exp to xp, assessmentId to assessmentNumber
jetkan-yk Aug 16, 2020
37a141f
Rename cardTileUrl, canvasUrl
jetkan-yk Aug 16, 2020
f483e6b
Update delete item prompt text
jetkan-yk Aug 16, 2020
6ac8f26
Add error logging in inferencer
jetkan-yk Aug 16, 2020
0f4fee1
Fix delete achievement & goal bug
jetkan-yk Aug 16, 2020
f07ecd7
Fix formatting
jetkan-yk Aug 16, 2020
420c166
Merge branch 'master' into jet/control-2
jetkan-yk Aug 16, 2020
133fdf0
Restrict prop types
jetkan-yk Aug 16, 2020
cb9d150
Implement goal meta editor
jetkan-yk Aug 16, 2020
29a4051
Implement meta editor
jetkan-yk Aug 17, 2020
12b16a3
Sort props
jetkan-yk Aug 17, 2020
a99dfb9
useReducer in editableGoal
jetkan-yk Aug 17, 2020
82dbaf7
useReducer in editableCard
jetkan-yk Aug 17, 2020
343c00a
Fix bad set state issue
jetkan-yk Aug 17, 2020
bfea6e0
Change insert before pos to insert at pos
jetkan-yk Aug 17, 2020
839feac
Edit milestone
jetkan-yk Aug 17, 2020
48c1502
Update comments
jetkan-yk Aug 17, 2020
0ab3824
Change forceRender to forceUpdate
jetkan-yk Aug 19, 2020
fd64646
Strongly type editablecard reducer
jetkan-yk Aug 19, 2020
4b1ec92
Strongly type editablegoal
jetkan-yk Aug 19, 2020
284a1a1
Rename handlers
jetkan-yk Aug 19, 2020
090f8f9
refactor editablemeta
jetkan-yk Aug 19, 2020
bd9138d
usereducer for toggle view mode
jetkan-yk Aug 19, 2020
01a237b
Simplify inferencer create context
jetkan-yk Aug 20, 2020
fc50203
Minor changes to control
jetkan-yk Aug 20, 2020
74c1d54
Rename editable types
jetkan-yk Aug 20, 2020
7b434c2
Update mocks, sort control item order
jetkan-yk Aug 20, 2020
f960d17
Update inferencer tests
jetkan-yk Aug 20, 2020
28e7f28
Add inferencer test
jetkan-yk Aug 22, 2020
7409a3e
Add xp attribute to inferencer node
jetkan-yk Aug 22, 2020
7085156
Remove duplicate prereqId and goalId
jetkan-yk Aug 22, 2020
e90c0b2
Add xp system tests
jetkan-yk Aug 22, 2020
85e797b
Add prereq tests
jetkan-yk Aug 22, 2020
9c74aee
Remove asserts
jetkan-yk Aug 22, 2020
bc8a2cd
Fix inferencer bug
jetkan-yk Aug 22, 2020
408318b
Merge branch 'master' into jet/control-2
jetkan-yk Aug 22, 2020
98b7733
Add deadline tests
jetkan-yk Aug 23, 2020
09dab06
Add status test
jetkan-yk Aug 23, 2020
0cd4c88
Add setter & position test, fix normalize position
jetkan-yk Aug 23, 2020
d504ef6
Add edge cases
jetkan-yk Aug 23, 2020
af4a3e7
Merge branch 'master' into jet/control-2
jetkan-yk Sep 23, 2020
54148ef
Merge branch 'master' into jet/control-2
jetkan-yk Jan 22, 2021
fc0b75f
Add achievement backend flag in .env
jetkan-yk Jan 22, 2021
e372371
Fix self/goal API
jetkan-yk Jan 22, 2021
11fd491
Merge branch 'master' into jet/control-2
jetkan-yk Jan 22, 2021
99a5f1c
Fix merge errors
jetkan-yk Jan 22, 2021
1141c7c
Merge branch 'master' into jet/control-2
martin-henz Feb 9, 2021
1b976d2
Merge branch 'master' into jet/control-2
martin-henz Feb 9, 2021
f7667f4
Changed POST to PUT in RequestsSaga
jonas-chow Feb 10, 2021
5d0c3a4
Renamed all achievement-related ID to UUID
jonas-chow Feb 10, 2021
432b6ec
Merge branch 'master' into jet/control-2
martin-henz Feb 10, 2021
17f132f
Added conversion from front to backend achievement
jonas-chow Feb 10, 2021
cffea08
Make AchievementBackender more explicit
jonas-chow Feb 10, 2021
a4fb354
Revert "Make AchievementBackender more explicit"
jonas-chow Feb 10, 2021
b4cfb30
Revert "Added conversion from front to backend achievement"
jonas-chow Feb 10, 2021
fb3300c
Merge branch 'uuid-cleanup' into jet/control-2
jonas-chow Feb 10, 2021
549fa18
Fixed style issues.
jonas-chow Feb 11, 2021
ac7c2ae
Merge branch 'master' into jet/control-2
martin-henz Feb 17, 2021
c162b2c
Beautify BinaryGoal in GoalEditor
jonas-chow Feb 19, 2021
f49bf40
Add JSON.stringify before sending request
jonas-chow Feb 19, 2021
c7fce4f
Fix communication between front and backend.
jonas-chow Feb 20, 2021
2596e76
Merge branch 'backend-sync' into jet/control-2
jonas-chow Feb 20, 2021
94bd7e8
Fixed style issues
jonas-chow Feb 20, 2021
1388bc4
Merge branch 'jet/control-2' of https://github.com/source-academy/cad…
jonas-chow Feb 20, 2021
aef186d
Commented out sorting-based tests
jonas-chow Feb 21, 2021
10bd44a
Fix removeAchievement test to take a uuid instead
jonas-chow Feb 21, 2021
7089429
Remove JSON.stringify calls
jonas-chow Feb 21, 2021
88cc557
Added function to rename goalMeta from backend
jonas-chow Feb 21, 2021
5bfdd97
Changed double quotes to single quotes
jonas-chow Feb 21, 2021
f6cf097
Remove camelCase conversion, fix achievement sort and delete
jonas-chow Feb 22, 2021
2daa3c1
Moved AchievementBackender to commons
jonas-chow Feb 22, 2021
4b6e084
Fix fomatting issues
jonas-chow Feb 22, 2021
7d81170
Allows for staff to edit manual goal progress
jonas-chow Mar 3, 2021
853c363
Fixed style issues
jonas-chow Mar 9, 2021
d19ab9c
Merge branch 'sa2122-achievements' of https://github.com/source-acade…
jonas-chow Mar 9, 2021
eff188a
Added EventHandler to be called when event happens
jonas-chow Mar 13, 2021
cbbd6b3
Allowed EventGoal to have multiple events and condition
jonas-chow Mar 14, 2021
ee1b1d8
Major Achievement Overhaul
jonas-chow Apr 14, 2021
20cc20f
Fixed achievement tests, and a few other bug fixes
jonas-chow Apr 15, 2021
dfdaf0f
Fixed formatting
jonas-chow Apr 15, 2021
d7cc61b
Fixed tests, handled null deadline.
jonas-chow Apr 15, 2021
c41bee7
Moved Run Code event to when button is clicked.
jonas-chow Apr 15, 2021
58189ba
Fixed formatting.
jonas-chow Apr 15, 2021
76dd01a
Replace deprecated Tooltip with Tooltip2.
jonas-chow Apr 15, 2021
f7a76b0
Improved event goal conditionals.
jonas-chow Apr 15, 2021
a66b125
Fixed achievement prerequisite behavior.
jonas-chow Apr 15, 2021
4f50f8a
Fixed formatting.
jonas-chow Apr 15, 2021
bd937ce
Added multiple goal and event types.
jonas-chow Apr 16, 2021
afc7243
Fixed formatting.
jonas-chow Apr 16, 2021
23762d3
Added variable XP achievements.
jonas-chow Apr 16, 2021
3ec298e
Added infinite loop check in eventHandler
jonas-chow Apr 16, 2021
4fbf624
Fixed formatting.
jonas-chow Apr 16, 2021
7bfc677
Fixed bug where invalid goal stays on when deleted
jonas-chow Apr 16, 2021
0e4915c
Fixed AchievementManualEditor redundant code.
jonas-chow Apr 16, 2021
37f2479
Fixed formatting.
jonas-chow Apr 16, 2021
8c2a86a
Added Run Testcase Event Type.
jonas-chow Apr 16, 2021
69b4278
Revert an accidentally added newline.
jonas-chow Apr 16, 2021
ff119cc
Merge branch 'master' into sa2122-achievements
martin-henz Apr 17, 2021
b6b0c02
Fixed backend endpoints.
jonas-chow Apr 18, 2021
98817f1
Merge branch 'master' into sa2122-achievements
jonas-chow Apr 18, 2021
439e005
Memoised AchievementControl.
jonas-chow Apr 18, 2021
35c9dc0
Fixed formatting.
jonas-chow Apr 18, 2021
470c1b1
Merge branch 'sa2122-achievements' of https://github.com/source-acade…
jonas-chow Apr 18, 2021
3bb1177
Shifted event handling into the saga.
jonas-chow Apr 19, 2021
0aea648
Removed XP and achievement type goals.
jonas-chow Apr 19, 2021
69f3fa2
Made inferencer constructor create deep clones.
jonas-chow Apr 19, 2021
938e837
Fixed formatting.
jonas-chow Apr 19, 2021
6e3b87d
Fixed tests related to equality of inferencer.
jonas-chow Apr 19, 2021
0d7ebb6
Fixed formatting.
jonas-chow Apr 19, 2021
b58efc9
Renamed eventHandler to EventHandler.
jonas-chow Apr 19, 2021
1852d7d
Fixed typo.
jonas-chow Apr 19, 2021
d298238
Merge branch 'master' into sa2122-achievements
jonas-chow May 3, 2021
42e5f54
Merge branch 'master' into sa2122-achievements
jonas-chow May 20, 2021
70b2378
Shorten event delay, remove constant for mock achievements.
jonas-chow May 20, 2021
c0f1867
Fixed formatting.
jonas-chow May 20, 2021
3c73cf6
Fixed formatting.
jonas-chow May 20, 2021
4a96cba
Added type annotations to AchievementSaga
jonas-chow May 20, 2021
a8bb35e
Merge branch 'master' into sa2122-achievements
chownces May 24, 2021
2d89b38
Added condition to check for login in events
jonas-chow May 31, 2021
ac59d4f
Merge branch 'sa2122-achievements' of https://github.com/source-acade…
jonas-chow May 31, 2021
7526ad6
Merge branch 'master' into sa2122-achievements
jonas-chow May 31, 2021
8364926
Used moment.js in achievement DateHelper.
jonas-chow May 31, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 9 additions & 41 deletions src/commons/achievement/utils/DateHelper.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import moment from 'moment';

const now = new Date();

export const isExpired = (deadline?: Date) => deadline !== undefined && deadline <= now;
Expand Down Expand Up @@ -36,61 +38,27 @@ export const timeFromExpired = (deadline?: Date) =>
export const prettifyDate = (deadline?: Date) => {
if (deadline === undefined) return '';

const months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];
const day = deadline.getDate();
const month = months[deadline.getMonth()];
const year = deadline.getFullYear();
const hour = deadline.getHours();
const minute = deadline.getMinutes();
const time = (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute;

return `${day} ${month} ${year} ${time}`;
return moment(deadline).format('D MMMM YYYY HH:mm');
};

export const prettifyTime = (time?: Date) => {
if (time === undefined) return '';
const hour = time.getHours();
const minute = time.getMinutes();
return (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute;
return moment(time).format('HH:mm');
};

// Converts Date to deadline countdown
export const prettifyDeadline = (deadline?: Date) => {
/* ---------- Date constants ---------- */
const daysPerWeek = 7;
const hoursPerDay = 24;
const millisecondsPerHour = 3600000;

/* -------- Helper for Deadline -------- */
const isExpired = (deadline: Date): boolean => deadline.getTime() <= now.getTime();
const getHoursAway = (deadline: Date): number =>
(deadline.getTime() - now.getTime()) / millisecondsPerHour;
const getDaysAway = (deadline: Date): number => getHoursAway(deadline) / hoursPerDay;
const getWeeksAway = (deadline: Date): number => getDaysAway(deadline) / daysPerWeek;

/* -------- Prettifies Deadline -------- */
if (deadline === undefined) {
return 'Unlimited';
} else if (isExpired(deadline)) {
return 'Expired';
}

const weeksAway = Math.ceil(getWeeksAway(deadline));
const daysAway = Math.ceil(getDaysAway(deadline));
const hoursAway = Math.ceil(getHoursAway(deadline));
const now = moment();

const weeksAway = Math.ceil(moment(deadline).diff(now, 'weeks', true));
const daysAway = Math.ceil(moment(deadline).diff(now, 'days', true));
const hoursAway = Math.ceil(moment(deadline).diff(now, 'hours', true));

let prettifiedDeadline = '';
if (weeksAway > 1) {
Expand Down
17 changes: 10 additions & 7 deletions src/commons/achievement/utils/EventHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
GoalType
} from '../../../features/achievement/AchievementTypes';
import { store } from '../../../pages/createStore';
import Constants from '../../utils/Constants';
import { showSuccessMessage } from '../../utils/NotificationsHelper';
import AchievementInferencer from './AchievementInferencer';
import { isExpired, isReleased, isWithinTimeRange } from './DateHelper';
Expand Down Expand Up @@ -74,13 +75,15 @@ function resetLoggedEvents() {
}

export function processEvent(eventNames: EventType[]) {
loggedEvents.push(eventNames);
if (store.getState().session.role && !Constants.playgroundOnly && Constants.enableAchievements) {
loggedEvents.push(eventNames);

if (!timeoutSet) {
timeoutSet = true;
setTimeout(() => {
store.dispatch(handleEvent(loggedEvents));
resetLoggedEvents();
}, updateInterval);
if (!timeoutSet) {
timeoutSet = true;
setTimeout(() => {
store.dispatch(handleEvent(loggedEvents));
resetLoggedEvents();
}, updateInterval);
}
}
}