From 77fec6500f9e68e6401ec1fa2252ce74f8e090bd Mon Sep 17 00:00:00 2001 From: le-gris Date: Fri, 8 Sep 2023 14:39:22 -0400 Subject: [PATCH 01/62] enforce lower case on github username --- scripts/generate_git_env.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/generate_git_env.sh b/scripts/generate_git_env.sh index 347bf18..3c9a7b2 100755 --- a/scripts/generate_git_env.sh +++ b/scripts/generate_git_env.sh @@ -22,7 +22,8 @@ then else OWNER=$(echo $GITURL | awk -F'/' '{print $4}'); fi -echo "VITE_GIT_OWNER = ${OWNER}" >> $ENV_FILE +OWNER=$(echo $OWNER | tr '[:upper:]' '[:lower:]') +echo "VITE_GIT_OWNER = ${OWNER}" >> $ENV_FILE BRANCH=$(git rev-parse --abbrev-ref HEAD | tr '[:upper:]' '[:lower:]') echo "VITE_GIT_BRANCH_NAME = $BRANCH" >> $ENV_FILE From 4d7ec1c819dfb3042c7dcb60f9eca27a0dcc4fdf Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Wed, 15 Nov 2023 18:56:45 -0500 Subject: [PATCH 02/62] fixing failing test the button was named ambiguously and the test was clicking the wrong one --- src/components/pages/AdvertisementPage.vue | 2 +- tests/vitest/router.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/pages/AdvertisementPage.vue b/src/components/pages/AdvertisementPage.vue index 70fb613..148f8ed 100644 --- a/src/components/pages/AdvertisementPage.vue +++ b/src/components/pages/AdvertisementPage.vue @@ -32,7 +32,7 @@ function finish(goto) { Take part in a short experiment where you play a game for money.


- + diff --git a/tests/vitest/router.test.js b/tests/vitest/router.test.js index be170c4..b4eee8d 100644 --- a/tests/vitest/router.test.js +++ b/tests/vitest/router.test.js @@ -169,7 +169,7 @@ describe('Generic router tests', () => { await router.isReady() expect(wrapper.html()).toContain('Please help us') expect(smilestore.local.lastRoute).toBe('welcome_anonymous') - await wrapper.find('#finish').trigger('click') + await wrapper.find('#begintask').trigger('click') await new Promise((r) => setTimeout(r, 10)) // wait a bit for the page to update and render after the click expect(wrapper.html()).toContain('Please take the time to read') expect(smilestore.local.lastRoute).toBe('consent') // check that smilestore was updated From 3006dac4299b3a145ed4b6307d5dd45836cc1451 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Wed, 15 Nov 2023 18:58:18 -0500 Subject: [PATCH 03/62] fixing failing test if you expect there to be no local storage it has to be explicit reset because it surives across tests --- tests/vitest/router.test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/vitest/router.test.js b/tests/vitest/router.test.js index b4eee8d..8214646 100644 --- a/tests/vitest/router.test.js +++ b/tests/vitest/router.test.js @@ -79,6 +79,7 @@ describe('Generic router tests', () => { // the getLocalStorage() returns null if there is not // local storage set yet. it('there should be no smilestore before the app created', () => { + resetLocalStorage() expect(getLocalStorage()).toBe(null) }) From 6c632d46d4dc5f7911b87abba20156c088a274df Mon Sep 17 00:00:00 2001 From: Guy Davidson Date: Wed, 15 Nov 2023 19:14:44 -0500 Subject: [PATCH 04/62] Added documentation for some timeline options and fixed a router bug --- docs/timeline.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ src/router.js | 4 +- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/docs/timeline.md b/docs/timeline.md index b1d1487..d9ffdaa 100644 --- a/docs/timeline.md +++ b/docs/timeline.md @@ -57,6 +57,24 @@ words separate by slashes appearing before the `#` (or if there are no `#`s) are In key steps in the experiment are indexed by routes that map to [page-level components](/components). So `/consent` might load the consent page form and `/debrief` would load the debriefing page form. This is good organization but also helpful for debugging since you can easily jump to different sections of the task. +### The route object + +Each route is specified by a javascript object, which usually contains at the following fields: +```js +{ + path: '/my_name', + name: 'my_name', + component: MyComponent, + meta: { ... }, // optional +} +``` +The `path` specifies the client-side route, as described above. The `name` offers another way to specify the route for navigation, which can be easier than using the path (see details in the `vue-router` [documentation](https://router.vuejs.org/guide/essentials/named-routes.html)). The `component` field specifies the component that should be loaded when the route is requested. + +The `meta` field specifies additional optional information about the route: +* It can be used to specify different previous and next routes, in case the experiment timeline flow branches (see [Branching and randomized flows](#branching-and-randomized-flows) for more details). +* It can be used to specify randomized sub-timelines (see [Randomized flows and complex branching](#randomized-flows-and-complex-branching) for more details). +* It can also be used to allow directly navigating to particular routes, which can allow for conditional navigation specifies in code, by setting `allowDirectEntry: true` in the `meta`. + ## Timeline As just described, the Vue Router is a mapping between different URLs and Vue components to load. However, in experiments, we often want to step through content sequentially. For this purpose, Smile implements a simple Timeline class (see `src/timeline.js`) which acts as a wrapper around the basic Vue Router. @@ -325,6 +343,85 @@ Details about the implementation of the `useTimelineStepper` are quite simple an One important feature of the stepper is that it calls `saveData()` on the global store prior to route changes. So as a result you can trust that your data will be saved/synchronized with the persistent store (Firestore) whenever you navigated between sequential routes. See the data storage docs on [automatic saving](/datastorage.html#automatic-saving). This only works if you use the TimelineStepper to advance between pages/routes. If you call this manually you need to save manually as well using the `saveData()` method. ::: +### Custom navigation logic + +In some cases, you might want to navigate to something other than `next()` or `prev()` as returned by the timeline stepper. One common use case is in an instruction understanding quiz module, where you might want to navigate back to an instructions page if the participant fails the quiz, and only navigate forward if the participant succeeds. Your timeline setup code (in `router.js`) might look like this (note the `meta: {allowDirectEntry: true}` on the instructions route, to allow to return to it from any place in the timeline): + +```js +import { Timeline } from '@/timeline' // @ resolves to /src in Smile +const timeline = new Timeline() + +timeline.pushSeqRoute({ + path: '/', + name: 'welcome', + component: WelcomeComponent +}) + +// Consent form, etc., ... + +timeline.pushSeqRoute({ + path: '/instructions', + name: 'instructions', + component: InstructionsComponent, + meta: {allowDirectEntry: true} // allow direct navigation to this route +}) + +// ... + +timeline.pushSeqRoute({ + path: '/quiz', + name: 'quiz', + component: QuizComponent +}) + +// ... + +timeline.pushSeqRoute({ + path: '/thanks', + name: 'thanks', + component: ThanksComponent +}) +``` +Your quiz module then might implement something like the following: +```vue + + + +``` + +Note that if your instructions component immediately preceded the quiz, it would be sufficient to call `finish(prev())` to return to the instructions page. However, if there are other routes between the instructions and the quiz, you would need to use `finish({name: 'instructions'})` to navigate back to the instructions page. ## Running custom code before route loading diff --git a/src/router.js b/src/router.js index b3ca2eb..a7a1de8 100644 --- a/src/router.js +++ b/src/router.js @@ -219,14 +219,14 @@ function addGuards(r) { return true } // if you're trying to go to the next route, allow it - if (from.meta.next === to.name) { + if (from.meta !== undefined && from.meta.next === to.name) { smilestore.setLastRoute(to.name) smilestore.recordRoute(to.name) return true } // if the next route is a subtimeline and you're trying to go to a subtimeline route, allow it // this is necessary because from.meta.next won't immediately get the subroute as next when the subtimeline is randomized - if (from.meta.next.type === 'randomized_sub_timeline' && to.meta.subroute) { + if (from.meta !== undefined && from.meta.next !== undefined && from.meta.next.type === 'randomized_sub_timeline' && to.meta.subroute) { smilestore.setLastRoute(to.name) smilestore.recordRoute(to.name) return true From 98f65239076055e6a632e36f5d2b679ea785c393 Mon Sep 17 00:00:00 2001 From: Guy Davidson Date: Thu, 16 Nov 2023 11:13:20 -0500 Subject: [PATCH 05/62] Made a change for the configuration page --- src/components/pages/ConfigPage.vue | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/pages/ConfigPage.vue b/src/components/pages/ConfigPage.vue index 67ddd16..8f23c54 100644 --- a/src/components/pages/ConfigPage.vue +++ b/src/components/pages/ConfigPage.vue @@ -117,25 +117,30 @@ function resetLocalState() { - -
Data
  • - {{ key }}: + + {{key}}: + + + {{key}}: +
      +
    • + {{key2}}: +
    • +
    +


- - - From eed8cb992edbc9c68509a68ea6da34cdb86baa16 Mon Sep 17 00:00:00 2001 From: emilyliquin Date: Thu, 16 Nov 2023 17:33:16 -0500 Subject: [PATCH 06/62] add type property to all routes in timeline --- src/timeline.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/timeline.js b/src/timeline.js index cb5824f..c70eedb 100644 --- a/src/timeline.js +++ b/src/timeline.js @@ -54,6 +54,7 @@ class Timeline { newroute.meta.prev = undefined } } + newroute.meta.type = "route" newroute.meta.sequential = true try { @@ -75,7 +76,7 @@ class Timeline { const newroute = _.cloneDeep(routeConfig) // should NOT allow meta next/prev to exist if (!newroute.meta) { - newroute.meta = { prev: null, next: null } + newroute.meta = { prev: null, next: null, type: "route" } } else if (newroute.meta.prev || newroute.meta.next) { throw new Error( `NonSequentialRouteError: Can't have meta.next or meta.prev defined for non-sequential route` From 722d8a3441c990ea44b576f98bdb5c702479d7dd Mon Sep 17 00:00:00 2001 From: emilyliquin Date: Thu, 16 Nov 2023 17:33:38 -0500 Subject: [PATCH 07/62] don't re-print config stuff twice on config route --- src/components/pages/ConfigPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/ConfigPage.vue b/src/components/pages/ConfigPage.vue index 8f23c54..1adb9e3 100644 --- a/src/components/pages/ConfigPage.vue +++ b/src/components/pages/ConfigPage.vue @@ -127,7 +127,7 @@ function resetLocalState() { {{key}}: - + {{key}}:
  • From ba3a1f4ffd3de63992fe1def4cca4a6b9a4b156a Mon Sep 17 00:00:00 2001 From: emilyliquin Date: Thu, 16 Nov 2023 17:44:22 -0500 Subject: [PATCH 08/62] does it still break things to use apostrophes in commit messages --- src/components/pages/ConfigPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/ConfigPage.vue b/src/components/pages/ConfigPage.vue index 1adb9e3..294de4e 100644 --- a/src/components/pages/ConfigPage.vue +++ b/src/components/pages/ConfigPage.vue @@ -120,7 +120,7 @@ function resetLocalState() {
-
Data
+
Data
  • From 06b64e7a8ebf48381d8c19eb9b4c74cd14647324 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Mon, 20 Nov 2023 14:52:53 -0500 Subject: [PATCH 09/62] adding a warning when navigating to a route that happened because of dev mode differences (Issue #87) --- src/router.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/router.js b/src/router.js index a7a1de8..fea6ae1 100644 --- a/src/router.js +++ b/src/router.js @@ -214,6 +214,13 @@ function addGuards(r) { from.name === undefined && !smilestore.isKnownUser) ) { + if (smilestore.config.mode === 'development') { + console.warn( + 'WARNING: allowing direct navigation to', + to.name, + '. This is allowed in development mode but not in production.' + ) + } smilestore.setLastRoute(to.name) smilestore.recordRoute(to.name) return true From 373257e612cb78a5d1613be5b5d40ea7ef01b671 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Mon, 20 Nov 2023 14:53:06 -0500 Subject: [PATCH 10/62] prettier autoformatting --- src/router.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/router.js b/src/router.js index fea6ae1..247b34a 100644 --- a/src/router.js +++ b/src/router.js @@ -1,5 +1,5 @@ // import { ref } from 'vue' -import '@/seed' +import '@/seed' import useSmileStore from '@/stores/smiledata' // get access to the global store import seedrandom from 'seedrandom' import { createRouter, createWebHashHistory } from 'vue-router' @@ -7,8 +7,7 @@ import appconfig from '@/config' import { processQuery } from '@/utils' import Timeline from '@/timeline' import RandomSubTimeline from '@/subtimeline' -import { v4 as uuidv4 } from 'uuid'; - +import { v4 as uuidv4 } from 'uuid' // 1. Import route components import RecruitmentChooser from '@/components/pages/RecruitmentChooserPage.vue' @@ -36,7 +35,6 @@ import WindowSizer from '@/components/pages/WindowSizerPage.vue' // to the end of this list const timeline = new Timeline() - // add the recruitment chooser if in development mode if (appconfig.mode === 'development') { timeline.pushRoute({ @@ -146,7 +144,6 @@ timeline.pushRandomizedTimeline({ // meta: { label: "taskOrder", orders: {AFirst: ["task1", "task2"], BFirst: ["task2", "task1"]} } }) - // debriefing form timeline.pushSeqRoute({ path: '/debrief', @@ -233,7 +230,12 @@ function addGuards(r) { } // if the next route is a subtimeline and you're trying to go to a subtimeline route, allow it // this is necessary because from.meta.next won't immediately get the subroute as next when the subtimeline is randomized - if (from.meta !== undefined && from.meta.next !== undefined && from.meta.next.type === 'randomized_sub_timeline' && to.meta.subroute) { + if ( + from.meta !== undefined && + from.meta.next !== undefined && + from.meta.next.type === 'randomized_sub_timeline' && + to.meta.subroute + ) { smilestore.setLastRoute(to.name) smilestore.recordRoute(to.name) return true @@ -273,15 +275,16 @@ export const router = createRouter({ addGuards(router) // add the guards defined above // add additional guard to set global seed before -router.beforeResolve(to => { +router.beforeResolve((to) => { const smilestore = useSmileStore() - if(smilestore.local.seedActive){ + if (smilestore.local.seedActive) { const seedID = smilestore.getSeedID const seed = `${seedID}-${to.name}` - seedrandom(seed, { global: true }); - } else{ // if inactive, generate a random string then re-seed - const newseed = uuidv4(); - seedrandom(newseed, { global: true }); + seedrandom(seed, { global: true }) + } else { + // if inactive, generate a random string then re-seed + const newseed = uuidv4() + seedrandom(newseed, { global: true }) } }) From 7ebde16d905d1c2218683b2785a7784486005e04 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Mon, 20 Nov 2023 15:04:01 -0500 Subject: [PATCH 11/62] better prettier settings --- .prettierrc | 3 ++- src/router.js | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.prettierrc b/.prettierrc index 36301bc..6aca66f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,6 @@ { "semi": false, "singleQuote": true, - "trailingComma": "es5" + "trailingComma": "es5", + "printWidth": 120 } diff --git a/src/router.js b/src/router.js index 247b34a..58f7cfb 100644 --- a/src/router.js +++ b/src/router.js @@ -48,7 +48,9 @@ if (appconfig.mode === 'development') { timeline.pushRoute({ path: '/', name: 'landing', - redirect: { name: 'welcome_anonymous' }, + redirect: { + name: 'welcome_anonymous', + }, meta: { allowDirectEntry: true }, }) } @@ -66,7 +68,10 @@ timeline.pushSeqRoute({ path: '/welcome/:service', name: 'welcome_referred', component: Advertisement, - meta: { next: 'consent', allowDirectEntry: true }, // override what is next + meta: { + next: 'consent', + allowDirectEntry: true, + }, // override what is next beforeEnter: (to) => { processQuery(to.query, to.params.service) }, @@ -189,7 +194,10 @@ timeline.pushRoute({ function addGuards(r) { r.beforeEach((to, from) => { // Set queries to be combination of from queries and to queries (TO overwrites FROM if there is one with the same key) - const newQueries = { ...from.query, ...to.query } + const newQueries = { + ...from.query, + ...to.query, + } to.query = newQueries // console.log('loading', to.name) @@ -205,11 +213,8 @@ function addGuards(r) { // if you're going to an always-allowed route or if you're in jumping mode, allow the new route if ( to.meta.allowDirectEntry || - (smilestore.config.mode === 'development' && - smilestore.local.allowJumps) || - (to.name === 'welcome_anonymous' && - from.name === undefined && - !smilestore.isKnownUser) + (smilestore.config.mode === 'development' && smilestore.local.allowJumps) || + (to.name === 'welcome_anonymous' && from.name === undefined && !smilestore.isKnownUser) ) { if (smilestore.config.mode === 'development') { console.warn( @@ -246,14 +251,23 @@ function addGuards(r) { } // if you're a known user (and not trying to go to the next or same route), send back to most recent route if (smilestore.isKnownUser) { - return { name: smilestore.lastRoute, replace: true } + return { + name: smilestore.lastRoute, + replace: true, + } } if (!smilestore.isKnownUser && to.name === 'landing') { - return { name: 'welcome_anonymous', replace: true } + return { + name: 'welcome_anonymous', + replace: true, + } } if (to.name !== 'welcome_anonymous') { // otherwise (for an unknown user who's not trying to go to next/same route), just send to welcome anonymous screen - return { name: 'welcome_anonymous', replace: true } + return { + name: 'welcome_anonymous', + replace: true, + } } return true // is this right? why is the default to allow the navigation? }) @@ -284,7 +298,9 @@ router.beforeResolve((to) => { } else { // if inactive, generate a random string then re-seed const newseed = uuidv4() - seedrandom(newseed, { global: true }) + seedrandom(newseed, { + global: true, + }) } }) From d55dde4af344cc4e9c2046f50cfadb3b88a0feec Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Mon, 20 Nov 2023 15:09:31 -0500 Subject: [PATCH 12/62] prettier update --- docs/.vitepress/theme/DarkModeImage.vue | 7 +- docs/.vitepress/theme/GureckisLabText.vue | 14 +- docs/.vitepress/theme/SmileText.vue | 4 +- docs/.vitepress/theme/index.js | 16 +- scripts/download_data.mjs | 12 +- scripts/vite-plugin-html-env.js | 24 +- src/App.vue | 42 +- .../atoms/CaptchaInstructionsText.vue | 53 +- src/components/atoms/DebriefText.vue | 22 +- .../molecules/InformedConsentModal.vue | 28 +- src/components/molecules/ProgressBar.vue | 23 +- src/components/molecules/ReportIssueModal.vue | 29 +- .../molecules/WithdrawFormModal.vue | 125 +-- .../CaptchaTrialImageCategorization.vue | 46 +- .../organisms/CaptchaTrialMotorControl.vue | 46 +- .../organisms/CaptchaTrialStroop.vue | 46 +- .../CaptchaTrialTextComprehension.vue | 46 +- src/components/organisms/DeveloperNavBar.vue | 306 +++---- .../organisms/PresentationNavBar.vue | 5 +- src/components/organisms/StatusBar.vue | 153 ++-- src/components/pages/AdvertisementPage.vue | 33 +- src/components/pages/CaptchaPage.vue | 50 +- src/components/pages/DebriefPage.vue | 21 +- .../pages/DemographicSurveyPage.vue | 786 ++++++++++++------ src/components/pages/ExpPage.vue | 20 +- src/components/pages/InstructionsPage.vue | 42 +- src/components/pages/MTurkRecruitPage.vue | 106 ++- src/components/pages/Task1Page.vue | 21 +- src/components/pages/Task2Page.vue | 21 +- src/components/pages/WindowSizerPage.vue | 176 ++-- src/components/pages/WithdrawPage.vue | 109 ++- src/composables/timelinestepper.js | 10 +- src/config.js | 11 +- src/createpinia.js | 2 +- src/main.js | 4 +- src/randomization.js | 67 +- src/seed.js | 48 +- src/stores/firestore-db.js | 98 +-- src/stores/smiledata.js | 58 +- src/subtimeline.js | 72 +- src/timeline.js | 40 +- src/utils.js | 21 +- tests/cypress/e2e/mturk.cy.js | 30 + tests/cypress/e2e/prolific.cy.js | 6 +- tests/cypress/e2e/smoke_spec.cy.js | 4 +- tests/cypress/support/e2e.js | 2 +- tests/vitest/randomization.test.js | 72 +- tests/vitest/seed.test.js | 55 +- tests/vitest/subtimeline.test.js | 101 +-- tests/vitest/timeline.test.js | 14 +- vite.config.js | 5 +- 51 files changed, 1677 insertions(+), 1475 deletions(-) create mode 100644 tests/cypress/e2e/mturk.cy.js diff --git a/docs/.vitepress/theme/DarkModeImage.vue b/docs/.vitepress/theme/DarkModeImage.vue index 21f0fb5..48cd283 100644 --- a/docs/.vitepress/theme/DarkModeImage.vue +++ b/docs/.vitepress/theme/DarkModeImage.vue @@ -1,9 +1,8 @@ - \ No newline at end of file + diff --git a/docs/.vitepress/theme/GureckisLabText.vue b/docs/.vitepress/theme/GureckisLabText.vue index eb13d27..f946781 100644 --- a/docs/.vitepress/theme/GureckisLabText.vue +++ b/docs/.vitepress/theme/GureckisLabText.vue @@ -1,13 +1,13 @@ \ No newline at end of file + diff --git a/docs/.vitepress/theme/SmileText.vue b/docs/.vitepress/theme/SmileText.vue index aabdd05..1e41789 100644 --- a/docs/.vitepress/theme/SmileText.vue +++ b/docs/.vitepress/theme/SmileText.vue @@ -1,3 +1,3 @@ \ No newline at end of file + 🫠 Smile + diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js index 64bfea2..db972a2 100644 --- a/docs/.vitepress/theme/index.js +++ b/docs/.vitepress/theme/index.js @@ -1,13 +1,13 @@ -import DefaultTheme from 'vitepress/theme'; -import DarkModeImage from './DarkModeImage.vue'; -import GureckisLabText from './GureckisLabText.vue'; -import SmileText from './SmileText.vue'; +import DefaultTheme from 'vitepress/theme' +import DarkModeImage from './DarkModeImage.vue' +import GureckisLabText from './GureckisLabText.vue' +import SmileText from './SmileText.vue' export default { ...DefaultTheme, enhanceApp({ app }) { - app.component('DarkModeImage', DarkModeImage); - app.component('GureckisLabText', GureckisLabText); - app.component('SmileText', SmileText); + app.component('DarkModeImage', DarkModeImage) + app.component('GureckisLabText', GureckisLabText) + app.component('SmileText', SmileText) }, -}; +} diff --git a/scripts/download_data.mjs b/scripts/download_data.mjs index 3e2866d..aa4b13f 100755 --- a/scripts/download_data.mjs +++ b/scripts/download_data.mjs @@ -6,13 +6,7 @@ import chalk from 'chalk' import figlet from 'figlet' // import shell from 'shelljs' import { initializeApp } from 'firebase/app' -import { - getFirestore, - collection, - getDocs, - query, - where, -} from 'firebase/firestore' +import { getFirestore, collection, getDocs, query, where } from 'firebase/firestore' import * as dotenv from 'dotenv' import * as fs from 'fs' // import appconfig from '../src/config' @@ -91,9 +85,7 @@ const getData = async (path, completeOnly, filename) => { } const success = (filename) => { - console.log( - chalk.green(`your data has been exported to 'data/${filename}.json'.`) - ) + console.log(chalk.green(`your data has been exported to 'data/${filename}.json'.`)) } const run = async () => { diff --git a/scripts/vite-plugin-html-env.js b/scripts/vite-plugin-html-env.js index 5e75d00..e849114 100644 --- a/scripts/vite-plugin-html-env.js +++ b/scripts/vite-plugin-html-env.js @@ -3,11 +3,7 @@ const path = require('path') const fs = require('fs') const _omit = (obj = {}, uselessKeys = []) => - Object.keys(obj || {}).reduce( - (cur, key) => - uselessKeys.includes(key) ? cur : { ...cur, [key]: obj[key] }, - {} - ) + Object.keys(obj || {}).reduce((cur, key) => (uselessKeys.includes(key) ? cur : { ...cur, [key]: obj[key] }), {}) const _pick = (obj, defaultConfig = {}) => Object.keys(obj).length @@ -49,12 +45,8 @@ const _loadEnv = (envPath = '.env') => { const _getModeEnvPath = () => { const argvList = process.argv.slice(2) - const modeIndex = argvList.findIndex( - (arg) => arg === '-m' || arg === '--mode' - ) - const modeFuzzyIndex = argvList.findIndex( - (arg) => arg.indexOf('-m') > -1 || arg.indexOf('--mode') > -1 - ) + const modeIndex = argvList.findIndex((arg) => arg === '-m' || arg === '--mode') + const modeFuzzyIndex = argvList.findIndex((arg) => arg.indexOf('-m') > -1 || arg.indexOf('--mode') > -1) if ( modeIndex !== -1 && @@ -63,8 +55,7 @@ const _getModeEnvPath = () => { ) return `.env.${argvList[modeIndex + 1]}` - if (modeFuzzyIndex !== -1 && !!argvList[modeFuzzyIndex]) - return `.env.${argvList[modeFuzzyIndex].split('=')[1]}` + if (modeFuzzyIndex !== -1 && !!argvList[modeFuzzyIndex]) return `.env.${argvList[modeFuzzyIndex].split('=')[1]}` } const modeEnvPath = _getModeEnvPath() @@ -89,12 +80,7 @@ function vitePluginHtmlEnv(config) { let ctxEnvConfig = {} // Use the loadEnv method provided by vite, because the code checks that it is a dev environment if (ctx.server) { - ctxEnvConfig = - loadEnv( - ctx.server.config.mode, - process.cwd(), - envPrefixes || 'VITE_' - ) || {} + ctxEnvConfig = loadEnv(ctx.server.config.mode, process.cwd(), envPrefixes || 'VITE_') || {} } else { Object.assign(ctxEnvConfig, envConfig) } diff --git a/src/App.vue b/src/App.vue index 1ea5063..517a4ce 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,22 +2,21 @@ import { useRouter, useRoute } from 'vue-router' import useSmileStore from '@/stores/smiledata' // load sub-components used in this compomnents -import DeveloperNavBar from '@/components/organisms/DeveloperNavBar.vue'; -import StatusBar from '@/components/organisms/StatusBar.vue'; -import { onMounted, watch, ref } from 'vue'; -import PresenationNavBar from '@/components/organisms/PresentationNavBar.vue'; -import ProgressBar from './components/molecules/ProgressBar.vue'; +import DeveloperNavBar from '@/components/organisms/DeveloperNavBar.vue' +import StatusBar from '@/components/organisms/StatusBar.vue' +import { onMounted, watch, ref } from 'vue' +import PresenationNavBar from '@/components/organisms/PresentationNavBar.vue' +import ProgressBar from './components/molecules/ProgressBar.vue' // imports the global config object const router = useRouter() const route = useRoute() const smilestore = useSmileStore() - // monitor events on the main window onMounted(() => { - window.addEventListener('resize', (event) => { - smilestore.recordWindowEvent('resize', {width: window.innerWidth, height: window.innerHeight}) + window.addEventListener('resize', (event) => { + smilestore.recordWindowEvent('resize', { width: window.innerWidth, height: window.innerHeight }) }) window.addEventListener('focus', (event) => { @@ -28,29 +27,34 @@ onMounted(() => { smilestore.recordWindowEvent('blur') }) - smilestore.getBrowserFingerprint(); + smilestore.getBrowserFingerprint() }) - \ No newline at end of file + diff --git a/src/components/atoms/DebriefText.vue b/src/components/atoms/DebriefText.vue index 529310c..e72eb52 100644 --- a/src/components/atoms/DebriefText.vue +++ b/src/components/atoms/DebriefText.vue @@ -1,19 +1,15 @@ \ No newline at end of file + diff --git a/src/components/molecules/InformedConsentModal.vue b/src/components/molecules/InformedConsentModal.vue index 303f079..e5dcbc9 100644 --- a/src/components/molecules/InformedConsentModal.vue +++ b/src/components/molecules/InformedConsentModal.vue @@ -2,17 +2,19 @@ import InformedConsentText from '@/components/atoms/InformedConsentText.vue' - \ No newline at end of file +
    +
    +

    Informed Consent

    +
    +
    + + +
    + +
    +
    +
    + diff --git a/src/components/molecules/ProgressBar.vue b/src/components/molecules/ProgressBar.vue index 8be0346..a4ddc1f 100644 --- a/src/components/molecules/ProgressBar.vue +++ b/src/components/molecules/ProgressBar.vue @@ -7,22 +7,19 @@ const smilestore = useSmileStore() // get the global store const route = useRoute() - - \ No newline at end of file + diff --git a/src/components/molecules/ReportIssueModal.vue b/src/components/molecules/ReportIssueModal.vue index c7c82af..bf8718f 100644 --- a/src/components/molecules/ReportIssueModal.vue +++ b/src/components/molecules/ReportIssueModal.vue @@ -1,16 +1,17 @@ - + \ No newline at end of file +
    +
    +

    Report Issue

    +
    +
    + Report issue form goes here. +
    + +
    +
    +
    + diff --git a/src/components/molecules/WithdrawFormModal.vue b/src/components/molecules/WithdrawFormModal.vue index bad38a7..70ce4fa 100644 --- a/src/components/molecules/WithdrawFormModal.vue +++ b/src/components/molecules/WithdrawFormModal.vue @@ -1,28 +1,26 @@ - diff --git a/src/components/organisms/CaptchaTrialImageCategorization.vue b/src/components/organisms/CaptchaTrialImageCategorization.vue index 79f41a9..4a03732 100644 --- a/src/components/organisms/CaptchaTrialImageCategorization.vue +++ b/src/components/organisms/CaptchaTrialImageCategorization.vue @@ -1,25 +1,23 @@ - - - - \ No newline at end of file +const emit = defineEmits(['nextPageCaptcha']) + + + + + diff --git a/src/components/organisms/CaptchaTrialMotorControl.vue b/src/components/organisms/CaptchaTrialMotorControl.vue index a4259e4..91d4bc5 100644 --- a/src/components/organisms/CaptchaTrialMotorControl.vue +++ b/src/components/organisms/CaptchaTrialMotorControl.vue @@ -1,25 +1,23 @@ - - - - \ No newline at end of file +const emit = defineEmits(['nextPageCaptcha']) + + + + + diff --git a/src/components/organisms/CaptchaTrialStroop.vue b/src/components/organisms/CaptchaTrialStroop.vue index 39976e9..6607665 100644 --- a/src/components/organisms/CaptchaTrialStroop.vue +++ b/src/components/organisms/CaptchaTrialStroop.vue @@ -1,25 +1,23 @@ - - - - \ No newline at end of file +const emit = defineEmits(['nextPageCaptcha']) + + + + + diff --git a/src/components/organisms/CaptchaTrialTextComprehension.vue b/src/components/organisms/CaptchaTrialTextComprehension.vue index a854b0b..52a3cce 100644 --- a/src/components/organisms/CaptchaTrialTextComprehension.vue +++ b/src/components/organisms/CaptchaTrialTextComprehension.vue @@ -1,25 +1,23 @@ - - - - \ No newline at end of file +const emit = defineEmits(['nextPageCaptcha']) + + + + + diff --git a/src/components/organisms/DeveloperNavBar.vue b/src/components/organisms/DeveloperNavBar.vue index 356d890..f10699e 100644 --- a/src/components/organisms/DeveloperNavBar.vue +++ b/src/components/organisms/DeveloperNavBar.vue @@ -1,15 +1,15 @@ @@ -217,8 +229,8 @@ a { } .dropdown-content { border-radius: 0; - padding-top:0; - padding-bottom:0; + padding-top: 0; + padding-bottom: 0; color: #000; } .routelink { @@ -267,7 +279,7 @@ a:hover { padding-left: 10px; } -.dropdown-menu{ - min-width:80px +.dropdown-menu { + min-width: 80px; } - \ No newline at end of file + diff --git a/src/components/organisms/PresentationNavBar.vue b/src/components/organisms/PresentationNavBar.vue index cde8542..63d8e58 100644 --- a/src/components/organisms/PresentationNavBar.vue +++ b/src/components/organisms/PresentationNavBar.vue @@ -46,10 +46,7 @@ function resetLocalState() {
    PRESENTATION MODE
    --   Reset: - +
    diff --git a/src/components/organisms/StatusBar.vue b/src/components/organisms/StatusBar.vue index 3621615..8dd40e3 100644 --- a/src/components/organisms/StatusBar.vue +++ b/src/components/organisms/StatusBar.vue @@ -1,7 +1,6 @@ - \ No newline at end of file + diff --git a/src/components/pages/AdvertisementPage.vue b/src/components/pages/AdvertisementPage.vue index 148f8ed..fd35650 100644 --- a/src/components/pages/AdvertisementPage.vue +++ b/src/components/pages/AdvertisementPage.vue @@ -14,28 +14,25 @@ smilestore.global.page_text_color = '#000' smilestore.global.status_bar_bg_color = '#fff' smilestore.global.status_bar_text_color = '#000' -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } - - \ No newline at end of file + diff --git a/src/components/pages/CaptchaPage.vue b/src/components/pages/CaptchaPage.vue index f010792..f5a9d7c 100644 --- a/src/components/pages/CaptchaPage.vue +++ b/src/components/pages/CaptchaPage.vue @@ -16,18 +16,20 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } -const pages = [CaptchaInstructionsText, - CaptchaTrialImageCategorization, - CaptchaTrialMotorControl, - CaptchaTrialTextComprehension, - CaptchaTrialStroop] +const pages = [ + CaptchaInstructionsText, + CaptchaTrialImageCategorization, + CaptchaTrialMotorControl, + CaptchaTrialTextComprehension, + CaptchaTrialStroop, +] const page_indx = ref(smilestore.getPage) const currentTab = shallowRef(pages[page_indx.value]) // captcha steps @@ -41,28 +43,24 @@ const currentTab = shallowRef(pages[page_indx.value]) // 3 - text comprehension // 4 - foraging in semantic memory // 5 - human brain should show stroop interference -// 6 - - +// 6 - function next_trial(goto) { - page_indx.value = smilestore.incrementPageTracker() - if (page_indx.value >= pages.length) { - smilestore.resetPageTracker() - if(goto) router.push(goto) - } else { - currentTab.value = pages[page_indx.value] - } + page_indx.value = smilestore.incrementPageTracker() + if (page_indx.value >= pages.length) { + smilestore.resetPageTracker() + if (goto) router.push(goto) + } else { + currentTab.value = pages[page_indx.value] + } } - - \ No newline at end of file + diff --git a/src/components/pages/DebriefPage.vue b/src/components/pages/DebriefPage.vue index e8234a5..11b0859 100644 --- a/src/components/pages/DebriefPage.vue +++ b/src/components/pages/DebriefPage.vue @@ -2,7 +2,7 @@ import { useRouter, useRoute } from 'vue-router' import useTimelineStepper from '@/composables/timelinestepper' import useSmileStore from '@/stores/smiledata' -import DebriefText from '@/components/atoms/DebriefText.vue'; // get access to the global store +import DebriefText from '@/components/atoms/DebriefText.vue' // get access to the global store const router = useRouter() const route = useRoute() @@ -10,20 +10,21 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress smilestore.setDone() -function finish(goto) { - if(goto) router.push(goto) +function finish(goto) { + if (goto) router.push(goto) } - diff --git a/src/components/pages/DemographicSurveyPage.vue b/src/components/pages/DemographicSurveyPage.vue index 2f091cf..c1860df 100644 --- a/src/components/pages/DemographicSurveyPage.vue +++ b/src/components/pages/DemographicSurveyPage.vue @@ -10,309 +10,571 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() - smilestore.global.page_bg_color = '#fff' smilestore.global.page_text_color = '#000' smilestore.global.status_bar_bg_color = '#fff' smilestore.global.status_bar_text_color = '#000' - -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress const forminfo = reactive({ - dob: '', - gender: '', - race: '', - hispanic: '', - fluent_english: '', - normal_vision: '', - color_blind: '', - learning_disability: '', - neurodevelopmental_disorder: '', - psychiatric_disorder: '', - country: '', - zipcode: '', - education_level: '', - household_income: '', + dob: '', + gender: '', + race: '', + hispanic: '', + fluent_english: '', + normal_vision: '', + color_blind: '', + learning_disability: '', + neurodevelopmental_disorder: '', + psychiatric_disorder: '', + country: '', + zipcode: '', + education_level: '', + household_income: '', }) - const page = ref(1) -const page_one_complete = computed(() => forminfo.dob!==''&&forminfo.gender!==''&&forminfo.race!==''&&forminfo.hispanic!==''&&forminfo.fluent_english!=='') - -const page_two_complete = computed(() => forminfo.color_blind!==''&&forminfo.learning_disability!==''&&forminfo.neurodevelopmental_disorder!==''&&forminfo.psychiatric_disorder!=='') - -const page_three_complete = computed(() => forminfo.country!==''&&forminfo.education_level!==''&&forminfo.household_income!=='') - - -function autofill () { - forminfo.dob = '1978-09-12' - forminfo.gender = 'Male' - forminfo.race = 'Caucasian/White' - forminfo.hispanic = 'No' - forminfo.fluent_english = 'Yes' - forminfo.normal_vision = 'Yes' - forminfo.color_blind = 'No' - forminfo.learning_disability = 'No' - forminfo.neurodevelopmental_disorder = 'No' - forminfo.psychiatric_disorder = 'No' - forminfo.country = 'United States' - forminfo.zipcode = '12345' - forminfo.education_level = 'Doctorate Degree (PhD/Other)' - forminfo.household_income = '$100,000-$199,999' +const page_one_complete = computed( + () => + forminfo.dob !== '' && + forminfo.gender !== '' && + forminfo.race !== '' && + forminfo.hispanic !== '' && + forminfo.fluent_english !== '' +) + +const page_two_complete = computed( + () => + forminfo.color_blind !== '' && + forminfo.learning_disability !== '' && + forminfo.neurodevelopmental_disorder !== '' && + forminfo.psychiatric_disorder !== '' +) + +const page_three_complete = computed( + () => forminfo.country !== '' && forminfo.education_level !== '' && forminfo.household_income !== '' +) + +function autofill() { + forminfo.dob = '1978-09-12' + forminfo.gender = 'Male' + forminfo.race = 'Caucasian/White' + forminfo.hispanic = 'No' + forminfo.fluent_english = 'Yes' + forminfo.normal_vision = 'Yes' + forminfo.color_blind = 'No' + forminfo.learning_disability = 'No' + forminfo.neurodevelopmental_disorder = 'No' + forminfo.psychiatric_disorder = 'No' + forminfo.country = 'United States' + forminfo.zipcode = '12345' + forminfo.education_level = 'Doctorate Degree (PhD/Other)' + forminfo.household_income = '$100,000-$199,999' } -if(smilestore.config.mode==='development') smilestore.setPageAutofill(autofill) +if (smilestore.config.mode === 'development') smilestore.setPageAutofill(autofill) -function finish(goto) { - smilestore.saveDemographicForm(forminfo); - if(smilestore.config.mode=='development') smilestore.removePageAutofill() - if(goto) router.push(goto) +function finish(goto) { + smilestore.saveDemographicForm(forminfo) + if (smilestore.config.mode == 'development') smilestore.removePageAutofill() + if (goto) router.push(goto) } - - - \ No newline at end of file + diff --git a/src/components/pages/ExpPage.vue b/src/components/pages/ExpPage.vue index a74ade6..2043495 100644 --- a/src/components/pages/ExpPage.vue +++ b/src/components/pages/ExpPage.vue @@ -9,18 +9,20 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } diff --git a/src/components/pages/InstructionsPage.vue b/src/components/pages/InstructionsPage.vue index 2aee338..b26a515 100644 --- a/src/components/pages/InstructionsPage.vue +++ b/src/components/pages/InstructionsPage.vue @@ -10,33 +10,35 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress - +if (route.meta.progress) smilestore.global.progress = route.meta.progress // computed property based on condition in data const instText = computed(() => { - if(smilestore.getConditions.instructions === 'version1') { - return "instructions version 1" - } if(smilestore.getConditions.instructions === 'version2') { - return "instructions version 2" - } if(smilestore.getConditions.instructions === 'version3') { - return "instructions version 3" - } - return "no condition set" + if (smilestore.getConditions.instructions === 'version1') { + return 'instructions version 1' + } + if (smilestore.getConditions.instructions === 'version2') { + return 'instructions version 2' + } + if (smilestore.getConditions.instructions === 'version3') { + return 'instructions version 3' + } + return 'no condition set' }) -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } - diff --git a/src/components/pages/MTurkRecruitPage.vue b/src/components/pages/MTurkRecruitPage.vue index 44c9fb4..3fb0f6c 100644 --- a/src/components/pages/MTurkRecruitPage.vue +++ b/src/components/pages/MTurkRecruitPage.vue @@ -1,5 +1,5 @@ \ No newline at end of file + diff --git a/src/components/pages/Task1Page.vue b/src/components/pages/Task1Page.vue index b12eb2a..c714e31 100644 --- a/src/components/pages/Task1Page.vue +++ b/src/components/pages/Task1Page.vue @@ -9,19 +9,20 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress - -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } \ No newline at end of file + +
+ diff --git a/src/components/pages/Task2Page.vue b/src/components/pages/Task2Page.vue index 55cebd9..d7be66b 100644 --- a/src/components/pages/Task2Page.vue +++ b/src/components/pages/Task2Page.vue @@ -9,19 +9,20 @@ const smilestore = useSmileStore() const { next, prev } = useTimelineStepper() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress - -function finish(goto) { - // smilestore.saveData() - if(goto) router.push(goto) +function finish(goto) { + // smilestore.saveData() + if (goto) router.push(goto) } \ No newline at end of file + + + diff --git a/src/components/pages/WindowSizerPage.vue b/src/components/pages/WindowSizerPage.vue index 6068f0f..c4686aa 100644 --- a/src/components/pages/WindowSizerPage.vue +++ b/src/components/pages/WindowSizerPage.vue @@ -1,89 +1,91 @@ - - + + diff --git a/src/components/pages/WithdrawPage.vue b/src/components/pages/WithdrawPage.vue index da7fef9..504d661 100644 --- a/src/components/pages/WithdrawPage.vue +++ b/src/components/pages/WithdrawPage.vue @@ -5,79 +5,74 @@ import useSmileStore from '@/stores/smiledata' // get access to the global store const route = useRoute() const smilestore = useSmileStore() -if(route.meta.progress) smilestore.global.progress = route.meta.progress +if (route.meta.progress) smilestore.global.progress = route.meta.progress smilestore.saveData(true) // force a data save \ No newline at end of file + diff --git a/src/composables/timelinestepper.js b/src/composables/timelinestepper.js index 9ea135b..9cecdbd 100644 --- a/src/composables/timelinestepper.js +++ b/src/composables/timelinestepper.js @@ -3,7 +3,6 @@ import { useRoute, useRouter } from 'vue-router' import useSmileStore from '@/stores/smiledata' import _ from 'lodash' - export default function useTimelineStepper() { const smilestore = useSmileStore() const route = useRoute() @@ -13,18 +12,17 @@ export default function useTimelineStepper() { if (smilestore.config.auto_save) { smilestore.saveData() // automatically saves data } - + // HANDLE RANDOMIZATION OF SUBTIMELINES // if the next thing has a type field of randomized_sub_timeline, then we want to randomize the subtimeline - if(route.meta.next.type === 'randomized_sub_timeline'){ - + if (route.meta.next.type === 'randomized_sub_timeline') { // get shuffled routes -- have to just give it the whole router or else there are problems const orderedRoutes = RandomizeSubTimeline(route.meta.next, router) // return the next route - return { name: orderedRoutes[0].name, query: route.query} + return { name: orderedRoutes[0].name, query: route.query } } - + // HANDLE REGULAR ROUTES // otherwise we're just doing the normal thing if (route.meta.next) { diff --git a/src/config.js b/src/config.js index 0807b4d..dd72d82 100644 --- a/src/config.js +++ b/src/config.js @@ -12,10 +12,7 @@ function parse_w_h(value) { export default { mode: import.meta.env.MODE, project_name: import.meta.env.VITE_PROJECT_NAME, // autocompute this on intitialization - project_ref: import.meta.env.VITE_DEPLOY_BASE_PATH.slice(1, -1).replace( - /\//g, - '-' - ), + project_ref: import.meta.env.VITE_DEPLOY_BASE_PATH.slice(1, -1).replace(/\//g, '-'), code_name: import.meta.env.VITE_CODE_NAME, code_name_url: import.meta.env.VITE_CODE_NAME_DEPLOY_URL, local_storage_key: `smilestore-${import.meta.env.VITE_CODE_NAME}`, @@ -25,9 +22,9 @@ export default { branch: import.meta.env.VITE_GIT_BRANCH_NAME, last_commit_msg: import.meta.env.VITE_GIT_LAST_MSG, last_commit_hash: import.meta.env.VITE_GIT_HASH, // autocompute this all the time - commit_url: `https://github.com/${import.meta.env.VITE_GIT_OWNER}/${ - import.meta.env.VITE_GIT_REPO_NAME - }/commit/${import.meta.env.VITE_GIT_HASH}`, + commit_url: `https://github.com/${import.meta.env.VITE_GIT_OWNER}/${import.meta.env.VITE_GIT_REPO_NAME}/commit/${ + import.meta.env.VITE_GIT_HASH + }`, }, browser_exclude: import.meta.env.VITE_BROWSER_EXCLUDE, allow_repeats: import.meta.env.VITE_ALLOW_REPEATS, diff --git a/src/createpinia.js b/src/createpinia.js index a0a752b..b275c96 100644 --- a/src/createpinia.js +++ b/src/createpinia.js @@ -2,4 +2,4 @@ import { createPinia } from 'pinia' export const pinia = createPinia() -export default pinia \ No newline at end of file +export default pinia diff --git a/src/main.js b/src/main.js index a3cc65c..48d7f53 100644 --- a/src/main.js +++ b/src/main.js @@ -7,8 +7,8 @@ import VueGtag from 'vue-gtag' // google analytics // import with an @ symbol are resolved by vite to ./src directory import App from '@/App.vue' // import the main app component -import {router} from '@/router' // import the router -import {pinia} from '@/createpinia' +import { router } from '@/router' // import the router +import { pinia } from '@/createpinia' import '@/icons' // configure fontawesome // Create the app and the data store diff --git a/src/randomization.js b/src/randomization.js index 4d4a38b..f5fc98e 100644 --- a/src/randomization.js +++ b/src/randomization.js @@ -1,44 +1,43 @@ - - // gets random integer between min (inclusive) and max (inclusive) +// gets random integer between min (inclusive) and max (inclusive) export function randomInt(min, max) { - return Math.floor(Math.random() * (Math.floor(max) - Math.ceil(min) + 1) + Math.ceil(min)); - } + return Math.floor(Math.random() * (Math.floor(max) - Math.ceil(min) + 1) + Math.ceil(min)) +} export function shuffle(array) { - const arrayCopy = array.slice(0); - for (let i = arrayCopy.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - const temp = arrayCopy[i]; - arrayCopy[i] = arrayCopy[j]; - arrayCopy[j] = temp; - } - return arrayCopy + const arrayCopy = array.slice(0) + for (let i = arrayCopy.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)) + const temp = arrayCopy[i] + arrayCopy[i] = arrayCopy[j] + arrayCopy[j] = temp + } + return arrayCopy } export function sampleWithoutReplacement(array, sampleSize) { - if (sampleSize > array.length) { - console.error("sample size larger than array length"); - } - return shuffle(array).slice(0, sampleSize); - } + if (sampleSize > array.length) { + console.error('sample size larger than array length') + } + return shuffle(array).slice(0, sampleSize) +} export function sampleWithReplacement(array, sampleSize) { - const sample = []; - let s = sampleSize - while (s > 0){ - sample.push(array[randomInt(0, array.length-1)]) - s -= 1 - } - return(sample) - } + const sample = [] + let s = sampleSize + while (s > 0) { + sample.push(array[randomInt(0, array.length - 1)]) + s -= 1 + } + return sample +} export function expandProduct(...arr) { - // get length of each sub array in arr - const lengths = arr.map(x => x.length) - // get product of lengths - const product = lengths.reduce((a, b) => a * b, 1) - if(product > 1000){ - console.warn("That's a whole lot of combinations! Are you sure you want to do that?") - } - return arr.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat()))); - }; \ No newline at end of file + // get length of each sub array in arr + const lengths = arr.map((x) => x.length) + // get product of lengths + const product = lengths.reduce((a, b) => a * b, 1) + if (product > 1000) { + console.warn("That's a whole lot of combinations! Are you sure you want to do that?") + } + return arr.reduce((a, b) => a.flatMap((d) => b.map((e) => [d, e].flat()))) +} diff --git a/src/seed.js b/src/seed.js index ad2faf4..179e95c 100644 --- a/src/seed.js +++ b/src/seed.js @@ -3,37 +3,37 @@ // NOTE: this DOES NOT set the seed. Seed is set in beforeResolve in router.js (before each component) // this script simply defines an ID number that is used to set seeds throughout the experiment -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuidv4 } from 'uuid' import { pinia } from '@/createpinia' import useSmileStore from '@/stores/smiledata' // get access to the global store -const smilestore = useSmileStore(pinia) +const smilestore = useSmileStore(pinia) function getParameterByName(name, url = window.location.href) { - const nameClean = name.replace(/[\[\]]/g, '\\$&'); - const regex = new RegExp(`[?&]${ nameClean }(=([^&#]*)|&|#|$)`); - const results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ''; - return decodeURIComponent(results[2].replace(/\+/g, ' ')); - } + const nameClean = name.replace(/[\[\]]/g, '\\$&') + const regex = new RegExp(`[?&]${nameClean}(=([^&#]*)|&|#|$)`) + const results = regex.exec(url) + if (!results) return null + if (!results[2]) return '' + return decodeURIComponent(results[2].replace(/\+/g, ' ')) +} // has the seed already been set? - const seedSet = smilestore.isSeedSet +const seedSet = smilestore.isSeedSet - // Get the value of "some_key" in eg "https://example.com/?some_key=some_value" - const seed = getParameterByName('SEED') - +// Get the value of "some_key" in eg "https://example.com/?some_key=some_value" +const seed = getParameterByName('SEED') // if the seed hasn't already been set -if(!seedSet){ - // either pull the seed from the URL - if(seed){ - console.log(`force seed id to ${ seed}`) - smilestore.setSeedID(seed) - } else { // otherwise, generate a random ID - const participantID = uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' - console.log(`set seed id to ${ participantID}`) - smilestore.setSeedID(participantID) - } -} \ No newline at end of file +if (!seedSet) { + // either pull the seed from the URL + if (seed) { + console.log(`force seed id to ${seed}`) + smilestore.setSeedID(seed) + } else { + // otherwise, generate a random ID + const participantID = uuidv4() // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' + console.log(`set seed id to ${participantID}`) + smilestore.setSeedID(participantID) + } +} diff --git a/src/stores/firestore-db.js b/src/stores/firestore-db.js index 8b6d729..0fb751b 100644 --- a/src/stores/firestore-db.js +++ b/src/stores/firestore-db.js @@ -8,7 +8,7 @@ import { setDoc, getDoc, Timestamp, - runTransaction + runTransaction, } from 'firebase/firestore' import appconfig from '@/config' import { split } from 'lodash' @@ -63,10 +63,7 @@ export const createDoc = async (data, seedid, partnum) => { }, { merge: true } ) - console.log( - 'Document written with ID: ', - `${mode}/${appconfig.project_ref}` - ) + console.log('Document written with ID: ', `${mode}/${appconfig.project_ref}`) // Add a new document with a generated id. // const docRef = await addDoc( @@ -77,19 +74,18 @@ export const createDoc = async (data, seedid, partnum) => { // Append the participnt number to the end of the docID -- this should ALWAYS make a unique record const fulldocid = `${seedid}-p${partnum}` const docRef = doc(db, `${mode}/${appconfig.project_ref}/data`, fulldocid) - const docSnap = await getDoc(docRef); + const docSnap = await getDoc(docRef) // however, we'll still check to make sure the record doesn't already exist. If it does, we append override, but any additional overrides with same id and participant will overwrite the data if (docSnap.exists()) { - await setDoc(doc(db, `${mode}/${appconfig.project_ref}/data`, `${fulldocid }-override`), data); - console.log('Document written with ID: ', `${fulldocid }-override`) - return `${fulldocid }-override` + await setDoc(doc(db, `${mode}/${appconfig.project_ref}/data`, `${fulldocid}-override`), data) + console.log('Document written with ID: ', `${fulldocid}-override`) + return `${fulldocid}-override` } - // otherwise, we create a document with the specified docID - await setDoc(doc(db, `${mode}/${appconfig.project_ref}/data`, fulldocid), data); - console.log('Document written with ID: ', fulldocid) - return fulldocid - + // otherwise, we create a document with the specified docID + await setDoc(doc(db, `${mode}/${appconfig.project_ref}/data`, fulldocid), data) + console.log('Document written with ID: ', fulldocid) + return fulldocid } catch (e) { console.error('Error adding document: ', e) return null @@ -99,66 +95,63 @@ export const createDoc = async (data, seedid, partnum) => { export const updateExperimentCounter = async (counter) => { const docRef = doc(db, `${mode}/${appconfig.project_ref}/counters/`, counter) - let newCounter = null; - try { - await runTransaction(db, async (transaction) => { - const docSnap = await transaction.get(docRef); - if (!docSnap.exists()) { - newCounter = 0 - } else{ - newCounter = docSnap.data().n + 1; - } - transaction.set(docRef, { n: newCounter }, {merge: true}); - }); - console.log("New participant number is: ", newCounter); - } catch (e) { - console.log("Transaction failed: ", e); - } - return newCounter + let newCounter = null + try { + await runTransaction(db, async (transaction) => { + const docSnap = await transaction.get(docRef) + if (!docSnap.exists()) { + newCounter = 0 + } else { + newCounter = docSnap.data().n + 1 + } + transaction.set(docRef, { n: newCounter }, { merge: true }) + }) + console.log('New participant number is: ', newCounter) + } catch (e) { + console.log('Transaction failed: ', e) + } + return newCounter } export const balancedAssignConditions = async (conditionDict, currentConditions) => { - - if(currentConditions.length === 0 && appconfig.mode === 'development'){ + if (currentConditions.length === 0 && appconfig.mode === 'development') { // if there are current conditions and we're in developer mode, we won't assign new ones - console.log("conditions already set, not assigning new ones in dev mode") + console.log('conditions already set, not assigning new ones in dev mode') return currentConditions } // if the conditionDict is empty, we'll just return an empty list - if(Object.keys(conditionDict).length === 0){ - console.log("no conditions to assign") + if (Object.keys(conditionDict).length === 0) { + console.log('no conditions to assign') return {} } // function for all possible combinations of N arrays (from https://stackoverflow.com/questions/8936610/how-can-i-create-every-combination-possible-for-the-contents-of-two-arrays) const combine = ([head, ...[headTail, ...tailTail]]) => { if (!headTail) return head - const combined = headTail.reduce((acc, x) => acc.concat(head.map(h => `${h}~${x}`)), []) + const combined = headTail.reduce((acc, x) => acc.concat(head.map((h) => `${h}~${x}`)), []) return combine([combined, ...tailTail]) } // Append between-subjects conditions const conditionCombos = combine(Object.values(conditionDict)) - // get a docRef for the conditions counter - const docRef = doc(db, `${mode}/${appconfig.project_ref}/counters/conditions`) + const docRef = doc(db, `${mode}/${appconfig.project_ref}/counters/conditions`) // make a list of docRefs for each key in keys // const docRefs = keys.map((keyCond) => doc(db, `${mode}/${appconfig.project_ref}/counters/`, keyCond)) try { const selectedConditions = await runTransaction(db, async (transaction) => { - // for docRef, get the data const docSnap = await transaction.get(docRef) // const docSnaps = await Promise.all(docRefs.map((docRef) => transaction.get(docRef))) - // see if it exists. + // see if it exists. // If it doesn't, choose a random condition from the list of conditions for that key let output - + if (!docSnap.exists()) { const newCondCounter = {} const conditions = conditionCombos @@ -170,16 +163,16 @@ export const balancedAssignConditions = async (conditionDict, currentConditions) }) newCondCounter[minCondition] += 1 // return selected condition and new incremented counter - output = {condName: docSnap.id, selectedCond: minCondition, newCounter: newCondCounter} + output = { condName: docSnap.id, selectedCond: minCondition, newCounter: newCondCounter } } else { // otherwise, choose the condition with the lowest count const conditions = conditionCombos const oldCondCounter = docSnap.data() - + // check if the current counter data has all the conditions // if there are any missing, we're going to start over everything at zero and choose at random const missingConditions = conditions.filter((cond) => !Object.keys(oldCondCounter).includes(cond)) - if(missingConditions.length > 0){ + if (missingConditions.length > 0) { const newCondCounter = {} const randomIndex = Math.floor(Math.random() * conditions.length) const minCondition = conditions[randomIndex] @@ -189,7 +182,7 @@ export const balancedAssignConditions = async (conditionDict, currentConditions) }) newCondCounter[minCondition] += 1 // return selected condition and new incremented counter - output = {condName: docSnap.id, selectedCond: minCondition, newCounter: newCondCounter} + output = { condName: docSnap.id, selectedCond: minCondition, newCounter: newCondCounter } } // otherwise, we'll just choose the condition with the lowest count @@ -200,19 +193,18 @@ export const balancedAssignConditions = async (conditionDict, currentConditions) // (if there are more than one, pick one at random) const minCondition = matchMinConds[Math.floor(Math.random() * matchMinConds.length)] oldCondCounter[minCondition] += 1 - output = {condName: docSnap.id, selectedCond: minCondition, newCounter: oldCondCounter} + output = { condName: docSnap.id, selectedCond: minCondition, newCounter: oldCondCounter } } } - // for each entry in output, update firestore with the newCounter and add selected cond to output dict const transactionOut = {} // no merge, because if any of the conditions change we just want to reset everything - transaction.set(doc(db, `${mode}/${appconfig.project_ref}/counters/`, output.condName), output.newCounter); + transaction.set(doc(db, `${mode}/${appconfig.project_ref}/counters/`, output.condName), output.newCounter) transactionOut[output.condName] = output.selectedCond - return transactionOut; - }); + return transactionOut + }) // Split back up into dictionary // get keys from conditionDict const keys = Object.keys(conditionDict) @@ -221,13 +213,13 @@ export const balancedAssignConditions = async (conditionDict, currentConditions) // zip keys and splitConditions const selectedConditionsDict = Object.fromEntries(keys.map((key, i) => [key, splitConditions[i]])) - console.log("Conditions set to ", selectedConditionsDict); + console.log('Conditions set to ', selectedConditionsDict) return selectedConditionsDict } catch (e) { - console.error(e); + console.error(e) } - return null; + return null } // export default createDoc diff --git a/src/stores/smiledata.js b/src/stores/smiledata.js index 1cdbf58..e6aa7b4 100644 --- a/src/stores/smiledata.js +++ b/src/stores/smiledata.js @@ -12,26 +12,30 @@ import { fsnow, } from './firestore-db' - export default defineStore('smilestore', { // arrow function recommended for full type inference state: () => ({ - local: useStorage(appconfig.local_storage_key, { - // syncs with local storage - knownUser: false, - lastRoute: appconfig.mode === 'development' ? 'recruit' : 'landing', - allowJumps: appconfig.mode === 'development', - docRef: null, - partNum: null, - completionCode: '', - totalWrites: 0, - lastWrite: null, - seedActive: true, // do you want to use a random seed based on the participant's ID? - seedID: '', - seedSet: false, - pageTracker: 0, - possibleConditions: {taskOrder: ["AFirst", "BFirst"], instructions: ["version1", "version2", "version3"]}, - }, localStorage, { mergeDefaults: true }), + local: useStorage( + appconfig.local_storage_key, + { + // syncs with local storage + knownUser: false, + lastRoute: appconfig.mode === 'development' ? 'recruit' : 'landing', + allowJumps: appconfig.mode === 'development', + docRef: null, + partNum: null, + completionCode: '', + totalWrites: 0, + lastWrite: null, + seedActive: true, // do you want to use a random seed based on the participant's ID? + seedID: '', + seedSet: false, + pageTracker: 0, + possibleConditions: { taskOrder: ['AFirst', 'BFirst'], instructions: ['version1', 'version2', 'version3'] }, + }, + localStorage, + { mergeDefaults: true } + ), global: { // ephemeral state, resets on browser refresh progress: 0, @@ -110,11 +114,11 @@ export default defineStore('smilestore', { this.local.seedID = seed this.local.seedSet = true }, - incrementPageTracker(){ + incrementPageTracker() { this.local.pageTracker += 1 return this.local.pageTracker }, - resetPageTracker(){ + resetPageTracker() { this.local.pageTracker = 0 }, recordWindowEvent(type, event_data = null) { @@ -194,7 +198,7 @@ export default defineStore('smilestore', { this.local.partNum = await updateExperimentCounter('participants') this.local.docRef = await createDoc(this.data, this.local.seedID, this.local.partNum) // if possible conditions are not empty, assign conditions - if(this.local.possibleConditions){ + if (this.local.possibleConditions) { this.data.conditions = await balancedAssignConditions(this.local.possibleConditions, this.data.conditions) } if (this.local.docRef) { @@ -220,7 +224,7 @@ export default defineStore('smilestore', { // this.local.lastRoute = route // } }, - recordRoute(route){ + recordRoute(route) { this.data.route_order.push(route) }, async saveData(force = false) { @@ -232,18 +236,11 @@ export default defineStore('smilestore', { return } - if ( - !force && - this.local.lastWrite && - Date.now() - this.local.lastWrite < appconfig.min_write_interval - ) { + if (!force && this.local.lastWrite && Date.now() - this.local.lastWrite < appconfig.min_write_interval) { console.error( 'SMILESTORE: write interval too short for firebase. Data NOT saved. Call saveData() less frequently to avoid problems/cost issues.' ) - console.error( - 'SMILESTORE: interval was', - appconfig.min_write_interval - ) + console.error('SMILESTORE: interval was', appconfig.min_write_interval) // console.error(Date.now() - this.local.lastWrite) return } @@ -262,4 +259,3 @@ export default defineStore('smilestore', { }, }, }) - diff --git a/src/subtimeline.js b/src/subtimeline.js index 678fb51..727e2b8 100644 --- a/src/subtimeline.js +++ b/src/subtimeline.js @@ -2,13 +2,12 @@ import _ from 'lodash' import useSmileStore from '@/stores/smiledata' import * as random from '@/randomization' import seedrandom from 'seedrandom' -import { v4 as uuidv4 } from 'uuid'; - +import { v4 as uuidv4 } from 'uuid' class RandomSubTimeline { constructor() { this.routes = [] // the actual routes given to VueRouter - this.type = "randomized_sub_timeline" + this.type = 'randomized_sub_timeline' } pushToRoutes(route) { @@ -31,9 +30,7 @@ class RandomSubTimeline { if (!newroute.meta) { newroute.meta = { prev: undefined, next: undefined } } else if (newroute.meta.prev || newroute.meta.next) { - throw new Error( - `SubRouteError: Can't have meta.next or meta.prev defined for randomized subroute` - ) + throw new Error(`SubRouteError: Can't have meta.next or meta.prev defined for randomized subroute`) } newroute.meta.subroute = true try { @@ -43,72 +40,69 @@ class RandomSubTimeline { throw err } } - } export function RandomizeSubTimeline(subTimeline, router) { const smilestore = useSmileStore() // get route before and route after from subTimeline.routes[0].meta.next and prev - const routeBefore = router.getRoutes().find(route => route.name === subTimeline.routes[0].meta.prev) - const routeAfter = router.getRoutes().find(route => route.name === subTimeline.routes[0].meta.next) + const routeBefore = router.getRoutes().find((route) => route.name === subTimeline.routes[0].meta.prev) + const routeAfter = router.getRoutes().find((route) => route.name === subTimeline.routes[0].meta.next) // set seed for randomization - if(smilestore.local.seedActive){ - const seedID = smilestore.getSeedID - // randomize seed with the name of the previous route - const seed = `${seedID}-${routeBefore.name}-subtimeline` - seedrandom(seed, { global: true }); - } else { // if inactive, generate a random string then re-seed - const newseed = uuidv4(); - seedrandom(newseed, { global: true }); + if (smilestore.local.seedActive) { + const seedID = smilestore.getSeedID + // randomize seed with the name of the previous route + const seed = `${seedID}-${routeBefore.name}-subtimeline` + seedrandom(seed, { global: true }) + } else { + // if inactive, generate a random string then re-seed + const newseed = uuidv4() + seedrandom(newseed, { global: true }) } - let orderedRoutes = []; + let orderedRoutes = [] // if orders are set, then we want to use the conditions from the data to set the order as specified const metaInfo = subTimeline.routes[0].meta - if(metaInfo.orders && metaInfo.label){ - console.log("setting random route order based on condition and prespecified orders") + if (metaInfo.orders && metaInfo.label) { + console.log('setting random route order based on condition and prespecified orders') - // get condition from data, and then select route order specified for that condition - const cond = smilestore.getConditions[metaInfo.label] + // get condition from data, and then select route order specified for that condition + const cond = smilestore.getConditions[metaInfo.label] - if(!cond){ + if (!cond) { throw new Error(`ConditionError: Condition label ${metaInfo.label} not found in data`) - } else { + } else { const routeOrder = metaInfo.orders[cond] // put subTimeline.routes in the order specified by routeOrder orderedRoutes = routeOrder.map((order) => subTimeline.routes.find((r) => r.name === order)) - } - + } } else { - console.log("setting random route order based on random seed") - // if not, then we want to randomize the order: shuffle the routes in subTimeline - orderedRoutes = random.shuffle(subTimeline.routes) + console.log('setting random route order based on random seed') + // if not, then we want to randomize the order: shuffle the routes in subTimeline + orderedRoutes = random.shuffle(subTimeline.routes) } // for each route, set the meta.next and meta.prev to be the proper route. // By default, both routes already have meta.next as the next route (after the randomized subtimeline), so this can be kept for the last route // By default, both routes already have meta.prev as the previous route (before the randomized subtimeline), so this can be kept for the first route orderedRoutes.forEach((orderRoute, index) => { - if(index !== 0) { - orderedRoutes[index].meta.prev = orderedRoutes[index-1].name - } - if(index !== orderedRoutes.length-1){ - orderedRoutes[index].meta.next = orderedRoutes[index+1].name - } + if (index !== 0) { + orderedRoutes[index].meta.prev = orderedRoutes[index - 1].name + } + if (index !== orderedRoutes.length - 1) { + orderedRoutes[index].meta.next = orderedRoutes[index + 1].name + } }) - // for the route before, change meta.next to be the first route in the randomized subtimeline routeBefore.meta.next = orderedRoutes[0].name // for the route after, change meta.prev to be the last route in the randomized subtimeline - routeAfter.meta.prev = orderedRoutes[orderedRoutes.length-1].name - + routeAfter.meta.prev = orderedRoutes[orderedRoutes.length - 1].name // return the next route return orderedRoutes } -export default RandomSubTimeline \ No newline at end of file +export default RandomSubTimeline diff --git a/src/timeline.js b/src/timeline.js index c70eedb..7b09569 100644 --- a/src/timeline.js +++ b/src/timeline.js @@ -4,7 +4,7 @@ class Timeline { constructor() { this.routes = [] // the actual routes given to VueRouter this.seqtimeline = [] // copies of routes that are sequential - this.type = "timeline" + this.type = 'timeline' } pushToRoutes(route) { @@ -29,12 +29,11 @@ class Timeline { throw new Error(`DuplicateNameError${route.name}`) } // only check for duplicate paths if the route name is not an object (subtimeline) - if (typeof route.name !== 'object'){ + if (typeof route.name !== 'object') { if (this.seqtimeline[i].path === route.path) { throw new Error(`DuplicatePathError${route.path}`) } } - } this.seqtimeline.push(route) } @@ -54,7 +53,7 @@ class Timeline { newroute.meta.prev = undefined } } - newroute.meta.type = "route" + newroute.meta.type = 'route' newroute.meta.sequential = true try { @@ -76,11 +75,9 @@ class Timeline { const newroute = _.cloneDeep(routeConfig) // should NOT allow meta next/prev to exist if (!newroute.meta) { - newroute.meta = { prev: null, next: null, type: "route" } + newroute.meta = { prev: null, next: null, type: 'route' } } else if (newroute.meta.prev || newroute.meta.next) { - throw new Error( - `NonSequentialRouteError: Can't have meta.next or meta.prev defined for non-sequential route` - ) + throw new Error(`NonSequentialRouteError: Can't have meta.next or meta.prev defined for non-sequential route`) } newroute.meta.sequential = false try { @@ -91,23 +88,23 @@ class Timeline { } } - pushRandomizedTimeline(timeline){ - if(timeline.name.type !== 'randomized_sub_timeline'){ - throw new Error("Can only push randomized timelines to timelines") + pushRandomizedTimeline(timeline) { + if (timeline.name.type !== 'randomized_sub_timeline') { + throw new Error('Can only push randomized timelines to timelines') } const newtimeline = _.cloneDeep(timeline) // need to configure next and prev - if(!newtimeline.meta){ - newtimeline.meta = { next: undefined, prev: undefined, type: "timeline" } + if (!newtimeline.meta) { + newtimeline.meta = { next: undefined, prev: undefined, type: 'timeline' } } else { newtimeline.meta.next = undefined newtimeline.meta.prev = undefined - newtimeline.meta.type = "timeline" + newtimeline.meta.type = 'timeline' } // get all the routes inside the timeline and add them to routes - newtimeline.name.routes.forEach(route => { + newtimeline.name.routes.forEach((route) => { try { this.pushToRoutes(route) } catch (err) { @@ -115,7 +112,7 @@ class Timeline { throw err } }) - + // add the timeline object itself to the timeline this.pushToTimeline(newtimeline) } @@ -152,20 +149,21 @@ class Timeline { } } - if(this.seqtimeline[i].meta.type === "timeline"){ + if (this.seqtimeline[i].meta.type === 'timeline') { timelineIndices.push(i) } - } // propogate various meta fields to the routes within the timeline // this is relevant for next, previous, label, and orders -- we need that meta info at the route level - timelineIndices.forEach(index => { + timelineIndices.forEach((index) => { this.seqtimeline[index].name.routes.forEach((route, i) => { - this.seqtimeline[index].name.routes[i].meta = {...this.seqtimeline[index].name.routes[i].meta, ...this.seqtimeline[index].meta} + this.seqtimeline[index].name.routes[i].meta = { + ...this.seqtimeline[index].name.routes[i].meta, + ...this.seqtimeline[index].meta, + } }) }) - } // this won't work with new system diff --git a/src/utils.js b/src/utils.js index 6eb43d3..9607a67 100644 --- a/src/utils.js +++ b/src/utils.js @@ -5,12 +5,7 @@ export function processQuery(query, service) { const urlParams = query if (!urlParams) return // do nothing if no query - if ( - service === 'prolific' && - urlParams.PROLIFIC_PID && - urlParams.STUDY_ID && - urlParams.SESSION_ID - ) { + if (service === 'prolific' && urlParams.PROLIFIC_PID && urlParams.STUDY_ID && urlParams.SESSION_ID) { // this is a prolific experiment console.log('Prolific mode') smilestore.setRecruitmentService(service, { @@ -18,24 +13,14 @@ export function processQuery(query, service) { study_id: urlParams.STUDY_ID, session_id: urlParams.SESSION_ID, }) - } else if ( - service === 'cloudresearch' && - urlParams.assignmentId && - urlParams.hitId && - urlParams.workerId - ) { + } else if (service === 'cloudresearch' && urlParams.assignmentId && urlParams.hitId && urlParams.workerId) { console.log('CloudResearch mode') smilestore.setRecruitmentService(service, { worker_id: urlParams.workerId, hit_id: urlParams.hitId, assignment_id: urlParams.assignmentId, }) - } else if ( - service === 'mturk' && - urlParams.assignmentId && - urlParams.hitId && - urlParams.workerId - ) { + } else if (service === 'mturk' && urlParams.assignmentId && urlParams.hitId && urlParams.workerId) { if (urlParams.assignmentId == 'ASSIGNMENT_ID_NOT_AVAILABLE') { console.log('AMT mode, but no assignment (preview mode)') // supposed to show the ad here diff --git a/tests/cypress/e2e/mturk.cy.js b/tests/cypress/e2e/mturk.cy.js new file mode 100644 index 0000000..50fdbfc --- /dev/null +++ b/tests/cypress/e2e/mturk.cy.js @@ -0,0 +1,30 @@ +/* eslint-disable no-undef */ +// this is a test file for checking the amazon mechanical turk workflow + +// There's a principle here where we don't need to test the amt's website +// works correctly (although we could). We get to assume that is right. So +// what we test here simply is that if a user comes into the task in a way consistent +// with being in a AMT experiment referral then check that when they exit that +// task they will be able to correctly submit the work. +describe('test that the project will run successfully on mturk', () => { + it('should provide a properly formatted mturk end point when it starts in prolific mode', () => { + cy.viewport(1000, 1200) // cy.viewport('iphone-11) + + // visit the page + cy.visit( + `${Cypress.env( + 'VITE_DEPLOY_URL' + )}#/welcome/prolific/?assignmentId=123RVWYBAZW00EXAMPLE456RVWYBAZW00EXAMPLE&hitId=123RVWYBAZW00EXAMPLE&turkSubmitTo=https://www.mturk.com/&workerId=AZ3456EXAMPLE` + ) + cy.visit(`${Cypress.env('VITE_DEPLOY_URL')}#/debrief/`) // dev mode allows jumping paths like this + cy.contains('next').click() + cy.get('.payment').get('.has-text-left').contains('Prolific') // assert this is the right endpoint text + + cy.get('.payment') + .find('a') + .should('have.attr', 'href') + .and('include', 'https://app.prolific.co/submissions/complete?cc=') // assert this is the right endpoint url + + // seems ok then + }) +}) diff --git a/tests/cypress/e2e/prolific.cy.js b/tests/cypress/e2e/prolific.cy.js index 19577bb..9597a29 100644 --- a/tests/cypress/e2e/prolific.cy.js +++ b/tests/cypress/e2e/prolific.cy.js @@ -10,11 +10,7 @@ describe('test that the project will run successfully on prolific', () => { cy.viewport(1000, 1200) // cy.viewport('iphone-11) // visit the page - cy.visit( - `${Cypress.env( - 'VITE_DEPLOY_URL' - )}#/welcome/prolific/?PROLIFIC_PID=xxxxx&STUDY_ID=xxxxxx&SESSION_ID=xxxxx` - ) + cy.visit(`${Cypress.env('VITE_DEPLOY_URL')}#/welcome/prolific/?PROLIFIC_PID=xxxxx&STUDY_ID=xxxxxx&SESSION_ID=xxxxx`) cy.visit(`${Cypress.env('VITE_DEPLOY_URL')}#/debrief/`) // dev mode allows jumping paths like this cy.contains('next').click() cy.get('.payment').get('.has-text-left').contains('Prolific') // assert this is the right endpoint text diff --git a/tests/cypress/e2e/smoke_spec.cy.js b/tests/cypress/e2e/smoke_spec.cy.js index 8b4176d..8370f59 100644 --- a/tests/cypress/e2e/smoke_spec.cy.js +++ b/tests/cypress/e2e/smoke_spec.cy.js @@ -26,9 +26,7 @@ describe('user flow', () => { cy.contains("I'm ready!").click() // click the continue button cy.url().should('include', '/consent') // should go to consent next cy.get('.consentbox').should('contain', 'We first must verify') // verify it loaded by checking text on the page - cy.get('.formkit-outer') - .get('[name="consent_toggle"]') - .check({ force: true }) // required with formkit, sorry, toggles the consent switch + cy.get('.formkit-outer').get('[name="consent_toggle"]').check({ force: true }) // required with formkit, sorry, toggles the consent switch cy.contains("Let's start").click() // continue now // demographic page diff --git a/tests/cypress/support/e2e.js b/tests/cypress/support/e2e.js index 5df9c01..d1dd135 100644 --- a/tests/cypress/support/e2e.js +++ b/tests/cypress/support/e2e.js @@ -14,7 +14,7 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands'; +import './commands' // Alternatively you can use CommonJS syntax: // require('./commands') diff --git a/tests/vitest/randomization.test.js b/tests/vitest/randomization.test.js index 6d5c161..ee099c2 100644 --- a/tests/vitest/randomization.test.js +++ b/tests/vitest/randomization.test.js @@ -2,14 +2,15 @@ import * as random from '@/randomization' describe('Randomization tests', () => { - it('should generate random integers', () => { - const randomints = Array(10000).fill().map(element => random.randomInt(1, 5)) - + const randomints = Array(10000) + .fill() + .map((element) => random.randomInt(1, 5)) + // numbers should be between 1 and 5 expect(Math.max(...randomints)).toBeLessThanOrEqual(5) expect(Math.min(...randomints)).toBeGreaterThanOrEqual(1) - + // // roughly equal numbers per category // const counts = {}; // for (let i = 0; i < randomints.length; i++) { @@ -21,18 +22,18 @@ describe('Randomization tests', () => { // expect(Math.abs(counts[3]-(10000/5))).toBeLessThanOrEqual(100) // expect(Math.abs(counts[4]-(10000/5))).toBeLessThanOrEqual(100) // expect(Math.abs(counts[5]-(10000/5))).toBeLessThanOrEqual(100) - - }) - + }) it('should shuffle arrays', () => { - const randomarrays = Array(10000).fill().map(element => random.shuffle([1, 2, 3])) - + const randomarrays = Array(10000) + .fill() + .map((element) => random.shuffle([1, 2, 3])) + // each array in randomarrays should have 1, 2, and 3 (in any order) - for(let i = 0; i < randomarrays.length; i++){ - expect(randomarrays[i].includes(1)).toBe(true) - expect(randomarrays[i].includes(2)).toBe(true) - expect(randomarrays[i].includes(3)).toBe(true) + for (let i = 0; i < randomarrays.length; i++) { + expect(randomarrays[i].includes(1)).toBe(true) + expect(randomarrays[i].includes(2)).toBe(true) + expect(randomarrays[i].includes(3)).toBe(true) } // // numbers of each shuffling order should be about equal @@ -48,40 +49,40 @@ describe('Randomization tests', () => { // expect(Math.abs(counts["2,3,1"]-(10000/6))).toBeLessThanOrEqual(100) // expect(Math.abs(counts["3,1,2"]-(10000/6))).toBeLessThanOrEqual(100) // expect(Math.abs(counts["3,2,1"]-(10000/6))).toBeLessThanOrEqual(100) - - }) + }) it('should sample without replacement', () => { - const randomarrays = Array(10000).fill().map(element => random.sampleWithoutReplacement([1, 2, 3], 3)) - + const randomarrays = Array(10000) + .fill() + .map((element) => random.sampleWithoutReplacement([1, 2, 3], 3)) + // since sampling is without replacement, 3 samples should give you all three numbers // each array in randomarrays should have 1, 2, and 3 (in any order) - for(let i = 0; i < randomarrays.length; i++){ - expect(randomarrays[i].includes(1)).toBe(true) - expect(randomarrays[i].includes(2)).toBe(true) - expect(randomarrays[i].includes(3)).toBe(true) + for (let i = 0; i < randomarrays.length; i++) { + expect(randomarrays[i].includes(1)).toBe(true) + expect(randomarrays[i].includes(2)).toBe(true) + expect(randomarrays[i].includes(3)).toBe(true) } - - }) + }) it('should sample with replacement', () => { - const randomarrays = Array(10000).fill().map(element => random.sampleWithReplacement([1, 2, 3], 3)) - + const randomarrays = Array(10000) + .fill() + .map((element) => random.sampleWithReplacement([1, 2, 3], 3)) + // since sampling is with replacement, at least one of these has to be true - for(let i = 0; i < randomarrays.length; i++){ - expect([randomarrays[i].includes(1), randomarrays[i].includes(2), randomarrays[i].includes(3)]).toContain(true) + for (let i = 0; i < randomarrays.length; i++) { + expect([randomarrays[i].includes(1), randomarrays[i].includes(2), randomarrays[i].includes(3)]).toContain(true) } // there should be no number other than 1, 2, or 3 - for(let i = 0; i < randomarrays.length; i++){ - expect(Math.max(...randomarrays[i])).toBeLessThanOrEqual(3) - expect(Math.min(...randomarrays[i])).toBeGreaterThanOrEqual(1) + for (let i = 0; i < randomarrays.length; i++) { + expect(Math.max(...randomarrays[i])).toBeLessThanOrEqual(3) + expect(Math.min(...randomarrays[i])).toBeGreaterThanOrEqual(1) } - - }) + }) it('should get cartesian product of arrays', () => { - const combos = random.expandProduct([1, 2], [3, 4], [5, 6]) // should have 8 combos expect(combos.length).toBe(8) @@ -89,8 +90,5 @@ describe('Randomization tests', () => { const combos2 = random.expandProduct([1, 2, 3, 4], [3, 4, 7, 10], [5, 6]) // should have 32 combos expect(combos2.length).toBe(32) - - }) - + }) }) - diff --git a/tests/vitest/seed.test.js b/tests/vitest/seed.test.js index 7e6b12e..6dbe69d 100644 --- a/tests/vitest/seed.test.js +++ b/tests/vitest/seed.test.js @@ -1,5 +1,5 @@ /* eslint-disable no-undef */ -import '@/seed' +import '@/seed' import Timeline from '@/timeline' import { createTestingPinia } from '@pinia/testing' import useSmileStore from '@/stores/smiledata' @@ -7,30 +7,29 @@ import { createRouter, createWebHashHistory } from 'vue-router' import { mount } from '@vue/test-utils' import seedrandom from 'seedrandom' - let router let pinia describe('Seed tests', () => { - // set up the app - function setupapp(routes) { - const TestAppRouter = { - template: `

hi

`, - } - pinia = createTestingPinia({ stubActions: true, }) - - router = createRouter({ - history: createWebHashHistory(), - routes, - }) - - const wrapper = mount(TestAppRouter, { - global: { - plugins: [router, pinia], - }, - }) - return wrapper + // set up the app + function setupapp(routes) { + const TestAppRouter = { + template: `

hi

`, } + pinia = createTestingPinia({ stubActions: true }) + + router = createRouter({ + history: createWebHashHistory(), + routes, + }) + + const wrapper = mount(TestAppRouter, { + global: { + plugins: [router, pinia], + }, + }) + return wrapper + } it('should save automatic seed to smilestore.local.seedID', async () => { const MockComponent = { template: '
Mock Component
' } @@ -46,7 +45,7 @@ describe('Seed tests', () => { name: 'second', component: MockComponent, }) - + timeline.build() const { routes } = timeline @@ -54,26 +53,18 @@ describe('Seed tests', () => { await router.isReady() const smilestore = useSmileStore() // uses the testing pinia! - + // expect seed to not be an empty string expect(smilestore.local.seedID).not.toEqual('') - }) it('should reproduce same random number when seed is reset', () => { - - seedrandom("testseed", { global: true }); + seedrandom('testseed', { global: true }) const testrand1 = Math.random() - seedrandom("testseed", { global: true }); + seedrandom('testseed', { global: true }) const testrand2 = Math.random() expect(testrand1).toBe(testrand2) - - }) - - - }) - diff --git a/tests/vitest/subtimeline.test.js b/tests/vitest/subtimeline.test.js index 4e8e85b..bf4d69a 100644 --- a/tests/vitest/subtimeline.test.js +++ b/tests/vitest/subtimeline.test.js @@ -10,27 +10,26 @@ import { mount } from '@vue/test-utils' let router let pinia - describe('Subtimeline tests', () => { - // set up the app - function setupapp(routes) { - const TestAppRouter = { - template: `

hi

`, - } - pinia = createTestingPinia({ stubActions: true, }) - - router = createRouter({ - history: createWebHashHistory(), - routes, - }) - - const wrapper = mount(TestAppRouter, { - global: { - plugins: [router, pinia], - }, - }) - return wrapper + // set up the app + function setupapp(routes) { + const TestAppRouter = { + template: `

hi

`, } + pinia = createTestingPinia({ stubActions: true }) + + router = createRouter({ + history: createWebHashHistory(), + routes, + }) + + const wrapper = mount(TestAppRouter, { + global: { + plugins: [router, pinia], + }, + }) + return wrapper + } it('should be able to create a subtimline', () => { const subtimeline = new RandomSubTimeline() @@ -70,7 +69,7 @@ describe('Subtimeline tests', () => { path: '/', name: 'index', component: MockComponent, - meta: {prev: 'prev', next: 'next'} + meta: { prev: 'prev', next: 'next' }, }) } expect(errorTrigger).toThrowError() @@ -113,7 +112,7 @@ describe('Subtimeline tests', () => { }) const errorTrigger = () => { subtimeline1.pushRandomizedTimeline({ - name: subtimeline2 + name: subtimeline2, }) } expect(errorTrigger).toThrowError() @@ -142,7 +141,7 @@ describe('Subtimeline tests', () => { }) timeline.pushRandomizedTimeline({ name: subtimeline, - meta: { label: "orderCond", orders: {cond1: ["mid1", "mid2"], cond2: ["mid2", "mid1"]} } + meta: { label: 'orderCond', orders: { cond1: ['mid1', 'mid2'], cond2: ['mid2', 'mid1'] } }, }) timeline.pushSeqRoute({ @@ -163,7 +162,6 @@ describe('Subtimeline tests', () => { RandomizeSubTimeline(timeline.seqtimeline[1].name, router) } expect(errorTrigger).toThrowError() - }) it('should re-order based on specified conditions if condition is set', async () => { @@ -188,7 +186,7 @@ describe('Subtimeline tests', () => { }) timeline.pushRandomizedTimeline({ name: subtimeline, - meta: { label: "orderCond", orders: {cond1: ["mid1", "mid2"], cond2: ["mid2", "mid1"]} } + meta: { label: 'orderCond', orders: { cond1: ['mid1', 'mid2'], cond2: ['mid2', 'mid1'] } }, }) timeline.pushSeqRoute({ @@ -204,22 +202,20 @@ describe('Subtimeline tests', () => { await router.isReady() const smilestore = useSmileStore() // uses the testing pinia! - + // first condition smilestore.data.conditions.orderCond = 'cond1' const shuffledRoutes = RandomizeSubTimeline(timeline.seqtimeline[1].name, router) - + expect(shuffledRoutes[0].name).toBe('mid1') expect(shuffledRoutes[1].name).toBe('mid2') // now the other condition smilestore.data.conditions.orderCond = 'cond2' const shuffledRoutes2 = RandomizeSubTimeline(timeline.seqtimeline[1].name, router) - + expect(shuffledRoutes2[0].name).toBe('mid2') expect(shuffledRoutes2[1].name).toBe('mid1') - - }) it('should shuffle randomly if no specified conditions', async () => { @@ -257,13 +253,12 @@ describe('Subtimeline tests', () => { const wrapper = setupapp(routes) await router.isReady() - + const shuffledRoutes = RandomizeSubTimeline(timeline.seqtimeline[1].name, router) // has to be mid1 or mid2 -- this is kind of a bad test expect(['mid1', 'mid2']).toContain(shuffledRoutes[0].name) expect(['mid1', 'mid2']).toContain(shuffledRoutes[1].name) - }) it('should shuffle the same way if given the same seed', async () => { @@ -302,19 +297,17 @@ describe('Subtimeline tests', () => { const wrapper = setupapp(routes) await router.isReady() - + const smilestore = useSmileStore() // uses the testing pinia! - + // set seed smilestore.local.seedID = 'seed_test' return RandomizeSubTimeline(timeline.seqtimeline[1].name, router) - } - - // seed gets set in RandomizeSubTimeline, so this should just always return the same thing - const shuffledRoutesArray = await Promise.all(Array(6).fill().map(doEverything)) + // seed gets set in RandomizeSubTimeline, so this should just always return the same thing + const shuffledRoutesArray = await Promise.all(Array(6).fill().map(doEverything)) // all should be identical to first element expect(shuffledRoutesArray[1]).toStrictEqual(shuffledRoutesArray[0]) @@ -322,7 +315,6 @@ describe('Subtimeline tests', () => { expect(shuffledRoutesArray[3]).toStrictEqual(shuffledRoutesArray[0]) expect(shuffledRoutesArray[4]).toStrictEqual(shuffledRoutesArray[0]) expect(shuffledRoutesArray[5]).toStrictEqual(shuffledRoutesArray[0]) - }) it('should set meta prev and next after re-ordering by conditions', async () => { @@ -347,7 +339,7 @@ describe('Subtimeline tests', () => { }) timeline.pushRandomizedTimeline({ name: subtimeline, - meta: { label: "orderCond", orders: {cond1: ["mid1", "mid2"], cond2: ["mid2", "mid1"]} } + meta: { label: 'orderCond', orders: { cond1: ['mid1', 'mid2'], cond2: ['mid2', 'mid1'] } }, }) timeline.pushSeqRoute({ @@ -364,16 +356,15 @@ describe('Subtimeline tests', () => { const smilestore = useSmileStore() // uses the testing pinia! smilestore.data.conditions.orderCond = 'cond1' - + const shuffledRoutes = RandomizeSubTimeline(timeline.seqtimeline[1].name, router) - + // find each route in router by name const newRoutes = router.getRoutes() - const firstRoute = newRoutes.find(route => route.name === 'first') - const mid1Route = newRoutes.find(route => route.name === 'mid1') - const mid2Route = newRoutes.find(route => route.name === 'mid2') - const lastRoute = newRoutes.find(route => route.name === 'last') - + const firstRoute = newRoutes.find((route) => route.name === 'first') + const mid1Route = newRoutes.find((route) => route.name === 'mid1') + const mid2Route = newRoutes.find((route) => route.name === 'mid2') + const lastRoute = newRoutes.find((route) => route.name === 'last') expect(firstRoute.meta.next).toBe('mid1') expect(mid1Route.meta.next).toBe('mid2') @@ -384,7 +375,6 @@ describe('Subtimeline tests', () => { expect(mid1Route.meta.prev).toBe('first') expect(mid2Route.meta.prev).toBe('mid1') expect(lastRoute.meta.prev).toBe('mid2') - }) it('should set meta prev and next after re-ordering by random shuffle', async () => { @@ -424,25 +414,22 @@ describe('Subtimeline tests', () => { await router.isReady() const shuffledRoutes = RandomizeSubTimeline(timeline.seqtimeline[1].name, router) - + // find each route in router by name const newRoutes = router.getRoutes() - const firstRoute = newRoutes.find(route => route.name === 'first') - const mid1Route = newRoutes.find(route => route.name === 'mid1') - const mid2Route = newRoutes.find(route => route.name === 'mid2') - const lastRoute = newRoutes.find(route => route.name === 'last') + const firstRoute = newRoutes.find((route) => route.name === 'first') + const mid1Route = newRoutes.find((route) => route.name === 'mid1') + const mid2Route = newRoutes.find((route) => route.name === 'mid2') + const lastRoute = newRoutes.find((route) => route.name === 'last') - - expect(['mid1', 'mid2']).toContain(firstRoute.meta.next) + expect(['mid1', 'mid2']).toContain(firstRoute.meta.next) expect(['mid2', 'last']).toContain(mid1Route.meta.next) expect(['mid1', 'last']).toContain(mid2Route.meta.next) expect(lastRoute.meta.next).toBe(null) expect(firstRoute.meta.prev).toBe(null) - expect(['first', 'mid2']).toContain(mid1Route.meta.prev) + expect(['first', 'mid2']).toContain(mid1Route.meta.prev) expect(['first', 'mid1']).toContain(mid2Route.meta.prev) expect(['mid1', 'mid2']).toContain(lastRoute.meta.prev) - }) - }) diff --git a/tests/vitest/timeline.test.js b/tests/vitest/timeline.test.js index f880cd4..ec57d45 100644 --- a/tests/vitest/timeline.test.js +++ b/tests/vitest/timeline.test.js @@ -192,13 +192,12 @@ describe('Timeline tests', () => { component: MockComponent, }) timeline.pushRandomizedTimeline({ - name: subtimeline + name: subtimeline, }) expect(timeline.seqtimeline.length).toBe(2) }) - it('cannot add a timeline to a timeline', () => { const MockComponent = { template: '
Mock Component
' } const timeline = new Timeline() @@ -215,7 +214,7 @@ describe('Timeline tests', () => { }) const errorTrigger = () => { timeline.pushRandomizedTimeline({ - name: timeline2 + name: timeline2, }) } expect(errorTrigger).toThrowError() @@ -237,7 +236,7 @@ describe('Timeline tests', () => { }) const errorTrigger = () => { timeline.pushRandomizedTimeline({ - name: subtimeline + name: subtimeline, }) } expect(errorTrigger).toThrowError() @@ -265,7 +264,7 @@ describe('Timeline tests', () => { component: MockComponent, }) timeline.pushRandomizedTimeline({ - name: subtimeline + name: subtimeline, }) timeline.pushSeqRoute({ @@ -288,7 +287,7 @@ describe('Timeline tests', () => { expect(timeline.seqtimeline[1].meta.prev).toBe('first') expect(timeline.seqtimeline[1].meta.next).toBe('last') }) - + it('build method should propogate specified conditions to routes when set', () => { const MockComponent = { template: '
Mock Component
' } @@ -311,7 +310,7 @@ describe('Timeline tests', () => { }) timeline.pushRandomizedTimeline({ name: subtimeline, - meta: { label: "condition", orders: {cond1: ["mid1", "mid2"], BFirst: ["mid2", "mid1"]} } + meta: { label: 'condition', orders: { cond1: ['mid1', 'mid2'], BFirst: ['mid2', 'mid1'] } }, }) timeline.pushSeqRoute({ @@ -327,7 +326,6 @@ describe('Timeline tests', () => { expect(timeline.routes[2].meta.label).toBeDefined() expect(timeline.routes[2].meta.orders).toBeDefined() - }) it('build method should correctly configure a doubly linked list', () => { diff --git a/vite.config.js b/vite.config.js index f7a08b5..24527ce 100644 --- a/vite.config.js +++ b/vite.config.js @@ -35,10 +35,7 @@ export default ({ mode }) => { strictPort: true, hmr: process.env.GITPOD_WORKSPACE_URL ? { - host: process.env.GITPOD_WORKSPACE_URL.replace( - 'https://', - `${process.env.VITE_DEV_PORT_NUM}-` - ), + host: process.env.GITPOD_WORKSPACE_URL.replace('https://', `${process.env.VITE_DEV_PORT_NUM}-`), protocol: 'wss', clientPort: 443, } From 9b5aa5e573c72467ddd94b412c23bfaf35e1b45f Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:36:14 -0500 Subject: [PATCH 13/62] initial work on presentation mode (Issue #72) - adds support for replacing the homepage in presentation mode - router allows direct navigation for all routes in presentation mode - added documentation - modified github actions for pushes on `presentation` branch --- .github/workflows/deploy.yml | 9 +++- docs/.vitepress/config.js | 1 + docs/presentation.md | 48 +++++++++++++++++++ package.json | 6 ++- .../pages/PresentationModeHomePage.vue | 22 --------- src/router.js | 15 ++++-- 6 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 docs/presentation.md diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2854b8d..95274c7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -45,7 +45,7 @@ jobs: # install node packages - name: Build css from scss run: npm run css-build - + # accesses some git variables and processes them to be lower case/short/escaped - name: Inject slug/short variables uses: rlespinasse/github-slug-action@v3.x @@ -155,7 +155,12 @@ jobs: # Build the web app - name: Build web app - run: npm run build + run: | + if [${{ env.GITHUB_REF_SLUG }} == 'presentation']; then + npm run build:present + else + npm run build + fi # make remote folder if necessar - name: create the remote folders if they don't exist diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 45c7e5a..7613588 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -36,6 +36,7 @@ export default defineConfig({ { text: '📦 Data storage', link: '/datastorage' }, { text: '👩‍💻 Developing', link: '/developing' }, { text: '🐞 Testing', link: '/testing' }, + { text: '👩‍🏫 Presentation mode', link: '/presentation' }, { text: '🧪 Lab Config', link: '/labconfig' }, ], }, diff --git a/docs/presentation.md b/docs/presentation.md new file mode 100644 index 0000000..b3e1bd2 --- /dev/null +++ b/docs/presentation.md @@ -0,0 +1,48 @@ +# :woman_teacher: Presentation Mode + +Presentation mode is a way of deploying experiments in a way that they can be used to share examples of an experiment with other people. This can be helpful in cases where you want to share a link to your experiment with readers of a paper, collaborators, or others. You can also use this mode to develop richer, interactive views of the data in your experiment as well as complete websites devoted to a paper or project. A good example of an experiment being shared in presentation mode is [here](https://exps.gureckislab.org/e/telephone-gleaming-kill/#/). + +There are two things that presentation mode enables: + +1. A colorful "landing page" that you can customize to show links to preprints/published articles, figures, and also links that let you jump between various parts of your experiment +2. It disables the control on which page/route of the experiment is shown in which order allowing you and your audience to jump around and explore different parts of the task (e.g., jump to read the instructions without first completing the consent form) + +## How to use Presentation Mode + +To run the default experiment in developer mode run + +``` +npm run dev:present +``` + +This will launch a website that looks something like this: + +![Presentation Mode](/images/presentmode.png) + +Notice that you can use the drop down "jump" menu to jump around between the parts of your experiment in this mode. + +## How to customize Presentation Mode + +To customize this presentation mode page edit the `src/components/pages/PresentationModeHomePage.vue` component. You can add +links to papers, hot link to different parts of your experiment, or add custom routes that help to visualize your data, etc... + +## How to deploy in Presentation Mode + +To deploy your project in presentation mode there are two options. The first is to create a new branch titled 'presentation' +and push this to GitHub. This will generate a special "presentation mode" deployment and you'll receive a slack notification +about when the website is ready. + +The second option is to edit `src/config.js` and change the line that reads + +``` +mode: import.meta.env.MODE, +``` + +to + +``` +mode: 'presentation', +``` + +When you next commit this change to your repo, the new site will be built in presentation mode. This can be done on any +branch. diff --git a/package.json b/package.json index 6fb7823..5574f3a 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,12 @@ "scripts": { "test": "vitest", "coverage": "vitest run --coverage", - "test-ui": "cypress open --project tests", + "test:ui": "cypress open --project tests", "dev": "vite", - "dev-live": "vite --mode production", + "dev:live": "vite --mode production", + "dev:present": "vite --mode presentation", "build": "vite build", + "build:present": "vite build --mode presentation", "preview": "vite preview", "getdata": "node scripts/download_data.mjs", "docs:dev": "vitepress dev docs", diff --git a/src/components/pages/PresentationModeHomePage.vue b/src/components/pages/PresentationModeHomePage.vue index 8ba3c34..69d96de 100644 --- a/src/components/pages/PresentationModeHomePage.vue +++ b/src/components/pages/PresentationModeHomePage.vue @@ -16,28 +16,6 @@

Use the links below to navigate to different parts of the experiment, or use the navigation bar at the top of the page.
-

- This website is set up for you to explore the experiment design for a project exploring how people help one another in real time. - If you have questions or comments, please contact the project lead Pam Osborn Popp. -

-
-

Play farm game (single-player)

-

- Try out the experimental task in a single-player format where you control both players. -

- Farm game   -
-

View real gameplay from data

-

- Watch a replay of a game that was played by two real participants. -

- Replay game   -
-

Show game environments (stimuli)

-

- See the twelve different game environments that participants play in. -

- Environments  

Start from beginning

diff --git a/src/router.js b/src/router.js index 58f7cfb..181ce06 100644 --- a/src/router.js +++ b/src/router.js @@ -11,6 +11,7 @@ import { v4 as uuidv4 } from 'uuid' // 1. Import route components import RecruitmentChooser from '@/components/pages/RecruitmentChooserPage.vue' +import PresentationModeHomePage from '@/components/pages/PresentationModeHomePage.vue' import MTurk from '@/components/pages/MTurkRecruitPage.vue' import Advertisement from '@/components/pages/AdvertisementPage.vue' import Consent from '@/components/pages/ConsentPage.vue' @@ -43,6 +44,13 @@ if (appconfig.mode === 'development') { component: RecruitmentChooser, meta: { allowDirectEntry: true }, }) +} else if (appconfig.mode === 'presentation') { + timeline.pushRoute({ + path: '/', + name: 'presentation_home', + component: PresentationModeHomePage, + meta: { allowDirectEntry: true }, + }) } else { // auto refer to the anonymous welcome page timeline.pushRoute({ @@ -214,13 +222,14 @@ function addGuards(r) { if ( to.meta.allowDirectEntry || (smilestore.config.mode === 'development' && smilestore.local.allowJumps) || + smilestore.config.mode === 'presentation' || (to.name === 'welcome_anonymous' && from.name === undefined && !smilestore.isKnownUser) ) { - if (smilestore.config.mode === 'development') { + if (smilestore.config.mode === 'development' || smilestore.config.mode === 'presentation') { console.warn( - 'WARNING: allowing direct navigation to', + 'WARNING: allowing direct, out-of-order navigation to', to.name, - '. This is allowed in development mode but not in production.' + '. This is allowed in development/presentation mode but not in production.' ) } smilestore.setLastRoute(to.name) From 44ac750ce11dc8c983493aa477a2ce63461fffa2 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:38:54 -0500 Subject: [PATCH 14/62] fixing script --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 95274c7..2f9105b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if [${{ env.GITHUB_REF_SLUG }} == 'presentation']; then + if "${{ env.GITHUB_REF_SLUG }}" == "presentation" then npm run build:present else npm run build From 18cc6ee0c214a63fb57495eb1e02be8b91d38f26 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:42:32 -0500 Subject: [PATCH 15/62] trying again (hard to debug) --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2f9105b..41f698d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ env.GITHUB_REF_SLUG }}" == "presentation" then + if "${{ github.ref }}" == "refs/heads/presentation" then npm run build:present else npm run build From 228388636d00dc393b6339867738cca43ed24038 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:42:32 -0500 Subject: [PATCH 16/62] trying again (hard to debug) --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2f9105b..94a67f9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ env.GITHUB_REF_SLUG }}" == "presentation" then + if "${{ github.ref }}" == "refs/heads/presentation" npm run build:present else npm run build From b98377f93f93f2219e91f86084674951fefbb1e9 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:44:20 -0500 Subject: [PATCH 17/62] Revert "trying again (hard to debug)" This reverts commit 228388636d00dc393b6339867738cca43ed24038. --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 94a67f9..2f9105b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ github.ref }}" == "refs/heads/presentation" + if "${{ env.GITHUB_REF_SLUG }}" == "presentation" then npm run build:present else npm run build From 0b55dee17b172a67a5c0672c84e99fc989b289b7 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:45:29 -0500 Subject: [PATCH 18/62] this? --- .github/workflows/deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 41f698d..c895076 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,8 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ github.ref }}" == "refs/heads/presentation" then + if "${{ github.ref }}" == "refs/heads/presentation" + then npm run build:present else npm run build From c78310e24a76505859ccc24a16e9c5e3e73e290e Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:46:41 -0500 Subject: [PATCH 19/62] this way? --- .github/workflows/deploy.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c895076..2a828af 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,8 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ github.ref }}" == "refs/heads/presentation" - then + if "${{ github.ref }}" == "refs/heads/presentation"; then npm run build:present else npm run build From 41b667efff6e240c9c679a95600ee2442055c69b Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 15:47:20 -0500 Subject: [PATCH 20/62] tabs? --- .github/workflows/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 2a828af..c2980c0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,11 +156,11 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ github.ref }}" == "refs/heads/presentation"; then + if "${{ github.ref }}" == "refs/heads/presentation"; then npm run build:present - else + else npm run build - fi + fi # make remote folder if necessar - name: create the remote folders if they don't exist From c20ae8fa4288c229e01c2165c870e512a3063ed3 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 21:52:08 -0500 Subject: [PATCH 21/62] present mode either way as a test --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c2980c0..e395de9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -159,7 +159,7 @@ jobs: if "${{ github.ref }}" == "refs/heads/presentation"; then npm run build:present else - npm run build + npm run build:present fi # make remote folder if necessar From a95b57eed73e3eab7eb0030eeb3cb6cef3ff0246 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 21:56:36 -0500 Subject: [PATCH 22/62] only build present mode on the presentation branch --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e395de9..c2980c0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -159,7 +159,7 @@ jobs: if "${{ github.ref }}" == "refs/heads/presentation"; then npm run build:present else - npm run build:present + npm run build fi # make remote folder if necessar From da27b9079afa03bb997d97d4ed6e246287d18fa5 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:01:57 -0500 Subject: [PATCH 23/62] command logic is still not correct --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c2980c0..b70789e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if "${{ github.ref }}" == "refs/heads/presentation"; then + if ['${{ github.ref }}'' == 'refs/heads/presentation']; then npm run build:present else npm run build From 3be97f4781e00cffd2c39c65b60e0b6a4a4c94b9 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:05:13 -0500 Subject: [PATCH 24/62] trying to get this logic correct --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b70789e..7f9d24b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -156,7 +156,7 @@ jobs: # Build the web app - name: Build web app run: | - if ['${{ github.ref }}'' == 'refs/heads/presentation']; then + if ${{ github.ref == 'refs/heads/presentation'}}; then npm run build:present else npm run build From c4794f4e7be6dab3dc45d112348cea05b11d85ec Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:15:25 -0500 Subject: [PATCH 25/62] initialize lastRoute and allowJumps --- src/stores/smiledata.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/stores/smiledata.js b/src/stores/smiledata.js index e6aa7b4..3407a80 100644 --- a/src/stores/smiledata.js +++ b/src/stores/smiledata.js @@ -11,6 +11,20 @@ import { loadDoc, fsnow, } from './firestore-db' +import { mode } from 'crypto-js' + +initLastRoute(mode) { + if (mode === 'development') { + return 'recruit' + } else if (mode === 'presentation') { + return 'presentation_home' + } + return 'landing' +} + +initAllowJumps(mode) { + return (mode === 'development' || mode === 'presentation') +} export default defineStore('smilestore', { // arrow function recommended for full type inference @@ -20,8 +34,8 @@ export default defineStore('smilestore', { { // syncs with local storage knownUser: false, - lastRoute: appconfig.mode === 'development' ? 'recruit' : 'landing', - allowJumps: appconfig.mode === 'development', + lastRoute: initLastRoute(appconfig.mode), + allowJumps: initAllowJumps(appconfig.mode), docRef: null, partNum: null, completionCode: '', From d4ba358614d57efae491a7b8c3ede9fe433b98b6 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:20:24 -0500 Subject: [PATCH 26/62] typo --- src/stores/smiledata.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/smiledata.js b/src/stores/smiledata.js index 3407a80..5a145e6 100644 --- a/src/stores/smiledata.js +++ b/src/stores/smiledata.js @@ -13,7 +13,7 @@ import { } from './firestore-db' import { mode } from 'crypto-js' -initLastRoute(mode) { +function initLastRoute(mode) { if (mode === 'development') { return 'recruit' } else if (mode === 'presentation') { @@ -22,7 +22,7 @@ initLastRoute(mode) { return 'landing' } -initAllowJumps(mode) { +function initAllowJumps(mode) { return (mode === 'development' || mode === 'presentation') } From 680458bf8cddcc8517c679e5c355693d3f06c057 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:29:42 -0500 Subject: [PATCH 27/62] presentation mode should show the config info publically --- src/router.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/router.js b/src/router.js index 181ce06..6564264 100644 --- a/src/router.js +++ b/src/router.js @@ -189,12 +189,14 @@ timeline.pushRoute({ }) // this is a special route with config/debugging information -timeline.pushRoute({ - path: '/config', - name: 'config', - component: Config, - meta: { allowDirectEntry: true }, -}) +if (appconfig.mode !== 'presentation') { + timeline.pushRoute({ + path: '/config', + name: 'config', + component: Config, + meta: { allowDirectEntry: true }, + }) +} // 3. add navigation guards // currently these check if user is known From 9449054e207913c7460045c6bfdd5a3b9290645f Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 22:53:13 -0500 Subject: [PATCH 28/62] adding screenshot to docs (Closes #72) --- docs/images/presentmode.png | Bin 0 -> 235868 bytes docs/presentation.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/images/presentmode.png diff --git a/docs/images/presentmode.png b/docs/images/presentmode.png new file mode 100644 index 0000000000000000000000000000000000000000..36316c4893412042d9e8cbaf0a5bf7f52e66c749 GIT binary patch literal 235868 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

ICE@cD}P6dYDH=MpVeF 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μNihYU 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 Mg{7b73Tb)%F9TZBB>(^b literal 0 HcmV?d00001 diff --git a/docs/presentation.md b/docs/presentation.md index b3e1bd2..f817c89 100644 --- a/docs/presentation.md +++ b/docs/presentation.md @@ -17,7 +17,8 @@ npm run dev:present This will launch a website that looks something like this: -![Presentation Mode](/images/presentmode.png) +![Presentation Mode](/images/presentmode.png) + Notice that you can use the drop down "jump" menu to jump around between the parts of your experiment in this mode. From 25a839d7db6dca245f5cbbab13a0c16a3d73aa18 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 23:00:39 -0500 Subject: [PATCH 29/62] comment about presentation mode in docs --- docs/presentation.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/presentation.md b/docs/presentation.md index f817c89..0d41e39 100644 --- a/docs/presentation.md +++ b/docs/presentation.md @@ -31,7 +31,7 @@ links to papers, hot link to different parts of your experiment, or add custom r To deploy your project in presentation mode there are two options. The first is to create a new branch titled 'presentation' and push this to GitHub. This will generate a special "presentation mode" deployment and you'll receive a slack notification -about when the website is ready. +about when the website is ready. An example from the default repo is [here](https://exps.gureckislab.org/nyuccl/smile/presentation/#/) The second option is to edit `src/config.js` and change the line that reads @@ -47,3 +47,8 @@ mode: 'presentation', When you next commit this change to your repo, the new site will be built in presentation mode. This can be done on any branch. + +### Notes + +The `/config` route is not reachable in presentation mode by default to prevent certain information being leaked publically on your website. + From 58f73547f75a9807ec0b123cde36d3ca1021b626 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Tue, 21 Nov 2023 23:11:40 -0500 Subject: [PATCH 30/62] error in default link value --- src/components/pages/PresentationModeHomePage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/pages/PresentationModeHomePage.vue b/src/components/pages/PresentationModeHomePage.vue index 69d96de..906d5fc 100644 --- a/src/components/pages/PresentationModeHomePage.vue +++ b/src/components/pages/PresentationModeHomePage.vue @@ -33,7 +33,7 @@

Try out the captcha game participants play to ensure that they are human (and that the required software loads properly in their browser).

- Captcha Game   + Captcha  

From e5171d047a02bac63ad1dbead194254bf60e72ef Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Wed, 22 Nov 2023 09:07:56 -0500 Subject: [PATCH 31/62] (untested) changes to deal with quotes in commit messages (Issue #60) --- .github/workflows/deploy.yml | 16 ++++++++++++++-- scripts/generate_git_env.sh | 12 +++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7f9d24b..cb13994 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -55,6 +55,16 @@ jobs: env: ENV_FILE: 'env/.env.git.local' run: | + escape_quotes() { + # Get the input string + input="$1" + # Escape single quotes + input="${input//\'/\'}" + # Escape double quotes + input="${input//\"/\\\"}" + # Return the escaped string + echo "$input" + } echo "------" echo "# DO NOT EDIT THIS FILE IT IS AUTOMATICALLY GENERATED" > $ENV_FILE if test -z "${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}" @@ -97,13 +107,15 @@ jobs: echo "VITE_GIT_BRANCH_NAME = ${{ env.GITHUB_REF_SLUG }}" >> $ENV_FILE VITE_GIT_BRANCH_NAME='${{ env.GITHUB_REF_SLUG }}' fi + + if test -z "${{ github.event.head_commit.message }}" then echo "VITE_GIT_LAST_MSG = (no commit message)" >> $ENV_FILE VITE_GIT_LAST_MSG='(no commit message)' else - echo "VITE_GIT_LAST_MSG = ${{ github.event.head_commit.message }}" >> $ENV_FILE - VITE_GIT_LAST_MSG='${{ github.event.head_commit.message }}' + echo "VITE_GIT_LAST_MSG = ${{ $(escape_quotes "$(github.event.head_commit.message)") }}" >> $ENV_FILE + VITE_GIT_LAST_MSG='${{ $(escape_quotes "$(github.event.head_commit.message)") }}' fi echo "VITE_DEPLOY_BASE_PATH = '/${VITE_GIT_OWNER}/${VITE_GIT_REPO_NAME}/${VITE_GIT_BRANCH_NAME}/'" >> $ENV_FILE CODENAME=$(node scripts/codenamize.js "/${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}/${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}/${{ env.GITHUB_REF_SLUG }}") diff --git a/scripts/generate_git_env.sh b/scripts/generate_git_env.sh index 3c9a7b2..49053b3 100755 --- a/scripts/generate_git_env.sh +++ b/scripts/generate_git_env.sh @@ -28,7 +28,17 @@ echo "VITE_GIT_OWNER = ${OWNER}" >> $ENV_FILE BRANCH=$(git rev-parse --abbrev-ref HEAD | tr '[:upper:]' '[:lower:]') echo "VITE_GIT_BRANCH_NAME = $BRANCH" >> $ENV_FILE -MSG=$(git log -1 --pretty=%s) +escape_quotes() { + # Get the input string + input="$1" + # Escape single quotes + input="${input//\'/\'}" + # Escape double quotes + input="${input//\"/\\\"}" + # Return the escaped string + echo "$input" +} +MSG=$(escape_quotes "$(git log -1 --pretty=%s)"); echo "VITE_GIT_LAST_MSG = $MSG" >> $ENV_FILE echo 'VITE_DEPLOY_BASE_PATH = "/${VITE_GIT_OWNER}/${VITE_GIT_REPO_NAME}/${VITE_GIT_BRANCH_NAME}/"' >> $ENV_FILE From 67093c51c96a8f739678cabbd4eeddeca0fb6df9 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Wed, 22 Nov 2023 12:24:59 -0500 Subject: [PATCH 32/62] reverting escape quotes (it is not working) (Issue #60) --- .github/workflows/deploy.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cb13994..e266226 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -107,15 +107,13 @@ jobs: echo "VITE_GIT_BRANCH_NAME = ${{ env.GITHUB_REF_SLUG }}" >> $ENV_FILE VITE_GIT_BRANCH_NAME='${{ env.GITHUB_REF_SLUG }}' fi - - if test -z "${{ github.event.head_commit.message }}" then echo "VITE_GIT_LAST_MSG = (no commit message)" >> $ENV_FILE VITE_GIT_LAST_MSG='(no commit message)' else - echo "VITE_GIT_LAST_MSG = ${{ $(escape_quotes "$(github.event.head_commit.message)") }}" >> $ENV_FILE - VITE_GIT_LAST_MSG='${{ $(escape_quotes "$(github.event.head_commit.message)") }}' + echo "VITE_GIT_LAST_MSG = ${{ github.event.head_commit.message }}" >> $ENV_FILE + VITE_GIT_LAST_MSG='${{ github.event.head_commit.message }}' fi echo "VITE_DEPLOY_BASE_PATH = '/${VITE_GIT_OWNER}/${VITE_GIT_REPO_NAME}/${VITE_GIT_BRANCH_NAME}/'" >> $ENV_FILE CODENAME=$(node scripts/codenamize.js "/${{ env.GITHUB_REPOSITORY_OWNER_PART_SLUG }}/${{ env.GITHUB_REPOSITORY_NAME_PART_SLUG }}/${{ env.GITHUB_REF_SLUG }}") From d2167dc16f6776875a03806162e2f6467593c948 Mon Sep 17 00:00:00 2001 From: todd gureckis Date: Wed, 22 Nov 2023 12:28:38 -0500 Subject: [PATCH 33/62] reorganizing consent components (Issue #78) --- docs/experimentdesign.md | 16 ++++++---------- .../{pages => consent}/ConsentPage.vue | 2 +- .../InformedConsentModal.vue | 2 +- .../{atoms => consent}/InformedConsentText.vue | 0 src/components/organisms/StatusBar.vue | 2 +- src/router.js | 2 +- 6 files changed, 10 insertions(+), 14 deletions(-) rename src/components/{pages => consent}/ConsentPage.vue (97%) rename src/components/{molecules => consent}/InformedConsentModal.vue (86%) rename src/components/{atoms => consent}/InformedConsentText.vue (100%) diff --git a/docs/experimentdesign.md b/docs/experimentdesign.md index 43dc5dc..b84fe29 100644 --- a/docs/experimentdesign.md +++ b/docs/experimentdesign.md @@ -1,6 +1,5 @@ # :artist: Designing Good Web Experiments - ``` . ├── LICENSE @@ -39,12 +38,10 @@ └── vite.config.js ``` - ## Captcha Very fast tasks, requiring human common sense, that are diverse, unpredictable, and have a large number of incorrect responses. - - view everyday photos and answer common sense reasoning question sby clicking on the image in a location (e.g., picture of two people one laughing and say "click on the happy one") 100 images @@ -54,7 +51,6 @@ an interesting image -- click on the with masks that are appropriate - move an object in a physics/phaser game to achieve something - - normal distorted text (type the word that you can see) - move a slider slowly so that it doesn't wake up a bear (too fast == wake up, beat clock on time) @@ -63,23 +59,23 @@ an interesting image -- click on the with masks that are appropriate ## Informed Consent -The text of the informed consent should be updated for each study and placed in `src/components/atoms/InformedConsentText.vue`. After participants accept the informed consent (usually the first few steps of study) they will see a button that will always be available allowing them to re-review the consent form in case they have questions. +The text of the informed consent should be updated for each study and placed in `src/components/consent/InformedConsentText.vue`. After participants accept the informed consent (usually the first few steps of study) they will see a button that will always be available allowing them to re-review the consent form in case they have questions. ## Withdraw -As part of most IRB approved protocols participants should be eligible to withdraw from a study at any time for any reason. Online this is as simple as closing the browser windows and moving onto something else. However, provides a simple way to withdraw at any time from a study. +As part of most IRB approved protocols participants should be eligible to withdraw from a study at any time for any reason. Online this is as simple as closing the browser windows and moving onto something else. However, provides a simple way to withdraw at any time from a study. ![Withdraw button](/images/withdraw.png) -When participants click this button (only appears after accepting the informed consent), then they are presented with a form with several optional questions about why they are withdrawing and also providing information about partial compensation. If a participant is eligible for partial compensation depends on several things specific to each study. When they submit this form they will be taken to a final page asking them to return the task/hit. It is the responsibility of the experimenter to monitor withdraws and to try to contact the participant. +When participants click this button (only appears after accepting the informed consent), then they are presented with a form with several optional questions about why they are withdrawing and also providing information about partial compensation. If a participant is eligible for partial compensation depends on several things specific to each study. When they submit this form they will be taken to a final page asking them to return the task/hit. It is the responsibility of the experimenter to monitor withdraws and to try to contact the participant. ## WindowSizerPage -The window sizer is a small component `src/components/pages/WindowSizerPage.vue` that will display a box with a configured size on the screen and asked the participant to adjust their browser window to that size so everything is visible. It looks like this: +The window sizer is a small component `src/components/pages/WindowSizerPage.vue` that will display a box with a configured size on the screen and asked the participant to adjust their browser window to that size so everything is visible. It looks like this: ![Window Sizer](/images/windowsizer.png) -The size of the box is configured in `env/.env` file using the `VITE_WINDOWSIZER_REQUEST` configuration option. The default value is `800x600` which means 800 pixel wide and 600 pixels tall. You can change these values as needed. In development mode you will need to restart the development server since environment files are only read once on the loading of the application. +The size of the box is configured in `env/.env` file using the `VITE_WINDOWSIZER_REQUEST` configuration option. The default value is `800x600` which means 800 pixel wide and 600 pixels tall. You can change these values as needed. In development mode you will need to restart the development server since environment files are only read once on the loading of the application. To add it to the timeline just add this in the appropriate place inside `src/router.js`; @@ -90,4 +86,4 @@ timeline.pushSeqRoute({ name: 'windowsizer', component: WindowSizer, }) -``` \ No newline at end of file +``` diff --git a/src/components/pages/ConsentPage.vue b/src/components/consent/ConsentPage.vue similarity index 97% rename from src/components/pages/ConsentPage.vue rename to src/components/consent/ConsentPage.vue index 10aef11..b232908 100644 --- a/src/components/pages/ConsentPage.vue +++ b/src/components/consent/ConsentPage.vue @@ -4,7 +4,7 @@ import { useRouter, useRoute } from 'vue-router' import useTimelineStepper from '@/composables/timelinestepper' import useSmileStore from '@/stores/smiledata' -import InformedConsentText from '@/components/atoms/InformedConsentText.vue'; +import InformedConsentText from '@/components/consent/InformedConsentText.vue'; const router = useRouter() const route = useRoute() diff --git a/src/components/molecules/InformedConsentModal.vue b/src/components/consent/InformedConsentModal.vue similarity index 86% rename from src/components/molecules/InformedConsentModal.vue rename to src/components/consent/InformedConsentModal.vue index e5dcbc9..48aa9ec 100644 --- a/src/components/molecules/InformedConsentModal.vue +++ b/src/components/consent/InformedConsentModal.vue @@ -1,5 +1,5 @@