From 793e7891b3bd2f183ce524940bd561a4ae3734f1 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Sat, 3 Dec 2022 02:02:52 +0000 Subject: [PATCH] prettier style fixes Signed-off-by: Arthur Lu --- .eslintrc.json | 53 +++---- .github/workflows/css-linting.yml | 46 +++--- .github/workflows/deploy-githubpages.yml | 106 ++++++------- .github/workflows/html-linting.yml | 46 +++--- .github/workflows/js-linting.yml | 50 +++--- .github/workflows/js-unittest.yml | 46 +++--- .github/workflows/prettier-linting.yml | 46 +++--- .htmlhintrc | 8 +- .stylelintrc.json | 4 +- 110722-sprint1.md | 34 ++-- README.md | 2 +- admin/cipipeline/phase1.md | 78 ++++----- admin/cipipeline/phase2.md | 95 +++++------ admin/meetings/101122-kickoff.md | 101 ++++++------ admin/meetings/101222-checkin1.md | 73 +++++---- admin/meetings/101922-checkin2.md | 112 +++++++------ admin/meetings/102122-brainstorm.md | 98 ++++++------ admin/meetings/102322-decision.md | 90 ++++++----- admin/meetings/102622-checkin3.md | 98 ++++++------ admin/meetings/102722-final_decision.md | 129 ++++++++------- admin/meetings/102822-project_pitch.md | 55 ++++--- admin/meetings/110122-meeting.md | 91 ++++++----- admin/meetings/110222-checkin4.md | 73 +++++---- .../meetings/110322-technology_discussion.md | 92 +++++------ admin/meetings/110422-project_breakdown.md | 73 +++++---- admin/meetings/110822-sprint1day2.md | 38 +++-- admin/meetings/110922-checkin5.md | 79 +++++----- admin/meetings/111322-retrospective.md | 63 +++++--- admin/meetings/111322-sprint-1-review.md | 40 +++-- admin/meetings/111622-checkin6.md | 37 +++-- admin/meetings/111722-sprint2meeting1.md | 56 ++++--- admin/meetings/112022-sprint2meeting3.md | 43 +++-- admin/meetings/112322-checkin7.md | 43 ++--- admin/meetings/112722-sprint-2-review.md | 60 ++++--- admin/meetings/112822-retrospective.md | 69 ++++---- admin/meetings/112922-Sprint3Opener.md | 36 +++-- admin/meetings/113022-Sprint3Cont.md | 40 +++-- admin/meetings/1212022-check10.md | 21 ++- admin/misc/rules.md | 123 ++++++++------- admin/team.md | 149 +++++++++--------- package.json | 2 +- source/CreatePage.html | 53 +++---- source/ReviewDetails.html | 110 +++++++------ source/assets/scripts/CreatePage.js | 59 ++++--- source/assets/scripts/ReviewCard.js | 105 ++++++------ source/assets/scripts/ReviewDetails.js | 113 ++++++------- source/assets/scripts/appTestHelpers.js | 27 ++-- source/assets/scripts/localStorage.js | 96 +++++------ source/assets/scripts/localStorage.test.js | 132 ++++++++-------- source/assets/scripts/main.e2e.test.js | 47 +++--- source/assets/scripts/main.js | 58 ++++--- source/index.html | 113 ++++++------- source/static/Form.css | 3 +- source/sw.js | 34 ++-- specs/adrs/102722-final-project-decision.md | 20 ++- specs/adrs/110822-finalized-design.md | 20 ++- specs/adrs/111222-cicd-multiple-pipelines.md | 16 +- specs/adrs/111222-jslinting-eslint.md | 16 +- specs/adrs/111222-jsunittest-mocha.md | 19 +-- specs/adrs/111422-csslinting-stylelint.md | 16 +- specs/adrs/111422-htmllinting-htmlhint.md | 16 +- specs/adrs/111622-e2etesting-puppeteer.md | 39 ++--- specs/adrs/112922-documentation-jsdoc.md | 35 ++-- specs/adrs/112922-prettier.md | 15 +- specs/adrs/112922-review-storage.md | 16 +- specs/adrs/112922-reviewpage-session.md | 15 +- specs/adrs/112922-tag-review-collision-fix.md | 16 +- specs/adrs/120122-serviceworker-netfirst.md | 21 +-- specs/adrs/README.md | 5 +- specs/pitch/pitch.md | 139 ++++++++-------- 70 files changed, 2123 insertions(+), 1849 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index c708a1f..3df5505 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,33 +1,20 @@ -{ - "env": { - "browser": true, - "es2021": true, - "node": true - }, - "extends": "eslint:recommended", - "overrides": [ - ], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "rules": { - "indent": [ - "error", - "tab" - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ], - "no-global-assign": 0 - } -} +{ + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "extends": "eslint:recommended", + "overrides": [], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "indent": ["error", "tab"], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + "no-global-assign": 0 + } +} diff --git a/.github/workflows/css-linting.yml b/.github/workflows/css-linting.yml index 48b333a..4400716 100644 --- a/.github/workflows/css-linting.yml +++ b/.github/workflows/css-linting.yml @@ -1,23 +1,23 @@ -name: CSS Linting - -on: - pull_request: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - # Single deploy job since we're just deploying - test: - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Run tests - run: sudo npm run lint-css \ No newline at end of file +name: CSS Linting + +on: + pull_request: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Run tests + run: sudo npm run lint-css diff --git a/.github/workflows/deploy-githubpages.yml b/.github/workflows/deploy-githubpages.yml index 17c672b..3a6471c 100644 --- a/.github/workflows/deploy-githubpages.yml +++ b/.github/workflows/deploy-githubpages.yml @@ -1,53 +1,53 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy GitHub Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Install prerequisites - uses: actions/setup-node@v3 - with: - node-version: 18 - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Run tests - run: sudo npm run js-doc - - name: Setup Pages - uses: actions/configure-pages@v2 - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 - with: - # Upload only the src repository - path: './source/' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v1 +# Simple workflow for deploying static content to GitHub Pages +name: Deploy GitHub Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Install prerequisites + uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Run tests + run: sudo npm run js-doc + - name: Setup Pages + uses: actions/configure-pages@v2 + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + # Upload only the src repository + path: "./source/" + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/.github/workflows/html-linting.yml b/.github/workflows/html-linting.yml index c24292b..d1cf355 100644 --- a/.github/workflows/html-linting.yml +++ b/.github/workflows/html-linting.yml @@ -1,23 +1,23 @@ -name: HTML Linting - -on: - pull_request: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - # Single deploy job since we're just deploying - test: - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Run tests - run: sudo npm run lint-html +name: HTML Linting + +on: + pull_request: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Run tests + run: sudo npm run lint-html diff --git a/.github/workflows/js-linting.yml b/.github/workflows/js-linting.yml index b642926..bda9cf5 100644 --- a/.github/workflows/js-linting.yml +++ b/.github/workflows/js-linting.yml @@ -1,25 +1,25 @@ -name: JS Linting - -on: - pull_request: - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - # Single deploy job since we're just deploying - test: - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Install prerequisites - run: sudo apt install -y nodejs npm; - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Run tests - run: sudo npm run lint-js \ No newline at end of file +name: JS Linting + +on: + pull_request: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Install prerequisites + run: sudo apt install -y nodejs npm; + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Run tests + run: sudo npm run lint-js diff --git a/.github/workflows/js-unittest.yml b/.github/workflows/js-unittest.yml index 918ce70..daaab10 100644 --- a/.github/workflows/js-unittest.yml +++ b/.github/workflows/js-unittest.yml @@ -1,29 +1,29 @@ name: JS Unit Test on: - pull_request: - branches: - - main + pull_request: + branches: + - main - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: jobs: - # Single deploy job since we're just deploying - test: - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Install prerequisites - uses: actions/setup-node@v3 - with: - node-version: 18 - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Start local http server - run: sudo npm run http-server & - - name: Run tests - run: sudo npm test \ No newline at end of file + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Install prerequisites + uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Start local http server + run: sudo npm run http-server & + - name: Run tests + run: sudo npm test diff --git a/.github/workflows/prettier-linting.yml b/.github/workflows/prettier-linting.yml index 8003d23..8760771 100644 --- a/.github/workflows/prettier-linting.yml +++ b/.github/workflows/prettier-linting.yml @@ -1,29 +1,29 @@ name: Prettier on: - pull_request: - branches: - - main + pull_request: + branches: + - main - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: jobs: - # Single deploy job since we're just deploying - test: - runs-on: ubuntu-latest - steps: - - name: Install apt updates - run: sudo apt -y update; sudo apt -y upgrade; - - name: Install prerequisites - uses: actions/setup-node@v3 - with: - node-version: 18 - - name: Checkout - uses: actions/checkout@v3 - - name: Install dependencies - run: sudo npm install - - name: Start local http server - run: sudo npm run http-server & - - name: Run tests - run: sudo npm lint-prettier \ No newline at end of file + # Single deploy job since we're just deploying + test: + runs-on: ubuntu-latest + steps: + - name: Install apt updates + run: sudo apt -y update; sudo apt -y upgrade; + - name: Install prerequisites + uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Checkout + uses: actions/checkout@v3 + - name: Install dependencies + run: sudo npm install + - name: Start local http server + run: sudo npm run http-server & + - name: Run tests + run: sudo npm lint-prettier diff --git a/.htmlhintrc b/.htmlhintrc index c833339..10b35f2 100644 --- a/.htmlhintrc +++ b/.htmlhintrc @@ -1,4 +1,4 @@ -{ - "attr-value-not-empty": false, - "space-tab-mixed-disabled": "tab" -} +{ + "attr-value-not-empty": false, + "space-tab-mixed-disabled": "tab" +} diff --git a/.stylelintrc.json b/.stylelintrc.json index c3e95e2..ec100eb 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -1,7 +1,7 @@ { "extends": "stylelint-config-standard", "ignore": ["inside-parens", "param", "value"], - "rules":{ + "rules": { "indentation": "tab" } -} \ No newline at end of file +} diff --git a/110722-sprint1.md b/110722-sprint1.md index 264f428..ca5883a 100644 --- a/110722-sprint1.md +++ b/110722-sprint1.md @@ -1,9 +1,13 @@ # Meeting Minutes (11/07/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: First Sprint + Meeting notes for the first sprint ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gavyn Ezell @@ -15,27 +19,29 @@ Meeting notes for the first sprint 9. Arthur Lu ## Absentees + 1. Isaac Otero ## Meeting Details -- When: 11/07/2022 at 6:00PM -- Where: CSE Building Second Floor + +- When: 11/07/2022 at 6:00PM +- Where: CSE Building Second Floor ## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - The first sprint: - - Create more Gitflows and automation. Verify current workflows and actions - - Determine interface details for the app (user experience) - - Start on the backend -- ### Next Meeting's Business + +- ### Old/Unresolved Business + - N/A +- ### New Business + - The first sprint: + - Create more Gitflows and automation. Verify current workflows and actions + - Determine interface details for the app (user experience) + - Start on the backend +- ### Next Meeting's Business ## Decisions Made -- Linting details decided (TABS NOT SPACES) + +- Linting details decided (TABS NOT SPACES) ## End Time -- 11/07/2022 at 8:00PM - - +- 11/07/2022 at 8:00PM diff --git a/README.md b/README.md index 4a2b1cf..45169df 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ [Team Page Link](https://github.com/cse110-fa22-group29/cse110-fa22-group29/blob/main/admin/team.md) -[Food Journal](https://cse110-fa22-group29.github.io/cse110-fa22-group29/) \ No newline at end of file +[Food Journal](https://cse110-fa22-group29.github.io/cse110-fa22-group29/) diff --git a/admin/cipipeline/phase1.md b/admin/cipipeline/phase1.md index ccb48f0..81345ce 100644 --- a/admin/cipipeline/phase1.md +++ b/admin/cipipeline/phase1.md @@ -1,39 +1,39 @@ -# CI/CD Phase 1 - -## Overall Pipeline Architecture - -Rather than create one large pipeline with many steps which increases complexity, we decided to create many small independent pipelines which work in parallel to conduct code quality checking. Using this strategy, if any one pipeline has issues, we can still continue development without delay, and the quality of code is likely to remain high. - -## Overview of Pipeline Features - -We've identified 5 major features which we definitely want to implement in the CI/CD pipeline. - -- Deployment -- Unit Testing -- Linting -- End To End Validation -- Manual Validation - -We created this diagram to demonstrate our strategy of multiple simple pipelines. - -![Pipeline Diagram](phase1.drawio.png) - -## Finished Features and Implementation - -So far the features listed below have been completed to some degree: - -- Deployment - - Implemented: action triggered on any push to main, uses the github pages action to publish the app - - ToDo: Add minifications ste between trigger and github pages action -- Unit Testing - - Implemented: action triggers on any PR, uses mocha to perform unit testing on core components - - ToDo: trigger workflow only on certain PRs which relate to JS code -- Linting (JS) - - Implemented: ction triggers on any PR, uses eslint to perform style enforcement on all JS components - - ToDo: trigger workflow only on certain PRs which relate to JS code -- Linting (HTML) - - Implemented: action triggers on any PR, uses HTMLhint to perform style enforcement on all HTML components -- Linting (CSS) - - Implemented: action triggers on any PR, uses Stylelint to perform style enforcement on all CSS components - -## Planned Features and Timeline +# CI/CD Phase 1 + +## Overall Pipeline Architecture + +Rather than create one large pipeline with many steps which increases complexity, we decided to create many small independent pipelines which work in parallel to conduct code quality checking. Using this strategy, if any one pipeline has issues, we can still continue development without delay, and the quality of code is likely to remain high. + +## Overview of Pipeline Features + +We've identified 5 major features which we definitely want to implement in the CI/CD pipeline. + +- Deployment +- Unit Testing +- Linting +- End To End Validation +- Manual Validation + +We created this diagram to demonstrate our strategy of multiple simple pipelines. + +![Pipeline Diagram](phase1.drawio.png) + +## Finished Features and Implementation + +So far the features listed below have been completed to some degree: + +- Deployment + - Implemented: action triggered on any push to main, uses the github pages action to publish the app + - ToDo: Add minifications ste between trigger and github pages action +- Unit Testing + - Implemented: action triggers on any PR, uses mocha to perform unit testing on core components + - ToDo: trigger workflow only on certain PRs which relate to JS code +- Linting (JS) + - Implemented: ction triggers on any PR, uses eslint to perform style enforcement on all JS components + - ToDo: trigger workflow only on certain PRs which relate to JS code +- Linting (HTML) + - Implemented: action triggers on any PR, uses HTMLhint to perform style enforcement on all HTML components +- Linting (CSS) + - Implemented: action triggers on any PR, uses Stylelint to perform style enforcement on all CSS components + +## Planned Features and Timeline diff --git a/admin/cipipeline/phase2.md b/admin/cipipeline/phase2.md index 5075e7c..56f21dc 100644 --- a/admin/cipipeline/phase2.md +++ b/admin/cipipeline/phase2.md @@ -1,47 +1,48 @@ -# CI/CD Phase 2 - -## Overall Pipeline Architecture - -Rather than create one large pipeline with many steps which increases complexity, we decided to create many small independent pipelines which work in parallel to conduct code quality checking. Using this strategy, if any one pipeline has issues, we can still continue development without delay, and the quality of code is likely to remain high. - -## Overview of Pipeline Features - -We've identified 5 major features which we definitely want to implement in the CI/CD pipeline. - -- Deployment -- Unit Testing -- Linting -- End To End Validation -- Manual Validation - -We also identified some features which are nice to have: -- Automatic documentation publishing -- Minification -- HTML Validation and accessibility scoring - -We created this diagram to demonstrate our strategy of multiple simple pipelines. - -![Pipeline Diagram](phase2.drawio.png) - -## Finished Features and Implementation - -So far the features listed below have been completed to some degree: - -- Deployment - - Implemented: action triggered on any push to main, uses the github pages action to publish the app - - Implemented: uses JSDoc to generate documentation on the same site at [docs](https://cse110-fa22-group29.github.io/cse110-fa22-group29/docs/) - - ToDo: Add minification step between trigger and github pages action -- Unit Testing - - Implemented: action triggers on PR to main, uses mocha to perform unit testing on core components -- End to end testing - - Implemented: action triggers on PR to main, uses mocha and puppeteer to perform end to end testing -- Linting (JS) - - Implemented: action triggers on PR to main, uses eslint to perform style enforcement on all JS components -- Linting (HTML) - - Implemented: action triggers on PR to main, uses HTMLhint to perform style enforcement on all HTML components -- Linting (CSS) - - Implemented: action triggers on PR to main, uses Stylelint to perform style enforcement on all CSS components -- Linting (general) - - Implemented: action triggers on PR to main, uses Prettier to perform style checking on all file types - -## Planned Features and Timeline +# CI/CD Phase 2 + +## Overall Pipeline Architecture + +Rather than create one large pipeline with many steps which increases complexity, we decided to create many small independent pipelines which work in parallel to conduct code quality checking. Using this strategy, if any one pipeline has issues, we can still continue development without delay, and the quality of code is likely to remain high. + +## Overview of Pipeline Features + +We've identified 5 major features which we definitely want to implement in the CI/CD pipeline. + +- Deployment +- Unit Testing +- Linting +- End To End Validation +- Manual Validation + +We also identified some features which are nice to have: + +- Automatic documentation publishing +- Minification +- HTML Validation and accessibility scoring + +We created this diagram to demonstrate our strategy of multiple simple pipelines. + +![Pipeline Diagram](phase2.drawio.png) + +## Finished Features and Implementation + +So far the features listed below have been completed to some degree: + +- Deployment + - Implemented: action triggered on any push to main, uses the github pages action to publish the app + - Implemented: uses JSDoc to generate documentation on the same site at [docs](https://cse110-fa22-group29.github.io/cse110-fa22-group29/docs/) + - ToDo: Add minification step between trigger and github pages action +- Unit Testing + - Implemented: action triggers on PR to main, uses mocha to perform unit testing on core components +- End to end testing + - Implemented: action triggers on PR to main, uses mocha and puppeteer to perform end to end testing +- Linting (JS) + - Implemented: action triggers on PR to main, uses eslint to perform style enforcement on all JS components +- Linting (HTML) + - Implemented: action triggers on PR to main, uses HTMLhint to perform style enforcement on all HTML components +- Linting (CSS) + - Implemented: action triggers on PR to main, uses Stylelint to perform style enforcement on all CSS components +- Linting (general) + - Implemented: action triggers on PR to main, uses Prettier to perform style checking on all file types + +## Planned Features and Timeline diff --git a/admin/meetings/101122-kickoff.md b/admin/meetings/101122-kickoff.md index c77c288..72ae174 100644 --- a/admin/meetings/101122-kickoff.md +++ b/admin/meetings/101122-kickoff.md @@ -1,47 +1,54 @@ -# Meeting Minutes (10/12/2022) -## Team 29: Hackers1995 -## Meeting Topic: Kickoff Meeting -This meeting is being held to kickoff the start of many meetings to come during the quarter. -## Attendance -1. Rhea Bhutada -2. George Dubinin -3. Gavyn Ezell -4. Henry Feng -5. Kara Hoagland -6. Marc Reta -7. Sanjit Joseph -8. Isaac Otero -9. Daniel Hernandez - -## Absentees -1. Arthur Lu - -## Meeting Details -- When: 10/12/2022 at 3:30PM -- Where: Zoom - -## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - go over github organization - - review assignments - - go through rules - - start branding/team name -- ### Next Meeting's Business - - figure out roles - - decide weekly meeting times - - figure out team bonding events - - brainstorm CRUD applications - - complete any remaining assignments - -## Decisions Made -- went over github organizations and reviewed the assignments -- went through the rules and agreed on the contract -- figured out the brand name - -## End Time -- 10/12/2022 at 4:30PM - - - +# Meeting Minutes (10/12/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Kickoff Meeting + +This meeting is being held to kickoff the start of many meetings to come during the quarter. + +## Attendance + +1. Rhea Bhutada +2. George Dubinin +3. Gavyn Ezell +4. Henry Feng +5. Kara Hoagland +6. Marc Reta +7. Sanjit Joseph +8. Isaac Otero +9. Daniel Hernandez + +## Absentees + +1. Arthur Lu + +## Meeting Details + +- When: 10/12/2022 at 3:30PM +- Where: Zoom + +## Agenda: + +- ### Old/Unresolved Business + - N/A +- ### New Business + - go over github organization + - review assignments + - go through rules + - start branding/team name +- ### Next Meeting's Business + - figure out roles + - decide weekly meeting times + - figure out team bonding events + - brainstorm CRUD applications + - complete any remaining assignments + +## Decisions Made + +- went over github organizations and reviewed the assignments +- went through the rules and agreed on the contract +- figured out the brand name + +## End Time + +- 10/12/2022 at 4:30PM diff --git a/admin/meetings/101222-checkin1.md b/admin/meetings/101222-checkin1.md index d31c903..d45c369 100644 --- a/admin/meetings/101222-checkin1.md +++ b/admin/meetings/101222-checkin1.md @@ -1,32 +1,41 @@ -# Meeting Minutes (10/12/2022) -## Team 29: Hackers1995 -## Meeting Topic: Weekly Check-In Meeting -This meeting is the first weekly meeting with TA -## Attendance -1. Gagan Gopalaiah -2. Rhea Bhutada -3. Kara Hoagland -4. Marc Reta -5. Arthur - -## Meeting Details -- When: 10/12/2022 at 8:00PM -- Where: Zoom - -## Agenda: -- ### Reviewed Project Details - - building CRUD app - - utilizing HTML, CSS, JavaScript - - general domain is better than specific domain -- ### Get Started early - - brainstorm CRUD apps - - review assignments - - figure out unit test code - - familiarize yourself with GitHub Actions - -## Important Information -- Gagan OH (6:30PM-7:30PM on Wednesday) in CSE Basement -- Reserved the room if any of us want to meet there. TA not going to present unless required. - -## End Time -- 10/12/2022 at 8:30PM \ No newline at end of file +# Meeting Minutes (10/12/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Weekly Check-In Meeting + +This meeting is the first weekly meeting with TA + +## Attendance + +1. Gagan Gopalaiah +2. Rhea Bhutada +3. Kara Hoagland +4. Marc Reta +5. Arthur + +## Meeting Details + +- When: 10/12/2022 at 8:00PM +- Where: Zoom + +## Agenda: + +- ### Reviewed Project Details + - building CRUD app + - utilizing HTML, CSS, JavaScript + - general domain is better than specific domain +- ### Get Started early + - brainstorm CRUD apps + - review assignments + - figure out unit test code + - familiarize yourself with GitHub Actions + +## Important Information + +- Gagan OH (6:30PM-7:30PM on Wednesday) in CSE Basement +- Reserved the room if any of us want to meet there. TA not going to present unless required. + +## End Time + +- 10/12/2022 at 8:30PM diff --git a/admin/meetings/101922-checkin2.md b/admin/meetings/101922-checkin2.md index 5286bc1..cfbecc6 100644 --- a/admin/meetings/101922-checkin2.md +++ b/admin/meetings/101922-checkin2.md @@ -1,50 +1,62 @@ -# Meeting Minutes (10/19/2022) -## Team 29: Hackers1995 -## Meeting Topic: Weekly Check-In Meeting -This meeting is the second weekly meeting with TA. - -## Attendance -1. Gagan Gopalaiah -2. Rhea Bhutada -3. George Dubinin -4. Kara Hoagland -5. Marc Reta -6. Arthur Lu -7. Gavyn Ezell -8. Isaac Otero - -## Meeting Details -- When: 10/19/2022 at 8:00PM -- Where: Zoom - -## Agenda: -- ### Recap of last week - - went over assignments - - discussed feelings on the midterm - -- ### New Potential Meeting Time - - without TA unless necessary - - before lecture on Monday in CSE Basement - -- ### Upcoming Assignments - - two coming up - - brainstorm activity (due 10/23) - - continue brainstorming throughout the week - - due sunday - - pitch (11/1) - - initial draft by 10/25 - 10/26 - -- ### Tips on Designing - - user center design - - define the problem first, then the tools/techniques - - finalize on the product and its features, then decide on how to build it - -- ### Standup - - not expected everyday - - once every two days is ideal - - doesn't have to be too descriptive - -- ### Review of Recent Brainstorming Session - -## End Time -- 10/19/2022 at 3:50PM \ No newline at end of file +# Meeting Minutes (10/19/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Weekly Check-In Meeting + +This meeting is the second weekly meeting with TA. + +## Attendance + +1. Gagan Gopalaiah +2. Rhea Bhutada +3. George Dubinin +4. Kara Hoagland +5. Marc Reta +6. Arthur Lu +7. Gavyn Ezell +8. Isaac Otero + +## Meeting Details + +- When: 10/19/2022 at 8:00PM +- Where: Zoom + +## Agenda: + +- ### Recap of last week + + - went over assignments + - discussed feelings on the midterm + +- ### New Potential Meeting Time + + - without TA unless necessary + - before lecture on Monday in CSE Basement + +- ### Upcoming Assignments + + - two coming up + - brainstorm activity (due 10/23) + - continue brainstorming throughout the week + - due sunday + - pitch (11/1) + - initial draft by 10/25 - 10/26 + +- ### Tips on Designing + + - user center design + - define the problem first, then the tools/techniques + - finalize on the product and its features, then decide on how to build it + +- ### Standup + + - not expected everyday + - once every two days is ideal + - doesn't have to be too descriptive + +- ### Review of Recent Brainstorming Session + +## End Time + +- 10/19/2022 at 3:50PM diff --git a/admin/meetings/102122-brainstorm.md b/admin/meetings/102122-brainstorm.md index 9f8f7c0..6b53bcd 100644 --- a/admin/meetings/102122-brainstorm.md +++ b/admin/meetings/102122-brainstorm.md @@ -1,44 +1,54 @@ -# Meeting Minutes (10/21/2022) -## Team 29: Hackers1995 -## Meeting Topic: Application Brainstorming -This meeting is held to help the group decide on what application. We will also discuss preliminary designs. -## Attendance -1. George Dubinin -2. Gavyn Ezell -3. Henry Feng -4. Arthur Lu -5. Marc Reta -6. Kara Hoagland -7. Sanjit Joseph -8. Rhea Bhutada -9. Isaac Otero -10. Daniel Hernandez - -## Absentees -N/A - -## Meeting Details -- When: - - 10/21/2022 at 10:00AM - - 10/21/2022 at 1:30PM -- Where: Zoom - -## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - List ideas that have been shared so far - - List new ideas/ideas that haven't been recorded on the doc yet - - Discuss, vote, and decide on one idea -- ### Next Meeting's Business - - Discuss design features for the chosen app - -## Decisions Made -- Added UCSD Food Reviewer App idea to the brainstorming doc -- The 10AM group cast 3 votes for the Social Media Auxilary and 1 vote for the UCSD Food Reviewer App (one participant voted twice) -- The 1:30PM group cast 7 votes for the UCSD Food Reviewer App and 5 votes for the Copy/Paste App -- We will move forward with the UCSD Food Reviewer App - -## End Time -- 10/21/2022 at 11:00AM -- 10/21/2022 at 2:30PM \ No newline at end of file +# Meeting Minutes (10/21/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Application Brainstorming + +This meeting is held to help the group decide on what application. We will also discuss preliminary designs. + +## Attendance + +1. George Dubinin +2. Gavyn Ezell +3. Henry Feng +4. Arthur Lu +5. Marc Reta +6. Kara Hoagland +7. Sanjit Joseph +8. Rhea Bhutada +9. Isaac Otero +10. Daniel Hernandez + +## Absentees + +N/A + +## Meeting Details + +- When: + - 10/21/2022 at 10:00AM + - 10/21/2022 at 1:30PM +- Where: Zoom + +## Agenda: + +- ### Old/Unresolved Business + - N/A +- ### New Business + - List ideas that have been shared so far + - List new ideas/ideas that haven't been recorded on the doc yet + - Discuss, vote, and decide on one idea +- ### Next Meeting's Business + - Discuss design features for the chosen app + +## Decisions Made + +- Added UCSD Food Reviewer App idea to the brainstorming doc +- The 10AM group cast 3 votes for the Social Media Auxilary and 1 vote for the UCSD Food Reviewer App (one participant voted twice) +- The 1:30PM group cast 7 votes for the UCSD Food Reviewer App and 5 votes for the Copy/Paste App +- We will move forward with the UCSD Food Reviewer App + +## End Time + +- 10/21/2022 at 11:00AM +- 10/21/2022 at 2:30PM diff --git a/admin/meetings/102322-decision.md b/admin/meetings/102322-decision.md index bc64f86..8b44465 100644 --- a/admin/meetings/102322-decision.md +++ b/admin/meetings/102322-decision.md @@ -1,40 +1,50 @@ -# Meeting Minutes (10/23/2022) -## Team 29: Hackers1995 -## Meeting Topic: Application Final Decision -This meeting is held to help the group decide on which kind of app to build. -## Attendance -1. George Dubinin -2. Henry Feng -3. Arthur Lu -4. Marc Reta -5. Kara Hoagland -6. Rhea Bhutada -7. Isaac Otero - -## Absentees -1. Sanjit Joseph -2. Gavyn Ezell -3. Daniel Hernandez - -## Meeting Details -- When: - - 10/23/2022 at 1:00PM -- Where: Zoom (Rhea's Meeting Room) - -## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - Decide on a final app idea -- ### Next Meeting's Business - - Discuss design features for the chosen app - -## Decisions Made -- Maybe for the food reviewer app. Presenting possible writeup to Gagan -- Maybe for the resume builder. Presenting possible writeup to Gagan https://docs.google.com/document/d/1zdvVxd47Ivdz-D0rZGNJqc3D9GiQj0n_xMJKapOV39A/edit?usp=sharing -- Maybe for Social Media Local Archive. Presenting possible writeup to Gagan https://docs.google.com/document/d/1upNr6lneB2uzCoQ12_aa1CMg1W8p2NBFb6xmP7i4-z4/edit?usp=sharing -- No to the copy/paste app (not local first) - -## End Time -- When: - - 10/23/2022 at 2:00PM +# Meeting Minutes (10/23/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Application Final Decision + +This meeting is held to help the group decide on which kind of app to build. + +## Attendance + +1. George Dubinin +2. Henry Feng +3. Arthur Lu +4. Marc Reta +5. Kara Hoagland +6. Rhea Bhutada +7. Isaac Otero + +## Absentees + +1. Sanjit Joseph +2. Gavyn Ezell +3. Daniel Hernandez + +## Meeting Details + +- When: + - 10/23/2022 at 1:00PM +- Where: Zoom (Rhea's Meeting Room) + +## Agenda: + +- ### Old/Unresolved Business + - N/A +- ### New Business + - Decide on a final app idea +- ### Next Meeting's Business + - Discuss design features for the chosen app + +## Decisions Made + +- Maybe for the food reviewer app. Presenting possible writeup to Gagan +- Maybe for the resume builder. Presenting possible writeup to Gagan https://docs.google.com/document/d/1zdvVxd47Ivdz-D0rZGNJqc3D9GiQj0n_xMJKapOV39A/edit?usp=sharing +- Maybe for Social Media Local Archive. Presenting possible writeup to Gagan https://docs.google.com/document/d/1upNr6lneB2uzCoQ12_aa1CMg1W8p2NBFb6xmP7i4-z4/edit?usp=sharing +- No to the copy/paste app (not local first) + +## End Time + +- When: + - 10/23/2022 at 2:00PM diff --git a/admin/meetings/102622-checkin3.md b/admin/meetings/102622-checkin3.md index ae63c62..1f9e2c3 100644 --- a/admin/meetings/102622-checkin3.md +++ b/admin/meetings/102622-checkin3.md @@ -1,44 +1,54 @@ -# Meeting Minutes (10/26/2022) -## Team 29: Hackers1995 -## Meeting Topic: Weekly Check-In Meeting -This is our third weekly meeting with Gagan. - -## Attendance -TA. Gagan Gopalaiah -1. Rhea Bhutada -2. George Dubinin -3. Sanjit Joseph -4. Arthur Lu -5. Gavyn Ezell - -## Meeting Details -- When: 10/26/2022 at 3:00 PM -- Where: Zoom (Gagan's Zoom room: https://ucsd.zoom.us/j/5177090642) - -## Agenda: -- ### Present our ideas to Gagan - - All ideas seem to be doable - - Consider a few tweaks to "CRUDify" apps - - Gagan is partial to food review app idea, but any of them can work - - -- ### Tips for projects - - SOCIAL MEDIA ORGANIZER: avoid API integration if possible/only make it a small part, not a main feature - - RESUME BUILDER: try to "CRUDify" it more if we're going for this - -- ### Standups - - Once per 2 days, 3 in worst case - - Perhaps make a separate slack channel for these to avoid clutter - -## Moving forward: -- ### BY FRIDAY: - - Try and meet tomorrow (10/27) to make a final decision - - Let Gagan know what we've decided on - - Complete project pitch assignment - need to present to Gagan tomorrow 10/27, due on canvas 11/1 - -- ### OVER WEEKEND: - - (If possible) Start on CI/CD pipeline (basic js app/unit tests, use Github actions to set up) - - -## End Time -- 10/26/2022 at 4:00 PM +# Meeting Minutes (10/26/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Weekly Check-In Meeting + +This is our third weekly meeting with Gagan. + +## Attendance + +TA. Gagan Gopalaiah + +1. Rhea Bhutada +2. George Dubinin +3. Sanjit Joseph +4. Arthur Lu +5. Gavyn Ezell + +## Meeting Details + +- When: 10/26/2022 at 3:00 PM +- Where: Zoom (Gagan's Zoom room: https://ucsd.zoom.us/j/5177090642) + +## Agenda: + +- ### Present our ideas to Gagan + + - All ideas seem to be doable + - Consider a few tweaks to "CRUDify" apps + - Gagan is partial to food review app idea, but any of them can work + +- ### Tips for projects + + - SOCIAL MEDIA ORGANIZER: avoid API integration if possible/only make it a small part, not a main feature + - RESUME BUILDER: try to "CRUDify" it more if we're going for this + +- ### Standups + - Once per 2 days, 3 in worst case + - Perhaps make a separate slack channel for these to avoid clutter + +## Moving forward: + +- ### BY FRIDAY: + + - Try and meet tomorrow (10/27) to make a final decision + - Let Gagan know what we've decided on + - Complete project pitch assignment - need to present to Gagan tomorrow 10/27, due on canvas 11/1 + +- ### OVER WEEKEND: + - (If possible) Start on CI/CD pipeline (basic js app/unit tests, use Github actions to set up) + +## End Time + +- 10/26/2022 at 4:00 PM diff --git a/admin/meetings/102722-final_decision.md b/admin/meetings/102722-final_decision.md index cf9ec04..713c6d9 100644 --- a/admin/meetings/102722-final_decision.md +++ b/admin/meetings/102722-final_decision.md @@ -1,60 +1,69 @@ -# Meeting Minutes (10/27/2022) -## Team 29: Hackers1995 -## Meeting Topic: Final Project Decision -We're figuring out what project we're going to do, and figure out what we need for the starting pitch. - -## Attendance -1. Rhea Bhutada -2. Sanjit Joseph -3. Arthur Lu -4. Henry Feng -5. Marc Reta -6. Kara Hoagland -7. Daniel Hernandez -8. Gavyn Ezell -9. Isaac Otero - -## Meeting Details -- When: 10/27/2022 at 5:00 PM -- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - -## Agenda: -- ### Decide which project we're doing - - Gagan seemed to like the food review app idea best in their current states - - We all seem to agree that the food review app is acceptable - - Made a couple clarifications, no major changes or objections to the app - -- ### Start project pitch - - Created google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** - - Prof recommends skimming the book: **https://basecamp.com/shapeup** (esp. ch.5 on risks and rabbit holes) - - Finishing Risks + Rabbit holes here in the meeting - - Kara posted a design prototype in Slack: https://cse110fall2022.slack.com/archives/C04598WA7P1/p1666918573779859 - -- ### App Description - - Renaming it to a "Food Diary" app, not limited to UCSD - - Allows users to store info about recent foods, restaurant name, location, price, your rating etc. - - Probably provides food suggestions based on where you've eaten (and liked) before - - We're not going to try anything with external data atm. - - -## Moving forward: -- ### BY TOMORROW: - - FINISH PITCH SLIDES - - MUST CHANGE DIAGRAM TO ALL RESTAURANTS (Isaac will change this) - - Daniel will update the pitch slides by adding images/graphics. - - Daniel + Sanjit are doing visual representation. - - Gayvn is doing potential competitors - - Henry, Sanjit, Kara are doing user personas - - Rhea is doing statement + purpose - - Arthur + Marc are doing "why it's a CRUD app" - - - See if we can have a short meeting tomorrow before meeting Gagan just to review our pitch. - - Put all components in specs folder before pitch - - Meet at 2:30? Meeting with Gagan is probably at 3:30 - -- ### LATER: - - Have some people split off and work on the basic UI design. Technically Sanjit had the 'art role' according to the TA but not sure what that entails. More ppl would def be helpful. TBD who else is helping - - -## End Time -- 10/27/2022 at 6:15 PM +# Meeting Minutes (10/27/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Final Project Decision + +We're figuring out what project we're going to do, and figure out what we need for the starting pitch. + +## Attendance + +1. Rhea Bhutada +2. Sanjit Joseph +3. Arthur Lu +4. Henry Feng +5. Marc Reta +6. Kara Hoagland +7. Daniel Hernandez +8. Gavyn Ezell +9. Isaac Otero + +## Meeting Details + +- When: 10/27/2022 at 5:00 PM +- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) + +## Agenda: + +- ### Decide which project we're doing + + - Gagan seemed to like the food review app idea best in their current states + - We all seem to agree that the food review app is acceptable + - Made a couple clarifications, no major changes or objections to the app + +- ### Start project pitch + + - Created google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** + - Prof recommends skimming the book: **https://basecamp.com/shapeup** (esp. ch.5 on risks and rabbit holes) + - Finishing Risks + Rabbit holes here in the meeting + - Kara posted a design prototype in Slack: https://cse110fall2022.slack.com/archives/C04598WA7P1/p1666918573779859 + +- ### App Description + - Renaming it to a "Food Diary" app, not limited to UCSD + - Allows users to store info about recent foods, restaurant name, location, price, your rating etc. + - Probably provides food suggestions based on where you've eaten (and liked) before + - We're not going to try anything with external data atm. + +## Moving forward: + +- ### BY TOMORROW: + + - FINISH PITCH SLIDES + - MUST CHANGE DIAGRAM TO ALL RESTAURANTS (Isaac will change this) + - Daniel will update the pitch slides by adding images/graphics. + - Daniel + Sanjit are doing visual representation. + - Gayvn is doing potential competitors + - Henry, Sanjit, Kara are doing user personas + - Rhea is doing statement + purpose + - Arthur + Marc are doing "why it's a CRUD app" + + - See if we can have a short meeting tomorrow before meeting Gagan just to review our pitch. + - Put all components in specs folder before pitch + - Meet at 2:30? Meeting with Gagan is probably at 3:30 + +- ### LATER: + - Have some people split off and work on the basic UI design. Technically Sanjit had the 'art role' according to the TA but not sure what that entails. More ppl would def be helpful. TBD who else is helping + +## End Time + +- 10/27/2022 at 6:15 PM diff --git a/admin/meetings/102822-project_pitch.md b/admin/meetings/102822-project_pitch.md index d67e1ae..4ad6511 100644 --- a/admin/meetings/102822-project_pitch.md +++ b/admin/meetings/102822-project_pitch.md @@ -1,24 +1,31 @@ -# Meeting Minutes (10/28/2022) -## Team 29: Hackers1995 -## Meeting Topic: Project Pitch -We finished up the project pitch docs and presenting them to Gagan. - -Google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** - -## Meeting Details -- When: 10/28/2022 at 2:30 PM -- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - -## Agenda: -- ### Finish Project Pitch documents - - Finished user stories/diagrams and uploaded to github - - Went over presentation before showing TA - - Presented project to Gagan - - **Overall reaction - he liked our app! More feedback to come, but we can feel free to start some basic work.** - -## Moving forward: -- I think we need to upload our project pitch to canvas by 11/1 -- Start on the really basic stuff as discussed in lecture (hello world for CI/CD setup, etc) - -## End Time -- 10/28/2022 at 4:00 PM +# Meeting Minutes (10/28/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Project Pitch + +We finished up the project pitch docs and presenting them to Gagan. + +Google slides: **https://docs.google.com/presentation/d/1_XWihJGVChFtYS38RnYJtQUuFKsgvewOCOkdeMHFRg4/edit?usp=sharing** + +## Meeting Details + +- When: 10/28/2022 at 2:30 PM +- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) + +## Agenda: + +- ### Finish Project Pitch documents + - Finished user stories/diagrams and uploaded to github + - Went over presentation before showing TA + - Presented project to Gagan + - **Overall reaction - he liked our app! More feedback to come, but we can feel free to start some basic work.** + +## Moving forward: + +- I think we need to upload our project pitch to canvas by 11/1 +- Start on the really basic stuff as discussed in lecture (hello world for CI/CD setup, etc) + +## End Time + +- 10/28/2022 at 4:00 PM diff --git a/admin/meetings/110122-meeting.md b/admin/meetings/110122-meeting.md index 92e5186..6e2b19b 100644 --- a/admin/meetings/110122-meeting.md +++ b/admin/meetings/110122-meeting.md @@ -1,41 +1,50 @@ -# Meeting Minutes (11/01/2022) -## Team 29: Hackers1995 -## Meeting Topic: Work going forward -We're trying to figure out what our goals are for the project and how to get started. - -## Meeting Details -- When: 11/01/2022 at 7:00 PM -- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) - -## Attendance - 1. Rhea - 2. Gavyn - 3. Isaac - 4. Kara - 5. Marc - 6. Henry - 7. Daniel - 8. Sanjit - -## Notes: - - Gagan suggests we have a feature backlog and pull stuff from that - - Using Github Issues for our feature backlog - - - Perhaps integrate TTS from Lab5 into something (pick a random restaurant while driving, etc) - - - Created figma sketch for app design, uploaded to github and google slides - -## Moving forward: -- ### BY TONIGHT: - - We'll submit our pitch files -- ### LATER: - - Sanjit will upload a basic hello world program in order to test deployment/github actions - - Arthur will start figuring out how to configure github actions - -- ### PREFERENCES: - - BACKEND: Henry, Gavyn, Kara - - FRONTEND: Isaac - - NO PREFERENCE: Daniel, Marc, Rhea, Sanjit - -## End Time -- 11/01/2022 at 9:00 PM +# Meeting Minutes (11/01/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Work going forward + +We're trying to figure out what our goals are for the project and how to get started. + +## Meeting Details + +- When: 11/01/2022 at 7:00 PM +- Where: Zoom (Rhea's Zoom room: https://ucsd.zoom.us/j/8054288343) + +## Attendance + +1. Rhea +2. Gavyn +3. Isaac +4. Kara +5. Marc +6. Henry +7. Daniel +8. Sanjit + +## Notes: + +- Gagan suggests we have a feature backlog and pull stuff from that +- Using Github Issues for our feature backlog + +- Perhaps integrate TTS from Lab5 into something (pick a random restaurant while driving, etc) + +- Created figma sketch for app design, uploaded to github and google slides + +## Moving forward: + +- ### BY TONIGHT: + - We'll submit our pitch files +- ### LATER: + + - Sanjit will upload a basic hello world program in order to test deployment/github actions + - Arthur will start figuring out how to configure github actions + +- ### PREFERENCES: + - BACKEND: Henry, Gavyn, Kara + - FRONTEND: Isaac + - NO PREFERENCE: Daniel, Marc, Rhea, Sanjit + +## End Time + +- 11/01/2022 at 9:00 PM diff --git a/admin/meetings/110222-checkin4.md b/admin/meetings/110222-checkin4.md index ab7b1c0..e3cfdf4 100644 --- a/admin/meetings/110222-checkin4.md +++ b/admin/meetings/110222-checkin4.md @@ -1,34 +1,39 @@ -# Meeting Minutes (11/02/2022) -## Team 29: Hackers1995 -## Meeting Topic: Weekly TA Catchup with Gagan -We are meeting with Gagan to discuss early phase design concepts and decisions we need to think about as we start the early coding phase. - -## Attendance -1. Rhea Bhutada -2. George Dubinin -3. Gagan Gopalaiah - -## Meeting Details -- When: 11/02/2022 at 3:30PM -- Where: Zoom - -## Agenda: - -## Discussion Points by Gagan - - Now that we finished designs stage there are 2 approaches - - The first is to just start coding without thinking about design (cowboy coding). It works but can get bumpy down the road - - The second is to look at the project from a birds eye view and break it down into milestones and tasks. First break it down into weeks and then decide on what to do each day of the week. This will make it easier to keep things organized. - - Jira and GitHub issues will be super helpful. Jira is a more expensive option so instead prof recommends creating issues. - - Start thinking about storage options. Think local first and decide on options like: - - locally stored json files - - browser local storage - - "real" database like IndexDB - - Think about different models to keep track of changes and versions. Consider the branching model (one central repository and everyone has a branch or one breanch per feature) and the forking model (the central repository is copied and developers work in these copies and push changes to their own copies before syncing to the central repo). Useful info here: https://www.flagship.io/git-branching-strategies/ - - Think about how pull requests will be approved and create a system for PR review and suggests. - - Break down the project and decide on which tasks to be completed. Then decide on how long sprints will last and how tasks will be assigned. - - We need to create the ADR and place it in the brainstorming section of the repo. This will contain details about specific project decisions that we made like database decisions (for example). - -## End Time -- 11/02/2022 at 4:00PM - - +# Meeting Minutes (11/02/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Weekly TA Catchup with Gagan + +We are meeting with Gagan to discuss early phase design concepts and decisions we need to think about as we start the early coding phase. + +## Attendance + +1. Rhea Bhutada +2. George Dubinin +3. Gagan Gopalaiah + +## Meeting Details + +- When: 11/02/2022 at 3:30PM +- Where: Zoom + +## Agenda: + +## Discussion Points by Gagan + +- Now that we finished designs stage there are 2 approaches + - The first is to just start coding without thinking about design (cowboy coding). It works but can get bumpy down the road + - The second is to look at the project from a birds eye view and break it down into milestones and tasks. First break it down into weeks and then decide on what to do each day of the week. This will make it easier to keep things organized. +- Jira and GitHub issues will be super helpful. Jira is a more expensive option so instead prof recommends creating issues. +- Start thinking about storage options. Think local first and decide on options like: + - locally stored json files + - browser local storage + - "real" database like IndexDB +- Think about different models to keep track of changes and versions. Consider the branching model (one central repository and everyone has a branch or one breanch per feature) and the forking model (the central repository is copied and developers work in these copies and push changes to their own copies before syncing to the central repo). Useful info here: https://www.flagship.io/git-branching-strategies/ +- Think about how pull requests will be approved and create a system for PR review and suggests. +- Break down the project and decide on which tasks to be completed. Then decide on how long sprints will last and how tasks will be assigned. +- We need to create the ADR and place it in the brainstorming section of the repo. This will contain details about specific project decisions that we made like database decisions (for example). + +## End Time + +- 11/02/2022 at 4:00PM diff --git a/admin/meetings/110322-technology_discussion.md b/admin/meetings/110322-technology_discussion.md index 8b17a33..f3d29a6 100644 --- a/admin/meetings/110322-technology_discussion.md +++ b/admin/meetings/110322-technology_discussion.md @@ -1,44 +1,48 @@ -# Meeting Minutes (11/03/2022) -## Team 29: Hackers1995 -## Meeting Topic: Technologies Discussion -We're deciding on what web technologies we will incorporate into our food blog application. - -## Attendance -1. Rhea Bhutada -2. Sanjit Joseph -3. Arthur Lu -4. Henry Feng -5. Marc Reta -6. Kara Hoagland -7. Daniel Hernandez -8. Gavyn Ezell -9. Isaac Otero - -## Meeting Details -- When: 11/03/2022 at 3:00PM -- Where: In-person (CSE Basement B250) and George's Zoom room - -## Agenda: -- ### Answer the questions that Gagan's asked the team leads yesterday - - What high level approach will we have to coding? - - Slow approach with diagrams and short sprints of around 3 days. Biweekly meetings where we catch up with what happened end of each sprint. - - What issue tracker will we use? - - Use GitHub issues for tracking. Assign and breakdown tasks at the begining of each sprint. - - What database will we use? - - Rely on localStorage short-term and implement a non-relational database like MongoDB later. - - What branching/forking strategy will we use - - We will be creating branches for different features and be submitting PRs direclty to the master branch. Forks will only be created for large overhaul type changes - - How will PRs be approved - - The team will be split up into groups for different aspects of the app (front end, ui, database for example) and PRs will be reviewed and approved by 1 other member of the respective group - - Introduce the ADR and discuss how we will create it - - - - - -## Assignments: -- ### By X point in time: -- - - -## End Time -- 11/03/2022 at 4:00 PM \ No newline at end of file +# Meeting Minutes (11/03/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Technologies Discussion + +We're deciding on what web technologies we will incorporate into our food blog application. + +## Attendance + +1. Rhea Bhutada +2. Sanjit Joseph +3. Arthur Lu +4. Henry Feng +5. Marc Reta +6. Kara Hoagland +7. Daniel Hernandez +8. Gavyn Ezell +9. Isaac Otero + +## Meeting Details + +- When: 11/03/2022 at 3:00PM +- Where: In-person (CSE Basement B250) and George's Zoom room + +## Agenda: + +- ### Answer the questions that Gagan's asked the team leads yesterday + - What high level approach will we have to coding? + - Slow approach with diagrams and short sprints of around 3 days. Biweekly meetings where we catch up with what happened end of each sprint. + - What issue tracker will we use? + - Use GitHub issues for tracking. Assign and breakdown tasks at the begining of each sprint. + - What database will we use? + - Rely on localStorage short-term and implement a non-relational database like MongoDB later. + - What branching/forking strategy will we use + - We will be creating branches for different features and be submitting PRs direclty to the master branch. Forks will only be created for large overhaul type changes + - How will PRs be approved + - The team will be split up into groups for different aspects of the app (front end, ui, database for example) and PRs will be reviewed and approved by 1 other member of the respective group + - ## Introduce the ADR and discuss how we will create it + +## Assignments: + +- ### By X point in time: +- + +## End Time + +- 11/03/2022 at 4:00 PM diff --git a/admin/meetings/110422-project_breakdown.md b/admin/meetings/110422-project_breakdown.md index cdde94f..6faa0a4 100644 --- a/admin/meetings/110422-project_breakdown.md +++ b/admin/meetings/110422-project_breakdown.md @@ -1,32 +1,41 @@ -# Meeting Minutes (11/04/2022) -## Team 29: Hackers1995 -## Meeting Topic: Technologies Discussion -We're planning out our first sprint and breaking up the project into tasks. Tasks will be assigned to groups and GitHub issues will be created -for each task and assigned to a group. - -## Attendance -1. Rhea Bhutada -2. Sanjit Joseph -3. Arthur Lu -4. Marc Reta -6. Kara Hoagland -7. Daniel Hernandez -8. Gavyn Ezell -9. Isaac Otero -10. Henry Feng - -## Meeting Details -- When: 11/04/2022 at 10:00AM -- Where: George's Zoom room - -## Agenda: -## Sprint 1 Categories and Assignments -Frontend: Isaac, Sanjit, and Daniel -Backend: Rhea, George, Gavyn, Kara, -- Save to database -- Load from database -- Clear database -Unit Testing: Arthur, Marc - -## End Time -- 11/03/2022 at 10:30 AM \ No newline at end of file +# Meeting Minutes (11/04/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Technologies Discussion + +We're planning out our first sprint and breaking up the project into tasks. Tasks will be assigned to groups and GitHub issues will be created +for each task and assigned to a group. + +## Attendance + +1. Rhea Bhutada +2. Sanjit Joseph +3. Arthur Lu +4. Marc Reta +5. Kara Hoagland +6. Daniel Hernandez +7. Gavyn Ezell +8. Isaac Otero +9. Henry Feng + +## Meeting Details + +- When: 11/04/2022 at 10:00AM +- Where: George's Zoom room + +## Agenda: + +## Sprint 1 Categories and Assignments + +Frontend: Isaac, Sanjit, and Daniel +Backend: Rhea, George, Gavyn, Kara, + +- Save to database +- Load from database +- Clear database + Unit Testing: Arthur, Marc + +## End Time + +- 11/03/2022 at 10:30 AM diff --git a/admin/meetings/110822-sprint1day2.md b/admin/meetings/110822-sprint1day2.md index d620fb3..850bb10 100644 --- a/admin/meetings/110822-sprint1day2.md +++ b/admin/meetings/110822-sprint1day2.md @@ -1,9 +1,13 @@ # Meeting Minutes (11/08/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: In-Person First Sprint Day 2 + Meeting notes for the first sprint ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gavyn Ezell @@ -12,28 +16,30 @@ Meeting notes for the first sprint 6. Daniel Hernandez ## Meeting Details -- When: 11/08/2022 at 2:00PM -- Where: Mike's Red Tacos + +- When: 11/08/2022 at 2:00PM +- Where: Mike's Red Tacos ## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - Isaac now knows what Wolftown is - - Pair programming setup with VSCode -- ### Next Meeting's Business + +- ### Old/Unresolved Business + - N/A +- ### New Business + - Isaac now knows what Wolftown is + - Pair programming setup with VSCode +- ### Next Meeting's Business ## App Progress -- The landing page is closer -- Review card css file entered -- Review Card javascript logic implemented (thanks Gavin) -- + +- The landing page is closer +- Review card css file entered +- Review Card javascript logic implemented (thanks Gavin) +- ## Decisions Made -- Linting details decided (TABS NOT SPACES) + +- Linting details decided (TABS NOT SPACES) ## End Time -- 11/07/2022 at 8:00PM - - +- 11/07/2022 at 8:00PM diff --git a/admin/meetings/110922-checkin5.md b/admin/meetings/110922-checkin5.md index 764192c..a297f0e 100644 --- a/admin/meetings/110922-checkin5.md +++ b/admin/meetings/110922-checkin5.md @@ -1,36 +1,43 @@ -# Meeting Minutes (11/09/2022) -## Team 29: Hackers1995 -## Meeting Topic: Weekly TA Catchup with Gagan -We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing. - -## Attendance -1. Rhea Bhutada -2. George Dubinin -3. Gagan Gopalaiah -4. Sanjit Joseph - -## Meeting Details -- When: 11/09/2022 at 3:30PM -- Where: Zoom - -## Agenda: - -## Discussion Points by Gagan -- Provided updates on first sprint -- Testing Tips - - functionality testing - - test one feature - - test individual functions - - static testing - - checking if its meeting the conventions and standards for specific programming language - - linting - - specific to programming language - - overall - - if tested properly, we reduce problems end-to-end testing -- Documentation - - What the code does? - - What the file is for? - - JS Docs - -## End Time -- 11/09/2022 at 4:00PM +# Meeting Minutes (11/09/2022) + +## Team 29: Hackers1995 + +## Meeting Topic: Weekly TA Catchup with Gagan + +We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing. + +## Attendance + +1. Rhea Bhutada +2. George Dubinin +3. Gagan Gopalaiah +4. Sanjit Joseph + +## Meeting Details + +- When: 11/09/2022 at 3:30PM +- Where: Zoom + +## Agenda: + +## Discussion Points by Gagan + +- Provided updates on first sprint +- Testing Tips + - functionality testing + - test one feature + - test individual functions + - static testing + - checking if its meeting the conventions and standards for specific programming language + - linting + - specific to programming language + - overall + - if tested properly, we reduce problems end-to-end testing +- Documentation + - What the code does? + - What the file is for? + - JS Docs + +## End Time + +- 11/09/2022 at 4:00PM diff --git a/admin/meetings/111322-retrospective.md b/admin/meetings/111322-retrospective.md index 977ed74..b32426d 100644 --- a/admin/meetings/111322-retrospective.md +++ b/admin/meetings/111322-retrospective.md @@ -1,8 +1,11 @@ # Sprint 1 Retrospective (11/14/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 1 Retrospective ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Sanjit Joseph @@ -15,54 +18,64 @@ 10. Isaac Otero ## Meeting Details -- When: 11/14/2022 at 4:30PM -- Where: On Campus + +- When: 11/14/2022 at 4:30PM +- Where: On Campus ## Agenda: + Discuss the review, share more detailed thoughts on sprint 1, and create some resolutions for sprint 2 ## Sprint 1 Review Below (for convenience) ## Sprint 1 REVIEW + In collecting feedback during our final sprint the leads decided to ask members individually about their experience during sprint 1 to then summarize these responses. Each member was asked 4 questions with their summarized responses below: ### What do you think worked well in the first sprint? + We resolved to hold each of our sprint 1 meetings in person with a remote option available to members that couldn't attend. We really liked hanging out at the restaurants before working on the sprint and these experiences encouraged psychological safety in the group. We made some noticeable progress which was very encouraging for the group. Specifically, we figured out quite a bit of the CI/CD pipeline details which will help us going forward and we got a solid grasp of what the visual aspects and feel of the website will be. ### What can we improve on for the next sprint? + We ran into trouble early on due to some lack of planning for specific tasks. The members agreed that we should have spent more time defining tasks for specific members and defining goals for our different teams (frontend, backend, and unit testing). There was some concern over members not being able to attend all meetings and we think this could have been fixed with regularly scheduled meetings. Some technical concerns were the Javascript unit testing pipeline development lagging behind code development and pipeline requirements being unclear. Perhaps we should write out a style document to guide the automated linting process. ### What was your contribution to the sprint? -* Rhea Bhutada: Worked on the backend features including how to get create new review card page to open in a new window -* Gavyn Etzel: Helped with javascript side of things for website -* Henry Feng: Local image store and meeting support -* Sanjit: Default photo design and frontend star rating css -* Daniel: Helped modify html, added upload file feature -* Arthur Lu: Added JS Linting, Unit testing pipeline actions and rote a few simple unit tests; added deployment pipeline action -* Marc Rheta: Added HTML Linting and CSS Linting -* Isaac Otero: Low and mid fidelity wireframes of how our page will look like, Started working on homepage.html -* George Dubinin: Meeting notes, Repo organization, cookies -* Kara Hoagland: CRUD backend functionality + +- Rhea Bhutada: Worked on the backend features including how to get create new review card page to open in a new window +- Gavyn Etzel: Helped with javascript side of things for website +- Henry Feng: Local image store and meeting support +- Sanjit: Default photo design and frontend star rating css +- Daniel: Helped modify html, added upload file feature +- Arthur Lu: Added JS Linting, Unit testing pipeline actions and rote a few simple unit tests; added deployment pipeline action +- Marc Rheta: Added HTML Linting and CSS Linting +- Isaac Otero: Low and mid fidelity wireframes of how our page will look like, Started working on homepage.html +- George Dubinin: Meeting notes, Repo organization, cookies +- Kara Hoagland: CRUD backend functionality ### Was there anything blocking your progress in the sprint? -Communication was challenging especially for members that would attend over Zoom and it was a challenge keeping track of each member's progress. We ran into some issues with the branching strategy with branches rapidly multiplying at points and the GitHub tags not working. The biggest technical issue we experienced involved Node and ES6 compatibility issues. + +Communication was challenging especially for members that would attend over Zoom and it was a challenge keeping track of each member's progress. We ran into some issues with the branching strategy with branches rapidly multiplying at points and the GitHub tags not working. The biggest technical issue we experienced involved Node and ES6 compatibility issues. Overall we feel that sprint 1 was a success with many lessons learned. Our enthusiasm for the project is only building and we are excited to get back into it with sprint 2 after a much needed short break. ## Resolutions -* Divide up tasks and assign tasks to members -* Define objectives for team groups (frontend, backend, and unit testing) -* Scheduled meetings with more notice and keep meetings at a more central location so that more members can attend -* Get the unit testing modules up to date -* To-do: create a style guide -* Heed the styles and documentation (to avoid linter issues) + +- Divide up tasks and assign tasks to members +- Define objectives for team groups (frontend, backend, and unit testing) +- Scheduled meetings with more notice and keep meetings at a more central location so that more members can attend +- Get the unit testing modules up to date +- To-do: create a style guide +- Heed the styles and documentation (to avoid linter issues) ## Early Issues -* restructure local storage to store individual (key, review) pairs rather than storing data under one key (current schema) -* implement a file upload system (think canvas file upload) -* add a cuisine attribute for tagging and filtering -* Create UI buttons and low fidelity css -* Unit test all the above + +- restructure local storage to store individual (key, review) pairs rather than storing data under one key (current schema) +- implement a file upload system (think canvas file upload) +- add a cuisine attribute for tagging and filtering +- Create UI buttons and low fidelity css +- Unit test all the above ## End Time -- 11/14/2022 at 5:00PM \ No newline at end of file + +- 11/14/2022 at 5:00PM diff --git a/admin/meetings/111322-sprint-1-review.md b/admin/meetings/111322-sprint-1-review.md index b1823b6..f706e50 100644 --- a/admin/meetings/111322-sprint-1-review.md +++ b/admin/meetings/111322-sprint-1-review.md @@ -1,9 +1,13 @@ # Sprint 1 Review Meeting Minutes (11/13/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 1 Review + We are meeting with Gagan to discuss progress made on Sprint 1 and testing strategies that we need to keep in mind as we continue developing. ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Sanjit Joseph @@ -16,37 +20,45 @@ We are meeting with Gagan to discuss progress made on Sprint 1 and testing strat 10. Isaac Otero ## Meeting Details -- When: 11/13/2022 at 1:00PM -- Where: Capital One Cafe and Zoom + +- When: 11/13/2022 at 1:00PM +- Where: Capital One Cafe and Zoom ## Agenda: + Review the week 7 sprint and get the writeup for the Agile review assignemnt ## Sprint 1 REVIEW + In collecting feedback during our final sprint the leads decided to ask members individually about their experience during sprint 1 to then summarize these responses. Each member was asked 4 questions with their summarized responses below: ### What do you think worked well in the first sprint? + We resolved to hold each of our sprint 1 meetings in person with a remote option available to members that couldn't attend. We really liked hanging out at the restaurants before working on the sprint and these experiences encouraged psychological safety in the group. We made some noticeable progress which was very encouraging for the group. Specifically, we figured out quite a bit of the CI/CD pipeline details which will help us going forward and we got a solid grasp of what the visual aspects and feel of the website will be. ### What can we improve on for the next sprint? + We ran into trouble early on due to some lack of planning for specific tasks. The members agreed that we should have spent more time defining tasks for specific members and defining goals for our different teams (frontend, backend, and unit testing). There was some concern over members not being able to attend all meetings and we think this could have been fixed with regularly scheduled meetings. Some technical concerns were the Javascript unit testing pipeline development lagging behind code development and pipeline requirements being unclear. Perhaps we should write out a style document to guide the automated linting process. ### What was your contribution to the sprint? -* Rhea Bhutada: Worked on the backend features including how to get create new review card page to open in a new window -* Gavyn Etzel: Helped with javascript side of things for website -* Henry Feng: Local image store and meeting support -* Sanjit: Default photo design and frontend star rating css -* Daniel: Helped modify html, added upload file feature -* Arthur Lu: Added JS Linting, Unit testing pipeline actions and rote a few simple unit tests; added deployment pipeline action -* Marc Rheta: Added HTML Linting and CSS Linting -* Isaac Otero: Low and mid fidelity wireframes of how our page will look like, Started working on homepage.html -* George Dubinin: Meeting notes, Repo organization, cookies -* Kara Hoagland: CRUD backend functionality + +- Rhea Bhutada: Worked on the backend features including how to get create new review card page to open in a new window +- Gavyn Etzel: Helped with javascript side of things for website +- Henry Feng: Local image store and meeting support +- Sanjit: Default photo design and frontend star rating css +- Daniel: Helped modify html, added upload file feature +- Arthur Lu: Added JS Linting, Unit testing pipeline actions and rote a few simple unit tests; added deployment pipeline action +- Marc Rheta: Added HTML Linting and CSS Linting +- Isaac Otero: Low and mid fidelity wireframes of how our page will look like, Started working on homepage.html +- George Dubinin: Meeting notes, Repo organization, cookies +- Kara Hoagland: CRUD backend functionality ### Was there anything blocking your progress in the sprint? -Communication was challenging especially for members that would attend over Zoom and it was a challenge keeping track of each member's progress. We ran into some issues with the branching strategy with branches rapidly multiplying at points and the GitHub tags not working. The biggest technical issue we experienced involved Node and ES6 compatibility issues. + +Communication was challenging especially for members that would attend over Zoom and it was a challenge keeping track of each member's progress. We ran into some issues with the branching strategy with branches rapidly multiplying at points and the GitHub tags not working. The biggest technical issue we experienced involved Node and ES6 compatibility issues. Overall we feel that sprint 1 was a success with many lessons learned. Our enthusiasm for the project is only building and we are excited to get back into it with sprint 2 after a much needed short break. ## End Time -- 11/13/2022 at 3:00PM \ No newline at end of file + +- 11/13/2022 at 3:00PM diff --git a/admin/meetings/111622-checkin6.md b/admin/meetings/111622-checkin6.md index bc62529..7e02fd6 100644 --- a/admin/meetings/111622-checkin6.md +++ b/admin/meetings/111622-checkin6.md @@ -1,33 +1,40 @@ # Meeting Minutes (11/16/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Weekly TA Catchup with Gagan + We are meeting with Gagan to discuss Checkpoint 1 and Sprint 2 resolutions. ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gagan Gopalaiah 4. Kara Hoagland ## Meeting Details -- When: 11/16/2022 at 3:30PM -- Where: Zoom + +- When: 11/16/2022 at 3:30PM +- Where: Zoom ## Agenda: ## Discussion Points by Gagan -- Updated Gagan on Sprint 1 - - looked at Girhub actions - - looked at the published page so far - - discussed retrospective -- Upcoming Assignments - - we have to come up with a video on the status of our app - - ramp up the styling part, so u can brag about the design of the app - - this video is supposed to encourage healthy competition -- Other Concerns - - JSDocs - not primary concern right now - - GitHub Pages vs. Netlify - - Gagan sees Netlify as more professional and not to difficult to implement + +- Updated Gagan on Sprint 1 + - looked at Girhub actions + - looked at the published page so far + - discussed retrospective +- Upcoming Assignments + - we have to come up with a video on the status of our app + - ramp up the styling part, so u can brag about the design of the app + - this video is supposed to encourage healthy competition +- Other Concerns + - JSDocs - not primary concern right now + - GitHub Pages vs. Netlify + - Gagan sees Netlify as more professional and not to difficult to implement ## End Time -- 11/16/2022 at 3:45PM + +- 11/16/2022 at 3:45PM diff --git a/admin/meetings/111722-sprint2meeting1.md b/admin/meetings/111722-sprint2meeting1.md index 01b31d9..b46fee6 100644 --- a/admin/meetings/111722-sprint2meeting1.md +++ b/admin/meetings/111722-sprint2meeting1.md @@ -1,9 +1,13 @@ # Meeting Minutes (11/07/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: First Sprint + Meeting notes for the first sprint ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gavyn Ezell @@ -16,32 +20,40 @@ Meeting notes for the first sprint 10. Isaac Otero ## Meeting Details -- When: 11/17/2022 at 11:30PM -- Where: Design & Innovation Building + +- When: 11/17/2022 at 11:30PM +- Where: Design & Innovation Building ## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - Second sprint commences! - - Focus on design progress for the project showoff - - Cuisine vs Tag identifiers for reviews (both?) - - localStorage will hold: - - list of active IDs which is updated for very create operation. An ID uniquely identifies a review - - value, "nextId" denoting the index of the next available slot for an Id - - entries for every single review (javascript object) - - a list for every tag that denotes which Ids belong to reviews containing this tag - End2end tests will rely on specific html element names which include the following: - - "create-btn" (located on homepage and used to create a new review) - - "submit-btn" (located on form and used to post review) - - "update-btn" (located on a specific review page) - - "delete-btn" (located on a specific review page) - - "tag-add-btn" (located on the review create form) -- ### Next Meeting's Business +- ### Old/Unresolved Business + - N/A +- ### New Business + + - Second sprint commences! + - Focus on design progress for the project showoff + - Cuisine vs Tag identifiers for reviews (both?) + + - localStorage will hold: + - list of active IDs which is updated for very create operation. An ID uniquely identifies a review + - value, "nextId" denoting the index of the next available slot for an Id + - entries for every single review (javascript object) + - a list for every tag that denotes which Ids belong to reviews containing this tag + + End2end tests will rely on specific html element names which include the following: + + - "create-btn" (located on homepage and used to create a new review) + - "submit-btn" (located on form and used to post review) + - "update-btn" (located on a specific review page) + - "delete-btn" (located on a specific review page) + - "tag-add-btn" (located on the review create form) + +- ### Next Meeting's Business ## Decisions Made -- + +- ## End Time -- 11/17/2022 at 1:00PM \ No newline at end of file + +- 11/17/2022 at 1:00PM diff --git a/admin/meetings/112022-sprint2meeting3.md b/admin/meetings/112022-sprint2meeting3.md index 4995cd3..3ff781f 100644 --- a/admin/meetings/112022-sprint2meeting3.md +++ b/admin/meetings/112022-sprint2meeting3.md @@ -1,8 +1,11 @@ # Meeting Minutes (11/20/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Second Sprint Meeting 3 ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gavyn Ezell @@ -15,25 +18,31 @@ 10. Isaac Otero ## Meeting Details -- When: 11/20/2022 at 1:00PM -- Where: CSE Building Second Floor + +- When: 11/20/2022 at 1:00PM +- Where: CSE Building Second Floor ## Agenda: -- ### Old/Unresolved Business - - N/A -- ### New Business - - Planning for the Agile Steam Status Video - - *Present the status of your software* - - Show off the preliminary design of index.html - - Walk through the process of creating a journal entry - - *Description of current challenges to development* - - *Preview of the next sprint and what to look forward to* - - Front end redo for home page including semantic restructuring and enhanced CSS - - Documentation session for JS, CSS, and HTML files - - Pipeline details have largely been ironed out -- ### Next Meeting's Business - - Creation of team status video +- ### Old/Unresolved Business + - N/A +- ### New Business + + - Planning for the Agile Steam Status Video + + - _Present the status of your software_ + - Show off the preliminary design of index.html + - Walk through the process of creating a journal entry + - _Description of current challenges to development_ + - _Preview of the next sprint and what to look forward to_ + + - Front end redo for home page including semantic restructuring and enhanced CSS + - Documentation session for JS, CSS, and HTML files + - Pipeline details have largely been ironed out + +- ### Next Meeting's Business + - Creation of team status video ## End Time -- 11/20/2022 at 3:00PM \ No newline at end of file + +- 11/20/2022 at 3:00PM diff --git a/admin/meetings/112322-checkin7.md b/admin/meetings/112322-checkin7.md index 8688282..72dfb87 100644 --- a/admin/meetings/112322-checkin7.md +++ b/admin/meetings/112322-checkin7.md @@ -1,33 +1,40 @@ # Meeting Minutes (11/23/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Weekly TA Catchup with Gagan + We are meeting with Gagan to discuss status video and general updates on project. ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gagan Gopalaiah ## Meeting Details -- When: 11/23/2022 at 3:30PM -- Where: Zoom + +- When: 11/23/2022 at 3:30PM +- Where: Zoom ## Discussion Points by Gagan -- progress looks good!! -- deadline for project - - december 3rd/4th code freeze - - no new features - - only debugging - - after december 3rd/4th we need to focus on making a good final video -- final video - - played on finals day, voted on in class - - need to spend a good amount of time on it - - essential to make this good -- last week there are going to be one-to-one sessions held - - Gagan will be asking questions to the team - - everyone needs to be aware of all aspects of the project -- start end-to-end testing on project -- quickly discussed team roles + +- progress looks good!! +- deadline for project + - december 3rd/4th code freeze + - no new features + - only debugging + - after december 3rd/4th we need to focus on making a good final video +- final video + - played on finals day, voted on in class + - need to spend a good amount of time on it + - essential to make this good +- last week there are going to be one-to-one sessions held + - Gagan will be asking questions to the team + - everyone needs to be aware of all aspects of the project +- start end-to-end testing on project +- quickly discussed team roles ## End Time -- 11/23/2022 at 3:52PM + +- 11/23/2022 at 3:52PM diff --git a/admin/meetings/112722-sprint-2-review.md b/admin/meetings/112722-sprint-2-review.md index ff68262..c5728dd 100644 --- a/admin/meetings/112722-sprint-2-review.md +++ b/admin/meetings/112722-sprint-2-review.md @@ -1,9 +1,13 @@ # Sprint 2 Review Meeting Minutes (11/27/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 2 Review -We are reviewing the second sprint 2 progress made and highlights + +We are reviewing the second sprint 2 progress made and highlights ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Sanjit Joseph @@ -16,48 +20,58 @@ We are reviewing the second sprint 2 progress made and highlights 10. Isaac Otero ## Meeting Details -- When: 11/27/2022 at 4:30PM -- Where: Zoom + +- When: 11/27/2022 at 4:30PM +- Where: Zoom ## Agenda: + Review the second sprint and discuss assiget the writeup for the Agile review assignemnt ## Sprint 2 REVIEW + In collecting feedback for the sprint the leads decided to ask members individually about their experience during sprint 2 to then summarize these responses. Each member was asked 4 questions with their summarized responses below: ### ➼ What do you think worked well in the first sprint? -Communication within the group was improved and our joint study sessions where more productive. The design team got the support they needed to accomplish the majority of their work on the project. The push to emphasize the sub-teams responsible for different tasks turned out to be a great idea and everyone put in a good effort. + +Communication within the group was improved and our joint study sessions where more productive. The design team got the support they needed to accomplish the majority of their work on the project. The push to emphasize the sub-teams responsible for different tasks turned out to be a great idea and everyone put in a good effort. ### ➼ What can we improve on for the next sprint? + With the vast majority of feature implementation underway the rapid progress created a lot of bugs which otherwise could have been avoid with more careful planning. Some members felt that even though they made a great effort they weren't able to contribute as much as they wanted to. Some of the code documentation fell behind and some design discussions were circumvented because some members where busy. One consequence was that relatively few ADRs were created even though we made many important design decisions during sprint 2. ### ➼ What was your contribution to the sprint? -* Rhea Bhutada: I mainly helped implement the backend for the CRUD features of the app and documentation related to this. This mainly entailed changing the way that we were storing user data in local storage. Additionally, I helped design the form and homepage. -* Gavyn Etzel: Helped with JavaScript functionality (CRUD Features), and also did a lot of the documentation for the script files -Helped work through the storage revamp for our review cards -Also helped integrate our first design/style setup with functionality -* Henry Feng: Worked on implementing local image uploading and storing features for updating and creating profiles. -* Sanjit: I reimplemented the star ratings since they had some issues and weren’t merged with sprint 1. I fixed a bunch of linting issues that popped up from that as well. I did a fair bit of color palette brainstorming with the team. I also went over our app design for the sprint video and edited that together. Most importantly I put a chef hat on the raccoon -* Daniel: Helped in initial CreatePage and HomePage design which improved through feedback from the rest of the group. -Helped in styling suggestions. -* Arthur Lu: Worked on fixing some CI/CD pipeline issues -Implemented e2e testing for basic update and delete functionality -Helped with fixing the homepage and review page layout -Helped with fixing the article tag overflow issue -* Marc Rheta: Implemented the e2e testing for reading and create -Allowed tabs for CSS/HTML linters -* Isaac Otero: I was able to help out with the sprint video for the last sprint and thought of how our page will look like, Started working on homepage.html -* George Dubinin: Meeting notes, Repo organization, Front-end (a little), Project Status Review video. -* Kara Hoagland: I helped set up the new local storage design, reimplemented the CRUD features using the new local storage design, contributed to the styling, added a default img, backend on the details page + +- Rhea Bhutada: I mainly helped implement the backend for the CRUD features of the app and documentation related to this. This mainly entailed changing the way that we were storing user data in local storage. Additionally, I helped design the form and homepage. +- Gavyn Etzel: Helped with JavaScript functionality (CRUD Features), and also did a lot of the documentation for the script files + Helped work through the storage revamp for our review cards + Also helped integrate our first design/style setup with functionality +- Henry Feng: Worked on implementing local image uploading and storing features for updating and creating profiles. +- Sanjit: I reimplemented the star ratings since they had some issues and weren’t merged with sprint 1. I fixed a bunch of linting issues that popped up from that as well. I did a fair bit of color palette brainstorming with the team. I also went over our app design for the sprint video and edited that together. Most importantly I put a chef hat on the raccoon +- Daniel: Helped in initial CreatePage and HomePage design which improved through feedback from the rest of the group. + Helped in styling suggestions. +- Arthur Lu: Worked on fixing some CI/CD pipeline issues + Implemented e2e testing for basic update and delete functionality + Helped with fixing the homepage and review page layout + Helped with fixing the article tag overflow issue +- Marc Rheta: Implemented the e2e testing for reading and create + Allowed tabs for CSS/HTML linters +- Isaac Otero: I was able to help out with the sprint video for the last sprint and thought of how our page will look like, Started working on homepage.html +- George Dubinin: Meeting notes, Repo organization, Front-end (a little), Project Status Review video. +- Kara Hoagland: I helped set up the new local storage design, reimplemented the CRUD features using the new local storage design, contributed to the styling, added a default img, backend on the details page ### ➼ Was there anything blocking your progress in the sprint? + A few members got sick over the break and with midterms picking up for other classes some members had trouble dedicting time for the project but everyone still put in a great effort overall. ## Next Sprint Goals + - Resolve the 4 issues open on GitHub right now - - Make the project "local first" by creating a cache + - Make the project "local first" by creating a cache - Bug fixes and final product adjustments possibly pushed to sprint 4 - We aim to keep sprint 3 short (a few days max) - JS docs (we can potentially leave this out with an explanation of where our documentation is) + ## End Time -- 11/27/2022 at 5:00PM \ No newline at end of file + +- 11/27/2022 at 5:00PM diff --git a/admin/meetings/112822-retrospective.md b/admin/meetings/112822-retrospective.md index ec04e19..de50e0c 100644 --- a/admin/meetings/112822-retrospective.md +++ b/admin/meetings/112822-retrospective.md @@ -1,8 +1,11 @@ # Sprint 1 Retrospective (11/28/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 1 Retrospective ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Sanjit Joseph @@ -15,57 +18,67 @@ 10. Isaac Otero ## Meeting Details -- When: 11/28/2022 at 4:00PM -- Where: Zoom + +- When: 11/28/2022 at 4:00PM +- Where: Zoom ## Agenda: + Discuss the review, share more detailed thoughts on sprint 2, and create some resolutions for sprint 3 ## Sprint 3 Review Below (for convenience) + In collecting feedback for the sprint the leads decided to ask members individually about their experience during sprint 2 to then summarize these responses. Each member was asked 4 questions with their summarized responses below: ### ➼ What do you think worked well in the first sprint? -Communication within the group was improved and our joint study sessions where more productive. The design team got the support they needed to accomplish the majority of their work on the project. The push to emphasize the sub-teams responsible for different tasks turned out to be a great idea and everyone put in a good effort. + +Communication within the group was improved and our joint study sessions where more productive. The design team got the support they needed to accomplish the majority of their work on the project. The push to emphasize the sub-teams responsible for different tasks turned out to be a great idea and everyone put in a good effort. ### ➼ What can we improve on for the next sprint? + With the vast majority of feature implementation underway the rapid progress created a lot of bugs which otherwise could have been avoid with more careful planning. Some members felt that even though they made a great effort they weren't able to contribute as much as they wanted to. Some of the code documentation fell behind and some design discussions were circumvented because some members where busy. One consequence was that relatively few ADRs were created even though we made many important design decisions during sprint 2. ### ➼ What was your contribution to the sprint? -* Rhea Bhutada: I mainly helped implement the backend for the CRUD features of the app and documentation related to this. This mainly entailed changing the way that we were storing user data in local storage. Additionally, I helped design the form and homepage. -* Gavyn Etzel: Helped with JavaScript functionality (CRUD Features), and also did a lot of the documentation for the script files -Helped work through the storage revamp for our review cards -Also helped integrate our first design/style setup with functionality -* Henry Feng: Worked on implementing local image uploading and storing features for updating and creating profiles. -* Sanjit: I reimplemented the star ratings since they had some issues and weren’t merged with sprint 1. I fixed a bunch of linting issues that popped up from that as well. I did a fair bit of color palette brainstorming with the team. I also went over our app design for the sprint video and edited that together. Most importantly I put a chef hat on the raccoon -* Daniel: Helped in initial CreatePage and HomePage design which improved through feedback from the rest of the group. -Helped in styling suggestions. -* Arthur Lu: Worked on fixing some CI/CD pipeline issues -Implemented e2e testing for basic update and delete functionality -Helped with fixing the homepage and review page layout -Helped with fixing the article tag overflow issue -* Marc Rheta: Implemented the e2e testing for reading and create -Allowed tabs for CSS/HTML linters -* Isaac Otero: I was able to help out with the sprint video for the last sprint and thought of how our page will look like, Started working on homepage.html -* George Dubinin: Meeting notes, Repo organization, Front-end (a little), Project Status Review video. -* Kara Hoagland: I helped set up the new local storage design, reimplemented the CRUD features using the new local storage design, contributed to the styling, added a default img, backend on the details page + +- Rhea Bhutada: I mainly helped implement the backend for the CRUD features of the app and documentation related to this. This mainly entailed changing the way that we were storing user data in local storage. Additionally, I helped design the form and homepage. +- Gavyn Etzel: Helped with JavaScript functionality (CRUD Features), and also did a lot of the documentation for the script files + Helped work through the storage revamp for our review cards + Also helped integrate our first design/style setup with functionality +- Henry Feng: Worked on implementing local image uploading and storing features for updating and creating profiles. +- Sanjit: I reimplemented the star ratings since they had some issues and weren’t merged with sprint 1. I fixed a bunch of linting issues that popped up from that as well. I did a fair bit of color palette brainstorming with the team. I also went over our app design for the sprint video and edited that together. Most importantly I put a chef hat on the raccoon +- Daniel: Helped in initial CreatePage and HomePage design which improved through feedback from the rest of the group. + Helped in styling suggestions. +- Arthur Lu: Worked on fixing some CI/CD pipeline issues + Implemented e2e testing for basic update and delete functionality + Helped with fixing the homepage and review page layout + Helped with fixing the article tag overflow issue +- Marc Rheta: Implemented the e2e testing for reading and create + Allowed tabs for CSS/HTML linters +- Isaac Otero: I was able to help out with the sprint video for the last sprint and thought of how our page will look like, Started working on homepage.html +- George Dubinin: Meeting notes, Repo organization, Front-end (a little), Project Status Review video. +- Kara Hoagland: I helped set up the new local storage design, reimplemented the CRUD features using the new local storage design, contributed to the styling, added a default img, backend on the details page ### ➼ Was there anything blocking your progress in the sprint? + A few members got sick over the break and with midterms picking up for other classes some members had trouble dedicting time for the project but everyone still put in a great effort overall. ## Next Sprint Goals + - Resolve the 4 issues open on GitHub right now - - Make the project "local first" by creating a cache + - Make the project "local first" by creating a cache - Bug fixes and final product adjustments possibly pushed to sprint 4 - We aim to keep sprint 3 short (a few days max) - JS docs (we can potentially leave this out with an explanation of where our documentation is) ## Resolutions -* Sprint 3 first meeting happening 11-29 at 5:00PM -* Make sure that there's enough communication between front-end and back-end -* Focus on meeting with your subgroup and then touch base with the main group -* Keep documentation up to date with the rest of the project -* We need to finalize the home page design (this has been open for a while). -* Fix image sizing issues by focusing on supporting 300x300 pixel images with sizes of around 2-5 megabytes + +- Sprint 3 first meeting happening 11-29 at 5:00PM +- Make sure that there's enough communication between front-end and back-end +- Focus on meeting with your subgroup and then touch base with the main group +- Keep documentation up to date with the rest of the project +- We need to finalize the home page design (this has been open for a while). +- Fix image sizing issues by focusing on supporting 300x300 pixel images with sizes of around 2-5 megabytes ## End Time -- 11/14/2022 at 5:00PM + +- 11/14/2022 at 5:00PM diff --git a/admin/meetings/112922-Sprint3Opener.md b/admin/meetings/112922-Sprint3Opener.md index dde1ac3..e91d178 100644 --- a/admin/meetings/112922-Sprint3Opener.md +++ b/admin/meetings/112922-Sprint3Opener.md @@ -1,8 +1,11 @@ # Meeting Minutes (11/29/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 3 Debut Meeting ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gavyn Ezell @@ -14,22 +17,25 @@ 9. Arthur Lu (remote) ## Meeting Details -- When: 11/29/2022 at 5:00PM -- Where: Design and Innovation Building + +- When: 11/29/2022 at 5:00PM +- Where: Design and Innovation Building ## Agenda: -- ### Old/Unresolved Business - - Resolve pretty print linting PR - - Resolve documentation not being merged to main PR -- ### New Business - - Create ADR for image storage - - Review sorting defaults (recent or top rated) - - Adding lists of reviewIDs corresponding to reviews which share specific star ratings - - Create function for retrieving top 20 reviews organized by decreasing star ratings - - Implement search for for flitering tags - - Frontend checked out new branch for alternate home page designs -- ### Next Meeting's Business - - Creation of team status video + +- ### Old/Unresolved Business + - Resolve pretty print linting PR + - Resolve documentation not being merged to main PR +- ### New Business + - Create ADR for image storage + - Review sorting defaults (recent or top rated) + - Adding lists of reviewIDs corresponding to reviews which share specific star ratings + - Create function for retrieving top 20 reviews organized by decreasing star ratings + - Implement search for for flitering tags + - Frontend checked out new branch for alternate home page designs +- ### Next Meeting's Business + - Creation of team status video ## End Time -- 11/20/2022 at 3:00PM \ No newline at end of file + +- 11/20/2022 at 3:00PM diff --git a/admin/meetings/113022-Sprint3Cont.md b/admin/meetings/113022-Sprint3Cont.md index 5689e85..b69572c 100644 --- a/admin/meetings/113022-Sprint3Cont.md +++ b/admin/meetings/113022-Sprint3Cont.md @@ -1,30 +1,36 @@ # Meeting Minutes (11/30/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Sprint 3 Continued ## Attendance + 1. Rhea Bhutada 2. George Dubinin -4. Henry Feng -5. Kara Hoagland -7. Sanjit Joseph -9. Arthur Lu +3. Henry Feng +4. Kara Hoagland +5. Sanjit Joseph +6. Arthur Lu ## Meeting Details -- When: 11/30/2022 at 2:00PM -- Where: Design and Innovation Building + +- When: 11/30/2022 at 2:00PM +- Where: Design and Innovation Building ## Agenda: -- ### Old/Unresolved Business - - Fix empty page for no-tag search - - Catch testing up with what we implemented yesterday -- ### New Business - - Cache the site for local first (high priority) - - Implement editing form "in place" (optional for this sprint) - - Change icon for "add review" entry - - Overcoming UI test challenges -- ### Next Meeting's Business - - Creation of team status video + +- ### Old/Unresolved Business + - Fix empty page for no-tag search + - Catch testing up with what we implemented yesterday +- ### New Business + - Cache the site for local first (high priority) + - Implement editing form "in place" (optional for this sprint) + - Change icon for "add review" entry + - Overcoming UI test challenges +- ### Next Meeting's Business + - Creation of team status video ## End Time -- 11/30/2022 at 2:00PM \ No newline at end of file + +- 11/30/2022 at 2:00PM diff --git a/admin/meetings/1212022-check10.md b/admin/meetings/1212022-check10.md index 80a9937..6017cd2 100644 --- a/admin/meetings/1212022-check10.md +++ b/admin/meetings/1212022-check10.md @@ -1,22 +1,29 @@ # Meeting Minutes (12/1/2022) + ## Team 29: Hackers1995 + ## Meeting Topic: Weekly TA Catchup with Gagan + We are meeting with Gagan to discuss status video and general updates on project. ## Attendance + 1. Rhea Bhutada 2. George Dubinin 3. Gagan Gopalaiah ## Meeting Details -- When: 12/1/2022 at 12:00PM -- Where: Zoom + +- When: 12/1/2022 at 12:00PM +- Where: Zoom ## Discussion Points by Gagan -- Don't code up anything after Sunday. Reserve the time for bug fixes -- Final Interview is a 4-5 minute interview about general course specific topics -- Live demo of the app for Gagan -- Gagan asks us to evaluate instructional assistants + +- Don't code up anything after Sunday. Reserve the time for bug fixes +- Final Interview is a 4-5 minute interview about general course specific topics +- Live demo of the app for Gagan +- Gagan asks us to evaluate instructional assistants ## End Time -- 12/1/2022 at 12:20PM \ No newline at end of file + +- 12/1/2022 at 12:20PM diff --git a/admin/misc/rules.md b/admin/misc/rules.md index 204bacd..30ecda7 100644 --- a/admin/misc/rules.md +++ b/admin/misc/rules.md @@ -1,57 +1,66 @@ -# Team Working Agreement -## Term: Fall 2022 -## Creation: 10/12/2022; Revised: N/A -## Group Identification - - Team 29 - - TA: Gagan Gopalaiah - - Instructor: Professor Thomas Powell - - Team Name: Hackers1995 - -## Team member info (name/email) - 1. Rhea Bhutada, rbhutada@ucsd.edu - 2. George Dubinin, gdubinin@ucsd.edu - 3. Gavyn Ezell, gezell@ucsd.edu - 4. Henry Feng, hefeng@ucsd.edu - 5. Kara Hoagland, khoaglan@ucsd.edu - 6. Marc Reta, mreta@ucsd.edu - 7. Sanjit Joseph, smjoseph@ucsd.edu - 8. Isaac Otero, irotero@ucsd.edu - 9. Arthur Lu, a8lu@ucsd.edu - 10. Daniel Hernandez, d7hernan@ucsd.edu - -## RULES: -#### 1) Primary Means of Communication and Expectations -- All members will communicate via Slack. -- All members will be expected to read messages from group chats and direct messages, and respond in no more than 4 hours and no later than 10PM. -- All pull requests require 3 people to review the code being pushed to main. - -#### 2) Scheduling Meetings (Schedule at least one meeting as part of constructing your team agreement.) -- Members are expected to meet at least once a week with the group either in-person or on Zoom. Future meeting details will be determined within a 24 hours window. -- Team members hosting the meeting will send out a reminder of the meeting with an agenda 2 hours before the meeting. - -#### 3) General Responsibilities for All Team Members - -- Respect the contributions of others. -- Work on assignments early to allow others to review and debug any issues. -- Communicate any issues or problems as early as possible. -- Be open to criticism. - -#### 4) Specific Team Member Responsibilities/Deadlines (Optional) - -- A daily standup is required every day from every team member. A daily standup includes what you've completed, what you want to work on, and what issues you encountered for the day. If you haven't done anything for that day, write down what you will be contributing. - -#### 5) Conflict Resolution - -- Conflicts between individuals will first try to be resolved amongst the people involved. -- Group conflicts will be voted on. -- Ongoing conflicts will be reported to the TA. -- Unprofessionalism of any kind will not be tolerated. Conflicts involving this will immediately be brought up with the TA - -#### 6) Expectations of Faculty and GTA’s - -- If a team member fails to live up to this agreement, the situation may be reported to the staff, but the team will still be responsible for submitting a completed assignment. Staff will be available to meet with teams to resolve issues. - -## Team Signatures - -#### Print Name: -#### Signature: +# Team Working Agreement + +## Term: Fall 2022 + +## Creation: 10/12/2022; Revised: N/A + +## Group Identification + + - Team 29 + - TA: Gagan Gopalaiah + - Instructor: Professor Thomas Powell + - Team Name: Hackers1995 + +## Team member info (name/email) + + 1. Rhea Bhutada, rbhutada@ucsd.edu + 2. George Dubinin, gdubinin@ucsd.edu + 3. Gavyn Ezell, gezell@ucsd.edu + 4. Henry Feng, hefeng@ucsd.edu + 5. Kara Hoagland, khoaglan@ucsd.edu + 6. Marc Reta, mreta@ucsd.edu + 7. Sanjit Joseph, smjoseph@ucsd.edu + 8. Isaac Otero, irotero@ucsd.edu + 9. Arthur Lu, a8lu@ucsd.edu + 10. Daniel Hernandez, d7hernan@ucsd.edu + +## RULES: + +#### 1) Primary Means of Communication and Expectations + +- All members will communicate via Slack. +- All members will be expected to read messages from group chats and direct messages, and respond in no more than 4 hours and no later than 10PM. +- All pull requests require 3 people to review the code being pushed to main. + +#### 2) Scheduling Meetings (Schedule at least one meeting as part of constructing your team agreement.) + +- Members are expected to meet at least once a week with the group either in-person or on Zoom. Future meeting details will be determined within a 24 hours window. +- Team members hosting the meeting will send out a reminder of the meeting with an agenda 2 hours before the meeting. + +#### 3) General Responsibilities for All Team Members + +- Respect the contributions of others. +- Work on assignments early to allow others to review and debug any issues. +- Communicate any issues or problems as early as possible. +- Be open to criticism. + +#### 4) Specific Team Member Responsibilities/Deadlines (Optional) + +- A daily standup is required every day from every team member. A daily standup includes what you've completed, what you want to work on, and what issues you encountered for the day. If you haven't done anything for that day, write down what you will be contributing. + +#### 5) Conflict Resolution + +- Conflicts between individuals will first try to be resolved amongst the people involved. +- Group conflicts will be voted on. +- Ongoing conflicts will be reported to the TA. +- Unprofessionalism of any kind will not be tolerated. Conflicts involving this will immediately be brought up with the TA + +#### 6) Expectations of Faculty and GTA’s + +- If a team member fails to live up to this agreement, the situation may be reported to the staff, but the team will still be responsible for submitting a completed assignment. Staff will be available to meet with teams to resolve issues. + +## Team Signatures + +#### Print Name: + +#### Signature: diff --git a/admin/team.md b/admin/team.md index de75ace..d528b29 100644 --- a/admin/team.md +++ b/admin/team.md @@ -1,73 +1,76 @@ -# **Hackers1995** - -## **Brand** -![poster](./branding/teamposter.jpg) - -## **Values** -- Openness -- Honesty -- Respect -- Integrity -- Diversity/Inclusion - -## **Roster** -### **TA: Gagan Gopalaiah** - - -### **Team Lead: Rhea Bhutada** -- #### About Me: - - My name is Rhea Bhutada and I am currently a CS major and CogSci minor at ERC. The intersection between neuroscience and computer science really fascinates me and I generally try to apply myself to projects that deal with the overlap of both of these fields. This year I'm working as an undergraduate researcher at the Swartz Center for Computational Neuroscience, which has been an extremely cool experience. Other than that I love to stay active. I used to play basketball in high school and was in an NCAA commercial with Shaq. But lately, I’ve been really into running. Overall, I'm excited to contribute to this project! Although I haven't had too much industry experience, I am interested to see how I can apply my previous course work to backend or frontend design. -- #### Link to Github: https://github.com/rheabhutada02 - - -### **Team Lead: George Dubinin** -- #### About Me: - - Hello World! I'm a fifth year (3rd year transfer) computer science major from the North Bay Area. Web development has been a big focus of mine since taking Prof Powell's 134B last winter and I'm stoked to be back in the "full stack" developer seat for 110. I am the second the team lead and in addition to my love for leading and working on team projects I am also fascinated by web development technologies including containerization, infrastructure as code (IaC), software as a service (SAAS), and web-based encryption (security). I am also an avid DJ and the traininer manmager for the DJ club on campus. This quarter is shaping up to be a memorable one! -- #### Link to Github: https://github.com/look-its-ashton - - -### **Gavyn Ezell** -- #### About Me: - - My name is Gavyn Ezell and I’m from Hawaii. Currently a 3rd year CS Major at Muir. I love video games, playing piano, and going to the gym. For SWE, backend interests me most (I am not good with design and visuals), and I’m hoping to learn a lot more backend from this project! -- #### Link to Github: https://github.com/gavyn-ezell - - -### **Daniel Hernandez** -- #### About Me: - - My name is Daniel Hernandez and I am a 3rd year Computer Science major and music minor. Some of my interests in the CS field are ML, AI, and Cybersecurity. Outside of school, I play drums for a local band. For SE, the backend aspect appeals to me the most since I am able to utilize more of what I learned from my past classes. However, I would want to try frontend since I do enjoy design to some extent. -- #### Link to Github: https://github.com/d7hernan - - -### **Henry Feng** -- #### About Me: - - My name is Henry, and I am a 3rd year CS major. I was born in China and grew up in New Zealand. I wrote my first line of code, in Python during my second year of high school. My favourite foods are ramen, steak and pasta. Some of my hobbies include playing guitar, hiking, cooking, video games, and music (from the Persona series). I am excited to start this project and hope to contribute to both frontend and backend. -- #### Link to Github: https://github.com/dusk-moon - - -### **Kara Hoagland** -- #### About Me: - - My name is Kara Hoagland and I am a 3rd year Computer Engineering major. CS-wise, I'm interested in topics such as computer vision and RFID, but it's hard to limit oneself because there's so many interesting topics out there. Outside of CS, I enjoy D&D, biking, and reading. I got some industry experience over summer and love getting to see how that experience and my previous classes all apply to this project. I'm interested in full stack but more so the backend of things. -- #### Link to Github: https://github.com/KH-Cl - - -### **Marc Reta** -- #### About Me: My name is Marc Reta and I am a 3rd year Computer Engineering major in Warren College. I love exploring San Diego and going on adventures. I have a huge interest in Public Transportation. I'm looking foward to working with everyone in my group and learn how to create an application. -- #### Link to Github: https://github.com/Graydogminer - - -### **Sanjit Joseph** -- #### About Me: - - Hi! My name is Sanjit Joseph and I'm a 3rd year CE major at Sixth. I'm from the Bay Area, so I've been surrounded by technology most of my life. I'm into building computers and I waste a lot of time (and money) messing with my PC and playing video games on it. I enjoy things outside of tech, though--as an Eagle Scout, I've done tons of backpacking throughout California and the US. I also hold a black belt in Shotokan Karate. As for this class, I'm pretty excited about all the different aspects of software engineering; frontend and backend both appeal to me, but I'm really just excited to work on a long class project in a team setting. -- #### Link to Github: https://github.com/sm-joseph - - -### **Isaac Otero** -- #### About Me: - - My name is Isaac Otero, I am a 5th year Cog Sci major. I am interested in front end development. I want to implement what I’ve learned from my design classes into my projects for front end development. -- #### Link to Github: https://github.com/Isaac-Otero - - -### **Arthur Lu** -- #### About Me: - - My name is Arthur Lu and I am a 3rd year CE major. I am primarily interested in low level systems design, hardware development and optimization, and HPC architecture. I work as an undergraduate research assistant for Prof. Turakhia developing hardware accelerators for long length genome alignment. When I’m not busy, I like to relax with some retro video games. -- #### Link to Github: https://github.com/ltcptgeneral +# **Hackers1995** + +## **Brand** + +![poster](./branding/teamposter.jpg) + +## **Values** + +- Openness +- Honesty +- Respect +- Integrity +- Diversity/Inclusion + +## **Roster** + +### **TA: Gagan Gopalaiah** + +### **Team Lead: Rhea Bhutada** + +- #### About Me: + - My name is Rhea Bhutada and I am currently a CS major and CogSci minor at ERC. The intersection between neuroscience and computer science really fascinates me and I generally try to apply myself to projects that deal with the overlap of both of these fields. This year I'm working as an undergraduate researcher at the Swartz Center for Computational Neuroscience, which has been an extremely cool experience. Other than that I love to stay active. I used to play basketball in high school and was in an NCAA commercial with Shaq. But lately, I’ve been really into running. Overall, I'm excited to contribute to this project! Although I haven't had too much industry experience, I am interested to see how I can apply my previous course work to backend or frontend design. +- #### Link to Github: https://github.com/rheabhutada02 + +### **Team Lead: George Dubinin** + +- #### About Me: + - Hello World! I'm a fifth year (3rd year transfer) computer science major from the North Bay Area. Web development has been a big focus of mine since taking Prof Powell's 134B last winter and I'm stoked to be back in the "full stack" developer seat for 110. I am the second the team lead and in addition to my love for leading and working on team projects I am also fascinated by web development technologies including containerization, infrastructure as code (IaC), software as a service (SAAS), and web-based encryption (security). I am also an avid DJ and the traininer manmager for the DJ club on campus. This quarter is shaping up to be a memorable one! +- #### Link to Github: https://github.com/look-its-ashton + +### **Gavyn Ezell** + +- #### About Me: + - My name is Gavyn Ezell and I’m from Hawaii. Currently a 3rd year CS Major at Muir. I love video games, playing piano, and going to the gym. For SWE, backend interests me most (I am not good with design and visuals), and I’m hoping to learn a lot more backend from this project! +- #### Link to Github: https://github.com/gavyn-ezell + +### **Daniel Hernandez** + +- #### About Me: + - My name is Daniel Hernandez and I am a 3rd year Computer Science major and music minor. Some of my interests in the CS field are ML, AI, and Cybersecurity. Outside of school, I play drums for a local band. For SE, the backend aspect appeals to me the most since I am able to utilize more of what I learned from my past classes. However, I would want to try frontend since I do enjoy design to some extent. +- #### Link to Github: https://github.com/d7hernan + +### **Henry Feng** + +- #### About Me: + - My name is Henry, and I am a 3rd year CS major. I was born in China and grew up in New Zealand. I wrote my first line of code, in Python during my second year of high school. My favourite foods are ramen, steak and pasta. Some of my hobbies include playing guitar, hiking, cooking, video games, and music (from the Persona series). I am excited to start this project and hope to contribute to both frontend and backend. +- #### Link to Github: https://github.com/dusk-moon + +### **Kara Hoagland** + +- #### About Me: + - My name is Kara Hoagland and I am a 3rd year Computer Engineering major. CS-wise, I'm interested in topics such as computer vision and RFID, but it's hard to limit oneself because there's so many interesting topics out there. Outside of CS, I enjoy D&D, biking, and reading. I got some industry experience over summer and love getting to see how that experience and my previous classes all apply to this project. I'm interested in full stack but more so the backend of things. +- #### Link to Github: https://github.com/KH-Cl + +### **Marc Reta** + +- #### About Me: My name is Marc Reta and I am a 3rd year Computer Engineering major in Warren College. I love exploring San Diego and going on adventures. I have a huge interest in Public Transportation. I'm looking foward to working with everyone in my group and learn how to create an application. +- #### Link to Github: https://github.com/Graydogminer + +### **Sanjit Joseph** + +- #### About Me: + - Hi! My name is Sanjit Joseph and I'm a 3rd year CE major at Sixth. I'm from the Bay Area, so I've been surrounded by technology most of my life. I'm into building computers and I waste a lot of time (and money) messing with my PC and playing video games on it. I enjoy things outside of tech, though--as an Eagle Scout, I've done tons of backpacking throughout California and the US. I also hold a black belt in Shotokan Karate. As for this class, I'm pretty excited about all the different aspects of software engineering; frontend and backend both appeal to me, but I'm really just excited to work on a long class project in a team setting. +- #### Link to Github: https://github.com/sm-joseph + +### **Isaac Otero** + +- #### About Me: + - My name is Isaac Otero, I am a 5th year Cog Sci major. I am interested in front end development. I want to implement what I’ve learned from my design classes into my projects for front end development. +- #### Link to Github: https://github.com/Isaac-Otero + +### **Arthur Lu** + +- #### About Me: + - My name is Arthur Lu and I am a 3rd year CE major. I am primarily interested in low level systems design, hardware development and optimization, and HPC architecture. I work as an undergraduate research assistant for Prof. Turakhia developing hardware accelerators for long length genome alignment. When I’m not busy, I like to relax with some retro video games. +- #### Link to Github: https://github.com/ltcptgeneral diff --git a/package.json b/package.json index 13fd016..66b994d 100644 --- a/package.json +++ b/package.json @@ -24,4 +24,4 @@ "stylelint": "14.14.1", "stylelint-config-standard": "^29.0.0" } -} \ No newline at end of file +} diff --git a/source/CreatePage.html b/source/CreatePage.html index d4a1192..519ccbf 100644 --- a/source/CreatePage.html +++ b/source/CreatePage.html @@ -1,6 +1,5 @@ - @@ -8,12 +7,11 @@ Food Journal - + - @@ -23,25 +21,24 @@
- logo -

