From 52cc8027ab90497e5cadbd0b6d1a0f0c00691c7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 11:44:07 +0000 Subject: [PATCH 001/157] build(deps): bump semver from 5.7.1 to 5.7.2 in /client Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- client/yarn.lock | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/client/yarn.lock b/client/yarn.lock index a862e5300..09c53ef00 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -11259,19 +11259,24 @@ selfsigned@^1.10.7: node-forge "^0.10.0" "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.3.2: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" From 9fc88a9f4ab51587d003098e15a14c9335d4e585 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 11:49:23 +0000 Subject: [PATCH 002/157] build(deps): bump semver from 5.7.1 to 5.7.2 in /backend Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/yarn.lock b/backend/yarn.lock index 30806eb13..2a1c3c069 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -5851,19 +5851,19 @@ semver-diff@^3.1.1: semver "^6.3.0" "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" From ef0a8a74227323135a5f54e79bb322174addb096 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 07:52:21 +0000 Subject: [PATCH 003/157] build(deps): bump semver from 5.7.1 to 5.7.2 Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index cc7e88753..986c56461 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2339,9 +2339,9 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== "semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== set-blocking@^2.0.0: version "2.0.0" From b35474be36fb5ee222734107e275a015677726bf Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 12 Jul 2023 15:59:28 -0700 Subject: [PATCH 004/157] fix: Update Kanban board project name in GH Action --- .github/workflows/New-issue-create-card.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/New-issue-create-card.yml b/.github/workflows/New-issue-create-card.yml index 2c406221b..d64361822 100644 --- a/.github/workflows/New-issue-create-card.yml +++ b/.github/workflows/New-issue-create-card.yml @@ -9,5 +9,5 @@ jobs: - name: Create or Update Project Card uses: peter-evans/create-or-update-project-card@v2 with: - project-name: VRMS v0.4 + project-name: VRMS - Active Project Board column-name: New Issue Approval From b40855bf5998386f6f25ff25a44731fb7873b044 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Sat, 15 Jul 2023 15:58:56 -0700 Subject: [PATCH 005/157] add validation to editableField --- .../manageProjects/editableField.js | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/client/src/components/manageProjects/editableField.js b/client/src/components/manageProjects/editableField.js index bcf1066e0..f9c9d9d88 100644 --- a/client/src/components/manageProjects/editableField.js +++ b/client/src/components/manageProjects/editableField.js @@ -27,6 +27,11 @@ const EditableField = ({ className: 'editable-field', onBlur: () => { setEditable(false); + if (!validateEditableField(fieldName, fieldValue)) { + alert(`Invalid field value for ${fieldName}`); + console.log(fieldValue); + return; + } updateProject(fieldName, fieldValue); }, onChange: ({ target }) => { @@ -47,7 +52,7 @@ const EditableField = ({
{fieldTitle} - {notRestricted && + {notRestricted && ( - } + )}
{editable ? ( @@ -77,4 +82,26 @@ const EditableField = ({ ); }; +const validateEditableField = (fieldName, fieldValue) => { + switch (fieldName) { + case 'hflaWebsiteUrl': + return doesLinkContainFlex(fieldValue, 'hackforla.org'); + case 'slackUrl': + return doesLinkContainFlex(fieldValue, 'slack.com'); + case 'googleDriveUrl': + return doesLinkContainFlex(fieldValue, 'drive.google.com'); + case 'githubUrl': + return doesLinkContainFlex(fieldValue, 'github.com'); + default: + break; + } +}; + +const doesLinkContainFlex = (link, key) => { + if (link.startsWith(`https://${key}`)) return true; + if (link.startsWith(`https://www.${key}`)) return true; + if (link.startsWith(key)) return true; + return false; +} + export default EditableField; From 63bbff42ee68120c2769ee044114dbc93e79b877 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Tue, 18 Jul 2023 10:13:32 -0700 Subject: [PATCH 006/157] validation for description --- .../manageProjects/editableField.js | 30 +++------------ .../utilities/validateEditableField.js | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 client/src/components/manageProjects/utilities/validateEditableField.js diff --git a/client/src/components/manageProjects/editableField.js b/client/src/components/manageProjects/editableField.js index f9c9d9d88..732cc15df 100644 --- a/client/src/components/manageProjects/editableField.js +++ b/client/src/components/manageProjects/editableField.js @@ -1,4 +1,8 @@ import React, { useState, useRef, useEffect } from 'react'; +import { + validateEditableField, + generateErrorEditableField, +} from './utilities/validateEditableField'; import '../../sass/ManageProjects.scss'; const EditableField = ({ @@ -28,8 +32,7 @@ const EditableField = ({ onBlur: () => { setEditable(false); if (!validateEditableField(fieldName, fieldValue)) { - alert(`Invalid field value for ${fieldName}`); - console.log(fieldValue); + alert(generateErrorEditableField(fieldName)); return; } updateProject(fieldName, fieldValue); @@ -64,7 +67,6 @@ const EditableField = ({ )}
- {editable ? ( <> {fieldType === 'textarea' ? ( @@ -82,26 +84,4 @@ const EditableField = ({ ); }; -const validateEditableField = (fieldName, fieldValue) => { - switch (fieldName) { - case 'hflaWebsiteUrl': - return doesLinkContainFlex(fieldValue, 'hackforla.org'); - case 'slackUrl': - return doesLinkContainFlex(fieldValue, 'slack.com'); - case 'googleDriveUrl': - return doesLinkContainFlex(fieldValue, 'drive.google.com'); - case 'githubUrl': - return doesLinkContainFlex(fieldValue, 'github.com'); - default: - break; - } -}; - -const doesLinkContainFlex = (link, key) => { - if (link.startsWith(`https://${key}`)) return true; - if (link.startsWith(`https://www.${key}`)) return true; - if (link.startsWith(key)) return true; - return false; -} - export default EditableField; diff --git a/client/src/components/manageProjects/utilities/validateEditableField.js b/client/src/components/manageProjects/utilities/validateEditableField.js new file mode 100644 index 000000000..cbd463fe7 --- /dev/null +++ b/client/src/components/manageProjects/utilities/validateEditableField.js @@ -0,0 +1,37 @@ +export const validateEditableField = (fieldName, fieldValue) => { + switch (fieldName) { + case 'hflaWebsiteUrl': + return doesLinkContainFlex(fieldValue, 'hackforla.org'); + case 'slackUrl': + return doesLinkContainFlex(fieldValue, 'slack.com'); + case 'googleDriveUrl': + return doesLinkContainFlex(fieldValue, 'drive.google.com'); + case 'githubUrl': + return doesLinkContainFlex(fieldValue, 'github.com'); + case 'description': + return typeof fieldValue === 'string' && fieldValue.length <= 250; + default: + break; + } +}; + +export const generateErrorEditableField = (fieldName) => { + switch (fieldName) { + case 'hflaWebsiteUrl': + case 'slackUrl': + case 'googleDriveUrl': + case 'githubUrl': + return `Invalid field value for ${fieldName}`; + case 'description': + return 'Description is too long, max 250 characters allowed'; + default: + break; + } +}; + +const doesLinkContainFlex = (link, key) => { + if (link.startsWith(`https://${key}`)) return true; + if (link.startsWith(`https://www.${key}`)) return true; + if (link.startsWith(key)) return true; + return false; +}; From 8c7e76077efb2b59b135c22aff7c7fb3bc684441 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Sat, 22 Jul 2023 08:55:49 -0700 Subject: [PATCH 007/157] trim whitespace for editable field + fix bug with switch statement --- client/src/components/manageProjects/editableField.js | 2 ++ .../manageProjects/utilities/validateEditableField.js | 1 + 2 files changed, 3 insertions(+) diff --git a/client/src/components/manageProjects/editableField.js b/client/src/components/manageProjects/editableField.js index 732cc15df..6901f5cf2 100644 --- a/client/src/components/manageProjects/editableField.js +++ b/client/src/components/manageProjects/editableField.js @@ -35,6 +35,8 @@ const EditableField = ({ alert(generateErrorEditableField(fieldName)); return; } + let trimmedFieldValue = fieldValue.trim(); + setFieldValue(trimmedFieldValue); updateProject(fieldName, fieldValue); }, onChange: ({ target }) => { diff --git a/client/src/components/manageProjects/utilities/validateEditableField.js b/client/src/components/manageProjects/utilities/validateEditableField.js index cbd463fe7..b4a68a4dd 100644 --- a/client/src/components/manageProjects/utilities/validateEditableField.js +++ b/client/src/components/manageProjects/utilities/validateEditableField.js @@ -13,6 +13,7 @@ export const validateEditableField = (fieldName, fieldValue) => { default: break; } + return true; }; export const generateErrorEditableField = (fieldName) => { From f7582e6dacac37383321807ca2a4d6db3d4e8b58 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 23 Jul 2023 14:51:29 -0700 Subject: [PATCH 008/157] feat: Create EventApiService, mimics current code style --- client/src/api/EventsApiService.js | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 client/src/api/EventsApiService.js diff --git a/client/src/api/EventsApiService.js b/client/src/api/EventsApiService.js new file mode 100644 index 000000000..2a00bc7d0 --- /dev/null +++ b/client/src/api/EventsApiService.js @@ -0,0 +1,72 @@ +import { REACT_APP_CUSTOM_REQUEST_HEADER } from '../utils/globalSettings'; + +class EventsApiService { + constructor() { + this.headers = { + 'Content-Type': 'application/json', + 'x-customrequired-header': REACT_APP_CUSTOM_REQUEST_HEADER, + }; + this.baseUrl = '/api/events/'; + } + + async fetchEvents() { + try { + const res = await fetch(this.baseUrl, { + headers: this.headers, + }); + return await res.json(); + } catch (error) { + console.log(`fetchEvents error: ${error}`); + alert('Server not responding. Please refresh the page.'); + return []; + } + } + + async createNewEvent(eventToCreate) { + const requestOptions = { + method: 'POST', + headers: this.headers, + body: JSON.stringify(eventToCreate), + }; + + try { + return await fetch(this.baseUrl, requestOptions); + } catch (error) { + console.error(`Add event error: `, error); + alert('Server not responding. Please try again.'); + return undefined; + } + } + + async deleteEvent(recurringEventID) { + const requestOptions = { + method: 'DELETE', + headers: this.headers, + }; + + try { + return await fetch(`${this.baseUrl}/${recurringEventID}`, requestOptions); + } catch (error) { + console.error(`Delete event error: `, error); + alert('Server not responding. Please try again.'); + return undefined; + } + } + + async updateEvent(eventToUpdate, eventID) { + const requestOptions = { + method: 'PATCH', + headers: this.headers, + body: JSON.stringify(eventToUpdate), + }; + try { + return await fetch(`${this.baseUrl}${eventID}`, requestOptions); + } catch (error) { + console.error(`Update event error: `, error); + alert('Server not responding. Please try again.'); + return undefined; + } + } +} + +export default EventsApiService; From ab50a6ef2e6aa286b493b2ebe55c6debeeed660c Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 23 Jul 2023 14:52:21 -0700 Subject: [PATCH 009/157] feat: Add ability to toggle checkInReady for Admin --- .../components/manageProjects/editProject.js | 55 ++++++++++++++++--- client/src/pages/ManageProjects.js | 28 +++++++++- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 21d7f5798..f64cb3931 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -17,12 +17,15 @@ const EditProject = ({ createNewRecurringEvent, deleteRecurringEvent, updateRecurringEvent, + regularEvents, + updateRegularEvent }) => { // Add commas to arrays for display const partnerDataFormatted = projectToEdit.partners.join(', '); // eslint-disable-next-line no-unused-vars const recrutingDataFormatted = projectToEdit.recruitingCategories.join(', '); - const [rEvents, setREvents] = useState([]); + const [recurringEventsState, setRecurringEventsState] = useState([]); + const [regularEventsState, setRegularEventsState] = useState([]); const [selectedEvent, setSelectedEvent] = useState(); const [isCreateNew, setIsCreateNew] = useState(); @@ -30,17 +33,29 @@ const EditProject = ({ const [eventAlert, setEventAlert] = useState(null); // Get project recurring events when component loads + useEffect(() => { + if (regularEvents) { + setRegularEventsState( + regularEvents + // eslint-disable-next-line no-underscore-dangle + .filter((e) => e?.project?._id === projectToEdit._id) + .map((item) => ({...item, ...readableEvent(item), raw: item})) + .reverse() // sorts most recent events first + ); + } + }, [projectToEdit, regularEvents, setRegularEventsState]); + useEffect(() => { if (recurringEvents) { - setREvents( + setRecurringEventsState( recurringEvents // eslint-disable-next-line no-underscore-dangle .filter((e) => e?.project?._id === projectToEdit._id) - .map((item) => readableEvent(item)) + .map((item) => ({...item, ...readableEvent(item)})) .sort((a, b) => a.dayOfTheWeekNumber - b.dayOfTheWeekNumber) - ); - } - }, [projectToEdit, recurringEvents, setREvents]); + ); + } + }, [projectToEdit, recurringEvents, setRecurringEventsState]); return (
@@ -179,7 +194,7 @@ const EditProject = ({

Recurring Events

{eventAlert}

    - {rEvents.map((event) => ( + {recurringEventsState.map((event) => ( // eslint-disable-next-line no-underscore-dangle
+ +
+

Manually Edit Events Checkin

+

{eventAlert}

+
    + {regularEventsState.map((event, index) => ( + + // eslint-disable-next-line no-underscore-dangle + + ))} +
+
); }; +function RegularEvent({event, updateRegularEvent}) { + return ( +
  • + +
  • + ) +} + export default EditProject; diff --git a/client/src/pages/ManageProjects.js b/client/src/pages/ManageProjects.js index 577a7a495..add89f591 100644 --- a/client/src/pages/ManageProjects.js +++ b/client/src/pages/ManageProjects.js @@ -7,6 +7,7 @@ import ProjectApiService from '../api/ProjectApiService'; import RecurringEventsApiService from '../api/RecurringEventsApiService'; import Loading from '../svg/22.gif'; import '../sass/ManageProjects.scss'; +import EventsApiService_ from '../api/EventsApiService'; const PAGES = Object.freeze({ selectProject: 'selectProject', @@ -20,21 +21,30 @@ const ManageProjects = () => { const [projects, setProjects] = useState(); const [projectToEdit, setProjectToEdit] = useState(); const [recurringEvents, setRecurringEvents] = useState(); + const [regularEvents, setRegularEvents] = useState([]); const [componentToDisplay, setComponentToDisplay] = useState(''); const [projectApiService] = useState(new ProjectApiService()); const [recurringEventsApiService] = useState(new RecurringEventsApiService()); + const [EventsApiService] = useState(new EventsApiService_()); const [projectsLoading, setProjectsLoading] = useState(false); const [eventsLoading, setEventsLoading] = useState(false); const user = auth?.user; - const fetchProjects = useCallback(async () => { + const fetchProjects = useCallback(async () => { setProjectsLoading(true); const projectRes = await projectApiService.fetchProjects(); setProjects(projectRes); setProjectsLoading(false); }, [projectApiService]); + const fetchRegularEvents = useCallback(async () => { + setEventsLoading(true); + const eventsRes = await EventsApiService.fetchEvents(); + setRegularEvents(eventsRes); + setEventsLoading(false); + }, [recurringEventsApiService]); + const fetchRecurringEvents = useCallback(async () => { setEventsLoading(true); const eventsRes = await recurringEventsApiService.fetchRecurringEvents(); @@ -82,6 +92,17 @@ const ManageProjects = () => { [recurringEventsApiService, fetchRecurringEvents] ); + const updateRegularEvent = useCallback( + async (eventToUpdate, eventId) => { + await EventsApiService.updateEvent( + eventToUpdate, + eventId + ); + fetchRegularEvents(); + }, + [recurringEventsApiService, fetchRegularEvents] + ); + useEffect(() => { // Refresh project to edit, if projects have been refreshed if (projectId && projects) { @@ -98,7 +119,8 @@ const ManageProjects = () => { useEffect(() => { fetchProjects(); fetchRecurringEvents(); - }, [fetchProjects, fetchRecurringEvents]); + fetchRegularEvents(); + }, [fetchProjects, fetchRecurringEvents, fetchRegularEvents]); // If not logged in, redirect to login page if (!auth && !auth?.user) { @@ -118,6 +140,8 @@ const ManageProjects = () => { createNewRecurringEvent={createNewRecurringEvent} deleteRecurringEvent={deleteRecurringEvent} updateRecurringEvent={updateRecurringEvent} + regularEvents={regularEvents} + updateRegularEvent={updateRegularEvent} /> ); break; From 9e33307be611f2eabc0cd34a263c52faf2c6a6a1 Mon Sep 17 00:00:00 2001 From: Brad Date: Wed, 26 Jul 2023 15:50:45 -0700 Subject: [PATCH 010/157] edit User model and handlers for isActive status --- backend/models/user.model.js | 6 ++++-- client/src/api/UserApiService.js | 16 ++++++++++++++++ client/src/components/user-admin/EditUsers.js | 18 +++++++++++++++++- client/src/pages/UserAdmin.js | 8 ++++++++ client/src/sass/UserAdmin.scss | 16 ++++++++++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) diff --git a/backend/models/user.model.js b/backend/models/user.model.js index 0534d6107..1424a3753 100644 --- a/backend/models/user.model.js +++ b/backend/models/user.model.js @@ -33,9 +33,10 @@ const userSchema = mongoose.Schema({ isHflaGithubMember: { type: Boolean }, // pull from API once github handle in place? githubPublic2FA: { type: Boolean }, // does the user have 2FA enabled on their github and membership set to public? availability: { type: String }, // availability to meet outside of hacknight times; string for now, more structured in future - managedProjects: [{ type: String}] // Which projects managed by user. + managedProjects: [{ type: String}], // Which projects managed by user. //currentProject: { type: String } // no longer need this as we can get it from Project Team Member table // password: { type: String, required: true } + isActive: { type: Boolean, default: true } }); userSchema.methods.serialize = function () { @@ -65,7 +66,8 @@ userSchema.methods.serialize = function () { isHflaGithubMember: this.isHflaGithubMember, githubPublic2FA: this.githubPublic2FA, availability: this.availability, - managedProjects: this.managedProjects + managedProjects: this.managedProjects, + isActive: this.isActive }; }; diff --git a/client/src/api/UserApiService.js b/client/src/api/UserApiService.js index 0e7173edd..99d171741 100644 --- a/client/src/api/UserApiService.js +++ b/client/src/api/UserApiService.js @@ -40,6 +40,22 @@ class UserApiService { } return undefined; } + + async updateUserDbIsActive(userToEdit, isActive) { + const url = `${this.baseUserUrl}${userToEdit._id}`; + const requestOptions = { + method: 'PATCH', + headers: this.headers, + body: JSON.stringify({ isActive }) + } + + try { + return await fetch(url, requestOptions); + } catch (err) { + console.error('update is-active error', err) + alert('server not responding. Please try again.'); + } + } } export default UserApiService; diff --git a/client/src/components/user-admin/EditUsers.js b/client/src/components/user-admin/EditUsers.js index 1c4fc3b29..1e5f72e93 100644 --- a/client/src/components/user-admin/EditUsers.js +++ b/client/src/components/user-admin/EditUsers.js @@ -1,10 +1,12 @@ import React, { useEffect, useState } from 'react'; import '../../sass/UserAdmin.scss'; +import { FormGroup, FormControlLabel, Switch } from '@mui/material' // child of UserAdmin. Displays form to update users. -const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects }) => { +const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUserActiveStatus }) => { const [userManagedProjects, setUserManagedProjects] = useState([]); // The projects that the selected user is assigned const [projectValue, setProjectValue] = useState(''); // State and handler for form in EditUsers + const [isActive, setIsActive] = useState(userToEdit.isActive); // Prepare data for display const userName = `${userToEdit.name?.firstName} ${userToEdit.name?.lastName}`; @@ -57,6 +59,11 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects }) => { } }; + const handleSetIsActive = () => { + setIsActive(!isActive) + updateUserActiveStatus(userToEdit, !isActive) + } + return (
    @@ -67,6 +74,15 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects }) => {
    Email:
    {userEmail}
    +
    +
    Is Active:
    +
    + {isActive.toString()} + + } onClick={() => handleSetIsActive()} /> + +
    +
    Projects:
    diff --git a/client/src/pages/UserAdmin.js b/client/src/pages/UserAdmin.js index 0edb2241a..c540082ff 100644 --- a/client/src/pages/UserAdmin.js +++ b/client/src/pages/UserAdmin.js @@ -30,6 +30,13 @@ const UserAdmin = () => { [userApiService, fetchUsers] ); + const updateUserActiveStatus = useCallback( + async (user, isActive) => { + await userApiService.updateUserDbIsActive(user, isActive); + fetchUsers() + }, [userApiService, fetchUsers] + ) + const fetchProjects = useCallback(async () => { const projectRes = await projectApiService.fetchProjects(); setProjects(projectRes); @@ -57,6 +64,7 @@ const UserAdmin = () => { projects={projects} updateUserDb={updateUserDb} backToSearch={backToSearch} + updateUserActiveStatus={updateUserActiveStatus} /> ); } diff --git a/client/src/sass/UserAdmin.scss b/client/src/sass/UserAdmin.scss index 67422f86d..373cf7d34 100644 --- a/client/src/sass/UserAdmin.scss +++ b/client/src/sass/UserAdmin.scss @@ -64,6 +64,22 @@ margin-bottom: 8px; } +.user-is-active-column-left { + display: flex; + flex-direction: column; + flex-basis: 15%; +} + +.active-status { + margin-right: 15px; + width: 25px; +} + +.is-active-flex { + display: flex; + align-items: center; +} + .button-remove { width: 25%; color: #fa114f; From b788bf4478312aba80e6c77d5fe9a67b96b6c481 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 26 Jul 2023 11:09:46 -0700 Subject: [PATCH 011/157] fix: Add query to return events within 3 weeks --- client/src/api/EventsApiService.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/src/api/EventsApiService.js b/client/src/api/EventsApiService.js index 2a00bc7d0..41302b591 100644 --- a/client/src/api/EventsApiService.js +++ b/client/src/api/EventsApiService.js @@ -11,7 +11,13 @@ class EventsApiService { async fetchEvents() { try { - const res = await fetch(this.baseUrl, { + const threeWeeksInMilliseconds = 3 * 7 * 24 * 60 * 60 * 1000; // 3 weeks in milliseconds + const threeWeeksAgo = new Date() + threeWeeksAgo.setTime(threeWeeksAgo.getTime() - threeWeeksInMilliseconds) + + const dateQuery = `?date[$gt]=${threeWeeksAgo.toISOString().split('.')[0]+"Z"}`; + + const res = await fetch(this.baseUrl + dateQuery, { headers: this.headers, }); return await res.json(); From 377c3b4e0341ef9ed65851b570b44e2d3953601f Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 30 Jul 2023 15:49:01 -0700 Subject: [PATCH 012/157] Implement React Hook Form attrs --- client/src/api/ProjectApiService.js | 16 ++--- client/src/components/ProjectForm.js | 89 ++++++++-------------------- 2 files changed, 31 insertions(+), 74 deletions(-) diff --git a/client/src/api/ProjectApiService.js b/client/src/api/ProjectApiService.js index b97e88cf2..12f4e0763 100644 --- a/client/src/api/ProjectApiService.js +++ b/client/src/api/ProjectApiService.js @@ -27,24 +27,20 @@ class ProjectApiService { name, description, location, - githubIdentifier, githubUrl, slackUrl, googleDriveUrl, - hflaWebsiteUrl, } = projectData; const requestOptions = { method: 'POST', headers: this.headers, body: JSON.stringify({ - name: name, - description: description, - location: location, - githubIdentifier: githubIdentifier, - githubUrl: githubUrl, - slackUrl: slackUrl, - googleDriveUrl: googleDriveUrl, - hflaWebsiteUrl: hflaWebsiteUrl, + name, + description, + location, + githubUrl, + slackUrl, + googleDriveUrl, projectStatus: 'Active', }), }; diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index e9cd58532..b16513ff6 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; import { Link, useHistory } from 'react-router-dom'; +import { useForm, Controller } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; @@ -42,6 +43,8 @@ const simpleInputs = [ name: 'location', type: 'text', placeholder: 'Enter project location', + value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, + errorMessage: 'Please enter a valid Zoom URL' }, // Leaving incase we want to add this back in for updating projects // { @@ -104,17 +107,6 @@ const StyledRadio = styled(Radio)(({ theme }) => ({ */ export default function ProjectForm() { - const [formData, setFormData] = useState({ - name: '', - description: '', - location: '', - // githubIdentifier: '', - githubUrl: '', - slackUrl: '', - googleDriveUrl: '', - // hflaWebsiteUrl: '', - }); - //seperate state for the location radio buttons const [locationType, setLocationType] = React.useState('remote'); @@ -122,6 +114,17 @@ export default function ProjectForm() { const [newlyCreatedID, setNewlyCreatedID] = useState(null); const history = useHistory(); + const { register, handleSubmit, formState } = useForm({ + defaultValues: { + name: '', + description: '', + location: '', + githubUrl: '', + slackUrl: '', + googleDriveUrl: '' + } + }); + const {errors} = formState; const routeToNewProjectPage = () => { if(newlyCreatedID !== null) { @@ -129,35 +132,19 @@ export default function ProjectForm() { } } - useEffect(() => { routeToNewProjectPage() },[newlyCreatedID]) - - // only handles radio button change const handleRadioChange = (event) => { setLocationType(event.target.value); }; - //updates state of formData onChange of any form input - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((fData) => ({ - ...fData, - [name]: value, - })); - }; - - const handleSubmit = async (e) => { - e.preventDefault(); + const submitForm = async (data) => { const projectApi = new ProjectApiService(); try { - // fires POST request to create a new project, - // but the server response does not include the newly created project id that we need - const id = await projectApi.create(formData); + const id = await projectApi.create(data); setNewlyCreatedID(id); } catch (errors) { console.error(errors); @@ -166,15 +153,6 @@ export default function ProjectForm() { setActiveButton('close'); }; - // Basic validation : if all inputs have values, enable the submit button - useEffect(() => { - if (Object.values(formData).every((val) => val !== '')) { - setActiveButton('save'); - } else { - setActiveButton('close'); - } - }, [formData]); - const locationRadios = ( @@ -223,7 +201,10 @@ export default function ProjectForm() { -
    + { + submitForm(data) + + })}> {simpleInputs.map((input) => ( @@ -240,31 +221,11 @@ export default function ProjectForm() { +

    {errors[input.name]?.message}

    ))}
    @@ -277,7 +238,7 @@ export default function ProjectForm() { type="submit" form="project-form" variant={activeButton === 'save' ? 'contained' : 'secondary'} - disabled={activeButton !== 'save'} + > Save From 0c2debaef6b91f770c66fe3ab0f5ebd7bae96697 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 30 Jul 2023 16:02:29 -0700 Subject: [PATCH 013/157] remove unused import --- client/src/components/ProjectForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index b16513ff6..39090d908 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; import { Link, useHistory } from 'react-router-dom'; -import { useForm, Controller } from 'react-hook-form'; +import { useForm } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; From 7585d708a72316715e1c66aad433797c80d481f6 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 30 Jul 2023 16:18:27 -0700 Subject: [PATCH 014/157] destructure errors from formstate, clean line spaces --- client/src/components/ProjectForm.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 39090d908..74796f640 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -3,7 +3,6 @@ import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; - import { Typography, Box, @@ -17,7 +16,6 @@ import { FormControlLabel, RadioGroup, } from '@mui/material'; - import { styled } from '@mui/material/styles'; /** Project Form Component @@ -109,12 +107,10 @@ const StyledRadio = styled(Radio)(({ theme }) => ({ export default function ProjectForm() { //seperate state for the location radio buttons const [locationType, setLocationType] = React.useState('remote'); - const [activeButton, setActiveButton] = React.useState('close'); - const [newlyCreatedID, setNewlyCreatedID] = useState(null); const history = useHistory(); - const { register, handleSubmit, formState } = useForm({ + const { register, handleSubmit, formState: { errors } } = useForm({ defaultValues: { name: '', description: '', @@ -124,7 +120,6 @@ export default function ProjectForm() { googleDriveUrl: '' } }); - const {errors} = formState; const routeToNewProjectPage = () => { if(newlyCreatedID !== null) { @@ -203,7 +198,6 @@ export default function ProjectForm() {
    { submitForm(data) - })}> {simpleInputs.map((input) => ( @@ -216,13 +210,11 @@ export default function ProjectForm() { {input.label} - {input.name === 'location' && locationRadios} -

    {errors[input.name]?.message}

    @@ -238,7 +230,6 @@ export default function ProjectForm() { type="submit" form="project-form" variant={activeButton === 'save' ? 'contained' : 'secondary'} - > Save From 699a043fc4860b8b53871d60cd3a98cb6918331e Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 30 Jul 2023 21:17:12 -0700 Subject: [PATCH 015/157] fix: Add two semi colons --- client/src/api/EventsApiService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/api/EventsApiService.js b/client/src/api/EventsApiService.js index 41302b591..d858f2876 100644 --- a/client/src/api/EventsApiService.js +++ b/client/src/api/EventsApiService.js @@ -12,8 +12,8 @@ class EventsApiService { async fetchEvents() { try { const threeWeeksInMilliseconds = 3 * 7 * 24 * 60 * 60 * 1000; // 3 weeks in milliseconds - const threeWeeksAgo = new Date() - threeWeeksAgo.setTime(threeWeeksAgo.getTime() - threeWeeksInMilliseconds) + const threeWeeksAgo = new Date(); + threeWeeksAgo.setTime(threeWeeksAgo.getTime() - threeWeeksInMilliseconds); const dateQuery = `?date[$gt]=${threeWeeksAgo.toISOString().split('.')[0]+"Z"}`; From e60901390a1903a855e24fbc88c2a2bf94df1c24 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 31 Jul 2023 14:17:42 -0700 Subject: [PATCH 016/157] errors onBlur and onChange --- client/src/components/ProjectForm.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 74796f640..d28837bd4 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -110,7 +110,8 @@ export default function ProjectForm() { const [activeButton, setActiveButton] = React.useState('close'); const [newlyCreatedID, setNewlyCreatedID] = useState(null); const history = useHistory(); - const { register, handleSubmit, formState: { errors } } = useForm({ + const { register, handleSubmit, formState: { errors } } = useForm({ + mode: 'all', defaultValues: { name: '', description: '', @@ -118,7 +119,8 @@ export default function ProjectForm() { githubUrl: '', slackUrl: '', googleDriveUrl: '' - } + }, + }); const routeToNewProjectPage = () => { From 28fdb348852a42af8e493cd571924e48b6d1bd20 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Mon, 31 Jul 2023 16:13:35 -0700 Subject: [PATCH 017/157] feat: Create validation functionality, plus relevant utility functions --- .../manageProjects/createNewEvent.js | 4 ++-- .../manageProjects/editMeetingTimes.js | 3 ++- .../components/manageProjects/editProject.js | 3 ++- .../utilities/validateEventForm.js | 19 +++++++++++++++---- client/src/utils/stringUtils.js | 9 +++++++++ 5 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 client/src/utils/stringUtils.js diff --git a/client/src/components/manageProjects/createNewEvent.js b/client/src/components/manageProjects/createNewEvent.js index f29f250fc..04df044b3 100644 --- a/client/src/components/manageProjects/createNewEvent.js +++ b/client/src/components/manageProjects/createNewEvent.js @@ -7,7 +7,7 @@ import validateEventForm from './utilities/validateEventForm'; import EventForm from './eventForm'; const CreateNewEvent = ({ - projectName, + projectToEdit, projectID, createNewRecurringEvent, setEventAlert, @@ -72,7 +72,7 @@ const CreateNewEvent = ({ // Handle submission of new recurring event form const handleFormSubmit = async () => { - const errors = validateEventForm(formValues); + const errors = validateEventForm(formValues, projectToEdit); if (!errors) { handleEventCreate(); setFormValues(initialFormValues); diff --git a/client/src/components/manageProjects/editMeetingTimes.js b/client/src/components/manageProjects/editMeetingTimes.js index 7c27edbd9..67beceab0 100644 --- a/client/src/components/manageProjects/editMeetingTimes.js +++ b/client/src/components/manageProjects/editMeetingTimes.js @@ -8,6 +8,7 @@ import validateEventForm from './utilities/validateEventForm'; // This component displays current meeting times for selected project and offers the option to edit those times. const EditMeetingTimes = ({ + projectToEdit, selectedEvent, setEventAlert, setSelectedEvent, @@ -21,7 +22,7 @@ const EditMeetingTimes = ({ startTimeOriginal, durationOriginal ) => async () => { - const errors = validateEventForm(values); + const errors = validateEventForm(values, projectToEdit); if (!errors) { let theUpdatedEvent = {}; diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index f64cb3931..cd8197f89 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -61,6 +61,7 @@ const EditProject = ({
    { +const validateEventForm = (vals, projectToEdit) => { let newErrors = {}; Object.keys(vals).forEach((key) => { switch (key) { @@ -8,6 +9,16 @@ const validateEventForm = (vals) => { // Required if (!vals[key]) { newErrors = { ...newErrors, name: 'Event name is required' }; + } else if ( + isWordInArrayInString( + ['meeting', 'mtg', projectToEdit.name.toLowerCase()], + vals[key].toLowerCase() + ) + ) { + newErrors = { + ...newErrors, + name: "Event name cannot contain 'meeting' or 'mtg' or the project name", + }; } break; @@ -22,8 +33,8 @@ const validateEventForm = (vals) => { if (!validateLink(vals[key])) { newErrors = { ...newErrors, - videoConferenceLink: 'Invalid link' - } + videoConferenceLink: 'Invalid link', + }; } break; diff --git a/client/src/utils/stringUtils.js b/client/src/utils/stringUtils.js new file mode 100644 index 000000000..987e632ba --- /dev/null +++ b/client/src/utils/stringUtils.js @@ -0,0 +1,9 @@ +export const isWordInArrayInString = (arr, str) => { + const words = str.split(' '); + for (let word of words) { + if (arr.includes(word)) { + return true; + } + } + return false; +}; From 332922a9484f838354ca906be703277e475b56b0 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 31 Jul 2023 17:51:08 -0700 Subject: [PATCH 018/157] update error status and use helper text --- client/src/components/ProjectForm.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index d28837bd4..528e3e90c 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -119,8 +119,7 @@ export default function ProjectForm() { githubUrl: '', slackUrl: '', googleDriveUrl: '' - }, - + } }); const routeToNewProjectPage = () => { @@ -215,11 +214,12 @@ export default function ProjectForm() { {input.name === 'location' && locationRadios} -

    {errors[input.name]?.message}

    ))} From a35a1dd84c785f7b06095f8efa75e17dfff17860 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 31 Jul 2023 17:56:33 -0700 Subject: [PATCH 019/157] clean up --- client/src/components/ProjectForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 528e3e90c..e48e7c4c4 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -214,7 +214,7 @@ export default function ProjectForm() { {input.name === 'location' && locationRadios} Date: Mon, 31 Jul 2023 22:04:37 -0700 Subject: [PATCH 020/157] add conditions for location --- client/src/components/ProjectForm.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index e48e7c4c4..5e084e895 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -40,9 +40,13 @@ const simpleInputs = [ label: 'Location', name: 'location', type: 'text', - placeholder: 'Enter project location', + placeholder: 'Enter location for meeting', value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL' + errorMessage: 'Please enter a valid Zoom URL', + addressPlaceholder: "Enter a physical address.", + addressValue: '', + addressError: 'Please enter a proper address.', + }, // Leaving incase we want to add this back in for updating projects // { @@ -214,9 +218,9 @@ export default function ProjectForm() { {input.name === 'location' && locationRadios} From 4f5b974765de972208fe5e232e55fabdc79c26b1 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 31 Jul 2023 22:30:27 -0700 Subject: [PATCH 021/157] validate github profile to test location validation --- client/src/components/ProjectForm.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 5e084e895..3608c5601 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -60,6 +60,8 @@ const simpleInputs = [ name: 'githubUrl', type: 'text', placeholder: 'htttps://github.com/', + value: /^(https?:\/\/)?(www\.)?github\.com\/[a-zA-Z0-9_]{1,25}$/igm, + errorMessage: "Please enter a proper Github profile link." }, { label: 'Slack Channel Link', From e667943887667e9e49127730832a31989d54e820 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 31 Jul 2023 22:58:38 -0700 Subject: [PATCH 022/157] remove conditional attempt, replace double bang --- client/src/components/ProjectForm.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 3608c5601..a94a9c1e6 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -42,10 +42,7 @@ const simpleInputs = [ type: 'text', placeholder: 'Enter location for meeting', value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL', - addressPlaceholder: "Enter a physical address.", - addressValue: '', - addressError: 'Please enter a proper address.', + errorMessage: 'Please enter a valid Zoom URL' }, // Leaving incase we want to add this back in for updating projects @@ -222,7 +219,7 @@ export default function ProjectForm() { From e61369a440ab1bb664400a5f18582997ef97f531 Mon Sep 17 00:00:00 2001 From: Brad Date: Wed, 2 Aug 2023 22:27:43 -0700 Subject: [PATCH 023/157] confuse people with a nested ternerary --- client/src/components/ProjectForm.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index a94a9c1e6..103475949 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -42,7 +42,9 @@ const simpleInputs = [ type: 'text', placeholder: 'Enter location for meeting', value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL' + errorMessage: 'Please enter a valid Zoom URL', + addressValue: '', + addressError: 'Invalid address' }, // Leaving incase we want to add this back in for updating projects @@ -56,9 +58,7 @@ const simpleInputs = [ label: 'GitHub URL', name: 'githubUrl', type: 'text', - placeholder: 'htttps://github.com/', - value: /^(https?:\/\/)?(www\.)?github\.com\/[a-zA-Z0-9_]{1,25}$/igm, - errorMessage: "Please enter a proper Github profile link." + placeholder: 'htttps://github.com/' }, { label: 'Slack Channel Link', @@ -215,11 +215,16 @@ export default function ProjectForm() { {input.name === 'location' && locationRadios} - + From 4c5057bf4bb30fcbb6b473fd6e2345f5fd782f9f Mon Sep 17 00:00:00 2001 From: Trillium S Date: Mon, 7 Aug 2023 14:55:42 -0700 Subject: [PATCH 024/157] fix: Update ProjectForm.js Force helperText to have content to prevent layout shift on validation errors --- client/src/components/ProjectForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 103475949..47c70aa61 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -226,7 +226,7 @@ export default function ProjectForm() { {value: input.addressValue, message: input.addressError} : {value: input.value, message: input.errorMessage} } )} placeholder={input.placeholder} - helperText={`${errors[input.name]?.message || ''}`} + helperText={`${errors[input.name]?.message || ' '}`} /> ))} From cd385285bbb1ca81bc30fa581a9306f54330e076 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:49:06 +0000 Subject: [PATCH 025/157] build(deps): bump word-wrap from 1.2.3 to 1.2.5 in /client Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] --- client/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/yarn.lock b/client/yarn.lock index a862e5300..1d10c3bde 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -12816,9 +12816,9 @@ which@^2.0.1: isexe "^2.0.0" word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workbox-background-sync@^4.3.1: version "4.3.1" From e12ae58a10780c3c3fa2255a7a60eada4ef646a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 22:56:29 +0000 Subject: [PATCH 026/157] build(deps): bump word-wrap from 1.2.3 to 1.2.5 in /backend Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/yarn.lock b/backend/yarn.lock index 30806eb13..e84566ec3 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -6816,9 +6816,9 @@ widest-line@^3.1.0: string-width "^4.0.0" word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^5.1.0: version "5.1.0" From 516bf421695e4435ec711bd9a1a9bf6321f6c0f6 Mon Sep 17 00:00:00 2001 From: Brad Date: Thu, 10 Aug 2023 13:51:11 -0700 Subject: [PATCH 027/157] add check for logged in user on project create route --- client/src/components/ProjectForm.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 47c70aa61..e455fb57e 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -3,6 +3,7 @@ import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; +import { Redirect } from 'react-router-dom' import { Typography, Box, @@ -17,6 +18,7 @@ import { RadioGroup, } from '@mui/material'; import { styled } from '@mui/material/styles'; +import useAuth from "../hooks/useAuth" /** Project Form Component * @@ -113,6 +115,7 @@ export default function ProjectForm() { const [activeButton, setActiveButton] = React.useState('close'); const [newlyCreatedID, setNewlyCreatedID] = useState(null); const history = useHistory(); + const { auth } = useAuth(); const { register, handleSubmit, formState: { errors } } = useForm({ mode: 'all', defaultValues: { @@ -179,7 +182,7 @@ export default function ProjectForm() { ); - return ( + return auth && auth.user ? ( Project Management @@ -257,5 +260,7 @@ export default function ProjectForm() { - ); + ) : ( + + ) } From 604047237914b53fc4925d2cb71a0fc76c2cec79 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Mon, 10 Jul 2023 22:06:41 -0700 Subject: [PATCH 028/157] fix: Update openCheckins to use env var Was using hardcoded localhost 4000, now uses env var --- backend/workers/openCheckins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/workers/openCheckins.js b/backend/workers/openCheckins.js index bd1191533..18d917d92 100644 --- a/backend/workers/openCheckins.js +++ b/backend/workers/openCheckins.js @@ -3,7 +3,7 @@ module.exports = (cron, fetch) => { // Check to see if any events are about to start, // and if so, open their respective check-ins - const url = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : 'http://localhost:4000'; + const url = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : `http://localhost:${process.env.BACKEND_PORT}`; const headerToSend = process.env.CUSTOM_REQUEST_HEADER; async function fetchEvents() { From d6c28cce09ca2853b3d42bda2cc21f4d5d62fbaa Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Fri, 21 Jul 2023 14:26:01 -0700 Subject: [PATCH 029/157] fix: Update more locations with hardcoded localhost --- backend/workers/closeCheckins.js | 2 +- backend/workers/createRecurringEvents.js | 2 +- backend/workers/slackbot.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/workers/closeCheckins.js b/backend/workers/closeCheckins.js index a9dc0a0e8..d2c64d20d 100644 --- a/backend/workers/closeCheckins.js +++ b/backend/workers/closeCheckins.js @@ -3,7 +3,7 @@ module.exports = (cron, fetch) => { // Check to see if any events are about to start, // and if so, open their respective check-ins - const url = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : 'http://localhost:4000'; + const url = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : `http://localhost:${process.env.BACKEND_PORT}`; const headerToSend = process.env.CUSTOM_REQUEST_HEADER; async function fetchEvents() { diff --git a/backend/workers/createRecurringEvents.js b/backend/workers/createRecurringEvents.js index 40bcafc0e..a1228c369 100644 --- a/backend/workers/createRecurringEvents.js +++ b/backend/workers/createRecurringEvents.js @@ -8,7 +8,7 @@ module.exports = (cron, fetch) => { let RECURRING_EVENTS; let TODAY_DATE; let TODAY; - const URL = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : 'http://localhost:4000'; + const URL = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : `http://localhost:${process.env.BACKEND_PORT}`; const headerToSend = process.env.CUSTOM_REQUEST_HEADER; const fetchEvents = async () => { diff --git a/backend/workers/slackbot.js b/backend/workers/slackbot.js index 27748a78d..d50e56f9b 100644 --- a/backend/workers/slackbot.js +++ b/backend/workers/slackbot.js @@ -9,7 +9,7 @@ module.exports = (fetch) => { const fetchEvents = async () => { try { - const res = await fetch('http://localhost:4000/api/events', { + const res = await fetch(`http://localhost:${process.env.BACKEND_PORT}/api/events`, { headers: { 'x-customrequired-header': headerToSend, }, From 0e359dba899e5f327405da076f5ba652b9573e06 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 13 Aug 2023 17:09:25 -0700 Subject: [PATCH 030/157] add length validation to description field --- client/src/components/ProjectForm.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index e455fb57e..230b71910 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -37,6 +37,8 @@ const simpleInputs = [ name: 'description', type: 'textarea', placeholder: 'Enter project description', + value: /^[a-zA-Z0-9 _.,!"'@#$%^&*()/]{0,250}$/, + errorMessage: 'Description is too long, max 250 characters allowed' }, { label: 'Location', From c8909616458159c8a11b0d75a25ebbf5fe67b795 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 13 Aug 2023 17:26:12 -0700 Subject: [PATCH 031/157] update regex --- client/src/components/ProjectForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 230b71910..8bc4eebd5 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -37,7 +37,7 @@ const simpleInputs = [ name: 'description', type: 'textarea', placeholder: 'Enter project description', - value: /^[a-zA-Z0-9 _.,!"'@#$%^&*()/]{0,250}$/, + value: /^[a-zA-Z0-9].{0,250}$/, errorMessage: 'Description is too long, max 250 characters allowed' }, { From 6f1778c22bbc8cc630844bf48a2a6c63744d3e63 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Thu, 17 Aug 2023 21:18:16 -0700 Subject: [PATCH 032/157] reusable form --- client/src/App.js | 3 +- client/src/components/ProjectForm.js | 103 ++-------------- .../components/manageProjects/addProject.js | 110 ++++++++++++++++++ 3 files changed, 121 insertions(+), 95 deletions(-) create mode 100644 client/src/components/manageProjects/addProject.js diff --git a/client/src/App.js b/client/src/App.js index 7a2d51b7f..d610b188b 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -21,6 +21,7 @@ import ProjectLeaderDashboard from './pages/ProjectLeaderDashboard'; import UserAdmin from './pages/UserAdmin'; import ProjectList from './pages/ProjectList'; import ManageProjects from './pages/ManageProjects'; +import addProject from './components/manageProjects/addProject'; import HealthCheck from './pages/HealthCheck'; import SecretPassword from './pages/SecretPassword'; import UserWelcome from './pages/UserWelcome'; @@ -49,7 +50,7 @@ const routes = [ { path: '/events', name: 'events', Component: Events }, { path: '/useradmin', name: 'useradmin', Component: UserAdmin }, { path: '/projects', name: 'projects', Component: ProjectList }, - { path: '/projects/create', name: 'projectform', Component: ProjectForm }, + { path: '/projects/create', name: 'projectform', Component: addProject}, { path: '/projects/:projectId', name: 'project', diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index e455fb57e..92dee6336 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,7 +1,6 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; -import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; import { Redirect } from 'react-router-dom' import { @@ -18,70 +17,7 @@ import { RadioGroup, } from '@mui/material'; import { styled } from '@mui/material/styles'; -import useAuth from "../hooks/useAuth" - -/** Project Form Component - * - * To be used for creating and updating a project - * */ - -const simpleInputs = [ - { - label: 'Project Name', - name: 'name', - type: 'text', - placeholder: 'Enter project name', - }, - { - label: 'Project Description', - name: 'description', - type: 'textarea', - placeholder: 'Enter project description', - }, - { - label: 'Location', - name: 'location', - type: 'text', - placeholder: 'Enter location for meeting', - value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL', - addressValue: '', - addressError: 'Invalid address' - - }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'GitHub Identifier', - // name: 'githubIdentifier', - // type: 'text', - // placeholder: 'Enter GitHub identifier', - // }, - { - label: 'GitHub URL', - name: 'githubUrl', - type: 'text', - placeholder: 'htttps://github.com/' - }, - { - label: 'Slack Channel Link', - name: 'slackUrl', - type: 'text', - placeholder: 'htttps://slack.com/', - }, - { - label: 'Google Drive URL', - name: 'googleDriveUrl', - type: 'text', - placeholder: 'htttps://drive.google.com/', - }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'HFLA Website URL', - // name: 'hflaWebsiteUrl', - // type: 'text', - // placeholder: 'htttps://hackforla.org/projects/', - // }, -]; +import useAuth from "../hooks/useAuth" /** STYLES * -most TextField and InputLabel styles are controlled by the theme @@ -109,12 +45,13 @@ const StyledRadio = styled(Radio)(({ theme }) => ({ * -renders a form for creating and updating a project */ -export default function ProjectForm() { +// Takes Array, submitForm, isEdit? +export default function ProjectForm({arr, submitForm, isEdit}) { //seperate state for the location radio buttons + const history = useHistory(); + const [locationType, setLocationType] = React.useState('remote'); const [activeButton, setActiveButton] = React.useState('close'); - const [newlyCreatedID, setNewlyCreatedID] = useState(null); - const history = useHistory(); const { auth } = useAuth(); const { register, handleSubmit, formState: { errors } } = useForm({ mode: 'all', @@ -128,33 +65,11 @@ export default function ProjectForm() { } }); - const routeToNewProjectPage = () => { - if(newlyCreatedID !== null) { - history.push(`/projects/${newlyCreatedID}`) - } - } - - useEffect(() => { - routeToNewProjectPage() - },[newlyCreatedID]) - - // only handles radio button change + // // only handles radio button change const handleRadioChange = (event) => { setLocationType(event.target.value); }; - const submitForm = async (data) => { - const projectApi = new ProjectApiService(); - try { - const id = await projectApi.create(data); - setNewlyCreatedID(id); - } catch (errors) { - console.error(errors); - return; - } - setActiveButton('close'); - }; - const locationRadios = ( @@ -197,7 +112,7 @@ export default function ProjectForm() { - Add New Project + {isEdit ? 'edit' : 'Add New Project'} @@ -206,7 +121,7 @@ export default function ProjectForm() {
    { submitForm(data) })}> - {simpleInputs.map((input) => ( + {arr.map((input) => ( diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.js new file mode 100644 index 000000000..7210192fc --- /dev/null +++ b/client/src/components/manageProjects/addProject.js @@ -0,0 +1,110 @@ +import React from 'react'; +import {useHistory } from 'react-router-dom'; + +import ProjectForm from '../ProjectForm'; +import ProjectApiService from '../../api/ProjectApiService'; + + +function addProject() { + // Array filled with default inputs. + // const [newlyCreatedID, setNewlyCreatedID] = useState(null); + + const simpleInputs = [ + { + label: 'Project Name', + name: 'name', + type: 'text', + placeholder: 'Enter project name', + }, + { + label: 'Project Description', + name: 'description', + type: 'textarea', + placeholder: 'Enter project description', + }, + { + label: 'Location', + name: 'location', + type: 'text', + placeholder: 'Enter location for meeting', + value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, + errorMessage: 'Please enter a valid Zoom URL', + addressValue: '', + addressError: 'Invalid address' + + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'GitHub Identifier', + // name: 'githubIdentifier', + // type: 'text', + // placeholder: 'Enter GitHub identifier', + // }, + { + label: 'GitHub URL', + name: 'githubUrl', + type: 'text', + placeholder: 'htttps://github.com/' + }, + { + label: 'Slack Channel Link', + name: 'slackUrl', + type: 'text', + placeholder: 'htttps://slack.com/', + }, + { + label: 'Google Drive URL', + name: 'googleDriveUrl', + type: 'text', + placeholder: 'htttps://drive.google.com/', + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'HFLA Website URL', + // name: 'hflaWebsiteUrl', + // type: 'text', + // placeholder: 'htttps://hackforla.org/projects/', + // }, + ]; + + + // Handles POST request found in api/ProjectApiService. + const submitForm = async (data) => { + const projectApi = new ProjectApiService(); + try { + const id = await projectApi.create(data); + // console.log(id) + // setNewlyCreatedID(id); + // history.push(`/projects/${id}`) + // projectView(id) + } catch (errors) { + console.error(errors); + return; + } + // setActiveButton('close'); + }; + + // const routeToNewProjectPage = () => { + // if(newlyCreatedID !== null) { + // history.push(`/projects/${newlyCreatedID}`) + // } + // } + + // useEffect(() => { + // if(newlyCreatedID !== null) { + // history.push(`/projects/${newlyCreatedID}`) + // } + // },[newlyCreatedID]) + + return ( +
    + +
    + ) +} + +export default addProject From 70711e43e3913dbb615d137d7611b16332de44f2 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Tue, 22 Aug 2023 15:23:38 -0700 Subject: [PATCH 033/157] reusable form + additional changes. --- backend/routers/projects.router.js | 2 + backend/routers/projects.router.test.js | 2 +- client/src/api/ProjectApiService.js | 20 +- client/src/components/ProjectForm.js | 214 +++++++++-- .../components/manageProjects/addProject.js | 157 +++----- .../components/manageProjects/editProject.js | 349 ++++++++---------- client/src/sass/ManageProjects.scss | 1 - 7 files changed, 397 insertions(+), 348 deletions(-) diff --git a/backend/routers/projects.router.js b/backend/routers/projects.router.js index 8991000cb..f0762b834 100644 --- a/backend/routers/projects.router.js +++ b/backend/routers/projects.router.js @@ -10,6 +10,8 @@ router.post('/', ProjectController.create); router.get('/:ProjectId', ProjectController.project_by_id); +router.put('/:ProjectId', ProjectController.update); + router.patch('/:ProjectId', ProjectController.update); diff --git a/backend/routers/projects.router.test.js b/backend/routers/projects.router.test.js index 5233247b9..b4abbc6ee 100644 --- a/backend/routers/projects.router.test.js +++ b/backend/routers/projects.router.test.js @@ -73,7 +73,7 @@ describe('UPDATE', () => { // Update project const res2 = await request - .patch(`/api/projects/${res.body._id}`) + .put(`/api/projects/${res.body._id}`) .set(headers) .send(updatedDataPayload); expect(res2.status).toBe(200); diff --git a/client/src/api/ProjectApiService.js b/client/src/api/ProjectApiService.js index 12f4e0763..949bd5ee0 100644 --- a/client/src/api/ProjectApiService.js +++ b/client/src/api/ProjectApiService.js @@ -22,6 +22,7 @@ class ProjectApiService { } } + // Handles the POST request and returns the projects ID. async create(projectData) { const { name, @@ -58,26 +59,13 @@ class ProjectApiService { } } - async updateProject(projectId, fieldName, fieldValue) { - let updateValue = fieldValue; - // These field are arrays, but the form makes them comma separated strings, - // so this adds it back to db as an arrray. - if ( - fieldValue && - (fieldName === 'partners' || fieldName === 'recruitingCategories') - ) { - updateValue = fieldValue - .split(',') - .filter((x) => x !== '') - .map((y) => y.trim()); - } - + async updateProject(projectId, projectData) { // Update database const url = `${this.baseProjectUrl}${projectId}`; const requestOptions = { - method: 'PATCH', + method: 'PUT', headers: this.headers, - body: JSON.stringify({ [fieldName]: updateValue }), + body: JSON.stringify({ ...projectData }), }; try { diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 92dee6336..9789936fe 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,8 +1,11 @@ -import React, { useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; +import ProjectApiService from '../api/ProjectApiService'; + +import { ReactComponent as EditIcon } from '../svg/Icon_Edit.svg'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; -import { Redirect } from 'react-router-dom' +import { Redirect } from 'react-router-dom'; import { Typography, Box, @@ -17,7 +20,7 @@ import { RadioGroup, } from '@mui/material'; import { styled } from '@mui/material/styles'; -import useAuth from "../hooks/useAuth" +import useAuth from '../hooks/useAuth'; /** STYLES * -most TextField and InputLabel styles are controlled by the theme @@ -45,15 +48,33 @@ const StyledRadio = styled(Radio)(({ theme }) => ({ * -renders a form for creating and updating a project */ -// Takes Array, submitForm, isEdit? -export default function ProjectForm({arr, submitForm, isEdit}) { - //seperate state for the location radio buttons +/** + * Takes Array, formData, projectToEdit, handleChage, isEdit + * submitForm, handleChange, and isEdit are for the edit forms. + * - formData - passes the current project information to the form. + * - projectToEdit - used to grab the of the project we are editing. + * - handleChange - changes the input values to whatever the user changes it to. + * - Where its creating a new project or editing one - True or False. + * */ +export default function ProjectForm({ + arr, + formData, + projectToEdit, + handleChange, + isEdit, +}) { const history = useHistory(); - const [locationType, setLocationType] = React.useState('remote'); - const [activeButton, setActiveButton] = React.useState('close'); + // ----------------- States ----------------- + const [locationType, setLocationType] = useState('remote'); + // State to track the toggling from Project view to Edit Project View via edit icon. + const [editMode, setEditMode] = useState(true); const { auth } = useAuth(); - const { register, handleSubmit, formState: { errors } } = useForm({ + const { + register, + handleSubmit, + formState: { errors }, + } = useForm({ mode: 'all', defaultValues: { name: '', @@ -61,15 +82,84 @@ export default function ProjectForm({arr, submitForm, isEdit}) { location: '', githubUrl: '', slackUrl: '', - googleDriveUrl: '' - } + googleDriveUrl: '', + }, }); - // // only handles radio button change + // ----------------- Submit requests ----------------- + + // Handles POST request found in api/ProjectApiService. + const submitNewProject = async (data) => { + const projectApi = new ProjectApiService(); + try { + const id = await projectApi.create(data); + history.push(`/projects/${id}`); + } catch (errors) { + console.error(errors); + return; + } + }; + + // Fires PUT request to update the project, + const submitEditProject = async (data) => { + const projectApi = new ProjectApiService(); + try { + await projectApi.updateProject(projectToEdit._id, data); + } catch (errors) { + console.error(errors); + return; + } + setEditMode(true); + }; + + // ----------------- Handles and Toggles ----------------- + + // Handles the location radio button change. const handleRadioChange = (event) => { setLocationType(event.target.value); }; + // Toggles the project view to edit mode change. + const handleEditMode = (event) => { + setEditMode(!editMode); + }; + // ----------------- Icons ----------------- + + // Holds the Add New Project Icon and styling. + const addIcon = () => { + return ( + + + + Add New Project + + + ); + }; + // Holds the Edit New Project Icon and styling. + const editIcon = () => { + return ( + + + + ); + }; + + // ----------------- Location radio ----------------- + + // Holdes the location radios styling. const locationRadios = ( @@ -85,18 +175,22 @@ export default function ProjectForm({arr, submitForm, isEdit}) { value="remote" control={} label="Remote" + disabled={isEdit ? editMode : false} /> } label="In-Person" + disabled={isEdit ? editMode : false} /> ); + // ----------------- Textfields ----------------- + return auth && auth.user ? ( @@ -109,18 +203,16 @@ export default function ProjectForm({arr, submitForm, isEdit}) { Project Information - - - - {isEdit ? 'edit' : 'Add New Project'} - - + {isEdit ? editIcon() : addIcon()} - { - submitForm(data) - })}> + { + isEdit ? submitEditProject(data) : submitNewProject(data); + })} + > {arr.map((input) => ( @@ -133,19 +225,63 @@ export default function ProjectForm({arr, submitForm, isEdit}) { {input.name === 'location' && locationRadios} -
    - +
    + {/* Sets text field and data (if needed) based on the whether it is as add or edit form page. */} + {isEdit ? ( + /** + * Edit textfield. + * Includes + * - handleChange - to update the input fields based on users input. + * - value - formData that is passed from the DB to fill the input fields. + * */ + + ) : ( + // Add new project textfield. + + )}
    ))}
    @@ -157,7 +293,9 @@ export default function ProjectForm({arr, submitForm, isEdit}) { Save @@ -166,8 +304,8 @@ export default function ProjectForm({arr, submitForm, isEdit}) { Close @@ -177,5 +315,5 @@ export default function ProjectForm({arr, submitForm, isEdit}) { ) : ( - ) + ); } diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.js index 7210192fc..d7209dfe0 100644 --- a/client/src/components/manageProjects/addProject.js +++ b/client/src/components/manageProjects/addProject.js @@ -1,110 +1,75 @@ import React from 'react'; -import {useHistory } from 'react-router-dom'; - import ProjectForm from '../ProjectForm'; -import ProjectApiService from '../../api/ProjectApiService'; - function addProject() { - // Array filled with default inputs. - // const [newlyCreatedID, setNewlyCreatedID] = useState(null); - - const simpleInputs = [ - { - label: 'Project Name', - name: 'name', - type: 'text', - placeholder: 'Enter project name', - }, - { - label: 'Project Description', - name: 'description', - type: 'textarea', - placeholder: 'Enter project description', - }, - { - label: 'Location', - name: 'location', - type: 'text', - placeholder: 'Enter location for meeting', - value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL', - addressValue: '', - addressError: 'Invalid address' - - }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'GitHub Identifier', - // name: 'githubIdentifier', - // type: 'text', - // placeholder: 'Enter GitHub identifier', - // }, - { - label: 'GitHub URL', - name: 'githubUrl', - type: 'text', - placeholder: 'htttps://github.com/' - }, - { - label: 'Slack Channel Link', - name: 'slackUrl', - type: 'text', - placeholder: 'htttps://slack.com/', - }, - { - label: 'Google Drive URL', - name: 'googleDriveUrl', - type: 'text', - placeholder: 'htttps://drive.google.com/', - }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'HFLA Website URL', - // name: 'hflaWebsiteUrl', - // type: 'text', - // placeholder: 'htttps://hackforla.org/projects/', - // }, - ]; - - - // Handles POST request found in api/ProjectApiService. - const submitForm = async (data) => { - const projectApi = new ProjectApiService(); - try { - const id = await projectApi.create(data); - // console.log(id) - // setNewlyCreatedID(id); - // history.push(`/projects/${id}`) - // projectView(id) - } catch (errors) { - console.error(errors); - return; - } - // setActiveButton('close'); - }; - - // const routeToNewProjectPage = () => { - // if(newlyCreatedID !== null) { - // history.push(`/projects/${newlyCreatedID}`) - // } - // } - - // useEffect(() => { - // if(newlyCreatedID !== null) { - // history.push(`/projects/${newlyCreatedID}`) - // } - // },[newlyCreatedID]) + // Array filled with default inputs. + const simpleInputs = [ + { + label: 'Project Name', + name: 'name', + type: 'text', + placeholder: 'Enter project name', + }, + { + label: 'Project Description', + name: 'description', + type: 'textarea', + placeholder: 'Enter project description', + }, + { + label: 'Location', + name: 'location', + type: 'text', + placeholder: 'Enter location for meeting', + value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, + errorMessage: 'Please enter a valid Zoom URL', + addressValue: '', + addressError: 'Invalid address', + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'GitHub Identifier', + // name: 'githubIdentifier', + // type: 'text', + // placeholder: 'Enter GitHub identifier', + // }, + { + label: 'GitHub URL', + name: 'githubUrl', + type: 'text', + placeholder: 'htttps://github.com/', + }, + { + label: 'Slack Channel Link', + name: 'slackUrl', + type: 'text', + placeholder: 'htttps://slack.com/', + }, + { + label: 'Google Drive URL', + name: 'googleDriveUrl', + type: 'text', + placeholder: 'htttps://drive.google.com/', + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'HFLA Website URL', + // name: 'hflaWebsiteUrl', + // type: 'text', + // placeholder: 'htttps://hackforla.org/projects/', + // }, + ]; return (
    - ) + ); } -export default addProject +export default addProject; diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index cd8197f89..da117e637 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -1,64 +1,122 @@ import React, { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; -import EditableField from './editableField'; import EditMeetingTimes from './editMeetingTimes'; import CreateNewEvent from './createNewEvent'; import readableEvent from './utilities/readableEvent'; -import { ReactComponent as EditIcon } from "../../svg/Icon_Edit.svg"; -import '../../sass/ManageProjects.scss'; +import ProjectForm from '../ProjectForm'; + +import { ReactComponent as EditIcon } from '../../svg/Icon_Edit.svg'; +import { ReactComponent as PlusIcon } from '../../svg/PlusIcon.svg'; + +import { Typography, Box, Divider } from '@mui/material'; // Need to hold user state to check which type of user they are and conditionally render editing fields in this component // for user level block access to all except for the ones checked const EditProject = ({ projectToEdit, - userAccessLevel, - updateProject, recurringEvents, createNewRecurringEvent, deleteRecurringEvent, updateRecurringEvent, - regularEvents, - updateRegularEvent }) => { - // Add commas to arrays for display - const partnerDataFormatted = projectToEdit.partners.join(', '); + const [formData, setFormData] = useState({ + name: projectToEdit.name, + description: projectToEdit.description, + location: projectToEdit.location, + // githubIdentifier: projectToEdit.name, + githubUrl: projectToEdit.githubUrl, + slackUrl: projectToEdit.slackUrl, + googleDriveUrl: projectToEdit.googleDriveUrl, + // hflaWebsiteUrl: projectToEdit.name, + }); + // eslint-disable-next-line no-unused-vars - const recrutingDataFormatted = projectToEdit.recruitingCategories.join(', '); - const [recurringEventsState, setRecurringEventsState] = useState([]); - const [regularEventsState, setRegularEventsState] = useState([]); + + const [rEvents, setREvents] = useState([]); const [selectedEvent, setSelectedEvent] = useState(); const [isCreateNew, setIsCreateNew] = useState(); // States for alerts const [eventAlert, setEventAlert] = useState(null); - // Get project recurring events when component loads - useEffect(() => { - if (regularEvents) { - setRegularEventsState( - regularEvents - // eslint-disable-next-line no-underscore-dangle - .filter((e) => e?.project?._id === projectToEdit._id) - .map((item) => ({...item, ...readableEvent(item), raw: item})) - .reverse() // sorts most recent events first - ); - } - }, [projectToEdit, regularEvents, setRegularEventsState]); + // Form inputs. + const simpleInputs = [ + { + label: 'Project Name', + name: 'name', + type: 'text', + value: projectToEdit.name, + }, + { + label: 'Project Description', + name: 'description', + type: 'textarea', + value: projectToEdit.description, + }, + { + label: 'Location', + name: 'location', + type: 'text', + value: projectToEdit.location, + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'GitHub Identifier', + // name: 'githubIdentifier', + // type: 'text', + // placeholder: 'Enter GitHub identifier', + // }, + { + label: 'GitHub URL', + name: 'githubUrl', + type: 'text', + value: projectToEdit.githubUrl, + }, + { + label: 'Slack Channel Link', + name: 'slackUrl', + type: 'text', + value: projectToEdit.slackUrl, + }, + { + label: 'Google Drive URL', + name: 'googleDriveUrl', + type: 'text', + value: projectToEdit.googleDriveUrl, + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'HFLA Website URL', + // name: 'hflaWebsiteUrl', + // type: 'text', + // value: projectToEdit.hflaWebsiteUrl, + // }, + ]; + // Get project recurring events when component loads useEffect(() => { if (recurringEvents) { - setRecurringEventsState( + setREvents( recurringEvents // eslint-disable-next-line no-underscore-dangle .filter((e) => e?.project?._id === projectToEdit._id) - .map((item) => ({...item, ...readableEvent(item)})) + .map((item) => readableEvent(item)) .sort((a, b) => a.dayOfTheWeekNumber - b.dayOfTheWeekNumber) - ); - } - }, [projectToEdit, recurringEvents, setRecurringEventsState]); + ); + } + }, [projectToEdit, recurringEvents, setREvents]); + + // Updates state of formData onChange of any form input + const handleChange = (e) => { + const { name, value } = e.target; + + setFormData((fData) => ({ + ...fData, + [name]: value, + })); + }; return ( -
    +
    - - All Projects - -
    - *The data here is only test data and is not accurate* -
    -
    {`Project: ${projectToEdit.name}`}
    - - - - - - - - {/* */} - - {/* */} - {/* */} - - {/* */} -
    -

    Recurring Events

    -

    {eventAlert}

    -
      - {recurringEventsState.map((event) => ( - // eslint-disable-next-line no-underscore-dangle -
    • - -
    • - ))} -
    -
    -
    - -
    - -
    -

    Manually Edit Events Checkin

    -

    {eventAlert}

    -
      - {regularEventsState.map((event, index) => ( - - // eslint-disable-next-line no-underscore-dangle - - ))} -
    -
    -
    + + + Recurring Events + + + setIsCreateNew(true)} + > + + + Add New Event + + + + + +
    +

    {eventAlert}

    +
      + {rEvents.map((event) => ( + // eslint-disable-next-line no-underscore-dangle +
    • + +
    • + ))} +
    +
    +
    +
    + + + ); }; -function RegularEvent({event, updateRegularEvent}) { - return ( -
  • - -
  • - ) -} - export default EditProject; diff --git a/client/src/sass/ManageProjects.scss b/client/src/sass/ManageProjects.scss index 67292c383..46899a9dc 100644 --- a/client/src/sass/ManageProjects.scss +++ b/client/src/sass/ManageProjects.scss @@ -139,7 +139,6 @@ div.editable-field { ul { padding-top: 4px; - border-top: 2px solid #32373b; } li { From 9875937dbe200bca6fd36625548ab47d0984c518 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 24 Aug 2023 16:34:01 -0700 Subject: [PATCH 034/157] feat: Add press edit agian to revert data --- client/src/components/ProjectForm.js | 4 ++++ client/src/components/manageProjects/editProject.js | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 9789936fe..3b7e0f85c 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -62,6 +62,8 @@ export default function ProjectForm({ projectToEdit, handleChange, isEdit, + revertToOriginal, + setOriginalProjectData, }) { const history = useHistory(); @@ -109,6 +111,7 @@ export default function ProjectForm({ console.error(errors); return; } + setOriginalProjectData(data); setEditMode(true); }; @@ -121,6 +124,7 @@ export default function ProjectForm({ // Toggles the project view to edit mode change. const handleEditMode = (event) => { setEditMode(!editMode); + revertToOriginal(); }; // ----------------- Icons ----------------- diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index da117e637..70459774c 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -18,7 +18,7 @@ const EditProject = ({ deleteRecurringEvent, updateRecurringEvent, }) => { - const [formData, setFormData] = useState({ + const [originalProjectData, setOriginalProjectData] = useState({ name: projectToEdit.name, description: projectToEdit.description, location: projectToEdit.location, @@ -29,6 +29,10 @@ const EditProject = ({ // hflaWebsiteUrl: projectToEdit.name, }); + const [formData, setFormData] = useState({ + ...originalProjectData + }); + // eslint-disable-next-line no-unused-vars const [rEvents, setREvents] = useState([]); @@ -115,6 +119,10 @@ const EditProject = ({ })); }; + const revertToOriginal = () => { + setFormData(originalProjectData); + } + return (
    @@ -143,6 +151,8 @@ const EditProject = ({ projectToEdit={projectToEdit} handleChange={handleChange} isEdit={true} + revertToOriginal={revertToOriginal} + setOriginalProjectData={setOriginalProjectData} /> Date: Thu, 24 Aug 2023 17:31:20 -0700 Subject: [PATCH 035/157] feat: Restore Manually Edit Events Checkin --- .../components/manageProjects/editProject.js | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 70459774c..03e1e187c 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -17,6 +17,8 @@ const EditProject = ({ createNewRecurringEvent, deleteRecurringEvent, updateRecurringEvent, + regularEvents, + updateRegularEvent, }) => { const [originalProjectData, setOriginalProjectData] = useState({ name: projectToEdit.name, @@ -36,12 +38,26 @@ const EditProject = ({ // eslint-disable-next-line no-unused-vars const [rEvents, setREvents] = useState([]); + const [regularEventsState, setRegularEventsState] = useState([]); const [selectedEvent, setSelectedEvent] = useState(); const [isCreateNew, setIsCreateNew] = useState(); // States for alerts const [eventAlert, setEventAlert] = useState(null); + // test + useEffect(() => { + if (regularEvents) { + setRegularEventsState( + regularEvents + // eslint-disable-next-line no-underscore-dangle + .filter((e) => e?.project?._id === projectToEdit._id) + .map((item) => ({...item, ...readableEvent(item), raw: item})) + .reverse() // sorts most recent events first + ); + } + }, [projectToEdit, regularEvents, setRegularEventsState]); + // Form inputs. const simpleInputs = [ { @@ -208,12 +224,56 @@ const EditProject = ({ ))}
    -
    + {/*
    */}
    - + + + + + + Manually Edit Events Checkin + + + + + +
    +

    {eventAlert}

    +
      + {regularEventsState.map((event, index) => ( + + // eslint-dis able-next-line no-underscore-dangle + + ))} +
    +
    +
    + +
    ); }; +function RegularEvent({event, updateRegularEvent}) { + return ( +
  • + +
  • + ) +} + export default EditProject; From 529e5840ed7518f66ce3845186ffd961dd4915cb Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Thu, 24 Aug 2023 20:23:31 -0700 Subject: [PATCH 036/157] adjust editMode and styling on form --- client/src/components/ProjectForm.js | 46 +++++++++++++++++++++------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 9789936fe..c4d5066b9 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -68,7 +68,15 @@ export default function ProjectForm({ // ----------------- States ----------------- const [locationType, setLocationType] = useState('remote'); // State to track the toggling from Project view to Edit Project View via edit icon. - const [editMode, setEditMode] = useState(true); + const [editMode, setEditMode] = useState(false); + + /** + * + * STATE + */ + const initialState = [...arr] + + const [arrState, setArrState] = useState(initialState) const { auth } = useAuth(); const { register, @@ -118,11 +126,23 @@ export default function ProjectForm({ const handleRadioChange = (event) => { setLocationType(event.target.value); }; + + /** + * + * RESET + */ + // Toggles the project view to edit mode change. const handleEditMode = (event) => { setEditMode(!editMode); + resetState() + }; + const resetState = () => { + // arr = [initialState] + } + // ----------------- Icons ----------------- // Holds the Add New Project Icon and styling. @@ -147,12 +167,16 @@ export default function ProjectForm({ const editIcon = () => { return ( + + {editMode ? 'Cancel' : 'Edit Project'} + ); }; @@ -175,14 +199,14 @@ export default function ProjectForm({ value="remote" control={} label="Remote" - disabled={isEdit ? editMode : false} + disabled={isEdit && !editMode} /> } label="In-Person" - disabled={isEdit ? editMode : false} + disabled={isEdit && !editMode} />
    @@ -197,10 +221,10 @@ export default function ProjectForm({ Project Management - + - Project Information + {editMode ? 'Editing Project' : 'Project Information'} {isEdit ? editIcon() : addIcon()} @@ -256,7 +280,7 @@ export default function ProjectForm({ helperText={`${errors[input.name]?.message || ' '}`} onChange={handleChange} value={formData[input.name]} - disabled={editMode} + disabled={!editMode} /> ) : ( // Add new project textfield. @@ -293,7 +317,7 @@ export default function ProjectForm({ @@ -316,4 +340,4 @@ export default function ProjectForm({ ) : ( ); -} +} \ No newline at end of file From 3c1b78c9c69f948f0669c29668b653abeb1c2ea1 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Thu, 24 Aug 2023 21:37:29 -0700 Subject: [PATCH 037/157] update styling + add trilliums pr --- client/src/components/ProjectForm.js | 47 ++++++++-------------------- client/src/svg/Icon_Edit.svg | 2 +- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index c36988a8a..b8ec96622 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -71,14 +71,6 @@ export default function ProjectForm({ const [locationType, setLocationType] = useState('remote'); // State to track the toggling from Project view to Edit Project View via edit icon. const [editMode, setEditMode] = useState(false); - - /** - * - * STATE - */ - const initialState = [...arr] - - const [arrState, setArrState] = useState(initialState) const { auth } = useAuth(); const { register, @@ -129,27 +121,12 @@ export default function ProjectForm({ const handleRadioChange = (event) => { setLocationType(event.target.value); }; - - /** - * - * RESET - */ - // Toggles the project view to edit mode change. const handleEditMode = (event) => { setEditMode(!editMode); -<<<<<<< HEAD - resetState() - -======= revertToOriginal(); ->>>>>>> a705d73234655bc5030a643d2507b1f1376df0a4 }; - const resetState = () => { - // arr = [initialState] - } - // ----------------- Icons ----------------- // Holds the Add New Project Icon and styling. @@ -174,15 +151,17 @@ export default function ProjectForm({ const editIcon = () => { return ( - + - {editMode ? 'Cancel' : 'Edit Project'} + {editMode ? 'Cancel' : 'Edit Mode'} ); @@ -206,14 +185,14 @@ export default function ProjectForm({ value="remote" control={} label="Remote" - disabled={isEdit && !editMode} + disabled={!editMode} /> } label="In-Person" - disabled={isEdit && !editMode} + disabled={!editMode} /> @@ -228,7 +207,7 @@ export default function ProjectForm({ Project Management - + {editMode ? 'Editing Project' : 'Project Information'} @@ -324,9 +303,9 @@ export default function ProjectForm({ Save diff --git a/client/src/svg/Icon_Edit.svg b/client/src/svg/Icon_Edit.svg index f2eb7335c..6a6271821 100644 --- a/client/src/svg/Icon_Edit.svg +++ b/client/src/svg/Icon_Edit.svg @@ -1,3 +1,3 @@ - + From 46f4d47c09f469eda0c5e2825d14a51282a18743 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Thu, 24 Aug 2023 21:39:59 -0700 Subject: [PATCH 038/157] remove comment --- client/src/components/ProjectForm.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index b8ec96622..92e7ee7e7 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -199,8 +199,6 @@ export default function ProjectForm({
    ); - // ----------------- Textfields ----------------- - return auth && auth.user ? ( From 6571d0547f305313bb381227b21250ea5e942497 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Fri, 25 Aug 2023 08:55:25 -0700 Subject: [PATCH 039/157] save button bug fix --- client/src/components/ProjectForm.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 92e7ee7e7..66ce8a751 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -185,14 +185,14 @@ export default function ProjectForm({ value="remote" control={} label="Remote" - disabled={!editMode} + disabled={isEdit ? !editMode : false} /> } label="In-Person" - disabled={!editMode} + disabled={isEdit ? !editMode : false} /> @@ -303,7 +303,7 @@ export default function ProjectForm({ form="project-form" variant={editMode ? "contained" : "secondary"} cursor="pointer" - disabled={!editMode} + disabled={isEdit ? !editMode : false} > Save From e80ca8e9363bec49364fab9dd1613c75f742509f Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Fri, 25 Aug 2023 13:16:17 -0700 Subject: [PATCH 040/157] set react hook form state, reset method, and styling --- client/src/components/ProjectForm.js | 98 +++++++++++-------- .../components/manageProjects/editProject.js | 27 +---- 2 files changed, 60 insertions(+), 65 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 66ce8a751..770ae24fd 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; @@ -46,24 +46,25 @@ const StyledRadio = styled(Radio)(({ theme }) => ({ /**Project Form Component * -renders a form for creating and updating a project - */ + +/** + /** * Takes Array, formData, projectToEdit, handleChage, isEdit * submitForm, handleChange, and isEdit are for the edit forms. + * - arr - simpleInputs arr from the edit page that holds the input's properties. * - formData - passes the current project information to the form. * - projectToEdit - used to grab the of the project we are editing. - * - handleChange - changes the input values to whatever the user changes it to. - * - Where its creating a new project or editing one - True or False. + * - isEdit - Whether its creating a new project or editing one - True or False. + * - setFormData - allows us to updated the form data. * */ export default function ProjectForm({ arr, formData, projectToEdit, - handleChange, isEdit, - revertToOriginal, - setOriginalProjectData, + setFormData }) { const history = useHistory(); @@ -72,19 +73,27 @@ export default function ProjectForm({ // State to track the toggling from Project view to Edit Project View via edit icon. const [editMode, setEditMode] = useState(false); const { auth } = useAuth(); + + /** + * React Hook Forms + * - register + * - handleSubmit + * - formState + * - reset + * - defaultValues - holds edit project data + * + */ + const { register, handleSubmit, + reset, formState: { errors }, } = useForm({ mode: 'all', + // Holds the current project data in state. defaultValues: { - name: '', - description: '', - location: '', - githubUrl: '', - slackUrl: '', - googleDriveUrl: '', + ...formData, }, }); @@ -111,8 +120,9 @@ export default function ProjectForm({ console.error(errors); return; } - setOriginalProjectData(data); - setEditMode(true); + // setOriginalProjectData(data); + setFormData(data); + setEditMode(false); }; // ----------------- Handles and Toggles ----------------- @@ -121,10 +131,14 @@ export default function ProjectForm({ const handleRadioChange = (event) => { setLocationType(event.target.value); }; + // Toggles the project view to edit mode change. const handleEditMode = (event) => { setEditMode(!editMode); - revertToOriginal(); + // React hook form method to reset data back to original values. Triggered when Edit Mode is cancelled. + reset({ + ...formData, + }); }; // ----------------- Icons ----------------- @@ -262,8 +276,6 @@ export default function ProjectForm({ })} placeholder={input.placeholder} helperText={`${errors[input.name]?.message || ' '}`} - onChange={handleChange} - value={formData[input.name]} disabled={!editMode} /> ) : ( @@ -293,33 +305,33 @@ export default function ProjectForm({ ))} + + + + + Save + + + + + Close + + + + - - - - - Save - - - - - Close - - - - ) : ( diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 03e1e187c..8a012c13f 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -20,7 +20,7 @@ const EditProject = ({ regularEvents, updateRegularEvent, }) => { - const [originalProjectData, setOriginalProjectData] = useState({ + const [formData, setFormData] = useState({ name: projectToEdit.name, description: projectToEdit.description, location: projectToEdit.location, @@ -31,10 +31,6 @@ const EditProject = ({ // hflaWebsiteUrl: projectToEdit.name, }); - const [formData, setFormData] = useState({ - ...originalProjectData - }); - // eslint-disable-next-line no-unused-vars const [rEvents, setREvents] = useState([]); @@ -77,6 +73,9 @@ const EditProject = ({ name: 'location', type: 'text', value: projectToEdit.location, + errorMessage: 'Please enter a valid Zoom URL', + addressValue: '', + addressError: 'Invalid address', }, // Leaving incase we want to add this back in for updating projects // { @@ -125,20 +124,6 @@ const EditProject = ({ } }, [projectToEdit, recurringEvents, setREvents]); - // Updates state of formData onChange of any form input - const handleChange = (e) => { - const { name, value } = e.target; - - setFormData((fData) => ({ - ...fData, - [name]: value, - })); - }; - - const revertToOriginal = () => { - setFormData(originalProjectData); - } - return (
    @@ -165,10 +150,8 @@ const EditProject = ({ arr={simpleInputs} formData={formData} projectToEdit={projectToEdit} - handleChange={handleChange} isEdit={true} - revertToOriginal={revertToOriginal} - setOriginalProjectData={setOriginalProjectData} + setFormData={setFormData} /> Date: Fri, 25 Aug 2023 14:03:24 -0700 Subject: [PATCH 041/157] fix validation + remove unused --- client/src/components/ProjectForm.js | 2 +- client/src/components/manageProjects/editProject.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 770ae24fd..3d90e2c16 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState } from 'react'; import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import ProjectApiService from '../api/ProjectApiService'; diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 8a012c13f..fd53d7361 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -72,7 +72,7 @@ const EditProject = ({ label: 'Location', name: 'location', type: 'text', - value: projectToEdit.location, + value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, errorMessage: 'Please enter a valid Zoom URL', addressValue: '', addressError: 'Invalid address', From ab51fa3728cd3710bed5443366b42aac168938a2 Mon Sep 17 00:00:00 2001 From: Trillium S Date: Fri, 25 Aug 2023 18:40:23 -0700 Subject: [PATCH 042/157] fix: Restore button styling with awkward ternary --- client/src/components/ProjectForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 3d90e2c16..dc0c5491f 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -311,7 +311,7 @@ export default function ProjectForm({ @@ -336,4 +336,4 @@ export default function ProjectForm({ ) : ( ); -} \ No newline at end of file +} From 32e83840000c492520e89c44a71e85e0564cf9a5 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 27 Aug 2023 11:56:39 -0700 Subject: [PATCH 043/157] feat: Create ValidatedTextField component --- client/src/components/ProjectForm.js | 78 +++-------------- .../parts/medium/ValidatedTextField.js | 84 +++++++++++++++++++ 2 files changed, 95 insertions(+), 67 deletions(-) create mode 100644 client/src/components/parts/medium/ValidatedTextField.js diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index dc0c5491f..4b0f66d47 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -21,6 +21,7 @@ import { } from '@mui/material'; import { styled } from '@mui/material/styles'; import useAuth from '../hooks/useAuth'; +import ValidatedTextField from './parts/medium/ValidatedTextField'; /** STYLES * -most TextField and InputLabel styles are controlled by the theme @@ -236,73 +237,16 @@ export default function ProjectForm({ })} > {arr.map((input) => ( - - - - - {input.label} - - - {input.name === 'location' && locationRadios} - - {/* Sets text field and data (if needed) based on the whether it is as add or edit form page. */} - {isEdit ? ( - /** - * Edit textfield. - * Includes - * - handleChange - to update the input fields based on users input. - * - value - formData that is passed from the DB to fill the input fields. - * */ - - ) : ( - // Add new project textfield. - - )} - + ))} diff --git a/client/src/components/parts/medium/ValidatedTextField.js b/client/src/components/parts/medium/ValidatedTextField.js new file mode 100644 index 000000000..87c9af4d1 --- /dev/null +++ b/client/src/components/parts/medium/ValidatedTextField.js @@ -0,0 +1,84 @@ +import React from 'react'; +import { Box, Grid, InputLabel, TextField } from "@mui/material"; + +function ValidatedTextField({ + register, + errors, + isEdit, + editMode, + locationType, + locationRadios, + input, +}) { + return ( + + + + + {input.label} + + + {input.name === 'location' && locationRadios} + + {/* Sets text field and data (if needed) based on the whether it is as add or edit form page. */} + {isEdit ? ( + /** + * Edit textfield. + * Includes + * - handleChange - to update the input fields based on users input. + * - value - formData that is passed from the DB to fill the input fields. + * */ + + ) : ( + // Add new project textfield. + + )} + + ) +} + +export default ValidatedTextField; \ No newline at end of file From 32c79adb58260287828d82a0276ed9cc119e194e Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 27 Aug 2023 12:16:10 -0700 Subject: [PATCH 044/157] feat: Refactor ValidatedTextField Handle isEdit without a ternary operator --- client/src/components/ProjectForm.js | 2 +- .../parts/form/ValidatedTextField.js | 56 +++++++++++++ .../parts/medium/ValidatedTextField.js | 84 ------------------- 3 files changed, 57 insertions(+), 85 deletions(-) create mode 100644 client/src/components/parts/form/ValidatedTextField.js delete mode 100644 client/src/components/parts/medium/ValidatedTextField.js diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 4b0f66d47..be0fb125c 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -21,7 +21,7 @@ import { } from '@mui/material'; import { styled } from '@mui/material/styles'; import useAuth from '../hooks/useAuth'; -import ValidatedTextField from './parts/medium/ValidatedTextField'; +import ValidatedTextField from './parts/form/ValidatedTextField'; /** STYLES * -most TextField and InputLabel styles are controlled by the theme diff --git a/client/src/components/parts/form/ValidatedTextField.js b/client/src/components/parts/form/ValidatedTextField.js new file mode 100644 index 000000000..ad4e236c3 --- /dev/null +++ b/client/src/components/parts/form/ValidatedTextField.js @@ -0,0 +1,56 @@ +import React from 'react'; +import { Box, Grid, InputLabel, TextField } from "@mui/material"; + +function ValidatedTextField({ + register, + errors, + isEdit, + editMode, + locationType, + locationRadios, + input, +}) { + const registerObj = { + ...register(input.name, { + required: `${input.name} is required`, + pattern: + input.name === 'location' + ? locationType === 'remote' + ? { + value: input.value, + message: input.errorMessage, + } + : { + value: input.addressValue, + message: input.addressError, + } + : { value: input.value, message: input.errorMessage }, + } + )} + + return ( + + + + + {input.label} + + + {input.name === 'location' && locationRadios} + + + + ); +}; + +export default ValidatedTextField; \ No newline at end of file diff --git a/client/src/components/parts/medium/ValidatedTextField.js b/client/src/components/parts/medium/ValidatedTextField.js deleted file mode 100644 index 87c9af4d1..000000000 --- a/client/src/components/parts/medium/ValidatedTextField.js +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react'; -import { Box, Grid, InputLabel, TextField } from "@mui/material"; - -function ValidatedTextField({ - register, - errors, - isEdit, - editMode, - locationType, - locationRadios, - input, -}) { - return ( - - - - - {input.label} - - - {input.name === 'location' && locationRadios} - - {/* Sets text field and data (if needed) based on the whether it is as add or edit form page. */} - {isEdit ? ( - /** - * Edit textfield. - * Includes - * - handleChange - to update the input fields based on users input. - * - value - formData that is passed from the DB to fill the input fields. - * */ - - ) : ( - // Add new project textfield. - - )} - - ) -} - -export default ValidatedTextField; \ No newline at end of file From 338c6832576afb7ae02ba08a66b270e7350ee6e6 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 27 Aug 2023 21:22:41 -0700 Subject: [PATCH 045/157] fix: Remove unused imports, reorder imports Library imports first, local imports second separated by line break --- client/src/components/ProjectForm.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index be0fb125c..b24537c0c 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,17 +1,11 @@ import React, { useState } from 'react'; import { Link, useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; -import ProjectApiService from '../api/ProjectApiService'; - -import { ReactComponent as EditIcon } from '../svg/Icon_Edit.svg'; -import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; import { Redirect } from 'react-router-dom'; import { Typography, Box, Divider, - TextField, - InputLabel, Button, Grid, Radio, @@ -20,7 +14,11 @@ import { RadioGroup, } from '@mui/material'; import { styled } from '@mui/material/styles'; + import useAuth from '../hooks/useAuth'; +import ProjectApiService from '../api/ProjectApiService'; +import { ReactComponent as EditIcon } from '../svg/Icon_Edit.svg'; +import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; import ValidatedTextField from './parts/form/ValidatedTextField'; /** STYLES From aa6d7e8bd6d60bab0e769b72cd4f86a3a58e068f Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 27 Aug 2023 21:04:14 -0700 Subject: [PATCH 046/157] asset: Add JSDoc description to ValidatedTextField --- .../components/parts/form/ValidatedTextField.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/client/src/components/parts/form/ValidatedTextField.js b/client/src/components/parts/form/ValidatedTextField.js index ad4e236c3..b6fc6c5b2 100644 --- a/client/src/components/parts/form/ValidatedTextField.js +++ b/client/src/components/parts/form/ValidatedTextField.js @@ -1,6 +1,20 @@ import React from 'react'; import { Box, Grid, InputLabel, TextField } from "@mui/material"; +/** + * A validated text field component for forms. + * + * @component + * @param {Object} props - The component props. + * @param {Function} props.register - Function used for registering the input field with react-hook-form. + * @param {Object} props.errors - Object containing form validation errors. + * @param {boolean} props.isEdit - Boolean indicating if the form is in edit mode. + * @param {boolean} props.editMode - Boolean indicating if the component is in edit mode. + * @param {string} props.locationType - The type of location. + * @param {ReactNode} props.locationRadios - Radio Buttons for selecting location type. + * @param {Object} props.input - The input configuration for the text field. + * @returns {ReactElement} The rendered component. + */ function ValidatedTextField({ register, errors, From 68b8205a56958edd3b2d5f8dac2ff8e60696c0aa Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 28 Aug 2023 11:26:19 -0700 Subject: [PATCH 047/157] update description validation --- client/src/components/manageProjects/addProject.js | 2 ++ client/src/components/manageProjects/editProject.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.js index d7209dfe0..15deb98cc 100644 --- a/client/src/components/manageProjects/addProject.js +++ b/client/src/components/manageProjects/addProject.js @@ -15,6 +15,8 @@ function addProject() { name: 'description', type: 'textarea', placeholder: 'Enter project description', + value: /^[a-zA-Z0-9].{0,250}$/, + errorMessage: 'Description must start with alphanumeric characters, 250 char limit' }, { label: 'Location', diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index fd53d7361..b87679655 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -67,6 +67,8 @@ const EditProject = ({ name: 'description', type: 'textarea', value: projectToEdit.description, + value: /^[a-zA-Z0-9].{0,250}$/, + errorMessage: 'Description must start with alphanumeric characters, 250 char limit' }, { label: 'Location', From 56816ea394a94e7df6eb3017d7b47e29e1e4f19b Mon Sep 17 00:00:00 2001 From: Joshua Bubar Date: Mon, 28 Aug 2023 20:28:59 -0700 Subject: [PATCH 048/157] fix: add back project fields hfla website url and github identifier --- .../components/manageProjects/addProject.js | 26 +++++++++---------- .../components/manageProjects/editProject.js | 26 +++++++++---------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.js index d7209dfe0..ba6d9052a 100644 --- a/client/src/components/manageProjects/addProject.js +++ b/client/src/components/manageProjects/addProject.js @@ -26,13 +26,12 @@ function addProject() { addressValue: '', addressError: 'Invalid address', }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'GitHub Identifier', - // name: 'githubIdentifier', - // type: 'text', - // placeholder: 'Enter GitHub identifier', - // }, + { + label: 'GitHub Identifier', + name: 'githubIdentifier', + type: 'text', + placeholder: 'Enter GitHub identifier', + }, { label: 'GitHub URL', name: 'githubUrl', @@ -51,13 +50,12 @@ function addProject() { type: 'text', placeholder: 'htttps://drive.google.com/', }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'HFLA Website URL', - // name: 'hflaWebsiteUrl', - // type: 'text', - // placeholder: 'htttps://hackforla.org/projects/', - // }, + { + label: 'HFLA Website URL', + name: 'hflaWebsiteUrl', + type: 'text', + placeholder: 'htttps://hackforla.org/projects/', + }, ]; return ( diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index fd53d7361..3663e6e28 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -77,13 +77,12 @@ const EditProject = ({ addressValue: '', addressError: 'Invalid address', }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'GitHub Identifier', - // name: 'githubIdentifier', - // type: 'text', - // placeholder: 'Enter GitHub identifier', - // }, + { + label: 'GitHub Identifier', + name: 'githubIdentifier', + type: 'text', + placeholder: 'Enter GitHub identifier', + }, { label: 'GitHub URL', name: 'githubUrl', @@ -102,13 +101,12 @@ const EditProject = ({ type: 'text', value: projectToEdit.googleDriveUrl, }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'HFLA Website URL', - // name: 'hflaWebsiteUrl', - // type: 'text', - // value: projectToEdit.hflaWebsiteUrl, - // }, + { + label: 'HFLA Website URL', + name: 'hflaWebsiteUrl', + type: 'text', + value: projectToEdit.hflaWebsiteUrl, + }, ]; // Get project recurring events when component loads From 5356b13964b56a0d8c3a72eded0067bc9418064a Mon Sep 17 00:00:00 2001 From: Stephen Saldana Date: Mon, 28 Aug 2023 20:03:15 -0700 Subject: [PATCH 049/157] created data.js and copied simpleInputs from addProject.js --- client/src/components/data.js | 56 +++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 client/src/components/data.js diff --git a/client/src/components/data.js b/client/src/components/data.js new file mode 100644 index 000000000..1163d3280 --- /dev/null +++ b/client/src/components/data.js @@ -0,0 +1,56 @@ +export const simpleInputs = [ + { + label: 'Project Name', + name: 'name', + type: 'text', + placeholder: 'Enter project name' + }, + { + label: 'Project Description', + name: 'description', + type: 'textarea', + placeholder: 'Enter project description' + }, + { + label: 'Location', + name: 'location', + type: 'text', + placeholder: 'Enter location for meeting', + value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, + errorMessage: 'Please enter a valid Zoom URL', + addressValue: '', + addressError: 'Invalid address' + }, + // Leaving incase we want to add this back in for updating projects + // { + // label: 'GitHub Identifier', + // name: 'githubIdentifier', + // type: 'text', + // placeholder: 'Enter GitHub identifier', + // }, + { + label: 'GitHub URL', + name: 'githubUrl', + type: 'text', + placeholder: 'htttps://github.com/' + }, + { + label: 'Slack Channel Link', + name: 'slackUrl', + type: 'text', + placeholder: 'htttps://slack.com/' + }, + { + label: 'Google Drive URL', + name: 'googleDriveUrl', + type: 'text', + placeholder: 'htttps://drive.google.com/' + } + // Leaving incase we want to add this back in for updating projects + // { + // label: 'HFLA Website URL', + // name: 'hflaWebsiteUrl', + // type: 'text', + // placeholder: 'htttps://hackforla.org/projects/', + // }, +] From 471f1f76415535996d06a3a3e47347d3ff51b6f2 Mon Sep 17 00:00:00 2001 From: Stephen Saldana Date: Mon, 28 Aug 2023 20:51:50 -0700 Subject: [PATCH 050/157] first draft commit --- client/src/components/data.js | 43 +++++++------- .../components/manageProjects/addProject.js | 57 +------------------ .../components/manageProjects/editProject.js | 56 +----------------- 3 files changed, 23 insertions(+), 133 deletions(-) diff --git a/client/src/components/data.js b/client/src/components/data.js index 1163d3280..c00380228 100644 --- a/client/src/components/data.js +++ b/client/src/components/data.js @@ -1,15 +1,16 @@ +// Array filled with default inputs. export const simpleInputs = [ { label: 'Project Name', name: 'name', type: 'text', - placeholder: 'Enter project name' + placeholder: 'Enter project name', }, { label: 'Project Description', name: 'description', type: 'textarea', - placeholder: 'Enter project description' + placeholder: 'Enter project description', }, { label: 'Location', @@ -19,38 +20,36 @@ export const simpleInputs = [ value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, errorMessage: 'Please enter a valid Zoom URL', addressValue: '', - addressError: 'Invalid address' + addressError: 'Invalid address', + }, + { + label: 'GitHub Identifier', + name: 'githubIdentifier', + type: 'text', + placeholder: 'Enter GitHub identifier', }, - // Leaving incase we want to add this back in for updating projects - // { - // label: 'GitHub Identifier', - // name: 'githubIdentifier', - // type: 'text', - // placeholder: 'Enter GitHub identifier', - // }, { label: 'GitHub URL', name: 'githubUrl', type: 'text', - placeholder: 'htttps://github.com/' + placeholder: 'htttps://github.com/', }, { label: 'Slack Channel Link', name: 'slackUrl', type: 'text', - placeholder: 'htttps://slack.com/' + placeholder: 'htttps://slack.com/', }, { label: 'Google Drive URL', name: 'googleDriveUrl', type: 'text', - placeholder: 'htttps://drive.google.com/' - } - // Leaving incase we want to add this back in for updating projects - // { - // label: 'HFLA Website URL', - // name: 'hflaWebsiteUrl', - // type: 'text', - // placeholder: 'htttps://hackforla.org/projects/', - // }, -] + placeholder: 'htttps://drive.google.com/', + }, + { + label: 'HFLA Website URL', + name: 'hflaWebsiteUrl', + type: 'text', + placeholder: 'htttps://hackforla.org/projects/', + }, +]; \ No newline at end of file diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.js index ba6d9052a..ddec883be 100644 --- a/client/src/components/manageProjects/addProject.js +++ b/client/src/components/manageProjects/addProject.js @@ -1,63 +1,8 @@ import React from 'react'; import ProjectForm from '../ProjectForm'; +import { simpleInputs } from '../data'; function addProject() { - // Array filled with default inputs. - const simpleInputs = [ - { - label: 'Project Name', - name: 'name', - type: 'text', - placeholder: 'Enter project name', - }, - { - label: 'Project Description', - name: 'description', - type: 'textarea', - placeholder: 'Enter project description', - }, - { - label: 'Location', - name: 'location', - type: 'text', - placeholder: 'Enter location for meeting', - value: /https:\/\/[\w-]*\.?zoom.us\/(j|my)\/[\d\w?=-]+/, - errorMessage: 'Please enter a valid Zoom URL', - addressValue: '', - addressError: 'Invalid address', - }, - { - label: 'GitHub Identifier', - name: 'githubIdentifier', - type: 'text', - placeholder: 'Enter GitHub identifier', - }, - { - label: 'GitHub URL', - name: 'githubUrl', - type: 'text', - placeholder: 'htttps://github.com/', - }, - { - label: 'Slack Channel Link', - name: 'slackUrl', - type: 'text', - placeholder: 'htttps://slack.com/', - }, - { - label: 'Google Drive URL', - name: 'googleDriveUrl', - type: 'text', - placeholder: 'htttps://drive.google.com/', - }, - { - label: 'HFLA Website URL', - name: 'hflaWebsiteUrl', - type: 'text', - placeholder: 'htttps://hackforla.org/projects/', - }, - ]; - return (
    { if (recurringEvents) { From 469908dc684bd425a46dd9ecf31b807574c2d9e2 Mon Sep 17 00:00:00 2001 From: Stephen Saldana Date: Tue, 29 Aug 2023 12:46:02 -0700 Subject: [PATCH 051/157] MuiTextField paddingLeft 0.5em --- client/src/theme/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/theme/index.js b/client/src/theme/index.js index 75df741df..095beac8a 100644 --- a/client/src/theme/index.js +++ b/client/src/theme/index.js @@ -48,7 +48,7 @@ let theme = createTheme({ MuiTextField: { defaultProps: { inputProps: { - style: { width: '100%', color: uiKitColors.black, border: 'none' }, + style: { width: '100%', color: uiKitColors.black, border: 'none', paddingLeft: '0.5em' }, }, fullWidth: true, }, From 759b54622448e151331754a84ffacda2e9863725 Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 1 Sep 2023 12:52:31 -0700 Subject: [PATCH 052/157] update description validation --- client/src/components/data.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/components/data.js b/client/src/components/data.js index c00380228..c5e7a27b7 100644 --- a/client/src/components/data.js +++ b/client/src/components/data.js @@ -11,6 +11,8 @@ export const simpleInputs = [ name: 'description', type: 'textarea', placeholder: 'Enter project description', + value: /^[a-zA-Z0-9].{0,250}$/, + errorMessage: 'Description must start with alphanumeric characters, 250 char limit' }, { label: 'Location', From e721e324d7a0939a5df1fb3d23dd0fc039f8783a Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Fri, 1 Sep 2023 22:47:25 -0700 Subject: [PATCH 053/157] client/api: update user db email --- client/src/api/UserApiService.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/client/src/api/UserApiService.js b/client/src/api/UserApiService.js index 99d171741..d533f9aac 100644 --- a/client/src/api/UserApiService.js +++ b/client/src/api/UserApiService.js @@ -46,13 +46,29 @@ class UserApiService { const requestOptions = { method: 'PATCH', headers: this.headers, - body: JSON.stringify({ isActive }) + body: JSON.stringify({ isActive }), + }; + + try { + return await fetch(url, requestOptions); + } catch (err) { + console.error('update is-active error', err); + alert('server not responding. Please try again.'); } + } + + async updateUserDbEmail(userToEdit, email) { + const url = `${this.baseUserUrl}${userToEdit._id}`; + const requestOptions = { + method: 'PATCH', + headers: this.headers, + body: JSON.stringify({ email }), + }; try { return await fetch(url, requestOptions); } catch (err) { - console.error('update is-active error', err) + console.error('update use email error', err); alert('server not responding. Please try again.'); } } From 7447e5f114f64d8f9fecd51b995f5a7b4a2d0c8f Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Tue, 5 Sep 2023 14:17:24 -0700 Subject: [PATCH 054/157] feat: Update 'name' error message to be more clear --- .../manageProjects/utilities/validateEventForm.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/client/src/components/manageProjects/utilities/validateEventForm.js b/client/src/components/manageProjects/utilities/validateEventForm.js index e0d27fcaa..90b1febcc 100644 --- a/client/src/components/manageProjects/utilities/validateEventForm.js +++ b/client/src/components/manageProjects/utilities/validateEventForm.js @@ -11,13 +11,23 @@ const validateEventForm = (vals, projectToEdit) => { newErrors = { ...newErrors, name: 'Event name is required' }; } else if ( isWordInArrayInString( - ['meeting', 'mtg', projectToEdit.name.toLowerCase()], + ['meeting', 'mtg'], vals[key].toLowerCase() ) ) { newErrors = { ...newErrors, - name: "Event name cannot contain 'meeting' or 'mtg' or the project name", + name: "Event name cannot contain 'meeting' or 'mtg'", + }; + } else if ( + isWordInArrayInString( + [projectToEdit.name.toLowerCase()], + vals[key].toLowerCase() + ) + ) { + newErrors = { + ...newErrors, + name: `Event name cannot contain the Project Name: '${projectToEdit.name}'`, }; } break; From dbba2befe7c08804d53ad4b547fe739af5c85973 Mon Sep 17 00:00:00 2001 From: Brad Morgan Date: Tue, 5 Sep 2023 15:20:11 -0700 Subject: [PATCH 055/157] trim values before accessing DB (#1499) Co-authored-by: Brad --- backend/models/project.model.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/models/project.model.js b/backend/models/project.model.js index e345b2c4f..47421aa47 100644 --- a/backend/models/project.model.js +++ b/backend/models/project.model.js @@ -16,19 +16,19 @@ Idea for the future: programmingLanguages, numberGithubContributions (pull these */ const projectSchema = mongoose.Schema({ - name: { type: String }, - description: { type: String }, - githubIdentifier: { type: String }, + name: { type: String, trim: true }, + description: { type: String, trim: true }, + githubIdentifier: { type: String, trim: true }, projectStatus: { type: String }, // Active, Completed, or Paused - location: { type: String }, // DTLA, Westside, South LA, or Remote (hacknight) + location: { type: String, trim: true }, // DTLA, Westside, South LA, or Remote (hacknight) //teamMembers: { type: String }, // commented since we should be able to get this from Project Team Members table createdDate: { type: Date, default: Date.now }, // date/time project was created completedDate: { type: Date }, // only if Status = Completed, date/time completed - githubUrl: { type: String }, // link to main repo - slackUrl: { type: String }, // link to Slack channel - googleDriveUrl: { type: String }, + githubUrl: { type: String, trim: true }, // link to main repo + slackUrl: { type: String, trim: true }, // link to Slack channel + googleDriveUrl: { type: String, trim: true }, googleDriveId: { type: String }, - hflaWebsiteUrl: { type: String }, + hflaWebsiteUrl: { type: String, trim: true }, videoConferenceLink: { type: String }, lookingDescription: { type: String }, // narrative on what the project is looking for recruitingCategories: [{ type: String }], // same as global Skills picklist From 7c5eb558e1afc2ed78cd0b41658976c39db1a8c8 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Wed, 6 Sep 2023 16:04:57 -0700 Subject: [PATCH 056/157] nit: email -> lowercase --- client/src/api/UserApiService.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/api/UserApiService.js b/client/src/api/UserApiService.js index d533f9aac..d0c5506de 100644 --- a/client/src/api/UserApiService.js +++ b/client/src/api/UserApiService.js @@ -59,10 +59,11 @@ class UserApiService { async updateUserDbEmail(userToEdit, email) { const url = `${this.baseUserUrl}${userToEdit._id}`; + const lowercaseEmail = email.toLowerCase(); const requestOptions = { method: 'PATCH', headers: this.headers, - body: JSON.stringify({ email }), + body: JSON.stringify({ lowercaseEmail }), }; try { From b4c00586a050cbc46bd0e365bfdf5a231643e673 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 6 Sep 2023 17:33:37 -0700 Subject: [PATCH 057/157] feat: Add missing fields to add/edit form hflaWebsiteUrl, githubIdentifier --- client/src/api/ProjectApiService.js | 4 ++++ client/src/components/manageProjects/editProject.js | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/client/src/api/ProjectApiService.js b/client/src/api/ProjectApiService.js index 949bd5ee0..f25711c0e 100644 --- a/client/src/api/ProjectApiService.js +++ b/client/src/api/ProjectApiService.js @@ -31,6 +31,8 @@ class ProjectApiService { githubUrl, slackUrl, googleDriveUrl, + hflaWebsiteUrl, + githubIdentifier, } = projectData; const requestOptions = { method: 'POST', @@ -42,6 +44,8 @@ class ProjectApiService { githubUrl, slackUrl, googleDriveUrl, + hflaWebsiteUrl, + githubIdentifier, projectStatus: 'Active', }), }; diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 079b38bf2..23d0b92db 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -25,11 +25,11 @@ const EditProject = ({ name: projectToEdit.name, description: projectToEdit.description, location: projectToEdit.location, - // githubIdentifier: projectToEdit.name, + githubIdentifier: projectToEdit.githubIdentifier, githubUrl: projectToEdit.githubUrl, slackUrl: projectToEdit.slackUrl, googleDriveUrl: projectToEdit.googleDriveUrl, - // hflaWebsiteUrl: projectToEdit.name, + hflaWebsiteUrl: projectToEdit.hflaWebsiteUrl, }); // eslint-disable-next-line no-unused-vars From 1b6557345794c1630716507d4c446ec19bda40ec Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 6 Sep 2023 18:00:06 -0700 Subject: [PATCH 058/157] feat: Whitelist 'onboarding' in event validation --- .../manageProjects/utilities/validateEventForm.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/client/src/components/manageProjects/utilities/validateEventForm.js b/client/src/components/manageProjects/utilities/validateEventForm.js index 90b1febcc..dbee835f9 100644 --- a/client/src/components/manageProjects/utilities/validateEventForm.js +++ b/client/src/components/manageProjects/utilities/validateEventForm.js @@ -1,5 +1,6 @@ import validator from 'validator'; import { isWordInArrayInString } from './../../../utils/stringUtils.js'; +import { el } from 'date-fns/locale'; const validateEventForm = (vals, projectToEdit) => { let newErrors = {}; @@ -25,10 +26,14 @@ const validateEventForm = (vals, projectToEdit) => { vals[key].toLowerCase() ) ) { - newErrors = { - ...newErrors, - name: `Event name cannot contain the Project Name: '${projectToEdit.name}'`, - }; + if (projectToEdit.name.toLowerCase() === 'onboarding') { + // Do nothing, word `onboarding` has been white-listed + } else { + newErrors = { + ...newErrors, + name: `Event name cannot contain the Project Name: '${projectToEdit.name}'`, + }; + } } break; From 526393f4562ef05e838940d317ad4e9b305aac53 Mon Sep 17 00:00:00 2001 From: Trillium S Date: Wed, 6 Sep 2023 18:22:02 -0700 Subject: [PATCH 059/157] feat: Drop changes to EditableField.js --- .../components/manageProjects/editableField.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/client/src/components/manageProjects/editableField.js b/client/src/components/manageProjects/editableField.js index 6901f5cf2..bcf1066e0 100644 --- a/client/src/components/manageProjects/editableField.js +++ b/client/src/components/manageProjects/editableField.js @@ -1,8 +1,4 @@ import React, { useState, useRef, useEffect } from 'react'; -import { - validateEditableField, - generateErrorEditableField, -} from './utilities/validateEditableField'; import '../../sass/ManageProjects.scss'; const EditableField = ({ @@ -31,12 +27,6 @@ const EditableField = ({ className: 'editable-field', onBlur: () => { setEditable(false); - if (!validateEditableField(fieldName, fieldValue)) { - alert(generateErrorEditableField(fieldName)); - return; - } - let trimmedFieldValue = fieldValue.trim(); - setFieldValue(trimmedFieldValue); updateProject(fieldName, fieldValue); }, onChange: ({ target }) => { @@ -57,7 +47,7 @@ const EditableField = ({
    {fieldTitle} - {notRestricted && ( + {notRestricted && - )} + }
    + {editable ? ( <> {fieldType === 'textarea' ? ( From 7ffd4e0f829dbacecbf5ce87a89f899206cb8df4 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 6 Sep 2023 23:40:31 -0700 Subject: [PATCH 060/157] feat: Creat waiting-to-merge action Prevents merging when a `waiting to merge` label is applied --- .github/workflows/waiting-to-merge.yaml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/waiting-to-merge.yaml diff --git a/.github/workflows/waiting-to-merge.yaml b/.github/workflows/waiting-to-merge.yaml new file mode 100644 index 000000000..9b41dc9ac --- /dev/null +++ b/.github/workflows/waiting-to-merge.yaml @@ -0,0 +1,17 @@ +name: Waiting to Merge + +on: + pull_request: + types: [synchronize, opened, reopened, labeled, unlabeled] + +jobs: + do-not-merge: + if: ${{ contains(github.event.*.labels.*.name, 'waiting to merge') }} + name: Prevent Merging + runs-on: ubuntu-latest + steps: + - name: Check for label + run: | + echo "Pull request is labeled as 'waiting to merge'" + echo "This workflow fails so that the pull request cannot be merged" + exit 1 From dd1b4c46070fcbf31d17fc094558bfc7d3281259 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 10 Sep 2023 00:04:41 -0700 Subject: [PATCH 061/157] feat: Create TitledBox component --- .../src/components/parts/boxes/TitledBox.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 client/src/components/parts/boxes/TitledBox.js diff --git a/client/src/components/parts/boxes/TitledBox.js b/client/src/components/parts/boxes/TitledBox.js new file mode 100644 index 000000000..3d248991d --- /dev/null +++ b/client/src/components/parts/boxes/TitledBox.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { Box, Typography, Divider } from '@mui/material'; + +export default function TitledBox({ title, children, badge, childrenBoxSx }) { + return ( + + + + + {title} + + + {badge} + + + {children} + + ); + + +} \ No newline at end of file From df46e9a10fb192aee92f256f00543fbde5059601 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 10 Sep 2023 00:06:39 -0700 Subject: [PATCH 062/157] feat: Swap in TitleBox for refactored components --- .../components/manageProjects/editProject.js | 51 +++++++------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 23d0b92db..47e13405b 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -4,6 +4,7 @@ import CreateNewEvent from './createNewEvent'; import readableEvent from './utilities/readableEvent'; import ProjectForm from '../ProjectForm'; import { simpleInputs } from '../data'; +import TitledBox from '../parts/boxes/TitledBox'; import { ReactComponent as EditIcon } from '../../svg/Icon_Edit.svg'; import { ReactComponent as PlusIcon } from '../../svg/PlusIcon.svg'; @@ -49,7 +50,7 @@ const EditProject = ({ regularEvents // eslint-disable-next-line no-underscore-dangle .filter((e) => e?.project?._id === projectToEdit._id) - .map((item) => ({...item, ...readableEvent(item), raw: item})) + .map((item) => ({ ...item, ...readableEvent(item), raw: item })) .reverse() // sorts most recent events first ); } @@ -155,44 +156,26 @@ const EditProject = ({ - - - - - Manually Edit Events Checkin - - - - - -
    -

    {eventAlert}

    -
      - {regularEventsState.map((event, index) => ( - - // eslint-dis able-next-line no-underscore-dangle - - ))} -
    -
    -
    - -
    + +
    +

    {eventAlert}

    +
      + {regularEventsState.map((event, index) => ( + + // eslint-dis able-next-line no-underscore-dangle + + ))} +
    +
    +
    ); }; -function RegularEvent({event, updateRegularEvent}) { +function RegularEvent({ event, updateRegularEvent }) { return (
  • - -
  • - ))} - -
    - {/*
    */} - - +
    +
    {`${event.description}`}
    + + + ))} + +
    +
    From 08e0b5155dc473b4b8a2a3679dc31ec55046381a Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 10 Sep 2023 01:16:04 -0700 Subject: [PATCH 064/157] feat: Refactor ProjectForm to use TitledBox --- client/src/components/ProjectForm.js | 103 +++++++++++++-------------- 1 file changed, 48 insertions(+), 55 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index b24537c0c..2837f206f 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -20,6 +20,7 @@ import ProjectApiService from '../api/ProjectApiService'; import { ReactComponent as EditIcon } from '../svg/Icon_Edit.svg'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; import ValidatedTextField from './parts/form/ValidatedTextField'; +import TitledBox from './parts/boxes/TitledBox'; /** STYLES * -most TextField and InputLabel styles are controlled by the theme @@ -172,7 +173,7 @@ export default function ProjectForm({ }} onClick={handleEditMode} > - + {editMode ? 'Cancel' : 'Edit Mode'} @@ -217,63 +218,55 @@ export default function ProjectForm({ Project Management - - - - - {editMode ? 'Editing Project' : 'Project Information'} - - - {isEdit ? editIcon() : addIcon()} - - - -
    { - isEdit ? submitEditProject(data) : submitNewProject(data); - })} - > - {arr.map((input) => ( - + { + isEdit ? submitEditProject(data) : submitNewProject(data); + })} + > + {arr.map((input) => ( + - ))} - - - - - - Save - - - - - Close - - + ))} + + + + + + Save + - + + + Close + + + -
    +
    ) : ( From 5ce66803773610a3321083447c6809014184475c Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 10 Sep 2023 01:26:02 -0700 Subject: [PATCH 065/157] feat: Refactor ProjectList to use TitledBox --- client/src/pages/ProjectList.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/client/src/pages/ProjectList.js b/client/src/pages/ProjectList.js index fb14d1593..3c408e069 100644 --- a/client/src/pages/ProjectList.js +++ b/client/src/pages/ProjectList.js @@ -12,6 +12,7 @@ import { Button, } from '@mui/material'; import { Link } from 'react-router-dom'; +import TitledBox from '../components/parts/boxes/TitledBox'; const StyledTypography = styled(Typography)({ textTransform: 'uppercase', @@ -98,12 +99,7 @@ export default function ProjectList() { )} - - - Active Projects - - - + {projects.map((project) => ( ))} - - + ); } From dc0f60217977f3a9d8e0e8530962f532dc5c6495 Mon Sep 17 00:00:00 2001 From: Phillip Sanchez Date: Sat, 23 Sep 2023 12:28:20 -0700 Subject: [PATCH 066/157] Create bug report template --- .github/ISSUE_TEMPLATE/bug-report.yml | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000..8d1a03a33 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,64 @@ +name: 'Bug Report' +description: 'Bug report HackforLA issue form.' + +body: + - type: textarea + id: description + attributes: + label: Describe the Bug + description: Clearly state the bug + validations: + required: true + - type: dropdown + id: feature + attributes: + label: Feature + description: Select a feature related to the bug + options: + - AWS + - Brand + - Login + - Users + - Agenda + - Check in + - Database + - Dashboard + - Marketing + - Onboarding + - Repo Update + - Documentation + - GitHub Actions + - GitHub Hygiene + - Infrastructure + - Package Update + - ESLint Warnings + - Form validation + - Recurring Events + - Project Management + - Account Setup Automation + - Meeting Time Change Ticket + - Add/Remove PM access + validations: + required: true + - type: textarea + id: replicate + attributes: + label: How to Replicate + description: Clearly state how to replicate the bug + validations: + required: true + - type: dropdown + id: notification + attributes: + label: Request notification after bug squashing + description: Request notification after a bug is squashed + options: + - Yes + - No + validations: + required: true + - type: textarea + id: resource + attributes: + label: Resources/Information + description: Include any important resources/information \ No newline at end of file From 652eb59ce43bb1e273c70653bb3f576975d43a6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 20:03:53 +0000 Subject: [PATCH 067/157] build(deps-dev): bump debug from 4.2.0 to 4.3.1 in /backend Bumps [debug](https://github.com/debug-js/debug) from 4.2.0 to 4.3.1. - [Release notes](https://github.com/debug-js/debug/releases) - [Commits](https://github.com/debug-js/debug/compare/4.2.0...4.3.1) --- updated-dependencies: - dependency-name: debug dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- backend/package.json | 2 +- backend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/package.json b/backend/package.json index ff91edf63..5fe900b1b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -21,7 +21,7 @@ "@babel/eslint-plugin": "^7.14.5", "@shelf/jest-mongodb": "^1.2.3", "concurrently": "^5.1.0", - "debug": "^4.1.1", + "debug": "^4.3.1", "eslint": "^7.9.0", "eslint-config-airbnb": "^18.2.0", "eslint-config-airbnb-base": "^14.2.0", diff --git a/backend/yarn.lock b/backend/yarn.lock index e84566ec3..0ffb3a67d 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2005,10 +2005,10 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" From 9ed921438b826cd81c28a9d2db85043ac92639b0 Mon Sep 17 00:00:00 2001 From: Evan Yang Date: Fri, 6 Oct 2023 16:37:03 -0700 Subject: [PATCH 068/157] feat: delay the 'sorry not working' msg --- client/src/components/auth/HandleAuth.js | 52 +++++++++++++++--------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/client/src/components/auth/HandleAuth.js b/client/src/components/auth/HandleAuth.js index ac142f6da..4c9d6abb4 100644 --- a/client/src/components/auth/HandleAuth.js +++ b/client/src/components/auth/HandleAuth.js @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { Redirect } from 'react-router-dom'; import { isValidToken } from '../../services/user.service'; -import {authLevelRedirect} from '../../utils/authUtils' +import { authLevelRedirect } from '../../utils/authUtils'; import '../../sass/MagicLink.scss'; import useAuth from '../../hooks/useAuth'; @@ -17,47 +17,59 @@ const HandleAuth = (props) => { const params = new URLSearchParams(search); const api_token = params.get('token'); - if(!api_token) return; + if (!api_token) return; isValidToken(api_token).then((isValid) => { - setMagicLink(isValid) + setMagicLink(isValid); }); }, [props.location.search]); // Step 2: Refresh user auth (requires valid Magic Link) useEffect(() => { - if(!isMagicLinkValid) return; - if(!auth?.isError) return; + if (!isMagicLinkValid) return; + if (!auth?.isError) return; refreshAuth(); - },[isMagicLinkValid, refreshAuth, auth]) + }, [isMagicLinkValid, refreshAuth, auth]); // Step 3: Set IsLoaded value to render Component useEffect(() => { - if(!isMagicLinkValid) { + if (!isMagicLinkValid) { setIsLoaded(true); return; - }; + } + + if (!auth || auth.isError) return; - if(!auth || auth.isError) return; - setIsLoaded(true); - },[isMagicLinkValid, setIsLoaded, auth]) + }, [isMagicLinkValid, setIsLoaded, auth]); + + if (!isLoaded) return
    Loading...
    ; + + const Delayed = ({ children, waitBeforeShow = 500 }) => { + const [isShown, setIsShown] = useState(false); + useEffect(() => { + const timer = setTimeout(() => { + setIsShown(true); + }, waitBeforeShow); + + return () => clearTimeout(timer); + }, [waitBeforeShow]); + + return isShown ? children : null; + }; - if(!isLoaded) - return ( -
    Loading...
    - ); + let loginRedirect = ''; if (auth?.user) { - const loginRedirect = authLevelRedirect(auth.user); - return ( - - ); + loginRedirect = authLevelRedirect(auth.user); } return (
    -
    Sorry, the link is not valid anymore.
    + +
    Sorry, the link is not valid anymore.
    +
    + {auth?.user && /* Redirect to /welcome */}
    ); }; From 3556baef255acc2669dee9b196f9705150b54f78 Mon Sep 17 00:00:00 2001 From: Brad Morgan Date: Mon, 9 Oct 2023 19:55:10 -0700 Subject: [PATCH 069/157] 1086/security issues verified (#1521) * add verification check before mutations * remove log * cleanup unused imports * update tests * update Update and Read tests * move vble to env file * undo secret removal --------- Co-authored-by: Brad Co-authored-by: Trillium S --- backend/middleware/user.middleware.js | 2 +- backend/routers/projects.router.js | 7 +- backend/routers/projects.router.test.js | 148 +++++++++++++++++- backend/routers/recurringEvents.router.js | 7 +- client/src/App.js | 2 - client/src/components/ProjectForm.js | 1 - .../components/manageProjects/editProject.js | 2 +- .../utilities/validateEventForm.js | 1 - client/src/pages/ProjectList.js | 1 - 9 files changed, 152 insertions(+), 19 deletions(-) diff --git a/backend/middleware/user.middleware.js b/backend/middleware/user.middleware.js index 6e675313c..4d419ab90 100644 --- a/backend/middleware/user.middleware.js +++ b/backend/middleware/user.middleware.js @@ -15,7 +15,7 @@ function isAdminByEmail(req, res, next) { return res.sendStatus(400); } else { const role = user.accessLevel; - if (req.get('origin').includes('3001') || role === 'admin' || user.managedProjects.length > 0) { + if (role === 'admin' || user.managedProjects.length > 0) { next(); } else { next(res.sendStatus(401)); diff --git a/backend/routers/projects.router.js b/backend/routers/projects.router.js index f0762b834..cfa217b07 100644 --- a/backend/routers/projects.router.js +++ b/backend/routers/projects.router.js @@ -2,17 +2,18 @@ const express = require("express"); const router = express.Router(); const { ProjectController } = require('../controllers'); +const { AuthUtil } = require("../middleware"); // The base is /api/projects router.get('/', ProjectController.project_list); -router.post('/', ProjectController.create); +router.post('/', AuthUtil.verifyCookie, ProjectController.create); router.get('/:ProjectId', ProjectController.project_by_id); -router.put('/:ProjectId', ProjectController.update); +router.put('/:ProjectId', AuthUtil.verifyCookie, ProjectController.update); -router.patch('/:ProjectId', ProjectController.update); +router.patch('/:ProjectId', AuthUtil.verifyCookie, ProjectController.update); module.exports = router; diff --git a/backend/routers/projects.router.test.js b/backend/routers/projects.router.test.js index b4abbc6ee..e7ebf7129 100644 --- a/backend/routers/projects.router.test.js +++ b/backend/routers/projects.router.test.js @@ -1,18 +1,58 @@ const supertest = require('supertest'); const app = require('../app'); const request = supertest(app); +const jwt = require('jsonwebtoken'); +const { CONFIG_AUTH } = require('../config'); + const { setupDB } = require('../setup-test'); setupDB('api-projects'); -const { Project } = require('../models'); +const { Project, User } = require('../models'); const CONFIG = require('../config/auth.config'); const headers = {}; headers['x-customrequired-header'] = CONFIG.CUSTOM_REQUEST_HEADER; headers.Accept = 'application/json'; +headers.authorization = 'Bearer sometoken'; + +let token; + describe('CREATE', () => { + beforeAll( async () => { + const submittedData = { + name: { + firstName: 'test', + lastName: 'user', + }, + email: 'newtest@test.com', + }; + const user = await User.create(submittedData); + const auth_origin = 'TEST'; + token = jwt.sign( + { id: user.id, role: user.accessLevel, auth_origin }, + CONFIG_AUTH.SECRET, + { + expiresIn: `${CONFIG_AUTH.TOKEN_EXPIRATION_SEC}s`, + }, + ); + }) + test('Create a Project with POST to /api/projects/ without token', async (done) => { + // Test Data + const submittedData = { + name: 'projectName', + }; + + // Submit a project + const res = await request + .post('/api/projects/') + .set(headers) + .send(submittedData); + expect(res.status).toBe(401); + done(); + }); + test('Create a Project with POST to /api/projects/', async (done) => { // Test Data const submittedData = { @@ -23,6 +63,7 @@ describe('CREATE', () => { const res = await request .post('/api/projects/') .set(headers) + .set('Cookie', [`token=${token}`] ) .send(submittedData); expect(res.status).toBe(201); done(); @@ -40,6 +81,7 @@ describe('READ', () => { const res = await request .post('/api/projects/') .set(headers) + .set('Cookie', [`token=${token}`]) .send(submittedData); expect(res.status).toBe(201); @@ -54,7 +96,25 @@ describe('READ', () => { }); describe('UPDATE', () => { - test('Update a project with PATCH to /api/projects/:id', async (done) => { + beforeAll(async () => { + const submittedData = { + name: { + firstName: 'test', + lastName: 'user', + }, + email: 'newtest@test.com', + }; + const user = await User.create(submittedData); + const auth_origin = 'TEST'; + token = jwt.sign( + { id: user.id, role: user.accessLevel, auth_origin }, + CONFIG_AUTH.SECRET, + { + expiresIn: `${CONFIG_AUTH.TOKEN_EXPIRATION_SEC}s`, + }, + ); + }) + test('Update a project with PATCH to /api/projects/:id without a token', async (done) => { // Test Data const submittedData = { name: 'projectName', @@ -64,6 +124,7 @@ describe('UPDATE', () => { const res = await request .post('/api/projects/') .set(headers) + .set('Cookie', [`token=${token}`]) .send(submittedData); expect(res.status).toBe(201); @@ -76,10 +137,44 @@ describe('UPDATE', () => { .put(`/api/projects/${res.body._id}`) .set(headers) .send(updatedDataPayload); - expect(res2.status).toBe(200); + expect(res2.status).toBe(401); + + // Get project + const res3 = await request.get(`/api/projects/${res.body._id}`) + .set(headers); + expect(res3.status).toBe(200); + done(); + }); + test('Update a project with PATCH to /api/projects/:id with a token', async (done) => { + // Test Data + const submittedData = { + name: 'projectName', + }; + + // Submit a project + const res = await request + .post('/api/projects/') + .set(headers) + .set('Cookie', [`token=${token}`]) + .send(submittedData); + expect(res.status).toBe(201); + + const updatedDataPayload = { + name: 'updatedProjectName', + }; + + // Update project + const res2 = await request + .put(`/api/projects/${res.body._id}`) + .set(headers) + .set('Cookie', [`token=${token}`]) + .send(updatedDataPayload); + expect(res2.status).toBe(200) // Get project - const res3 = await request.get(`/api/projects/${res.body._id}`).set(headers); + const res3 = await request.get(`/api/projects/${res.body._id}`) + .set(headers) + .set('Cookie', [`token=${token}`]) expect(res3.status).toBe(200); const APIData = res3.body; @@ -89,7 +184,45 @@ describe('UPDATE', () => { }); describe('DELETE', () => { - test('Delete a project with POST to /api/projects/:id', async (done) => { + beforeAll(async () => { + const submittedData = { + name: { + firstName: 'test', + lastName: 'user', + }, + email: 'newtest@test.com', + }; + const user = await User.create(submittedData); + const auth_origin = 'TEST'; + token = jwt.sign( + { id: user.id, role: user.accessLevel, auth_origin }, + CONFIG_AUTH.SECRET, + { + expiresIn: `${CONFIG_AUTH.TOKEN_EXPIRATION_SEC}s`, + }, + ); + }) + test('Delete a project with POST to /api/projects/:id without a token', async (done) => { + // Test Data + const submittedData = { + name: 'projectName', + }; + + // Submit a project + const res = await request + .post('/api/projects/') + .set(headers) + .set('Cookie', [`token=${token}`]) + .send(submittedData); + expect(res.status).toBe(201); + + // Delete project + const res2 = await request.patch(`/api/projects/${res.body._id}`) + .set(headers); + expect(res2.status).toBe(401); + done(); +}); + test('Delete a project with POST to /api/projects/:id with a token', async (done) => { // Test Data const submittedData = { name: 'projectName', @@ -99,11 +232,14 @@ describe('DELETE', () => { const res = await request .post('/api/projects/') .set(headers) + .set('Cookie', [`token=${token}`]) .send(submittedData); expect(res.status).toBe(201); // Delete project - const res2 = await request.patch(`/api/projects/${res.body._id}`).set(headers); + const res2 = await request.patch(`/api/projects/${res.body._id}`) + .set(headers) + .set('Cookie', [`token=${token}`]) expect(res2.status).toBe(200); done(); }); diff --git a/backend/routers/recurringEvents.router.js b/backend/routers/recurringEvents.router.js index 66e5ab7db..23481745d 100644 --- a/backend/routers/recurringEvents.router.js +++ b/backend/routers/recurringEvents.router.js @@ -4,6 +4,7 @@ const cors = require('cors'); const { RecurringEvent } = require('../models/recurringEvent.model'); const { RecurringEventController } = require('../controllers/'); +const { AuthUtil } = require('../middleware'); // GET /api/recurringevents/ router.get('/', cors(), (req, res) => { @@ -34,10 +35,10 @@ router.get('/:id', (req, res) => { }); }); -router.post('/', RecurringEventController.create); +router.post('/', AuthUtil.verifyCookie, RecurringEventController.create); -router.patch('/:RecurringEventId', RecurringEventController.update); +router.patch('/:RecurringEventId', AuthUtil.verifyCookie, RecurringEventController.update); -router.delete('/:RecurringEventId', RecurringEventController.destroy); +router.delete('/:RecurringEventId', AuthUtil.verifyCookie, RecurringEventController.destroy); module.exports = router; diff --git a/client/src/App.js b/client/src/App.js index d610b188b..82fdf5baa 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -26,8 +26,6 @@ import HealthCheck from './pages/HealthCheck'; import SecretPassword from './pages/SecretPassword'; import UserWelcome from './pages/UserWelcome'; -import ProjectForm from './components/ProjectForm'; - import { ThemeProvider } from '@mui/material'; import theme from './theme'; diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 2837f206f..309f1c109 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -5,7 +5,6 @@ import { Redirect } from 'react-router-dom'; import { Typography, Box, - Divider, Button, Grid, Radio, diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 8be19e9a8..399bc3ab0 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -9,7 +9,7 @@ import TitledBox from '../parts/boxes/TitledBox'; import { ReactComponent as EditIcon } from '../../svg/Icon_Edit.svg'; import { ReactComponent as PlusIcon } from '../../svg/PlusIcon.svg'; -import { Typography, Box, Divider } from '@mui/material'; +import { Typography, Box } from '@mui/material'; // Need to hold user state to check which type of user they are and conditionally render editing fields in this component // for user level block access to all except for the ones checked diff --git a/client/src/components/manageProjects/utilities/validateEventForm.js b/client/src/components/manageProjects/utilities/validateEventForm.js index dbee835f9..6128e1b03 100644 --- a/client/src/components/manageProjects/utilities/validateEventForm.js +++ b/client/src/components/manageProjects/utilities/validateEventForm.js @@ -1,6 +1,5 @@ import validator from 'validator'; import { isWordInArrayInString } from './../../../utils/stringUtils.js'; -import { el } from 'date-fns/locale'; const validateEventForm = (vals, projectToEdit) => { let newErrors = {}; diff --git a/client/src/pages/ProjectList.js b/client/src/pages/ProjectList.js index 3c408e069..79e731f07 100644 --- a/client/src/pages/ProjectList.js +++ b/client/src/pages/ProjectList.js @@ -8,7 +8,6 @@ import { Box, CircularProgress, Typography, - Divider, Button, } from '@mui/material'; import { Link } from 'react-router-dom'; From 920bf536eafaa5335e95ecfbc1a14b64b5fc1e64 Mon Sep 17 00:00:00 2001 From: Brad Date: Wed, 11 Oct 2023 13:13:50 -0700 Subject: [PATCH 070/157] add new fields to edit project form --- client/src/components/data.js | 35 ++++++++++++++++++- .../components/manageProjects/editProject.js | 4 +-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/client/src/components/data.js b/client/src/components/data.js index c5e7a27b7..ad609c174 100644 --- a/client/src/components/data.js +++ b/client/src/components/data.js @@ -54,4 +54,37 @@ export const simpleInputs = [ type: 'text', placeholder: 'htttps://hackforla.org/projects/', }, -]; \ No newline at end of file +]; + +export const additionalInputsForEdit = [ + { + label: 'Partners', + name: 'partners', + type: 'text', + placeholder: 'partners', + }, + { + label: 'Managed by Users', + name: 'mangedByUsers', + type: 'text', + placeholder: 'Managed by Users' + }, + { + label: 'Project Status', + name: 'projectStatus', + type: 'text', + placeholder: 'Project Status' + }, + { + label: 'Google Drive ID', + name: 'googleDriveId', + type: 'text', + placeholder: 'htttps://drive.google.com/', + }, + { + label: 'Created at', + name: 'createdAt', + type: 'text', + placeholder: 'Created At' + } +] \ No newline at end of file diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index 399bc3ab0..b626087c3 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -3,7 +3,7 @@ import EditMeetingTimes from './editMeetingTimes'; import CreateNewEvent from './createNewEvent'; import readableEvent from './utilities/readableEvent'; import ProjectForm from '../ProjectForm'; -import { simpleInputs } from '../data'; +import { simpleInputs, additionalInputsForEdit } from '../data'; import TitledBox from '../parts/boxes/TitledBox'; import { ReactComponent as EditIcon } from '../../svg/Icon_Edit.svg'; @@ -92,7 +92,7 @@ const EditProject = ({ />
    Date: Mon, 16 Oct 2023 20:48:00 +0000 Subject: [PATCH 071/157] build(deps): bump @babel/traverse from 7.11.5 to 7.23.2 in /backend Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.11.5 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- backend/yarn.lock | 190 +++++++++++++++++++++++++++++++--------------- 1 file changed, 128 insertions(+), 62 deletions(-) diff --git a/backend/yarn.lock b/backend/yarn.lock index e84566ec3..56d5571f9 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -16,6 +16,14 @@ dependencies: "@babel/highlight" "^7.14.5" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" @@ -80,7 +88,7 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": +"@babel/generator@^7.11.6": version "7.11.6" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== @@ -98,6 +106,16 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-compilation-targets@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" @@ -108,44 +126,25 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.22.5" "@babel/helper-member-expression-to-functions@^7.10.4": version "7.11.0" @@ -270,6 +269,18 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" @@ -280,6 +291,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" @@ -321,6 +337,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" @@ -331,6 +356,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -441,33 +471,28 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5", "@babel/traverse@^7.15.0": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -488,6 +513,15 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -704,6 +738,38 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@shelf/jest-mongodb@^1.2.3": version "1.2.3" resolved "https://registry.yarnpkg.com/@shelf/jest-mongodb/-/jest-mongodb-1.2.3.tgz#7cb34f0bcb71871b0d1c8d16a4f1fdb18b1620df" From 09025ff16e8b711f1dedc898f4f74007661345ca Mon Sep 17 00:00:00 2001 From: Brad Date: Wed, 18 Oct 2023 14:02:17 -0700 Subject: [PATCH 072/157] fix typos, prettiyfy date, disable createdDate editing --- client/src/components/data.js | 27 ++++++++++++++----- .../components/manageProjects/editProject.js | 5 ++++ .../parts/form/ValidatedTextField.js | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/client/src/components/data.js b/client/src/components/data.js index ad609c174..ca37540ba 100644 --- a/client/src/components/data.js +++ b/client/src/components/data.js @@ -5,6 +5,7 @@ export const simpleInputs = [ name: 'name', type: 'text', placeholder: 'Enter project name', + disabled: false }, { label: 'Project Description', @@ -12,7 +13,8 @@ export const simpleInputs = [ type: 'textarea', placeholder: 'Enter project description', value: /^[a-zA-Z0-9].{0,250}$/, - errorMessage: 'Description must start with alphanumeric characters, 250 char limit' + errorMessage: 'Description must start with alphanumeric characters, 250 char limit', + disabled: false }, { label: 'Location', @@ -23,36 +25,42 @@ export const simpleInputs = [ errorMessage: 'Please enter a valid Zoom URL', addressValue: '', addressError: 'Invalid address', + disabled: false }, { label: 'GitHub Identifier', name: 'githubIdentifier', type: 'text', placeholder: 'Enter GitHub identifier', + disabled: false }, { label: 'GitHub URL', name: 'githubUrl', type: 'text', placeholder: 'htttps://github.com/', + disabled: false }, { label: 'Slack Channel Link', name: 'slackUrl', type: 'text', placeholder: 'htttps://slack.com/', + disabled: false }, { label: 'Google Drive URL', name: 'googleDriveUrl', type: 'text', placeholder: 'htttps://drive.google.com/', + disabled: false }, { label: 'HFLA Website URL', name: 'hflaWebsiteUrl', type: 'text', placeholder: 'htttps://hackforla.org/projects/', + disabled: false }, ]; @@ -62,29 +70,34 @@ export const additionalInputsForEdit = [ name: 'partners', type: 'text', placeholder: 'partners', + disabled: false }, { label: 'Managed by Users', - name: 'mangedByUsers', + name: 'managedByUsers', type: 'text', - placeholder: 'Managed by Users' + placeholder: 'Managed by Users', + disabled: false }, { label: 'Project Status', name: 'projectStatus', type: 'text', - placeholder: 'Project Status' + placeholder: 'Project Status', + disabled: false }, { label: 'Google Drive ID', name: 'googleDriveId', type: 'text', placeholder: 'htttps://drive.google.com/', + disabled: false }, { - label: 'Created at', - name: 'createdAt', + label: 'Created Date', + name: 'createdDate', type: 'text', - placeholder: 'Created At' + placeholder: 'Created Date', + disabled: true } ] \ No newline at end of file diff --git a/client/src/components/manageProjects/editProject.js b/client/src/components/manageProjects/editProject.js index b626087c3..886d0a229 100644 --- a/client/src/components/manageProjects/editProject.js +++ b/client/src/components/manageProjects/editProject.js @@ -31,6 +31,11 @@ const EditProject = ({ slackUrl: projectToEdit.slackUrl, googleDriveUrl: projectToEdit.googleDriveUrl, hflaWebsiteUrl: projectToEdit.hflaWebsiteUrl, + partners: projectToEdit.partners, + managedByUsers: projectToEdit.managedByUsers, + projectStatus: projectToEdit.projectStatus, + googleDriveId: projectToEdit.googleDriveId, + createdDate: new Date(projectToEdit.createdDate) }); // eslint-disable-next-line no-unused-vars diff --git a/client/src/components/parts/form/ValidatedTextField.js b/client/src/components/parts/form/ValidatedTextField.js index b6fc6c5b2..1e8bc96d5 100644 --- a/client/src/components/parts/form/ValidatedTextField.js +++ b/client/src/components/parts/form/ValidatedTextField.js @@ -61,7 +61,7 @@ function ValidatedTextField({ type={input.type} placeholder={input.placeholder} helperText={`${errors[input.name]?.message || ' '}`} - disabled={isEdit ? !editMode : undefined} // handles edit mode for EditProjcet form + disabled={isEdit ? !editMode || input.disabled : undefined} // handles edit mode for EditProjcet form />
    ); From 7a554409e158a932d51608410cff05e4cbd9c910 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:08:19 +0000 Subject: [PATCH 073/157] build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 in /client Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- client/yarn.lock | 115 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 14 deletions(-) diff --git a/client/yarn.lock b/client/yarn.lock index 1d10c3bde..9a2961b3a 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -24,6 +24,14 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.9.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" @@ -72,7 +80,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": +"@babel/generator@^7.21.0", "@babel/generator@^7.4.0", "@babel/generator@^7.9.0": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== @@ -82,6 +90,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -147,6 +165,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -162,6 +185,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -169,6 +200,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" @@ -252,16 +290,33 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.19.4": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-option@^7.18.6": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" @@ -295,11 +350,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1184,19 +1253,28 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" @@ -1209,6 +1287,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" From 3ce33bf6450d1cc5344abed6dd4c76e597821732 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 18:57:40 +0000 Subject: [PATCH 074/157] build(deps): bump browserify-sign from 4.2.1 to 4.2.2 in /client Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.2.1 to 4.2.2. - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.2) --- updated-dependencies: - dependency-name: browserify-sign dependency-type: indirect ... Signed-off-by: dependabot[bot] --- client/yarn.lock | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/client/yarn.lock b/client/yarn.lock index 1d10c3bde..dcfee0907 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -3441,7 +3441,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -3560,7 +3560,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== @@ -3569,19 +3569,19 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" + bn.js "^5.2.1" + browserify-rsa "^4.1.0" create-hash "^1.2.0" create-hmac "^1.1.7" - elliptic "^6.5.3" + elliptic "^6.5.4" inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" browserify-zlib@^0.2.0: version "0.2.0" @@ -5265,7 +5265,7 @@ electron-to-chromium@^1.3.378, electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.320.tgz#4d83a90ff74f93939c5413c2ac5a16c696600632" integrity sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q== -elliptic@^6.5.3: +elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -9286,7 +9286,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: +parse-asn1@^5.0.0, parse-asn1@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== @@ -10732,6 +10732,15 @@ readable-stream@^3.0.6, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -11137,7 +11146,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== From 9e124ecf0dc435ae81b940fca3934bc8849dd820 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Mon, 30 Oct 2023 16:37:52 -0700 Subject: [PATCH 075/157] feat: Move logic to helper function & resolve bug - Base event time off of event.startTime rather than event.date --- backend/workers/createRecurringEvents.js | 74 +++++++++++++----------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/backend/workers/createRecurringEvents.js b/backend/workers/createRecurringEvents.js index a1228c369..4867ac904 100644 --- a/backend/workers/createRecurringEvents.js +++ b/backend/workers/createRecurringEvents.js @@ -60,45 +60,14 @@ module.exports = (cron, fetch) => { // forEach function with async/await. for (filteredEvent of filteredEvents) { const eventExists = await checkIfEventExists(filteredEvent.name); - // console.log('Event exists? ', eventExists); - const eventDate = new Date(filteredEvent.date); if (eventExists) { + //Do nothing console.log("Not going to run ceateEvent"); } else { // Create new event - const hours = eventDate.getHours(); - const minutes = eventDate.getMinutes(); - const seconds = eventDate.getSeconds(); - const milliseconds = eventDate.getMilliseconds(); - - const yearToday = TODAY_DATE.getFullYear(); - const monthToday = TODAY_DATE.getMonth(); - const dateToday = TODAY_DATE.getDate(); - - const newEventDate = new Date(yearToday, monthToday, dateToday, hours, minutes, seconds, milliseconds); - - const newEndTime = new Date(yearToday, monthToday, dateToday, hours + filteredEvent.hours, minutes, seconds, milliseconds) - - const eventToCreate = { - name: filteredEvent.name && filteredEvent.name, - hacknight: filteredEvent.hacknight && filteredEvent.hacknight, - eventType: filteredEvent.eventType && filteredEvent.eventType, - description: filteredEvent.eventDescription && filteredEvent.eventDescription, - project: filteredEvent.project && filteredEvent.project, - date: filteredEvent.date && newEventDate, - startTime: filteredEvent.startTime && newEventDate, - endTime: filteredEvent.endTime && newEndTime, - hours: filteredEvent.hours && filteredEvent.hours - } - if (filteredEvent.hasOwnProperty("location")) { - eventToCreate.location = { - city: filteredEvent.location.city ? filteredEvent.location.city : 'REMOTE', - state: filteredEvent.location.state ? filteredEvent.location.state : 'REMOTE', - country: filteredEvent.location.country ? filteredEvent.location.country : 'REMOTE' - }; - } - + const eventToCreate = generateEventData(filteredEvent); + const created = await createEvent(eventToCreate); console.log(created); }; @@ -106,6 +75,43 @@ module.exports = (cron, fetch) => { }; }; + function generateEventData(eventData, TODAY_DATE = new Date()) { + const eventDate = new Date(eventData.startTime); + // Create new event + const hours = eventDate.getHours(); + const minutes = eventDate.getMinutes(); + const seconds = eventDate.getSeconds(); + const milliseconds = eventDate.getMilliseconds(); + + const yearToday = TODAY_DATE.getFullYear(); + const monthToday = TODAY_DATE.getMonth(); + const dateToday = TODAY_DATE.getDate(); + + const newEventDate = new Date(yearToday, monthToday, dateToday, hours, minutes, seconds, milliseconds); + + const newEndTime = new Date(yearToday, monthToday, dateToday, hours + filteredEvent.hours, minutes, seconds, milliseconds) + + const eventToCreate = { + name: eventData.name && eventData.name, + hacknight: eventData.hacknight && eventData.hacknight, + eventType: eventData.eventType && eventData.eventType, + description: eventData.eventDescription && eventData.eventDescription, + project: eventData.project && eventData.project, + date: eventData.date && newEventDate, + startTime: eventData.startTime && newEventDate, + endTime: eventData.endTime && newEndTime, + hours: eventData.hours && eventData.hours + } + if (eventData.hasOwnProperty("location")) { + eventToCreate.location = { + city: eventData.location.city ? eventData.location.city : 'REMOTE', + state: eventData.location.state ? eventData.location.state : 'REMOTE', + country: eventData.location.country ? eventData.location.country : 'REMOTE' + }; + } + return eventToCreate + }; + async function checkIfEventExists(eventName) { const events = EVENTS; // const today = new Date(); From 6d373a32a6e67bedcae2427e32cc7287bf66d7a4 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 5 Nov 2023 13:57:38 -0800 Subject: [PATCH 076/157] feat: Add emojis to create/not create console.logs --- backend/workers/createRecurringEvents.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/workers/createRecurringEvents.js b/backend/workers/createRecurringEvents.js index 4867ac904..3eef5fbf5 100644 --- a/backend/workers/createRecurringEvents.js +++ b/backend/workers/createRecurringEvents.js @@ -63,13 +63,13 @@ module.exports = (cron, fetch) => { if (eventExists) { //Do nothing - console.log("Not going to run ceateEvent"); + console.log("➖ Not going to run ceateEvent"); } else { // Create new event const eventToCreate = generateEventData(filteredEvent); const created = await createEvent(eventToCreate); - console.log(created); + console.log("➕", created); }; }; }; From 8a56f1c6cd7472435c1ddf0e6d9cf7e92c09cd1c Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Fri, 10 Nov 2023 12:58:57 -0800 Subject: [PATCH 077/157] fix: Handle event.date being undefined in closeCheckins --- backend/workers/closeCheckins.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/workers/closeCheckins.js b/backend/workers/closeCheckins.js index d2c64d20d..9d04cd7da 100644 --- a/backend/workers/closeCheckins.js +++ b/backend/workers/closeCheckins.js @@ -28,6 +28,12 @@ module.exports = (cron, fetch) => { if (events && events.length > 0) { const sortedEvents = events.filter(event => { + if (!event.date) { + // handle if event date is null/undefined + // false meaning don't include in sortedEvents + return false + } + const currentTimeISO = new Date().toISOString(); const threeHoursFromStartTime = new Date(event.date).getTime() + 10800000; const threeHoursISO = new Date(threeHoursFromStartTime).toISOString(); From 27df8a44da1b7512ff95bf032eba1a509cc510e4 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sun, 12 Nov 2023 11:34:39 +0530 Subject: [PATCH 078/157] feat(UI): added UI rendering feature if no meetings available --- client/src/pages/Home.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index e64a6f4bd..3e90abd89 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -49,7 +49,7 @@ const Home = () => {

    Volunteer Relationship Management System

    - {events && events.length >= 1 && ( + {events && events.length > 0 ? (
    {
    - )} + ):(
    {/* If no events with checkInReady: true */} - {events.length === 0 && } - + {/* If no meetings available*/} +

    No meetings available

    + +
    + )} {/* If any events with checkInReady: true */} {events.length > 0 && ( - +
    + +
    )} -
    ); }; From 96b4195c1b591fa98f35e2fd5b8d8d32039bddfe Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Mon, 13 Nov 2023 11:38:55 +0530 Subject: [PATCH 079/157] feat (UI): rendered in the UI if no meeting is scheduled --- client/src/pages/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 3e90abd89..48e1df04e 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -90,7 +90,7 @@ const Home = () => {
    {/* If no events with checkInReady: true */} {/* If no meetings available*/} -

    No meetings available

    +

    No meetings available

    )} From 9ee2e309a1277bad05c6ab5372261a0fd3393766 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Mon, 4 Dec 2023 12:24:55 +0530 Subject: [PATCH 080/157] fix: replaced
    with and h1,h2,h4 with with custom sx properties, still need to be resolved --- client/src/pages/Home.js | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 48e1df04e..d0da48b8d 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import CheckInButtons from '../components/presentational/CheckInButtons'; import CreateNewProfileButton from '../components/presentational/CreateNewProfileButton'; import { REACT_APP_CUSTOM_REQUEST_HEADER as headerToSend } from '../utils/globalSettings'; -import { CircularProgress, Box } from '@mui/material'; +import { CircularProgress, Box, Typography } from '@mui/material'; import '../sass/Home.scss'; @@ -43,25 +43,25 @@ const Home = () => { } return ( -
    -
    -

    VRMS

    -

    Volunteer Relationship Management System

    -
    + + + VRMS + Volunteer Relationship Management System + {events && events.length > 0 ? ( -
    +
    e.preventDefault()} > -
    -
    + + -
    + -
    -
    -
    + + +
    -
    +
    ):( -
    + {/* If no events with checkInReady: true */} {/* If no meetings available*/} -

    No meetings available

    + No meetings available -
    + )} {/* If any events with checkInReady: true */} {events.length > 0 && ( -
    + -
    + )} -
    +
    ); }; From 791a1f781e9708c8e7616544ae12f12b11ddf1c2 Mon Sep 17 00:00:00 2001 From: Brad Date: Mon, 4 Dec 2023 17:45:58 -0800 Subject: [PATCH 081/157] implement and style modal --- client/src/components/ChangesModal.js | 75 +++++++++++++++++++++++++++ client/src/components/ProjectForm.js | 30 +++++++++-- client/src/pages/UserAdmin.js | 8 +-- package.json | 3 +- yarn.lock | 5 ++ 5 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 client/src/components/ChangesModal.js diff --git a/client/src/components/ChangesModal.js b/client/src/components/ChangesModal.js new file mode 100644 index 000000000..96561529b --- /dev/null +++ b/client/src/components/ChangesModal.js @@ -0,0 +1,75 @@ +import React, {useState} from 'react' +import { + Modal, + Box, + Typography, + Grid + } from '@mui/material' + import { IoWarningOutline } from "react-icons/io5"; + import { styled } from '@mui/material/styles'; + import { StyledButton } from './ProjectForm'; + import { Link } from 'react-router-dom'; + + + const style = { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +}; + + + export default function ChangesModal({open, onClose, handleClose}) { + return ( + + + + + + + + + Wait! You made some changes. + + + Are you sure you want to exit without saving? + + + + + Yes + + + + + No + + + + + + ) + } \ No newline at end of file diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 309f1c109..80e2098ba 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -20,6 +20,7 @@ import { ReactComponent as EditIcon } from '../svg/Icon_Edit.svg'; import { ReactComponent as PlusIcon } from '../svg/PlusIcon.svg'; import ValidatedTextField from './parts/form/ValidatedTextField'; import TitledBox from './parts/boxes/TitledBox'; +import ChangesModal from './ChangesModal'; /** STYLES * -most TextField and InputLabel styles are controlled by the theme @@ -27,7 +28,7 @@ import TitledBox from './parts/boxes/TitledBox'; * -the rest are inline */ -const StyledButton = styled(Button)(({ theme }) => ({ +export const StyledButton = styled(Button)(({ theme }) => ({ width: '150px', })); @@ -72,6 +73,21 @@ export default function ProjectForm({ // State to track the toggling from Project view to Edit Project View via edit icon. const [editMode, setEditMode] = useState(false); const { auth } = useAuth(); + const [isModalOpen, setIsModalOpen] = useState(false); + const handleOpen = () => setIsModalOpen(true) + const handleClose = () => setIsModalOpen(false) + + const style = { + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +}; /** * React Hook Forms @@ -124,6 +140,8 @@ export default function ProjectForm({ setEditMode(false); }; + + // ----------------- Handles and Toggles ----------------- // Handles the location radio button change. @@ -221,6 +239,13 @@ export default function ProjectForm({ title={editMode ? 'Editing Project' : 'Project Information'} badge={isEdit ? editIcon() : addIcon()} > +
    { @@ -255,10 +280,9 @@ export default function ProjectForm({ Close diff --git a/client/src/pages/UserAdmin.js b/client/src/pages/UserAdmin.js index c540082ff..d93a4115e 100644 --- a/client/src/pages/UserAdmin.js +++ b/client/src/pages/UserAdmin.js @@ -47,9 +47,9 @@ const UserAdmin = () => { fetchProjects(); }, [fetchUsers, fetchProjects]); - const backToSearch = () => { - setUserToEdit({}); - }; + // const backToSearch = () => { + // setUserToEdit({}); + // }; if (!auth && !auth?.user) { return ; @@ -63,7 +63,7 @@ const UserAdmin = () => { userToEdit={userToEdit} projects={projects} updateUserDb={updateUserDb} - backToSearch={backToSearch} + // backToSearch={backToSearch} updateUserActiveStatus={updateUserActiveStatus} /> ); diff --git a/package.json b/package.json index d4970754e..856c0e757 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "concurrently": "^5.3.0", "cross-env": "^7.0.2", "cross-var": "^1.1.0", - "dotenv-cli": "^3.2.0" + "dotenv-cli": "^3.2.0", + "react-icons": "^4.12.0" }, "devDependencies": { "cypress": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index cc7e88753..45c1e902c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2200,6 +2200,11 @@ ramda@~0.26.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== +react-icons@^4.12.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" + integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" From 0ee913fb2bdc0d92fbce79e82702d861a210f46a Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 8 Dec 2023 01:09:59 -0800 Subject: [PATCH 082/157] update modal --- client/src/components/ChangesModal.js | 20 +++++++++----------- client/src/components/ProjectForm.js | 16 +++------------- client/src/pages/UserAdmin.js | 8 ++++---- package.json | 4 ++-- yarn.lock | 24 +++++++++++++++++++----- 5 files changed, 37 insertions(+), 35 deletions(-) diff --git a/client/src/components/ChangesModal.js b/client/src/components/ChangesModal.js index 96561529b..5eff6315e 100644 --- a/client/src/components/ChangesModal.js +++ b/client/src/components/ChangesModal.js @@ -1,14 +1,13 @@ -import React, {useState} from 'react' +import React from 'react' import { Modal, Box, Typography, Grid } from '@mui/material' - import { IoWarningOutline } from "react-icons/io5"; - import { styled } from '@mui/material/styles'; import { StyledButton } from './ProjectForm'; import { Link } from 'react-router-dom'; + import WarningAmberRoundedIcon from '@mui/icons-material/WarningAmberRounded'; const style = { @@ -24,7 +23,7 @@ import { }; - export default function ChangesModal({open, onClose, handleClose}) { + export default function ChangesModal({open, onClose, handleClose, destination }) { return ( - + Wait! You made some changes. - + Are you sure you want to exit without saving? @@ -61,9 +60,8 @@ import { type="submit" form="project-form" cursor="pointer" - variant="contained" + variant="contained" onClick={handleClose} - // disabled={isEdit ? !editMode : false} > No diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 80e2098ba..0419f9c48 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { Link, useHistory } from 'react-router-dom'; +import { useHistory } from 'react-router-dom'; import { useForm } from 'react-hook-form'; import { Redirect } from 'react-router-dom'; import { @@ -76,18 +76,7 @@ export default function ProjectForm({ const [isModalOpen, setIsModalOpen] = useState(false); const handleOpen = () => setIsModalOpen(true) const handleClose = () => setIsModalOpen(false) - - const style = { - position: 'absolute', - top: '50%', - left: '50%', - transform: 'translate(-50%, -50%)', - width: 400, - bgcolor: 'background.paper', - border: '2px solid #000', - boxShadow: 24, - p: 4, -}; + console.log("FDATA", formData) /** * React Hook Forms @@ -242,6 +231,7 @@ export default function ProjectForm({ { fetchProjects(); }, [fetchUsers, fetchProjects]); - // const backToSearch = () => { - // setUserToEdit({}); - // }; + const backToSearch = () => { + setUserToEdit({}); + }; if (!auth && !auth?.user) { return ; @@ -63,7 +63,7 @@ const UserAdmin = () => { userToEdit={userToEdit} projects={projects} updateUserDb={updateUserDb} - // backToSearch={backToSearch} + backToSearch={backToSearch} updateUserActiveStatus={updateUserActiveStatus} /> ); diff --git a/package.json b/package.json index 856c0e757..ed21f023d 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ "test:all": "cross-env NODE_ENV=test npm run test:client && npm run test:client-mvp && npm run test:backend && npm run test:cy" }, "dependencies": { + "@mui/icons-material": "^5.14.19", "concurrently": "^5.3.0", "cross-env": "^7.0.2", "cross-var": "^1.1.0", - "dotenv-cli": "^3.2.0", - "react-icons": "^4.12.0" + "dotenv-cli": "^3.2.0" }, "devDependencies": { "cypress": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index 45c1e902c..206436543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@babel/runtime@^7.23.4": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" + integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== + dependencies: + regenerator-runtime "^0.14.0" + "@cypress/listr-verbose-renderer@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a" @@ -75,6 +82,13 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@mui/icons-material@^5.14.19": + version "5.14.19" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.19.tgz#6e0f4e9d89f99517d3c0ee65dee7ac97753755af" + integrity sha512-yjP8nluXxZGe3Y7pS+yxBV+hWZSsSBampCxkZwaw+1l+feL+rfP74vbEFbMrX/Kil9I/Y1tWfy5bs/eNvwNpWw== + dependencies: + "@babel/runtime" "^7.23.4" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.1" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz#a21117b19ee9be70c379ec1877537ef2e1c63301" @@ -2200,11 +2214,6 @@ ramda@~0.26.1: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== -react-icons@^4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" - integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== - read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -2237,6 +2246,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" From 2858b2c213cdc14b439941293d6468581e939316 Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 8 Dec 2023 01:12:14 -0800 Subject: [PATCH 083/157] removelog --- client/src/components/ProjectForm.js | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 0419f9c48..77ab33408 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -76,7 +76,6 @@ export default function ProjectForm({ const [isModalOpen, setIsModalOpen] = useState(false); const handleOpen = () => setIsModalOpen(true) const handleClose = () => setIsModalOpen(false) - console.log("FDATA", formData) /** * React Hook Forms From 059da363a03e4b9759d87c33620cc1a153a7874a Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 8 Dec 2023 12:43:40 -0800 Subject: [PATCH 084/157] update logic for opening modal --- client/src/components/ProjectForm.js | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 77ab33408..fb8da0545 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useHistory } from 'react-router-dom'; -import { useForm } from 'react-hook-form'; +import { useForm, useFormState } from 'react-hook-form'; import { Redirect } from 'react-router-dom'; import { Typography, @@ -76,6 +76,9 @@ export default function ProjectForm({ const [isModalOpen, setIsModalOpen] = useState(false); const handleOpen = () => setIsModalOpen(true) const handleClose = () => setIsModalOpen(false) + const checkFields = () => { + history.push("/projects") + } /** * React Hook Forms @@ -92,6 +95,7 @@ export default function ProjectForm({ handleSubmit, reset, formState: { errors }, + control } = useForm({ mode: 'all', // Holds the current project data in state. @@ -100,6 +104,8 @@ export default function ProjectForm({ }, }); + const { dirtyFields } = useFormState({control}) + // ----------------- Submit requests ----------------- // Handles POST request found in api/ProjectApiService. @@ -227,20 +233,14 @@ export default function ProjectForm({ title={editMode ? 'Editing Project' : 'Project Information'} badge={isEdit ? editIcon() : addIcon()} > - + { isEdit ? submitEditProject(data) : submitNewProject(data); })} > + {arr.map((input) => ( ))} + @@ -271,7 +279,7 @@ export default function ProjectForm({ 0 ? handleOpen: checkFields} > Close From ce76e016cdacfaee289bace7aba6d6065a751b33 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 9 Dec 2023 05:12:15 +0530 Subject: [PATCH 085/157] Undo the changes made in the heading tags --- client/src/pages/Home.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index d0da48b8d..0c645dc00 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -45,8 +45,8 @@ const Home = () => { return ( - VRMS - Volunteer Relationship Management System +

    VRMS

    +

    Volunteer Relationship Management System

    {events && events.length > 0 ? ( @@ -90,7 +90,7 @@ const Home = () => { {/* If no events with checkInReady: true */} {/* If no meetings available*/} - No meetings available +

    No meetings available

    )} From c42c64d81adf0231e0b418e53d78e92e1e675d9d Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 9 Dec 2023 13:44:09 +0530 Subject: [PATCH 086/157] Imported fonts locally, created a theme and provided styles as per index.scss, changed heading tags to Typography --- client/src/pages/Home.js | 173 ++++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 57 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 0c645dc00..d21ba5e29 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -3,8 +3,65 @@ import CheckInButtons from '../components/presentational/CheckInButtons'; import CreateNewProfileButton from '../components/presentational/CreateNewProfileButton'; import { REACT_APP_CUSTOM_REQUEST_HEADER as headerToSend } from '../utils/globalSettings'; import { CircularProgress, Box, Typography } from '@mui/material'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; import '../sass/Home.scss'; +import aliseowoff2 from '../fonts/aliseo-noncommercial-webfont.woff2'; + +const fontTheme = createTheme({ + typography: { + fontFamily: ['aliseoregular', + '-apple-system', + 'BlinkMacSystemFont', + 'Segoe UI', + 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + '"Fira Sans"', + '"Droid Sans"', + '"Helvetica Neue"', + 'sans-serif',].join(','), + h1: { + fontSize: '7rem', + lineHeight: '0.85rem', + letterSpacing: '0.05rem', + '@media (min-width:500px)': { + fontSize: '6rem', + lineHeight: '0.75rem', + }, + }, + h2: { + fontSize: '2.8rem', + lineHeight: '1.05rem', + letterSpacing: '0.025rem', + '@media (min-width:500px)': { + fontSize: '2.7rem', + lineHeight: '1rem', + }, + }, + h4: { + fontSize: '2rem', + '@media (min-width:500px)': { + fontSize: '2rem', + }, + }, + }, + components: { + MuiCssBaseline: { + styleOverrides: ` + @font-face { + font-family: 'aliseoregular'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: local('aliseoregular'), local('aliseoregular'), url(${aliseowoff2}) format('woff2'); + unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; + } + `, + }, + }, +}); const Home = () => { const [events, setEvents] = useState(null); @@ -43,68 +100,70 @@ const Home = () => { } return ( - - -

    VRMS

    -

    Volunteer Relationship Management System

    -
    + + + + VRMS + Volunteer Relationship Management System + - {events && events.length > 0 ? ( - -
    e.preventDefault()} - > - - - - - + {events && events.length > 0 ? ( + + e.preventDefault()} + > + + + + + + - - - - ):( + + + ):( - - {/* If no events with checkInReady: true */} - {/* If no meetings available*/} -

    No meetings available

    - + + {/* If no events with checkInReady: true */} + {/* If no meetings available*/} + No meetings available + + + )} + {/* If any events with checkInReady: true */} + {events.length > 0 && ( + + + + )}
    - )} - {/* If any events with checkInReady: true */} - {events.length > 0 && ( - - - - )} -
    +
    ); }; From fbee189d2d3da3e7b0194a814fe830a3b2144e4f Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Tue, 12 Dec 2023 19:02:17 -0800 Subject: [PATCH 087/157] asset: Update dependencies for @mui-icons --- client/package.json | 1 + client/yarn.lock | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/client/package.json b/client/package.json index 4a745085a..2dbc56608 100644 --- a/client/package.json +++ b/client/package.json @@ -7,6 +7,7 @@ "@babel/plugin-transform-react-jsx-self": "^7.10.4", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", + "@mui/icons-material": "^5.14.19", "@mui/material": "^5.11.12", "classnames": "^2.2.6", "cross-env": "^7.0.2", diff --git a/client/yarn.lock b/client/yarn.lock index 27ef167cd..793d1d8b7 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1244,6 +1244,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.23.5": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.4.0", "@babel/template@^7.8.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -1676,6 +1683,13 @@ resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.12.tgz#b2ea89ba71321a79c89dfb6b2a1b1886dc7de6e4" integrity sha512-LHh8HZQ5nPVcW5QnyLwkAZ40txc/S2bzKMQ3bTO+5mjuwAJ2AzQrjZINLVy1geY7ei1pHXVqO1hcWHg/QdT44w== +"@mui/icons-material@^5.14.19": + version "5.15.0" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.15.0.tgz#fdc93611ca77ce3b79128be02fb6c1ae79b972b8" + integrity sha512-zHY6fOkaK7VfhWeyxO8MjO3IAjEYpYMXuqUhX7TkUZJ9+TSH/9dn4ClG4K2j6hdgBU5Yrq2Z/89Bo6BHHp7AdQ== + dependencies: + "@babel/runtime" "^7.23.5" + "@mui/material@^5.11.12": version "5.11.12" resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.11.12.tgz#b113c854fb1bb0aa473686a36a92322c6c754121" @@ -10880,6 +10894,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.3, regenerator-runtime@^ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" From edc8070f819fe121951f7b3adb8994f6ab69f168 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Thu, 14 Dec 2023 15:40:44 +0530 Subject: [PATCH 088/157] fix: added some new properties to the index.js and removed ThemeProvider from Home.js --- client/src/pages/Home.js | 59 +-------------------------------------- client/src/theme/index.js | 27 ++++++++++++------ 2 files changed, 20 insertions(+), 66 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index d21ba5e29..2eed8c73f 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -6,62 +6,7 @@ import { CircularProgress, Box, Typography } from '@mui/material'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import '../sass/Home.scss'; -import aliseowoff2 from '../fonts/aliseo-noncommercial-webfont.woff2'; -const fontTheme = createTheme({ - typography: { - fontFamily: ['aliseoregular', - '-apple-system', - 'BlinkMacSystemFont', - 'Segoe UI', - 'Roboto', - 'Oxygen', - 'Ubuntu', - 'Cantarell', - '"Fira Sans"', - '"Droid Sans"', - '"Helvetica Neue"', - 'sans-serif',].join(','), - h1: { - fontSize: '7rem', - lineHeight: '0.85rem', - letterSpacing: '0.05rem', - '@media (min-width:500px)': { - fontSize: '6rem', - lineHeight: '0.75rem', - }, - }, - h2: { - fontSize: '2.8rem', - lineHeight: '1.05rem', - letterSpacing: '0.025rem', - '@media (min-width:500px)': { - fontSize: '2.7rem', - lineHeight: '1rem', - }, - }, - h4: { - fontSize: '2rem', - '@media (min-width:500px)': { - fontSize: '2rem', - }, - }, - }, - components: { - MuiCssBaseline: { - styleOverrides: ` - @font-face { - font-family: 'aliseoregular'; - font-style: normal; - font-display: swap; - font-weight: 400; - src: local('aliseoregular'), local('aliseoregular'), url(${aliseowoff2}) format('woff2'); - unicodeRange: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF; - } - `, - }, - }, -}); const Home = () => { const [events, setEvents] = useState(null); @@ -100,14 +45,13 @@ const Home = () => { } return ( - VRMS Volunteer Relationship Management System - {events && events.length > 0 ? ( + {false ? (
    { )} - ); }; diff --git a/client/src/theme/index.js b/client/src/theme/index.js index 095beac8a..6a26735ff 100644 --- a/client/src/theme/index.js +++ b/client/src/theme/index.js @@ -5,24 +5,35 @@ import { default as palette, uiKitColors } from './palette'; let theme = createTheme({ palette, typography: { - fontFamily: [ - 'Source Sans Pro', + fontFamily: ['aliseoregular', + '-apple-system', + 'BlinkMacSystemFont', + 'Segoe UI', 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + '"Fira Sans"', + '"Droid Sans"', '"Helvetica Neue"', - 'Arial', - 'sans-serif', - ].join(','), + 'sans-serif',].join(','), h1: { - fontFamily: 'Source Code Pro', + //fontFamily: 'Source Code Pro', fontWeight: 'bold', - fontSize: '30px', - marginBottom: '1.5rem', + fontSize: '7rem', + //marginBottom: '1.5rem', + }, + h2: { + fontSize: '2.8rem', }, h3: { fontFamily: 'Source Sans Pro', fontWeight: 600, fontSize: '16px', }, + h4: { + fontSize: '2rem', + } }, components: { MuiButton: { From ef4f1444379d0153ceb1a6144c4f8a3aa1040346 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Thu, 14 Dec 2023 16:04:40 +0530 Subject: [PATCH 089/157] fix: added some comments indicator and some margins for fixing the spacings --- client/src/pages/Home.js | 2 +- client/src/theme/index.js | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 2eed8c73f..4c59f552c 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -51,7 +51,7 @@ const Home = () => { Volunteer Relationship Management System - {false ? ( + {events && events.length > 0 ? ( Date: Sat, 16 Dec 2023 12:41:41 +0530 Subject: [PATCH 090/157] fix: reverted the theme.js back to original and made changes with sx property along with fixing the margins --- client/src/pages/Home.js | 24 ++++++++++++++++++++---- client/src/theme/index.js | 39 ++++++++------------------------------- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 4c59f552c..fbf74faa6 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -3,10 +3,26 @@ import CheckInButtons from '../components/presentational/CheckInButtons'; import CreateNewProfileButton from '../components/presentational/CreateNewProfileButton'; import { REACT_APP_CUSTOM_REQUEST_HEADER as headerToSend } from '../utils/globalSettings'; import { CircularProgress, Box, Typography } from '@mui/material'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; import '../sass/Home.scss'; +const h1sx = { + fontFamily: 'aliseoregular', + fontWeight: 'bold', + fontSize: {xs: "5.3rem"}, + marginBottom: `0rem`, +} + +const h2sx = { + ...h1sx, + fontSize: {xs: '2.8rem'}, + marginTop: '-0.9rem', +} + +const h4sx = { + ...h1sx, + fontSize: {xs: '1.8rem'}, +} const Home = () => { const [events, setEvents] = useState(null); @@ -47,8 +63,8 @@ const Home = () => { return ( - VRMS - Volunteer Relationship Management System + VRMS + Volunteer Relationship Management System {events && events.length > 0 ? ( @@ -92,7 +108,7 @@ const Home = () => { {/* If no events with checkInReady: true */} {/* If no meetings available*/} - No meetings available + No meetings available )} diff --git a/client/src/theme/index.js b/client/src/theme/index.js index 157b5760f..095beac8a 100644 --- a/client/src/theme/index.js +++ b/client/src/theme/index.js @@ -5,47 +5,24 @@ import { default as palette, uiKitColors } from './palette'; let theme = createTheme({ palette, typography: { - // to achieve the same font as original - fontFamily: ['aliseoregular', - '-apple-system', - 'BlinkMacSystemFont', - 'Segoe UI', + fontFamily: [ + 'Source Sans Pro', 'Roboto', - 'Oxygen', - 'Ubuntu', - 'Cantarell', - '"Fira Sans"', - '"Droid Sans"', '"Helvetica Neue"', - 'sans-serif',].join(','), + 'Arial', + 'sans-serif', + ].join(','), h1: { + fontFamily: 'Source Code Pro', fontWeight: 'bold', - // size copied from index.scss - fontSize: '7rem', - // crafted to achieve the same spacing as original page - marginTop: '-1.6rem', - }, - // newly added style - h2: { - // size copied from index.scss - fontSize: '2.8rem', - // crafted to achieve the same spacing as original page - marginTop: '-1.6rem', - fontWeight: 'bold', + fontSize: '30px', + marginBottom: '1.5rem', }, h3: { fontFamily: 'Source Sans Pro', fontWeight: 600, fontSize: '16px', }, - h4: { - // size copied from index.scss - fontSize: '2rem', - // crafted to achieve the same spacing as original page - fontWeight: 'bold', - marginTop: '-0.6rem', - marginBottom: '-0.6rem', - } }, components: { MuiButton: { From 6c9509986e5a3fe8d52eb6144cbc81821b712ee5 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 16 Dec 2023 13:33:12 +0530 Subject: [PATCH 091/157] fix: mended the lineHeight for h2 --- client/src/pages/Home.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index fbf74faa6..30f7ac64c 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -17,6 +17,7 @@ const h2sx = { ...h1sx, fontSize: {xs: '2.8rem'}, marginTop: '-0.9rem', + lineHeight: '1.06rem' } const h4sx = { From c85a7d3fb61578ecba4bbeb6bc4b0ea3dc4bc11c Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 16 Dec 2023 14:01:38 +0530 Subject: [PATCH 092/157] fix: changes made for lineHeight of h2 --- client/src/pages/Home.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/pages/Home.js b/client/src/pages/Home.js index 30f7ac64c..98b890a22 100644 --- a/client/src/pages/Home.js +++ b/client/src/pages/Home.js @@ -17,7 +17,7 @@ const h2sx = { ...h1sx, fontSize: {xs: '2.8rem'}, marginTop: '-0.9rem', - lineHeight: '1.06rem' + lineHeight: '2.7rem' } const h4sx = { From 7adc1558d3e35bbe27737009dccd1875894e959f Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 23 Dec 2023 16:19:16 +0530 Subject: [PATCH 093/157] fix+feat:refractored the current code in accordance to MUI component and added New user button --- .../components/user-admin/UserManagement.js | 124 +++++++++++------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index 2c14bff9e..fa5c0c767 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -1,6 +1,17 @@ import React, { useState } from 'react'; +import {Box, Button, ButtonGroup, TextField,Typography } from '@mui/material'; + + import '../../sass/UserAdmin.scss'; +const h3sx = { + fontFamily: 'aliseoregular', + fontSize: {xs: "1.6rem"}, + marginBottom: `1rem`, + marginTop: `1rem`, + textAlign: "center", +} + const UserManagement = ({ users, setUserToEdit }) => { let searchResults = []; const [searchResultType, setSearchResultType] = useState('name'); // Which results will diplay @@ -44,64 +55,77 @@ const UserManagement = ({ users, setUserToEdit }) => { return (
    -

    User Management

    - User Management + +
    + +
    + +
    +
    + +
    +
    +
    + -
    +
    - +
      + {searchResults.map((u) => { + return ( + // eslint-disable-next-line no-underscore-dangle +
    • + +
    • + ); + })} +
    -
    - -
    -
    +
    -
    -
      - {searchResults.map((u) => { - return ( - // eslint-disable-next-line no-underscore-dangle -
    • - -
    • - ); - })} -
    -
    +
    From 1182fd799f4ff544aa49381297e023d401a6febd Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Tue, 26 Dec 2023 15:42:58 +0530 Subject: [PATCH 094/157] fix: added styles to various box and button to achieve the UI specs --- .../components/user-admin/UserManagement.js | 104 +++++++++++------- 1 file changed, 67 insertions(+), 37 deletions(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index fa5c0c767..9d5c893b8 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -1,15 +1,30 @@ import React, { useState } from 'react'; -import {Box, Button, ButtonGroup, TextField,Typography } from '@mui/material'; +import {Box, Button, ButtonGroup, TextField, Typography, List, ListItem, ListItemButton} from '@mui/material'; import '../../sass/UserAdmin.scss'; -const h3sx = { - fontFamily: 'aliseoregular', - fontSize: {xs: "1.6rem"}, - marginBottom: `1rem`, - marginTop: `1rem`, - textAlign: "center", +// const h3sx = { +// fontFamily: 'aliseoregular', +// fontSize: {xs: "1.6rem"}, +// marginBottom: `1rem`, +// marginTop: `1rem`, +// textAlign: "center", +// } +const ButtonGroupsx = { + display: 'flex', + flexDirection: 'row', + justifyContent: 'center', + minWidth: '127%', +} +const Boxsx = { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + width: '75%' +} +const Buttonsx = { + p: '0.1rem' } const UserManagement = ({ users, setUserToEdit }) => { @@ -54,57 +69,69 @@ const UserManagement = ({ users, setUserToEdit }) => { } return (
    -
    - User Management + + User Management
    - -
    + -
    -
    -
    - -
    -
      + + + {searchResults.map((u) => { return ( // eslint-disable-next-line no-underscore-dangle -
    • - -
    • + + ); })} -
    -
    + +
    -
    +
    ); }; From 3f1cd4d1e09194ca140442167d8084f68b291c02 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Wed, 27 Dec 2023 12:54:00 +0530 Subject: [PATCH 095/157] fix: added some padding to the element, provided horizontal rule after the buttons and changed the color of the button text --- .../components/user-admin/UserManagement.js | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index 9d5c893b8..ec79eb52a 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -21,12 +21,11 @@ const Boxsx = { display: 'flex', flexDirection: 'column', alignItems: 'center', - width: '75%' -} -const Buttonsx = { - p: '0.1rem' + width: '75%', + pt: '40px', } + const UserManagement = ({ users, setUserToEdit }) => { let searchResults = []; const [searchResultType, setSearchResultType] = useState('name'); // Which results will diplay @@ -75,7 +74,7 @@ const UserManagement = ({ users, setUserToEdit }) => {
    - + 0? '#F5F5F5': 'transparent', + my: 1.2, + width: '120%', + borderRadius: '1%', + }}> {searchResults.map((u) => { @@ -121,16 +122,16 @@ const UserManagement = ({ users, setUserToEdit }) => { Date: Thu, 28 Dec 2023 12:46:38 +0530 Subject: [PATCH 096/157] fix: fixed the UI pushed the button down, gave root element a width of 100% --- client/src/components/user-admin/UserManagement.js | 5 ++++- client/src/sass/UserAdmin.scss | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index ec79eb52a..4eab404ba 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -23,6 +23,7 @@ const Boxsx = { alignItems: 'center', width: '75%', pt: '40px', + height: '100%', } @@ -113,8 +114,10 @@ const UserManagement = ({ users, setUserToEdit }) => { my: 1.2, width: '120%', borderRadius: '1%', + display: 'flex', + flexGrow: 1, }}> - + {searchResults.map((u) => { return ( diff --git a/client/src/sass/UserAdmin.scss b/client/src/sass/UserAdmin.scss index 373cf7d34..0d3759edb 100644 --- a/client/src/sass/UserAdmin.scss +++ b/client/src/sass/UserAdmin.scss @@ -5,6 +5,7 @@ align-items: center; z-index: 1; margin-bottom: 200px; + height: 100%; } .edit-users { From 85ce20f9aef47db871eb560d180b1aac8e157876 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Tue, 9 Jan 2024 14:04:27 +0530 Subject: [PATCH 097/157] Added breakpoints to the button text --- .../components/user-admin/UserManagement.js | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index 4eab404ba..5271839e2 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -11,21 +11,10 @@ import '../../sass/UserAdmin.scss'; // marginTop: `1rem`, // textAlign: "center", // } -const ButtonGroupsx = { - display: 'flex', - flexDirection: 'row', - justifyContent: 'center', - minWidth: '127%', +const Buttonsx = { + p: "0.1rem", + fontSize: {xs: '14.52px', sm: '18px'} } -const Boxsx = { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - width: '75%', - pt: '40px', - height: '100%', -} - const UserManagement = ({ users, setUserToEdit }) => { let searchResults = []; @@ -69,13 +58,26 @@ const UserManagement = ({ users, setUserToEdit }) => { } return (
    - + User Management
    - + @@ -97,13 +88,12 @@ const UserManagement = ({ users, setUserToEdit }) => { ? 'contained' : 'secondary' } - onClick={buttonSwap - } + onClick={buttonSwap} > Results by Email -
    +
    { 0? '#F5F5F5': 'transparent', my: 1.2, - width: '120%', - borderRadius: '1%', + borderRadius: 1, display: 'flex', flexGrow: 1, }}> @@ -152,19 +141,16 @@ const UserManagement = ({ users, setUserToEdit }) => {
    -
    + -
    + -
    +
    ); }; From cb81070575ab918d631ad1bdbb8d5d158916e022 Mon Sep 17 00:00:00 2001 From: freaky4wrld Date: Sat, 13 Jan 2024 12:24:23 +0530 Subject: [PATCH 100/157] fix: tried to manipulate the design with margin and padding as directed --- client/src/components/user-admin/UserManagement.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/components/user-admin/UserManagement.js b/client/src/components/user-admin/UserManagement.js index a0b07ddaf..9f239be82 100644 --- a/client/src/components/user-admin/UserManagement.js +++ b/client/src/components/user-admin/UserManagement.js @@ -5,8 +5,7 @@ import {Box, Button, ButtonGroup, TextField, Typography, List, ListItem, ListIte import '../../sass/UserAdmin.scss'; const Buttonsx = { - p: "0.1rem", - fontSize: {xs: '14.52px', sm: '18px'} + px: "1rem", } const UserManagement = ({ users, setUserToEdit }) => { @@ -50,12 +49,11 @@ const UserManagement = ({ users, setUserToEdit }) => { ); } return ( - + @@ -67,6 +65,7 @@ const UserManagement = ({ users, setUserToEdit }) => { flexDirection: 'row', justifyContent: 'center', whiteSpace: 'nowrap', + mx: '0.5rem' }}> + */} From 89becb2f4220c4c78f62c37a0a485a1f9a21c745 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 13 Mar 2024 10:02:24 -0700 Subject: [PATCH 132/157] fix: Fix import for generateRecurringEvents --- backend/workers/createRecurringEvents.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/workers/createRecurringEvents.js b/backend/workers/createRecurringEvents.js index b64922358..659b88c24 100644 --- a/backend/workers/createRecurringEvents.js +++ b/backend/workers/createRecurringEvents.js @@ -1,4 +1,4 @@ -const generateEventData = require('./lib/generateEventData'); +const { generateEventData } = require('./lib/generateEventData'); module.exports = (cron, fetch) => { From 1defca50658accb9fcf6bdcb9cdf6d499660fc3c Mon Sep 17 00:00:00 2001 From: Josephine Han Date: Mon, 18 Mar 2024 18:50:16 -0700 Subject: [PATCH 133/157] remove popup on the close button --- client/src/components/ProjectForm.js | 45 +++++++++++++++------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index fb8da0545..1e3bd9bd1 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -64,7 +64,7 @@ export default function ProjectForm({ formData, projectToEdit, isEdit, - setFormData + setFormData, }) { const history = useHistory(); @@ -74,11 +74,11 @@ export default function ProjectForm({ const [editMode, setEditMode] = useState(false); const { auth } = useAuth(); const [isModalOpen, setIsModalOpen] = useState(false); - const handleOpen = () => setIsModalOpen(true) - const handleClose = () => setIsModalOpen(false) + const handleOpen = () => setIsModalOpen(true); + const handleClose = () => setIsModalOpen(false); const checkFields = () => { - history.push("/projects") - } + history.push('/projects'); + }; /** * React Hook Forms @@ -95,7 +95,7 @@ export default function ProjectForm({ handleSubmit, reset, formState: { errors }, - control + control, } = useForm({ mode: 'all', // Holds the current project data in state. @@ -104,7 +104,7 @@ export default function ProjectForm({ }, }); - const { dirtyFields } = useFormState({control}) + const { dirtyFields } = useFormState({ control }); // ----------------- Submit requests ----------------- @@ -134,8 +134,6 @@ export default function ProjectForm({ setEditMode(false); }; - - // ----------------- Handles and Toggles ----------------- // Handles the location radio button change. @@ -233,14 +231,12 @@ export default function ProjectForm({ title={editMode ? 'Editing Project' : 'Project Information'} badge={isEdit ? editIcon() : addIcon()} > - { isEdit ? submitEditProject(data) : submitNewProject(data); })} > - {arr.map((input) => ( ))} - + @@ -268,7 +264,9 @@ export default function ProjectForm({ @@ -279,7 +277,12 @@ export default function ProjectForm({ 0 ? handleOpen: checkFields} + onClick={ + isEdit + ? checkFields + : // Object.keys(dirtyFields).length > 0 ? + handleOpen + } > Close From f6b4860922ce6a6b7f8caf689e00ea27ce2c5a48 Mon Sep 17 00:00:00 2001 From: Josephine Han Date: Mon, 18 Mar 2024 20:15:45 -0700 Subject: [PATCH 134/157] popup removed for close button after no edit is made --- client/src/components/ProjectForm.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 1e3bd9bd1..bd57d2422 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -278,10 +278,13 @@ export default function ProjectForm({ variant="contained" cursor="pointer" onClick={ - isEdit + !editMode || Object.keys(dirtyFields).length === 0 ? checkFields - : // Object.keys(dirtyFields).length > 0 ? - handleOpen + : handleOpen + + // Object.keys(dirtyFields).length > 0 ? handleOpen : checkFields + // dirtyFields === 0 ? checkFields : handleOpen + // isEdit ? handleOpen : checkFields } > Close From 6df013869886c05b7de406f567f4e395da97d505 Mon Sep 17 00:00:00 2001 From: Josephine Han Date: Mon, 1 Apr 2024 18:55:44 -0700 Subject: [PATCH 135/157] removed prettier back to original styling --- backend/package.json | 3 -- client/src/components/ProjectForm.js | 46 ++++++++++++---------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/backend/package.json b/backend/package.json index 5fe900b1b..3f748e7b7 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,8 +4,6 @@ "description": "VRMS Backend", "main": "server.js", "scripts": { - "lint": "eslint .", - "format": "prettier --check .", "test": "jest", "test:watch": "jest --watch", "start": "node server.js", @@ -31,7 +29,6 @@ "eslint-plugin-react": "^7.20.6", "jest": "^26.4.0", "nodemon": "^2.0.2", - "prettier": "^2.1.1", "pretty-quick": "^3.0.2", "supertest": "^4.0.2", "why-is-node-running": "^2.2.0" diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index bd57d2422..55f33e943 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -64,7 +64,7 @@ export default function ProjectForm({ formData, projectToEdit, isEdit, - setFormData, + setFormData }) { const history = useHistory(); @@ -74,11 +74,11 @@ export default function ProjectForm({ const [editMode, setEditMode] = useState(false); const { auth } = useAuth(); const [isModalOpen, setIsModalOpen] = useState(false); - const handleOpen = () => setIsModalOpen(true); - const handleClose = () => setIsModalOpen(false); + const handleOpen = () => setIsModalOpen(true) + const handleClose = () => setIsModalOpen(false) const checkFields = () => { - history.push('/projects'); - }; + history.push("/projects") + } /** * React Hook Forms @@ -95,7 +95,7 @@ export default function ProjectForm({ handleSubmit, reset, formState: { errors }, - control, + control } = useForm({ mode: 'all', // Holds the current project data in state. @@ -104,7 +104,7 @@ export default function ProjectForm({ }, }); - const { dirtyFields } = useFormState({ control }); + const { dirtyFields } = useFormState({ control }) // ----------------- Submit requests ----------------- @@ -134,6 +134,8 @@ export default function ProjectForm({ setEditMode(false); }; + + // ----------------- Handles and Toggles ----------------- // Handles the location radio button change. @@ -231,12 +233,14 @@ export default function ProjectForm({ title={editMode ? 'Editing Project' : 'Project Information'} badge={isEdit ? editIcon() : addIcon()} > +
    { isEdit ? submitEditProject(data) : submitNewProject(data); })} > + {arr.map((input) => ( ))} + open={isModalOpen} + onClose={handleClose} + destination={'/projects'} + aria-labelledby="modal-modal-title" + aria-describedby="modal-modal-description" + handleClose={handleClose} + /> @@ -264,9 +268,7 @@ export default function ProjectForm({ @@ -277,15 +279,7 @@ export default function ProjectForm({ 0 ? handleOpen : checkFields - // dirtyFields === 0 ? checkFields : handleOpen - // isEdit ? handleOpen : checkFields - } + onClick={!editMode || Object.keys(dirtyFields).length === 0 ? checkFields: handleOpen} > Close From 3d840a755df902cb836b3fea7f142ddab7ea1c14 Mon Sep 17 00:00:00 2001 From: Josephine Han Date: Mon, 1 Apr 2024 18:57:33 -0700 Subject: [PATCH 136/157] undo prettier --- client/src/components/ProjectForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 55f33e943..34df40c8b 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -104,7 +104,7 @@ export default function ProjectForm({ }, }); - const { dirtyFields } = useFormState({ control }) + const { dirtyFields } = useFormState({control}) // ----------------- Submit requests ----------------- From 919a0df72bd272ac7d48b914240d9c8f4c60ba44 Mon Sep 17 00:00:00 2001 From: Josephine Han Date: Mon, 1 Apr 2024 19:10:08 -0700 Subject: [PATCH 137/157] readded packages --- backend/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/package.json b/backend/package.json index 3f748e7b7..5fe900b1b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,6 +4,8 @@ "description": "VRMS Backend", "main": "server.js", "scripts": { + "lint": "eslint .", + "format": "prettier --check .", "test": "jest", "test:watch": "jest --watch", "start": "node server.js", @@ -29,6 +31,7 @@ "eslint-plugin-react": "^7.20.6", "jest": "^26.4.0", "nodemon": "^2.0.2", + "prettier": "^2.1.1", "pretty-quick": "^3.0.2", "supertest": "^4.0.2", "why-is-node-running": "^2.2.0" From 4f4dd9d52e16ef3d18794489968ea48d8946c732 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Sun, 14 Apr 2024 18:26:50 -0700 Subject: [PATCH 138/157] feat: Add disabled logic, update classnames for buttons --- client/src/components/presentational/CheckInButtons.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/components/presentational/CheckInButtons.js b/client/src/components/presentational/CheckInButtons.js index caf59fcb7..ce60f42eb 100644 --- a/client/src/components/presentational/CheckInButtons.js +++ b/client/src/components/presentational/CheckInButtons.js @@ -14,14 +14,14 @@ const CheckInButtons = (props) => { CHECK IN AS NEW USER {props.events.length > 1 && ( - - ...OR CREATE A NEW PROFILE + + CREATE A NEW PROFILE )} From b28a072c5f01fd3a300f43fa3c2786fbae2a8bf8 Mon Sep 17 00:00:00 2001 From: chandler Date: Mon, 22 Apr 2024 20:31:38 -0700 Subject: [PATCH 139/157] formatting additions and suggestions for contributing.md --- CONTRIBUTING.md | 110 +++++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 52 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e53e60ced..d814b7b94 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,50 +50,53 @@ These steps are manditory in order to contribute to all HackforLA projects. ## **Part 2: How to set up the development environment** ### **2.1 Fork the repository** +*A fork is a copy of the repository that will be placed on your GitHub account url.* -In https://github.com/hackforla/VRMS, look for the fork icon in the top right. Click it and create a fork of the repository. +* In https://github.com/hackforla/VRMS, look for the fork icon in the top right. Click it and create a fork of the repository. -For git beginners, a fork is a copy of the repository that will be placed on your GitHub account url. +* It should create a copy here: https://github.com/YOUR_GITHUB_USERNAME/vrms, where `YOUR_GITHUB_USERNAME` is replaced with your github username. -It should create a copy here: https://github.com/your_GitHub_user_name/vrms, where `your_GitHub_user_name` is replaced with exactly that. +> NOTE: This copy is on a remote server on the GitHub website and not on your computer yet. -Note that this copy is on a remote server on the GitHub website and not on your computer yet. - -If you click the icon again, it will not create a new fork but instead give you the URL associated with your fork. +* Click the icon again, it will give you the URL associated with your forked repository and not create a new fork. ### **2.2 Clone the remote repository to your local computer** The following process will make a copy of the fork that you just created on your local computer. -First create a new folder on your local computer that will contain `hackforla` projects. - -In your shell, navigate there then run the following commands: - -```bash -git clone https://github.com/your_GitHub_user_name/vrms.git -``` - -You should now have a new folder in your `hackforla` folder called `vrms`. +1. Create a new folder on your local computer that will contain `hackforla` projects. -Verify which URL your `origin` remote is pointing to: +2. In your shell (terminal), navigate to this folder then run the following commands: + ```bash + git clone https://github.com/YOUR_GITHUB_USERNAME/vrms.git + ``` -```bash -git remote show origin -``` + You should now have a new folder in your `hackforla` folder called `vrms`. -If you accidentally cloned the `hackforla/vrms.git` then you can change your local copy to upload to your fork with the following: +3. Verify which URL your `origin` remote is pointing to: + ```bash + git remote show origin + ``` + Your terminal should return: + ```bash + remote origin + Fetch URL: https://github.com/YOUR_GITHUB_USERNAME/vrms.git + Push URL: https://github.com/YOUR_GITHUB_USERNAME/vrms.git + ... + ``` -```bash -git remote set-url origin https://github.com/your_user_name/vrms.git -``` + If you accidentally cloned the `hackforla/vrms.git` then you can change your local copy to upload to your fork with the following: -Add another remote called `vrms` that points to the `hackforla` version of the repository. This will allow you to incorporate changes later: + ```bash + git remote set-url origin https://github.com/YOUR_GITHUB_USERNAME/vrms.git + ``` -```bash -git remote add vrms https://github.com/hackforla/vrms.git -``` +4. Add another remote called `vrms` that points to the `hackforla` version of the repository. This will allow you to incorporate changes later: + ```bash + git remote add vrms https://github.com/hackforla/vrms.git + ``` -Note: Understanding how git remotes work will make collaborating much easier. You can learn more about remotes [here](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork) and [here](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes) +Note: Understanding how git remotes work will make collaborating much easier. You can learn more about remotes [here](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork) and [here](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes). ### **2.3 Get up and running** @@ -125,7 +128,10 @@ Note: Understanding how git remotes work will make collaborating much easier. Yo Note 2: `touch` is a Unix/Linux or Mac command; It is not available in Windows. In Windows, use a text editor (e.g. Notepad) to create an empty file and save it in each of the locations as `.env` . (If you use Windows Explorer to create the file it will create a file called `.env.txt`, which will not work.) - - Then paste the content from the [document](https://docs.google.com/document/d/1yDF6UmyO-MPNrl3y_Mw0mkm_WaixlSkXzWbudCzHXDY/edit?usp=sharing). It is accessible for the project team members only. + - Then paste the content from the [document](https://docs.google.com/document/d/1yDF6UmyO-MPNrl3y_Mw0mkm_WaixlSkXzWbudCzHXDY/edit?usp=sharing). It is accessible for the project team members only. + ```diff + + can the linked document indicate which client variables for local environment? + ``` - _Please note that the `ports` for the frontend and backend are set in this location_ 1. Take a second to review the `app.js` and `server.js` files in the `vrms/backend` folder. These two files are a blueprint for the back end, so please familiarize yourself with it. You'll see folders for the database collection models, routes for the API, and a config file which loads the necessary environment variables. @@ -184,21 +190,21 @@ Claiming an issue is a two step process: ### **3.2 Create a new branch for each issue you work on** -Create a new branch for each issue you work on. Doing all your work on feature branches leaves your repository's main branch unmodified and greatly simplifies keeping your fork in sync with the main project. - - -Before creating a new branch, always make sure you are currently on the `development` branch by using the command -``` -git branch -``` -Before creating a new branch, always pull down the latest changes from the `development` branch by using the command -``` -git pull vrms development -``` -Finally, create a new branch where you will work on your issue by using the command -``` -git checkout -b your-branch-name -``` +You will create a new branch for each issue you work on. Doing all your work on feature branches leaves your repository's main branch unmodified and greatly simplifies keeping your fork in sync with the main project. + + +1. Before creating a new branch, always make sure you are currently on the `development` branch by using the command + ```bash + git branch + ``` +2. Before creating a new branch, always pull down the latest changes from the `development` branch by using the command + ```bash + git pull vrms development + ``` +3. Finally, create a new branch where you will work on your issue by using the command: + ```bash + git checkout -b your-branch-name + ``` ### **3.3 Work on the Issue** Every issue will contain action items you must complete before you are ready to submit a pull request. Be sure to use the checkboxes as you complete each action item so we can track your progress! @@ -213,14 +219,14 @@ git commit -m "your commit message" ## **Part 4: How to create pull requests** ### **4.1 Push changes to your forked repository** -Before pushing code, always pull down the latest changes from the `development` branch by using the command -``` -git pull vrms development -``` -Once you are satisfied with your changes, push them to the feature branch you made within your remote repository. -``` -git push --set-upstream origin your-branch-name -``` +1. Before pushing code, always pull down the latest changes from the `development` branch by using the command + ``` + git pull vrms development + ``` +2. Once you are satisfied with your changes, push them to the feature branch you made within your remote repository. + ``` + git push --set-upstream origin your-branch-name + ``` ### **4.2 Create a pull request on the VRMS repository** 1. Go to your fork of the VRMS repository on GitHub and click on the `Compare & pull request` button.
    See screenshot
    2. Be sure to title your pull request by summarizing the changes you made From 4712316b6e943f984507c182035f7532d6f44345 Mon Sep 17 00:00:00 2001 From: chandler Date: Mon, 29 Apr 2024 19:13:35 -0700 Subject: [PATCH 140/157] removed diff formatted question CONTRIBUTING.md resolved environment variables question by updating elsewhere --- CONTRIBUTING.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d814b7b94..3bb6ceb5a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -129,9 +129,7 @@ Note: Understanding how git remotes work will make collaborating much easier. Yo Note 2: `touch` is a Unix/Linux or Mac command; It is not available in Windows. In Windows, use a text editor (e.g. Notepad) to create an empty file and save it in each of the locations as `.env` . (If you use Windows Explorer to create the file it will create a file called `.env.txt`, which will not work.) - Then paste the content from the [document](https://docs.google.com/document/d/1yDF6UmyO-MPNrl3y_Mw0mkm_WaixlSkXzWbudCzHXDY/edit?usp=sharing). It is accessible for the project team members only. - ```diff - + can the linked document indicate which client variables for local environment? - ``` + - _Please note that the `ports` for the frontend and backend are set in this location_ 1. Take a second to review the `app.js` and `server.js` files in the `vrms/backend` folder. These two files are a blueprint for the back end, so please familiarize yourself with it. You'll see folders for the database collection models, routes for the API, and a config file which loads the necessary environment variables. From 2fe099125707b0264b0ae455c2d0793e9bf107e6 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 12 May 2024 22:11:46 -0700 Subject: [PATCH 141/157] change btn text --- client/src/components/presentational/newUserForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/components/presentational/newUserForm.js b/client/src/components/presentational/newUserForm.js index 27a3a1d24..11931d0d2 100644 --- a/client/src/components/presentational/newUserForm.js +++ b/client/src/components/presentational/newUserForm.js @@ -169,7 +169,7 @@ const NewUserForm = (props) => {
    {props.errorMessage}
    } - {!props.isLoading ? ( + {!props.isLoading? (
    From c773bdae7aadded5e945977f1851aecfe917515d Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 12 May 2024 22:16:53 -0700 Subject: [PATCH 142/157] add space --- client/src/components/presentational/newUserForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/presentational/newUserForm.js b/client/src/components/presentational/newUserForm.js index 11931d0d2..461363a3c 100644 --- a/client/src/components/presentational/newUserForm.js +++ b/client/src/components/presentational/newUserForm.js @@ -169,7 +169,7 @@ const NewUserForm = (props) => {
    {props.errorMessage}
    } - {!props.isLoading? ( + {!props.isLoading ? (
    From 4474bb613e62fd73d779506b6a9fd658709b043e Mon Sep 17 00:00:00 2001 From: chandler Date: Thu, 16 May 2024 14:20:44 -0700 Subject: [PATCH 144/157] Remove ability for PMs to edit Project Information on VRMS (#1634) * conditionally rendering project form based on auth.isAdmin, conditionally rendering badge in TitleBox based on whether the prop exists * updates to auth.user.accessLevel * removed console.logs --- client/src/components/ProjectForm.js | 95 ++++++++++--------- .../src/components/parts/boxes/TitledBox.js | 44 ++++----- 2 files changed, 73 insertions(+), 66 deletions(-) diff --git a/client/src/components/ProjectForm.js b/client/src/components/ProjectForm.js index 34df40c8b..9ff63055c 100644 --- a/client/src/components/ProjectForm.js +++ b/client/src/components/ProjectForm.js @@ -64,7 +64,7 @@ export default function ProjectForm({ formData, projectToEdit, isEdit, - setFormData + setFormData, }) { const history = useHistory(); @@ -74,11 +74,11 @@ export default function ProjectForm({ const [editMode, setEditMode] = useState(false); const { auth } = useAuth(); const [isModalOpen, setIsModalOpen] = useState(false); - const handleOpen = () => setIsModalOpen(true) - const handleClose = () => setIsModalOpen(false) + const handleOpen = () => setIsModalOpen(true); + const handleClose = () => setIsModalOpen(false); const checkFields = () => { - history.push("/projects") - } + history.push('/projects'); + }; /** * React Hook Forms @@ -95,7 +95,7 @@ export default function ProjectForm({ handleSubmit, reset, formState: { errors }, - control + control, } = useForm({ mode: 'all', // Holds the current project data in state. @@ -104,7 +104,7 @@ export default function ProjectForm({ }, }); - const { dirtyFields } = useFormState({control}) + const { dirtyFields } = useFormState({ control }); // ----------------- Submit requests ----------------- @@ -134,8 +134,6 @@ export default function ProjectForm({ setEditMode(false); }; - - // ----------------- Handles and Toggles ----------------- // Handles the location radio button change. @@ -229,46 +227,51 @@ export default function ProjectForm({ Project Management - + ) : ( + + )} +
    { + isEdit ? submitEditProject(data) : submitNewProject(data); + })} > - - { - isEdit ? submitEditProject(data) : submitNewProject(data); - })} - > - - {arr.map((input) => ( - - ))} - ( + + ))} + - + + {auth.user.accessLevel === 'admin' ? ( @@ -279,14 +282,20 @@ export default function ProjectForm({ Close -
    + ) : ( + '' + )}
    ) : ( diff --git a/client/src/components/parts/boxes/TitledBox.js b/client/src/components/parts/boxes/TitledBox.js index 3d248991d..2bfbd11a5 100644 --- a/client/src/components/parts/boxes/TitledBox.js +++ b/client/src/components/parts/boxes/TitledBox.js @@ -2,27 +2,25 @@ import React from 'react'; import { Box, Typography, Divider } from '@mui/material'; export default function TitledBox({ title, children, badge, childrenBoxSx }) { - return ( - - - - - {title} - - - {badge} - - - {children} + return ( + + + + + {title} + - ); - - -} \ No newline at end of file + {badge ? badge : ' '} + + + {children} + + ); +} From 315f44884e3f0bec2ed243885b80cc9ef9a2d05a Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 15:16:37 -0700 Subject: [PATCH 145/157] chore: snackbarContext.js to .jsx --- client/src/context/{snackbarContext.js => snackbarContext.jsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/src/context/{snackbarContext.js => snackbarContext.jsx} (100%) diff --git a/client/src/context/snackbarContext.js b/client/src/context/snackbarContext.jsx similarity index 100% rename from client/src/context/snackbarContext.js rename to client/src/context/snackbarContext.jsx From c3772f0ef3e2d074de065e3fd6bd4ad1f0f949be Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 15:21:59 -0700 Subject: [PATCH 146/157] chore: TitledBox.js to .jsx --- client/src/components/parts/boxes/{TitledBox.js => TitledBox.jsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/src/components/parts/boxes/{TitledBox.js => TitledBox.jsx} (100%) diff --git a/client/src/components/parts/boxes/TitledBox.js b/client/src/components/parts/boxes/TitledBox.jsx similarity index 100% rename from client/src/components/parts/boxes/TitledBox.js rename to client/src/components/parts/boxes/TitledBox.jsx From 70d156c7eaa43e24d0e19cbd0df75aa514b576a9 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 15:24:22 -0700 Subject: [PATCH 147/157] chore: ValidatedTextField to .jsx --- .../parts/form/{ValidatedTextField.js => ValidatedTextField.jsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/src/components/parts/form/{ValidatedTextField.js => ValidatedTextField.jsx} (100%) diff --git a/client/src/components/parts/form/ValidatedTextField.js b/client/src/components/parts/form/ValidatedTextField.jsx similarity index 100% rename from client/src/components/parts/form/ValidatedTextField.js rename to client/src/components/parts/form/ValidatedTextField.jsx From bd563ee111156a1415e2908968bb0aa160038f8a Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 15:24:28 -0700 Subject: [PATCH 148/157] chore: ChangesModal to .jsx --- client/src/components/{ChangesModal.js => ChangesModal.jsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/src/components/{ChangesModal.js => ChangesModal.jsx} (100%) diff --git a/client/src/components/ChangesModal.js b/client/src/components/ChangesModal.jsx similarity index 100% rename from client/src/components/ChangesModal.js rename to client/src/components/ChangesModal.jsx From a3f6104c35375ec98bcabd040d600fe45cb708f1 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 15:24:31 -0700 Subject: [PATCH 149/157] chore: addProject to .jsx --- .../components/manageProjects/{addProject.js => addProject.jsx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/src/components/manageProjects/{addProject.js => addProject.jsx} (100%) diff --git a/client/src/components/manageProjects/addProject.js b/client/src/components/manageProjects/addProject.jsx similarity index 100% rename from client/src/components/manageProjects/addProject.js rename to client/src/components/manageProjects/addProject.jsx From 7912b874964fc4e5dd74c3c910af1801e60a109a Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 16:17:12 -0700 Subject: [PATCH 150/157] feat: Upgrade .nvmrc to 18 --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index b6a7d89c6..3c032078a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16 +18 From b688c3442aa631a1542277d7b3a913c85d69cc10 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Wed, 29 May 2024 16:24:22 -0700 Subject: [PATCH 151/157] chore: Add "dev" command in client/scripts --- client/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/client/package.json b/client/package.json index a3c25d1ac..a0173fb7f 100644 --- a/client/package.json +++ b/client/package.json @@ -34,6 +34,7 @@ }, "scripts": { "vite": "vite", + "dev": "vite", "start": "dotenv -e .env -e ../backend/.env -- cross-var cross-env PORT=%CLIENT_PORT% vite", "build": "vite build", "test": "vitest", From 0f625d865216cc7556cdd8525e954027cc0e21cc Mon Sep 17 00:00:00 2001 From: Brad Morgan Date: Wed, 29 May 2024 21:38:42 -0700 Subject: [PATCH 152/157] refactor project filtering for PMs (#1644) * refactor project filtering for PMs * update method name --- backend/controllers/project.controller.js | 10 ++++++++++ backend/routers/projects.router.js | 3 +++ client/src/api/ProjectApiService.js | 15 +++++++++++++++ client/src/pages/ProjectList.js | 17 +++++++---------- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/backend/controllers/project.controller.js b/backend/controllers/project.controller.js index dfbf51928..37c15025b 100644 --- a/backend/controllers/project.controller.js +++ b/backend/controllers/project.controller.js @@ -13,6 +13,16 @@ ProjectController.project_list = async function (req, res) { } }; +ProjectController.pm_filtered_projects = async function(req, res) { + try { + const projectList = await Project.find({}) + const projects = projectList.filter(proj => req.body.includes(proj._id.toString())) + return res.status(200).send(projects) + } catch(e) { + return res.sendStatus(400) + } +} + ProjectController.create = async function (req, res) { const { body } = req; diff --git a/backend/routers/projects.router.js b/backend/routers/projects.router.js index cfa217b07..533e300b8 100644 --- a/backend/routers/projects.router.js +++ b/backend/routers/projects.router.js @@ -7,6 +7,9 @@ const { AuthUtil } = require("../middleware"); // The base is /api/projects router.get('/', ProjectController.project_list); +// Its a put because we have to send the PM projects to be filtered here +router.put('/', ProjectController.pm_filtered_projects); + router.post('/', AuthUtil.verifyCookie, ProjectController.create); router.get('/:ProjectId', ProjectController.project_by_id); diff --git a/client/src/api/ProjectApiService.js b/client/src/api/ProjectApiService.js index 4e31814fe..7a863683f 100644 --- a/client/src/api/ProjectApiService.js +++ b/client/src/api/ProjectApiService.js @@ -83,6 +83,21 @@ class ProjectApiService { return undefined; } } + + async fetchPMProjects(projects) { + const requestOptions = { + headers: this.headers, + method: "PUT", + body: JSON.stringify(projects) + } + try { + const res = await fetch(this.baseProjectUrl, requestOptions); + return await res.json(); + } catch(e) { + console.error(e); + return undefined; + } + } } export default ProjectApiService; diff --git a/client/src/pages/ProjectList.js b/client/src/pages/ProjectList.js index 79e731f07..ae100e0f8 100644 --- a/client/src/pages/ProjectList.js +++ b/client/src/pages/ProjectList.js @@ -42,21 +42,18 @@ export default function ProjectList() { useEffect( function getProjectsOnMount() { async function fetchAllProjects() { - let projectsData = await projectApiService.fetchProjects(); + let projectData; - //sort the projects alphabetically - projectsData = projectsData.sort((a, b) => - a.name?.localeCompare(b.name) - ); + if(user?.accessLevel === 'admin') { + projectData = await projectApiService.fetchProjects(); + setProjects(projectData); + } // if user is not admin, but is a project manager, only show projects they manage if (user?.accessLevel !== 'admin' && user?.managedProjects.length > 0) { - projectsData = projectsData.filter((project) => - user.managedProjects.includes(project._id) - ); + projectData = await projectApiService.fetchPMProjects(user.managedProjects); + setProjects(projectData); } - - setProjects(projectsData); } fetchAllProjects(); From c37c5240a50e8815a50dd811803f3dcc2d262c3c Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 30 May 2024 12:11:30 -0700 Subject: [PATCH 153/157] feat: Upgrade vitest to ^1.36 in /client --- client/package.json | 2 +- client/yarn.lock | 542 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 436 insertions(+), 108 deletions(-) diff --git a/client/package.json b/client/package.json index a0173fb7f..439b82cbc 100644 --- a/client/package.json +++ b/client/package.json @@ -70,7 +70,7 @@ "prettier": "^2.1.1", "react-test-renderer": "^18.2.0", "sass": "^1.49.7", - "vitest": "^0.33.0" + "vitest": "^1.6.0" }, "engines": { "node": "<=18.0.0" diff --git a/client/yarn.lock b/client/yarn.lock index 01a2ff63e..fbb371c0b 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -322,116 +322,231 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/android-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + "@floating-ui/core@^1.0.0": version "1.6.2" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.2.tgz#d37f3e0ac1f1c756c7de45db13303a266226851a" @@ -603,6 +718,86 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-android-arm-eabi@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz#bbd0e616b2078cd2d68afc9824d1fadb2f2ffd27" + integrity sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ== + +"@rollup/rollup-android-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz#97255ef6384c5f73f4800c0de91f5f6518e21203" + integrity sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA== + +"@rollup/rollup-darwin-arm64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz#b6dd74e117510dfe94541646067b0545b42ff096" + integrity sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w== + +"@rollup/rollup-darwin-x64@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz#e07d76de1cec987673e7f3d48ccb8e106d42c05c" + integrity sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA== + +"@rollup/rollup-linux-arm-gnueabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz#9f1a6d218b560c9d75185af4b8bb42f9f24736b8" + integrity sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA== + +"@rollup/rollup-linux-arm-musleabihf@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz#53618b92e6ffb642c7b620e6e528446511330549" + integrity sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A== + +"@rollup/rollup-linux-arm64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz#99a7ba5e719d4f053761a698f7b52291cefba577" + integrity sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw== + +"@rollup/rollup-linux-arm64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz#f53db99a45d9bc00ce94db8a35efa7c3c144a58c" + integrity sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz#cbb0837408fe081ce3435cf3730e090febafc9bf" + integrity sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA== + +"@rollup/rollup-linux-riscv64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz#8ed09c1d1262ada4c38d791a28ae0fea28b80cc9" + integrity sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg== + +"@rollup/rollup-linux-s390x-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz#938138d3c8e0c96f022252a28441dcfb17afd7ec" + integrity sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg== + +"@rollup/rollup-linux-x64-gnu@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz#1a7481137a54740bee1ded4ae5752450f155d942" + integrity sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w== + +"@rollup/rollup-linux-x64-musl@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz#f1186afc601ac4f4fc25fac4ca15ecbee3a1874d" + integrity sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg== + +"@rollup/rollup-win32-arm64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz#ed6603e93636a96203c6915be4117245c1bd2daf" + integrity sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA== + +"@rollup/rollup-win32-ia32-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz#14e0b404b1c25ebe6157a15edb9c46959ba74c54" + integrity sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg== + +"@rollup/rollup-win32-x64-msvc@4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz#5d694d345ce36b6ecf657349e03eb87297e68da4" + integrity sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g== + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -805,19 +1000,7 @@ dependencies: "@babel/types" "^7.20.7" -"@types/chai-subset@^1.3.3": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.5.tgz#3fc044451f26985f45625230a7f22284808b0a9a" - integrity sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.5": - version "4.3.16" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" - integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== - -"@types/estree@^1.0.0": +"@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -884,55 +1067,56 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.2" -"@vitest/expect@0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.33.0.tgz#f48652591f3573ad6c2db828ad358d5c078845d3" - integrity sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ== +"@vitest/expect@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.0.tgz#0b3ba0914f738508464983f4d811bc122b51fb30" + integrity sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ== dependencies: - "@vitest/spy" "0.33.0" - "@vitest/utils" "0.33.0" - chai "^4.3.7" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" + chai "^4.3.10" -"@vitest/runner@0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.33.0.tgz#0b1a4d04ff8bc5cdad73920eac019d99550edf9d" - integrity sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg== +"@vitest/runner@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.0.tgz#a6de49a96cb33b0e3ba0d9064a3e8d6ce2f08825" + integrity sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg== dependencies: - "@vitest/utils" "0.33.0" - p-limit "^4.0.0" + "@vitest/utils" "1.6.0" + p-limit "^5.0.0" pathe "^1.1.1" -"@vitest/snapshot@0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.33.0.tgz#4400a90c48907808122b573053a2112a832b3698" - integrity sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA== +"@vitest/snapshot@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.0.tgz#deb7e4498a5299c1198136f56e6e0f692e6af470" + integrity sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ== dependencies: - magic-string "^0.30.1" + magic-string "^0.30.5" pathe "^1.1.1" - pretty-format "^29.5.0" + pretty-format "^29.7.0" -"@vitest/spy@0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.33.0.tgz#366074d3cf9cf1ed8aeaa76e50e78c799fb242eb" - integrity sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg== +"@vitest/spy@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.0.tgz#362cbd42ccdb03f1613798fde99799649516906d" + integrity sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw== dependencies: - tinyspy "^2.1.1" + tinyspy "^2.2.0" -"@vitest/utils@0.33.0": - version "0.33.0" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.33.0.tgz#6b9820cb8f128d649da6f78ecaa9b73d6222b277" - integrity sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA== +"@vitest/utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.0.tgz#5c5675ca7d6f546a7b4337de9ae882e6c57896a1" + integrity sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw== dependencies: - diff-sequences "^29.4.3" - loupe "^2.3.6" - pretty-format "^29.5.0" + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" -acorn-walk@^8.2.0: +acorn-walk@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.10.0, acorn@^8.11.3, acorn@^8.9.0: +acorn@^8.11.3: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -1861,7 +2045,7 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001625.tgz#ead1b155ea691d6a87938754d3cb119c24465b03" integrity sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w== -chai@^4.3.7: +chai@^4.3.10: version "4.4.1" resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== @@ -2015,7 +2199,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.1: +cross-spawn@^7.0.1, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2390,7 +2574,7 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff-sequences@^29.4.3: +diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== @@ -2604,6 +2788,35 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -2756,6 +2969,13 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2766,6 +2986,21 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2805,7 +3040,7 @@ fraction.js@^4.0.12: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -2856,6 +3091,11 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -2992,6 +3232,11 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + iconv-lite@0.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3174,6 +3419,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3261,6 +3511,11 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== +js-tokens@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" + integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -3332,10 +3587,13 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -local-pkg@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" - integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" local-storage@^2.0.0: version "2.0.0" @@ -3354,7 +3612,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.6: +loupe@^2.3.6, loupe@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== @@ -3383,7 +3641,7 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -magic-string@^0.30.1: +magic-string@^0.30.5: version "0.30.10" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== @@ -3404,6 +3662,11 @@ mathjs@^7.5.1: tiny-emitter "^2.1.0" typed-function "^2.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + micromatch@^4.0.2: version "4.0.7" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" @@ -3412,6 +3675,11 @@ micromatch@^4.0.2: braces "^3.0.3" picomatch "^2.3.1" +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3431,7 +3699,7 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mlly@^1.4.0, mlly@^1.7.0: +mlly@^1.4.2, mlly@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.0.tgz#587383ae40dda23cadb11c3c3cc972b277724271" integrity sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ== @@ -3491,6 +3759,13 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3562,6 +3837,13 @@ object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -3572,10 +3854,10 @@ os-tmpdir@^1.0.1: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== +p-limit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== dependencies: yocto-queue "^1.0.0" @@ -3606,6 +3888,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -3643,7 +3930,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pkg-types@^1.1.0: +pkg-types@^1.0.3, pkg-types@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.1.tgz#07b626880749beb607b0c817af63aac1845a73f2" integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== @@ -3657,7 +3944,7 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss@^8.4.27: +postcss@^8.4.27, postcss@^8.4.38: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -3678,7 +3965,7 @@ prettier@^2.1.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^29.5.0: +pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -3948,6 +4235,31 @@ rollup@^3.27.1: optionalDependencies: fsevents "~2.3.2" +rollup@^4.13.0: + version "4.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" + integrity sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.18.0" + "@rollup/rollup-android-arm64" "4.18.0" + "@rollup/rollup-darwin-arm64" "4.18.0" + "@rollup/rollup-darwin-x64" "4.18.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.18.0" + "@rollup/rollup-linux-arm-musleabihf" "4.18.0" + "@rollup/rollup-linux-arm64-gnu" "4.18.0" + "@rollup/rollup-linux-arm64-musl" "4.18.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.18.0" + "@rollup/rollup-linux-riscv64-gnu" "4.18.0" + "@rollup/rollup-linux-s390x-gnu" "4.18.0" + "@rollup/rollup-linux-x64-gnu" "4.18.0" + "@rollup/rollup-linux-x64-musl" "4.18.0" + "@rollup/rollup-win32-arm64-msvc" "4.18.0" + "@rollup/rollup-win32-ia32-msvc" "4.18.0" + "@rollup/rollup-win32-x64-msvc" "4.18.0" + fsevents "~2.3.2" + rw@1: version "1.3.3" resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" @@ -4064,6 +4376,11 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -4099,7 +4416,7 @@ stackback@0.0.2: resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -std-env@^3.3.3: +std-env@^3.5.0: version "3.7.0" resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== @@ -4162,12 +4479,17 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-literal@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" + integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== dependencies: - acorn "^8.10.0" + js-tokens "^9.0.0" stylis@4.2.0: version "4.2.0" @@ -4211,17 +4533,17 @@ tiny-warning@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tinybench@^2.5.0: +tinybench@^2.5.1: version "2.8.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== -tinypool@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.6.0.tgz#c3640b851940abe2168497bb6e43b49fafb3ba7b" - integrity sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ== +tinypool@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" + integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== -tinyspy@^2.1.1: +tinyspy@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== @@ -4355,17 +4677,16 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -vite-node@0.33.0: - version "0.33.0" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.33.0.tgz#c6a3a527e0b8090da7436241bc875760ae0eef28" - integrity sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw== +vite-node@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" + integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== dependencies: cac "^6.7.14" debug "^4.3.4" - mlly "^1.4.0" pathe "^1.1.1" picocolors "^1.0.0" - vite "^3.0.0 || ^4.0.0" + vite "^5.0.0" vite-plugin-svgr@^3.2.0: version "3.3.0" @@ -4376,7 +4697,7 @@ vite-plugin-svgr@^3.2.0: "@svgr/core" "^8.1.0" "@svgr/plugin-jsx" "^8.1.0" -"vite@^3.0.0 || ^4.0.0", vite@^4.4.4: +vite@^4.4.4: version "4.5.3" resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== @@ -4387,34 +4708,41 @@ vite-plugin-svgr@^3.2.0: optionalDependencies: fsevents "~2.3.2" -vitest@^0.33.0: - version "0.33.0" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.33.0.tgz#e2be6153aec1d30e3460ac6d64265bf72da2551c" - integrity sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ== +vite@^5.0.0: + version "5.2.12" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.2.12.tgz#3536c93c58ba18edea4915a2ac573e6537409d97" + integrity sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA== dependencies: - "@types/chai" "^4.3.5" - "@types/chai-subset" "^1.3.3" - "@types/node" "*" - "@vitest/expect" "0.33.0" - "@vitest/runner" "0.33.0" - "@vitest/snapshot" "0.33.0" - "@vitest/spy" "0.33.0" - "@vitest/utils" "0.33.0" - acorn "^8.9.0" - acorn-walk "^8.2.0" - cac "^6.7.14" - chai "^4.3.7" + esbuild "^0.20.1" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.0.tgz#9d5ad4752a3c451be919e412c597126cffb9892f" + integrity sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA== + dependencies: + "@vitest/expect" "1.6.0" + "@vitest/runner" "1.6.0" + "@vitest/snapshot" "1.6.0" + "@vitest/spy" "1.6.0" + "@vitest/utils" "1.6.0" + acorn-walk "^8.3.2" + chai "^4.3.10" debug "^4.3.4" - local-pkg "^0.4.3" - magic-string "^0.30.1" + execa "^8.0.1" + local-pkg "^0.5.0" + magic-string "^0.30.5" pathe "^1.1.1" picocolors "^1.0.0" - std-env "^3.3.3" - strip-literal "^1.0.1" - tinybench "^2.5.0" - tinypool "^0.6.0" - vite "^3.0.0 || ^4.0.0" - vite-node "0.33.0" + std-env "^3.5.0" + strip-literal "^2.0.0" + tinybench "^2.5.1" + tinypool "^0.8.3" + vite "^5.0.0" + vite-node "1.6.0" why-is-node-running "^2.2.2" warning@^4.0.2: From a81250681ac0391c2ad19714fd29d3fa3e846b6e Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 30 May 2024 12:13:21 -0700 Subject: [PATCH 154/157] feat: Switch alert to console log, allows test to complete --- client/src/components/Leaderboard.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Leaderboard.jsx b/client/src/components/Leaderboard.jsx index a6f1aa79f..e4a025051 100644 --- a/client/src/components/Leaderboard.jsx +++ b/client/src/components/Leaderboard.jsx @@ -20,7 +20,7 @@ const Leaderboard = (props) => { setUsers(resJson); } catch(error) { - alert(error); + console.log(error); } }; From e32a88b5fd8f5cc1b81ae70bd80d313ac3643e60 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 30 May 2024 12:13:57 -0700 Subject: [PATCH 155/157] chore: Rename Leaderboard.test.js --> .jsx for vitest --- .../components/{Leaderboard.test.js => Leaderboard.test.jsx} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename client/src/components/{Leaderboard.test.js => Leaderboard.test.jsx} (72%) diff --git a/client/src/components/Leaderboard.test.js b/client/src/components/Leaderboard.test.jsx similarity index 72% rename from client/src/components/Leaderboard.test.js rename to client/src/components/Leaderboard.test.jsx index 5367e50ed..60d9f9e4f 100644 --- a/client/src/components/Leaderboard.test.js +++ b/client/src/components/Leaderboard.test.jsx @@ -1,8 +1,9 @@ import React from "react"; import LeaderBoard from "./Leaderboard"; import renderer from "react-test-renderer"; +import { test, expect } from 'vitest' -it("renders without crashing", () => { +test("renders without crashing", () => { const tree = renderer.create().toJSON(); expect(tree).toMatchSnapshot(); }); From 9839bda2194b9e2ff07bbf99a8c861454be8c63c Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 30 May 2024 12:18:58 -0700 Subject: [PATCH 156/157] feat: Change `require` to import to resolve vitest module warning --- .../utilities/tests/addDurationToTime.test.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/client/src/components/manageProjects/utilities/tests/addDurationToTime.test.js b/client/src/components/manageProjects/utilities/tests/addDurationToTime.test.js index 87b9c6eab..84e81d84a 100644 --- a/client/src/components/manageProjects/utilities/tests/addDurationToTime.test.js +++ b/client/src/components/manageProjects/utilities/tests/addDurationToTime.test.js @@ -1,7 +1,8 @@ -const {addDurationToTime} = require('../addDurationToTime') +// const {addDurationToTime} = require('../addDurationToTime') +import {addDurationToTime} from '../addDurationToTime' +import {test, expect} from 'vitest' -describe('addDurationToTime', () => { - it('adds inputted "0.5" duration to inputted time', () => { + test('adds inputted "0.5" duration to inputted time', () => { const inputDuration = "0.5" const inputTime = new Date() const outputTime = new Date(inputTime.getTime() + (.5*3600000)) @@ -9,7 +10,7 @@ describe('addDurationToTime', () => { expect(addDurationToTime(inputTime, inputDuration)).toEqual(outputTime) }) - it('adds inputted ".5" duration to inputted time', () => { + test('adds inputted ".5" duration to inputted time', () => { const inputDuration = ".5" const inputTime = new Date() const outputTime = new Date(inputTime.getTime() + (.5*3600000)) @@ -17,7 +18,7 @@ describe('addDurationToTime', () => { expect(addDurationToTime(inputTime, inputDuration)).toEqual(outputTime) }) - it('adds inputted "3" hour duration to inputted time', () => { + test('adds inputted "3" hour duration to inputted time', () => { const inputDuration = "3" const inputTime = new Date() const outputTime = new Date(inputTime.getTime() + (3*3600000)) @@ -25,8 +26,7 @@ describe('addDurationToTime', () => { expect(addDurationToTime(inputTime, inputDuration)).toEqual(outputTime) }) - it('throws an error when there is no valid input', () => { + test('throws an error when there is no valid input', () => { expect(addDurationToTime).toThrow(new Error('Error: Cannot calculate endTime.')) - }) -}) \ No newline at end of file + }) \ No newline at end of file From 51e942992ab03c242133203b173e24ab1bd6ea15 Mon Sep 17 00:00:00 2001 From: Trillium Smith Date: Thu, 30 May 2024 12:21:32 -0700 Subject: [PATCH 157/157] feat: Add Leaderboard test snapshot --- .../__snapshots__/Leaderboard.test.jsx.snap | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 client/src/components/__snapshots__/Leaderboard.test.jsx.snap diff --git a/client/src/components/__snapshots__/Leaderboard.test.jsx.snap b/client/src/components/__snapshots__/Leaderboard.test.jsx.snap new file mode 100644 index 000000000..e2dc2d852 --- /dev/null +++ b/client/src/components/__snapshots__/Leaderboard.test.jsx.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`renders without crashing 1`] = ` +
    +
    +

    + Volunteer Leaderboard +

    +
    +
    +
      +
    +
    +`;