Anesthesia Test Prep LMS
This project was made when I was doing freelance work for a client, and it was my first time to do web development. This project uses Angular for the frontend, while the backend uses the GCP Firebase platform which handles cloud storage, cloud functions, authentication, and a Firestore NoSql database which also allows for authorization rules.
The code for this project has to remain private since it was made for a client. However, I can show some of the features of the site. This site uses a variety of learning options, and it gives admin a lot of control over everything on the site including theme and logo, as well as a custom builder for pages.
The Library
The Library is the the section of the website devoted to lessons targeting specific topics. The lessons can include numerous media types like audio, video, and images. Each lesson can also have a list of references, resources, or links for further study. The client wanted topics to be organized under a tree structure and lessons can be found anywhere within that hierarchy. Another structure can be reached by the tabs above the topic tree which organizes the topics with tiles.
Lessons can be changed from the tree view or from the button on the bottom right. The current lesson will always be highlighted in the treeview. Breadcrumbs can also be used for navigation.
The Written Questions
The written questions have the most functionality and are the most complex. There are multiple test modes including tutor mode, test mode, and timed tests. Tests can be auto generated selecting topics and the type of questions to pull from those topics like new questions, already answered questions, or questions that were previously answered incorrectly.
Precreated "recommended" tests can also be taken by users instead of creating dynamic tests from the question bank. Tests can be saved in progress and revisited later as well.
Tests in tutor mode will immediately display the answer after each question. These views will display the percentage of users who selected each option in the question. There is also an explanation for the answer and a link to the library lesson that is related to the question. A progress bar keeps track and displays the number of questions answered and questions remaining.
The normal test mode does not immediately show the correct answer. Answers will be displayed at the end in a report. Like the tutor mode, each question's difficulty can be voted on by the user. These votes are another statistic tracked for each question. Questions can be bookmarked and navigation between questions in the test can be done in the sidebar.
The test report shows various details. It has the percentage the user answered correct and compares it to the percentage other users in various categories like their program and their year got correct. It gives the option to retake a test with just the questions answered incorrectly, the whole test, or a review of the test which includes the same views as tutor mode with the questions already answered by the user's previous reponses.
The Case Sections
The "Case" sections are composed of both the Oral and OSCE prep materials. These sections are organized more simply than the other sections. They are based on topics from the actual exam and each topic has a list of cases underneath it. Each list of cases shows the ones that have been marked as complete, liked, or disliked. The cases shown can be filtered based on several different options.
The cases are organized by sections and subsections where either one can contain questions and answers and any item can contain media like images, video, or audio. The questions are treated more like a study guide where the user reads and answers the question, then reveals the answer in the dropdown to verify if they were correct.
The User Dashboard
The user dashboard contains a lot of information. It shows the total number of questions answered and the number of question that remain unanswered. It shows the total number of generated tests taken and recommended tests taken. It also includes a countdown for the number of days before the official test.
The top two charts show a comparison between the scores the user has versus the scores of the site as a whole. These comparisons can be narrowed with select boxes that contain various statuses of users on the site.
The user dashboard has a history of tests taken with various statistics, and it has several graphs to visualize the user's progress. This dashboard view is specifically for Basic Written questions. There is also an Advanced Written questions view, and separate views for Orals and OSCE.
The Admin Dashboard
The Admin Dashboard contains a summary of site usage, finance, and login history. It also shows statistics for various topics and the users based on their defined statuses. The view can be changed with the select box on the top left to see other categories.
Creating Lessons
Lessons for the library are organized in a system similar to that seen in the MacOS file system. The admin can add new lessons under a topic or they can edit existing lessons. Topics and lessons can be dragged and dropped to any of the columns.
Below is the create/edit lesson view. Here the admin can assign various details or media to a lesson.
Creating Questions
The questions are organized in the same way as the library lessons. The main difference is that there is a separate view to create recommended tests that can be shown by clicking the toggle on the top right. Questions can be edited or added in a similar view as the library lessons.
Creating Cases
Oral and OSCE cases are organized, edited, and added in views similar to the written and library lessons.
Program Dashboards
The program dashboards are built around the idea that users would be organized into programs according to things like school or residency program. This first dashboard view shows a high level breakdown of all the users for the program based on their defined status.
This second dashboard view showed a detailed summary of all the users for the program that are defined with a CA-1 status. It shows a break down of their overall results by topic, and it shows a summary of correct vs incorrect for each user. The program director is able to recommend certain topics to users in this view as well. The percentage correct ranges are all color coded.
This last dashboard shows a detailed summary for all users in the program. In this instance it can be seen that the CA-1 users are performing slightly worse than the users with other statuses.
Creating Custom Pages
The client wanted full control over the content on the site. This also allowed for someone to change the entire site content to serve another purpose or to be an LMS for another organization. Because of this the home page and other pages outside of the LMS content can be created custom and connected by navigation components.
Subscription Options
There were many subscription options created for users to access content on the website. Access to specific parts of the website are based on whether the user has the right kind of subscription for that content.
Conclusion
This project was harder than most for me because it required me to follow someone else's vision, and I did not feel much freedom to question things unless I felt it was important. It worked out fine, but it required me to add on a lot of additional functionality that I was not able to include in the original architecture I planned. This was not the fault of me or the client though. I think most of the issues were caused by the fact that the client had tried to create an LMS with a pair of programmers before with a different product, and they had repeatedly told him that things were not possible. This seems to be a trend with some programmers, but I never see things that way. With programming, virtually anything is possible.
Similar to every project I've done, I have a desire to refactor and improve this project. I think I always feel this way because I continue to learn more and more, and find better ways to do things. For this specific project, I would like to remove the dependency on Firebase and use an API that I can have more control over. I would also like to try it with supabase.