Giter Club home page Giter Club logo

timber's Introduction

Timber

Hexlab's mystical new project submission and judging system for hackathons and other events. Goes by many names such as Ballot, Expo, and Timber. Used most recently at HackGT X.

Getting Started

Client

  1. yarn install in the root directory
  2. yarn start

Server

Timber runs on Hexlab's new backend API. Check it out at this link to set up the API repo. Follow the guide in the wiki to understand the architecture of the API and how Timber works behind the scenes. Timber is referred to as 'Expo' in the API repo for future naming reference. However, follow the steps below to set up the server within the expo folder in the API repo

Server

  1. yarn install
  2. cd services/expo
  3. yarn migrate:dev to setup database
  4. yarn seed to seed database

Now, the job isn't finished yet, because if you try to visit the client, it will have an endless loop between login.hexlabs.org and the dev site. This is because we haven't set the value of currentHexathon in the expo config database. Follow these steps next:

  1. Use the create hexathon route to create a hexathon if you don't have one
  2. Use the update currentHexathon config route to set the value as the id of the hexathon object

Finally, you should be able to load the frontend now.

After setting up the API repo and starting it up, the Timber backend is hosted under Expo. In production this is expo.api.hexlabs.org. For local development, this is http://localhost:8007.

Features

Timber has many features to facilitate project submission and judging for a smooth experience for judges, participants, and sponsors. More features are always being developed by Hexlab's tech team. Feel free to suggest a new feature or update by submitting an issue!

Here are an overview of the core features:

Project Submission

Admin Page

Judging

Epicenter

Rankings

Winners

Past Events

Timber has been used at many of Hexlab's past events. These include but are not limited to:

  • Horizons 2024
  • HackGT 10
  • Horizons 2023
  • HackGT 9
  • Horizons 2022
  • Prototypical 2022
  • HackGT 8
  • HealthTech 2021
  • and many more in the future!

timber's People

Contributors

aaditt avatar aayush-s avatar anupama1912 avatar ayush-goyal avatar baoalvin1 avatar brianmodel avatar cartercote avatar dpopescu3 avatar ganning127 avatar hgutha avatar its-edmund avatar krish-mathur avatar lyangji1011 avatar michaelraman avatar nicolas-cai avatar nimitadesh avatar phillipphanhthourath avatar rahikot avatar rahulrajus avatar roshan-d avatar sthomas313-gatech avatar thaneesh-babu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

Forkers

bunsdev

timber's Issues

Allow judges to submit scores

Using the /ballots endpoint that Edmund made, allow judges to submit scores and save the ballot scores to the backend. You'll likely have to look at how to the endpoint works, and might have to make changes to how the data is sent to the backend and edit the backend route. Work with the frontend and have the best way to submit the data. After the ballot data is saved, also send a new request to the backend to update the current assignment and say the Assignment is finished. Overall by the end, you should be able to submit your scores to the backend and update the assignment table.

Add table numbers to the Project Gallery Cards

  • Add table numbers to the Project Gallery Cards
    • Include the TableGroup and the specific table number on each Project Gallery Card
      • ie: TableGroup = Blue, Table # = 15 —> Blue 15 (or however you best feel fit)

image

Migrate over Submit project submission code

This is a bigger task, but we want to migrate over the backend code from submit that checks user project data in different steps, and creates a project at the end. The main file to reference is here.

We should keep the endpoints to check that they are confirmed in registration. You can keep the code related to devpost for now, since we are not entirely sure if we will still use it. You don't need to worry about permissions right now, just that the main functionality still works. Also, you can leave out the eligible prize checking code, since we haven't figured out how we will store that data in prisma yet.

For this route, please keep it all project submission related, as in, don't include any code to retrieve projects by id, or retrieving all projects. We will create admin routes to edit projects in a different issue as well.

Create judge cards on admin panel

For the admin panel under the epicenter tab, create a new card for each judge (There is a new way to check if a person is a judge. Rather than having a judge role, I changed the database to use an isJudging field. Make sure you migrate your database with yarn migrate:dev so you have these latest changes). Take a look at the backend code, and make sure you can get everyone thats a judge with a route. You may have to add a new route.

Then, on the frontend for every judge and their assignments, create a card that displays a box for each project with different status indicators (like faded, or bolded) if they have already been judged or are currently judging.

Update TableGroup Modal

  • In the admin tab, update the TableGroup edit modal to include a field for updating the tableCapacity

image

Add TableGroup tab to Admin Panel

  • Add a TableGroup tab to the admin panel to add/delete new table groups.
  • May need to create additional routes for adding
  • Will need additional issues to deal with editing a TableGroup

