From 350942ae568aa837ea4e496e687c18b232b3d80e Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Wed, 22 Jul 2020 15:41:17 -0500 Subject: [PATCH 1/8] activity.js comments and restyling. --- .../src/components/ViewActivities/activity.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/ViewActivities/activity.js b/frontend/src/components/ViewActivities/activity.js index e1f9772e..71f98c76 100644 --- a/frontend/src/components/ViewActivities/activity.js +++ b/frontend/src/components/ViewActivities/activity.js @@ -20,11 +20,6 @@ class Activity extends React.Component { super(props); this.state = { editing: false }; - - // Bind state users/modifiers to `this`. - this.setEditActivity = this.setEditActivity.bind(this); - this.finishEditActivity = this.finishEditActivity.bind(this); - this.displayCard = this.displayCard.bind(this); } /** @@ -34,17 +29,13 @@ class Activity extends React.Component { /** * Set the activity into viewing mode. - * - * @param {event} event The form's event. */ - finishEditActivity(event) { - this.setState({editing: false}); - }; + finishEditActivity = () => { this.setState({editing: false}); }; /** - * Display the current activity, either in view or display mode. + * Display the current activity, either in view or edit mode. */ - displayCard() { + displayCard = () => { let activity = this.props.activity; if (!this.state.editing) { // View mode. return ( @@ -70,7 +61,9 @@ class Activity extends React.Component { {activity[DB.ACTIVITIES_TITLE]} - + { this.displayCard() } From 9c21f48a8e2359c2930b77e5381af2c1cdcdf46b Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Wed, 22 Jul 2020 15:56:22 -0500 Subject: [PATCH 2/8] update jsdocs --- .../src/components/ViewActivities/activity.js | 2 ++ .../components/ViewActivities/activityfns.js | 32 +++++++++-------- .../components/ViewActivities/activitylist.js | 2 +- .../editActivityFormElements.js | 34 +++++++++---------- .../src/components/ViewActivities/index.js | 6 ++-- 5 files changed, 40 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/ViewActivities/activity.js b/frontend/src/components/ViewActivities/activity.js index 71f98c76..6712bc28 100644 --- a/frontend/src/components/ViewActivities/activity.js +++ b/frontend/src/components/ViewActivities/activity.js @@ -34,6 +34,8 @@ class Activity extends React.Component { /** * Display the current activity, either in view or edit mode. + * + * @return {HTML} The current activity in correct mode. */ displayCard = () => { let activity = this.props.activity; diff --git a/frontend/src/components/ViewActivities/activityfns.js b/frontend/src/components/ViewActivities/activityfns.js index 7484c0cb..315736a3 100644 --- a/frontend/src/components/ViewActivities/activityfns.js +++ b/frontend/src/components/ViewActivities/activityfns.js @@ -24,7 +24,7 @@ const db = app.firestore(); /** * Sort a list of trip activities by date. - * @param {ActivityInfo[]} tripActivities Array of activities. + * @param {!ActivityInfo[]} tripActivities Array of activities. * @return {DayOfActivities[]} List of trip activities in the form *
[ , ...]
* in chronological order by date. @@ -50,8 +50,8 @@ export function sortByDate(tripActivities) { /** * Puta andb in display order. * This function is a comparator. - * @param {ActivityInfo} a Dictionary representing activity a and its fields. - * @param {ActivityInfo} b Dictionary representing activity b and its fields. + * @param {!ActivityInfo} a Dictionary representing activity a and its fields. + * @param {!ActivityInfo} b Dictionary representing activity b and its fields. * @return {int} -1 if a comes before b, else 1. */ export function compareActivities(a, b) { @@ -69,11 +69,11 @@ export function compareActivities(a, b) { /** * Get the field of field name fieldName from activity or the default value. * - * @param {ActivityInfo} activity The activity from which to get the field. - * @param {string} fieldName Name of field to get. - * @param {*} defaultValue Value if field is not found/is null. - * @param {string} prefix The prefix to put before a returned value if the field exists. - * @returns {*} activity[fieldName] if possible, else defaultValue. + * @param {!ActivityInfo} activity The activity from which to get the field. + * @param {!string} fieldName Name of field to get. + * @param {*} [defaultValue=null] Value if field is not found/is null. + * @param {string} [prefix=''] The prefix to put before a returned value if the field exists. + * @return {*} activity[fieldName] if possible, else defaultValue. */ export function getField(activity, fieldName, defaultValue=null, prefix=''){ if (activity[fieldName] === null || activity[fieldName] === undefined) { @@ -85,10 +85,10 @@ export function getField(activity, fieldName, defaultValue=null, prefix=''){ /** * Write contents into an activity already existing in the database. * - * @param {string} tripId Database ID of the trip whose actiivty should be modified. - * @param {string} activityId Database ID of the activity to be modified. + * @param {!string} tripId Database ID of the trip whose actiivty should be modified. + * @param {!string} activityId Database ID of the activity to be modified. * @param {Object} newValues Dictionary of the new values in {fieldName: newValue} form - * @returns {boolean} true if the write was successful, false otherwise. + * @return {boolean} true if the write was successful, false otherwise. */ export async function writeActivity(tripId, activityId, newValues) { // todo: check if tripId or activityId is not valid. (#58) @@ -113,10 +113,12 @@ export async function writeActivity(tripId, activityId, newValues) { /** * Get the value of a reference. * - * @param {Reference} ref Reference to get the value of. - * @param {string} ignoreValue The "null" or "none" value that ref could be. - * @param {string} defaultValue Value to return if ref.current.value === ignoreValue. - * @returns defaultValue if ref.current.value === ignoreValue, else ref.current.value. + * Note: This function breaks if ref.current is null. This is intentional. + * + * @param {!Reference} ref Reference to get the value of. + * @param {?string} ignoreValue The "null" or "none" value that ref could be. + * @param {?string} [defaultValue=null] Value to return if ref.current.value === ignoreValue. + * @return defaultValue if ref.current.value === ignoreValue, else ref.current.value. */ export function getRefValue(ref, ignoreValue, defaultValue=null) { if (ref.current.value === ignoreValue) { diff --git a/frontend/src/components/ViewActivities/activitylist.js b/frontend/src/components/ViewActivities/activitylist.js index 9dad6f86..b3ad15ff 100644 --- a/frontend/src/components/ViewActivities/activitylist.js +++ b/frontend/src/components/ViewActivities/activitylist.js @@ -10,7 +10,7 @@ const db = app.firestore(); /** * Gets the list of activities from the server. * - * @param {string} tripId The trip ID. + * @param {!string} tripId The trip ID. * @return {ActivityInfo[]} The list of trip activities. */ export async function getActivityList(tripId) { diff --git a/frontend/src/components/ViewActivities/editActivityFormElements.js b/frontend/src/components/ViewActivities/editActivityFormElements.js index db1c5343..611dd892 100644 --- a/frontend/src/components/ViewActivities/editActivityFormElements.js +++ b/frontend/src/components/ViewActivities/editActivityFormElements.js @@ -12,11 +12,11 @@ const TZPICKERWIDTH = 3; /** * Create a Text element Form Group for the editActivity form. * - * @param {string} controlId FormGroup's control ID. - * @param {string} formLabel The label of the field for this FormGroup. - * @param {string} placeHolder The input's placeholder. - * @param {ref} ref The input's reference. - * @returns {HTML} A text element form group. + * @param {!string} controlId FormGroup's control ID. + * @param {!string} formLabel The label of the field for this FormGroup. + * @param {!string} placeHolder The input's placeholder. + * @param {?ref} ref The input's reference. + * @return {HTML} A text element form group. */ export function textElementFormGroup(controlId, formLabel, placeHolder, ref) { return ( @@ -34,10 +34,10 @@ export function textElementFormGroup(controlId, formLabel, placeHolder, ref) { /** * Create a Location Dropdown element Form Group for the editActivity form. * - * @param {string} controlId FormGroup's control ID. - * @param {string} formLabel The label of the field for this FormGroup. - * @param {string} dropdown The dropdown. - * @returns {HTML} a location dropdown form group. + * @param {!string} controlId FormGroup's control ID. + * @param {!string} formLabel The label of the field for this FormGroup. + * @param {!string} dropdown The dropdown. + * @return {HTML} a location dropdown form group. */ export function locationElementFormGroup(controlId, formLabel, dropdown) { return ( @@ -52,14 +52,14 @@ export function locationElementFormGroup(controlId, formLabel, dropdown) { * Create a Form Group for inserting date, time, and timezone for * the editActivity form.. * - * @param {string} controlId FormGroup's control ID. - * @param {string} formLabel Label of the field for this FormGroup. - * @param {ref} dateRef Date's reference. - * @param {string} dateDefault Default date. - * @param {ref} timeRef Time's reference. - * @param {ref} timeDefault Default time. - * @param {HTML} tzpicker Timezone picker dropdown. - * @returns {HTML} A FormGroup for date, time, and timezone. + * @param {!string} controlId FormGroup's control ID. + * @param {!string} formLabel Label of the field for this FormGroup. + * @param {?ref} dateRef Date's reference. + * @param {!string} dateDefault Default date. + * @param {?ref} timeRef Time's reference. + * @param {!ref} timeDefault Default time. + * @param {!HTML} tzpicker Timezone picker dropdown. + * @return {HTML} A FormGroup for date, time, and timezone. */ export function dateTimeTzFormGroup(controlId, formLabel, dateRef, dateDefault, timeRef, timeDefault, tzpicker) { diff --git a/frontend/src/components/ViewActivities/index.js b/frontend/src/components/ViewActivities/index.js index bbcb2a55..025491e7 100644 --- a/frontend/src/components/ViewActivities/index.js +++ b/frontend/src/components/ViewActivities/index.js @@ -2,10 +2,10 @@ import React from 'react'; import ActivityList from './activitylist.js'; /** - * The whole view activities page. + * React component for the whole 'view activities' page. * - * @param {Object} props This component expects the following props: - * - `tripId` {string} The trip's ID. This is sent to the component through the URL. + * @property {Object} props ReactJS props. + * @property {ActivityInfo} props.tripId This is sent to the component through the URL. */ class ViewActivities extends React.Component { render() { From 97c6b92e4a484453e2708ed831f924fb5136a82c Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Thu, 23 Jul 2020 16:08:10 -0500 Subject: [PATCH 3/8] change types --- frontend/src/components/Utils/time.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/Utils/time.js b/frontend/src/components/Utils/time.js index c9332347..1a1d5e48 100644 --- a/frontend/src/components/Utils/time.js +++ b/frontend/src/components/Utils/time.js @@ -6,7 +6,7 @@ import { firestore } from 'firebase'; * Format a timestamp (in milliseconds) into a pretty string with just the time like * '10.19 AM'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} timezone Timezone in which to convert. * @return {string} Time formatted into desired pretty string. */ @@ -18,7 +18,7 @@ export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_Yo * Format a timestamp (in milliseconds) into a pretty string with just the date, like * 'Monday, January 19, 1970'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} timezone Timezone in which to convert. * @return {string} Time formatted into desired pretty string. */ @@ -30,7 +30,7 @@ export function timestampToDateFormatted(msTimestamp, timezone='America/New_York * Format a timestamp (in milliseconds) into a pretty string like * 'Monday, January 19, 1970, 02:48 AM'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} timezone Timezone in which to convert. * @return {string} Time formatted into desired pretty string. */ @@ -60,7 +60,7 @@ export function timezonesForCountry(countryName) { /** * Get a date in 'YYYY-MM-DD' format. * - * @param {string} msTimestamp Timestamp, in milliseconds since epoch. + * @param {number} msTimestamp Timestamp, in milliseconds since epoch. * @param {string} timezone The timezone which the string should be returned in. * @returns {string} The date in 'YYYY-MM-DD' format. */ @@ -74,7 +74,7 @@ export function getDateBarebones(msTimestamp, timezone=null) { /** * Get a time in 24-hour ('HH:mm') format. * - * @param {string} msTimestamp Timestamp, in milliseconds since epoch. + * @param {number} msTimestamp Timestamp, in milliseconds since epoch. * @param {string} timezone The timezone which the string should be returned in. * @returns {string} The time in 24-hour (HH:mm) format. */ From edfd5bc39c99edfe313b145eb339285fc03cfbc9 Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Fri, 24 Jul 2020 10:27:02 -0500 Subject: [PATCH 4/8] jsdoc links and arrays --- frontend/src/components/ViewActivities/activityfns.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/components/ViewActivities/activityfns.js b/frontend/src/components/ViewActivities/activityfns.js index 315736a3..bff000d9 100644 --- a/frontend/src/components/ViewActivities/activityfns.js +++ b/frontend/src/components/ViewActivities/activityfns.js @@ -25,8 +25,7 @@ const db = app.firestore(); /** * Sort a list of trip activities by date. * @param {!ActivityInfo[]} tripActivities Array of activities. - * @return {DayOfActivities[]} List of trip activities in the form - *
[ , ...]
+ * @return {DayOfActivities[]} List of {@link DayOfActivities} * in chronological order by date. */ export function sortByDate(tripActivities) { From c5dcb4f31b0a5aa5f7c0948539360f72268bb67c Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Fri, 31 Jul 2020 10:35:30 -0500 Subject: [PATCH 5/8] setup jsdoc framework --- .gitignore | 1 + frontend/.jsdoc.conf.json | 22 +++ frontend/package-lock.json | 136 ++++++++++++++++++ frontend/package.json | 6 +- frontend/src/components/Utils/filter-input.js | 4 +- 5 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 frontend/.jsdoc.conf.json diff --git a/.gitignore b/.gitignore index 4bd0f035..e6a16856 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ target/ # Don't include log files *.log +frontend/docs/* \ No newline at end of file diff --git a/frontend/.jsdoc.conf.json b/frontend/.jsdoc.conf.json new file mode 100644 index 00000000..9b622c1f --- /dev/null +++ b/frontend/.jsdoc.conf.json @@ -0,0 +1,22 @@ +{ + "plugins": ["plugins/markdown"], + "recurseDepth": 10, + "opts": { + "recurse": true, + "destination": "./docs/" + }, + "source": { + "include": ["src"], + "includePattern": ".+\\.js(doc|x)?$", + "excludePattern": "node_modules" + }, + "sourceType": "module", + "tags": { + "allowUnknownTags": true, + "dictionaries": ["jsdoc", "closure"] + }, + "templates": { + "cleverLinks": false, + "monospaceLinks": false + } +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3954b7b3..0c81f2cc 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -3575,6 +3575,15 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -7859,11 +7868,56 @@ "esprima": "^4.0.0" } }, + "js2xmlparser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", + "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.3" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdoc": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.5.tgz", + "integrity": "sha512-SbY+i9ONuxSK35cgVHaI8O9senTE4CDYAmGSDJ5l3+sfe62Ff4gy96osy6OW84t4K4A8iGnMrlRrsSItSNp3RQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.8.11", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.1", + "klaw": "^3.0.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^0.8.2", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.10.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "jsdom": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", @@ -8001,6 +8055,15 @@ "is-buffer": "^1.1.5" } }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -8060,6 +8123,15 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -8292,6 +8364,31 @@ "object-visit": "^1.0.0" } }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, "material-design-lite": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", @@ -8312,6 +8409,12 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -11532,6 +11635,15 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "requizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -12825,6 +12937,12 @@ } } }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -13235,6 +13353,12 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "uncontrollable": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz", @@ -13246,6 +13370,12 @@ "react-lifecycles-compat": "^3.0.4" } }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -14470,6 +14600,12 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmlcreate": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", + "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", + "dev": true + }, "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 891f2261..707532af 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,7 +24,8 @@ "local": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", - "eject": "react-scripts eject" + "eject": "react-scripts eject", + "docs": "./node_modules/.bin/jsdoc src -r -c ./.jsdoc.conf.json -d docs" }, "engines": { "node": "10.x.x" @@ -44,5 +45,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "jsdoc": "~3.6.5" } } diff --git a/frontend/src/components/Utils/filter-input.js b/frontend/src/components/Utils/filter-input.js index ab679147..6dee05f6 100644 --- a/frontend/src/components/Utils/filter-input.js +++ b/frontend/src/components/Utils/filter-input.js @@ -21,9 +21,9 @@ export function getCleanedTextInput(rawInput, defaultValue) { * TODO(#72 & #67): Remove 'remove empty fields' once there is better way to * remove collaborators (#72) and there is email validation (#67). * - * @param {!Array{string}} collaboratorEmailsArr Array of emails corresponding + * @param {!Array.} collaboratorEmailsArr Array of emails corresponding * to the collaborators of the trip (not including the trip creator email). - * @return {!Array{string}} Array of all collaborator uids (including trip + * @return {!Array.} Array of all collaborator uids (including trip * creator uid). */ export function getCollaboratorUidArray(collaboratorEmailArr) { From 5b203657c740327e50ba11cc4164c184d6e7798e Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Tue, 4 Aug 2020 11:28:55 -0500 Subject: [PATCH 6/8] More documentation updates --- frontend/src/components/Utils/time.js | 38 +++++++------ .../components/ViewActivities/activityfns.js | 55 +++++++------------ .../components/ViewActivities/activitylist.js | 2 +- .../components/ViewActivities/editActivity.js | 16 ++++-- .../src/components/ViewActivities/index.js | 49 +++++++++-------- 5 files changed, 79 insertions(+), 81 deletions(-) diff --git a/frontend/src/components/Utils/time.js b/frontend/src/components/Utils/time.js index 6fc09488..9953d44f 100644 --- a/frontend/src/components/Utils/time.js +++ b/frontend/src/components/Utils/time.js @@ -6,8 +6,9 @@ import { firestore } from 'firebase'; * Format a timestamp (in milliseconds) into a pretty string with just the time. * Example: '10:19 AM'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. - * @param {string} timezone Timezone in which to convert. + * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {string} [timezone='America/New_York'] + * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. */ export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_York') { @@ -21,8 +22,9 @@ export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_Yo * Format a timestamp (in milliseconds) into a pretty string with just the date. * Example: 'Monday, January 19, 1970'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. - * @param {string} timezone Timezone in which to convert. + * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {string} [timezone='America/New_York'] + * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. */ export function timestampToDateFormatted(msTimestamp, timezone='America/New_York') { @@ -36,8 +38,9 @@ export function timestampToDateFormatted(msTimestamp, timezone='America/New_York * Format a timestamp (in milliseconds) into a pretty string. * Example: 'Monday, January 19, 1970 02:48 AM PST'. * - * @param {int} msTimestamp Timestamp in milliseconds of desired date. - * @param {string} timezone Timezone in which to convert. + * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {string} [timezone='America/New_York'] + * Timezone in which to convert (using underscores, not spaces). * @returns {string} Formatted time. */ export function timestampToFormatted(msTimestamp, timezone = 'America/New_York') { @@ -51,7 +54,7 @@ export function timestampToFormatted(msTimestamp, timezone = 'America/New_York') /** * Return a Firestore Timestamp corresponding to the date in `dateStr`. * - * @param {string} dateStr String containing a date in the form 'YYYY-MM-DD'. + * @param {!string} dateStr String containing a date in the form 'YYYY-MM-DD'. * @return {firestore.Timestamp} Firestore timestamp object created. */ export function getTimestampFromDateString(dateStr) { @@ -67,7 +70,7 @@ export function getTimestampFromDateString(dateStr) { /** * Formats a Firestore timestamp into a date string in ISO format. * - * @param {firestore.Timestamp} timestamp Firestore timestamp object. + * @param {!firestore.Timestamp} timestamp Firestore timestamp object. * @return {string} ISO formatted date string: "YYYY-MM-DD or 2020-05-12". */ export function timestampToISOString(timestamp) { @@ -77,8 +80,9 @@ export function timestampToISOString(timestamp) { /** * Returns all the time zones in a country (in displayable format). * - * @param {string} countryName The name of the country for which to get the time zones. + * @param {?string} countryName The name of the country for which to get the time zones. * @return {string[]} The list of time zones in the provided country. + * Null or unfamiliar values of `countryName` will return the list of all timezones. */ export function timezonesForCountry(countryName) { let zones; @@ -96,9 +100,10 @@ export function timezonesForCountry(countryName) { /** * Get a date in 'YYYY-MM-DD' format. * - * @param {number} msTimestamp Timestamp, in milliseconds since epoch. - * @param {string} timezone The timezone which the string should be returned in. + * @param {!number} msTimestamp Timestamp, in milliseconds since epoch. + * @param {string} [timezone=null] The timezone which the string should be returned in. * @return {string} The date in 'YYYY-MM-DD' format. + * A null value will return timezone in GMT. */ export function getISODate(msTimestamp, timezone=null) { if (timezone === null) { @@ -110,9 +115,10 @@ export function getISODate(msTimestamp, timezone=null) { /** * Get a time in 24-hour ('HH:mm') format. * - * @param {number} msTimestamp Timestamp, in milliseconds since epoch. - * @param {string} timezone The timezone which the string should be returned in. + * @param {!number} msTimestamp Timestamp, in milliseconds since epoch. + * @param {string} [timezone=null] The timezone which the string should be returned in. * @return {string} The time in 24-hour (HH:mm) format. + * A null value will return timezone in GMT. */ export function get24hTime(msTimestamp, timezone = null) { if (timezone === null) { @@ -124,9 +130,9 @@ export function get24hTime(msTimestamp, timezone = null) { /** * Get a Firebase Timestamp object for time. * - * @param {string} time The time in 'HH:mm' format. - * @param {string} date The date in 'YYYY-MM-DD' format. - * @param {string} tz The timezone in which the date takes place. + * @param {!string} time The time in 'HH:mm' format. + * @param {!string} date The date in 'YYYY-MM-DD' format. + * @param {!string} tz The timezone in which the date takes place. * @return {firestore.Timestamp} Firestore timestamp object at the same time. */ export function firebaseTsFromISO(time, date, tz) { diff --git a/frontend/src/components/ViewActivities/activityfns.js b/frontend/src/components/ViewActivities/activityfns.js index a7bff751..a072e300 100644 --- a/frontend/src/components/ViewActivities/activityfns.js +++ b/frontend/src/components/ViewActivities/activityfns.js @@ -13,28 +13,31 @@ const db = app.firestore(); * @property {string} title The activity's title. * @property {long} start_time Number of seconds since epoch of activity's start time. * @property {long} end_time Number of seconds since epoch of activity's end time. + * @property {string} start_tz The timezone in which the activity starts. + * @property {string} end_tz The timezone in which the activity ends. + * @property {string} [start_country] The country in which the activity starts. + * @property {string} [end_country] The country in which the activity ends. * @property {string} [description] The activity's description. */ /** * A single activity day. A single instance looks like: - *
 ['MM/DD/YYYY', [activities on that day]]
+ * ```['MM/DD/YYYY', [activities on that day]]``` * @typedef {Array.} DayOfActivities - * */ -/* +/** * Get the field of field name `fieldName` from `activity` or the default value. * - * @param {Object} activity Activity to get field from. - * @param {string} fieldName Name of the field in the activity to get. - * @param {?*} [defaultValue=null] Default value to return if activity[fieldName] can't be found. - * Can be any type. - * @param {string} [prefix=''] The prefix to put before a returned value if the field exists. + * @param {!ActivityInfo} activity Activity to get field from. + * @param {!string} fieldName Name of the field in the activity to get. + * @param {?*} [defaultValue=null] Default value to return if activity[fieldName] + * can't be found. Can be any type. + * @param {string} [prefix=''] The prefix to put before a returned value if the + * field exists. * @return {*} `activity[fieldName]` if possible, else `defaultValue`. Can be any type. */ -export function getField( - activity, fieldName, defaultValue = null, prefix = '') { +export function getField (activity, fieldName, defaultValue = null, prefix = '') { if (activity[fieldName] === null || activity[fieldName] === undefined) { return defaultValue; } @@ -67,11 +70,11 @@ export function sortByDate(tripActivities) { } /** - * Puta andb in display order. + * Put`a and `b` in display order. * This function is a comparator. - * @param {!ActivityInfo} a Dictionary representing activity a and its fields. - * @param {!ActivityInfo} b Dictionary representing activity b and its fields. - * @return {int} -1 if a comes before b, else 1. + * @param {!ActivityInfo} a Dictionary representing activity `a` and its fields. + * @param {!ActivityInfo} b Dictionary representing activity `b` and its fields. + * @return {int} `-1` if `a` comes before `b`, else `1`. */ export function compareActivities(a, b) { if (a[DB.ACTIVITIES_START_TIME] < b[DB.ACTIVITIES_START_TIME]) { @@ -84,30 +87,14 @@ export function compareActivities(a, b) { return -1; } - -/** - * Get the field of field name fieldName from activity or the default value. - * - * @param {!ActivityInfo} activity The activity from which to get the field. - * @param {!string} fieldName Name of field to get. - * @param {*} [defaultValue=null] Value if field is not found/is null. - * @param {string} [prefix=''] The prefix to put before a returned value if the field exists. - * @return {*} activity[fieldName] if possible, else defaultValue. - */ -export function getField(activity, fieldName, defaultValue=null, prefix=''){ - if (activity[fieldName] === null || activity[fieldName] === undefined) { - return defaultValue; - } - return prefix + activity[fieldName]; -} - /** * Write contents into an activity already existing in the database. * * @param {!string} tripId Database ID of the trip whose actiivty should be modified. * @param {!string} activityId Database ID of the activity to be modified. - * @param {Object} newValues Dictionary of the new values in {fieldName: newValue} form - * @return {boolean} true if the write was successful, false otherwise. + * @param {!Objects} newValues Dictionary of the new values in `{fieldName: newValue}` + * form. None of the entries can be lists. + * @return {boolean} `true` if the write was successful, `false` otherwise. */ export async function writeActivity(tripId, activityId, newValues) { // todo: check if tripId or activityId is not valid. (#58) @@ -132,7 +119,7 @@ export async function writeActivity(tripId, activityId, newValues) { /** * Get the value of a reference. * - * Note: This function breaks if ref.current is null. This is intentional. + * Note: This function breaks if `ref.current` is null. This is intentional. * * @param {!Reference} ref Reference to get the value of. * @param {?string} ignoreValue The "null" or "none" value that ref could be. diff --git a/frontend/src/components/ViewActivities/activitylist.js b/frontend/src/components/ViewActivities/activitylist.js index 4a6ba54a..f63ba7bb 100644 --- a/frontend/src/components/ViewActivities/activitylist.js +++ b/frontend/src/components/ViewActivities/activitylist.js @@ -27,7 +27,7 @@ class ActivityList extends React.Component { * * This function sets `this.state.days` to the sorted days. * - * @param {string} tripId The trip ID. + * @param {!string} tripId The trip ID. */ async getActivityList(tripId) { db.collection(DB.COLLECTION_TRIPS).doc(tripId) diff --git a/frontend/src/components/ViewActivities/editActivity.js b/frontend/src/components/ViewActivities/editActivity.js index c2ef125f..bbc587e6 100644 --- a/frontend/src/components/ViewActivities/editActivity.js +++ b/frontend/src/components/ViewActivities/editActivity.js @@ -79,7 +79,11 @@ class EditActivity extends React.Component { writeActivity(this.props.activity.tripId, this.props.activity.id, newVals); } - /** Runs when the `submit` button on the form is pressed. */ + /** + * Runs when the `submit` button on the form is pressed. + * + * @param event The form event. + */ finishEditActivity(event) { event.preventDefault(); this.editActivity(); @@ -96,9 +100,9 @@ class EditActivity extends React.Component { * The dropdown's values change based on the corrresponding country dropdown to * reduce scrolling and ensure that the location corresponds to the time zone. * - * @param st Either 'start' or 'end' depending on whether the + * @param {!string} st Either 'start' or 'end' depending on whether the * timezone is for the start or end timezone. - * @param defaultTz The default time zone. + * @param {!string} defaultTz The default time zone. * @returns HTML dropdown item. */ timezoneDropdown(st, defaultTz) { @@ -131,9 +135,9 @@ class EditActivity extends React.Component { * so when the country changes here, the values in the timezone dropdown * change as well. * - * @param {ref} ref The reference to attach to the dropdown. - * @param {ref} tzref The corresponding time zone reference field. - * @param {string} defaultCountry The default country for the dropdown. + * @param {!ref} ref The reference to attach to the dropdown. + * @param {!ref} tzref The corresponding time zone reference field. + * @param {!string} defaultCountry The default country for the dropdown. * @return {HTML} HTML dropdown of all the countries with timezones. */ countriesDropdown(ref, tzref, defaultCountry) { diff --git a/frontend/src/components/ViewActivities/index.js b/frontend/src/components/ViewActivities/index.js index d718a676..27a97632 100644 --- a/frontend/src/components/ViewActivities/index.js +++ b/frontend/src/components/ViewActivities/index.js @@ -32,7 +32,7 @@ class ViewActivities extends React.Component { * Create an empty activity (with filler information) to edit and then display. * Allows us to use editActivity instead of creating a whole new form for it. * - * @param {string} tripId The tripId to attach to this new activity. + * @param {!string} tripId The tripId to attach to this new activity. * @return {Object} Data filled into new Activity. */ createEmptyActivity = (tripId) => { @@ -48,7 +48,8 @@ class ViewActivities extends React.Component { } /** - * Complete "Add Activity" operation + * Complete "Add Activity" operation. + * @param e Form event. */ addActivity = (e) => { e.preventDefault(); @@ -67,6 +68,28 @@ class ViewActivities extends React.Component { newAct: null }); }; + + /** @inheritdoc */ + componentDidMount() { + app.firestore() + .collection(DB.COLLECTION_TRIPS) + .doc(this.tripId) + .get() + .then(doc => { + this.setState({ + collaborators: doc.get(DB.TRIPS_COLLABORATORS), + isLoading: false, + error: undefined + }); + }) + .catch(e => { + this.setState({ + collaborators: undefined, + isLoading: true, + error: e + }) + }); + } render() { const tripId = this.props.match.params.tripId; @@ -108,28 +131,6 @@ class ViewActivities extends React.Component { } } } - - /** @inheritdoc */ - componentDidMount() { - app.firestore() - .collection(DB.COLLECTION_TRIPS) - .doc(this.tripId) - .get() - .then(doc => { - this.setState({ - collaborators: doc.get(DB.TRIPS_COLLABORATORS), - isLoading: false, - error: undefined - }); - }) - .catch(e => { - this.setState({ - collaborators: undefined, - isLoading: true, - error: e - }) - }); - } } export default ViewActivities; From 98072194324e96db53f119b6aab59b84f9ecce2d Mon Sep 17 00:00:00 2001 From: Ananya Y <14322650+ananyeet@users.noreply.github.com> Date: Thu, 6 Aug 2020 14:25:36 -0500 Subject: [PATCH 7/8] PR Comments. --- frontend/src/components/Utils/time.js | 24 ++++++------- .../src/components/ViewActivities/activity.js | 5 +-- .../components/ViewActivities/activityfns.js | 18 +++++----- .../components/ViewActivities/activitylist.js | 2 +- .../components/ViewActivities/editActivity.js | 6 ++-- .../editActivityFormElements.js | 34 +++++++++---------- .../src/components/ViewActivities/index.js | 2 +- 7 files changed, 46 insertions(+), 45 deletions(-) diff --git a/frontend/src/components/Utils/time.js b/frontend/src/components/Utils/time.js index 9953d44f..75bb35ec 100644 --- a/frontend/src/components/Utils/time.js +++ b/frontend/src/components/Utils/time.js @@ -6,7 +6,7 @@ import { firestore } from 'firebase'; * Format a timestamp (in milliseconds) into a pretty string with just the time. * Example: '10:19 AM'. * - * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} [timezone='America/New_York'] * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. @@ -22,7 +22,7 @@ export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_Yo * Format a timestamp (in milliseconds) into a pretty string with just the date. * Example: 'Monday, January 19, 1970'. * - * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} [timezone='America/New_York'] * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. @@ -38,7 +38,7 @@ export function timestampToDateFormatted(msTimestamp, timezone='America/New_York * Format a timestamp (in milliseconds) into a pretty string. * Example: 'Monday, January 19, 1970 02:48 AM PST'. * - * @param {!number} msTimestamp Timestamp in milliseconds of desired date. + * @param {number} msTimestamp Timestamp in milliseconds of desired date. * @param {string} [timezone='America/New_York'] * Timezone in which to convert (using underscores, not spaces). * @returns {string} Formatted time. @@ -54,7 +54,7 @@ export function timestampToFormatted(msTimestamp, timezone = 'America/New_York') /** * Return a Firestore Timestamp corresponding to the date in `dateStr`. * - * @param {!string} dateStr String containing a date in the form 'YYYY-MM-DD'. + * @param {string} dateStr String containing a date in the form 'YYYY-MM-DD'. * @return {firestore.Timestamp} Firestore timestamp object created. */ export function getTimestampFromDateString(dateStr) { @@ -70,7 +70,7 @@ export function getTimestampFromDateString(dateStr) { /** * Formats a Firestore timestamp into a date string in ISO format. * - * @param {!firestore.Timestamp} timestamp Firestore timestamp object. + * @param {firestore.Timestamp} timestamp Firestore timestamp object. * @return {string} ISO formatted date string: "YYYY-MM-DD or 2020-05-12". */ export function timestampToISOString(timestamp) { @@ -100,8 +100,8 @@ export function timezonesForCountry(countryName) { /** * Get a date in 'YYYY-MM-DD' format. * - * @param {!number} msTimestamp Timestamp, in milliseconds since epoch. - * @param {string} [timezone=null] The timezone which the string should be returned in. + * @param {number} msTimestamp Timestamp, in milliseconds since epoch. + * @param {?string} [timezone=null] The timezone which the string should be returned in. * @return {string} The date in 'YYYY-MM-DD' format. * A null value will return timezone in GMT. */ @@ -115,8 +115,8 @@ export function getISODate(msTimestamp, timezone=null) { /** * Get a time in 24-hour ('HH:mm') format. * - * @param {!number} msTimestamp Timestamp, in milliseconds since epoch. - * @param {string} [timezone=null] The timezone which the string should be returned in. + * @param {number} msTimestamp Timestamp, in milliseconds since epoch. + * @param {?string} [timezone=null] The timezone which the string should be returned in. * @return {string} The time in 24-hour (HH:mm) format. * A null value will return timezone in GMT. */ @@ -130,9 +130,9 @@ export function get24hTime(msTimestamp, timezone = null) { /** * Get a Firebase Timestamp object for time. * - * @param {!string} time The time in 'HH:mm' format. - * @param {!string} date The date in 'YYYY-MM-DD' format. - * @param {!string} tz The timezone in which the date takes place. + * @param {string} time The time in 'HH:mm' format. + * @param {string} date The date in 'YYYY-MM-DD' format. + * @param {string} tz The timezone in which the date takes place. * @return {firestore.Timestamp} Firestore timestamp object at the same time. */ export function firebaseTsFromISO(time, date, tz) { diff --git a/frontend/src/components/ViewActivities/activity.js b/frontend/src/components/ViewActivities/activity.js index b0ac40ec..9feed8cd 100644 --- a/frontend/src/components/ViewActivities/activity.js +++ b/frontend/src/components/ViewActivities/activity.js @@ -37,7 +37,7 @@ class Activity extends React.Component { /** * Display the current activity, either in view or edit mode. * - * @return {HTML} The current activity in correct mode. + * @return {JSX.Element} The current activity in correct mode. */ displayCard = () => { let activity = this.props.activity; @@ -73,7 +73,8 @@ class Activity extends React.Component { {activity[DB.ACTIVITIES_TITLE]} - { this.displayCard() } diff --git a/frontend/src/components/ViewActivities/activityfns.js b/frontend/src/components/ViewActivities/activityfns.js index a072e300..5f09b59d 100644 --- a/frontend/src/components/ViewActivities/activityfns.js +++ b/frontend/src/components/ViewActivities/activityfns.js @@ -29,8 +29,8 @@ const db = app.firestore(); /** * Get the field of field name `fieldName` from `activity` or the default value. * - * @param {!ActivityInfo} activity Activity to get field from. - * @param {!string} fieldName Name of the field in the activity to get. + * @param {ActivityInfo} activity Activity to get field from. + * @param {string} fieldName Name of the field in the activity to get. * @param {?*} [defaultValue=null] Default value to return if activity[fieldName] * can't be found. Can be any type. * @param {string} [prefix=''] The prefix to put before a returned value if the @@ -46,7 +46,7 @@ export function getField (activity, fieldName, defaultValue = null, prefix = '') /** * Sort a list of trip activities by date. - * @param {!ActivityInfo[]} tripActivities Array of activities. + * @param {ActivityInfo[]} tripActivities Array of activities. * @return {DayOfActivities[]} List of {@link DayOfActivities} * in chronological order by date. */ @@ -72,8 +72,8 @@ export function sortByDate(tripActivities) { /** * Put`a and `b` in display order. * This function is a comparator. - * @param {!ActivityInfo} a Dictionary representing activity `a` and its fields. - * @param {!ActivityInfo} b Dictionary representing activity `b` and its fields. + * @param {ActivityInfo} a Dictionary representing activity `a` and its fields. + * @param {ActivityInfo} b Dictionary representing activity `b` and its fields. * @return {int} `-1` if `a` comes before `b`, else `1`. */ export function compareActivities(a, b) { @@ -90,9 +90,9 @@ export function compareActivities(a, b) { /** * Write contents into an activity already existing in the database. * - * @param {!string} tripId Database ID of the trip whose actiivty should be modified. - * @param {!string} activityId Database ID of the activity to be modified. - * @param {!Objects} newValues Dictionary of the new values in `{fieldName: newValue}` + * @param {string} tripId Database ID of the trip whose actiivty should be modified. + * @param {string} activityId Database ID of the activity to be modified. + * @param {Object} newValues Dictionary of the new values in `{fieldName: newValue}` * form. None of the entries can be lists. * @return {boolean} `true` if the write was successful, `false` otherwise. */ @@ -121,7 +121,7 @@ export async function writeActivity(tripId, activityId, newValues) { * * Note: This function breaks if `ref.current` is null. This is intentional. * - * @param {!Reference} ref Reference to get the value of. + * @param {!React.RefObject} ref Reference to get the value of. * @param {?string} ignoreValue The "null" or "none" value that ref could be. * @param {?string} [defaultValue=null] Value to return if ref.current.value === ignoreValue. * @return defaultValue if ref.current.value === ignoreValue, else ref.current.value. diff --git a/frontend/src/components/ViewActivities/activitylist.js b/frontend/src/components/ViewActivities/activitylist.js index f63ba7bb..3ecd622e 100644 --- a/frontend/src/components/ViewActivities/activitylist.js +++ b/frontend/src/components/ViewActivities/activitylist.js @@ -11,7 +11,7 @@ const db = app.firestore(); * ReactJS class component for the list of activities. * * @property {Object} props ReactJS props. - * @property {string} tripId The tripID. + * @property {string} props.tripId The tripID. */ class ActivityList extends React.Component { /** @override */ diff --git a/frontend/src/components/ViewActivities/editActivity.js b/frontend/src/components/ViewActivities/editActivity.js index bbc587e6..6dcea6d6 100644 --- a/frontend/src/components/ViewActivities/editActivity.js +++ b/frontend/src/components/ViewActivities/editActivity.js @@ -135,10 +135,10 @@ class EditActivity extends React.Component { * so when the country changes here, the values in the timezone dropdown * change as well. * - * @param {!ref} ref The reference to attach to the dropdown. - * @param {!ref} tzref The corresponding time zone reference field. + * @param {!React.RefObject} ref The reference to attach to the dropdown. + * @param {!React.RefObject} tzref The corresponding time zone reference field. * @param {!string} defaultCountry The default country for the dropdown. - * @return {HTML} HTML dropdown of all the countries with timezones. + * @return {JSX.Element} HTML dropdown of all the countries with timezones. */ countriesDropdown(ref, tzref, defaultCountry) { return ( diff --git a/frontend/src/components/ViewActivities/editActivityFormElements.js b/frontend/src/components/ViewActivities/editActivityFormElements.js index 46da2e7e..b188ba93 100644 --- a/frontend/src/components/ViewActivities/editActivityFormElements.js +++ b/frontend/src/components/ViewActivities/editActivityFormElements.js @@ -12,11 +12,11 @@ const TZPICKERWIDTH = 3; /** * Create a Text element Form Group for the editActivity form. * - * @param {!string} controlId FormGroup's control ID. - * @param {!string} formLabel The label of the field for this FormGroup. - * @param {!string} placeHolder The input's placeholder. - * @param {?ref} ref The input's reference. - * @return {HTML} A text element form group. + * @param {string} controlId FormGroup's control ID. + * @param {string} formLabel The label of the field for this FormGroup. + * @param {string} placeHolder The input's placeholder. + * @param {?React.RefObject} ref The input's reference. + * @return {JSX.Element} A text element form group. */ export function textElementFormGroup(controlId, formLabel, placeHolder, ref) { return ( @@ -34,10 +34,10 @@ export function textElementFormGroup(controlId, formLabel, placeHolder, ref) { /** * Create a Location Dropdown element Form Group for the editActivity form. * - * @param {!string} controlId FormGroup's control ID. - * @param {!string} formLabel The label of the field for this FormGroup. - * @param {!string} dropdown The dropdown. - * @return {HTML} a location dropdown form group. + * @param {string} controlId FormGroup's control ID. + * @param {string} formLabel The label of the field for this FormGroup. + * @param {string} dropdown The dropdown. + * @return {JSX.Element} a location dropdown form group. */ export function locationElementFormGroup(controlId, formLabel, dropdown) { return ( @@ -52,14 +52,14 @@ export function locationElementFormGroup(controlId, formLabel, dropdown) { * Create a Form Group for inserting date, time, and timezone for * the editActivity form.. * - * @param {!string} controlId FormGroup's control ID. - * @param {!string} formLabel Label of the field for this FormGroup. - * @param {?ref} dateRef Date's reference. - * @param {!string} dateDefault Default date. - * @param {?ref} timeRef Time's reference. - * @param {!ref} timeDefault Default time. - * @param {!HTML} tzpicker Timezone picker dropdown. - * @return {HTML} A FormGroup for date, time, and timezone. + * @param {string} controlId FormGroup's control ID. + * @param {string} formLabel Label of the field for this FormGroup. + * @param {?React.RefObject} dateRef Date's reference. + * @param {string} dateDefault Default date. + * @param {?React.RefObject} timeRef Time's reference. + * @param {React.RefObject} timeDefault Default time. + * @param {JSX.Element} tzpicker Timezone picker dropdown. + * @return {JSX.Element} A FormGroup for date, time, and timezone. */ export function dateTimeTzFormGroup(controlId, formLabel, dateRef, dateDefault, timeRef, timeDefault, tzpicker) { diff --git a/frontend/src/components/ViewActivities/index.js b/frontend/src/components/ViewActivities/index.js index 27a97632..509051c3 100644 --- a/frontend/src/components/ViewActivities/index.js +++ b/frontend/src/components/ViewActivities/index.js @@ -49,7 +49,7 @@ class ViewActivities extends React.Component { /** * Complete "Add Activity" operation. - * @param e Form event. + * @param e {React.FormEvent} Form event. */ addActivity = (e) => { e.preventDefault(); From 4129618fc99516ef1d59dc4a127582fdd5c2ee9c Mon Sep 17 00:00:00 2001 From: Ananya <14322650+ananyeet@users.noreply.github.com> Date: Fri, 7 Aug 2020 20:17:15 -0500 Subject: [PATCH 8/8] Merge changes from origin/master into activity/jsdocs. --- README.md | 11 + frontend/.gitignore | 3 + frontend/.jsdoc.conf.json | 2 +- frontend/package-lock.json | 29 +++ frontend/package.json | 3 + frontend/src/components/App/index.js | 1 + frontend/src/components/IconLibrary/index.js | 19 ++ frontend/src/components/Landing/index.js | 21 +- .../src/components/Landing/signin-button.js | 9 +- frontend/src/components/SignIn/index.js | 12 +- frontend/src/components/Utils/filter-input.js | 72 ------ .../src/components/Utils/filter-input.test.js | 73 ------ .../src/components/Utils/temp-auth-utils.js | 64 ----- frontend/src/components/Utils/time.js | 97 ++++++-- frontend/src/components/Utils/time.test.js | 61 ++++- .../src/components/ViewActivities/activity.js | 7 +- .../components/ViewActivities/activityfns.js | 57 ++++- .../ViewActivities/activityfns.test.js | 47 +++- .../components/ViewActivities/activitylist.js | 8 +- .../components/ViewActivities/editActivity.js | 89 +++++-- .../editActivityFormElements.js | 56 ++++- .../src/components/ViewActivities/index.js | 63 +++-- .../change-collaborator-type-button.js | 81 ++++++ .../ViewTrips/delete-trip-button.js | 188 +++++++------- .../components/ViewTrips/edit-trip-button.js | 35 +++ frontend/src/components/ViewTrips/index.js | 60 ++--- .../components/ViewTrips/manage-trips-bar.js | 67 +++++ .../ViewTrips/save-trip-form-elements.js | 39 +-- .../components/ViewTrips/save-trip-modal.js | 174 ++++++++----- .../src/components/ViewTrips/trip-utils.js | 195 +++++++++++++++ .../components/ViewTrips/trip-utils.test.js | 182 ++++++++++++++ frontend/src/components/ViewTrips/trip.js | 231 ++++++++++++------ .../src/components/ViewTrips/trip.test.js | 27 -- .../components/ViewTrips/trips-container.js | 219 +++++++++++------ .../ViewTrips/view-activities-button.js | 18 +- .../ViewTrips/view-activities-button.test.js | 7 +- frontend/src/constants/database.js | 14 +- frontend/src/constants/messages.js | 9 +- frontend/src/constants/trip-view.js | 14 ++ frontend/src/images/hero-image.jpg | Bin 0 -> 295318 bytes frontend/src/styles/activities.css | 4 + frontend/src/styles/landing.css | 37 ++- frontend/src/styles/signin.css | 19 ++ frontend/src/styles/style.css | 16 ++ frontend/src/styles/trips.css | 7 + 45 files changed, 1738 insertions(+), 709 deletions(-) create mode 100644 frontend/src/components/IconLibrary/index.js delete mode 100644 frontend/src/components/Utils/filter-input.js delete mode 100644 frontend/src/components/Utils/filter-input.test.js delete mode 100644 frontend/src/components/Utils/temp-auth-utils.js create mode 100644 frontend/src/components/ViewTrips/change-collaborator-type-button.js create mode 100644 frontend/src/components/ViewTrips/edit-trip-button.js create mode 100644 frontend/src/components/ViewTrips/manage-trips-bar.js create mode 100644 frontend/src/components/ViewTrips/trip-utils.js create mode 100644 frontend/src/components/ViewTrips/trip-utils.test.js delete mode 100644 frontend/src/components/ViewTrips/trip.test.js create mode 100644 frontend/src/constants/trip-view.js create mode 100644 frontend/src/images/hero-image.jpg create mode 100644 frontend/src/styles/signin.css create mode 100644 frontend/src/styles/trips.css diff --git a/README.md b/README.md index 060b2b69..db5fa832 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,17 @@ The Jest testing framework was installed as a dependency. From the command line, ### Backend: JUnit and Maven is used to run backend testing, following the same structure as Week 5 of the Google STEP Internship. +## Generating JSDoc +JSDoc 3 is used to generate documentation for all JS source code for this +project. To generate the docs for this project, run (from anywhere inside the +project directory): +``` +npm run docs +``` +The generated documentation will live in the directory `frontend/docs`. +The configuration rules for the JSDoc generation are specified in +`/frontend/.jsdoc.conf.json`. + ## Running Locally First, ensure that you have installed and are using Node 10! ``` diff --git a/frontend/.gitignore b/frontend/.gitignore index 4d29575d..3cacfdff 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -21,3 +21,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# generated JSDoc +/docs diff --git a/frontend/.jsdoc.conf.json b/frontend/.jsdoc.conf.json index 9b622c1f..cc1a86e2 100644 --- a/frontend/.jsdoc.conf.json +++ b/frontend/.jsdoc.conf.json @@ -19,4 +19,4 @@ "cleverLinks": false, "monospaceLinks": false } -} \ No newline at end of file +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0c81f2cc..eb809acd 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1338,6 +1338,35 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.41.tgz", "integrity": "sha512-XcdMT5PSZHiuf7LJIhzKIe+RyYa25S3LHRRvLnZc6iFjwXkrSDJ8J/HWO6VT8d2ZTbawp3VcLEjRF/VN8glCrA==" }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.30.tgz", + "integrity": "sha512-TsRwpTuKwFNiPhk1UfKgw7zNPeV5RhNp2Uw3pws+9gDAkPGKrtjR1y2lI3SYn7+YzyfuNknflpBA1LRKjt7hMg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.30", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.30.tgz", + "integrity": "sha512-E3sAXATKCSVnT17HYmZjjbcmwihrNOCkoU7dVMlasrcwiJAHxSKeZ+4WN5O+ElgO/FaYgJmASl8p9N7/B/RttA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.30" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.14.0.tgz", + "integrity": "sha512-M933RDM8cecaKMWDSk3FRYdnzWGW7kBBlGNGfvqLVwcwhUPNj9gcw+xZMrqBdRqxnSXdl3zWzTCNNGEtFUq67Q==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.30" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.11.tgz", + "integrity": "sha512-sClfojasRifQKI0OPqTy8Ln8iIhnxR/Pv/hukBhWnBz9kQRmqi6JSH3nghlhAY7SUeIIM7B5/D2G8WjX0iepVg==", + "requires": { + "prop-types": "^15.7.2" + } + }, "@grpc/grpc-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index 707532af..0527c617 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.30", + "@fortawesome/free-solid-svg-icons": "^5.14.0", + "@fortawesome/react-fontawesome": "^0.1.11", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.5.0", "@testing-library/user-event": "^7.2.1", diff --git a/frontend/src/components/App/index.js b/frontend/src/components/App/index.js index 9d803d8b..818503c7 100644 --- a/frontend/src/components/App/index.js +++ b/frontend/src/components/App/index.js @@ -2,6 +2,7 @@ import React from 'react'; import {BrowserRouter as Router, Switch, Route} from 'react-router-dom'; import { AuthProvider, PrivateRoute } from '../Auth'; import { AuthUtilsConsumer } from '../AuthUtils'; +import '../IconLibrary'; import LandingPage from '../Landing'; import SignInPage from '../SignIn' diff --git a/frontend/src/components/IconLibrary/index.js b/frontend/src/components/IconLibrary/index.js new file mode 100644 index 00000000..f1fcdaad --- /dev/null +++ b/frontend/src/components/IconLibrary/index.js @@ -0,0 +1,19 @@ +/** + * This file defines all icons used in the project. This is the recommended + * method to import icons based on the documentation here: + * https://github.com/FortAwesome/react-fontawesome#build-a-library-to-reference-icons-throughout-your-app-more-conveniently. + */ +import { library } from '@fortawesome/fontawesome-svg-core'; + +import { faMapMarkerAlt, faCalendarAlt, faBook, faUserFriends, faHiking, + faTrash, faEdit } from '@fortawesome/free-solid-svg-icons'; + +library.add( + faMapMarkerAlt, + faCalendarAlt, + faBook, + faUserFriends, + faHiking, + faTrash, + faEdit, +); diff --git a/frontend/src/components/Landing/index.js b/frontend/src/components/Landing/index.js index 7bc2ca7f..377a5895 100644 --- a/frontend/src/components/Landing/index.js +++ b/frontend/src/components/Landing/index.js @@ -1,7 +1,7 @@ import React from 'react'; import SignInButton from './signin-button.js'; -import Card from 'react-bootstrap/Card'; +import Jumbotron from 'react-bootstrap/Jumbotron'; import logo from '../../images/logo.png'; import '../../styles/landing.css'; @@ -14,17 +14,22 @@ class Landing extends React.Component { /** @inheritdoc */ render() { return ( -
- - - Welcome to SLURP +
+ +

SLURP

+

(Shared Live Universal Recreation Planner)

+

+ With SLURP, you can collaborate with others on your upcoming trips + using our intuitive, real-time itinerary planner. +

+
SLURP Logo - - - + +
+
); } diff --git a/frontend/src/components/Landing/signin-button.js b/frontend/src/components/Landing/signin-button.js index a38b0386..b62b6da0 100644 --- a/frontend/src/components/Landing/signin-button.js +++ b/frontend/src/components/Landing/signin-button.js @@ -17,8 +17,13 @@ const SignInButton = () => { } return ( - ); } diff --git a/frontend/src/components/SignIn/index.js b/frontend/src/components/SignIn/index.js index c52048ca..74be1c9a 100644 --- a/frontend/src/components/SignIn/index.js +++ b/frontend/src/components/SignIn/index.js @@ -1,12 +1,14 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; -import { AuthContext } from '../Auth'; import * as firebase from 'firebase/app'; import app from '../Firebase'; import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth'; +import Jumbotron from 'react-bootstrap/Jumbotron'; +import { AuthContext } from '../Auth'; import { VIEW_TRIPS } from '../../constants/routes.js'; +import '../../styles/signin.css'; // Configure FirebaseUI. const uiConfig = { @@ -52,9 +54,11 @@ class SignIn extends React.Component { } return ( -
-

Please sign in:

- +
+ +

Please sign in:

+ +
); } diff --git a/frontend/src/components/Utils/filter-input.js b/frontend/src/components/Utils/filter-input.js deleted file mode 100644 index 6dee05f6..00000000 --- a/frontend/src/components/Utils/filter-input.js +++ /dev/null @@ -1,72 +0,0 @@ -import * as firebase from 'firebase/app'; - -import authUtils from '../AuthUtils'; -import { getUserUidArrFromUserEmailArr } from './temp-auth-utils.js' -import { getTimestampFromDateString } from './time.js' - -/** - * Return a string containing the cleaned text input. - * - * @param {string} rawInput String containing raw form input. - * @return {string} Cleaned string. - */ -export function getCleanedTextInput(rawInput, defaultValue) { - return rawInput === '' ? defaultValue : rawInput; -} - -/** - * Return an array of collaborator uids given the emails provided in the - * add trip form. - * - * TODO(#72 & #67): Remove 'remove empty fields' once there is better way to - * remove collaborators (#72) and there is email validation (#67). - * - * @param {!Array.} collaboratorEmailsArr Array of emails corresponding - * to the collaborators of the trip (not including the trip creator email). - * @return {!Array.} Array of all collaborator uids (including trip - * creator uid). - */ -export function getCollaboratorUidArray(collaboratorEmailArr) { - collaboratorEmailArr = [authUtils.getCurUserEmail()] - .concat(collaboratorEmailArr); - - // Removes empty fields (temporary until fix #67 & #72). - const cleanedCollaboratorEmailArr = collaboratorEmailArr.filter(email => { - return email !== ''; - }) - return getUserUidArrFromUserEmailArr(cleanedCollaboratorEmailArr); -} - -/** - * Returns a formatted and cleaned trip object that will be used as the data - * for the created Trip document. - * - * We know that rawTripObj will contain all of the necessary fields because each - * key-value pair is explicitly included. This means, only the value - * corresponding to each key needs to be checked. - * For text element inputs, React has built in protections against injection/XSS - * attacks. Thus, no sanitization is needed for text inputs besides providing a - * default value in a Trip field where applicable. - * - * @param {!Object} rawTripObj A JS Object containing the raw form data from the - * add trip form. - * @return {!Object} Formatted/cleaned version of `rawTripObj` holding the data - * for the new Trip document that is to be created. - */ -export function formatTripData(rawTripObj) { - const defaultName = "Untitled Trip"; - const defaultDestination = "No Destination" - - const formattedTripObj = { - trip_creation_time: firebase.firestore.Timestamp.now(), - name: getCleanedTextInput(rawTripObj.name, defaultName), - description: rawTripObj.description, - destination: getCleanedTextInput(rawTripObj.destination, - defaultDestination), - start_date: getTimestampFromDateString(rawTripObj.startDate), - end_date: getTimestampFromDateString(rawTripObj.endDate), - collaborators: getCollaboratorUidArray(rawTripObj.collaboratorEmails), - }; - - return formattedTripObj; -} diff --git a/frontend/src/components/Utils/filter-input.test.js b/frontend/src/components/Utils/filter-input.test.js deleted file mode 100644 index 03fd8560..00000000 --- a/frontend/src/components/Utils/filter-input.test.js +++ /dev/null @@ -1,73 +0,0 @@ -import { getUserUidArrFromUserEmailArr } from './temp-auth-utils'; -import { getCleanedTextInput, getCollaboratorUidArray } from './filter-input.js'; - -describe('getCleanedTextInput tests', () => { - test('No input entered in form (empty string)', () => { - const testDefaultValue = 'Untitled Trip'; - const testRawName = ''; - const expectedTripName = testDefaultValue; - - const testTripName = getCleanedTextInput(testRawName, testDefaultValue); - - expect(testTripName).toEqual(expectedTripName); - }); - - test('Input entered into form', () => { - const testDefaultValue = 'Untitled Trip'; - const testRawName = 'Trip to No Man\'s Land'; - const expectedTripName = testRawName; - - const testTripName = getCleanedTextInput(testRawName, testDefaultValue); - - expect(testTripName).toEqual(expectedTripName); - }); -}); - -const mockCurUserEmail = 'cur.user@email.com'; -jest.mock('../AuthUtils', () => ({ - getCurUserEmail: () => mockCurUserEmail, -})); -// TODO(Issue #55): Replace mock with real auth file once integrated. -jest.mock('./temp-auth-utils.js', () => ({ - getUserUidArrFromUserEmailArr: (userEmailArr) => { - return userEmailArr.map(userEmail => '_' + userEmail + '_'); - }, -})); -describe('getCollaboratorUidArray tests', () => { - test('No collaborators entered', () => { - const expectedUidArr = [`_${mockCurUserEmail}_`]; - // This is the list that is created when there are no collaborators added - // (automatically one empty string from the constructor created ref). - const testEmailArr = ['']; - - const testUidArr = getCollaboratorUidArray(testEmailArr); - - expect(testUidArr).toEqual(expectedUidArr); - }); - - test('Some added collaborators', () => { - const person1Email = 'p1@gmail.com'; - const person2Email = 'p2@outlook.com'; - const expectedUidArr = [`_${mockCurUserEmail}_`, - `_${person1Email}_`, - `_${person2Email}_`]; - const testEmailArr = [person1Email, person2Email]; - - const testUidArr = getCollaboratorUidArray(testEmailArr); - - expect(testUidArr).toEqual(expectedUidArr); - }); - - test('Some added collaborators and some blank entries', () => { - const person1Email = 'p1@gmail.com'; - const person2Email = 'p2@outlook.com'; - const expectedUidArr = [`_${mockCurUserEmail}_`, - `_${person1Email}_`, - `_${person2Email}_`]; - const testEmailArr = ['', person1Email, '', person2Email, '']; - - const testUidArr = getCollaboratorUidArray(testEmailArr); - - expect(testUidArr).toEqual(expectedUidArr); - }); -}); diff --git a/frontend/src/components/Utils/temp-auth-utils.js b/frontend/src/components/Utils/temp-auth-utils.js deleted file mode 100644 index ea6fb1c4..00000000 --- a/frontend/src/components/Utils/temp-auth-utils.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @fileoverview This is a temporary file that is used to implement 'fake' - * versions of the Auth utility functions used in the ViewTrips components. - * As of right now, the only 'real' auth function used is `getCurUserEmail()` - * but a fake user uid is still used due to the lack of a set of functions - * that can convert user email <--> user uid. - * - * TODO(Issue #55): Remove this whole file function and replace any imports to - * this file with Auth utils. - */ -import authUtils from '../AuthUtils'; - -/** - * Temporary 'fake'/hardcoded function that returns a user uid given the user's - * email. - * - * @param {string} userEmail User email string. - * @return {string} Fake user uid string in the form '_userEmail_'. - */ -function getUserUidFromUserEmail(userEmail) { - return '_' + userEmail + '_'; -} - -/** - * Temporary 'fake'/hardcoded function that returns the current users uid. - * - * @return {string} Fake current user uid string the form '_userEmail_'. - */ -export function getCurUserUid() { - return getUserUidFromUserEmail(authUtils.getCurUserEmail()); -} - -/** - * Temporary 'fake'/hardcoded function that returns the an array of 'fake' user - * uids given an array of user emails. - * - * @param {!Array} userEmailArr Array of user email strings. - * @return {!Array} Array of fake user uids corresponding to the user - * emails in `userEmailArr`. - */ -export function getUserUidArrFromUserEmailArr(userEmailArr) { - return userEmailArr.map(userEmail => getUserUidFromUserEmail(userEmail)); -} - -/** - * Temporary 'fake'/hardcoded function that returns the an array of user emails - * given an array of 'fake' user uids. - * - * @param {!Array} userUidArr Array of fake user uids that are - * in the form '_userEmail_'. - * @return {!Array} Array of user emails corresponding to the user - * uids in `userUidArr`. - */ -export function getUserEmailArrFromUserUidArr(userUidArr) { - return userUidArr.map(userUid => userUid.substring(1, userUid.length - 1)); -} - -const fakeAuthUtils = { - getCurUserUid, - getUserUidArrFromUserEmailArr, - getUserEmailArrFromUserUidArr, -} - -export default fakeAuthUtils; diff --git a/frontend/src/components/Utils/time.js b/frontend/src/components/Utils/time.js index 75bb35ec..47d71ba9 100644 --- a/frontend/src/components/Utils/time.js +++ b/frontend/src/components/Utils/time.js @@ -11,9 +11,11 @@ import { firestore } from 'firebase'; * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. */ -export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_York') { +export function timestampToTimeFormatted(msTimestamp, timezone = null) { // Formats from https://momentjs.com/docs/#/displaying/format/ - // LT = Localized time + // LT = Localized time + timezone = timezone != null ? timezone.replace(' ', '_') // Reformat date. + : ''; // Use GMT. return moment.tz(parseFloat(msTimestamp), timezone).format('LT'); } @@ -27,13 +29,32 @@ export function timestampToTimeFormatted(msTimestamp, timezone = 'America/New_Yo * Timezone in which to convert (using underscores, not spaces). * @return {string} Formatted time. */ -export function timestampToDateFormatted(msTimestamp, timezone='America/New_York') { +export function timestampToDateFormatted(msTimestamp, timezone=null) { // Formats from https://momentjs.com/docs/#/displaying/format/. // dddd = Day of the week (i.e. Monday) - // LL = "January 19, 1970" + // LL = "January 19, 1970" + timezone = timezone != null ? timezone.replace(' ', '_') // Reformat date. + : ''; // Use GMT. return moment.tz(parseFloat(msTimestamp), timezone).format('dddd, LL'); } +/** + * Format a timestamp (in milliseconds) into a pretty string with just the date, + * not including the day of the week.. + * Example: 'January 19, 1970'. + * + * @param {number} msTimestamp Timestamp in milliseconds of desired date. + * @param {?string} [timezone=null] Timezone in which to convert. + * @return {string} Formatted time. + */ +export function timestampToLongDate(msTimestamp, timezone=null) { + // Formats from https://momentjs.com/docs/#/displaying/format/. + // LL = "January 19, 1970" + timezone = timezone != null ? timezone.replace(' ', '_') // Reformat date. + : ''; // Use GMT. + return moment.tz(parseFloat(msTimestamp), timezone).format('LL'); +} + /** * Format a timestamp (in milliseconds) into a pretty string. * Example: 'Monday, January 19, 1970 02:48 AM PST'. @@ -43,10 +64,12 @@ export function timestampToDateFormatted(msTimestamp, timezone='America/New_York * Timezone in which to convert (using underscores, not spaces). * @returns {string} Formatted time. */ -export function timestampToFormatted(msTimestamp, timezone = 'America/New_York') { +export function timestampToFormatted(msTimestamp, timezone = null) { // Formats from https://momentjs.com/docs/#/displaying/format/. // LLLL = "Monday, January 19, 1970 2:48 AM" // z = "PST" + timezone = timezone != null ? timezone.replace(' ', '_') // Reformat date. + : ''; // Use GMT. return moment.tz(parseFloat(msTimestamp), timezone).format('LLLL z'); } @@ -54,17 +77,48 @@ export function timestampToFormatted(msTimestamp, timezone = 'America/New_York') /** * Return a Firestore Timestamp corresponding to the date in `dateStr`. * - * @param {string} dateStr String containing a date in the form 'YYYY-MM-DD'. + * Notes: + * - Because `dateStr` is in ISO date-only form, the created JS Date object will + * be in UTC time. + * - The date strings are created in the UTC timezone in order to avoid issues + * where a user's timezone at last update of the trip is different than the + * user's current timezone when viewing a trip. + * + * @param {string} dateStr String containing a date in ISO form: 'YYYY-MM-DD'. * @return {firestore.Timestamp} Firestore timestamp object created. */ -export function getTimestampFromDateString(dateStr) { - const dateParts = dateStr.split('-').map(str => +str); - if (dateParts.length === 1 && dateParts[0] === 0) { +export function getTimestampFromISODateString(dateStr) { + if (dateStr === '') { return firestore.Timestamp.now(); } - const date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]); - return firestore.Timestamp.fromDate(date); + const dateUTC = new Date(dateStr); + return firestore.Timestamp.fromDate(dateUTC); +} + +/** + * Returns the string date range of the trip associated with the Trip document + * start and end date timestamps. + * + * Notes: + * - The date strings are created in the UTC timezone in order to avoid issues + * where a user's timezone at last update of the trip is different than the + * user's current timezone when viewing a trip. + * - The months retrieved from `getUTCMonth` are 0 indexed rather than 1 indexed + * so they must be incremented by 1 in order for the month to be correct. + * + * @param {!firestore.Timestamp} startDateTimestamp Firestore timestamp + * Object corresponding to the trip start date. + * @param {!firestore.Timestamp} endDateTimestamp Firestore timestamp + * Object corresponding to the trip end date. + * @return {string} Date range of the trip in the form 'MM/DD/YYYY - MM/DD/YYYY'. + */ +export function getDateRangeString(startDateTimestamp, endDateTimestamp) { + const startDate = startDateTimestamp.toDate(); + const endDate = endDateTimestamp.toDate(); + return `${startDate.getUTCMonth() + 1}/${startDate.getUTCDate()}/` + + `${startDate.getUTCFullYear()} - ${endDate.getUTCMonth() + 1}/` + + `${endDate.getUTCDate()}/${endDate.getUTCFullYear()}`; } /** @@ -98,32 +152,32 @@ export function timezonesForCountry(countryName) { } /** - * Get a date in 'YYYY-MM-DD' format. - * + * Get a date in 'YYYY-MM-DD' format. + * * @param {number} msTimestamp Timestamp, in milliseconds since epoch. * @param {?string} [timezone=null] The timezone which the string should be returned in. * @return {string} The date in 'YYYY-MM-DD' format. * A null value will return timezone in GMT. */ export function getISODate(msTimestamp, timezone=null) { - if (timezone === null) { - timezone = ''; // Use GMT. - } + timezone = timezone != null ? timezone.replace(' ', '_') // Reformat date. + : ''; // Use GMT. return moment.tz(parseFloat(msTimestamp), timezone).format(moment.HTML5_FMT.DATE); } /** - * Get a time in 24-hour ('HH:mm') format. - * + * Get a time in 24-hour ('HH:mm') format. + * * @param {number} msTimestamp Timestamp, in milliseconds since epoch. * @param {?string} [timezone=null] The timezone which the string should be returned in. * @return {string} The time in 24-hour (HH:mm) format. * A null value will return timezone in GMT. */ -export function get24hTime(msTimestamp, timezone = null) { +export function get24hTime(msTimestamp, timezone=null) { if (timezone === null) { - timezone = ''; // Use GMT. + timezone = ''; // Use GMT. } + timezone = timezone.replace(' ', '_'); return moment.tz(parseFloat(msTimestamp), timezone).format(moment.HTML5_FMT.TIME); } @@ -133,9 +187,10 @@ export function get24hTime(msTimestamp, timezone = null) { * @param {string} time The time in 'HH:mm' format. * @param {string} date The date in 'YYYY-MM-DD' format. * @param {string} tz The timezone in which the date takes place. - * @return {firestore.Timestamp} Firestore timestamp object at the same time. + * @return {firestore.Timestamp} Firestore timestamp object at the same time. */ export function firebaseTsFromISO(time, date, tz) { + tz = tz.replace(' ', '_'); const mtzDate = moment.tz(time + " " + date, "HH:mm YYYY-MM-DD", tz); return new firestore.Timestamp(mtzDate.valueOf() / 1000, 0); } diff --git a/frontend/src/components/Utils/time.test.js b/frontend/src/components/Utils/time.test.js index a4ee6d59..13f0e305 100644 --- a/frontend/src/components/Utils/time.test.js +++ b/frontend/src/components/Utils/time.test.js @@ -9,7 +9,7 @@ const TZ_SINGAPORE = 'Asia/Singapore'; const ALLTZS = ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 'Africa/Blantyre', 'Africa/Brazzaville', 'Africa/Bujumbura', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Ceuta', 'Africa/Conakry', 'Africa/Dakar', 'Africa/Dar es Salaam', 'Africa/Djibouti', 'Africa/Douala', 'Africa/El Aaiun', 'Africa/Freetown', 'Africa/Gaborone', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Juba', 'Africa/Kampala', 'Africa/Khartoum', 'Africa/Kigali', 'Africa/Kinshasa', 'Africa/Lagos', 'Africa/Libreville', 'Africa/Lome', 'Africa/Luanda', 'Africa/Lubumbashi', 'Africa/Lusaka', 'Africa/Malabo', 'Africa/Maputo', 'Africa/Maseru', 'Africa/Mbabane', 'Africa/Mogadishu', 'Africa/Monrovia', 'Africa/Nairobi', 'Africa/Ndjamena', 'Africa/Niamey', 'Africa/Nouakchott', 'Africa/Ouagadougou', 'Africa/Porto-Novo', 'Africa/Sao Tome', 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek', 'America/Adak', 'America/Anchorage', 'America/Anguilla', 'America/Antigua', 'America/Araguaina', 'America/Argentina/Buenos Aires', 'America/Argentina/Catamarca', 'America/Argentina/ComodRivadavia', 'America/Argentina/Cordoba', 'America/Argentina/Jujuy', 'America/Argentina/La Rioja', 'America/Argentina/Mendoza', 'America/Argentina/Rio Gallegos', 'America/Argentina/Salta', 'America/Argentina/San Juan', 'America/Argentina/San Luis', 'America/Argentina/Tucuman', 'America/Argentina/Ushuaia', 'America/Aruba', 'America/Asuncion', 'America/Atikokan', 'America/Atka', 'America/Bahia', 'America/Bahia Banderas', 'America/Barbados', 'America/Belem', 'America/Belize', 'America/Blanc-Sablon', 'America/Boa Vista', 'America/Bogota', 'America/Boise', 'America/Buenos Aires', 'America/Cambridge Bay', 'America/Campo Grande', 'America/Cancun', 'America/Caracas', 'America/Catamarca', 'America/Cayenne', 'America/Cayman', 'America/Chicago', 'America/Chihuahua', 'America/Coral Harbour', 'America/Cordoba', 'America/Costa Rica', 'America/Creston', 'America/Cuiaba', 'America/Curacao', 'America/Danmarkshavn', 'America/Dawson', 'America/Dawson Creek', 'America/Denver', 'America/Detroit', 'America/Dominica', 'America/Edmonton', 'America/Eirunepe', 'America/El Salvador', 'America/Ensenada', 'America/Fort Nelson', 'America/Fort Wayne', 'America/Fortaleza', 'America/Glace Bay', 'America/Godthab', 'America/Goose Bay', 'America/Grand Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guatemala', 'America/Guayaquil', 'America/Guyana', 'America/Halifax', 'America/Havana', 'America/Hermosillo', 'America/Indiana/Indianapolis', 'America/Indiana/Knox', 'America/Indiana/Marengo', 'America/Indiana/Petersburg', 'America/Indiana/Tell City', 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', 'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', 'America/Jujuy', 'America/Juneau', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Knox IN', 'America/Kralendijk', 'America/La Paz', 'America/Lima', 'America/Los Angeles', 'America/Louisville', 'America/Lower Princes', 'America/Maceio', 'America/Managua', 'America/Manaus', 'America/Marigot', 'America/Martinique', 'America/Matamoros', 'America/Mazatlan', 'America/Mendoza', 'America/Menominee', 'America/Merida', 'America/Metlakatla', 'America/Mexico City', 'America/Miquelon', 'America/Moncton', 'America/Monterrey', 'America/Montevideo', 'America/Montreal', 'America/Montserrat', 'America/Nassau', 'America/New York', 'America/Nipigon', 'America/Nome', 'America/Noronha', 'America/North Dakota/Beulah', 'America/North Dakota/Center', 'America/North Dakota/New Salem', 'America/Nuuk', 'America/Ojinaga', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo', 'America/Phoenix', 'America/Port-au-Prince', 'America/Port of Spain', 'America/Porto Acre', 'America/Porto Velho', 'America/Puerto Rico', 'America/Punta Arenas', 'America/Rainy River', 'America/Rankin Inlet', 'America/Recife', 'America/Regina', 'America/Resolute', 'America/Rio Branco', 'America/Rosario', 'America/Santa Isabel', 'America/Santarem', 'America/Santiago', 'America/Santo Domingo', 'America/Sao Paulo', 'America/Scoresbysund', 'America/Shiprock', 'America/Sitka', 'America/St Barthelemy', 'America/St Johns', 'America/St Kitts', 'America/St Lucia', 'America/St Thomas', 'America/St Vincent', 'America/Swift Current', 'America/Tegucigalpa', 'America/Thule', 'America/Thunder Bay', 'America/Tijuana', 'America/Toronto', 'America/Tortola', 'America/Vancouver', 'America/Virgin', 'America/Whitehorse', 'America/Winnipeg', 'America/Yakutat', 'America/Yellowknife', 'Antarctica/Casey', 'Antarctica/Davis', 'Antarctica/DumontDUrville', 'Antarctica/Macquarie', 'Antarctica/Mawson', 'Antarctica/McMurdo', 'Antarctica/Palmer', 'Antarctica/Rothera', 'Antarctica/South Pole', 'Antarctica/Syowa', 'Antarctica/Troll', 'Antarctica/Vostok', 'Arctic/Longyearbyen', 'Asia/Aden', 'Asia/Almaty', 'Asia/Amman', 'Asia/Anadyr', 'Asia/Aqtau', 'Asia/Aqtobe', 'Asia/Ashgabat', 'Asia/Ashkhabad', 'Asia/Atyrau', 'Asia/Baghdad', 'Asia/Bahrain', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Barnaul', 'Asia/Beirut', 'Asia/Bishkek', 'Asia/Brunei', 'Asia/Calcutta', 'Asia/Chita', 'Asia/Choibalsan', 'Asia/Chongqing', 'Asia/Chungking', 'Asia/Colombo', 'Asia/Dacca', 'Asia/Damascus', 'Asia/Dhaka', 'Asia/Dili', 'Asia/Dubai', 'Asia/Dushanbe', 'Asia/Famagusta', 'Asia/Gaza', 'Asia/Harbin', 'Asia/Hebron', 'Asia/Ho Chi Minh', 'Asia/Hong Kong', 'Asia/Hovd', 'Asia/Irkutsk', 'Asia/Istanbul', 'Asia/Jakarta', 'Asia/Jayapura', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kashgar', 'Asia/Kathmandu', 'Asia/Katmandu', 'Asia/Khandyga', 'Asia/Kolkata', 'Asia/Krasnoyarsk', 'Asia/Kuala Lumpur', 'Asia/Kuching', 'Asia/Kuwait', 'Asia/Macao', 'Asia/Macau', 'Asia/Magadan', 'Asia/Makassar', 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', 'Asia/Novokuznetsk', 'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', 'Asia/Phnom Penh', 'Asia/Pontianak', 'Asia/Pyongyang', 'Asia/Qatar', 'Asia/Qostanay', 'Asia/Qyzylorda', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Saigon', 'Asia/Sakhalin', 'Asia/Samarkand', 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Srednekolymsk', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tel Aviv', 'Asia/Thimbu', 'Asia/Thimphu', 'Asia/Tokyo', 'Asia/Tomsk', 'Asia/Ujung Pandang', 'Asia/Ulaanbaatar', 'Asia/Ulan Bator', 'Asia/Urumqi', 'Asia/Ust-Nera', 'Asia/Vientiane', 'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yangon', 'Asia/Yekaterinburg', 'Asia/Yerevan', 'Atlantic/Azores', 'Atlantic/Bermuda', 'Atlantic/Canary', 'Atlantic/Cape Verde', 'Atlantic/Faeroe', 'Atlantic/Faroe', 'Atlantic/Jan Mayen', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Atlantic/South Georgia', 'Atlantic/St Helena', 'Atlantic/Stanley', 'Australia/ACT', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Broken Hill', 'Australia/Canberra', 'Australia/Currie', 'Australia/Darwin', 'Australia/Eucla', 'Australia/Hobart', 'Australia/LHI', 'Australia/Lindeman', 'Australia/Lord Howe', 'Australia/Melbourne', 'Australia/NSW', 'Australia/North', 'Australia/Perth', 'Australia/Queensland', 'Australia/South', 'Australia/Sydney', 'Australia/Tasmania', 'Australia/Victoria', 'Australia/West', 'Australia/Yancowinna', 'Brazil/Acre', 'Brazil/DeNoronha', 'Brazil/East', 'Brazil/West', 'CET', 'CST6CDT', 'Canada/Atlantic', 'Canada/Central', 'Canada/Eastern', 'Canada/Mountain', 'Canada/Newfoundland', 'Canada/Pacific', 'Canada/Saskatchewan', 'Canada/Yukon', 'Chile/Continental', 'Chile/EasterIsland', 'Cuba', 'EET', 'EST', 'EST5EDT', 'Egypt', 'Eire', 'Etc/GMT', 'Etc/GMT+0', 'Etc/GMT+1', 'Etc/GMT+10', 'Etc/GMT+11', 'Etc/GMT+12', 'Etc/GMT+2', 'Etc/GMT+3', 'Etc/GMT+4', 'Etc/GMT+5', 'Etc/GMT+6', 'Etc/GMT+7', 'Etc/GMT+8', 'Etc/GMT+9', 'Etc/GMT-0', 'Etc/GMT-1', 'Etc/GMT-10', 'Etc/GMT-11', 'Etc/GMT-12', 'Etc/GMT-13', 'Etc/GMT-14', 'Etc/GMT-2', 'Etc/GMT-3', 'Etc/GMT-4', 'Etc/GMT-5', 'Etc/GMT-6', 'Etc/GMT-7', 'Etc/GMT-8', 'Etc/GMT-9', 'Etc/GMT0', 'Etc/Greenwich', 'Etc/UCT', 'Etc/UTC', 'Etc/Universal', 'Etc/Zulu', 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Astrakhan', 'Europe/Athens', 'Europe/Belfast', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', 'Europe/Busingen', 'Europe/Chisinau', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Gibraltar', 'Europe/Guernsey', 'Europe/Helsinki', 'Europe/Isle of Man', 'Europe/Istanbul', 'Europe/Jersey', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Kirov', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/Luxembourg', 'Europe/Madrid', 'Europe/Malta', 'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow', 'Europe/Nicosia', 'Europe/Oslo', 'Europe/Paris', 'Europe/Podgorica', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', 'Europe/San Marino', 'Europe/Sarajevo', 'Europe/Saratov', 'Europe/Simferopol', 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', 'Europe/Tiraspol', 'Europe/Ulyanovsk', 'Europe/Uzhgorod', 'Europe/Vaduz', 'Europe/Vatican', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', 'GB', 'GB-Eire', 'GMT', 'GMT+0', 'GMT-0', 'GMT0', 'Greenwich', 'HST', 'Hongkong', 'Iceland', 'Indian/Antananarivo', 'Indian/Chagos', 'Indian/Christmas', 'Indian/Cocos', 'Indian/Comoro', 'Indian/Kerguelen', 'Indian/Mahe', 'Indian/Maldives', 'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion', 'Iran', 'Israel', 'Jamaica', 'Japan', 'Kwajalein', 'Libya', 'MET', 'MST', 'MST7MDT', 'Mexico/BajaNorte', 'Mexico/BajaSur', 'Mexico/General', 'NZ', 'NZ-CHAT', 'Navajo', 'PRC', 'PST8PDT', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Bougainville', 'Pacific/Chatham', 'Pacific/Chuuk', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', 'Pacific/Fakaofo', 'Pacific/Fiji', 'Pacific/Funafuti', 'Pacific/Galapagos', 'Pacific/Gambier', 'Pacific/Guadalcanal', 'Pacific/Guam', 'Pacific/Honolulu', 'Pacific/Johnston', 'Pacific/Kiritimati', 'Pacific/Kosrae', 'Pacific/Kwajalein', 'Pacific/Majuro', 'Pacific/Marquesas', 'Pacific/Midway', 'Pacific/Nauru', 'Pacific/Niue', 'Pacific/Norfolk', 'Pacific/Noumea', 'Pacific/Pago Pago', 'Pacific/Palau', 'Pacific/Pitcairn', 'Pacific/Pohnpei', 'Pacific/Ponape', 'Pacific/Port Moresby', 'Pacific/Rarotonga', 'Pacific/Saipan', 'Pacific/Samoa', 'Pacific/Tahiti', 'Pacific/Tarawa', 'Pacific/Tongatapu', 'Pacific/Truk', 'Pacific/Wake', 'Pacific/Wallis', 'Pacific/Yap', 'Poland', 'Portugal', 'ROC', 'ROK', 'Singapore', 'Turkey', 'UCT', 'US/Alaska', 'US/Aleutian', 'US/Arizona', 'US/Central', 'US/East-Indiana', 'US/Eastern', 'US/Hawaii', 'US/Indiana-Starke', 'US/Michigan', 'US/Mountain', 'US/Pacific', 'US/Pacific-New', 'US/Samoa', 'UTC', 'Universal', 'W-SU', 'WET', 'Zulu']; const USTZS = ['America/New York', 'America/Detroit', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Indiana/Indianapolis', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', 'America/Indiana/Marengo', 'America/Indiana/Petersburg', 'America/Indiana/Vevay', 'America/Chicago', 'America/Indiana/Tell City', 'America/Indiana/Knox', 'America/Menominee', 'America/North Dakota/Center', 'America/North Dakota/New Salem', 'America/North Dakota/Beulah', 'America/Denver', 'America/Boise', 'America/Phoenix', 'America/Los Angeles', 'America/Anchorage', 'America/Juneau', 'America/Sitka', 'America/Metlakatla', 'America/Yakutat', 'America/Nome', 'America/Adak', 'Pacific/Honolulu']; -test('new york date timestamp format', () => { +test('GMT date timestamp format', () => { // Month parameter is zero indexed so it's actually the 10th month. const testDate = new Date(Date.UTC(2020, 9, 3, 14, 19, 4, 23)).getTime(); const expected = 'Saturday, October 3, 2020'; @@ -27,10 +27,28 @@ test('other date timestamp format', () => { expect(actualSingapore).toEqual(expectedSingapore); }); -test('new york time timestamp format', () => { +test('GMT time timestamp format', () => { + // Month parameter is zero indexed so it's actually the 10th month. + const testDate = new Date(Date.UTC(2020, 9, 3, 14, 19, 4, 23)).getTime(); + const expected = 'October 3, 2020'; + const actual = utils.timestampToLongDate(testDate); + expect(actual).toEqual(expected); + }); + + test('other date timestamp format, no weekday', () => { + const testDate = new Date(Date.UTC(2020, 7, 23, 2, 3, 2, 4)).getTime(); + const expectedCentral = 'August 22, 2020'; + const expectedSingapore = 'August 23, 2020'; + const actualCentral = utils.timestampToLongDate(testDate, TZ_CHICAGO); + const actualSingapore = utils.timestampToLongDate(testDate, TZ_SINGAPORE); + expect(actualCentral).toEqual(expectedCentral); + expect(actualSingapore).toEqual(expectedSingapore); + }); + +test('GMT time timestamp format', () => { // Month parameter is zero indexed so it's actually the 10th month. const testDate = new Date(Date.UTC(2020, 9, 3, 14, 19, 4, 23)).getTime(); - const expected = '10:19 AM'; + const expected = '2:19 PM'; const actual = utils.timestampToTimeFormatted(testDate); expect(actual).toEqual(expected); }); @@ -45,10 +63,10 @@ test('other time timestamp format', () => { expect(actualSingapore).toEqual(expectedSingapore); }); -test('new york full timestamp format', () => { +test('GMT full timestamp format', () => { // Month parameter is zero indexed so it's actually the 10th month. const testDate = new Date(Date.UTC(2020, 9, 3, 14, 19, 4, 23)).getTime(); - const expected = 'Saturday, October 3, 2020 10:19 AM EDT'; + const expected = 'Saturday, October 3, 2020 2:19 PM UTC'; const actual = utils.timestampToFormatted(testDate); expect(actual).toEqual(expected); }); @@ -79,7 +97,7 @@ test('not legit country (spaces and non spaces)', () => { expect(new Set(actual)).toEqual(new Set(ALLTZS)); }); -test('new york date ISODate format', () => { +test('GMT date ISODate format', () => { // Month parameter is zero indexed so it's actually the 10th month. const testDate = new Date(Date.UTC(2020, 9, 3, 14, 19, 4, 23)).getTime(); const expected = '2020-10-03'; @@ -129,20 +147,19 @@ test('ISODate empty input tests', () => { expect(utils.getISODate(testDate, null)).toBe(expected); }); - const mockTimeNow = 0; jest.mock('firebase', () => ({ firestore: { Timestamp: { now: () => mockTimeNow, fromDate: (date) => date, + toDate: (date) => date, } } })); // TODO(Issue #118): Fix this test by mocking the Timestamp constructor or find // a workaround to avoid ithaving to be mocked. test('firestore Timestamp format', () => { - const {Timezone} = jest.RequireActual('firebase/firestore'); const testDate = new Date(Date.UTC(2020, 7, 23, 2, 3)) // central = 'Saturday, August 22, 2020, 9:03 PM'; // singapore = 'Sunday, August 23, 2020, 10:03 AM'; @@ -157,7 +174,7 @@ describe('getTimeStampFromDateString tests', () => { const expectedTimestamp = mockTimeNow; const testRawDate = ''; - const testTimestamp = utils.getTimestampFromDateString(testRawDate); + const testTimestamp = utils.getTimestampFromISODateString(testRawDate); expect(testTimestamp).toEqual(expectedTimestamp); }); @@ -166,13 +183,35 @@ describe('getTimeStampFromDateString tests', () => { const YEAR_2020 = 2020; const MONTH_JULY = 5; // Date constructor uses 0 indexed month. const DAY_4TH = 4; - const expectedTimestamp = new Date(YEAR_2020, MONTH_JULY, DAY_4TH); + const expectedTimestamp = new Date(Date.UTC(YEAR_2020, MONTH_JULY, DAY_4TH)); // This is the type of string (yyyy-mm-dd) that is returned from the form // input type 'date'. const testISODateStr = '2020-06-04'; // July 4, 2020 - const testTimestamp = utils.getTimestampFromDateString(testISODateStr); + const testTimestamp = utils.getTimestampFromISODateString(testISODateStr); expect(testTimestamp).toEqual(expectedTimestamp); }); }); + +test('getDateRangeString test', () => { + // Dates used for both test and expected date strings. + const startMonth = 12; + const startDay = 17; + const startYear = 1995; + const endMonth = 5; + const endDay = 24; + const endYear = 1996; + const expectedDateRange = `${startMonth}/${startDay}/${startYear} - ` + + `${endMonth}/${endDay}/${endYear}`; + + // Note that the months in JS dates are 0 indexed rather than 1 indexed so + // they must be decremented by 1 in order for the month to be correct. + const testStartDate = firebase.firestore.Timestamp.fromDate( + new Date(startYear, startMonth - 1, startDay)); + const testEndDate = firebase.firestore.Timestamp.fromDate( + new Date(endYear, endMonth - 1, endDay)); + const testDateRange = utils.getDateRangeString(testStartDate, testEndDate); + + expect(testDateRange).toEqual(expectedDateRange); +}) diff --git a/frontend/src/components/ViewActivities/activity.js b/frontend/src/components/ViewActivities/activity.js index 9feed8cd..1567a4dc 100644 --- a/frontend/src/components/ViewActivities/activity.js +++ b/frontend/src/components/ViewActivities/activity.js @@ -25,7 +25,7 @@ class Activity extends React.Component { /** * Set the activity into editing mode. */ - setEditActivity() { + setEditActivity = () => { this.setState({editing: true}); } @@ -70,8 +70,9 @@ class Activity extends React.Component { return ( - - {activity[DB.ACTIVITIES_TITLE]} + +
{activity[DB.ACTIVITIES_TITLE]}
+

{utils.displayTimes(activity)}

{ + const aDate = moment.utc(a[0], "YYYY-MM-DD").valueOf(); + const bDate = moment.utc(b[0], "YYYY-MM-DD").valueOf(); + return aDate < bDate ? -1 : 1; + }); return activitiesSorted; } @@ -132,3 +137,51 @@ export function getRefValue(ref, ignoreValue='', defaultValue=null) { } return ref.current.value; } + +/** + * Pretty format start and end times/days to be displayed. + * + * Examples: + * 9:30 AM - 10:30 AM + * 9:30 AM America/Chicago - 10:30 AM America/New York + * 9:30 AM - August 9, 2020 10:30 AM + * 9:30 AM America/Chicago - August 9, 2020 10:30 AM America/New York + * + * Exact output depends on input's date and timezone. + * + * @param {!ActivityInfo} activity The activity to display. + * @return {string} The text to display. + */ +export function displayTimes(activity) { + const startDay = time.timestampToLongDate( + getField(activity, DB.ACTIVITIES_START_TIME), + getField(activity, DB.ACTIVITIES_START_TZ) + ); + const endDay = time.timestampToLongDate( + getField(activity, DB.ACTIVITIES_END_TIME), + getField(activity, DB.ACTIVITIES_END_TZ) + ); + const startTime = time.timestampToTimeFormatted( + getField(activity, DB.ACTIVITIES_START_TIME), + getField(activity, DB.ACTIVITIES_START_TZ) + ); + const endTime = time.timestampToTimeFormatted( + getField(activity, DB.ACTIVITIES_END_TIME), + getField(activity, DB.ACTIVITIES_END_TZ) + ); + const startTz = getField(activity, DB.ACTIVITIES_START_TZ); + const endTz = getField(activity, DB.ACTIVITIES_END_TZ); + // Start and end time are on the same day. + if (startDay === endDay) { + // They're in the same timezone. + if (startTz === endTz) { return `${startTime} - ${endTime}`; } + // They're in different timezones. + return `${startTime} ${startTz} - ${endTime} ${endTz}`; + } + + // Start and end time aren't on the same day. + // They're in the same timezone. + if (startTz === endTz) { return `${startTime} - ${endDay}, ${endTime}`; } + // They're in different timezones. + return `${startTime} ${startTz} - ${endDay}, ${endTime} ${endTz}`; +} \ No newline at end of file diff --git a/frontend/src/components/ViewActivities/activityfns.test.js b/frontend/src/components/ViewActivities/activityfns.test.js index 3869e053..2e68c47c 100644 --- a/frontend/src/components/ViewActivities/activityfns.test.js +++ b/frontend/src/components/ViewActivities/activityfns.test.js @@ -1,5 +1,7 @@ import * as activityFns from './activityfns.js'; import * as time from '../Utils/time.js'; +import * as DB from '../../constants/database.js'; +import * as moment from 'moment-timezone'; const ten = Date.UTC(2020, 4, 2, 10, 0); // May 2, 2020 10:00 const eleven = Date.UTC(2020, 4, 2, 11, 0); // May 2, 2020 11:00 @@ -40,15 +42,16 @@ describe('Same day activity compareActivities', () => { test('Activities with same end time', () => { expect(activityFns.compareActivities(elevenToTwelve, tenToTwelve)).toBe(1); }) + + test('compareActivities on different days', () => { + const may10 = createActivity(may102pm, may102pm); + const may15 = createActivity(may153am, may153am); + const may01 = createActivity(may014pm, may014pm); + expect(activityFns.compareActivities(may10, may01)).toBe(1); + expect(activityFns.compareActivities(may15, may01)).toBe(1); + }) }) -test('compareActivities on different days', () => { - const may10 = createActivity(may102pm, may102pm); - const may15 = createActivity(may153am, may153am); - const may01 = createActivity(may014pm, may014pm); - expect(activityFns.compareActivities(may10, may01)).toBe(1); - expect(activityFns.compareActivities(may15, may01)).toBe(1); -}) describe('sortByDate tests', () => { const act1 = createActivity(ten, eleven); @@ -107,4 +110,32 @@ test('getRefValue', () => { expect(activityFns.getRefValue(fakeRef, 'parasailing!', 'swimming.')).toBe('swimming.'); expect(activityFns.getRefValue(fakeRef, 'swimming')).toBe('parasailing!'); expect(activityFns.getRefValue(fakeRef, 'swimming', 'jumping')).toBe('parasailing!'); -}); \ No newline at end of file +}); + +describe('displayTimes', () => { + function createInfoActivity(startDate, startTime, startTz, endDate, endTime, endTz) { + return { + [DB.ACTIVITIES_START_TIME] : moment.tz(startDate + " " + startTime, startTz).valueOf(), + [DB.ACTIVITIES_START_TZ] : startTz, + [DB.ACTIVITIES_END_TIME] : moment.tz(endDate + " " + endTime, endTz).valueOf(), + [DB.ACTIVITIES_END_TZ] : endTz, + } + } + + test('displayTimes', () => { + const aug5 = "2020-08-05"; + const aug6 = "2020-08-06"; + const nineThirty = "09:30"; + const tenThirty = "10:30"; + const chicago = "America/Chicago"; + const singapore = "Asia/Singapore"; + + console.log(createInfoActivity(aug5, nineThirty, chicago, aug5, tenThirty, chicago)); + + expect(activityFns.displayTimes(createInfoActivity(aug5, nineThirty, chicago, aug5, tenThirty, chicago))).toEqual(`9:30 AM - 10:30 AM`); + expect(activityFns.displayTimes(createInfoActivity(aug5, nineThirty, chicago, aug5, tenThirty, singapore))).toEqual(`9:30 AM America/Chicago - 10:30 AM Asia/Singapore`); + expect(activityFns.displayTimes(createInfoActivity(aug5, nineThirty, chicago, aug6, tenThirty, chicago))).toEqual(`9:30 AM - August 6, 2020 10:30 AM`); + expect(activityFns.displayTimes(createInfoActivity(aug5, nineThirty, chicago, aug6, tenThirty, singapore))).toEqual(`9:30 AM America/Chicago - August 6, 2020 10:30 AM Asia/Singapore`); + }) +}); + diff --git a/frontend/src/components/ViewActivities/activitylist.js b/frontend/src/components/ViewActivities/activitylist.js index 3ecd622e..461c5c32 100644 --- a/frontend/src/components/ViewActivities/activitylist.js +++ b/frontend/src/components/ViewActivities/activitylist.js @@ -27,7 +27,7 @@ class ActivityList extends React.Component { * * This function sets `this.state.days` to the sorted days. * - * @param {!string} tripId The trip ID. + * @param {string} tripId The trip ID. */ async getActivityList(tripId) { db.collection(DB.COLLECTION_TRIPS).doc(tripId) @@ -36,21 +36,19 @@ class ActivityList extends React.Component { let tripActivities = []; this.setState({days: []}); querySnapshot.forEach(doc => { - console.log(doc.data()); let data = doc.data(); data['id'] = doc.id; data['tripId'] = tripId; // TODO: if start date != end date, split into 2 days. (#37) - - if (data[DB.ACTIVITIES_START_TIME] !== undefined) {// not in new mode + if (data[DB.ACTIVITIES_START_TIME] !== undefined) { // Not in new mode. // Eliminate nanoseconds, convert to milliseconds. data[DB.ACTIVITIES_START_TIME] = data[DB.ACTIVITIES_START_TIME]['seconds'] * 1000; data[DB.ACTIVITIES_END_TIME] = data[DB.ACTIVITIES_END_TIME]['seconds'] * 1000; + tripActivities.push(data); } - tripActivities.push(data); }); this.setState({ days: activityFns.sortByDate(tripActivities) }); }); diff --git a/frontend/src/components/ViewActivities/editActivity.js b/frontend/src/components/ViewActivities/editActivity.js index 6dcea6d6..6683ce69 100644 --- a/frontend/src/components/ViewActivities/editActivity.js +++ b/frontend/src/components/ViewActivities/editActivity.js @@ -16,13 +16,26 @@ const db = app.firestore(); * @property {Object} props ReactJS props. * @property {ActivityInfo} props.activity The activity to display. * @property {function} props.submitFunction The function to run upon submission. + * @property {boolean} props.new Whether or not the activity being edited is new. */ class EditActivity extends React.Component { /** @override */ constructor(props){ super(props); - - this.state = {startTzChanged: false, endTzChanged: false}; + + const activity = props.activity; + this.state = { + startTzChanged: false, + endTzChanged: false, + startTimeDateChanged: false, + endDateFiller: time.getISODate(getField(activity, DB.ACTIVITIES_END_TIME), + getField(activity, DB.ACTIVITIES_END_TZ)), + endTimeFiller: time.get24hTime(getField(activity, DB.ACTIVITIES_END_TIME), + getField(activity, DB.ACTIVITIES_END_TZ)), + flightCheck: getField(this.props.activity, + DB.ACTIVITIES_FLIGHT, // Check for database value of "flight". + !this.props.new) === 'true' // New activities have "flight" not checked. + }; // Bind state users/modifiers to `this`. this.editActivity = this.editActivity.bind(this); @@ -41,6 +54,7 @@ class EditActivity extends React.Component { this.editEndLocRef = React.createRef(); this.editStartTzRef = React.createRef(); this.editEndTzRef = React.createRef(); + this.isFlightRef = React.createRef(); } /** @@ -58,11 +72,20 @@ class EditActivity extends React.Component { newVals[DB.ACTIVITIES_START_COUNTRY] = getRefValue(this.editStartLocRef, 'No Change', activity[DB.ACTIVITIES_START_COUNTRY]); - newVals[DB.ACTIVITIES_END_COUNTRY] = - getRefValue(this.editEndLocRef, 'No Change', activity[DB.ACTIVITIES_END_COUNTRY]); + + // Ref doesn't keep track of checked value + newVals[DB.ACTIVITIES_FLIGHT] = this.state.flightCheck; newVals[DB.ACTIVITIES_START_TZ] = getRefValue(this.editStartTzRef); - newVals[DB.ACTIVITIES_END_TZ] = getRefValue(this.editEndTzRef); + + if (newVals[DB.ACTIVITIES_FLIGHT]) { // This is a flight. + newVals[DB.ACTIVITIES_END_COUNTRY] = + getRefValue(this.editEndLocRef, 'No Change', activity[DB.ACTIVITIES_END_COUNTRY]); + newVals[DB.ACTIVITIES_END_TZ] = getRefValue(this.editEndTzRef); + } else { // This is not a flight. + newVals[DB.ACTIVITIES_END_COUNTRY] = newVals[DB.ACTIVITIES_START_COUNTRY]; + newVals[DB.ACTIVITIES_END_TZ] = newVals[DB.ACTIVITIES_START_TZ]; + } // Start time fields! const startTime = getRefValue(this.editStartTimeRef); @@ -95,15 +118,24 @@ class EditActivity extends React.Component { startTimeTzUpdate = () => { this.setState({startTzChanged : !this.state.startTzChanged})}; endTimeTzUpdate = () => { this.setState({endTzChanged : !this.state.endTzChanged})}; + onFlightCheckChange = () => { this.setState({flightCheck: !this.state.flightCheck}) } + + startDateUpdate = () => { + this.setState({ + endDateFiller: this.editStartDateRef.current.value, + startTimeDateChanged: !this.state.startTimeDateChanged + }); + } + /** * Returns a dropdown of all the timezones. * The dropdown's values change based on the corrresponding country dropdown to * reduce scrolling and ensure that the location corresponds to the time zone. * - * @param {!string} st Either 'start' or 'end' depending on whether the + * @param {string} st Either 'start' or 'end' depending on whether the * timezone is for the start or end timezone. - * @param {!string} defaultTz The default time zone. - * @returns HTML dropdown item. + * @param {string} defaultTz The default time zone. + * @return {JSX.Element} HTML dropdown item. */ timezoneDropdown(st, defaultTz) { let ref = st === 'start' ? this.editStartLocRef : this.editEndLocRef; @@ -135,14 +167,14 @@ class EditActivity extends React.Component { * so when the country changes here, the values in the timezone dropdown * change as well. * - * @param {!React.RefObject} ref The reference to attach to the dropdown. - * @param {!React.RefObject} tzref The corresponding time zone reference field. - * @param {!string} defaultCountry The default country for the dropdown. + * @param {React.RefObject} ref The reference to attach to the dropdown. + * @param {React.RefObject} tzref The corresponding time zone reference field. + * @param {string} defaultCountry The default country for the dropdown. * @return {JSX.Element} HTML dropdown of all the countries with timezones. */ - countriesDropdown(ref, tzref, defaultCountry) { + countriesDropdown(ref, onChange, defaultCountry) { return ( - + {countryList.map((item, index) => { return ( @@ -171,7 +203,6 @@ class EditActivity extends React.Component { render() { const activity = this.props.activity; - const newAct = this.props.new; return (
{formElements.textElementFormGroup( // TITLE @@ -180,19 +211,27 @@ class EditActivity extends React.Component { getField(activity, DB.ACTIVITIES_TITLE, msgs.ACTIVITY_TITLE_PLACEHOLDER), // placeHolder this.editTitleRef // ref )} + {formElements.flightCheck( // "THIS IS A FLIGHT" checkbox + 'formActivityFlightCheck', // controlId + 'This is a flight.', // formLabel + this.isFlightRef, // ref + this.onFlightCheckChange, // onChange + this.state.flightCheck // defaultValue + )} {formElements.locationElementFormGroup( // START LOCATION 'formActivityStartLocation', // controlId 'Start Location:', // formLabel this.countriesDropdown(this.editStartLocRef, // defaultValue ref - this.editStartTzRef, // countriesDropdown tzref + this.startTimeTzUpdate, // countriesDropdown onChange getField(activity, DB.ACTIVITIES_START_COUNTRY)) // countriesDropdown defaultCountry )} {formElements.locationElementFormGroup( // END LOCATION 'formActivityEndLocation', // controlId 'End Location:', // formLabel this.countriesDropdown(this.editEndLocRef, // defaultValue ref - this.editEndTzRef, // countriesDropdown tzref - getField(activity, DB.ACTIVITIES_END_COUNTRY)) // countriesDropdown defaultCountry + this.endTimeTzUpdate, // countriesDropdown onChange + getField(activity, DB.ACTIVITIES_END_COUNTRY)), // countriesDropdown defaultCountry + this.state.flightCheck //show )} {formElements.dateTimeTzFormGroup( // START TIME 'formActivityStartTime', // controlId @@ -203,18 +242,20 @@ class EditActivity extends React.Component { this.editStartTimeRef, // timeRef, time.get24hTime(getField(activity, DB.ACTIVITIES_START_TIME), getField(activity, DB.ACTIVITIES_START_TZ)), //timeDefault, - this.timezoneDropdown('start', getField(activity, DB.ACTIVITIES_START_TZ)) // tzpicker + this.timezoneDropdown('start', getField(activity, DB.ACTIVITIES_START_TZ)), // tzpicker + this.startDateUpdate, // onChangeDate )} {formElements.dateTimeTzFormGroup( // END TIME 'formActivityEndTime', // controlId 'To:', // formLabel this.editEndDateRef, // dateRef - time.getISODate(getField(activity, DB.ACTIVITIES_END_TIME), - getField(activity, DB.ACTIVITIES_END_TZ)), // dateDefault + this.state.endDateFiller, // dateDefault this.editEndTimeRef, // timeRef, - time.get24hTime(getField(activity, DB.ACTIVITIES_END_TIME), - getField(activity, DB.ACTIVITIES_END_TZ)), //timeDefault, - this.timezoneDropdown('end', getField(activity, DB.ACTIVITIES_END_TZ)) // tzpicker + this.state.endTimeFiller, //timeDefault, + this.timezoneDropdown('end', getField(activity, DB.ACTIVITIES_END_TZ)), // tzpicker + null, // onChangeDate + this.state.startTimeDateChanged, // key + this.state.flightCheck //show )} {formElements.textElementFormGroup( // DESCRIPTION 'formActivityDescription', // controlId @@ -231,4 +272,4 @@ class EditActivity extends React.Component { } } -export default EditActivity; \ No newline at end of file +export default EditActivity; diff --git a/frontend/src/components/ViewActivities/editActivityFormElements.js b/frontend/src/components/ViewActivities/editActivityFormElements.js index b188ba93..b23e50f3 100644 --- a/frontend/src/components/ViewActivities/editActivityFormElements.js +++ b/frontend/src/components/ViewActivities/editActivityFormElements.js @@ -3,10 +3,8 @@ import { Col, Form, Row } from 'react-bootstrap'; // This file was written after #87 was created. // As a result, some fields and functions may not be used yet. -const TITLEWIDTH = 3; -const COUNTRYWIDTH = 6; -const DATEWIDTH = 4; -const TIMEWIDTH = 2; +const TITLEWIDTH = 2; +const COUNTRYWIDTH = 8; const TZPICKERWIDTH = 3; /** @@ -37,9 +35,10 @@ export function textElementFormGroup(controlId, formLabel, placeHolder, ref) { * @param {string} controlId FormGroup's control ID. * @param {string} formLabel The label of the field for this FormGroup. * @param {string} dropdown The dropdown. - * @return {JSX.Element} a location dropdown form group. + * @return {JSX.Element} A location dropdown form group. */ -export function locationElementFormGroup(controlId, formLabel, dropdown) { +export function locationElementFormGroup(controlId, formLabel, dropdown, show=true) { + if (!show) { return (
); } return ( {formLabel} @@ -62,18 +61,51 @@ export function locationElementFormGroup(controlId, formLabel, dropdown) { * @return {JSX.Element} A FormGroup for date, time, and timezone. */ export function dateTimeTzFormGroup(controlId, formLabel, dateRef, - dateDefault, timeRef, timeDefault, tzpicker) { + dateDefault, timeRef, timeDefault, tzpicker, onChangeDate=null, key=null, show=true) { + if (!show) {return (
); } return ( - + {formLabel} - - + + - - + {tzpicker} ); } + +/** + * Create a From Group with a checkbox. + * + * @param {string} controlId FormGroup's control ID. + * @param {string} formLabel Label of the field for this FormGroup. + * @param {React.RefObject} ref The input's reference. + * @param {function} onChange The function to call onChange. + * @param {boolean} defaultValue The default value of the checkbox (true for checked). + * @return {JSX.Element} A FormGroup with the checkbox. + */ +export function flightCheck(controlId, formLabel, ref, onChange, defaultValue) { + return ( + + {formLabel} + + + + + ) +} \ No newline at end of file diff --git a/frontend/src/components/ViewActivities/index.js b/frontend/src/components/ViewActivities/index.js index 509051c3..41e34659 100644 --- a/frontend/src/components/ViewActivities/index.js +++ b/frontend/src/components/ViewActivities/index.js @@ -2,11 +2,12 @@ import React from 'react'; import ActivityList from './activitylist.js'; import EditActivity from './editActivity.js'; import { Button, Modal } from 'react-bootstrap'; -import app from '../Firebase'; +import app from '../Firebase'; import * as DB from '../../constants/database.js'; import { firestore } from 'firebase'; import { getCurUserUid } from '../AuthUtils'; import * as ErrorComponents from '../Errors'; +import Header from '../Header'; const db = app.firestore(); /** @@ -23,7 +24,7 @@ class ViewActivities extends React.Component { collaborators: undefined, isLoading: true, error: undefined, - addingActivity : false + addingActivity : false }; this.doneAddingActivity = this.doneAddingActivity.bind(this); } @@ -38,9 +39,9 @@ class ViewActivities extends React.Component { createEmptyActivity = (tripId) => { const newAct = db.collection(DB.COLLECTION_TRIPS).doc(tripId) .collection(DB.COLLECTION_ACTIVITIES).doc(); - const data = { - fillerstamp : firestore.Timestamp.now(), - id: newAct.id, + const data = { + fillerstamp : firestore.Timestamp.now(), + id: newAct.id, tripId: tripId }; newAct.set(data); @@ -62,14 +63,14 @@ class ViewActivities extends React.Component { /** * Runs when the user is done adding an activity. */ - async doneAddingActivity() { + async doneAddingActivity() { await this.setState({ addingActivity: false, newAct: null - }); + }); }; - /** @inheritdoc */ + /** @override */ componentDidMount() { app.firestore() .collection(DB.COLLECTION_TRIPS) @@ -77,7 +78,7 @@ class ViewActivities extends React.Component { .get() .then(doc => { this.setState({ - collaborators: doc.get(DB.TRIPS_COLLABORATORS), + collaborators: doc.get(DB.TRIPS_ACCEPTED_COLLABS), isLoading: false, error: undefined }); @@ -91,42 +92,66 @@ class ViewActivities extends React.Component { }); } + cancelAdd = () => { + // TODO: delete new event (#132) + this.doneAddingActivity() + } + render() { - const tripId = this.props.match.params.tripId; + const tripId = this.props.match.params.tripId; if (this.state.error !== undefined) { - return
; + return ( +
+ +
+ ); } // Case where the trip details are still being fetched. if (this.state.isLoading) { // TODO (Issue #25): Please remember to make this a blank div in the // deployed build lol. - return
Loading Part 2: Electric Boogaloo
; + return ( +
+ Loading Part 2: Electric Boogaloo +
+ ); } // Case where the trip could not be found or the current user is not // authorized to view the trip. else if (this.state.collaborators === undefined || !this.state.collaborators.includes(getCurUserUid())) { - return
; + return ( +
+ +
+ ); } else { if (!this.state.addingActivity) { return (
+
+
-
); } else { return ( - - Add New Activity + + + Add New Activity + - + - + ); } } diff --git a/frontend/src/components/ViewTrips/change-collaborator-type-button.js b/frontend/src/components/ViewTrips/change-collaborator-type-button.js new file mode 100644 index 00000000..39221120 --- /dev/null +++ b/frontend/src/components/ViewTrips/change-collaborator-type-button.js @@ -0,0 +1,81 @@ +import React from 'react'; + +import app from '../Firebase'; +import Button from 'react-bootstrap/Button'; + +import authUtils from '../AuthUtils'; +import * as DB from '../../constants/database.js'; + +const db = app.firestore(); + +/** + * {@link TripData} defined originally in `ViewTrips/trip.js`. + */ + +/** + * Component that opens the edit trip modal upon click. + * + * @property {Object} props These are the props for this component: + * @property {string} props.tripId The document id associated with the trip. + * @property {TripData} props.tripData The current trip document data. + * @property {string} props.curCollabField The collab uid arr field that the + * current collaborator uid is an element of in the trip with id + * `props.tripId`. + * @property {string} props.newCollabField The collab uid arr field that the + * current collaborator uid is added to (in trip with id `props.tripId`) + * once the button is presssed. + * @property {string} props.text The inner text of the button. + */ +const ChangeCollabTypeButton = (props) => { + /** + * Updates the collaborator fields by moving the current user uid from + * the uid arr corresponding to `props.curCollabField` to uid arr + * corresponding to `props.newCollabField`. + */ + function getUpdatedCollabUidArrObj() { + const curUserUid = authUtils.getCurUserUid(); + let curCollabUidSet = new Set(props.tripData[props.curCollabField]); + curCollabUidSet.delete(curUserUid); + let curCollabUidArr = Array.from(curCollabUidSet); + + let newCollabUidSet = new Set(props.tripData[props.newCollabField]); + newCollabUidSet.add(curUserUid); + let newCollabUidArr = Array.from(newCollabUidSet); + + return { + [props.curCollabField]: curCollabUidArr, + [props.newCollabField]: newCollabUidArr + }; + } + + /** + * Gets the updated collaborator fields and then updates those fields in + * the trip document. + */ + function changeUserCollabType() { + const collabData = getUpdatedCollabUidArrObj(); + + db.collection(DB.COLLECTION_TRIPS) + .doc(props.tripId) + .set(collabData, { merge: true }) + .then(() => { + console.log('Collaborators updated for trip with ID: ', props.tripId); + }) + .catch(error => { + console.error('Error updated collaborators for trip: ', error); + }); + } + + return ( + + ); +} + +export default ChangeCollabTypeButton; + diff --git a/frontend/src/components/ViewTrips/delete-trip-button.js b/frontend/src/components/ViewTrips/delete-trip-button.js index b801b859..ba41ef89 100644 --- a/frontend/src/components/ViewTrips/delete-trip-button.js +++ b/frontend/src/components/ViewTrips/delete-trip-button.js @@ -2,116 +2,122 @@ import React from 'react'; import app from '../Firebase/'; import Button from 'react-bootstrap/Button'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import * as DB from '../../constants/database.js'; const db = app.firestore(); -const LIMIT_QUERY_DOCS_RETRIEVED = 5; +// This constant determines the max number of docs deleted in a batch (max +// number in each query). This is a magic number and can be tweaked as needed. +const NUM_DOCS_IN_BATCH_DELETE = 5; /** - * Component used to delete a Trip. - * + * Deletes documents in query with a batch delete. * - * @param {Object} props These are the props for this component: - * - tripId: Document ID for the current Trip document. - * - refreshTripsContainer: Handler that refreshes the TripsContainer - * component upon trip creation (Remove when fix Issue #62). - */ -const DeleteTripsButton = (props) => { - /** - * Deletes documents in query with a batch delete. - * - * This was taken from the delete collection snippets in the documentation - * at https://firebase.google.com/docs/firestore/manage-data/delete-data. - * - * @param {firebase.firestore.Firestore} db Firestore database instance. - * @param {firebase.firestore.Query} query Query containing documents from - * the activities subcollection of a trip documents. - * @param {Function} resolve Resolve function that returns a void Promise. - */ - async function deleteQueryBatch(db, query, resolve) { - const snapshot = await query.get(); - - const batchSize = snapshot.size; - if (batchSize === 0) { - // When there are no documents left, we are done. - resolve(); - return; - } - - // Delete documents in a batch. - const batch = db.batch(); - snapshot.docs.forEach((doc) => { - batch.delete(doc.ref); - }); - await batch.commit(); + * This was taken from the delete collection snippets in the documentation + * at https://firebase.google.com/docs/firestore/manage-data/delete-data. + * + * @param {firebase.firestore.Firestore} db Firestore database instance. + * @param {firebase.firestore.Query} query Query containing documents from + * the activities subcollection of a trip documents. + * @param {Function} resolve Resolve function that returns a void Promise. + */ +async function deleteQueryBatch(db, query, resolve) { + const snapshot = await query.get(); - // Recurse on the next process tick, to avoid - // exploding the stack. - process.nextTick(() => { - deleteQueryBatch(db, query, resolve); - }); + const batchSize = snapshot.size; + if (batchSize === 0) { + // When there are no documents left, we are done. + resolve(); + return; } - /** - * Deletes a trip's subcollection of activities corresponding to the - * `tripId` prop. - * - * This was adapted from the delete collection snippets in the documentation - * at https://firebase.google.com/docs/firestore/manage-data/delete-data. - * - * TODO(Issue #81): Consider deleting data with callable cloud function - * https://firebase.google.com/docs/firestore/solutions/delete-collections. - */ - async function deleteTripActivities() { - const query = db.collection(DB.COLLECTION_TRIPS) - .doc(props.tripId) - .collection(DB.COLLECTION_ACTIVITIES) - .orderBy(DB.ACTIVITIES_TITLE) - .limit(LIMIT_QUERY_DOCS_RETRIEVED); + // Delete documents in a batch. + const batch = db.batch(); + snapshot.docs.forEach((doc) => { + batch.delete(doc.ref); + }); + await batch.commit(); - return new Promise((resolve, reject) => { - deleteQueryBatch(db, query, resolve).catch(reject); - }); - } + // Recurse on the next process tick, to avoid + // exploding the stack. + process.nextTick(() => { + deleteQueryBatch(db, query, resolve); + }); +} + +/** + * Deletes a trips subcollection of activities corrsponding to the + * `tripId` prop. + * + * This was adapted from the delete collection snippets in the documentation + * at https://firebase.google.com/docs/firestore/manage-data/delete-data. + * + * TODO(Issue #81): Consider deleting data with callabable cloud function + * https://firebase.google.com/docs/firestore/solutions/delete-collections. + * + * @param {string} tripId Document ID for the current Trip document. + * @return {Promise} Void promise used to call {@link deleteQueryBatch} + * asynchronously and catch any potential errors. + */ +async function deleteTripActivities(tripId) { + const query = db.collection(DB.COLLECTION_TRIPS) + .doc(tripId) + .collection(DB.COLLECTION_ACTIVITIES) + .orderBy(DB.ACTIVITIES_TITLE) + .limit(NUM_DOCS_IN_BATCH_DELETE); - /** - * Deletes a trip and its subcollection of activities corrsponding to the - * `tripId` prop and then refreshes the TripsContainer component. - * - * TODO(Issue #62): Remove refreshTripsContainer. - */ - async function deleteTrip() { - if (window.confirm('Are you sure you want to delete this trip? This' + - ' action cannot be undone!')) { - await deleteTripActivities() - .then(() => { - console.log("Activity subcollection successfully deleted for trip" + - " with id: ", props.tripId); - }) - .catch(error => { - console.error("Error deleting activities subcollection: ", error); - }); + return new Promise((resolve, reject) => { + deleteQueryBatch(db, query, resolve).catch(reject); + }); +} - db.collection(DB.COLLECTION_TRIPS) - .doc(props.tripId) - .delete() - .then(() => { - console.log("Document successfully deleted with id: ", props.tripId); - }).catch(error => { - console.error("Error removing document: ", error); - }); +/** + * Deletes a trip and its subcollection of activities corrsponding to the + * `tripId` prop and then refreshes the TripsContainer component. + * + * @param {string} tripId Document ID for the current Trip document. + */ +async function deleteTrip(tripId) { + if (window.confirm('Are you sure you want to delete this trip? This' + + ' action cannot be undone!')) { + await deleteTripActivities(tripId) + .then(() => { + console.log("Activity subcollection successfully deleted for trip" + + " with id: ", tripId); + }) + .catch(error => { + console.error("Error deleting activities subcollection: ", error); + }); - props.refreshTripsContainer(); - } + db.collection(DB.COLLECTION_TRIPS) + .doc(tripId) + .delete() + .then(() => { + console.log("Document successfully deleted with id: ", tripId); + }).catch(error => { + console.error("Error removing document: ", error); + }); } +} +/** + * Component used to delete a Trip. + * + * @property {Object} props These are the props for this component: + * @property {string} props.tripId Document ID for the current Trip document. + * @property {boolean} props.canModifyTrip Determines whether or not the button + * is disabled. + */ +const DeleteTripsButton = (props) => { return ( ); } diff --git a/frontend/src/components/ViewTrips/edit-trip-button.js b/frontend/src/components/ViewTrips/edit-trip-button.js new file mode 100644 index 00000000..5339c0b7 --- /dev/null +++ b/frontend/src/components/ViewTrips/edit-trip-button.js @@ -0,0 +1,35 @@ +import React from 'react'; + +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Button from 'react-bootstrap/Button'; + +/** + * {@link TripData} defined originally in `ViewTrips/trip.js`. + */ + +/** + * Component that opens the edit trip modal upon click. + * + * @property {Object} props These are the props for this component: + * @property {string} props.tripId The document id associated with the trip. + * @property {TripData} props.tripData The current trip document data. + * @property {Function} props.handleEditTrip Event handler responsible for + * displaying the edit trip modal. + * @property {boolean} props.canModifyTrip Determines whether or not the button + * is disabled. + * + */ +const EditTripButton = (props) => { + return ( + + ); +} + +export default EditTripButton; diff --git a/frontend/src/components/ViewTrips/index.js b/frontend/src/components/ViewTrips/index.js index 08ce2971..01f2070d 100644 --- a/frontend/src/components/ViewTrips/index.js +++ b/frontend/src/components/ViewTrips/index.js @@ -1,40 +1,42 @@ import React from 'react'; -import Button from 'react-bootstrap/Button'; - import Header from '../Header/'; import SaveTripModal from './save-trip-modal.js' import TripsContainer from './trips-container.js'; +import ManageTripsBar from './manage-trips-bar.js'; +import TripView from '../../constants/trip-view.js'; + +/** + * {@link TripView} defined originally in `constants/trip-view.js`. + */ +/** + * {@link RawTripData} defined originally in `ViewTrips/save-trip-modal.js`. + */ /** * ViewTrips component that defines the page where a user can view and manage * their current trips. */ class ViewTrips extends React.Component { - /** @inheritdoc */ + /** @override */ constructor() { super(); this.state = { showModal: false, - refreshTripsContainer: false, refreshSaveTripModal: false, tripId: null, - defaultFormObj: null, + tripData: null, + tripView: TripView.ACTIVE, }; } /** - * Handler that flips `refreshTripsContainer` property which causes that - * TripsContainer component to be reloaded. + * Handler that updates the `tripView` state. * - * This allows a trip creator's view trips page to be updated in real time. - * - * In the future, the use of refreshTripContainer and the key prop on Trips - * container should be removed with the addition of real time listening with - * onShapshot (Issue #62). + * @param {TripView} tripView The page's new trip view state. */ - refreshTripsContainer = () => { - this.setState({ refreshTripsContainer: !this.state.refreshTripsContainer }); + changeTripView = (tripView) => { + this.setState({ tripView: tripView }); } /** @@ -61,14 +63,14 @@ class ViewTrips extends React.Component { /** * Handler that displays the add trip page. * - * Sets state for the states `tripId` and `placeholderObj` in order + * Sets state for the states `tripId` and `tripData` in order * to ensure the modal has the visual characteristics of an "add trip" modal * and creates a new Trip document in the database. */ showAddTripModal = () => { this.setState({ tripId: null, - defaultFormObj: null, + tripData: null, }); this.showSaveTripModal(); } @@ -76,20 +78,22 @@ class ViewTrips extends React.Component { /** * Handler that displays the edit trip page. * - * Sets state for the states `tripId` and `placeholderObj` in order + * Sets state for the states `tripId` and `tripData` in order * to ensure the modal has the visual characteristics of an "edit trip" modal - * and overwrites and existing Trip document in the database. + * and updates existing Trip document in the database. * + * @param {string} tripId Document ID for the current Trip document. + * @param {!TripData} tripData Trip document data for trip to be modified. */ showEditTripModal = (tripId, tripData) => { this.setState({ tripId: tripId, - defaultFormObj: tripData + tripData: tripData, }); this.showSaveTripModal(); } - /** @inheritdoc */ + /** @override */ render() { return (
@@ -97,20 +101,18 @@ class ViewTrips extends React.Component { -
- -
+
); diff --git a/frontend/src/components/ViewTrips/manage-trips-bar.js b/frontend/src/components/ViewTrips/manage-trips-bar.js new file mode 100644 index 00000000..9b897922 --- /dev/null +++ b/frontend/src/components/ViewTrips/manage-trips-bar.js @@ -0,0 +1,67 @@ +import React from 'react'; + +import { Button, Row, Col, Nav } from 'react-bootstrap'; + +import TripView from '../../constants/trip-view.js'; + +/** + * Component that contains the tabs to switch the trip view as well as the + * add new trip button. + * + * @property {Object} props These are the props for this component: + * @property {Function} props.handleAddTrip Event handler responsible for + * displaying the add trip modal. + * @property {Function} props.handleChangeView Event handler responsible for + * updated the `tripView` state in `ViewTrips/index.js`. + * @property {string} props.tripView The current user's trips page view. + */ +const ManageTripsBar = (props) => { + const active = TripView.ACTIVE; + const pending = TripView.PENDING; + const rejected = TripView.REJECTED; + + /** + * Returns a React Bootstrap `Nav.Item` to be placed in the `Nav` element + * of the ManageTripsBar component. + * + * @param {string} innerText Inner text of the `Nav.Link` element. + * @param {TripView} tripView The trip view associated with the `Nav.Item`. + * @return {JSX.Element} `Nav.Item` element for trip view `Nav` bar. + */ + function createTripViewNavItem(innerText, tripView) { + return ( + + props.handleChangeView(tripView)} + > + {innerText} + + + ) + } + + return ( + + + + + + + + + ); +} + +export default ManageTripsBar; + diff --git a/frontend/src/components/ViewTrips/save-trip-form-elements.js b/frontend/src/components/ViewTrips/save-trip-form-elements.js index e327c91f..e6688569 100644 --- a/frontend/src/components/ViewTrips/save-trip-form-elements.js +++ b/frontend/src/components/ViewTrips/save-trip-form-elements.js @@ -3,14 +3,14 @@ import React from 'react'; import { Form } from 'react-bootstrap'; /** - * Returns a Form.Control element with input type 'text' and other props - * specified by the function parameters. + * Returns a `Form.Control` element with input type `text` and specified values + * for the input placeholder and default value. * * @param {React.RefObject} ref Ref attached to the value inputted in the form. * @param {string} placeholder Placeholder text value in the form input. * @param {?string} defaultText Optional default text value in the form input. * Null if no default text. - * @return {JSX.Element} The Form.Control element. + * @return {JSX.Element} The `Form.Control` element. */ function createTextFormControl(ref, placeholder, defaultText) { return ( @@ -24,13 +24,13 @@ function createTextFormControl(ref, placeholder, defaultText) { } /** - * Returns a Form.Control element with input type 'date' and other props - * specified by the function parameters. + * Returns a `Form.Control` element with input type `date` and a specified value + * for the input placeholder. * * @param {React.RefObject} ref Ref attached to the date inputted in the form. * @param {?string} defaultDate Optional default ISO date string placed in the * form input. Null if no default date. - * @return {JSX.Element} The Form.Control element. + * @return {JSX.Element} The `Form.Control` element. */ function createDateFormControl(ref, defaultDate) { return ( @@ -43,15 +43,15 @@ function createDateFormControl(ref, defaultDate) { } /** - * Returns a Form.Control element with input type 'email' and other props - * specified by the function parameters. + * Returns a `Form.Control` element with input type `email` and specified values + * for the input placeholder and default value. * * @param {React.RefObject} ref Ref attached to the value inputted in the form. - * @param {number} idx Index of the email Form.Control used for key prop. + * @param {number} idx Index of the email `Form.Control` used for key prop. * @param {string} placeholder Placeholder text value in the form input. - * @param {?Array} defaultEmailArr Array of the emails to be displayed + * @param {?string[]} defaultEmailArr Array of the emails to be displayed * in the default form fields. Null if no default emails. - * @return {JSX.Element} The Form.Control element. + * @return {JSX.Element} The `Form.Control` element. */ function createEmailFormControl(ref, idx, placeholder, defaultEmailArr) { if (defaultEmailArr === null) { @@ -76,8 +76,8 @@ function createEmailFormControl(ref, idx, placeholder, defaultEmailArr) { } /** - * Returns multiple Form.Control elements with input type 'email' and other - * props specified by the function parameters. + * Returns multiple `Form.Control` elements with input type `email` and specified + * values for the input placeholder and default value. * * One is added to the index of the emails show in order to display all * collaborators except the current user. @@ -91,9 +91,9 @@ function createEmailFormControl(ref, idx, placeholder, defaultEmailArr) { * @param {boolean} isAddTripForm True if form is adding new trip, false if * form is editting existing trip. * @param {string} placeholder Placeholder text value in the form input. - * @param {?Array} defaultEmailArr Array of the emails to be displayed + * @param {?string[]} defaultEmailArr Array of the emails to be displayed * in the default form fields. - * @return {JSX.Element} The Form.Control elements. + * @return {Array} The array of `Form.Control` elements. */ function createMultiFormControl(refArr, placeholder, defaultEmailArr) { return ( @@ -112,10 +112,13 @@ function createMultiFormControl(refArr, placeholder, defaultEmailArr) { * input prop. * @param {string} formLabel Label/title for the form input. * @param {string} inputType Input type of the form. - * @param {!React.RefObject} ref Ref attached to the values inputted in the form. + * @param {!React.RefObject|!Array} ref Ref attached to the + * values inputted in the form. This is an array of `React.RefObject`s when + * `inputType` is 'emails'. * @param {string} placeholder Placeholder text value in the form input. - * @param {?string|?Array} defaultVal Default value in the form input. - * @return {JSX.Element} The Form.Group element. + * @param {?string|?string[]} defaultVal Default value in the form input. + * This is an array when `inputType` is 'emails'. + * @return {JSX.Element} The `Form.Group` element. */ export function createFormGroup(controlId, formLabel, inputType, ref, placeholder, defaultVal) { diff --git a/frontend/src/components/ViewTrips/save-trip-modal.js b/frontend/src/components/ViewTrips/save-trip-modal.js index 49a81324..19fd24a7 100644 --- a/frontend/src/components/ViewTrips/save-trip-modal.js +++ b/frontend/src/components/ViewTrips/save-trip-modal.js @@ -4,11 +4,28 @@ import app from '../Firebase'; import { Button, Modal, Form } from 'react-bootstrap'; import * as DB from '../../constants/database.js'; -import { formatTripData } from '../Utils/filter-input.js'; +import * as msgs from '../../constants/messages.js'; +import authUtils from '../AuthUtils'; +import * as TripUtils from './trip-utils.js'; +import { timestampToISOString } from "../Utils/time.js"; import { createFormGroup } from './save-trip-form-elements.js'; const db = app.firestore(); +/** + * {@link TripData} defined originally in `ViewTrips/trip.js`. + */ + +/** + * An object containing the raw form data for SaveTripModal. + * @typedef {Object} RawTripData + * @property {string} title The trips's title. + * @property {string} description A description of the trip. + * @property {string} destination The general destination of the trip. + * @property {string} start_date Start date string in the form 'YYYY-MM-DD'. + * @property {string} end_date End date string in the form 'YYYY-MM-DD'. + * @property {!string[]} collaborator_email_arr Array of raw collaborator emails. + */ /** * Component corresponding to the save trips modal. @@ -16,54 +33,69 @@ const db = app.firestore(); * This component acts as a 'pseudo-parent' of the AddTripModal and * EditTripModal components. The only differences in the implementation between * the two fake components are dervied from the props `tripid` and - * `defaultFormObj` (see below). The primary difference between the add and + * `defaultFormData` (see below). The primary difference between the add and * edit trip modals is the former displays placeholder values in the empty form * fields whereas the latter displays the current values of the trip in the * respective form fields. * - * @param {Object} props These are the props for this component: - * - show: Boolean that determines if the add trips modal should be displayed. - * - handleClose: Event handler responsible for closing the add trips modal. - * - refreshTripsContainer: Handler that refreshes the TripsContainer - * component upon trip creation (Remove when fix Issue #62). - * - tripId: For adding a new trip, this will be null. For editting an existing - * trip, this will the document id associated with the trip. - * - defaultFormObj: Object containing the placeholder/default values for the - * form input text boxes. - * - key: Special React attribute that ensures a new AddTripModal instance is - * created whenever this key is updated - * + * @property {Object} props These are the props for this component: + * @property {boolean} props.show Determines if the save trip modal should + * be displayed. + * @property {Function} props.handleClose Event handler responsible for closing + * the save trips modal. + * @property {?string} props.tripId For editting an existing trip, this will + * contain the document id associated with the trip. For adding a new trip, + * this will be null. + * @property {?TripData} props.tripData For editting an existing trip, this will + * contain the trip's current data. For adding a new trip, this will be null. * @extends React.Component */ class SaveTripModal extends React.Component { - /** @inheritdoc */ + /** @override */ constructor(props) { super(props); // Create Refs to reference form input elements - this.nameRef = React.createRef(); + this.titleRef = React.createRef(); this.descriptionRef = React.createRef(); this.destinationRef = React.createRef(); this.startDateRef = React.createRef(); this.endDateRef = React.createRef(); + // Determine whether or note SaveTripModal is an add or edit trip modal. this.isAddTripForm = this.props.tripId === null; + // Grab the accepted and pending collaborator uid arr contents if edit. + this.collaboratorUidArr = this.isAddTripForm ? null : + this.props.tripData[DB.TRIPS_ACCEPTED_COLLABS].concat( + this.props.tripData[DB.TRIPS_PENDING_COLLABS]); + + this.state = { + collaboratorsRefArr: this.getInitialCollaboratorsRefArr(), + collaboratorEmailArr: [] + } + } - // For edit trips, create the number of collaborator input box refs as one - // less than the number of collaborators specified in prop `defaultFormObj` - // (do not include current user in list). - // - // TODO(Issue #71): Give user option to remove themself as a collaborator - // from current trip. + /** + * For edit trips, create the number of collaborator input box refs as one + * less than the number of collaborators specified in prop `tripData` + * (do not include current user in list). + * + * TODO(Issue #71): Give user option to remove themself as a collaborator + * from current trip. + * + * @return {!Array} Array of refs attached to the + * emails inputted in the form. + */ + getInitialCollaboratorsRefArr = () => { const collaboratorsRefArr = []; if (this.isAddTripForm) { collaboratorsRefArr.push(React.createRef()); } else { - for (let i = 1; i < this.props.defaultFormObj.collaborators.length; i++) { + for (let i = 1; i < this.collaboratorUidArr.length; i++) { collaboratorsRefArr.push(React.createRef()) } } - this.state = { collaboratorsRefArr: collaboratorsRefArr } + return collaboratorsRefArr; } /** Adds a new Ref element to the state variable `collaboratorsRefArr`. */ @@ -74,9 +106,9 @@ class SaveTripModal extends React.Component { } /** - * Creates a new Trip document in firestore with data in `tripData`. + * Creates a new Trip document in firestore with the data in `tripData`. * - * @param {!Object} tripData Data the new trip document will contain. + * @param {!TripData} tripData Data object the new trip document will contain. */ addNewTrip(tripData) { db.collection(DB.COLLECTION_TRIPS) @@ -90,15 +122,20 @@ class SaveTripModal extends React.Component { } /** - * Updates an existing Trip document in firestore with data in `tripData`. + * Updates an existing Trip document with id `tripId` in firestore with the + * data in `tripData`. + * + * Note: The `merge` field of the `SetOptions` parameter to `set()` is set to + * true in order to prevent overwriting any other fields in a trip document + * such as the activities sub-collection, creation time, etc. * * @param {!string} tripId The document ID of the trip that is updated. - * @param {!Object} tripData Data the new trip document will contain. + * @param {!TripData} tripData Data object the new trip document will contain. */ updateExistingTrip(tripId, tripData) { db.collection(DB.COLLECTION_TRIPS) .doc(tripId) - .set(tripData) + .set(tripData, { merge: true }) .then(() => { console.log('Document written with ID: ', tripId); }) @@ -110,36 +147,33 @@ class SaveTripModal extends React.Component { /** * Formats/cleans the form data and saves the Trip document in firestore. */ - saveTrip() { - const tripData = formatTripData( - { - name: this.nameRef.current.value, - description: this.descriptionRef.current.value, - destination: this.destinationRef.current.value, - startDate: this.startDateRef.current.value, - endDate: this.endDateRef.current.value, - collaboratorEmails: - this.state.collaboratorsRefArr.map(ref => ref.current.value), - } - ); + saveTrip = async () => { + const rawTripData = { + [DB.TRIPS_TITLE]: this.titleRef.current.value, + [DB.TRIPS_DESCRIPTION]: this.descriptionRef.current.value, + [DB.TRIPS_DESTINATION]: this.destinationRef.current.value, + [DB.TRIPS_START_DATE]: this.startDateRef.current.value, + [DB.TRIPS_END_DATE]: this.endDateRef.current.value, + [DB.RAW_COLLAB_EMAILS]: + this.state.collaboratorsRefArr.map(ref => ref.current.value), + }; + const tripData = await TripUtils.formatTripData(rawTripData, + this.props.tripData); if (this.isAddTripForm) { this.addNewTrip(tripData); } else { this.updateExistingTrip(this.props.tripId, tripData); } - } /** * Handles submission of the form which includes: * - Creation of the trip. - * - Refreshing the trips container. * - Closing the modal. */ - handleSubmitForm = () => { - this.saveTrip(); - this.props.refreshTripsContainer(); + handleSubmitForm = async () => { + await this.saveTrip(); this.props.handleClose(); } @@ -153,8 +187,7 @@ class SaveTripModal extends React.Component { /** Returns the default form value for the trip field specified by `field`. * - * @param {!string} field A trip document field - * (the constants in `database.js`). + * @param {string} field A trip document field (the constants in `database.js`). * @return {?string} Default form value for edit trip modal or null for * add trip modals. */ @@ -162,7 +195,30 @@ class SaveTripModal extends React.Component { if (this.isAddTripForm) { return null; } - return this.props.defaultFormObj[field]; + switch(field) { + case DB.TRIPS_START_DATE: + return timestampToISOString(this.props.tripData[DB.TRIPS_START_DATE]); + case DB.TRIPS_END_DATE: + return timestampToISOString(this.props.tripData[DB.TRIPS_END_DATE]); + case DB.RAW_COLLAB_EMAILS: + return TripUtils.moveCurUserEmailToFront(this.state.collaboratorEmailArr); + default: + return this.props.tripData[field]; + } + } + + /** + * When the component mounts, set the state `collaboratorEmailArr` if + * the SaveTripModal is an edit trip modal. + * + * @override + */ + async componentDidMount() { + if (!this.isAddTripForm) { + let collaboratorEmailArr = + await authUtils.getUserEmailArrFromUserUidArr(this.collaboratorUidArr); + this.setState({ collaboratorEmailArr : collaboratorEmailArr }); + } } /** @inheritdoc */ @@ -176,19 +232,19 @@ class SaveTripModal extends React.Component { {createFormGroup( - 'tripNameGroup', // controlId - 'Trip Name', // formLabel - 'text', // inputType - this.nameRef, // ref - 'Enter Trip Name', // placeholder - this.getDefaultFormField(DB.TRIPS_NAME) // defaultVal + 'tripTitleGroup', // controlId + 'Trip Title', // formLabel + 'text', // inputType + this.titleRef, // ref + msgs.TRIPS_TITLE_PLACEHOLDER, // placeholder + this.getDefaultFormField(DB.TRIPS_TITLE) // defaultVal )} {createFormGroup( 'tripDescGroup', // controlId 'Trip Description', // formLabel 'text', // inputType this.descriptionRef, // ref - 'Enter Trip Description', // placeholder + msgs.TRIPS_DESCRIPTION_PLACEHOLDER, // placeholder this.getDefaultFormField(DB.TRIPS_DESCRIPTION) // defaultVal )} {createFormGroup( @@ -196,7 +252,7 @@ class SaveTripModal extends React.Component { 'Trip Destination', // formLabel 'text', // inputType this.destinationRef, // ref - 'Enter Trip Destination', // placeholder + msgs.TRIPS_DESTINATION_PLACEHOLDER, // placeholder this.getDefaultFormField(DB.TRIPS_DESTINATION) // defaultVal )} {createFormGroup( @@ -220,8 +276,8 @@ class SaveTripModal extends React.Component { 'Trip Collaborators', // formLabel 'emails', // inputType this.state.collaboratorsRefArr, // ref - 'person@email.xyz', // placeholder - this.getDefaultFormField(DB.TRIPS_COLLABORATORS) // defaultVal + msgs.TRIPS_COLLAB_EMAIL_PLACEHOLDER, // placeholder + this.getDefaultFormField(DB.RAW_COLLAB_EMAILS) // defaultVal )} - -
+ fetchCollaboratorEmails(); + // cleanup function that prevents `collaboratorEmailsStr` from being set. + return () => { componentStillMounted = false; }; + }, [collaboratorUidArr]); + + return ( + + +

{title}

+
+ + + + + + {getTripInfoRow(destination, 'map-marker-alt')} + {getTripInfoRow( + getDateRangeString(startDateTimestamp, endDateTimestamp), + 'calendar-alt') + } + {getTripInfoRow(description, 'book')} + {getTripInfoRow(collaboratorEmailsStr, 'user-friends')} + + + + + + + + + + + + + + + {!isActiveCollab + ? + : null + } + {props.tripView === TripView.PENDING + ? + : null + } + + + + +
); }; diff --git a/frontend/src/components/ViewTrips/trip.test.js b/frontend/src/components/ViewTrips/trip.test.js deleted file mode 100644 index ef687c80..00000000 --- a/frontend/src/components/ViewTrips/trip.test.js +++ /dev/null @@ -1,27 +0,0 @@ -import * as firebase from 'firebase/app'; -import 'firebase/firebase-firestore'; - -import { getDateRange } from './trip.js' - -test('getDateRange test', () => { - // Dates used for both test and expected date strings. - const startMonth = 12; - const startDay = 17; - const startYear = 1995; - const endMonth = 5; - const endDay = 24; - const endYear = 1996; - - // Note that the months in JS dates are 0 indexed rather than 1 indexed so - // they must be decremented by 1 in order for the month to be correct. - const testStartDate = firebase.firestore.Timestamp.fromDate( - new Date(startYear, startMonth - 1, startDay)); - const testEndDate = firebase.firestore.Timestamp.fromDate( - new Date(endYear, endMonth - 1, endDay)); - const testTripObj = {start_date: testStartDate, end_date: testEndDate}; - const testDateRange = getDateRange(testTripObj); - - const expectedDateRange = `${startMonth}/${startDay}/${startYear} - ` + - `${endMonth}/${endDay}/${endYear}`; - expect(testDateRange).toEqual(expectedDateRange); -}) diff --git a/frontend/src/components/ViewTrips/trips-container.js b/frontend/src/components/ViewTrips/trips-container.js index a5122702..959e4d57 100644 --- a/frontend/src/components/ViewTrips/trips-container.js +++ b/frontend/src/components/ViewTrips/trips-container.js @@ -1,110 +1,185 @@ import React from 'react'; import app from '../Firebase/'; +import Accordion from 'react-bootstrap/Accordion'; +import authUtils from '../AuthUtils'; import * as DB from '../../constants/database.js'; -import { getCurUserUid } from '../Utils/temp-auth-utils.js' import Trip from './trip.js'; - -const db = app.firestore(); +import { getCollaboratorField } from './trip-utils.js'; +import TripView from '../../constants/trip-view'; /** - * Returns a promise of a query object containg the array of Trip Documents - * corresponding to the trips that the current user is a collaborator on. - * - * @param {firebase.firestore.Firestore} db The Firestore database instance. - * @return {Promise} Promise object - * containing the query results with zero or more Trip documents. + * {@link TripView} defined originally in `constants/trip-view.js`. */ -function queryUserTrips(db) { - const curUserUid = getCurUserUid(); - return db.collection(DB.COLLECTION_TRIPS) - .where(DB.TRIPS_COLLABORATORS, 'array-contains', curUserUid) - .orderBy(DB.TRIPS_CREATION_TIME, 'desc') - .get(); -} -/** - * Grabs Trips query result from `queryUserTrips()` and returns an array of - * `` elements as defined in `trip.js`. - * - * @param {Promise} querySnapshot Promise - * object containing the query results with zero or more Trip documents. - * @param {EventHandler} handleEditTrip Displays the edit trip modal. - * @param {EventHandler} refreshTripsContainer Refreshed the TripsContainer - * component (Remove when fix Issue #62). - * @return {Promise>} Promise object containing an array - * of Trip React/HTML elements corresponding to the Trip documents included - * in `querySnapshot`. - */ -function serveTrips(querySnapshot, handleEditTrip, refreshTripsContainer) { - return new Promise(function(resolve) { - const tripsContainer = querySnapshot.docs.map(doc => - ( - ) - ); - resolve(tripsContainer); - }); -} +const db = app.firestore(); /** - * Returns a `
` element with the specified error message. + * Returns a `
` element with a predefined error message after logging the + * error message `error` obtained from `componentDidMount` catch statement. + * + * TODO(Issue #98): Turn this func into component and add to Errors directory. * * @param {string} error Error message in `componentDidMount` catch statement. - * @return {Promise} Promise object containing a `
` element - * with the error message `error` inside. + * @return {HTMLDivElement} `
` element containing the error message that + * the user will see on the view trips page. */ function getErrorElement(error) { - return new Promise(function(resolve) { - console.log(`Error in Trips Container: ${error}`); - resolve((

Error: Unable to load your trips.

)); - }); + console.log(`Error in Trips Container: ${error}`); + + return ( +
+

Oops, it looks like we were unable to load your trips. + Please wait a few minutes and try again. +

+
+ ); } /** * Component corresponding to the container containing a user's trips. * props * - * @param {Object} props These are the props for this component: - * - handleEditTrip: Handler that displays the edit trip modal. - * - refreshTripsContainer: Handler that refreshes the TripsContainer - * component upon trip creation (Remove when fix Issue #62). - * - key: Special React attribute that ensures a new TripsContainer instance is - * created whenever this key is updated (Remove when fix Issue #62). + * @property {Object} props These are the props for this component: + * @property {Function} props.handleEditTrip Event handler responsible for + * displaying the edit trip modal. + * @property {TripView} props.tripView The current user's trips page view. * @extends React.Component */ class TripsContainer extends React.Component { - /** @inheritdoc */ + /** + * - `tripsContainer` holds the current trips to be displayed on the + * view trips page. + * - `...Trips` holds the trips where the user is a collaborator of that + * type (e.g. accepted trips holds all trips where user uid is contained + * within the field `accepted_collaborator_uid_arr`) + * - `tripsArrsUpdated` determines whether or not `tripsContainer` should + * be updated in `componentDidUpdate` based on new trip data pulled from the + * listeners created in `componentDidMount` + * + * @override + */ constructor(props) { super(props); - this.state = {trips: []}; + this.state = { tripsContainer: [], + acceptedTrips: [], + pendingTrips: [], + rejectedTrips: [], + tripArrsUpdated: false }; } - /** @inheritdoc */ - async componentDidMount() { - try { - const querySnapshot = await queryUserTrips(db); - let tripsContainer = await serveTrips(querySnapshot, - this.props.handleEditTrip, - this.props.refreshTripsContainer); - this.setState({ trips: tripsContainer }); + + /** + * When the TripsContainer mounts, a listener is attached to the QuerySnapshot + * event that grabs all trip documents where the current user uid is contained + * in the collaborator uid array corresponding to `this.props.tripView`. + * This allows real-time updates for all collaborators on a trip whenever a + * trip is updated (add, edit, or delete). + * + * In the case where there is an error, an error component is returned in + * place of the array of trips. + * + * @override + */ + componentDidMount() { + const curUserUid = authUtils.getCurUserUid(); + const tripViewArr = [TripView.ACTIVE, TripView.PENDING, TripView.REJECTED]; + + for (let tripView of tripViewArr) { + const collaboratorField = getCollaboratorField(tripView); + const tripViewTripsState = tripView === TripView.ACTIVE ? 'acceptedTrips' : + tripView === TripView.PENDING ? 'pendingTrips' : + 'rejectedTrips'; + + db.collection(DB.COLLECTION_TRIPS) + .where(collaboratorField, 'array-contains', curUserUid) + .orderBy(DB.TRIPS_UPDATE_TIMESTAMP, 'desc') + .onSnapshot(querySnapshot => { + const tripDocsArr = querySnapshot.docs; + + this.setState({ [tripViewTripsState]: tripDocsArr, + tripArrsUpdated: true, + }); + }, (error) => { + const errorElement = getErrorElement(error); + this.setState({ tripsContainer: errorElement }); + }); } - catch (error) { - let errorElement = await getErrorElement(error); - this.setState({ trips: errorElement }); + } + + /** + * Returns an array of `Trip` components corresponding to the trip documents + * stored in `tripDocs`. + * + * @param {firebase.firestore.QuerySnapshot.QueryDocumentSnapshot[]} tripDocs + * The array of all the documents in one of the `QuerySnapShot`s from + * the listener in `componentDidMount.` + * @return {Array} Array of `Trip` components. + */ + getTripArr = (tripDocs) => { + return tripDocs.map((doc, idx) => + ( + ) + ); + } + + // Checks to make sure tripsContainer does not contain error element and + // that the tripView state has changed since last update. + /** + * Updates `tripContainer` state if the following conditions are met: + * - The trips query did not produce an error + * - The trip view (tab) changed OR one of the trip array states + * (e.g. acceptedTrips state) was updated from the listeners created in + * `componentDidMount`. + * + * @param {Object} prevProps The components props prior to the current update. + * @override + */ + componentDidUpdate(prevProps) { + const tripsQuerySuccessful = Array.isArray(this.state.tripsContainer); + let tripViewChanged = true; + if (prevProps !== undefined) { + tripViewChanged = prevProps.tripView !== this.props.tripView; + } + + if (tripsQuerySuccessful && (tripViewChanged || this.state.tripArrsUpdated)) { + switch(this.props.tripView) { + case TripView.ACTIVE: + this.setState({ tripsContainer: + this.getTripArr(this.state.acceptedTrips) }); + break; + case TripView.PENDING: + this.setState({ tripsContainer: + this.getTripArr(this.state.pendingTrips) }); + break; + case TripView.REJECTED: + this.setState({ tripsContainer: + this.getTripArr(this.state.rejectedTrips) }); + break; + default: + console.error(`Trip view of ${this.props.tripView} was unexpected. + Setting trips container to include accepted trips.`); + this.setState({ tripsContainer: this.state.acceptedTrips }); + } + + this.setState({ tripArrsUpdated: false }); } } - /** @inheritdoc */ + /** @override */ render() { return ( -
{this.state.trips}
+ + {this.state.tripsContainer} + ); } } diff --git a/frontend/src/components/ViewTrips/view-activities-button.js b/frontend/src/components/ViewTrips/view-activities-button.js index 505cc0b2..c9d48768 100644 --- a/frontend/src/components/ViewTrips/view-activities-button.js +++ b/frontend/src/components/ViewTrips/view-activities-button.js @@ -2,11 +2,18 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import Button from 'react-bootstrap/Button'; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { VIEW_ACTIVITIES } from '../../constants/routes.js'; /** - * Component used for the ViewTrips page to redirect to the ViewActivities page. + * Component that redirects the user from the ViewTrips page to the + * ViewActivities page corresponding to the trip the button belonged to. + * + * @property {Object} props These are the props for this component: + * @property {string} props.tripId The document id associated with the trip. + * @property {boolean} props.canModifyTrip Determines whether or not the button + * is disabled. */ const ViewActivitiesButton = (props) => { const history = useHistory(); @@ -16,8 +23,13 @@ const ViewActivitiesButton = (props) => { } return ( - ); } diff --git a/frontend/src/components/ViewTrips/view-activities-button.test.js b/frontend/src/components/ViewTrips/view-activities-button.test.js index 83fb2acb..0005cd06 100644 --- a/frontend/src/components/ViewTrips/view-activities-button.test.js +++ b/frontend/src/components/ViewTrips/view-activities-button.test.js @@ -1,5 +1,5 @@ import React from 'react'; -import { render, fireEvent } from '@testing-library/react'; +import { render, fireEvent, getByRole } from '@testing-library/react'; import ViewActivitiesButton from './view-activities-button.js'; import { VIEW_ACTIVITIES } from '../../constants/routes.js'; @@ -15,8 +15,9 @@ jest.mock('react-router-dom', () => ({ describe('SignInButton component', () => { test('Redirects to ViewActivities page on click', () => { const testTripId = 'abc123'; - const { getByText } = render(); - fireEvent.click(getByText('View Activities!')); + const { getByRole } = render(); + fireEvent.click(getByRole('button')); + expect(mockHistoryPush).toBeCalledWith(`${VIEW_ACTIVITIES}/${testTripId}`); }) }); diff --git a/frontend/src/constants/database.js b/frontend/src/constants/database.js index 05e507ad..70b630b3 100644 --- a/frontend/src/constants/database.js +++ b/frontend/src/constants/database.js @@ -2,13 +2,20 @@ * This file specifies the database collection and field names. */ export const COLLECTION_TRIPS = 'trips'; -export const TRIPS_NAME = 'name'; +export const TRIPS_TITLE = 'title'; export const TRIPS_DESCRIPTION = 'description'; export const TRIPS_DESTINATION = 'destination'; -export const TRIPS_COLLABORATORS = 'collaborators'; export const TRIPS_START_DATE = 'start_date'; export const TRIPS_END_DATE = 'end_date'; -export const TRIPS_CREATION_TIME = 'trip_creation_time'; +export const TRIPS_ACCEPTED_COLLABS = 'accepted_collaborator_uid_arr'; +export const TRIPS_PENDING_COLLABS = 'pending_collaborator_uid_arr'; +export const TRIPS_REJECTED_COLLABS = 'rejected_collaborator_uid_arr'; +export const TRIPS_UPDATE_TIMESTAMP = 'update_timestamp'; +/** + * NOTE: The following constant corresponds to the general collaborator field in + * {@link RawTripData} and is not an actual field in a trip document. + */ +export const RAW_COLLAB_EMAILS = 'collaboratorEmails'; export const COLLECTION_ACTIVITIES = 'activities'; export const ACTIVITIES_START_TIME = 'start_time'; @@ -19,3 +26,4 @@ export const ACTIVITIES_TITLE = 'title'; export const ACTIVITIES_DESCRIPTION = 'description'; export const ACTIVITIES_START_COUNTRY = 'start_country'; export const ACTIVITIES_END_COUNTRY = 'end_country'; +export const ACTIVITIES_FLIGHT = 'flight'; diff --git a/frontend/src/constants/messages.js b/frontend/src/constants/messages.js index 1470a94a..c935bb10 100644 --- a/frontend/src/constants/messages.js +++ b/frontend/src/constants/messages.js @@ -1,3 +1,10 @@ -// Default values for form fields. +// Default and placeholder values for form fields. export const ACTIVITY_TITLE_PLACEHOLDER = 'What will you be doing?'; export const ACTIVITY_DESCRIPTION_PLACEHOLDER = 'Add some details!'; + +export const TRIPS_TITLE_DEFAULT = 'Untitled Trip'; +export const TRIPS_DESTINATION_DEFAULT = 'No Destination'; +export const TRIPS_TITLE_PLACEHOLDER = 'Title your trip!'; +export const TRIPS_DESCRIPTION_PLACEHOLDER = 'Add some details!'; +export const TRIPS_DESTINATION_PLACEHOLDER = 'Where will you be going?'; +export const TRIPS_COLLAB_EMAIL_PLACEHOLDER = 'person@email.xyz'; diff --git a/frontend/src/constants/trip-view.js b/frontend/src/constants/trip-view.js new file mode 100644 index 00000000..469e1a75 --- /dev/null +++ b/frontend/src/constants/trip-view.js @@ -0,0 +1,14 @@ +/** + * Types of trip 'views' on the view trips page. Added for the trip invites feature. + * @enum {number} + */ +const TripView = { + /** Displays trips that current user has created or accepted. */ + ACTIVE: 0, + /** Displays trips that current user has not yet accepted or rejected. */ + PENDING: 1, + /** Displays trips that current user has rejected. */ + REJECTED: 2, +}; + +export default TripView; diff --git a/frontend/src/images/hero-image.jpg b/frontend/src/images/hero-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05df25687683dd6be56542fda1d6117487bad71c GIT binary patch literal 295318 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�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 VssK!^}sHlFvNqY#$82*93qVML5w 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, #root>div>* { + height: 100% +} + +/* Pages with the hero-image class spans the entire window. */ +.hero-image { + /* Linear gradient adds a slight dark tint to the image. */ + background-image: linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), + url('../images/hero-image.jpg'); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + height: 100%; +} diff --git a/frontend/src/styles/trips.css b/frontend/src/styles/trips.css new file mode 100644 index 00000000..906d8525 --- /dev/null +++ b/frontend/src/styles/trips.css @@ -0,0 +1,7 @@ +.fa-icon { + color: black; +} + +.trip-info-row { + margin-bottom: 0.75em; +}