buupe / inquisitor Goto Github PK
View Code? Open in Web Editor NEWAn end-to-end system for BU UPE recruitment season
Home Page: https://upe.bu.edu/inquisitor/
License: MIT License
An end-to-end system for BU UPE recruitment season
Home Page: https://upe.bu.edu/inquisitor/
License: MIT License
In the future it'd be nice to be able to work on the site and not worry about messing up actual user's data. To do so, we need a staging environment. Will require adding back the develop branch, which will essentially be the pre-release version of inquisitor. Branches will be made off develop and merged back into develop, and when it's time for a release a PR from develop to master will occur to bring in new features.
This way we can have a staging environment in which we can mess with data as much as we want without fear of accidentally deleting real user data. Will need more rigorous code review when pulling into master to make sure stuff doesn't break existing data.
Add Redux to the application so that there exists a global state. A lot of our components share information so this will reduce the headache of passing down information to child components. This will also make it easy to save interview notes all at once (#2) since the app will know about all state at all times.
Documentation from SendGrid API:
Upon further research into the SendGrid API, it might actually be a good idea to create a dedicated email portal that allows UPE Admins & EBoard to directly manage and produce emails without touching the SendGrid page, but for now, and in an effort to not try to replicate the entire SendGrid build tool, for now, I'll have an admin page that re-directs to sendgrid
Instead of having individual save buttons for each question, have the submit button (or closing the application prematurely) save everything to the database. Perhaps including a timer that auto-saves every 5 minutes may be useful, or perhaps save whenever an input loses focus (the latter may be too many saves, not sure on the performance hit). This will be made easier by implementing global state with Redux (#14).
When a new interview starts, the interviewee picks up where the last one started
Tried this before and it caused the app to lag severely, perhaps there are better implementations to try now
Need to wrap set interval in a use effect hook with value of timer as dep. Make sure to clear interval on unmount, and set state can take a function that modifies current value
pages
folder where full pages (such as Apply, Create, etc.) live, and have the components folder hold only components.~~Replace Firebase with PostgreSQL. For our purposes, there's no real reason to do so, but using PostgreSQL will be a good learning opportunity as SQL is used extensively in the real world. To accomplish this, we'll make use of the node-postgres ORM, and we'll use a PostgreSQL instance from Heroku.
Switch the generalSettings.js to use immutability helper to set values
Scope settings ie
{
general: {}.
timeslots: {},
...
}
Abstract rendering of settings so the file isnt huge
Use Prettier to enforce code style. Use pretty-quick to automatically apply them instead of annoying people.
Try looking up how to implement Firepad in React, see if it's viable. Ask a maintainer how it affects usage quota.
Otherwise just use Draft.js to make a text field for each interviewer (they only see they their own values, might be better that way)
Create a page that will allow taking attendance of candidates at recruitment events. This can just be a simple form of name, year, email, major, etc. Use preloading, such that if a candidate came to a previous event and starts typing their name, it should pop up and they can just prefill their information. Similarly, when applying, if a user exists from a recruitment event, pull their information to prefill some of the form.
Tasks
recruitmentteam
rolenonmember
role and add upemember
role). Perhaps the congrats email can have a link to the main site profile page so people can check out their profile and edit it (does the main site allow them to upload their own pictures? Would ease work of admins, just tell people to upload professional images. In future seasons when you can meet in person, just tell them to update the images with the initiation photos when they get them. can distribute photos via google drive team)applicant
role from them (don't worry about deleting applications/timeslots etc, as when next season starts you can just press the delete inquisitor data button to clear all that).Stretch Goals
Data that will be needed:
Data that will exist (make dummy data for now)
questions
collection that holds all the questions and are pulled during interview session){ // levels are keys
Easy: [
{
id: QUESTION ID, // id of the question to grab
order: ORDER # // where to order it
},
...
],
Medium: [
{
id: QUESTION ID,
order: ORDER #
},
...
],
Hard: [
{
id: QUESTION ID,
order: ORDER #
},
...
],
...
}
{
interviewers: {
interview1UID: NAME VALUE,
interview2UID: NAME VALUE
},
applicant: {
uid: UID VALUE,
name: NAME VALUE
},
level: LEVEL VALUE,
scores: { // resume and final notes will be "questions" so theyll be here, score will be something like "N/A" or some value that we ignore for stats
interview1UID: {
question1Id: SCORE VALUE,
question2Id: SCORE VALUE,
...
},
interview2UID: {
question1Id: SCORE VALUE,
question2Id: SCORE VALUE,
...
}
},
notes: { // resume and final notes will be "questions" so theyll be here
interview1UID: {
question1Id: NOTES VALUE,
question2Id: NOTES VALUE,
...
},
interview2UID: {
question1Id: NOTES VALUE,
question2Id: NOTES VALUE,
...
}
}
}
{
responses: [ // can hard code grabbing of name, grad year, major/minor, resume since those ids will never change
{
id: application question id,
name: application question name,
order: order it appeared in application,
type: type of question,
value: Value user gave for question
},
...
],
semester: Semester-Year of this application
}
Tasks:
/pages
, so url will be upe.bu.edu/interview/room)
Change the buttons in navbar to only show to users who have access to it
DB Schema
/
- /users
- /uids
- /events
- /inquisitor
-- applicationFormConfig
-- generalSettings
--/data
----/applications
----/timeslots
Timeslot Doc Example
{
time: Date
interviewers: {
uid1: true, // change this to the interviewer name so we can use it later
uid2: true
},
applicant: {
uid,
name
},
timeslotLength
}
Tasks
location
prop to a page. Used originally for savePathname()
to know the right path, but now we just use the useLocation
hook, so passing the location
prop is unnecessaryKeep in mind these are conducted virtually now, so have some sort of location option for timeslots that can be emailed to users (zoom rooms, or an address, etc). If its zoom, see if theres an integration to generate links
Currently interviewers have to fill in a candidate's information on creating an interview, however if a candidate applied through this application we have their information already. Refactor the component to load candidates from the database, filtering to show only the ones who should be there for that timeslot. This will have to wait until #6 and #8 are completed.
Detail how to implement pages properly, quirks specific to this project, etc
Generalize the component to allow the Overview, Resume, and Submit tabs to work. Also convert the component to a class to simplify state and effects.
Dealt with this before for QuaranteenU, just need to check the fix again. Low priority because people applying probably won't hit the unsubscribe button.
@BUUPE/eboard Please review emails for wording
Not a big deal as it's a warning during build and doesn't break the app. Likely due to the webpack config of our React Components.
Change Form.File type in the QuestionDisplay form to be a custom type Form.File instead of the regular one as to match the file upload style present in the application.
selectedTimeslots
to timeslots
in interviewer view[1] Trades efficiency of write operations for allowing interviewers greater control over selecting their slot. Currently interviewers can just pick times and the saving logic throws them into whatever slot it can. This way will allow users to pick a slot based on who's in it. When a user clicks a time, if there exists openings in existing slots, show them the existing times in a popup, with the option to create a new one. If there are no openings in a slot, act as if no one has selected (white box)
Currently all the questions are stored in /src/config
, which isn't a good place to store them (nor are they actually application configuration variables). Moving them to a database will make them more secure since they won't be checked into this repository, and easier to keep track of.
/inquisitor/data/questions
At the moment we don't have enough questions to be able to randomly generate question sets for levels, but keep that idea in mind while developing as that is a long-term goal (i.e. develop this in a way that would make random sets easy to integrate in the future)
Currently candidates apply through a Google Form that is made each semester. This should become a page within Inquisitor. It will essentially be the same form, but now we can save candidate information to our database right when they apply, making it easy to auto fill information when conducting interviews.
Create a publicly accessible page that allows users to practice on old questions. Allow users to select a level and then randomly generate an "interview" out of questions from that level. This way potential candidates can get a feel for the questions they might be asked (only select questions that are marked as public to prevent leaking of current interview questions, these questions can be marked through the admin interface in #20).
This task is low priority and requires the following tasks to be completed first:
When a user refreshes the page/application, any question notes/scores that have been saved should be displayed in the interface. However, notes/scores on the submit page don't repopulate when they should.
Wait to do this until #8 is completed.
Change current styling of levelDisplay Card to be bigger (set max width not actual width)
https://github.com/tannerlinsley/react-table
Make it so if the list of question for a specific level passes a certain point it begins scrolling through it.
Create functions on the server using the SendGrid API to send emails. These emails can include application received receipts, timeslot confirmations, accepted/rejected results, etc. UPE has a SendGrid account, ask @ROODAY for an API key.
Change addQuestion in Level Display to be a modal that allows for multi question selection instead of single selection/confirmation
Averages by year, level, interviewer etc. have ways to mark if a person did a question. Get rid of bonuses.
Create an interface for authenticated users (E-Board or other allowed roles) to make configuration changes to the application. This will include editing questions, assigning questions to interview levels, setting their order, editing permissions for who can be an interviewer/see the admin panel, etc.
Currently timeslots for interviews are assigned via a Google Spreadsheet. This should be contained within Inquisitor. Allow UPE members to select times when they are free, and show these as available timeslots for candidates to select from.
Improve the input fields in the application form to be smarter (ie: use conditions/booleans/etc..)
Rename file method for the Firebase storage API to userFile
Since view applications is under /admin, if recruitmentteam users click admin they'll get the auth failed component with no ability to navigate to the view applications page. Either move view applications under a different route or make some more complex routing logic.
Have pre-commit hooks to prevent commits if common issues exist, such as:
.editorconfig
, etc.)Other checks may be included. Make sure there exists a command to quickly apply all fixes the pre-commit hooks suggest so it doesn't get too annoying.
Convert the navbar to use the component from react bootstrap:
https://react-bootstrap.github.io/components/navbar/
This way it will collapse on mobile instead of overflowing
Find a way to deal with deleting questions and removing them from the associated levels, preferably with no data duplication and without going through all levels.
Use Material UI's CSS in JS solution.
Then have IS&T host it permanently as a lambda/S3 combo
After all candidates have completed interviews, compile summary statistics (average score, standard deviation, etc.) Generate slides for each candidate that shows their information along with summary statistics, and allow editing of slides to add in information like application/interview highlights.
Also allow anonymous voting through this page to handle deliberations, the results of which will be deleted after acceptance/rejection emails are sent.
Using BU SSO will add a layer of legitimacy to the application, as well as make it easy to gather basic info about users without asking them to register for the application.
Will require the following:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.