image

Category group page improvements

On each category group, add raw data tables for each project that submitted to that category group. Show the judges that are part of that category group and the total score they gave. Make sure you only show the categories and users that are a part of this category group.

Create a table similar to this
Screen Shot 2021-10-22 at 9 35 49 PM

Add table numbers to the Epicenter

- Include the TableGroup and the specific table number on each of the Epicenter boxes
    - ie: TableGroup = Blue, Table # = 15 —> Blue 15 (or however you best feel fit)
- Also include in the dropdown for each box

Screen Shot 2022-02-06 at 6 15 10 PM

Screen Shot 2022-02-06 at 6 15 17 PM

Allow editing/deleting ballot scores

On the epicenter page where all the judge scores are listed for each project, add a new column with an edit button, and when pressed it’ll open a modal. This modal should allow us to edit the scores and will save the new ballot score **for each of the criteria. Additionally, add a delete button thatll allow us to delete ballot scores for all of the associated ballots. This should also change the assignments table to a status "SKIPPED" so it looks like the judge skipped the project.

Intermediary Page Between Judge Assignments

With in person judging, we want to make it especially clear to judges where to go for their next assignment.

Since projects are assigned on reload, when the judge clicks the "submit" or "skip" button after judging a project, we want to take them to an intermediary page which tells the judge where to go.

On the intermediary page, include the following information:

  • Project name
  • Table Number
  • Table Group

On the bottom of the page, have a button that says "I'm here" or something along those lines. When the judge clicks that button, they will be taken to the standard judging page with the project's respective criteria.

