Check if module exists before modulifying
Use object lookup rather than array lookup for modules
Load selected modules before starting history
Properly pluralize module lesson types
Add typeAbbrev inverse mapping, shift typeAbbrev and typeAbbrevInverse to class properties
Only gitignore app/vendor instead of all vendor directories
Alphabetize .gitignore
Switch to prettier querystring instead of url segment for timetable sharing
Merge branch 'url-sharing'
Navigate to timetable if no defined route matches the current URL
Added IVLE button to the module page
Extract semTimetableFragment to common config module; replace direct usage of json config
Extract fromQueryString into classProperties and rename to fromQueryStringToJSON for clarity
Save query string instead of json representation, namespaced to timetable/:academicYear/sem:semester - same as url
Restore timetable from saved query string, converting from legacy JSON format if saved query string does not exist
Detect if timetable is from shared url, do not save changes if shared
Add shared timetable controls to restore or replace saved timetable
Disable broken show/hide module button. To be replaced by individual lesson hiding
Fix legacy selectedModules JSON format conversion
Simplify saved query string key as there is only one per namespace