diff --git a/.github/workflows/deploy-firebase-test-cypress.yml b/.github/workflows/deploy-firebase-test-cypress.yml index cabb95f28..724536754 100644 --- a/.github/workflows/deploy-firebase-test-cypress.yml +++ b/.github/workflows/deploy-firebase-test-cypress.yml @@ -18,8 +18,8 @@ jobs: with: node-version: 'lts/*' - name: 'vite build' - env: - NODE_OPTIONS: '--max_old_space_size=8192' + # env: + # NODE_OPTIONS: '--max_old_space_size=8192' run: npm ci && npm run build - name: Deploy to Firebase Hosting Channel id: firebase-deploy diff --git a/.github/workflows/firebase-hosting-production.yml b/.github/workflows/firebase-hosting-production.yml index ab9abd649..e2f047fe8 100644 --- a/.github/workflows/firebase-hosting-production.yml +++ b/.github/workflows/firebase-hosting-production.yml @@ -18,8 +18,8 @@ jobs: with: node-version: 'lts/*' - name: 'vite production build' - env: - NODE_OPTIONS: '--max_old_space_size=8192' + # env: + # NODE_OPTIONS: '--max_old_space_size=8192' run: npm ci && npm run build - uses: FirebaseExtended/action-hosting-deploy@v0 with: diff --git a/.github/workflows/firebase-hosting-staging.yml b/.github/workflows/firebase-hosting-staging.yml index 88ab7facb..4d241082d 100644 --- a/.github/workflows/firebase-hosting-staging.yml +++ b/.github/workflows/firebase-hosting-staging.yml @@ -15,8 +15,8 @@ jobs: with: node-version: 'lts/*' - name: 'vite staging build' - env: - NODE_OPTIONS: '--max_old_space_size=8192' + # env: + # NODE_OPTIONS: '--max_old_space_size=8192' run: export VITE_STAGING_BUILD=true && npm ci && npm run build - uses: FirebaseExtended/action-hosting-deploy@v0 with: diff --git a/README.md b/README.md index 0340b05d7..665030f9f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,17 @@ Online Assessment of Reading (ROAR) platform. If you would like to contribute to this project, please read the [contribution guide](.github/CONTRIBUTING.md). +## NPM Scripts + +The `npm run dev` and `npm run build` scripts have variants that define which +data source the dashboard will use. Scripts ending in `:live` will use +production data, while scripts ending in `:sandbox` will use development data: + +- `npm run dev` starts a development server using sandbox data. +- `npm run dev:live` starts a development server using live data. +- `npm run build` builds the project using live data. +- `npm run build:sandbox` builds the project using sandbox data. + ## Data Flow Diagram See the [ROAR/ROAD Data Flow Diagram here](https://miro.com/app/board/uXjVNY-_qDA=/?share_link_id=967374624080). diff --git a/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js b/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js index 2102c21a4..ff076fa66 100644 --- a/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js +++ b/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js @@ -18,7 +18,7 @@ describe('Test playthrough of Fluency as a participant', () => { cy.visit(`/game/fluency-arf`); // Click jspsych button to begin - cy.get('.jspsych-btn', { timeout: 5 * timeout }) + cy.get('.jspsych-btn', { timeout: 6 * timeout }) .should('be.visible') .click(); diff --git a/cypress/e2e/participant/default-tests/playPA.cy.js b/cypress/e2e/participant/default-tests/playPA.cy.js index 672841006..f051c5c48 100644 --- a/cypress/e2e/participant/default-tests/playPA.cy.js +++ b/cypress/e2e/participant/default-tests/playPA.cy.js @@ -28,7 +28,7 @@ describe('Testing playthrough of ROAR-Phoneme as a participant', () => { cy.visit('/'); cy.wait(0.2 * timeout); cy.selectAdministration(Cypress.env('testRoarAppsAdministration')); - cy.get('.tabview-nav-link-label', { timeout: 2 * timeout }) + cy.get('.tabview-nav-link-label', { timeout: 3 * timeout }) .contains('ROAR - Phoneme') .should('have.attr', 'data-game-status', 'complete'); }); diff --git a/cypress/e2e/partner-admin/default-tests/viewIndividualReport.cy.js b/cypress/e2e/partner-admin/default-tests/viewIndividualReport.cy.js index 1eda10880..58681be56 100644 --- a/cypress/e2e/partner-admin/default-tests/viewIndividualReport.cy.js +++ b/cypress/e2e/partner-admin/default-tests/viewIndividualReport.cy.js @@ -22,11 +22,11 @@ function clickScoreButton() { ); } -function checkAssignmentColumns() { +function checkAssignmentColumns(assignments) { cy.get('[data-cy="roar-data-table"] thead th').then(($header) => { const tableHeaders = $header.map((index, elem) => Cypress.$(elem).text()).get(); - testAssignments.forEach((assignment) => { + assignments.forEach((assignment) => { expect(tableHeaders).to.include(assignment); }); }); diff --git a/cypress/support/helper-functions/roar-pa/paHelpers.js b/cypress/support/helper-functions/roar-pa/paHelpers.js index 9960704b2..8bae35ea5 100644 --- a/cypress/support/helper-functions/roar-pa/paHelpers.js +++ b/cypress/support/helper-functions/roar-pa/paHelpers.js @@ -53,15 +53,15 @@ const playTrial = (targetText) => { }; function playIntro(startText) { - cy.get('.instructionCanvasNS', { timeout: 5 * timeout }) + cy.get('.instructionCanvasNS', { timeout: 6 * timeout }) .should('be.visible') .click(); - cy.get('.jspsych-btn', { timeout: 5 * timeout }) + cy.get('.jspsych-btn', { timeout: 6 * timeout }) .should('be.visible') .click(); - cy.get('.continue', { timeout: 5 * timeout }) + cy.get('.continue', { timeout: 6 * timeout }) .should('be.visible') .click(); diff --git a/cypress/support/helper-functions/roar-sre/sreHelpers.js b/cypress/support/helper-functions/roar-sre/sreHelpers.js index 67db6bf4b..f2ff0871b 100644 --- a/cypress/support/helper-functions/roar-sre/sreHelpers.js +++ b/cypress/support/helper-functions/roar-sre/sreHelpers.js @@ -20,7 +20,7 @@ export const playSRE = (administration, language, optional = false) => { .should('exist'); cy.visit(languageOptions[language].url); - cy.get('.jspsych-btn', { timeout: 5 * timeout }) + cy.get('.jspsych-btn', { timeout: 6 * timeout }) .should('be.visible') .click(); @@ -29,14 +29,14 @@ export const playSRE = (administration, language, optional = false) => { // handles error where full screen throws a permissions error cy.wait(0.2 * timeout); - cy.get('body', { timeout: 5 * timeout }).type('{enter}'); - cy.get('body', { timeout: 5 * timeout }).type('{1}'); + cy.get('body', { timeout: 6 * timeout }).type('{enter}'); + cy.get('body', { timeout: 6 * timeout }).type('{1}'); playSREGame(); // check if game completed cy.visit('/'); - cy.wait(0.2 * timeout); + cy.wait(0.3 * timeout); cy.selectAdministration(administration); if (optional) { diff --git a/cypress/support/helper-functions/roar-swr/swrHelpers.js b/cypress/support/helper-functions/roar-swr/swrHelpers.js index 7ed27b6ee..2f7aaf38e 100644 --- a/cypress/support/helper-functions/roar-swr/swrHelpers.js +++ b/cypress/support/helper-functions/roar-swr/swrHelpers.js @@ -16,7 +16,7 @@ export const playSWR = (administration, language, optional = false) => { cy.get('.p-tabview', { timeout: timeout }).contains(languageOptions[language].gameTab).should('exist'); cy.visit(languageOptions[language].url); - cy.get('.jspsych-btn', { timeout: 3 * timeout }) + cy.get('.jspsych-btn', { timeout: 6 * timeout }) .should('be.visible') .click(); diff --git a/package-lock.json b/package-lock.json index 1815091ba..cac45b966 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,13 @@ "version": "2.0.1", "dependencies": { "@bdelab/roam-fluency": "^1.11.9", - "@bdelab/roar-firekit": "^4.8.9", + "@bdelab/roar-firekit": "^4.8.10", "@bdelab/roar-letter": "^1.10.0", - "@bdelab/roar-multichoice": "^1.9.4", - "@bdelab/roar-pa": "^1.6.4", + "@bdelab/roar-multichoice": "^1.11.0", + "@bdelab/roar-pa": "^1.6.5", "@bdelab/roar-sre": "^1.13.3", "@bdelab/roar-swr": "^1.9.0", - "@bdelab/roar-utils": "^1.1.0", + "@bdelab/roar-utils": "^1.2.0", "@bdelab/roar-vocab": "^1.6.11", "@sentry/browser": "^7.107.0", "@sentry/integrations": "^7.107.0", @@ -1596,9 +1596,9 @@ } }, "node_modules/@bdelab/roar-firekit": { - "version": "4.8.9", - "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-4.8.9.tgz", - "integrity": "sha512-M6eogX/IkNq2pvNndUTvGolQ4321ALD1qkL0FlWAxdW7vjA7LpedHGezc0l1lrlBtqwvyd+BKJNcQ7jaaMzgFQ==", + "version": "4.8.10", + "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-4.8.10.tgz", + "integrity": "sha512-0jqYeX/MIsnI/tkmMgqtd1tkrjC8eyVsgAa8ouLU24ITDYgUbSbtANiy7K5SgawYTv/LKO0TfVQpVXSReF8yVw==", "dependencies": { "@bdelab/roar-firekit": "^4.1.1", "crc-32": "^1.2.2", @@ -2043,9 +2043,9 @@ } }, "node_modules/@bdelab/roar-multichoice": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@bdelab/roar-multichoice/-/roar-multichoice-1.9.4.tgz", - "integrity": "sha512-Tk1u0qTYz4F6AawLlIshIrLNO255mHhoKVq4DM4jeSJfBjY6LImc+PXdHdV/KjIWkUCbgX5o8MsEbYtVP7EJTA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@bdelab/roar-multichoice/-/roar-multichoice-1.11.0.tgz", + "integrity": "sha512-0L2Ocsqy5LWmBGMb//oS87NmhgiVlyU/VIiojNJtzgxkxNlUZ3KDFDlVOO1U77mqYGxNo3woryj3SiurkQxnUw==", "dependencies": { "@bdelab/jscat": "^4.0.0", "@bdelab/roar-firekit": "^4.7.0", @@ -2085,9 +2085,9 @@ } }, "node_modules/@bdelab/roar-pa": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@bdelab/roar-pa/-/roar-pa-1.6.4.tgz", - "integrity": "sha512-jm+NYvmRZPNcuMZCV0Jc4V+TyiyDQ0qs5SLKOkI104A4wj7ndRYOz+IsZfBxs1RdA+Xk05aMoS7y4mCbUHGG2w==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@bdelab/roar-pa/-/roar-pa-1.6.5.tgz", + "integrity": "sha512-EnMF9u/Eo8stdvVlQiGX4EtoFNyT9fNSvGyhRYwgN5bY7wPmOR0OliiXM+Z7mg557LRBY7/BUvu0IS3EDTZzzA==", "dependencies": { "@babel/core": "^7.19.0", "@babel/preset-env": "^7.19.0", @@ -3609,9 +3609,9 @@ } }, "node_modules/@bdelab/roar-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@bdelab/roar-utils/-/roar-utils-1.1.0.tgz", - "integrity": "sha512-XF/eSN81cdvYd9D4d8Q5Cl2Wsx9uUtgRNUCPTBw29qytiDGFIv+J62WseOsoCOl6IbYLZwsWhREu6vCvpqzO9g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@bdelab/roar-utils/-/roar-utils-1.2.0.tgz", + "integrity": "sha512-39/2mCeGFKfAcNZ4hx4Gr+Qdi9yYiL28SkBOVqvCalQoI0OI/GN/4D2x8xmv0iVfSvTHfZw1HyeAIRpFDTRH1Q==", "dependencies": { "@jspsych/plugin-preload": "^1.1.2", "detect-it": "^4.0.1", @@ -27098,9 +27098,9 @@ } }, "@bdelab/roar-firekit": { - "version": "4.8.9", - "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-4.8.9.tgz", - "integrity": "sha512-M6eogX/IkNq2pvNndUTvGolQ4321ALD1qkL0FlWAxdW7vjA7LpedHGezc0l1lrlBtqwvyd+BKJNcQ7jaaMzgFQ==", + "version": "4.8.10", + "resolved": "https://registry.npmjs.org/@bdelab/roar-firekit/-/roar-firekit-4.8.10.tgz", + "integrity": "sha512-0jqYeX/MIsnI/tkmMgqtd1tkrjC8eyVsgAa8ouLU24ITDYgUbSbtANiy7K5SgawYTv/LKO0TfVQpVXSReF8yVw==", "requires": { "@bdelab/roar-firekit": "^4.1.1", "crc-32": "^1.2.2", @@ -27444,9 +27444,9 @@ } }, "@bdelab/roar-multichoice": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@bdelab/roar-multichoice/-/roar-multichoice-1.9.4.tgz", - "integrity": "sha512-Tk1u0qTYz4F6AawLlIshIrLNO255mHhoKVq4DM4jeSJfBjY6LImc+PXdHdV/KjIWkUCbgX5o8MsEbYtVP7EJTA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@bdelab/roar-multichoice/-/roar-multichoice-1.11.0.tgz", + "integrity": "sha512-0L2Ocsqy5LWmBGMb//oS87NmhgiVlyU/VIiojNJtzgxkxNlUZ3KDFDlVOO1U77mqYGxNo3woryj3SiurkQxnUw==", "requires": { "@bdelab/jscat": "^4.0.0", "@bdelab/roar-firekit": "^4.7.0", @@ -27486,9 +27486,9 @@ } }, "@bdelab/roar-pa": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@bdelab/roar-pa/-/roar-pa-1.6.4.tgz", - "integrity": "sha512-jm+NYvmRZPNcuMZCV0Jc4V+TyiyDQ0qs5SLKOkI104A4wj7ndRYOz+IsZfBxs1RdA+Xk05aMoS7y4mCbUHGG2w==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@bdelab/roar-pa/-/roar-pa-1.6.5.tgz", + "integrity": "sha512-EnMF9u/Eo8stdvVlQiGX4EtoFNyT9fNSvGyhRYwgN5bY7wPmOR0OliiXM+Z7mg557LRBY7/BUvu0IS3EDTZzzA==", "requires": { "@babel/core": "^7.19.0", "@babel/preset-env": "^7.19.0", @@ -28710,9 +28710,9 @@ } }, "@bdelab/roar-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@bdelab/roar-utils/-/roar-utils-1.1.0.tgz", - "integrity": "sha512-XF/eSN81cdvYd9D4d8Q5Cl2Wsx9uUtgRNUCPTBw29qytiDGFIv+J62WseOsoCOl6IbYLZwsWhREu6vCvpqzO9g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@bdelab/roar-utils/-/roar-utils-1.2.0.tgz", + "integrity": "sha512-39/2mCeGFKfAcNZ4hx4Gr+Qdi9yYiL28SkBOVqvCalQoI0OI/GN/4D2x8xmv0iVfSvTHfZw1HyeAIRpFDTRH1Q==", "requires": { "@jspsych/plugin-preload": "^1.1.2", "detect-it": "^4.0.1", diff --git a/package.json b/package.json index 17960b645..32bed3c3e 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,11 @@ "private": true, "version": "2.0.1", "scripts": { - "build": "vite build", + "build": "export VITE_FIREBASE_DATA_SOURCE=live && vite build", + "build:sandbox": "export VITE_FIREBASE_DATA_SOURCE=sandbox && vite build", "build:levante": "vite build -m LEVANTE", - "dev": "vite --force --host", + "dev": "export VITE_FIREBASE_DATA_SOURCE=sandbox && vite --force --host", + "dev:live": "export VITE_FIREBASE_DATA_SOURCE=live && vite --force --host", "dev:levante": "vite --force --host -m LEVANTE", "dev:emulate": "export VITE_FIREBASE_EMULATOR=true && vite --force --host", "emulate:admin": "source firebase/emulate_admin.sh", @@ -25,13 +27,13 @@ }, "dependencies": { "@bdelab/roam-fluency": "^1.11.9", - "@bdelab/roar-firekit": "^4.8.9", + "@bdelab/roar-firekit": "^4.8.10", "@bdelab/roar-letter": "^1.10.0", - "@bdelab/roar-multichoice": "^1.9.4", - "@bdelab/roar-pa": "^1.6.4", + "@bdelab/roar-multichoice": "^1.11.0", + "@bdelab/roar-pa": "^1.6.5", "@bdelab/roar-sre": "^1.13.3", "@bdelab/roar-swr": "^1.9.0", - "@bdelab/roar-utils": "^1.1.0", + "@bdelab/roar-utils": "^1.2.0", "@bdelab/roar-vocab": "^1.6.11", "@sentry/browser": "^7.107.0", "@sentry/integrations": "^7.107.0", diff --git a/roar-firebase-functions b/roar-firebase-functions index 49a443103..0f66270d4 160000 --- a/roar-firebase-functions +++ b/roar-firebase-functions @@ -1 +1 @@ -Subproject commit 49a443103198ba6ad9f5b2b5b30f186cdb7cb74c +Subproject commit 0f66270d4742226d8ef08f69c01174888becbc1c diff --git a/src/assets/styles/root/base.scss b/src/assets/styles/root/base.scss index 0642a1fc4..d9fb5104b 100644 --- a/src/assets/styles/root/base.scss +++ b/src/assets/styles/root/base.scss @@ -12,6 +12,20 @@ body { -moz-osx-font-smoothing: grayscale; } +// Sentry feedback widget +#sentry-feedback { + max-width: fit-content; + opacity: 0.85; + --bottom: 1rem; + --left: 1rem; + --border: 1px solid var(--primary-color); + --background-hover: var(--red-100); + --submit-border: var(--primary-color); + --submit-background: var(--primary-color); + --submit-background-hover: var(--primary-color-hover); + --cancel-background-hover: var(--red-100); +} + // Placeholder ::-webkit-input-placeholder { color: var(--text-color-secondary); diff --git a/src/components/ConsentModal.vue b/src/components/ConsentModal.vue index f9dde82db..de11e28c5 100644 --- a/src/components/ConsentModal.vue +++ b/src/components/ConsentModal.vue @@ -17,8 +17,10 @@ import { useConfirm } from 'primevue/useconfirm'; import { useToast } from 'primevue/usetoast'; import { marked } from 'marked'; import { useAuthStore } from '@/store/auth'; +import { useI18n } from 'vue-i18n'; const authStore = useAuthStore(); +const i18n = useI18n(); const props = defineProps({ consentText: { type: String, require: true, default: 'Text Here' }, @@ -28,6 +30,7 @@ const consentHeader = { tos: 'Terms of Service', consent: 'Consent', assent: 'Assent', + 'assent-es': 'Asentimiento', }; const emit = defineEmits(['accepted', 'delayed']); @@ -45,15 +48,19 @@ onMounted(() => { const delayPromise = delay(8000); confirm.require({ group: 'templating', - header: `${consentHeader[props.consentType]} Form`, + header: props.consentType.includes('-es') + ? `Formulario de ${consentHeader[props.consentType]}` + : `${consentHeader[props.consentType]} Form`, icon: 'pi pi-question-circle', - acceptLabel: 'Continue', + acceptLabel: i18n.t('consentModal.acceptButton'), acceptIcon: 'pi pi-check', accept: async () => { toast.add({ severity: 'info', - summary: 'Confirmed', - detail: `${consentHeader[props.consentType]} status updated.`, + summary: i18n.t('consentModal.toastHeader'), + detail: props.consentType.includes('-es') + ? `Estado de ${consentHeader[props.consentType]} actualizado` + : `${consentHeader[props.consentType]} status updated.`, life: 3000, }); emit('accepted'); diff --git a/src/components/GameTabs.vue b/src/components/GameTabs.vue index c104e3872..792513143 100644 --- a/src/components/GameTabs.vue +++ b/src/components/GameTabs.vue @@ -72,7 +72,7 @@ diff --git a/src/components/tasks/TaskSWR.vue b/src/components/tasks/TaskSWR.vue index 2d2a6d78d..ae1d68b87 100644 --- a/src/components/tasks/TaskSWR.vue +++ b/src/components/tasks/TaskSWR.vue @@ -6,8 +6,7 @@