Update edit tablegroup modal

  • In the projects gallery, update the edit modal so that the admin can only pick from valid table numbers
  • ( 1 <= table # <= tablegroup.tableNumber)
  • May potentially need a backend check to ensure no collisions

Project square improvements

For the project squares on the admin dashboard, add functionality so that when you click on them, a popup comes up using https://ant.design/components/popover/. See the screenshot below to see what information was included in the old version of ballot.

If you could include all the categories submitted for, and average score for each category they are being judged for kind of in a list format, that would be much better. Additionally, at the bottom if you could include small form with inputs to change the expo/round, that would be great.

Screen Shot 2021-10-14 at 1 22 24 AM

Search For Manual Assignment

  • In Epicenter, for manual assigning, make the dropdown for projects and judges searchable. In ant design, you can add search features to the dropdown

image

Update TableGroup Schema

  • Update the tablegroup schema to include a "table size" column of type number
  • table size essentially indicates the size of the tablegroup (ie: if tablegroup "blue" has a table size of 5, that means that there are 5 spaces on that tablegroup)
  • Update any type definitions

Add table information to project submission result page

  • In the "Create Submission" tab, display information about the user's assigned table group and table number
  • Furthermore, write information about how table groups and table numbers work
  • Add appropriate links to slack, prizes, and devpost
  • Remind users to actively check the slack during this time

MAKE SURE THIS INFORMATION IS ONLY REVEALED WHEN FINALIZED (ie use is judging on flag)

Load all boxes with 1 request in epicenter

  • when epicenter has a LOT of projects, it takes a while to load all of them
  • speed that up (maybe use 1 request?) and make sure loading doesnt take too long with a lot of projects
  • Should be in the JudgingBox.tsx file as shown below

image

Sort Users By Role and Pagination

  • Be able to sort users by role in the Admin tab for the users section (Judging, Admin, General)
  • Paginate Users tab (Limit to 15-25 per page?)

image

Allow editing a project

On the projects page, if a user is an admin, allow functionality for a user to update the details for a project. Similar to how it works for submit here, open a modal that will allow you to edit the project details.

Screen Shot 2021-10-17 at 5 27 52 PM

Screen Shot 2021-10-17 at 5 27 42 PM

Auto assign tablegroups

  • In the backend, auto assign a user to a table group and table # once they submit a project
  • Pick from the current set of table groups
  • Ensure that the table # is between 1 and the table size property of tablegroup

Create judging skip button

On the judging screen, create a new button next to the submit button that will skip the current project. It should just update the assignment for a project to Skipped, and not submit any scores.

Create a new page for each category route

On the frontend, create a new dynamic route /category-group/[category group id] that will use React routers to get the category group. Then on this page, use ProjectCard.tsx to display each of the projects that are submitted for this route. You'll have to likely create a new backend route for project.ts that when passed in a category group, it'll send back all of the projects associated with this category group. This way, sponsors can have essentially their own status page, that'll show all of the projects for a project category.

Create a form to manually assign a project to a judge

Create a new modal form for the admin side (on epicenter screen) that will allow us to assign a judge to a project. It should have two fields, the first one should be a dropdown of all the projects. Once you select a project, it should request the backend and get a list of judges that are able to judge this project based on their assigned category group. Then, the user is able to select a judge. When you submit the form, it should create a new assignment with status Queued.

Criteria, category, and project route updates

Add two routes for creating/editing criteria to a new criteria routes. On the existing project route, add ability to filter projects by category. For the existing categories routes, pass along all the criteria associated with each category on all routes. You'll have to use Prisma include. Feel free to add anything else you think we need in these routes.

Category group routes

Category groups essentially encompass a group of categories. For this route, create routes to create a category group, edit a category group (by passing in a list of categories or if you want to update a name), and finally deleting a category group. Look at the other routes to see how things were implemented.

Rubric routes

Sometimes, a category will have different rubrics. Think about this kind of rubric. Essentially, this table will map a score (integer) to a description. For this route, can you create a function to get all rubrics for a specific criteria, a route to add a rubric, a route to edit a rubric, and a route to delete a rubric.

Setup Postgres and websockets

This will be a little more involved, but setup the backend to use Postgres and socket.io for websockets. You should use Postgres to store client connections to be persisted across server restarts and multiple parallel servers. This will allow us to facilitate multiple connections to clients. You can look at tutorials like this with help, and also reach out to the check in team (ie Mohan) for help since they are implementing something similar. The old system was using Redis, but we are going to use Postgres instead.

Criteria modal glitches

Sometimes when filling in the min and max value for criteria modal, the minScore and maxScore values glitch out to like -2 or some random value.

Create viewing dashboard

Under the epicenter tab, create a dashboard view similar to the screenshot below. It should display each project, and for each project, there should be a table for each category the project submitted for. Then, it should include each judges name, along with the total score they gave. This way, we can reference this and see what scores judges gave at a quick glance.

It might be helpful to use these components

Screen Shot 2021-10-04 at 1 41 34 AM
e

Ballot route

Create a route to create/update/delete ballots. The create route should create multiple rows in the database depending on the multiple criteria passed in (since one category has multiple criteria, the frontend will send multiple scores back at once, so this route should handle that). The update route should handle manually updating the score of one ballot at a time, since this feature will only be used on the admin side as needed. Finally, the delete route should be used to delete a group of ballots, if on the admin panel we need to delete a judge's scores. Again, like the create route, this should handle deleting a group of ballots associated with a certain set of criteria and judging. This should use a "silent delete" instead of actually deleting the data, by adding a new column called deleted that is a boolean flag. Finally, we should implement some sort of safe checking to ensure we are creating/deleting the right group of ballots.

Instruct Judges where to go

  • In the Judging tab*, add info about where the judge should be going next
  • Table Group and the Table Number

Somewhere on the page:

  • Mention the current location of the current project (can do this under the "Project Name" header)
  • Mention where the judge needs to go next (Probably at the bottom or wherever you feel best should go)

image

  • to view the Judging tab, be sure to set the isJudging attribute on for your user (can be done either in Postico or Admin Panel)

Hackathon and config setup

Add backend routes to create/edit and retrieve hackathons.

Additionally, create a new route for setting the config. The config is a weird type, since it is a table that will only have one row. To add this row, pull the latest changes and run yarn seed. As such, there shouldn't be any create routes, only routes to update each of the columns. Ideally, there should be one different route for each of the config columns, except for current round and current expo which will be set together in one route. All of these routes can be POST requests. You will have to update these values only using the first row (which you can hardcode).

Tablegroup GET by id

  • Add a GET by id route to the tablegroup backend
  • Update any calls where it could be used to simplify code

Add assignment routes

Add routes to create/edit assignments for judges to projects. The get all route should be able to filter by hackathon, expo, and round. And also, you should be able to filter by project category groups. This route should have much more error checking than usual, since this will be a core part of our system functionality. Some things to check is that the user is actually a judge, that the user does not already have an assignment for this project already (they can't judge/be queued for the same project twice). It should check they don't have multiple projects started at once.

Update Prizes

  • Update all the prizes for Horizons on the backend

Extend admin viewing dashboard

For each of the projects, add an average row that will take all the judge data scores and show the average scores. Then, using https://ant.design/components/tabs/, lets add another view similar to this, that will show a different table for each category. Each row should be a project that submitted for that category, the average score this project received, and the number of times it's been judged for that category. All in all, it should have 3 columns. Additionally, this table should be sorted from highest score to least score.

This view is really important because this is how we'll be able to tell who the winners are for each category.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.