Food Journal

- logo + logo +

Food Journal

+ logo
- +

New Entry

-
PICTURE: - +
@@ -52,47 +49,45 @@
MEAL NAME: - +
RESTAURANT NAME: - +
- +
RATING: -
+
- - - - - + + + + +
COMMENTS: - +
TAGS: (ex. cuisine, distance, cost, etc) - + -
-
- +
+
- + - - + + -
+ - - \ No newline at end of file + diff --git a/source/ReviewDetails.html b/source/ReviewDetails.html index 61aada9..521ddb4 100644 --- a/source/ReviewDetails.html +++ b/source/ReviewDetails.html @@ -7,12 +7,12 @@ Food Journal - + - + @@ -22,42 +22,64 @@
- logo -

Food Journal

- logo + logo +

Food Journal

+ logo
-
-

-

-
- -
- - -
- -
- -

+
+

+

-
-
+
+ +
+
+ +

+
+ +
+
+
- + -
- - - +
+ + +
@@ -65,17 +87,16 @@

Update Entry

-
PICTURE: - +
- -
+ +
@@ -83,43 +104,42 @@
MEAL NAME: - +
RESTAURANT NAME: - +
- +
RATING: -
+
- - - - - + + + + +
COMMENTS: - +
TAGS: (ex. cuisine, distance, cost, etc) - + -
-
- +
+
- - + + diff --git a/source/assets/scripts/CreatePage.js b/source/assets/scripts/CreatePage.js index 83bb776..b0ca4ac 100644 --- a/source/assets/scripts/CreatePage.js +++ b/source/assets/scripts/CreatePage.js @@ -13,27 +13,26 @@ function init() { * Creates a form and associates a new ID with the new review card. */ function initFormHandler() { - // Accesses form components let tagContainer = document.getElementById("tag-container-form"); let form = document.querySelector("form"); - + // Declaring variable storing image data url let imgDataURL = ""; - + // Accessing components related to taking photo let videoMode = true; let player = document.getElementById("player"); let canvas = document.getElementById("photoCanvas"); let photoButton = document.getElementById("photoButton"); - let context = canvas.getContext('2d'); + let context = canvas.getContext("2d"); // Event listener for the photo taking/reset button - photoButton.addEventListener('click', ()=>{ + photoButton.addEventListener("click", () => { // capturing the current video frame if (videoMode) { videoMode = false; - + // setting up the appropriate components for displaying the photo preview photoButton.innerText = "Retake"; player.setAttribute("hidden", ""); @@ -57,7 +56,7 @@ function initFormHandler() { // Event listener for reading image form different data let select = document.getElementById("select"); const input = document.getElementById("mealImg"); - select.addEventListener("change", function() { + select.addEventListener("change", function () { // Select a photo with HTML file selector if (select.value == "file") { // enabling file upload components and hiding photo taking components @@ -80,27 +79,30 @@ function initFormHandler() { photoButton.removeAttribute("hidden", ""); // getting video stream from user's camera then displaying it on a video element - navigator.mediaDevices.getUserMedia({video: true,}).then((stream)=>{ + navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { player.srcObject = stream; }); } }); // Addresses sourcing image from local file - document.getElementById("mealImg").addEventListener("change", function() { + document.getElementById("mealImg").addEventListener("change", function () { const reader = new FileReader(); - + // Store image data URL after successful image load - reader.addEventListener("load", ()=>{ - imgDataURL = reader.result; - }, false); - + reader.addEventListener( + "load", + () => { + imgDataURL = reader.result; + }, + false + ); + // Convert image file into data URL for local storage reader.readAsDataURL(document.getElementById("mealImg").files[0]); }); - form.addEventListener("submit", function(e){ - + form.addEventListener("submit", function (e) { // Create reviewObject and put in storage e.preventDefault(); let formData = new FormData(form); @@ -119,14 +121,13 @@ function initFormHandler() { } // Makes sure that ratings is filled - if(reviewObject["rating"] != null){ - + if (reviewObject["rating"] != null) { //Adds rags separately as an array reviewObject["tags"] = []; // Grabs tags let tags = document.querySelectorAll(".tag"); - for(let i = 0; i < tags.length; i ++) { + for (let i = 0; i < tags.length; i++) { reviewObject["tags"].push(tags[i].innerHTML); tagContainer.removeChild(tags[i]); } @@ -134,43 +135,41 @@ function initFormHandler() { // Assigns the new review with a new ID let nextReviewId = newReviewToStorage(reviewObject); sessionStorage.setItem("currID", JSON.stringify(nextReviewId)); - + // Redirects to a page that shows the newly created review window.location.assign("./ReviewDetails.html"); - } + } // Does not let user proceed if rating is not complete - else{ + else { window.alert("NO! FILL IN STARS"); } - }); // Event listener for tag functionality let tagAddBtn = document.getElementById("tag-add-btn"); //Set used to track tags and ensure no duplicates let tagSet = new Set(); - tagAddBtn.addEventListener("click", ()=> { + tagAddBtn.addEventListener("click", () => { let tagField = document.getElementById("tag-form"); // If there is a tag, it'll display the tag if (tagField.value.length > 0) { let tagSetVal = tagField.value.toLowerCase(); - if (!tagSet.has(tagSetVal)){ + if (!tagSet.has(tagSetVal)) { let tagLabel = document.createElement("label"); tagLabel.innerHTML = tagField.value; - tagLabel.setAttribute("class","tag"); + tagLabel.setAttribute("class", "tag"); tagSet.add(tagSetVal); - tagLabel.addEventListener("click",()=> { + tagLabel.addEventListener("click", () => { tagContainer.removeChild(tagLabel); tagSet.delete(tagSetVal); }); - + tagContainer.append(tagLabel); } else { window.alert("No duplicate tags allowed"); } tagField.value = ""; } - }); - + }); } diff --git a/source/assets/scripts/ReviewCard.js b/source/assets/scripts/ReviewCard.js index 27f9cb0..3600f2d 100644 --- a/source/assets/scripts/ReviewCard.js +++ b/source/assets/scripts/ReviewCard.js @@ -4,9 +4,9 @@ class ReviewCard extends HTMLElement { // Called once when document.createElement('review-card') is called, or // the element is written into the DOM directly as constructor() { - super(); + super(); - let shadowEl = this.attachShadow({mode:"open"}); + let shadowEl = this.attachShadow({ mode: "open" }); let articleEl = document.createElement("article"); @@ -106,7 +106,7 @@ class ReviewCard extends HTMLElement { articleEl.append(styleEl); shadowEl.append(articleEl); this.shadowEl = shadowEl; - + // Attach event listener to each review-card this.addEventListener("click", (event) => { console.log(event.target); @@ -119,40 +119,40 @@ class ReviewCard extends HTMLElement { } /** - * Called when the .data property is set on this element. - * - * For Example: - * let reviewCard = document.createElement('review-card'); - * reviewCard.data = { foo: 'bar' } - * - * @param {Object} data - The data to pass into the , must be of the - * following format: - * { - * "mealImg": string, - * "mealName": string, - * "comments": string, - * "rating": number, - * "restaurant": string, - * "reviewID": number, - * "tags": string array - * } - */ + * Called when the .data property is set on this element. + * + * For Example: + * let reviewCard = document.createElement('review-card'); + * reviewCard.data = { foo: 'bar' } + * + * @param {Object} data - The data to pass into the , must be of the + * following format: + * { + * "mealImg": string, + * "mealName": string, + * "comments": string, + * "rating": number, + * "restaurant": string, + * "reviewID": number, + * "tags": string array + * } + */ set data(data) { // If nothing was passed in, return if (!data) return; // Select the
we added to the Shadow DOM in the constructor let articleEl = this.shadowEl.querySelector("article"); - + // Setting the article elements for the review card this.reviewID = data["reviewID"]; // Image setup let mealImg = document.createElement("img"); mealImg.setAttribute("id", "a-meal-img"); - mealImg.setAttribute("alt","Meal Photo Corrupted"); - mealImg.setAttribute("src",data["mealImg"]); - mealImg.addEventListener("error", function(e) { + mealImg.setAttribute("alt", "Meal Photo Corrupted"); + mealImg.setAttribute("src", data["mealImg"]); + mealImg.addEventListener("error", function (e) { mealImg.setAttribute("src", "./assets/images/default_plate.png"); e.onerror = null; }); @@ -162,14 +162,14 @@ class ReviewCard extends HTMLElement { meallabelDiv.setAttribute("class", "meal-name-div"); let mealLabel = document.createElement("label"); mealLabel.setAttribute("id", "a-meal-name"); - mealLabel.setAttribute("class","meal-name"); + mealLabel.setAttribute("class", "meal-name"); mealLabel.innerHTML = data["mealName"]; meallabelDiv.append(mealLabel); // Restaurant name setup let restaurantLabel = document.createElement("label"); restaurantLabel.setAttribute("id", "a-restaurant"); - restaurantLabel.setAttribute("class","restaurant-name"); + restaurantLabel.setAttribute("class", "restaurant-name"); restaurantLabel.innerHTML = data["restaurant"]; // Comment section setup (display set to none) @@ -183,13 +183,13 @@ class ReviewCard extends HTMLElement { ratingDiv.setAttribute("class", "rating"); let starsImg = document.createElement("img"); starsImg.setAttribute("id", "a-rating"); - starsImg.setAttribute("src", "./assets/images/"+data["rating"]+"-star.svg"); - starsImg.setAttribute("alt", data["rating"] +" stars"); + starsImg.setAttribute("src", "./assets/images/" + data["rating"] + "-star.svg"); + starsImg.setAttribute("alt", data["rating"] + " stars"); starsImg.setAttribute("num", data["rating"]); ratingDiv.append(starsImg); // Tags setup - let tagContainerDiv = document.createElement("div"); + let tagContainerDiv = document.createElement("div"); tagContainerDiv.setAttribute("class", "tag-container-div"); let tagContainer = document.createElement("div"); tagContainer.setAttribute("class", "tag-container"); @@ -197,10 +197,10 @@ class ReviewCard extends HTMLElement { tagContainer.setAttribute("list", data["tags"]); // Checks if user gave tags, if so added to review card - if(data["tags"]){ + if (data["tags"]) { for (let i = 0; i < data["tags"].length; i++) { let newTag = document.createElement("label"); - newTag.setAttribute("class","a-tag"); + newTag.setAttribute("class", "a-tag"); newTag.innerHTML = data["tags"][i]; tagContainer.append(newTag); } @@ -214,33 +214,30 @@ class ReviewCard extends HTMLElement { articleEl.append(ratingDiv); articleEl.append(tagContainerDiv); articleEl.append(comments); - - } /** - * Called when getting the .data property of this element. - * - * For Example: - * let reviewCard = document.createElement('review-card'); - * reviewCard.data = { foo: 'bar' } - * - * @return {Object} data - The data from the , of the - * following format: - * { - * "mealImg": string, - * "mealName": string, - * "comments": string, - * "rating": number, - * "restaurant": string, - * "reviewID": number, - * "tags": string array - * } - */ + * Called when getting the .data property of this element. + * + * For Example: + * let reviewCard = document.createElement('review-card'); + * reviewCard.data = { foo: 'bar' } + * + * @return {Object} data - The data from the , of the + * following format: + * { + * "mealImg": string, + * "mealName": string, + * "comments": string, + * "rating": number, + * "restaurant": string, + * "reviewID": number, + * "tags": string array + * } + */ get data() { - let dataContainer = {}; - + // Getting the article elements for the review card dataContainer["reviewID"] = this.reviewID; diff --git a/source/assets/scripts/ReviewDetails.js b/source/assets/scripts/ReviewDetails.js index ceaea94..7c6f5a0 100644 --- a/source/assets/scripts/ReviewDetails.js +++ b/source/assets/scripts/ReviewDetails.js @@ -1,5 +1,5 @@ //reviewDetails.js -import {deleteReviewFromStorage, getReviewFromStorage, updateReviewToStorage} from "./localStorage.js"; +import { deleteReviewFromStorage, getReviewFromStorage, updateReviewToStorage } from "./localStorage.js"; // Run the init() function when the page has loaded window.addEventListener("DOMContentLoaded", init); @@ -7,7 +7,7 @@ window.addEventListener("DOMContentLoaded", init); /** * Populates the relevant data to the details from local storage review. */ -function init(){ +function init() { setupInfo(); setupDelete(); setupUpdate(); @@ -16,14 +16,14 @@ function init(){ /** * Populates the relevant data to the details from local storage review */ -function setupInfo(){ +function setupInfo() { let currID = JSON.parse(sessionStorage.getItem("currID")); let currReview = getReviewFromStorage(currID); - + //meal image let mealImg = document.getElementById("d-meal-img"); - mealImg.setAttribute("src",currReview["mealImg"]); - mealImg.addEventListener("error", function(e) { + mealImg.setAttribute("src", currReview["mealImg"]); + mealImg.addEventListener("error", function (e) { mealImg.setAttribute("src", "./assets/images/default_plate.png"); e.onerror = null; }); @@ -35,22 +35,22 @@ function setupInfo(){ //restaurant name let restaurantLabel = document.getElementById("d-restaurant"); restaurantLabel.innerHTML = currReview["restaurant"]; - + //comments let comments = document.getElementById("d-comments"); comments.innerText = currReview["comments"]; //rating let starsImg = document.getElementById("d-rating"); - starsImg.setAttribute("src", "./assets/images/"+currReview["rating"]+"-star.svg"); - starsImg.setAttribute("alt", currReview["rating"] +" stars"); - + starsImg.setAttribute("src", "./assets/images/" + currReview["rating"] + "-star.svg"); + starsImg.setAttribute("alt", currReview["rating"] + " stars"); + //tags let tagContainer = document.getElementById("d-tags"); - if(currReview["tags"]){ + if (currReview["tags"]) { for (let i = 0; i < currReview["tags"].length; i++) { let newTag = document.createElement("label"); - newTag.setAttribute("class","d-tag"); + newTag.setAttribute("class", "d-tag"); newTag.innerHTML = currReview["tags"][i]; tagContainer.append(newTag); } @@ -60,11 +60,11 @@ function setupInfo(){ /** * Sets up delete button to delete reveiw from storage and switch to homepage. */ -function setupDelete(){ +function setupDelete() { let deleteBtn = document.getElementById("delete-btn"); let currID = JSON.parse(sessionStorage.getItem("currID")); - deleteBtn.addEventListener("click", function(){ - if(window.confirm("Are you sure you want to delete this entry?")){ + deleteBtn.addEventListener("click", function () { + if (window.confirm("Are you sure you want to delete this entry?")) { deleteReviewFromStorage(currID); sessionStorage.removeItem("currID"); window.location.assign("./index.html"); @@ -75,13 +75,13 @@ function setupDelete(){ /** * Sets up update button to reveal form and update info in storage and the current page. */ -function setupUpdate(){ +function setupUpdate() { let updateBtn = document.getElementById("update-btn"); let currID = JSON.parse(sessionStorage.getItem("currID")); let currReview = getReviewFromStorage(currID); let form = document.getElementById("new-food-entry"); let updateDiv = document.getElementById("update-form"); - updateBtn.addEventListener("click", function(){ + updateBtn.addEventListener("click", function () { //update function updateDiv.classList.remove("hidden"); @@ -98,26 +98,26 @@ function setupUpdate(){ //Set used to track tags and ensure no duplicates let tagSet = new Set(); - if(currReview["tags"]){ + if (currReview["tags"]) { while (tagContainer.firstChild) { tagContainer.removeChild(tagContainer.firstChild); } - + let tagSetVal; for (let i = 0; i < currReview["tags"].length; i++) { tagSetVal = currReview["tags"][i].toLowerCase(); tagSet.add(tagSetVal); let newTag = document.createElement("label"); - newTag.setAttribute("class","tag"); + newTag.setAttribute("class", "tag"); newTag.innerHTML = currReview["tags"][i]; - newTag.addEventListener("click",()=> { + newTag.addEventListener("click", () => { tagContainer.removeChild(newTag); tagSet.delete(tagSetVal); }); tagContainer.append(newTag); } } - + // Declaring variable storing image data url let imgDataURL = ""; @@ -126,14 +126,14 @@ function setupUpdate(){ let player = document.getElementById("player"); let canvas = document.getElementById("photoCanvas"); let photoButton = document.getElementById("photoButton"); - let context = canvas.getContext('2d'); + let context = canvas.getContext("2d"); // Event listener for the photo taking/reset button - photoButton.addEventListener('click', ()=>{ + photoButton.addEventListener("click", () => { // capturing the current video frame if (videoMode) { videoMode = false; - + // setting up the appropriate components for displaying the photo preview photoButton.innerText = "Retake"; player.setAttribute("hidden", ""); @@ -155,25 +155,25 @@ function setupUpdate(){ }); /* - * change the input source of the image between local file and taking photo - * depending on user's selection - */ + * change the input source of the image between local file and taking photo + * depending on user's selection + */ let select = document.getElementById("select"); const input = document.getElementById("mealImg"); - select.addEventListener("change", function() { + select.addEventListener("change", function () { console.log("1"); - // Select a photo with HTML file selector + // Select a photo with HTML file selector if (select.value == "file") { // enabling file upload components and hiding photo taking components input.removeAttribute("hidden", ""); player.setAttribute("hidden", ""); canvas.setAttribute("hidden", ""); photoButton.setAttribute("hidden", ""); - + // stopping the video stream player.srcObject.getVideoTracks()[0].stop(); } - + // Take a photo else { // enabling photo taking components and hiding file upload components @@ -182,35 +182,38 @@ function setupUpdate(){ input.setAttribute("hidden", ""); player.removeAttribute("hidden", ""); photoButton.removeAttribute("hidden", ""); - + // getting video stream from user's camera then displaying it on a video element - navigator.mediaDevices.getUserMedia({video: true,}).then((stream)=>{ + navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => { player.srcObject = stream; }); } }); //addressing sourcing image from local file - document.getElementById("mealImg").addEventListener("change", function() { + document.getElementById("mealImg").addEventListener("change", function () { console.log("reading used"); const reader = new FileReader(); - + //store image data URL after successful image load - reader.addEventListener("load", ()=>{ - imgDataURL = reader.result; - }, false); - + reader.addEventListener( + "load", + () => { + imgDataURL = reader.result; + }, + false + ); + //convert image file into data URL for local storage reader.readAsDataURL(document.getElementById("mealImg").files[0]); }); - //Take formdata values as newData when submit - form.addEventListener("submit", function(){ + form.addEventListener("submit", function () { /* - * User submits the form for their review. - * We create reviewCard data, replace in storage, and update tags - */ + * User submits the form for their review. + * We create reviewCard data, replace in storage, and update tags + */ let formData = new FormData(form); let newData = {}; //iterate through formData and add to newData @@ -223,43 +226,41 @@ function setupUpdate(){ // Account for the case where image is not updated if (`${key}` === "mealImg" && imgDataURL === "") { newData["mealImg"] = currReview["mealImg"]; - } - else if (`${key}` === "mealImg") { + } else if (`${key}` === "mealImg") { newData["mealImg"] = imgDataURL; } } newData["tags"] = []; - + let tags = document.querySelectorAll(".tag"); - for(let i = 0; i < tags.length; i ++) { + for (let i = 0; i < tags.length; i++) { newData["tags"].push(tags[i].innerHTML); tagContainer.removeChild(tags[i]); } newData["reviewID"] = currID; - + updateReviewToStorage(currID, newData); updateDiv.classList.add("hidden"); - }); // Adding tag to form functionality let tagAddBtn = document.getElementById("tag-add-btn"); - tagAddBtn.addEventListener("click", ()=> { + tagAddBtn.addEventListener("click", () => { let tagField = document.getElementById("tag-form"); if (tagField.value.length > 0) { let tagSetVal = tagField.value.toLowerCase(); - if (!tagSet.has(tagSetVal)){ + if (!tagSet.has(tagSetVal)) { let tagLabel = document.createElement("label"); tagLabel.innerHTML = tagField.value; - tagLabel.setAttribute("class","tag"); + tagLabel.setAttribute("class", "tag"); tagSet.add(tagSetVal); - tagLabel.addEventListener("click",()=> { + tagLabel.addEventListener("click", () => { tagContainer.removeChild(tagLabel); tagSet.delete(tagSetVal); }); - + tagContainer.append(tagLabel); } else { window.alert("No duplicate tags allowed"); diff --git a/source/assets/scripts/appTestHelpers.js b/source/assets/scripts/appTestHelpers.js index aa4b1db..018a1a3 100644 --- a/source/assets/scripts/appTestHelpers.js +++ b/source/assets/scripts/appTestHelpers.js @@ -1,35 +1,34 @@ -import {strict as assert} from "node:assert"; +import { strict as assert } from "node:assert"; /** * Fills out a create or update review form * @param {Object} page the page object which contains the create or update form - * @param {Object} review review data to input into the form + * @param {Object} review review data to input into the form */ export async function setReviewForm(page, review) { - // Set text fields - await page.$eval("#mealName", (el, value) => el.value = value, review.mealName); - await page.$eval("#comments", (el, value) => el.value = value, review.comments); - await page.$eval("#restaurant", (el, value) => el.value = value, review.restaurant); + await page.$eval("#mealName", (el, value) => (el.value = value), review.mealName); + await page.$eval("#comments", (el, value) => (el.value = value), review.comments); + await page.$eval("#restaurant", (el, value) => (el.value = value), review.restaurant); // Get all tag elements and click them to delete them let tag_items = await page.$$(".tag"); - if(tag_items !== null){ - for(let i = 0; i < tag_items.length; i++){ + if (tag_items !== null) { + for (let i = 0; i < tag_items.length; i++) { await tag_items[i].click(); } } // Get the button needed to add new tags let tag_btn = await page.$("#tag-add-btn"); - for(let i = 0; i < review.tags.length; i++){ - await page.$eval("#tag-form", (el, value) => el.value = value, review.tags[i]); + for (let i = 0; i < review.tags.length; i++) { + await page.$eval("#tag-form", (el, value) => (el.value = value), review.tags[i]); await tag_btn.click(); } // Select a new rating let rating_select = await page.$(`#s${review.rating}-select`); - await rating_select.click({delay: 100}); + await rating_select.click({ delay: 100 }); } /** @@ -38,7 +37,7 @@ export async function setReviewForm(page, review) { * @param {string} prefix prefix character for element IDs * @param {Object} expected values for each element */ -export async function checkCorrectness(root, prefix, expected){ +export async function checkCorrectness(root, prefix, expected) { // Get the review image and check src let img = await root.$(`#${prefix}-meal-img`); let imgSrc = await img.getProperty("src"); @@ -61,7 +60,7 @@ export async function checkCorrectness(root, prefix, expected){ // Check tags let tags = await root.$$(`.${prefix}-tag`); assert.strictEqual(await tags.length, expected.tags.length); - for(let i = 0; i < expected.tags.length; i++){ + for (let i = 0; i < expected.tags.length; i++) { let tag_text = await tags[i].getProperty("innerText"); assert.strictEqual(await tag_text.jsonValue(), expected.tags[i]); } @@ -70,4 +69,4 @@ export async function checkCorrectness(root, prefix, expected){ let stars = await root.$(`#${prefix}-rating`); let stars_src = await stars.getProperty("src"); assert.strictEqual(await stars_src.jsonValue(), expected.rating); -} \ No newline at end of file +} diff --git a/source/assets/scripts/localStorage.js b/source/assets/scripts/localStorage.js index 8f457f4..f7510c6 100644 --- a/source/assets/scripts/localStorage.js +++ b/source/assets/scripts/localStorage.js @@ -3,7 +3,7 @@ * @param {Object} review to store * @return {number} ID of the newly added review */ -export function newReviewToStorage(review){ +export function newReviewToStorage(review) { //grabbing the nextID, and putting our review object in storage associated with the ID let nextReviewId = JSON.parse(localStorage.getItem("nextID")); review["reviewID"] = nextReviewId; @@ -16,17 +16,17 @@ export function newReviewToStorage(review){ //adding to the star storage let starArr = JSON.parse(localStorage.getItem(`star${review["rating"]}`)); - if(!starArr){ + if (!starArr) { starArr = []; } starArr.push(nextReviewId); localStorage.setItem(`star${review["rating"]}`, JSON.stringify(starArr)); - + //updating our activeIDS list let tempIdArr = JSON.parse(localStorage.getItem("activeIDS")); tempIdArr.push(nextReviewId); localStorage.setItem("activeIDS", JSON.stringify(tempIdArr)); - + //increment nextID for next review creation localStorage.setItem("nextID", JSON.stringify(nextReviewId + 1)); @@ -38,7 +38,7 @@ export function newReviewToStorage(review){ * @param {string} ID of the review to get * @returns {Object} review object corresponding to param ID */ -export function getReviewFromStorage(ID){ +export function getReviewFromStorage(ID) { return JSON.parse(localStorage.getItem(`review${ID}`)); } @@ -47,15 +47,15 @@ export function getReviewFromStorage(ID){ * @param {string} ID of review to update * @param {Object} review to store */ -export function updateReviewToStorage(ID, review){ +export function updateReviewToStorage(ID, review) { let oldReview = JSON.parse(localStorage.getItem(`review${ID}`)); let starArr = JSON.parse(localStorage.getItem(`star${review["rating"]}`)); //activeID update recency let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); - for (let i in activeIDS){ - if(activeIDS[i] == ID){ - activeIDS.splice(i,1); + for (let i in activeIDS) { + if (activeIDS[i] == ID) { + activeIDS.splice(i, 1); activeIDS.push(ID); break; } @@ -63,33 +63,33 @@ export function updateReviewToStorage(ID, review){ localStorage.setItem("activeIDS", JSON.stringify(activeIDS)); //star local storage update - if(oldReview["rating"] !== review["rating"]){ + if (oldReview["rating"] !== review["rating"]) { //first delete from previous rating array in storage let oldStarArr = JSON.parse(localStorage.getItem(`star${oldReview["rating"]}`)); for (let i in oldStarArr) { if (oldStarArr[i] == ID) { //removing from corresponding rating array and updating local Storage - oldStarArr.splice(i,1); + oldStarArr.splice(i, 1); break; } } - if(oldStarArr.length != 0){ + if (oldStarArr.length != 0) { localStorage.setItem(`star${oldReview["rating"]}`, JSON.stringify(oldStarArr)); } else { localStorage.removeItem(`star${oldReview["rating"]}`); } //then add ID to array corresponding to new review rating let newStarArr = starArr; - if(!newStarArr){ + if (!newStarArr) { newStarArr = []; } newStarArr.push(ID); localStorage.setItem(`star${review["rating"]}`, JSON.stringify(newStarArr)); - } else if(starArr.length !== 1) { + } else if (starArr.length !== 1) { //stars update recency if unchanged - for (let i in starArr){ - if(starArr[i] == ID) { - starArr.splice(i,1); + for (let i in starArr) { + if (starArr[i] == ID) { + starArr.splice(i, 1); starArr.push(ID); break; } @@ -98,14 +98,14 @@ export function updateReviewToStorage(ID, review){ } //specifically the unchanged tags update recency - let repeatedTags = review["tags"].filter(x => oldReview["tags"].includes(x)); + let repeatedTags = review["tags"].filter((x) => oldReview["tags"].includes(x)); let tagArr = []; - for (let i in repeatedTags){ + for (let i in repeatedTags) { tagArr = JSON.parse(localStorage.getItem(`!${repeatedTags[i]}`.toLocaleLowerCase())); - if(tagArr.length == 1){ - for (let j in tagArr){ - if(tagArr[j] == ID){ - tagArr.splice(j,1); + if (tagArr.length == 1) { + for (let j in tagArr) { + if (tagArr[j] == ID) { + tagArr.splice(j, 1); tagArr.push(ID); break; } @@ -115,8 +115,8 @@ export function updateReviewToStorage(ID, review){ } //Get diff of tags and update storage - let deletedTags = oldReview["tags"].filter(x => !review["tags"].includes(x)); - let addedTags = review["tags"].filter(x => !oldReview["tags"].includes(x)); + let deletedTags = oldReview["tags"].filter((x) => !review["tags"].includes(x)); + let addedTags = review["tags"].filter((x) => !oldReview["tags"].includes(x)); deleteTagsFromStorage(ID, deletedTags); addTagsToStorage(ID, addedTags); @@ -128,30 +128,30 @@ export function updateReviewToStorage(ID, review){ * Deletes a review by ID from storage * @param {string} ID of the review to delete */ -export function deleteReviewFromStorage(ID){ +export function deleteReviewFromStorage(ID) { //removing id number from activeIDS and star{rating} let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); let reviewRating = JSON.parse(localStorage.getItem(`review${ID}`))["rating"]; let starArr = JSON.parse(localStorage.getItem(`star${reviewRating}`)); - + for (let i in starArr) { if (starArr[i] == ID) { //removing from corresponding rating array and updating local Storage - starArr.splice(i,1); + starArr.splice(i, 1); break; } } - if(starArr.length != 0){ + if (starArr.length != 0) { localStorage.setItem(`star${reviewRating}`, JSON.stringify(starArr)); } else { localStorage.removeItem(`star${reviewRating}`); } - + for (let i in activeIDS) { if (activeIDS[i] == ID) { - activeIDS.splice(i,1); + activeIDS.splice(i, 1); localStorage.setItem("activeIDS", JSON.stringify(activeIDS)); - + let currReview = JSON.parse(localStorage.getItem(`review${ID}`)); deleteTagsFromStorage(ID, currReview["tags"]); localStorage.removeItem(`review${ID}`); @@ -168,17 +168,17 @@ export function deleteReviewFromStorage(ID){ * @param {string[]} deletedTags to modify storage of */ function deleteTagsFromStorage(ID, deletedTags) { - for(let i in deletedTags){ + for (let i in deletedTags) { //get local storage of each tag and remove id from tag list - let tagName = "!"+ deletedTags[i].toLowerCase(); + let tagName = "!" + deletedTags[i].toLowerCase(); let tagArr = JSON.parse(localStorage.getItem(tagName)); - for(let j in tagArr){ - if(tagArr[j] == ID){ - tagArr.splice(j,1); + for (let j in tagArr) { + if (tagArr[j] == ID) { + tagArr.splice(j, 1); break; } } - if(tagArr.length != 0){ + if (tagArr.length != 0) { localStorage.setItem(tagName, JSON.stringify(tagArr)); } else { localStorage.removeItem(tagName); @@ -192,10 +192,10 @@ function deleteTagsFromStorage(ID, deletedTags) { * @param {string[]} addedTags to modify storage of */ function addTagsToStorage(ID, addedTags) { - for(let i in addedTags){ + for (let i in addedTags) { let tagName = "!" + addedTags[i].toLowerCase(); let tagArr = JSON.parse(localStorage.getItem(tagName)); - if(!tagArr){ + if (!tagArr) { tagArr = []; } tagArr.push(ID); @@ -208,10 +208,10 @@ function addTagsToStorage(ID, addedTags) { * @returns {Object} all active reviews from local storage */ export function getAllReviewsFromStorage() { - if (!(localStorage.getItem("activeIDS"))) { + if (!localStorage.getItem("activeIDS")) { // we wanna init the active ID array and start the nextID count localStorage.setItem("activeIDS", JSON.stringify([])); - localStorage.setItem("nextID", JSON.stringify(0)); + localStorage.setItem("nextID", JSON.stringify(0)); } //iterate thru activeIDS let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); @@ -228,10 +228,10 @@ export function getAllReviewsFromStorage() { * @returns {number[]} list of all active IDs by recency */ export function getIDsFromStorage() { - if (!(localStorage.getItem("activeIDS"))) { + if (!localStorage.getItem("activeIDS")) { // we wanna init the active ID array and start the nextID count localStorage.setItem("activeIDS", JSON.stringify([])); - localStorage.setItem("nextID", JSON.stringify(0)); + localStorage.setItem("nextID", JSON.stringify(0)); } let activeIDS = JSON.parse(localStorage.getItem("activeIDS")); return activeIDS.reverse(); @@ -244,7 +244,7 @@ export function getIDsFromStorage() { */ export function getIDsByTag(tag) { let tagArr = JSON.parse(localStorage.getItem("!" + tag.toLowerCase())); - if(!tagArr){ + if (!tagArr) { tagArr = []; } return tagArr.reverse(); @@ -256,12 +256,12 @@ export function getIDsByTag(tag) { */ export function getTopIDsFromStorage() { let resultArr = []; - for(let i = 5; i > 0; i--){ + for (let i = 5; i > 0; i--) { let starArr = JSON.parse(localStorage.getItem(`star${i}`)); - if(!starArr){ + if (!starArr) { continue; } resultArr = resultArr.concat(starArr.reverse()); } return resultArr; -} \ No newline at end of file +} diff --git a/source/assets/scripts/localStorage.test.js b/source/assets/scripts/localStorage.test.js index a365c59..a7d7178 100644 --- a/source/assets/scripts/localStorage.test.js +++ b/source/assets/scripts/localStorage.test.js @@ -1,9 +1,16 @@ -import {strict as assert} from "node:assert"; -import {describe, it, before, after} from "mocha"; -import {newReviewToStorage, getReviewFromStorage, updateReviewToStorage, deleteReviewFromStorage, getAllReviewsFromStorage, getIDsByTag, getTopIDsFromStorage} from "./localStorage.js"; +import { strict as assert } from "node:assert"; +import { describe, it, before, after } from "mocha"; +import { + newReviewToStorage, + getReviewFromStorage, + updateReviewToStorage, + deleteReviewFromStorage, + getAllReviewsFromStorage, + getIDsByTag, + getTopIDsFromStorage, +} from "./localStorage.js"; describe("test CRUD localStorage interaction", () => { - before(() => { localStorage.clear(); }); @@ -16,11 +23,11 @@ describe("test CRUD localStorage interaction", () => { it("test localStorage state after adding one review", () => { let review = { - "imgSrc": "sample src", - "mealName": "sample name", - "restaurant": "sample restaurant", - "rating": 5, - "tags": ["tag 1", "tag 2", "tag 3"] + imgSrc: "sample src", + mealName: "sample name", + restaurant: "sample restaurant", + rating: 5, + tags: ["tag 1", "tag 2", "tag 3"], }; newReviewToStorage(review); @@ -37,38 +44,38 @@ describe("test CRUD localStorage interaction", () => { let reviews = getAllReviewsFromStorage(); let ids = [0]; - for(let i = 1; i < 1000; i++){ + for (let i = 1; i < 1000; i++) { ids.push(i); let new_review = { - "imgSrc": `sample src ${i}`, - "mealName": `sample name ${i}`, - "restaurant": `sample restaurant ${i}`, - "rating": i, - "tags": [`tag ${3*i}`, `tag ${3*i + 1}`, `tag ${3*i + 2}`] + imgSrc: `sample src ${i}`, + mealName: `sample name ${i}`, + restaurant: `sample restaurant ${i}`, + rating: i, + tags: [`tag ${3 * i}`, `tag ${3 * i + 1}`, `tag ${3 * i + 2}`], }; - new_review.reviewID = newReviewToStorage(new_review); + new_review.reviewID = newReviewToStorage(new_review); reviews.push(new_review); assert.deepEqual(getAllReviewsFromStorage(), reviews); assert.deepEqual(getReviewFromStorage(i), new_review); assert.deepEqual(JSON.parse(localStorage.getItem("activeIDS")), ids); - assert.strictEqual(JSON.parse(localStorage.getItem("nextID")), (i+1)); + assert.strictEqual(JSON.parse(localStorage.getItem("nextID")), i + 1); } }).timeout(5000); it("test localStorage state during updating 1000 reviews", () => { - for(let i = 0; i < 1000; i++){ + for (let i = 0; i < 1000; i++) { let old_review = getReviewFromStorage(i); let id = old_review.reviewID; let new_review = { - "imgSrc": `updated sample src ${id}`, - "mealName": `updated sample name ${id}`, - "restaurant": `updated sample restaurant ${id}`, - "reviewID": id, - "rating": (id % 5) + 1, - "tags": [`tag ${3*id}`, `tag ${3*id + 1}`, `tag ${3*id + 2}`] + imgSrc: `updated sample src ${id}`, + mealName: `updated sample name ${id}`, + restaurant: `updated sample restaurant ${id}`, + reviewID: id, + rating: (id % 5) + 1, + tags: [`tag ${3 * id}`, `tag ${3 * id + 1}`, `tag ${3 * id + 2}`], }; updateReviewToStorage(id, new_review); @@ -87,7 +94,7 @@ describe("test CRUD localStorage interaction", () => { let reviews = getAllReviewsFromStorage(); let ids = JSON.parse(localStorage.getItem("activeIDS")); - for(let i = 999; i >= 0; i--){ + for (let i = 999; i >= 0; i--) { deleteReviewFromStorage(i); ids.pop(); reviews.pop(); @@ -106,30 +113,29 @@ describe("test CRUD localStorage interaction", () => { }); describe("test sort/filter localStorage interaction", () => { - before(() => { localStorage.clear(); getAllReviewsFromStorage(); }); it("add sample data for sort and filter", () => { - for(let i = 0; i < 100; i++){ + for (let i = 0; i < 100; i++) { let review = { - "imgSrc": `sample src ${i}`, - "mealName": `sample name ${i}`, - "restaurant": `sample restaurant ${i}`, - "rating": (i % 5) + 1, - "tags": [`tag ${i%3}`, `tag ${i < 50}`, "tag x"] + imgSrc: `sample src ${i}`, + mealName: `sample name ${i}`, + restaurant: `sample restaurant ${i}`, + rating: (i % 5) + 1, + tags: [`tag ${i % 3}`, `tag ${i < 50}`, "tag x"], }; newReviewToStorage(review); } }); - it("test getTopIDsFromStorage end behavior after create", () =>{ + it("test getTopIDsFromStorage end behavior after create", () => { let top_reviews = getTopIDsFromStorage(); let prev = Infinity; - for(let i = 0; i < top_reviews.length; i++){ + for (let i = 0; i < top_reviews.length; i++) { let review = getReviewFromStorage(top_reviews[i]); assert.strictEqual(review.rating <= prev, true); } @@ -140,7 +146,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 0"); assert.strictEqual(specific_tagged_reviews.length, 34); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 0"), true); assert.strictEqual(review.reviewID % 3, 0); @@ -148,63 +154,63 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 1"); assert.strictEqual(specific_tagged_reviews.length, 33); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 1"), true); assert.strictEqual(review.reviewID % 3, 1); } - specific_tagged_reviews = getIDsByTag("tag 2"); + specific_tagged_reviews = getIDsByTag("tag 2"); assert.strictEqual(specific_tagged_reviews.length, 33); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 2"), true); assert.strictEqual(review.reviewID % 3, 2); } - specific_tagged_reviews = getIDsByTag("tag true"); + specific_tagged_reviews = getIDsByTag("tag true"); assert.strictEqual(specific_tagged_reviews.length, 50); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag true"), true); assert.strictEqual(review.reviewID < 50, true); } - specific_tagged_reviews = getIDsByTag("tag false"); + specific_tagged_reviews = getIDsByTag("tag false"); assert.strictEqual(specific_tagged_reviews.length, 50); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag false"), true); assert.strictEqual(review.reviewID >= 50, true); } - specific_tagged_reviews = getIDsByTag("tag x"); + specific_tagged_reviews = getIDsByTag("tag x"); assert.strictEqual(specific_tagged_reviews.length, 100); - specific_tagged_reviews = getIDsByTag("tag y"); + specific_tagged_reviews = getIDsByTag("tag y"); assert.deepEqual(specific_tagged_reviews, []); }); it("update sample data for sort and filter", () => { - for(let i = 0; i < 100; i++){ + for (let i = 0; i < 100; i++) { let old_review = getReviewFromStorage(i); let new_review = { - "imgSrc": `sample src ${i}`, - "mealName": `sample name ${i}`, - "restaurant": `sample restaurant ${i}`, - "reviewID": old_review.reviewID, - "rating": (i % 5) + 1, - "tags": [`tag ${i % 4}`, `tag ${i < 37}`, "tag y"] + imgSrc: `sample src ${i}`, + mealName: `sample name ${i}`, + restaurant: `sample restaurant ${i}`, + reviewID: old_review.reviewID, + rating: (i % 5) + 1, + tags: [`tag ${i % 4}`, `tag ${i < 37}`, "tag y"], }; updateReviewToStorage(old_review.reviewID, new_review); } }); - it("test getTopIDsFromStorage end behavior after create", () =>{ + it("test getTopIDsFromStorage end behavior after create", () => { let top_reviews = getTopIDsFromStorage(); let prev = Infinity; - for(let i = 0; i < top_reviews.length; i++){ + for (let i = 0; i < top_reviews.length; i++) { let review = getReviewFromStorage(top_reviews[i]); assert.strictEqual(review.rating <= prev, true); } @@ -215,7 +221,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 0"); assert.strictEqual(specific_tagged_reviews.length, 25); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 0"), true); assert.strictEqual(review.reviewID % 4, 0); @@ -223,7 +229,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 1"); assert.strictEqual(specific_tagged_reviews.length, 25); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 1"), true); assert.strictEqual(review.reviewID % 4, 1); @@ -231,7 +237,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 2"); assert.strictEqual(specific_tagged_reviews.length, 25); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 2"), true); assert.strictEqual(review.reviewID % 4, 2); @@ -239,7 +245,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag 3"); assert.strictEqual(specific_tagged_reviews.length, 25); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag 3"), true); assert.strictEqual(review.reviewID % 4, 3); @@ -247,7 +253,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag true"); assert.strictEqual(specific_tagged_reviews.length, 37); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag true"), true); assert.strictEqual(review.reviewID < 37, true); @@ -255,7 +261,7 @@ describe("test sort/filter localStorage interaction", () => { specific_tagged_reviews = getIDsByTag("tag false"); assert.strictEqual(specific_tagged_reviews.length, 63); - for(let i = 0; i < specific_tagged_reviews.length; i++){ + for (let i = 0; i < specific_tagged_reviews.length; i++) { let review = getReviewFromStorage(specific_tagged_reviews[i]); assert.strictEqual(review.tags.includes("tag false"), true); assert.strictEqual(review.reviewID >= 37, true); @@ -269,13 +275,13 @@ describe("test sort/filter localStorage interaction", () => { }); it("delete all sample data for sort and filter", () => { - for(let i = 0; i < 100; i++){ + for (let i = 0; i < 100; i++) { deleteReviewFromStorage(i); } }); - it("test getTopIDsFromStorage end behavior after delete", () =>{ - for(let i = 0; i <= 100; i++){ + it("test getTopIDsFromStorage end behavior after delete", () => { + for (let i = 0; i <= 100; i++) { let top_reviews = getTopIDsFromStorage(i); assert.deepEqual(top_reviews, []); } @@ -310,4 +316,4 @@ describe("test sort/filter localStorage interaction", () => { }); after(() => {}); -}); \ No newline at end of file +}); diff --git a/source/assets/scripts/main.e2e.test.js b/source/assets/scripts/main.e2e.test.js index 240e309..9123651 100644 --- a/source/assets/scripts/main.e2e.test.js +++ b/source/assets/scripts/main.e2e.test.js @@ -1,30 +1,27 @@ -import {strict as assert} from "node:assert"; -import {describe, it, before, after} from "mocha"; +import { strict as assert } from "node:assert"; +import { describe, it, before, after } from "mocha"; import puppeteer from "puppeteer-core"; -import {setReviewForm, checkCorrectness} from "./appTestHelpers.js"; +import { setReviewForm, checkCorrectness } from "./appTestHelpers.js"; describe("test App end to end", async () => { - let browser; let page; before(async () => { let root; try { - root = process.getuid() == 0; - } - catch (error) { + root = process.getuid() == 0; + } catch (error) { root = false; } //browser = await puppeteer.launch({headless: false, slowMo: 250, args: root ? ['--no-sandbox'] : undefined}); - browser = await puppeteer.launch({args: root ? ["--no-sandbox"] : undefined}); + browser = await puppeteer.launch({ args: root ? ["--no-sandbox"] : undefined }); page = await browser.newPage(); - try{ - await page.goto("http://localhost:8080", {timeout: 2000}); + try { + await page.goto("http://localhost:8080", { timeout: 2000 }); await console.log(`✔ connected to localhost webserver as ${root ? "root" : "user"}`); - } - catch (error) { + } catch (error) { await console.log("❌ failed to connect to localhost webserver on port 8080"); } }); @@ -36,7 +33,6 @@ describe("test App end to end", async () => { }); describe("test CRUD on simple inputs and default image", () => { - describe("test create 1 new review", async () => { it("create 1 new review", async () => { // Click the button to create a new review @@ -50,7 +46,7 @@ describe("test App end to end", async () => { comments: "sample comment", restaurant: "sample restaurant", tags: ["tag 0", "tag 1", "tag 2", "tag 3", "tag 4"], - rating: 1 + rating: 1, }; await setReviewForm(page, review); @@ -68,11 +64,11 @@ describe("test App end to end", async () => { comments: "sample comment", restaurant: "sample restaurant", tags: ["tag 0", "tag 1", "tag 2", "tag 3", "tag 4"], - rating: "http://localhost:8080/assets/images/1-star.svg" + rating: "http://localhost:8080/assets/images/1-star.svg", }; await checkCorrectness(page, "d", expected); }); - + it("check home page", async () => { // Click the button to return to the home page let home_btn = await page.$("#home-btn"); @@ -89,7 +85,7 @@ describe("test App end to end", async () => { comments: "sample comment", restaurant: "sample restaurant", tags: ["tag 0", "tag 1", "tag 2", "tag 3", "tag 4"], - rating: "http://localhost:8080/assets/images/1-star.svg" + rating: "http://localhost:8080/assets/images/1-star.svg", }; await checkCorrectness(shadowRoot, "a", expected); }); @@ -114,7 +110,7 @@ describe("test App end to end", async () => { comments: "sample comment", restaurant: "sample restaurant", tags: ["tag 0", "tag 1", "tag 2", "tag 3", "tag 4"], - rating: "http://localhost:8080/assets/images/1-star.svg" + rating: "http://localhost:8080/assets/images/1-star.svg", }; await checkCorrectness(page, "d", expected); }); @@ -136,16 +132,14 @@ describe("test App end to end", async () => { comments: "sample comment", restaurant: "sample restaurant", tags: ["tag 0", "tag 1", "tag 2", "tag 3", "tag 4"], - rating: "http://localhost:8080/assets/images/1-star.svg" + rating: "http://localhost:8080/assets/images/1-star.svg", }; await checkCorrectness(shadowRoot, "a", expected); }); }); describe("test update 1 review", async () => { - it("update 1 review", async () => { - // Get the only review card and click it let review_card = await page.$("review-card"); await review_card.click(); @@ -161,7 +155,7 @@ describe("test App end to end", async () => { comments: "updated comment", restaurant: "updated restaurant", tags: ["tag -0", "tag -1", "tag -2", "tag -3", "tag -4", "tag -5"], - rating: 5 + rating: 5, }; await setReviewForm(page, review); @@ -179,7 +173,7 @@ describe("test App end to end", async () => { comments: "updated comment", restaurant: "updated restaurant", tags: ["tag -0", "tag -1", "tag -2", "tag -3", "tag -4", "tag -5"], - rating: "http://localhost:8080/assets/images/5-star.svg" + rating: "http://localhost:8080/assets/images/5-star.svg", }; await checkCorrectness(page, "d", expected); }); @@ -201,11 +195,10 @@ describe("test App end to end", async () => { comments: "updated comment", restaurant: "updated restaurant", tags: ["tag -0", "tag -1", "tag -2", "tag -3", "tag -4", "tag -5"], - rating: "http://localhost:8080/assets/images/5-star.svg" + rating: "http://localhost:8080/assets/images/5-star.svg", }; await checkCorrectness(shadowRoot, "a", expected); }); - }); describe("test delete 1 review", async () => { @@ -215,7 +208,7 @@ describe("test App end to end", async () => { await review_card.click(); await page.waitForNavigation(); - page.on("dialog", async dialog => { + page.on("dialog", async (dialog) => { console.log(dialog.message()); await dialog.accept(); }); @@ -227,4 +220,4 @@ describe("test App end to end", async () => { await page.close(); await browser.close(); }); -}); \ No newline at end of file +}); diff --git a/source/assets/scripts/main.js b/source/assets/scripts/main.js index 7f57f1b..cd98eb7 100644 --- a/source/assets/scripts/main.js +++ b/source/assets/scripts/main.js @@ -1,5 +1,5 @@ // main.js -import {getIDsByTag, getIDsFromStorage, getReviewFromStorage, getTopIDsFromStorage} from "./localStorage.js"; +import { getIDsByTag, getIDsFromStorage, getReviewFromStorage, getTopIDsFromStorage } from "./localStorage.js"; // Run the init() function when the page has loaded window.addEventListener("DOMContentLoaded", init); @@ -11,25 +11,22 @@ function init() { initFormHandler(); } - /** * @param {Array} reviews An array of reviews */ function addReviewsToDocument(reviews) { let reviewBox = document.getElementById("review-container"); - reviews.forEach(review => { + reviews.forEach((review) => { let newReview = document.createElement("review-card"); newReview.data = review; reviewBox.append(newReview); }); - } /** * Adds the necessary event handlers to search-btn and sort */ function initFormHandler() { - //grabbing search field let searchField = document.getElementById("search-bar"); let searchBtn = document.getElementById("search-btn"); @@ -37,14 +34,14 @@ function initFormHandler() { //adding search functionality //TODO: Add ability to enter without refresh of search bar //filter by selected tag when button clicked - searchBtn.addEventListener("click", function(){ + searchBtn.addEventListener("click", function () { searchTag = searchField.value; sortAndFilter(searchTag); }); //for clearing tag filter let clearSearchBtn = document.getElementById("clear-search"); - clearSearchBtn.addEventListener("click", function(){ + clearSearchBtn.addEventListener("click", function () { searchTag = null; searchField.value = ""; sortAndFilter(searchTag); @@ -52,45 +49,43 @@ function initFormHandler() { //sort by selected method let sortMethod = document.getElementById("sort"); - sortMethod.addEventListener("input", function(){ + sortMethod.addEventListener("input", function () { sortAndFilter(searchTag); }); - - } /** * Deciphers sort and filter to populate the review-container * @param {string} searchTag tag name to filter by */ -function sortAndFilter(searchTag){ +function sortAndFilter(searchTag) { let reviewBox = document.getElementById("review-container"); let sortMethod = document.getElementById("sort"); //clear review container - while(reviewBox.firstChild){ + while (reviewBox.firstChild) { reviewBox.removeChild(reviewBox.firstChild); } let reviewIDs = []; //sort method: most recent - if(sortMethod.value == "recent"){ + if (sortMethod.value == "recent") { //tag filtered most recent - if(searchTag){ + if (searchTag) { reviewIDs = getIDsByTag(searchTag); - } + } //most recent else { reviewIDs = getIDsFromStorage(); } //reversed for recency loadReviews(0, reviewIDs); - } + } //sort method: top rated - else if (sortMethod.value == "top"){ + else if (sortMethod.value == "top") { //tag filtered top rated - if(searchTag){ + if (searchTag) { //intersection of top ids list and ids by tag in top ids order - reviewIDs = getTopIDsFromStorage().filter(x => getIDsByTag(searchTag).includes(x)); - } + reviewIDs = getTopIDsFromStorage().filter((x) => getIDsByTag(searchTag).includes(x)); + } //top rated else { reviewIDs = getTopIDsFromStorage(); @@ -104,36 +99,36 @@ function sortAndFilter(searchTag){ * @param {number} index review index to begin with * @param {number[]} reviewIDs ordered array of reviews */ -function loadReviews(index, reviewIDs){ +function loadReviews(index, reviewIDs) { let reviewBox = document.getElementById("review-container"); // label if there are no reviews to display - if(reviewIDs.length == 0){ + if (reviewIDs.length == 0) { let emptyLabel = document.createElement("label"); emptyLabel.setAttribute("id", "empty"); emptyLabel.innerText = "No Reviews To Display"; reviewBox.append(emptyLabel); } else { let emptyLabel = document.getElementById("empty"); - if(emptyLabel){ + if (emptyLabel) { reviewBox.removeChild(emptyLabel); } } let moreBtn = document.getElementById("more-btn"); //delete load more button if exists - if(moreBtn){ + if (moreBtn) { reviewBox.removeChild(moreBtn); } let reviewArr = []; //check if there are more than 9 reviews left - if(index + 9 > reviewIDs.length - 1){ + if (index + 9 > reviewIDs.length - 1) { //add remaining reviews to review container - for(let i = index; i < reviewIDs.length; i++){ + for (let i = index; i < reviewIDs.length; i++) { reviewArr.push(getReviewFromStorage(reviewIDs[i])); } addReviewsToDocument(reviewArr); } else { //add 9 more reviews to container - for(let i = index; i < index + 9; i++){ + for (let i = index; i < index + 9; i++) { reviewArr.push(getReviewFromStorage(reviewIDs[i])); } addReviewsToDocument(reviewArr); @@ -142,19 +137,20 @@ function loadReviews(index, reviewIDs){ moreBtn.setAttribute("id", "more-btn"); moreBtn.innerText = "Load More"; //if load more clicked, load 9 more - moreBtn.addEventListener("click", function(){loadReviews(index + 9, reviewIDs);}); + moreBtn.addEventListener("click", function () { + loadReviews(index + 9, reviewIDs); + }); reviewBox.append(moreBtn); } - } const registerServiceWorker = async () => { if ("serviceWorker" in navigator) { try { - await navigator.serviceWorker.register("./sw.js", {scope: "./"}); + await navigator.serviceWorker.register("./sw.js", { scope: "./" }); } catch (error) { console.error(`Registration failed with ${error}`); } } }; -registerServiceWorker(); \ No newline at end of file +registerServiceWorker(); diff --git a/source/index.html b/source/index.html index 64ab502..4324847 100644 --- a/source/index.html +++ b/source/index.html @@ -1,64 +1,65 @@ - - - - - Food Journal + + + + + Food Journal - - + + - - + + - - - - - - + + + + + + - -
-
- logo -

Food Journal

- logo -
-
-
-
-
-
- - - -
- CREATE -

Recent Reviews

- -
- -
+ +
+
+ logo +

Food Journal

+ logo
-
-
-
-
- + +
+
+
+
+ - \ No newline at end of file +
+ CREATE +

Recent Reviews

+ +
+ +
+
+
+
+
+ + diff --git a/source/static/Form.css b/source/static/Form.css index 283cc0d..076711d 100644 --- a/source/static/Form.css +++ b/source/static/Form.css @@ -48,7 +48,8 @@ input[type="text"]:focus { } .hidden, -.rating:not(:checked) > input { /* Hide radio circles while star rating */ +.rating:not(:checked) > input { + /* Hide radio circles while star rating */ display: none; } diff --git a/source/sw.js b/source/sw.js index a082357..42e3c39 100644 --- a/source/sw.js +++ b/source/sw.js @@ -26,7 +26,7 @@ const ASSETS = [ "assets/scripts/localStorage.js", "assets/scripts/main.js", "assets/scripts/ReviewCard.js", - "assets/scripts/ReviewDetails.js" + "assets/scripts/ReviewDetails.js", ]; /** @@ -46,18 +46,22 @@ self.addEventListener("install", async () => { */ self.addEventListener("fetch", (event) => { // add a response to the fetch event - event.respondWith(caches.open(CACHE_NAME).then((cache) => { - // try to return a network fetch response - return fetch(event.request).then((fetchedResponse) => { - // if there is a response, add it to the cache - cache.put(event.request, fetchedResponse.clone()); - // return the network response - return fetchedResponse; - }).catch(() => { - // If there is not a network response, return the cached response - // The ignoreVary option is used here to fix an issue where the service worker - // would not serve certain requests unless the page was refreshed at least once - return cache.match(event.request, {ignoreVary: true, ignoreSearch: true}); - }); - })); + event.respondWith( + caches.open(CACHE_NAME).then((cache) => { + // try to return a network fetch response + return fetch(event.request) + .then((fetchedResponse) => { + // if there is a response, add it to the cache + cache.put(event.request, fetchedResponse.clone()); + // return the network response + return fetchedResponse; + }) + .catch(() => { + // If there is not a network response, return the cached response + // The ignoreVary option is used here to fix an issue where the service worker + // would not serve certain requests unless the page was refreshed at least once + return cache.match(event.request, { ignoreVary: true, ignoreSearch: true }); + }); + }) + ); }); diff --git a/specs/adrs/102722-final-project-decision.md b/specs/adrs/102722-final-project-decision.md index 6626ebc..a85b3de 100644 --- a/specs/adrs/102722-final-project-decision.md +++ b/specs/adrs/102722-final-project-decision.md @@ -1,16 +1,20 @@ # Final Project Topic Decision -- Status: accept -- Deciders: team members and TA -- Date: 10 / 27 / 22 + +- Status: accept +- Deciders: team members and TA +- Date: 10 / 27 / 22 ## Decision Drivers -- Needed to develop a local-first, CRUD application that would be simple enough to implement in the next few weeks + +- Needed to develop a local-first, CRUD application that would be simple enough to implement in the next few weeks ## Considered Options: -- Social Media Archive -- Resume Builder -- Copy/Paste -- Food Journal + +- Social Media Archive +- Resume Builder +- Copy/Paste +- Food Journal ## Decision Outcome + Chosen Option: Food Journal, which allows users to hold their thoughts and ratings on meals and restaurants that they have been to. It is local-first, CRUD app, and fun. Therefore, we decided to choose this. diff --git a/specs/adrs/110822-finalized-design.md b/specs/adrs/110822-finalized-design.md index ce01d3b..5feb2d1 100644 --- a/specs/adrs/110822-finalized-design.md +++ b/specs/adrs/110822-finalized-design.md @@ -1,15 +1,19 @@ # Finalized App Design on Figma -- Status: accept -- Deciders: Isaac Otero -- Date: 11 / 08 / 22 + +- Status: accept +- Deciders: Isaac Otero +- Date: 11 / 08 / 22 ## Decision Drivers: -- Needed to figure out the wireframe and flow of our app -- Needed to visualize the different features + +- Needed to figure out the wireframe and flow of our app +- Needed to visualize the different features ## Considered Option: -- Different feature option -- Color Scheme, font, spacing, and other design options were discussed + +- Different feature option +- Color Scheme, font, spacing, and other design options were discussed ## Decision Outcome: -- Chosen Option: Design can be found at this link: https://www.figma.com/file/Qhugp1Dd0gPnJTbmmUIvsa/Wireframe?node-id=36%3A2 + +- Chosen Option: Design can be found at this link: https://www.figma.com/file/Qhugp1Dd0gPnJTbmmUIvsa/Wireframe?node-id=36%3A2 diff --git a/specs/adrs/111222-cicd-multiple-pipelines.md b/specs/adrs/111222-cicd-multiple-pipelines.md index 62495a2..f2ef41b 100644 --- a/specs/adrs/111222-cicd-multiple-pipelines.md +++ b/specs/adrs/111222-cicd-multiple-pipelines.md @@ -1,19 +1,19 @@ # Use multiple CI/CD pipelines in parallel -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 12 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 12 / 22 ## Decision Drivers -- Need to perform many different CI/CD tasks -- Need pipeline to be durable against any single failure +- Need to perform many different CI/CD tasks +- Need pipeline to be durable against any single failure ## Considered Options -- Single deep pipeline -- Multiple short pipelines in parallel +- Single deep pipeline +- Multiple short pipelines in parallel ## Decision Outcone -Chosen Option: Multiple short pipelines in parallel as any one failure will not prevent code from being developed and deployed. \ No newline at end of file +Chosen Option: Multiple short pipelines in parallel as any one failure will not prevent code from being developed and deployed. diff --git a/specs/adrs/111222-jslinting-eslint.md b/specs/adrs/111222-jslinting-eslint.md index 1b3b972..5786944 100644 --- a/specs/adrs/111222-jslinting-eslint.md +++ b/specs/adrs/111222-jslinting-eslint.md @@ -1,19 +1,19 @@ # Use eslint for JS linting framework -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 12 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 12 / 22 ## Decision Drivers -- Need linting to work with multiple style standards -- Need linting to be fast and informative +- Need linting to work with multiple style standards +- Need linting to be fast and informative ## Considered Options -- JSLint -- eslint +- JSLint +- eslint ## Decision Outcome -Chosen Option: eslint for its low configuration complexity. \ No newline at end of file +Chosen Option: eslint for its low configuration complexity. diff --git a/specs/adrs/111222-jsunittest-mocha.md b/specs/adrs/111222-jsunittest-mocha.md index f128c0e..3b9d68e 100644 --- a/specs/adrs/111222-jsunittest-mocha.md +++ b/specs/adrs/111222-jsunittest-mocha.md @@ -1,19 +1,20 @@ # Use mocha for JS unit testing framework -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 12 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 12 / 22 ## Decision Drivers -- Need specification on how to write unit testing assertion statements -- Need framework to perform unit testing quickly for immediate code feedback +- Need specification on how to write unit testing assertion statements +- Need framework to perform unit testing quickly for immediate code feedback ## Considered Options -- JUnit5 -- Jest -- Mocha + +- JUnit5 +- Jest +- Mocha ## Decision Outcome -Chosen Option: Mocha because it was significantly faster to run than Jest (1s vs 30s), and can use a variety of assertion styles unlike JUnit5. \ No newline at end of file +Chosen Option: Mocha because it was significantly faster to run than Jest (1s vs 30s), and can use a variety of assertion styles unlike JUnit5. diff --git a/specs/adrs/111422-csslinting-stylelint.md b/specs/adrs/111422-csslinting-stylelint.md index d35b025..667fbb9 100644 --- a/specs/adrs/111422-csslinting-stylelint.md +++ b/specs/adrs/111422-csslinting-stylelint.md @@ -1,19 +1,19 @@ # Use Stylelint for CSS linting framework -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 14 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 14 / 22 ## Decision Drivers -- Need linting to work with multiple style standards -- Need linting to be fast and informative +- Need linting to work with multiple style standards +- Need linting to be fast and informative ## Considered Options -- Stylelint -- Prettier +- Stylelint +- Prettier ## Decision Outcome -Chosen Option: Stylelint for its easy installation and unopinionated. +Chosen Option: Stylelint for its easy installation and unopinionated. diff --git a/specs/adrs/111422-htmllinting-htmlhint.md b/specs/adrs/111422-htmllinting-htmlhint.md index 0bd3471..492167f 100644 --- a/specs/adrs/111422-htmllinting-htmlhint.md +++ b/specs/adrs/111422-htmllinting-htmlhint.md @@ -1,19 +1,19 @@ # Use HTMLhint for HTML linting framework -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 14 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 14 / 22 ## Decision Drivers -- Need linting to work with multiple style standards -- Need linting to be fast and informative +- Need linting to work with multiple style standards +- Need linting to be fast and informative ## Considered Options -- HTMLhint -- HTML-validate +- HTMLhint +- HTML-validate ## Decision Outcome -Chosen Option: HTMLhint for its low configuration complexity. +Chosen Option: HTMLhint for its low configuration complexity. diff --git a/specs/adrs/111622-e2etesting-puppeteer.md b/specs/adrs/111622-e2etesting-puppeteer.md index 4a1d3ce..4b7ca33 100644 --- a/specs/adrs/111622-e2etesting-puppeteer.md +++ b/specs/adrs/111622-e2etesting-puppeteer.md @@ -1,19 +1,20 @@ -# Use puppeteer for JS unit testing framework - -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 16 / 22 - -## Decision Drivers - -- Need end to end testing framework which runs headlessly and quickly -- Framework should integrate well with Mocha, the existing unit testing framework -- Framework should be easy to implement end to end tests with - -## Considered Options -- puppeteer -- selenium-webdriver - -## Decision Outcome - -Chosen Option: Puppeteer for its ease of use with mocha. \ No newline at end of file +# Use puppeteer for JS unit testing framework + +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 16 / 22 + +## Decision Drivers + +- Need end to end testing framework which runs headlessly and quickly +- Framework should integrate well with Mocha, the existing unit testing framework +- Framework should be easy to implement end to end tests with + +## Considered Options + +- puppeteer +- selenium-webdriver + +## Decision Outcome + +Chosen Option: Puppeteer for its ease of use with mocha. diff --git a/specs/adrs/112922-documentation-jsdoc.md b/specs/adrs/112922-documentation-jsdoc.md index 395c44b..e9274c1 100644 --- a/specs/adrs/112922-documentation-jsdoc.md +++ b/specs/adrs/112922-documentation-jsdoc.md @@ -1,17 +1,18 @@ -# Use JSDoc for JS documentation - -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 29 / 22 - -## Decision Drivers - -- Need simple way to publish documentation for code -- Already documentating infile using JSDoc style - -## Considered Options -- JSDoc - -## Decision Outcome - -Chosen Option: JSDoc. Will run by generating docs in /source/docs/ before publishing /source/ so users can enter the URI /docs/ to see documentation. +# Use JSDoc for JS documentation + +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 29 / 22 + +## Decision Drivers + +- Need simple way to publish documentation for code +- Already documentating infile using JSDoc style + +## Considered Options + +- JSDoc + +## Decision Outcome + +Chosen Option: JSDoc. Will run by generating docs in /source/docs/ before publishing /source/ so users can enter the URI /docs/ to see documentation. diff --git a/specs/adrs/112922-prettier.md b/specs/adrs/112922-prettier.md index d50440d..851a9c8 100644 --- a/specs/adrs/112922-prettier.md +++ b/specs/adrs/112922-prettier.md @@ -1,17 +1,18 @@ # Use Prettier for generic style enforcement -- Status: accept -- Deciders: Arthur Lu, Marc Reta -- Date: 11 / 29 / 22 +- Status: accept +- Deciders: Arthur Lu, Marc Reta +- Date: 11 / 29 / 22 ## Decision Drivers -- Other linters (HTML, CSS, JS) are sometimes too permissive -- Need to enforce style on other files like markdown, json +- Other linters (HTML, CSS, JS) are sometimes too permissive +- Need to enforce style on other files like markdown, json ## Considered Options -- Prettier + +- Prettier ## Decision Outcome -Chosen Option: Prettier \ No newline at end of file +Chosen Option: Prettier diff --git a/specs/adrs/112922-review-storage.md b/specs/adrs/112922-review-storage.md index 9965b60..05afef3 100644 --- a/specs/adrs/112922-review-storage.md +++ b/specs/adrs/112922-review-storage.md @@ -1,16 +1,20 @@ # Backend Storage Structure -- Status: Accept -- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng -- Date: 11/29/2022 + +- Status: Accept +- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng +- Date: 11/29/2022 ## Decision Drivers -- Needed more efficient way of storing reviews that are created, for more efficient testing, updating, accessing, and deleting. + +- Needed more efficient way of storing reviews that are created, for more efficient testing, updating, accessing, and deleting. ## Considered Options -- localStorage + +- localStorage ## Decision Outcome + Using local storage to maintain the "local first" requirement. -Moved away from array of objects for storing reviews, reviews are stored individually as keys in localStorage, under the "review{id}" format. Each key +Moved away from array of objects for storing reviews, reviews are stored individually as keys in localStorage, under the "review{id}" format. Each key corresponds to object containing review data. We also have an array stored in local storage, named "activeIDs" which keeps track of id numbers that are attached to created reviews. diff --git a/specs/adrs/112922-reviewpage-session.md b/specs/adrs/112922-reviewpage-session.md index 98ab568..5ce717c 100644 --- a/specs/adrs/112922-reviewpage-session.md +++ b/specs/adrs/112922-reviewpage-session.md @@ -1,15 +1,18 @@ # Opening Specific Reviews -- Status: Accept -- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng -- Date: 11/29/2022 + +- Status: Accept +- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng +- Date: 11/29/2022 ## Decision Drivers -- When opening up a review, browser needs to know what review ID to use for loading the review page data + +- When opening up a review, browser needs to know what review ID to use for loading the review page data ## Considered Options -- sessionStorage + +- sessionStorage ## Decision Outcome + Review cards have event listeners that will add their associated review ID number to session storage so when the review loads, the browser will use the id stored to pull exact data corresponding to the review. - diff --git a/specs/adrs/112922-tag-review-collision-fix.md b/specs/adrs/112922-tag-review-collision-fix.md index 8841ed8..5578f33 100644 --- a/specs/adrs/112922-tag-review-collision-fix.md +++ b/specs/adrs/112922-tag-review-collision-fix.md @@ -1,13 +1,17 @@ # Organizing Review Under Tags -- Status: Accept -- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng -- Date: 11/29/2022 + +- Status: Accept +- Deciders: Rhea Bhutada, Kara Hoagland, Gavyn Ezell, George Dubinin, Henry Feng +- Date: 11/29/2022 ## Decision Drivers -- Needed to keep track of reviews under certain given tags for filtering feature. + +- Needed to keep track of reviews under certain given tags for filtering feature. ## Considered Options -- localStorage + +- localStorage ## Decision Outcome -For every tag create a key under that tag name in localStorage. They will store an array of IDs that correspond to reviews that contain that tag. + +For every tag create a key under that tag name in localStorage. They will store an array of IDs that correspond to reviews that contain that tag. diff --git a/specs/adrs/120122-serviceworker-netfirst.md b/specs/adrs/120122-serviceworker-netfirst.md index d60844f..79c1633 100644 --- a/specs/adrs/120122-serviceworker-netfirst.md +++ b/specs/adrs/120122-serviceworker-netfirst.md @@ -1,19 +1,20 @@ -# Use a network first cache second for service worker architecture +# Use a network first cache second for service worker architecture -- Status: in consideration -- Deciders: Arthur Lu, Kara Hoagland, Rhea Bhutada, George Dubinin -- Date: 12 / 01 / 22 +- Status: in consideration +- Deciders: Arthur Lu, Kara Hoagland, Rhea Bhutada, George Dubinin +- Date: 12 / 01 / 22 ## Decision Drivers -- Need to balance the need for user ease of use and local first priority -- Users should expect to update their app easily when they have network, but may not be expected to know how to perform a hard refresh -- Local first priority means we should avoid unnecessary network activity when possible +- Need to balance the need for user ease of use and local first priority +- Users should expect to update their app easily when they have network, but may not be expected to know how to perform a hard refresh +- Local first priority means we should avoid unnecessary network activity when possible ## Considered Options -- Network first cache second -- Cache first network second + +- Network first cache second +- Cache first network second ## Decision Outcome -Chosen Option: Network first for automatic app updating. \ No newline at end of file +Chosen Option: Network first for automatic app updating. diff --git a/specs/adrs/README.md b/specs/adrs/README.md index acddca4..2f6fce0 100644 --- a/specs/adrs/README.md +++ b/specs/adrs/README.md @@ -1,2 +1,3 @@ -# Overarching Decisions -_We will eventually capture these as an ADR in markdown Links to an external site.(/specs/adrs will contain an individual document per major decision. There will be some initial ones that have to do with general project plan and approach, but more may be added as the project goes on. The main point of this capture is to explain why choices are made. As brainstorming may have your team settle on choices quickly capturing them in a document may be better than just mental consensus)_ +# Overarching Decisions + +_We will eventually capture these as an ADR in markdown Links to an external site.(/specs/adrs will contain an individual document per major decision. There will be some initial ones that have to do with general project plan and approach, but more may be added as the project goes on. The main point of this capture is to explain why choices are made. As brainstorming may have your team settle on choices quickly capturing them in a document may be better than just mental consensus)_ diff --git a/specs/pitch/pitch.md b/specs/pitch/pitch.md index 01dd392..23fec27 100644 --- a/specs/pitch/pitch.md +++ b/specs/pitch/pitch.md @@ -1,64 +1,75 @@ -# App Pitch - Food Journal - -## Summary -

- Our pitch is an app that allows users to store information about their recent restaurant experiences, including the restaurant name, location, date, dish, picture of the food, price, comments, ratings, etc. This app will allow individuals to document their food habits and track past meals. The app will then provide suggestions based on the users preferences and habits. -

- -## Narrowing Down the Problem -

- People don’t have a place to reflect on their food adventures. Whether it’s trying a new cuisine or looking into new restaurants, it is useful for people to have a place to record their restaurant experiences. In our research, we found that there is no app designed for people to journal their food related experiences and we feel that this app will offer a new and exciting avenue for people to enjoy and reflect on their meals. -

- -## How is it CRUD? -* Create: Users create reviews of specific foods at any restaurant -* Read: Users read reviews that they’ve created -* Update: Users update their reviews when their ideas change about the food -* Delete: Users may delete their reviews - -## Visual Representation -- User Flow Diagram: - - - -- Home Page: Users sees all their reviews and can perform CRUD actions - - - -- Review Page: User can see an induvidual review that they created previously - - - -- Create New Entry Page: new page with a form is opened up - - - -## User Personas -### Persona 1: Tom -Tom would often face the issue of not knowing where he should go for his next meal. As someone who is new to the town, Tom does not know the restaurants around his place by heart, let alone the details on each restaurant like the price range, cuisine, and specific dishes likes and dislikes.
Tom’s problem is one that can be solved by our app. Whenever he visits a restaurant, he can use our app to note down any relevant information from that visit. And when Tom would need help on deciding where to eat, he can refer to the notes on his food journal to help him make that decision. - -### Persona 2: Ben -Ben is trying to make sure that he watches what he eats. He doesn’t mind eating somewhere unhealthy once in a while, but he wants to make sure the majority of his purchasing decisions are healthy.
If Ben uses our app, he can place tags on the meals he eats depending on whether they’re healthy or unhealthy. Then, he can look back over the past weeks and months and make sure he hasn’t been eating at too many unhealthy places. If he’s ever looking for something to eat, he can filter by tags on the app to find only healthy places that he’s given high ratings to in the past. This way, he can stay consistent with his dieting goals. - -### Persona 3: Claire -Claire noticed that she’s spending more than she would like to on eating out and made a resolution to try to budget how much she’s spending on restaurants. Claire has a general idea of the restaurants in her area, but it’s difficult to keep track of the details of each location.
If Claire uses this app, she can note down the price of each food she tries when eating out and how she thought that the quality compared to the price with her budget in mind. She can narrow down foods that she finds worth the price. When craving a certain type of food, Claire can also look for cheaper options in the same category of cuisine based on her previous entries. - -# Similar Apps and Competition -* Social media allows users to technically post their own food reviews (food accounts, food review posts), but sites are not specialized for food reviews -* Yelp known for specifically food, but still branches -* Our app differs in scope (focus on food exclusively) -* Our app offers food review-specific features like specialized templates and formats - -# Statement of Purpose -Ultimately, the purpose of this app is to allow users to keep a food diary. Having a place that allows individuals to journal their favorite meals, restaurants, cuisines, pictures, and more can be beneficial for people who are looking to know more about their eating habits and tendencies as well as try out new foods. - -# Risks and Rabbit Holes -* Technical Unkowns - * How to implement CRUD related features? - * Is there a limit to storage? How to store large amounts of data locally? -* Unsolved Design Problems: - * What features we want to prioritize? - * How much data will be collecting? - * How many fields should we have for each meal? -* Misunderstood Interdependencies: - * N/A +# App Pitch - Food Journal + +## Summary + +

+ Our pitch is an app that allows users to store information about their recent restaurant experiences, including the restaurant name, location, date, dish, picture of the food, price, comments, ratings, etc. This app will allow individuals to document their food habits and track past meals. The app will then provide suggestions based on the users preferences and habits. +

+ +## Narrowing Down the Problem + +

+ People don’t have a place to reflect on their food adventures. Whether it’s trying a new cuisine or looking into new restaurants, it is useful for people to have a place to record their restaurant experiences. In our research, we found that there is no app designed for people to journal their food related experiences and we feel that this app will offer a new and exciting avenue for people to enjoy and reflect on their meals. +

+ +## How is it CRUD? + +- Create: Users create reviews of specific foods at any restaurant +- Read: Users read reviews that they’ve created +- Update: Users update their reviews when their ideas change about the food +- Delete: Users may delete their reviews + +## Visual Representation + +- User Flow Diagram: + + + +- Home Page: Users sees all their reviews and can perform CRUD actions + + + +- Review Page: User can see an induvidual review that they created previously + + + +- Create New Entry Page: new page with a form is opened up + + + +## User Personas + +### Persona 1: Tom + +Tom would often face the issue of not knowing where he should go for his next meal. As someone who is new to the town, Tom does not know the restaurants around his place by heart, let alone the details on each restaurant like the price range, cuisine, and specific dishes likes and dislikes.
Tom’s problem is one that can be solved by our app. Whenever he visits a restaurant, he can use our app to note down any relevant information from that visit. And when Tom would need help on deciding where to eat, he can refer to the notes on his food journal to help him make that decision. + +### Persona 2: Ben + +Ben is trying to make sure that he watches what he eats. He doesn’t mind eating somewhere unhealthy once in a while, but he wants to make sure the majority of his purchasing decisions are healthy.
If Ben uses our app, he can place tags on the meals he eats depending on whether they’re healthy or unhealthy. Then, he can look back over the past weeks and months and make sure he hasn’t been eating at too many unhealthy places. If he’s ever looking for something to eat, he can filter by tags on the app to find only healthy places that he’s given high ratings to in the past. This way, he can stay consistent with his dieting goals. + +### Persona 3: Claire + +Claire noticed that she’s spending more than she would like to on eating out and made a resolution to try to budget how much she’s spending on restaurants. Claire has a general idea of the restaurants in her area, but it’s difficult to keep track of the details of each location.
If Claire uses this app, she can note down the price of each food she tries when eating out and how she thought that the quality compared to the price with her budget in mind. She can narrow down foods that she finds worth the price. When craving a certain type of food, Claire can also look for cheaper options in the same category of cuisine based on her previous entries. + +# Similar Apps and Competition + +- Social media allows users to technically post their own food reviews (food accounts, food review posts), but sites are not specialized for food reviews +- Yelp known for specifically food, but still branches +- Our app differs in scope (focus on food exclusively) +- Our app offers food review-specific features like specialized templates and formats + +# Statement of Purpose + +Ultimately, the purpose of this app is to allow users to keep a food diary. Having a place that allows individuals to journal their favorite meals, restaurants, cuisines, pictures, and more can be beneficial for people who are looking to know more about their eating habits and tendencies as well as try out new foods. + +# Risks and Rabbit Holes + +- Technical Unkowns + - How to implement CRUD related features? + - Is there a limit to storage? How to store large amounts of data locally? +- Unsolved Design Problems: + - What features we want to prioritize? + - How much data will be collecting? + - How many fields should we have for each meal? +- Misunderstood Interdependencies: + - N/A