diff --git a/.github/workflows/cypress-participant-tests.yml b/.github/workflows/cypress-participant-tests.yml
index 12b85f993..710069e64 100644
--- a/.github/workflows/cypress-participant-tests.yml
+++ b/.github/workflows/cypress-participant-tests.yml
@@ -20,6 +20,8 @@ jobs:
env:
NODE_OPTIONS: '--max_old_space_size=8192'
NODE_ENV: 'test'
+ CLEVER_USERNAME: ${{ secrets.CLEVER_USERNAME }}
+ CLEVER_PASSWORD: ${{ secrets.CLEVER_PASSWORD }}
CYPRESS_BASE_URL: 'http://localhost:5173'
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
COMMIT_INFO_MESSAGE: Tests for PR ${{ github.event.number }} "${{ github.event.pull_request.title }}" from commit "${{ github.event.pull_request.head.sha }}"
diff --git a/cypress.config.js b/cypress.config.js
index 8ac0452e0..d27f4be15 100644
--- a/cypress.config.js
+++ b/cypress.config.js
@@ -33,6 +33,10 @@ module.exports = defineConfig({
participantPassword: process.env.PARTICIPANT_PASSWORD,
participantEmail: process.env.PARTICIPANT_EMAIL,
participantEmailPassword: process.env.PARTICIPANT_EMAIL_PASSWORD,
+ cleverOAuthLink: 'https://clever.com/oauth/authorize',
+ cleverSchoolName: '61e8aee84cf0e71b14295d45',
+ cleverUsername: process.env.CLEVER_USERNAME,
+ cleverPassword: process.env.CLEVER_PASSWORD,
testAdministrationName: 'Cypress Test Administration',
testAdministrationId: 'kKUSypkMc36mPEzleDE6',
testAdministratorFirstName: 'Cypress Test Administrator First Name',
@@ -80,7 +84,7 @@ module.exports = defineConfig({
testRoarAppsAdministration: 'Cypress Test Roar Apps Administration',
testRoarAppsAdministrationId: 'K8UaI8p79Dntj5Z2CJk8',
testOptionalRoarAppsAdministration: 'Cypress Test Optional Roar Apps Administration',
- testOptionalRoarAppsAdministrationId: '',
+ testOptionalRoarAppsAdministrationId: 'Fuy4nQaMu6YmfNg1eBYH',
testSpanishRoarAppsAdministration: 'Cypress Test Spanish Roar Apps Administration',
testSpanishRoarAppsAdministrationId: '',
// Generate a list of test users CypressTestStudent0, CypressTestStudent1, ..., CypressTestStudent50
diff --git a/cypress/e2e/participant/default-tests/checkLegalDoc.cy.js b/cypress/e2e/participant/default-tests/checkLegalDoc.cy.js
index df396ad85..59eb9521a 100644
--- a/cypress/e2e/participant/default-tests/checkLegalDoc.cy.js
+++ b/cypress/e2e/participant/default-tests/checkLegalDoc.cy.js
@@ -1,3 +1,5 @@
+export const timeout = Cypress.env('timeout');
+
describe('Test to maintain that assent form shows in when signing in with an un-assented user', () => {
it('passes', () => {
// this is a user that has an assignment of roarVocab -- how can we create a user that can
@@ -8,7 +10,7 @@ describe('Test to maintain that assent form shows in when signing in with an un-
cy.login(test_login, test_pw);
cy.visit('/');
cy.wait(1000);
- cy.get('.p-dialog-title').contains('CONSENT FORM').should('be.visible');
+ cy.get('.p-dialog-title', { timeout: timeout }).contains('CONSENT FORM').should('be.visible');
cy.get('.p-confirm-dialog-accept').contains('Continue').should('be.visible');
});
});
diff --git a/cypress/e2e/participant/default-tests/cleverSignIn.cy.js b/cypress/e2e/participant/default-tests/cleverSignIn.cy.js
new file mode 100644
index 000000000..9d53834fe
--- /dev/null
+++ b/cypress/e2e/participant/default-tests/cleverSignIn.cy.js
@@ -0,0 +1,12 @@
+import { signInWithClever } from '../../../support/helper-functions/participant/participant-helpers';
+
+export const timeout = Cypress.env('timeout');
+
+describe('Cypress test to login in Clever', () => {
+ it('passes', () => {
+ cy.visit('/');
+ signInWithClever();
+
+ cy.contains('tasks completed!', { timeout: 2 * timeout }).should('be.visible');
+ });
+});
diff --git a/cypress/e2e/participant/default-tests/playCVA.cy.js b/cypress/e2e/participant/default-tests/playCVA.cy.js
index 628caf4d4..cf7f055f6 100644
--- a/cypress/e2e/participant/default-tests/playCVA.cy.js
+++ b/cypress/e2e/participant/default-tests/playCVA.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-multichoice';
describe('ROAR - Written Vocabulary Playthrough', () => {
- it('Plays CVA', () => {
+ it('Plays CVA with username/password combo', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playWrittenVocabulary();
+ playWrittenVocabulary({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays CVA with Clever auth', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playWrittenVocabulary({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js b/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js
index b6c27afc4..783c4b436 100644
--- a/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js
+++ b/cypress/e2e/participant/default-tests/playFluency-ARF.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roam-fluency';
describe('Test playthrough of Fluency as a participant', () => {
- it('Fluency Playthrough Test', () => {
+ it('Fluency Playthrough Test with username/password authentication', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playFluencyARF();
+ playFluencyARF({ auth: 'username' });
+ }
+ });
+ });
+ it('Fluency Playthrough Test with Clever authentication', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playFluencyARF({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playFluency-CALF.cy.js b/cypress/e2e/participant/default-tests/playFluency-CALF.cy.js
index 85656b488..079b9ff58 100644
--- a/cypress/e2e/participant/default-tests/playFluency-CALF.cy.js
+++ b/cypress/e2e/participant/default-tests/playFluency-CALF.cy.js
@@ -3,14 +3,24 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roam-fluency';
-describe('Test playthrough of Fluency as a participant', () => {
+describe('Test playthrough of Fluency as a participant using username authentication', () => {
it('Fluency Playthrough Test', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playFluencyCALF();
+ playFluencyCALF({ auth: 'username' });
+ }
+ });
+ });
+ it('Fluency Playthrough Test using Clever authentication', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playFluencyCALF({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playLetter.cy.js b/cypress/e2e/participant/default-tests/playLetter.cy.js
index 3394853b7..c942a2539 100644
--- a/cypress/e2e/participant/default-tests/playLetter.cy.js
+++ b/cypress/e2e/participant/default-tests/playLetter.cy.js
@@ -3,14 +3,24 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-letter';
-describe('ROAR - Letra Play Through', () => {
- it('Plays Letra', () => {
+describe('ROAR - Letter Play Through using username authentication', () => {
+ it('Plays Letter with username authentication', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playLetter();
+ playLetter({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays Letter with Clever authentication', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playLetter({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playMorphology.cy.js b/cypress/e2e/participant/default-tests/playMorphology.cy.js
index 279ee5a45..e4ff7d39f 100644
--- a/cypress/e2e/participant/default-tests/playMorphology.cy.js
+++ b/cypress/e2e/participant/default-tests/playMorphology.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-multichoice';
describe('ROAR - Written Vocabulary Play Through', () => {
- it('Plays Written Vocabulary', () => {
+ it('Plays Written Vocabulary with username/password auth', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playMorphology();
+ playMorphology({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays Written Vocabulary with Clever auth', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playMorphology({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playPA.cy.js b/cypress/e2e/participant/default-tests/playPA.cy.js
index 09c1a7d64..ee4b2ebc3 100644
--- a/cypress/e2e/participant/default-tests/playPA.cy.js
+++ b/cypress/e2e/participant/default-tests/playPA.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-pa';
describe('Testing playthrough of ROAR-Phoneme as a participant', () => {
- it(`ROAR-Phoneme Playthrough Test`, () => {
+ it(`ROAR-Phoneme Playthrough Test with username auth`, () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playPA();
+ playPA({ auth: 'username' });
+ }
+ });
+ });
+ it(`ROAR-Phoneme Playthrough Test with Clever auth`, () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playPA({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playSRE.cy.js b/cypress/e2e/participant/default-tests/playSRE.cy.js
index 5cce3aace..2efbdcc39 100644
--- a/cypress/e2e/participant/default-tests/playSRE.cy.js
+++ b/cypress/e2e/participant/default-tests/playSRE.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-sre';
describe('ROAR - Sentence Play Through', () => {
- it('Plays SRE', () => {
+ it('Plays SRE with username auth', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playSRE();
+ playSRE({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays SRE with Clever auth', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSRE({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playSWR.cy.js b/cypress/e2e/participant/default-tests/playSWR.cy.js
index 4c4dcf040..f3de5e3c8 100644
--- a/cypress/e2e/participant/default-tests/playSWR.cy.js
+++ b/cypress/e2e/participant/default-tests/playSWR.cy.js
@@ -4,13 +4,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-swr';
describe('ROAR - Word Play Through', () => {
- it('Plays Word', () => {
+ it('Plays Word with username auth', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playSWR();
+ playSWR({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays Word with Clever auth', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSWR({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playSyntax.cy.js b/cypress/e2e/participant/default-tests/playSyntax.cy.js
index a6d2b850f..345366a46 100644
--- a/cypress/e2e/participant/default-tests/playSyntax.cy.js
+++ b/cypress/e2e/participant/default-tests/playSyntax.cy.js
@@ -5,13 +5,13 @@ const app = 'core-tasks';
const administration = 'Cypress Test Roar Syntax';
describe('ROAR - Syntax Play Through', () => {
- it('Plays the Roar Syntax/Core Tasks Game', () => {
+ it('Plays the Roar Syntax/Core Tasks Game with username auth', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playSyntax({ administration: administration });
+ playSyntax({ administration: administration, auth: 'username' });
}
});
});
diff --git a/cypress/e2e/participant/default-tests/playVocab.cy.js b/cypress/e2e/participant/default-tests/playVocab.cy.js
index f5a428294..657e3f579 100644
--- a/cypress/e2e/participant/default-tests/playVocab.cy.js
+++ b/cypress/e2e/participant/default-tests/playVocab.cy.js
@@ -3,13 +3,23 @@ import { isCurrentVersion } from '../../../support/utils';
const app = '@bdelab/roar-vocab';
describe('ROAR - Vocabulary Play Through', () => {
- it('Plays Vocabulary', () => {
+ it('Plays Vocabulary with username auth', () => {
cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
if (isCurrentVersion) {
cy.log(`Did not detect a new version of ${app}, skipping test.`);
} else {
cy.log(`Detected a new version of ${app}, running test.`);
- playVocabulary();
+ playVocabulary({ auth: 'username' });
+ }
+ });
+ });
+ it('Plays Vocabulary with Clever auth', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playVocabulary({ auth: 'clever' });
}
});
});
diff --git a/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-3G.cy.js b/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-3G.cy.js
new file mode 100644
index 000000000..66a5378cf
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-3G.cy.js
@@ -0,0 +1,17 @@
+import { playFluencyCALF } from '../../../../support/helper-functions/roam-fluency/fluencyHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roam-fluency';
+
+describe('Test playthrough of Fluency-CALF as a participant in a simulate 3G connection', () => {
+ it('Fluency Playthrough Test', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playFluencyCALF({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-HighLatency.cy.js
new file mode 100644
index 000000000..66a5378cf
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roam-fluency/playFluency-CALF-HighLatency.cy.js
@@ -0,0 +1,17 @@
+import { playFluencyCALF } from '../../../../support/helper-functions/roam-fluency/fluencyHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roam-fluency';
+
+describe('Test playthrough of Fluency-CALF as a participant in a simulate 3G connection', () => {
+ it('Fluency Playthrough Test', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playFluencyCALF({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-letter/playLetter-3G.cy.js b/cypress/e2e/participant/network-tests/roar-letter/playLetter-3G.cy.js
new file mode 100644
index 000000000..ed27163d4
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-letter/playLetter-3G.cy.js
@@ -0,0 +1,17 @@
+import { playLetter } from '../../../../support/helper-functions/roar-letter/letterHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-letter';
+
+describe('ROAR - Letter Play Through using username authentication', () => {
+ it('Plays Letter with username authentication in a simulated 3g connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playLetter({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-letter/playLetter-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-letter/playLetter-HighLatency.cy.js
new file mode 100644
index 000000000..86afa686e
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-letter/playLetter-HighLatency.cy.js
@@ -0,0 +1,17 @@
+import { playLetter } from '../../../../support/helper-functions/roar-letter/letterHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-letter';
+
+describe('ROAR - Letter Play Through using username authentication', () => {
+ it('Plays Letter with username authentication in a simulated high latency network', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playLetter({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-3G.cy copy.js b/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-3G.cy copy.js
new file mode 100644
index 000000000..3a8f559b5
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-3G.cy copy.js
@@ -0,0 +1,17 @@
+import { playMorphology } from '../../../../support/helper-functions/roar-multichoice/multichoiceHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-multichoice';
+
+describe('ROAR - Written Vocabulary Play Through', () => {
+ it('Plays Written Vocabulary with a simulated 3g network', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playMorphology({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-HighLatency.cy.js
new file mode 100644
index 000000000..035f59be3
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-morphology/playMorphology-HighLatency.cy.js
@@ -0,0 +1,17 @@
+import { playMorphology } from '../../../../support/helper-functions/roar-multichoice/multichoiceHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-multichoice';
+
+describe('ROAR - Written Vocabulary Play Through', () => {
+ it('Plays Written Vocabulary with a simulated high latency connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playMorphology({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-pa/playPA-2G.cy.js b/cypress/e2e/participant/network-tests/roar-pa/playPA-2G.cy.js
new file mode 100644
index 000000000..c221f499a
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-pa/playPA-2G.cy.js
@@ -0,0 +1,17 @@
+import { playPA } from '../../../../support/helper-functions/roar-pa/paHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-pa';
+
+describe('Testing playthrough of ROAR-Phoneme as a participant with a simulated 3g connection', () => {
+ it(`ROAR-Phoneme Playthrough Test with username auth`, () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playPA({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-pa/playPA-3G.cy.js b/cypress/e2e/participant/network-tests/roar-pa/playPA-3G.cy.js
new file mode 100644
index 000000000..c221f499a
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-pa/playPA-3G.cy.js
@@ -0,0 +1,17 @@
+import { playPA } from '../../../../support/helper-functions/roar-pa/paHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-pa';
+
+describe('Testing playthrough of ROAR-Phoneme as a participant with a simulated 3g connection', () => {
+ it(`ROAR-Phoneme Playthrough Test with username auth`, () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playPA({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-pa/playPA-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-pa/playPA-HighLatency.cy.js
new file mode 100644
index 000000000..e12f219ab
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-pa/playPA-HighLatency.cy.js
@@ -0,0 +1,17 @@
+import { playPA } from '../../../../support/helper-functions/roar-pa/paHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-pa';
+
+describe('Testing playthrough of ROAR-Phoneme as a participant with a simulated high latency connection', () => {
+ it(`ROAR-Phoneme Playthrough Test with username auth`, () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playPA({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-sre/playSRE-2G.cy.js b/cypress/e2e/participant/network-tests/roar-sre/playSRE-2G.cy.js
new file mode 100644
index 000000000..1d5afa28d
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-sre/playSRE-2G.cy.js
@@ -0,0 +1,17 @@
+import { playSRE } from '../../../../support/helper-functions/roar-sre/sreHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-sre';
+
+describe('ROAR - Sentence Play Through', () => {
+ it('Plays SRE with a simulated 3g connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSRE({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-sre/playSRE-3G.cy.js b/cypress/e2e/participant/network-tests/roar-sre/playSRE-3G.cy.js
new file mode 100644
index 000000000..1d5afa28d
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-sre/playSRE-3G.cy.js
@@ -0,0 +1,17 @@
+import { playSRE } from '../../../../support/helper-functions/roar-sre/sreHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-sre';
+
+describe('ROAR - Sentence Play Through', () => {
+ it('Plays SRE with a simulated 3g connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSRE({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-sre/playSRE-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-sre/playSRE-HighLatency.cy.js
new file mode 100644
index 000000000..1d328ba25
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-sre/playSRE-HighLatency.cy.js
@@ -0,0 +1,17 @@
+import { playSRE } from '../../../../support/helper-functions/roar-sre/sreHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-sre';
+
+describe('ROAR - Sentence Play Through', () => {
+ it('Plays SRE with a simulated high latency connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSRE({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-3G.cy.js b/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-3G.cy.js
new file mode 100644
index 000000000..f9f8915c4
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-3G.cy.js
@@ -0,0 +1,18 @@
+import { playSyntax } from '../../../../support/helper-functions/roar-syntax/syntaxHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = 'core-tasks';
+const administration = 'Cypress Test Roar Syntax';
+
+describe('ROAR - Syntax Play Through', () => {
+ it('Plays the Roar Syntax/Core Tasks Game with a simulated 3g connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSyntax({ administration: administration, auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-HighLatency.cy.js
new file mode 100644
index 000000000..9572113db
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-syntax/playSyntax-HighLatency.cy.js
@@ -0,0 +1,18 @@
+import { playSyntax } from '../../../../support/helper-functions/roar-syntax/syntaxHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = 'core-tasks';
+const administration = 'Cypress Test Roar Syntax';
+
+describe('ROAR - Syntax Play Through', () => {
+ it('Plays the Roar Syntax/Core Tasks Game in a simulated high latency network', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playSyntax({ administration: administration, auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-vocab/playVocab-3G.cy.js b/cypress/e2e/participant/network-tests/roar-vocab/playVocab-3G.cy.js
new file mode 100644
index 000000000..46905ae89
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-vocab/playVocab-3G.cy.js
@@ -0,0 +1,16 @@
+import { playVocabulary } from '../../../../support/helper-functions/roar-vocab/vocabHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-vocab';
+describe('ROAR - Vocabulary Play Through', () => {
+ it('Plays Vocabulary with a simulated 3g connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playVocabulary({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/participant/network-tests/roar-vocab/playVocab-HighLatency.cy.js b/cypress/e2e/participant/network-tests/roar-vocab/playVocab-HighLatency.cy.js
new file mode 100644
index 000000000..954f812cb
--- /dev/null
+++ b/cypress/e2e/participant/network-tests/roar-vocab/playVocab-HighLatency.cy.js
@@ -0,0 +1,16 @@
+import { playVocabulary } from '../../../../support/helper-functions/roar-vocab/vocabHelpers';
+import { isCurrentVersion } from '../../../../support/utils';
+
+const app = '@bdelab/roar-vocab';
+describe('ROAR - Vocabulary Play Through', () => {
+ it('Plays Vocabulary with a simulated high latency connection', () => {
+ cy.wrap(isCurrentVersion(app)).then((isCurrentVersion) => {
+ if (isCurrentVersion) {
+ cy.log(`Did not detect a new version of ${app}, skipping test.`);
+ } else {
+ cy.log(`Detected a new version of ${app}, running test.`);
+ playVocabulary({ auth: 'username' });
+ }
+ });
+ });
+});
diff --git a/cypress/e2e/partner-admin/default-tests/testProgressReportFiltering.spec.cy.js b/cypress/e2e/partner-admin/default-tests/testProgressReportFiltering.spec.cy.js
index 3e98d574e..2d56f22fc 100644
--- a/cypress/e2e/partner-admin/default-tests/testProgressReportFiltering.spec.cy.js
+++ b/cypress/e2e/partner-admin/default-tests/testProgressReportFiltering.spec.cy.js
@@ -34,6 +34,7 @@ function setFilterBySchool(school) {
function setFilterByGrade(grade) {
cy.get('[data-cy="filter-by-grade"]', { timeout: timeout }).click();
cy.get('ul > li', { timeout: timeout }).contains(grade).click();
+ cy.get('body').type('{esc}');
cy.wait(0.05 * timeout);
}
@@ -41,6 +42,7 @@ function setFilterByProgressCategory(header, category) {
cy.contains('div.p-column-header-content', header).find('button').click();
cy.get('[data-cy="progress-filter-dropdown"]', { timeout: timeout }).click();
cy.get('ul>li').find('.p-tag-value', { timeout: timeout }).contains(category).click();
+ // Click off the dropdown to prevent it from hiding other elements
cy.get('button').contains('Apply').click();
cy.wait(0.05 * timeout);
}
diff --git a/cypress/e2e/super-admin/default-tests/create-administrations/editAdministration.cy.js b/cypress/e2e/super-admin/default-tests/create-administrations/editAdministration.cy.js
new file mode 100644
index 000000000..4c9236cdc
--- /dev/null
+++ b/cypress/e2e/super-admin/default-tests/create-administrations/editAdministration.cy.js
@@ -0,0 +1,70 @@
+const timeout = Cypress.env('timeout');
+const administrationId = Cypress.env('testOptionalRoarAppsAdministrationId');
+const newAssignedCondition = ['studentData.grade', 'LESS_THAN', '2'];
+const newOptionalCondition = ['studentData.grade', 'GREATER_THAN', '4'];
+
+function clickEditButton() {
+ cy.get('[data-cy="button-edit-variant"]', { timeout: timeout }).first().click();
+}
+
+function clickMakeOptionalForAllSwitch() {
+ cy.get('[data-cy="switch-optional-for-everyone"]', { timeout: timeout }).click();
+}
+
+function editAssignedConditions() {
+ cy.get('[data-cy="button-assigned-condition"]', { timeout: timeout }).click();
+ cy.get('[data-cy="dropdown-assigned-field"]', { timeout: timeout }).find('.p-dropdown-trigger').click();
+ cy.get('ul > li').contains('studentData.grade').click();
+ cy.get('[data-cy="dropdown-assigned-operator"]', { timeout: timeout }).click();
+ cy.get('ul > li').contains('Less Than').click();
+ cy.get('[data-cy="assigned-value-content"]', { timeout: timeout }).type('2');
+ cy.get('.p-row-editor-save', { timeout: Cypress.env('timeout') }).click();
+}
+
+function editOptionalConditions() {
+ cy.get('[data-cy="button-optional-condition"]', { timeout: timeout }).click();
+ cy.get('[data-cy="dropdown-optional-field"]', { timeout: timeout }).find('.p-dropdown-trigger').click();
+ cy.get('ul > li').contains('studentData.grade').click();
+ cy.get('[data-cy="dropdown-optional-operator"]', { timeout: timeout }).click();
+ cy.get('ul > li').contains('Greater Than').click();
+ cy.get('[data-cy="optional-value-content"]', { timeout: timeout }).type('4');
+ cy.get('.p-row-editor-save', { timeout: Cypress.env('timeout') }).click();
+}
+
+function saveConditions() {
+ cy.get('[data-cy="button-save-conditions"]', { timeout: timeout }).click();
+}
+
+function checkNewConditions() {
+ clickEditButton();
+ for (const condition of newAssignedCondition) {
+ cy.log(`Checking for assigned condition: ${condition}.`);
+ cy.get('.p-editable-column', { timeout: timeout }).contains(condition).should('exist');
+ cy.log(`Assigned condition: ${condition} found.`);
+ }
+ for (const condition of newOptionalCondition) {
+ cy.log(`Checking for optional condition: ${condition}.`);
+ cy.get('.p-editable-column', { timeout: timeout }).contains(condition).should('exist');
+ cy.log(`Optional condition: ${condition} found.`);
+ }
+ cy.log('Found all new conditions.');
+}
+
+describe('The admin user can edit the conditions of an administration.', () => {
+ it(
+ 'Logs into the dashboard, navigates to the Create Administrations component,' +
+ 'edits an existing administration, and checks the fields for the appropriate changes..',
+ () => {
+ cy.login(Cypress.env('superAdminUsername'), Cypress.env('superAdminPassword'));
+ cy.navigateTo('/');
+ cy.wait(0.3 * timeout);
+ cy.navigateTo(`/edit-administration/${administrationId}/`);
+ clickEditButton();
+ clickMakeOptionalForAllSwitch();
+ editAssignedConditions();
+ editOptionalConditions();
+ saveConditions();
+ checkNewConditions();
+ },
+ );
+});
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index dea69a031..aa3658ab5 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -93,18 +93,12 @@ Cypress.Commands.add(
},
);
-Cypress.Commands.add('activateAdminSidebar', () => {
- cy.get('[data-cy="button-admin-sidebar"]').click();
- cy.wait(1000);
-});
-
Cypress.Commands.add('selectAdministration', function selectAdministration(testAdministration, retries = 0) {
cy.log(`'Selecting administration: ${testAdministration}, attempt: ${retries + 1}`);
if (retries > 3) {
cy.log('Retries exceeded, administration not found, exiting test...');
return;
}
-
cy.get('[data-cy="dropdown-select-administration"]', { timeout: 2 * Cypress.env('timeout') }).click();
cy.get('body', { timeout: 2 * Cypress.env('timeout') })
.invoke('text')
diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js
index b732af71b..471f77047 100644
--- a/cypress/support/e2e.js
+++ b/cypress/support/e2e.js
@@ -75,7 +75,7 @@ beforeEach(() => {
},
(req) => {
req.on('response', (res) => {
- res.setDelay(2000); // 2 seconds delay
+ res.setDelay(800); // 800ms delay
});
},
).as('High Latency Network');
diff --git a/cypress/support/helper-functions/participant/participant-helpers.js b/cypress/support/helper-functions/participant/participant-helpers.js
new file mode 100644
index 000000000..6bbe7fc25
--- /dev/null
+++ b/cypress/support/helper-functions/participant/participant-helpers.js
@@ -0,0 +1,20 @@
+export const timeout = Cypress.env('timeout');
+
+export function signInWithClever() {
+ cy.wait(0.2 * timeout);
+ cy.get('button', { timeout: timeout }).contains('Clever').click();
+
+ cy.origin(Cypress.env('cleverOAuthLink'), () => {
+ cy.get('input[title="School name"]', { timeout: 60000 }).type(Cypress.env('cleverSchoolName'));
+ cy.get('ul > li').contains(Cypress.env('cleverSchoolName')).click();
+
+ // Find the username input field and input the username
+ cy.get('input#username').type(Cypress.env('cleverUsername'));
+
+ // Input password
+ cy.get('input#password').type(Cypress.env('cleverPassword'));
+
+ // Click the login button
+ cy.get('button#UsernamePasswordForm--loginButton').click();
+ });
+}
diff --git a/cypress/support/helper-functions/roam-fluency/fluencyHelpers.js b/cypress/support/helper-functions/roam-fluency/fluencyHelpers.js
index 0a4670e48..feea891f5 100644
--- a/cypress/support/helper-functions/roam-fluency/fluencyHelpers.js
+++ b/cypress/support/helper-functions/roam-fluency/fluencyHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
const participantId = '123456789';
@@ -158,13 +159,19 @@ export function playFluencyARF({
optional = false,
endText = 'You are all done.',
continueText = null,
+ auth = 'username',
} = {}) {
Cypress.on('uncaught:exception', () => {
return false;
});
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/');
+ if (auth === 'clever') {
+ signInWithClever();
+ } else if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/');
+ }
cy.selectAdministration(administration);
@@ -193,13 +200,19 @@ export function playFluencyCALF({
optional = false,
endText = 'You are all done.',
continueText = null,
+ auth = 'username',
} = {}) {
Cypress.on('uncaught:exception', () => {
return false;
});
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/');
+ if (auth === 'clever') {
+ signInWithClever();
+ } else if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/');
+ }
cy.selectAdministration(administration);
diff --git a/cypress/support/helper-functions/roar-letter/letterHelpers.js b/cypress/support/helper-functions/roar-letter/letterHelpers.js
index 6f9fe67ce..9ed6ce3dc 100644
--- a/cypress/support/helper-functions/roar-letter/letterHelpers.js
+++ b/cypress/support/helper-functions/roar-letter/letterHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -35,11 +36,17 @@ function makeChoiceOrContinue(gameCompleteText) {
});
}
-export function startGame(administration, language, optional) {
+export function startGame(administration, language, optional, auth) {
Cypress.on('uncaught:exception', () => false);
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
-
cy.visit('/', { timeout: 2 * timeout });
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ }
+ if (auth === 'clever') {
+ signInWithClever();
+ }
+
cy.selectAdministration(administration);
if (optional) {
@@ -66,8 +73,9 @@ export function playLetter({
language = 'en',
gameCompleteText = 'Congratulations',
optional = false,
+ auth = 'username',
} = {}) {
- startGame(administration, language, optional);
+ startGame(administration, language, optional, auth);
makeChoiceOrContinue(gameCompleteText);
cy.log('Game finished successfully.');
diff --git a/cypress/support/helper-functions/roar-multichoice/multichoiceHelpers.js b/cypress/support/helper-functions/roar-multichoice/multichoiceHelpers.js
index af022eb2d..9a9327aca 100644
--- a/cypress/support/helper-functions/roar-multichoice/multichoiceHelpers.js
+++ b/cypress/support/helper-functions/roar-multichoice/multichoiceHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -35,11 +36,16 @@ function makeChoiceOrContinue(gameCompleteText) {
});
}
-export function startGame(administration, language, optional, task) {
+export function startGame(administration, language, optional, task, auth) {
Cypress.on('uncaught:exception', () => false);
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
-
cy.visit('/', { timeout: 2 * timeout });
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ } else {
+ signInWithClever();
+ }
+
cy.selectAdministration(administration);
if (optional) {
@@ -67,8 +73,9 @@ export function playMorphology({
optional = false,
task = 'morphology',
gameCompleteText = "You're all done",
+ auth = 'username',
} = {}) {
- startGame(administration, language, optional, task);
+ startGame(administration, language, optional, task, auth);
makeChoiceOrContinue(gameCompleteText);
cy.log('Game finished successfully.');
@@ -91,8 +98,9 @@ export function playWrittenVocabulary({
optional = false,
task = 'cva',
gameCompleteText = "You're all done",
+ auth = 'username',
} = {}) {
- startGame(administration, language, optional, task);
+ startGame(administration, language, optional, task, auth);
makeChoiceOrContinue(gameCompleteText);
cy.log('Game finished successfully.');
diff --git a/cypress/support/helper-functions/roar-pa/paHelpers.js b/cypress/support/helper-functions/roar-pa/paHelpers.js
index 4dd796244..53e622064 100644
--- a/cypress/support/helper-functions/roar-pa/paHelpers.js
+++ b/cypress/support/helper-functions/roar-pa/paHelpers.js
@@ -1,3 +1,5 @@
+import { signInWithClever } from '../participant/participant-helpers';
+
export const timeout = Cypress.env('timeout');
function handleFullScreenError() {
@@ -124,9 +126,16 @@ export function playPA({
endText2: 'I have been swimming so much',
endText3: 'You have helped me and all my friends!',
},
+ auth = 'username',
} = {}) {
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/');
+ if (auth === 'clever') {
+ signInWithClever();
+ }
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/');
+ }
cy.selectAdministration(administration);
diff --git a/cypress/support/helper-functions/roar-sre/sreHelpers.js b/cypress/support/helper-functions/roar-sre/sreHelpers.js
index 2de27b98a..6a72fb57f 100644
--- a/cypress/support/helper-functions/roar-sre/sreHelpers.js
+++ b/cypress/support/helper-functions/roar-sre/sreHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -6,13 +7,19 @@ export const playSRE = ({
administration = Cypress.env('testRoarAppsAdministration'),
language = 'en',
optional = false,
+ auth = 'username',
} = {}) => {
Cypress.on('uncaught:exception', () => {
return false;
});
-
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/', { timeout: 2 * timeout });
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ }
+ if (auth === 'clever') {
+ signInWithClever();
+ }
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 534ddeb45..0ace4157a 100644
--- a/cypress/support/helper-functions/roar-swr/swrHelpers.js
+++ b/cypress/support/helper-functions/roar-swr/swrHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -6,11 +7,18 @@ export const playSWR = ({
administration = Cypress.env('testRoarAppsAdministration'),
language = 'en',
optional = false,
+ auth = 'username',
} = {}) => {
// Log in once at the beginning of the test case that calls playSWR
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ }
+ if (auth === 'clever') {
+ cy.visit('/', { timeout: 2 * timeout });
+ signInWithClever();
+ }
- cy.visit('/', { timeout: 2 * timeout });
cy.selectAdministration(administration);
if (optional) {
diff --git a/cypress/support/helper-functions/roar-syntax/syntaxHelpers.js b/cypress/support/helper-functions/roar-syntax/syntaxHelpers.js
index 96e1b374d..70ea51d89 100644
--- a/cypress/support/helper-functions/roar-syntax/syntaxHelpers.js
+++ b/cypress/support/helper-functions/roar-syntax/syntaxHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -35,11 +36,17 @@ function makeChoiceOrContinue(gameCompleteText) {
});
}
-function startGame(administration, language, optional, task) {
+function startGame(administration, language, optional, task, auth) {
Cypress.on('uncaught:exception', () => false);
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/', { timeout: 2 * timeout });
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ }
+ if (auth === 'clever') {
+ signInWithClever();
+ }
cy.selectAdministration(administration);
if (optional) {
@@ -80,8 +87,9 @@ export function playSyntax({
optional = false,
task = 'syntax',
gameCompleteText = "You've completed the game",
+ auth = 'username',
} = {}) {
- startGame(administration, language, optional, task);
+ startGame(administration, language, optional, task, auth);
playIntro();
diff --git a/cypress/support/helper-functions/roar-vocab/vocabHelpers.js b/cypress/support/helper-functions/roar-vocab/vocabHelpers.js
index cb89c4248..5ece82a30 100644
--- a/cypress/support/helper-functions/roar-vocab/vocabHelpers.js
+++ b/cypress/support/helper-functions/roar-vocab/vocabHelpers.js
@@ -1,4 +1,5 @@
import { languageOptions } from './languageOptions';
+import { signInWithClever } from '../participant/participant-helpers';
const timeout = Cypress.env('timeout');
@@ -36,14 +37,21 @@ function selectAlienAvatar() {
.click();
}
-function startGame(administration, language, optional) {
+function startGame(administration, language, optional, auth) {
cy.wait(0.1 * timeout);
Cypress.on('uncaught:exception', () => {
return false;
});
- cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
cy.visit('/', { timeout: 2 * timeout });
+ if (auth === 'username') {
+ cy.login(Cypress.env('participantUsername'), Cypress.env('participantPassword'));
+ cy.visit('/', { timeout: 2 * timeout });
+ }
+ if (auth === 'clever') {
+ signInWithClever();
+ }
+
cy.selectAdministration(administration);
if (optional) {
@@ -65,8 +73,9 @@ export function playVocabulary({
language = 'en',
gameCompleteText = 'We’ve all learned so much!',
optional = false,
+ auth = 'username',
} = {}) {
- startGame(administration, language, optional);
+ startGame(administration, language, optional, auth);
makeChoiceOrContinue(gameCompleteText);
diff --git a/firebase/admin/firestore.rules b/firebase/admin/firestore.rules
index 512167e2b..284b25c27 100644
--- a/firebase/admin/firestore.rules
+++ b/firebase/admin/firestore.rules
@@ -59,6 +59,14 @@ service cloud.firestore {
allow write: if false;
}
+ // Allow all users to get the activationCodes
+ // Allow no users to write the activationCodes
+ match /activationCodes/{code} {
+ allow get: if true;
+ allow list: if false;
+ allow write: if false;
+ }
+
// Allow users to read their own data
// Also allow admins to read and write data for their users
match /users/{uid} {
diff --git a/package-lock.json b/package-lock.json
index a3d7188f6..8491397c1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "roar-dashboard",
- "version": "2.7.14",
+ "version": "2.8.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "roar-dashboard",
- "version": "2.7.14",
+ "version": "2.8.0",
"dependencies": {
"@bdelab/roam-fluency": "1.11.24",
"@bdelab/roar-firekit": "^7.1.0",
diff --git a/package.json b/package.json
index 315c7ec33..e44b378cc 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "roar-dashboard",
"private": true,
- "version": "2.7.14",
+ "version": "2.8.0",
"scripts": {
"build": "export VITE_FIREBASE_DATA_SOURCE=live && vite build",
"build:sandbox": "export VITE_FIREBASE_DATA_SOURCE=sandbox && vite build",
diff --git a/roar-firebase-functions b/roar-firebase-functions
index 5e11c458f..d2602d4a9 160000
--- a/roar-firebase-functions
+++ b/roar-firebase-functions
@@ -1 +1 @@
-Subproject commit 5e11c458f901e95dae21bb636cf41aa3a2f9c3c8
+Subproject commit d2602d4a986f60f5094f871fdefc17bc6ad522b6
diff --git a/src/assets/styles/components/chips.scss b/src/assets/styles/components/chips.scss
deleted file mode 100644
index 714ee9c44..000000000
--- a/src/assets/styles/components/chips.scss
+++ /dev/null
@@ -1,75 +0,0 @@
-.p-chip {
- background-color: var(--surface-d);
- color: var(--text-color);
- border-radius: 16px;
- padding: 0 var(--inline-spacing-larger);
-
- .p-chip-text {
- line-height: 1.5;
- margin-top: var(--border-radius);
- margin-bottom: var(--border-radius);
- }
- .p-chip-icon {
- margin-right: var(--inline-spacing);
- }
- img {
- width: 2.25rem;
- height: 2.25rem;
- margin-left: -var(--inline-spacing-larger);
- margin-right: var(--inline-spacing);
- }
- .p-chip-remove-icon {
- margin-left: var(--inline-spacing);
- border-radius: var(--border-radius);
- transition: none;
- &:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px var(--indigo-500);
- }
- }
-}
-
-.p-chips {
- .p-chips-multiple-container {
- padding: var(--border-radius) var(--inline-spacing-larger);
- }
- .p-chips-multiple-container .p-chips-token {
- padding: var(--border-radius) var(--inline-spacing-larger);
- margin-right: var(--inline-spacing);
- background: var(--surface-d);
- color: var(--text-color);
- border-radius: 16px;
- }
- .p-chips-multiple-container .p-chips-token.p-focus {
- background: var(--surface-300);
- color: var(--text-color);
- }
- .p-chips-multiple-container .p-chips-token .p-chips-token-icon {
- margin-left: var(--inline-spacing);
- }
- .p-chips-multiple-container .p-chips-input-token {
- padding: var(--border-radius) 0;
- }
- .p-chips-multiple-container .p-chips-input-token input {
- font-size: 1rem;
- color: var(--text-color);
- padding: 0;
- margin: 0;
- }
-
- &.p-invalid.p-component > .p-inputtext {
- border-color: var(--red-100);
- }
-}
-
-// Not disabled
-.p-chips:not(.p-disabled):hover .p-chips-multiple-container {
- border-color: var(--surface-300);
-}
-.p-chips:not(.p-disabled).p-focus .p-chips-multiple-container {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px var(--indigo-500);
- border-color: var(--primary-color);
-}
diff --git a/src/assets/styles/components/colorpicker.scss b/src/assets/styles/components/colorpicker.scss
deleted file mode 100644
index 6eadf4b90..000000000
--- a/src/assets/styles/components/colorpicker.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.p-colorpicker-preview {
- width: 2rem;
- height: 2rem;
-}
-
-.p-colorpicker-panel {
- background: var(--surface-800);
- border: 1px solid var(--surface-900);
-}
-.p-colorpicker-panel .p-colorpicker-color-handle,
-.p-colorpicker-panel .p-colorpicker-hue-handle {
- border-color: var(--surface-a);
-}
-
-.p-colorpicker-overlay-panel {
- box-shadow:
- 0 0 #0000,
- 0 0 #0000,
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
-}
diff --git a/src/assets/styles/components/multiselect.scss b/src/assets/styles/components/multiselect.scss
index c8a05ff1c..635536b6d 100644
--- a/src/assets/styles/components/multiselect.scss
+++ b/src/assets/styles/components/multiselect.scss
@@ -20,16 +20,7 @@
.p-multiselect .p-multiselect-label.p-placeholder {
color: var(--text-color-secondary);
}
-.p-multiselect.p-multiselect-chip .p-multiselect-token {
- padding: var(--border-radius) var(--inline-spacing-larger);
- margin-right: var(--inline-spacing);
- background: var(--surface-d);
- color: var(--text-color);
- border-radius: 16px;
-}
-.p-multiselect.p-multiselect-chip .p-multiselect-token .p-multiselect-token-icon {
- margin-left: var(--inline-spacing);
-}
+
.p-multiselect .p-multiselect-trigger {
background: transparent;
color: var(--text-color-secondary);
@@ -41,10 +32,6 @@
border-color: var(--red-100);
}
-.p-inputwrapper-filled.p-multiselect.p-multiselect-chip .p-multiselect-label {
- padding: var(--border-radius) var(--inline-spacing-larger);
-}
-
.p-multiselect-panel {
background: var(--surface-a);
color: var(--text-color);
diff --git a/src/assets/styles/components/radiobutton.scss b/src/assets/styles/components/radiobutton.scss
deleted file mode 100644
index 03329d914..000000000
--- a/src/assets/styles/components/radiobutton.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-.p-radiobutton {
- width: 16px;
- height: 16px;
-}
-.p-radiobutton .p-radiobutton-box {
- border: 2px solid var(--surface-300);
- background: var(--surface-a);
- width: 16px;
- height: 16px;
- color: var(--text-color);
- border-radius: 50%;
- transition: none;
-}
-.p-radiobutton .p-radiobutton-box:not(.p-disabled):not(.p-highlight):hover {
- border-color: var(--surface-300);
-}
-.p-radiobutton .p-radiobutton-box:not(.p-disabled).p-focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px var(--indigo-500);
- border-color: var(--primary-color);
-}
-.p-radiobutton .p-radiobutton-box .p-radiobutton-icon {
- width: 6px;
- height: 6px;
- transition-duration: 0.2s;
- background-color: var(--surface-a);
-}
-.p-radiobutton .p-radiobutton-box.p-highlight {
- border-color: var(--primary-color);
- background: var(--primary-color);
-}
-.p-radiobutton .p-radiobutton-box.p-highlight:not(.p-disabled):hover {
- border-color: var(--primary-color);
- background: var(--primary-color);
- color: var(--surface-a);
-}
-.p-radiobutton.p-invalid > .p-radiobutton-box {
- border-color: var(--red-100);
-}
-.p-radiobutton:focus {
- outline: 0 none;
-}
-
-.p-input-filled .p-radiobutton .p-radiobutton-box {
- background-color: var(--surface-b);
-}
-.p-input-filled .p-radiobutton .p-radiobutton-box:not(.p-disabled):hover {
- background-color: var(--surface-b);
-}
-.p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight {
- background: var(--primary-color);
-}
-.p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight:not(.p-disabled):hover {
- background: var(--primary-color);
-}
diff --git a/src/assets/styles/components/slider.scss b/src/assets/styles/components/slider.scss
deleted file mode 100644
index 713cec8dd..000000000
--- a/src/assets/styles/components/slider.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-.p-slider {
- background: var(--surface-d);
- border: 0 none;
- border-radius: var(--border-radius);
-}
-.p-slider.p-slider-horizontal {
- height: 0.286rem;
-}
-.p-slider.p-slider-horizontal .p-slider-handle {
- margin-top: -0.5715rem;
- margin-left: -0.5715rem;
-}
-.p-slider.p-slider-vertical {
- width: 0.286rem;
-}
-.p-slider.p-slider-vertical .p-slider-handle {
- margin-left: -0.5715rem;
- margin-bottom: -0.5715rem;
-}
-.p-slider .p-slider-handle {
- height: 1.143rem;
- width: 1.143rem;
- background: var(--surface-a);
- border: 2px solid var(--primary-color);
- border-radius: 50%;
- transition: none;
-}
-.p-slider .p-slider-handle:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px var(--indigo-500);
-}
-.p-slider .p-slider-range {
- background: var(--primary-color);
-}
-.p-slider:not(.p-disabled) .p-slider-handle:hover {
- background: var(--primary-color);
- border-color: var(--primary-color);
-}
diff --git a/src/assets/styles/components/treeselect.scss b/src/assets/styles/components/treeselect.scss
deleted file mode 100644
index 52882a09d..000000000
--- a/src/assets/styles/components/treeselect.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-.p-treeselect {
- background: var(--surface-a);
- border: 1px solid var(--surface-300);
- transition: none;
- border-radius: var(--border-radius);
-}
-.p-treeselect:not(.p-disabled):hover {
- border-color: var(--surface-300);
-}
-.p-treeselect:not(.p-disabled).p-focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px var(--indigo-500);
- border-color: var(--primary-color);
-}
-.p-treeselect .p-treeselect-label {
- padding: var(--inline-spacing-larger) var(--inline-spacing-larger);
- transition: none;
-}
-.p-treeselect .p-treeselect-label.p-placeholder {
- color: var(--text-color-secondary);
-}
-.p-treeselect.p-treeselect-chip .p-treeselect-token {
- padding: var(--border-radius) var(--inline-spacing-larger);
- margin-right: var(--inline-spacing);
- background: var(--surface-d);
- color: var(--text-color);
- border-radius: 16px;
-}
-.p-treeselect .p-treeselect-trigger {
- background: transparent;
- color: var(--text-color-secondary);
- width: 3rem;
- border-top-right-radius: var(--border-radius);
- border-bottom-right-radius: var(--border-radius);
-}
-.p-treeselect.p-invalid.p-component {
- border-color: var(--red-100);
-}
-
-.p-inputwrapper-filled.p-treeselect.p-treeselect-chip .p-treeselect-label {
- padding: var(--border-radius) var(--inline-spacing-larger);
-}
-
-.p-treeselect-panel {
- background: var(--surface-a);
- color: var(--text-color);
- border: 0 none;
- border-radius: var(--border-radius);
- box-shadow:
- 0 0 #0000,
- 0 0 #0000,
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
-}
-.p-treeselect-panel .p-treeselect-items-wrapper .p-tree {
- border: 0 none;
-}
-.p-treeselect-panel .p-treeselect-items-wrapper .p-treeselect-empty-message {
- padding: var(--inline-spacing-larger) 1rem;
- color: var(--text-color);
- background: transparent;
-}
-
-.p-input-filled .p-treeselect {
- background: var(--surface-b);
-}
-.p-input-filled .p-treeselect:not(.p-disabled):hover {
- background-color: var(--surface-b);
-}
-.p-input-filled .p-treeselect:not(.p-disabled).p-focus {
- background-color: var(--surface-a);
-}
diff --git a/src/assets/styles/theme.css b/src/assets/styles/theme.css
index 231584864..ae02cd733 100644
--- a/src/assets/styles/theme.css
+++ b/src/assets/styles/theme.css
@@ -342,351 +342,6 @@
border-color: #f0a9a7;
}
-.p-datepicker {
- padding: 0.5rem;
- background: #ffffff;
- color: #3f3f46;
- border: 1px solid #d4d4d8;
- border-radius: 0.375rem;
-}
-
-.p-datepicker:not(.p-datepicker-inline) {
- background: #ffffff;
- border: 0 none;
- box-shadow:
- 0 0 #0000,
- 0 0 #0000,
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
-}
-
-.p-datepicker:not(.p-datepicker-inline) .p-datepicker-header {
- background: #ffffff;
-}
-
-.p-datepicker .p-datepicker-header {
- padding: 0.5rem;
- color: #3f3f46;
- background: #ffffff;
- font-weight: 600;
- margin: 0;
- border-bottom: 1px solid #e5e7eb;
- border-top-right-radius: 0.375rem;
- border-top-left-radius: 0.375rem;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-prev,
-.p-datepicker .p-datepicker-header .p-datepicker-next {
- width: 2rem;
- height: 2rem;
- color: #71717a;
- border: 0 none;
- background: transparent;
- border-radius: 50%;
- transition: none;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-prev:enabled:hover,
-.p-datepicker .p-datepicker-header .p-datepicker-next:enabled:hover {
- color: #18181b;
- border-color: transparent;
- background: #f4f4f5;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-prev:focus,
-.p-datepicker .p-datepicker-header .p-datepicker-next:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-title {
- line-height: 2rem;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,
-.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month {
- color: #3f3f46;
- transition: none;
- font-weight: 600;
- padding: 0.5rem;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year:enabled:hover,
-.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month:enabled:hover {
- color: #8c1515;
-}
-
-.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month {
- margin-right: 0.5rem;
-}
-
-.p-datepicker table {
- font-size: 1rem;
- margin: 0.5rem 0;
-}
-
-.p-datepicker table th {
- padding: 0.5rem;
-}
-
-.p-datepicker table th > span {
- width: 2.5rem;
- height: 2.5rem;
-}
-
-.p-datepicker table td {
- padding: 0.5rem;
-}
-
-.p-datepicker table td > span {
- width: 2.5rem;
- height: 2.5rem;
- border-radius: 50%;
- transition: none;
- border: 1px solid transparent;
-}
-
-.p-datepicker table td > span.p-highlight {
- color: #312e81;
- background: #eef2ff;
-}
-
-.p-datepicker table td > span:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-datepicker table td.p-datepicker-today > span {
- background: #d4d4d8;
- color: #3f3f46;
- border-color: transparent;
-}
-
-.p-datepicker table td.p-datepicker-today > span.p-highlight {
- color: #312e81;
- background: #eef2ff;
-}
-
-.p-datepicker .p-datepicker-buttonbar {
- padding: 1rem 0;
- border-top: 1px solid #f3f4f6;
-}
-
-.p-datepicker .p-timepicker {
- border-top: 1px solid #f3f4f6;
- padding: 0.5rem;
-}
-
-.p-datepicker .p-timepicker button {
- width: 2rem;
- height: 2rem;
- color: #71717a;
- border: 0 none;
- background: transparent;
- border-radius: 50%;
- transition: none;
-}
-
-.p-datepicker .p-timepicker button:enabled:hover {
- color: #18181b;
- border-color: transparent;
- background: #f4f4f5;
-}
-
-.p-datepicker .p-timepicker button:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-datepicker .p-timepicker button:last-child {
- margin-top: 0.2em;
-}
-
-.p-datepicker .p-timepicker span {
- font-size: 1.25rem;
-}
-
-.p-datepicker .p-timepicker > div {
- padding: 0 0.5rem;
-}
-
-.p-datepicker.p-datepicker-timeonly .p-timepicker {
- border-top: 0 none;
-}
-
-.p-datepicker .p-monthpicker {
- margin: 0.5rem 0;
-}
-
-.p-datepicker .p-monthpicker .p-monthpicker-month {
- padding: 0.5rem;
- transition: none;
- border-radius: 0.375rem;
-}
-
-.p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight {
- color: #312e81;
- background: #eef2ff;
-}
-
-.p-datepicker .p-yearpicker {
- margin: 0.5rem 0;
-}
-
-.p-datepicker .p-yearpicker .p-yearpicker-year {
- padding: 0.5rem;
- transition: none;
- border-radius: 0.375rem;
-}
-
-.p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight {
- color: #312e81;
- background: #eef2ff;
-}
-
-.p-datepicker.p-datepicker-multiple-month .p-datepicker-group {
- border-left: 1px solid #f3f4f6;
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- padding-top: 0;
- padding-bottom: 0;
-}
-
-.p-datepicker.p-datepicker-multiple-month .p-datepicker-group:first-child {
- padding-left: 0;
- border-left: 0 none;
-}
-
-.p-datepicker.p-datepicker-multiple-month .p-datepicker-group:last-child {
- padding-right: 0;
-}
-
-.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):hover {
- background: #f4f4f5;
-}
-
-.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):not(.p-highlight):hover {
- background: #f4f4f5;
-}
-
-.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):not(.p-highlight):hover {
- background: #f4f4f5;
-}
-
-.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-@media screen and (max-width: 769px) {
- .p-datepicker table th,
- .p-datepicker table td {
- padding: 0;
- }
-}
-
-.p-chips:not(.p-disabled):hover .p-chips-multiple-container {
- border-color: #d4d4d8;
-}
-
-.p-chips:not(.p-disabled).p-focus .p-chips-multiple-container {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
- border-color: #8c1515;
-}
-
-.p-chips .p-chips-multiple-container {
- padding: 0.375rem 0.75rem;
-}
-
-.p-chips .p-chips-multiple-container .p-chips-token {
- padding: 0.375rem 0.75rem;
- margin-right: 0.5rem;
- background: #e5e7eb;
- color: #3f3f46;
- border-radius: 16px;
-}
-
-.p-chips .p-chips-multiple-container .p-chips-token.p-focus {
- background: #d4d4d8;
- color: #3f3f46;
-}
-
-.p-chips .p-chips-multiple-container .p-chips-token .p-chips-token-icon {
- margin-left: 0.5rem;
-}
-
-.p-chips .p-chips-multiple-container .p-chips-input-token {
- padding: 0.375rem 0;
-}
-
-.p-chips .p-chips-multiple-container .p-chips-input-token input {
- font-family:
- Inter,
- ui-sans-serif,
- system-ui,
- -apple-system,
- BlinkMacSystemFont,
- 'Segoe UI',
- Roboto,
- 'Helvetica Neue',
- Arial,
- 'Noto Sans',
- sans-serif,
- 'Apple Color Emoji',
- 'Segoe UI Emoji',
- 'Segoe UI Symbol',
- 'Noto Color Emoji';
- font-size: 1rem;
- color: #3f3f46;
- padding: 0;
- margin: 0;
-}
-
-.p-chips.p-invalid.p-component > .p-inputtext {
- border-color: #f0a9a7;
-}
-
-.p-colorpicker-preview {
- width: 2rem;
- height: 2rem;
-}
-
-.p-colorpicker-panel {
- background: #27272a;
- border: 1px solid #18181b;
-}
-
-.p-colorpicker-panel .p-colorpicker-color-handle,
-.p-colorpicker-panel .p-colorpicker-hue-handle {
- border-color: #ffffff;
-}
-
-.p-colorpicker-overlay-panel {
- box-shadow:
- 0 0 #0000,
- 0 0 #0000,
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
-}
-
.p-dropdown {
background: #ffffff;
border: 1px solid #d4d4d8;
@@ -1039,48 +694,6 @@
height: 1.75rem;
}
-.p-inputswitch .p-inputswitch-slider {
- background: #d4d4d8;
- transition: none;
- border-radius: 30px;
-}
-
-.p-inputswitch .p-inputswitch-slider:before {
- background: #ffffff;
- width: 1.25rem;
- height: 1.25rem;
- left: 0.25rem;
- margin-top: -0.625rem;
- border-radius: 50%;
- transition-duration: 0.2s;
-}
-
-.p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before {
- transform: translateX(1.25rem);
-}
-
-.p-inputswitch.p-focus .p-inputswitch-slider {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-inputswitch:not(.p-disabled):hover .p-inputswitch-slider {
- background: #bebec4;
-}
-
-.p-inputswitch.p-inputswitch-checked .p-inputswitch-slider {
- background: #8c1515;
-}
-
-.p-inputswitch.p-inputswitch-checked .p-inputswitch-slider:before {
- background: #ffffff;
-}
-
-.p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider {
- background: #4338ca;
-}
-
.p-inputswitch.p-invalid {
border-color: #f0a9a7;
}
@@ -1319,18 +932,6 @@
color: #71717a;
}
-.p-multiselect.p-multiselect-chip .p-multiselect-token {
- padding: 0.375rem 0.75rem;
- margin-right: 0.5rem;
- background: #e5e7eb;
- color: #3f3f46;
- border-radius: 16px;
-}
-
-.p-multiselect.p-multiselect-chip .p-multiselect-token .p-multiselect-token-icon {
- margin-left: 0.5rem;
-}
-
.p-multiselect .p-multiselect-trigger {
background: transparent;
color: #71717a;
@@ -1343,10 +944,6 @@
border-color: #f0a9a7;
}
-.p-inputwrapper-filled.p-multiselect.p-multiselect-chip .p-multiselect-label {
- padding: 0.375rem 0.75rem;
-}
-
.p-multiselect-panel {
background: #ffffff;
color: #3f3f46;
@@ -1494,206 +1091,6 @@
background: #22c55e;
}
-.p-radiobutton {
- width: 16px;
- height: 16px;
-}
-
-.p-radiobutton .p-radiobutton-box {
- border: 2px solid #d4d4d8;
- background: #ffffff;
- width: 16px;
- height: 16px;
- color: #3f3f46;
- border-radius: 50%;
- transition: none;
-}
-
-.p-radiobutton .p-radiobutton-box:not(.p-disabled):not(.p-highlight):hover {
- border-color: #d4d4d8;
-}
-
-.p-radiobutton .p-radiobutton-box:not(.p-disabled).p-focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
- border-color: #8c1515;
-}
-
-.p-radiobutton .p-radiobutton-box .p-radiobutton-icon {
- width: 6px;
- height: 6px;
- transition-duration: 0.2s;
- background-color: #ffffff;
-}
-
-.p-radiobutton .p-radiobutton-box.p-highlight {
- border-color: #8c1515;
- background: #8c1515;
-}
-
-.p-radiobutton .p-radiobutton-box.p-highlight:not(.p-disabled):hover {
- border-color: #8c1515;
- background: #8c1515;
- color: #ffffff;
-}
-
-.p-radiobutton.p-invalid > .p-radiobutton-box {
- border-color: #f0a9a7;
-}
-
-.p-radiobutton:focus {
- outline: 0 none;
-}
-
-.p-input-filled .p-radiobutton .p-radiobutton-box {
- background-color: #fafafa;
-}
-
-.p-input-filled .p-radiobutton .p-radiobutton-box:not(.p-disabled):hover {
- background-color: #fafafa;
-}
-
-.p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight {
- background: #8c1515;
-}
-
-.p-input-filled .p-radiobutton .p-radiobutton-box.p-highlight:not(.p-disabled):hover {
- background: #8c1515;
-}
-
-.p-slider {
- background: #e5e7eb;
- border: 0 none;
- border-radius: 0.375rem;
-}
-
-.p-slider.p-slider-horizontal {
- height: 0.286rem;
-}
-
-.p-slider.p-slider-horizontal .p-slider-handle {
- margin-top: -0.5715rem;
- margin-left: -0.5715rem;
-}
-
-.p-slider.p-slider-vertical {
- width: 0.286rem;
-}
-
-.p-slider.p-slider-vertical .p-slider-handle {
- margin-left: -0.5715rem;
- margin-bottom: -0.5715rem;
-}
-
-.p-slider .p-slider-handle {
- height: 1.143rem;
- width: 1.143rem;
- background: #ffffff;
- border: 2px solid #8c1515;
- border-radius: 50%;
- transition: none;
-}
-
-.p-slider .p-slider-handle:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
-.p-slider .p-slider-range {
- background: #8c1515;
-}
-
-.p-slider:not(.p-disabled) .p-slider-handle:hover {
- background: #8c1515;
- border-color: #8c1515;
-}
-
-.p-treeselect {
- background: #ffffff;
- border: 1px solid #d4d4d8;
- transition: none;
- border-radius: 0.375rem;
-}
-
-.p-treeselect:not(.p-disabled):hover {
- border-color: #d4d4d8;
-}
-
-.p-treeselect:not(.p-disabled).p-focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
- border-color: #8c1515;
-}
-
-.p-treeselect .p-treeselect-label {
- padding: 0.75rem 0.75rem;
- transition: none;
-}
-
-.p-treeselect .p-treeselect-label.p-placeholder {
- color: #71717a;
-}
-
-.p-treeselect.p-treeselect-chip .p-treeselect-token {
- padding: 0.375rem 0.75rem;
- margin-right: 0.5rem;
- background: #e5e7eb;
- color: #3f3f46;
- border-radius: 16px;
-}
-
-.p-treeselect .p-treeselect-trigger {
- background: transparent;
- color: #71717a;
- width: 3rem;
- border-top-right-radius: 0.375rem;
- border-bottom-right-radius: 0.375rem;
-}
-
-.p-treeselect.p-invalid.p-component {
- border-color: #f0a9a7;
-}
-
-.p-inputwrapper-filled.p-treeselect.p-treeselect-chip .p-treeselect-label {
- padding: 0.375rem 0.75rem;
-}
-
-.p-treeselect-panel {
- background: #ffffff;
- color: #3f3f46;
- border: 0 none;
- border-radius: 0.375rem;
- box-shadow:
- 0 0 #0000,
- 0 0 #0000,
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
-}
-
-.p-treeselect-panel .p-treeselect-items-wrapper .p-tree {
- border: 0 none;
-}
-
-.p-treeselect-panel .p-treeselect-items-wrapper .p-treeselect-empty-message {
- padding: 0.75rem 1rem;
- color: #3f3f46;
- background: transparent;
-}
-
-.p-input-filled .p-treeselect {
- background: #fafafa;
-}
-
-.p-input-filled .p-treeselect:not(.p-disabled):hover {
- background-color: #fafafa;
-}
-
-.p-input-filled .p-treeselect:not(.p-disabled).p-focus {
- background-color: #ffffff;
-}
.p-speeddial-action {
width: 3rem;
height: 3rem;
@@ -5866,42 +5263,6 @@
line-height: 3rem;
}
-.p-chip {
- background-color: #e5e7eb;
- color: #3f3f46;
- border-radius: 16px;
- padding: 0 0.75rem;
-}
-
-.p-chip .p-chip-text {
- line-height: 1.5;
- margin-top: 0.375rem;
- margin-bottom: 0.375rem;
-}
-
-.p-chip .p-chip-icon {
- margin-right: 0.5rem;
-}
-
-.p-chip img {
- width: 2.25rem;
- height: 2.25rem;
- margin-left: -0.75rem;
- margin-right: 0.5rem;
-}
-
-.p-chip .p-chip-remove-icon {
- margin-left: 0.5rem;
- border-radius: 0.375rem;
- transition: none;
-}
-
-.p-chip .p-chip-remove-icon:focus {
- outline: 0 none;
- outline-offset: 0;
- box-shadow: 0 0 0 1px #6366f1;
-}
-
.p-inplace .p-inplace-display {
padding: 0.75rem 0.75rem;
border-radius: 0.375rem;
@@ -6057,10 +5418,6 @@
font-weight: 600;
}
-.p-inputswitch.p-focus .p-inputswitch-slider {
- box-shadow: 0 0 0 2px #6366f1;
-}
-
.p-paginator .p-paginator-pages .p-paginator-page {
margin-left: -1px;
}
@@ -6074,13 +5431,6 @@
border: 0 none;
}
-.p-radiobutton:not(.p-radiobutton-disabled) .p-radiobutton-box.p-focus {
- box-shadow:
- 0 0 0 2px #ffffff,
- 0 0 0 4px #6366f1,
- 0 1px 2px 0 rgba(0, 0, 0, 0);
-}
-
.p-carousel .p-carousel-indicators .p-carousel-indicator.p-highlight button {
background-color: #8c1515;
}
diff --git a/src/assets/styles/theme.scss b/src/assets/styles/theme.scss
index 97d9449f7..404594ca9 100644
--- a/src/assets/styles/theme.scss
+++ b/src/assets/styles/theme.scss
@@ -8,8 +8,6 @@
@import 'components/defaults';
// Components
-@import 'components/chips';
-@import 'components/colorpicker';
@import 'components/dataview';
@import 'components/datatable';
@@ -28,15 +26,11 @@
@import 'components/passwordpanel';
-@import 'components/radiobutton';
-
@import 'components/selectbutton';
-@import 'components/slider';
@import 'components/splitbutton';
@import 'components/speeddial';
@import 'components/tabview';
-@import 'components/treeselect';
@import 'components/togglebutton';
// Custom components
diff --git a/src/components/CardAdministration.vue b/src/components/CardAdministration.vue
index d0a08b924..e43505a4b 100644
--- a/src/components/CardAdministration.vue
+++ b/src/components/CardAdministration.vue
@@ -19,6 +19,7 @@
button-class="p-button-outlined p-button-sm w-3rem h-3rem border-primary border-1 border-circle bg-transparent hover:surface-300"
:tooltip-options="{ position: 'top' }"
:pt="{ button: { size: 'small' } }"
+ data-cy="button-speed-dial"
/>
diff --git a/src/components/ConsentPicker.vue b/src/components/ConsentPicker.vue
index 44d6504fd..415f73125 100644
--- a/src/components/ConsentPicker.vue
+++ b/src/components/ConsentPicker.vue
@@ -3,11 +3,27 @@
-
+
@@ -15,7 +31,7 @@
This administration does not require consent or assent forms
@@ -153,6 +169,7 @@
:options="listOfDocs.consent"
option-label="fileName"
style="width: 70%"
+ :placeholder="props.legal?.consent[0]?.fileName || 'Select a Consent Form'"
@change="updateConsent"
/>
Select an Assent Form
@@ -161,6 +178,7 @@
:options="listOfDocs.assent"
option-label="fileName"
style="width: 70%"
+ :placeholder="props.legal?.assent[0]?.fileName || 'Select an Assent Form'"
@change="updateAssent"
/>
@@ -352,6 +370,13 @@ onMounted(() => {
if (!props.legal || Object.keys(props.legal).length === 0) {
decision.value = 'know';
knowWhatIWant.value = true;
+ } else {
+ result.consent[0] = props.legal.consent[0];
+ result.assent[0] = props.legal.assent[0];
+ result.amount = props.legal.amount;
+ result.expectedTime = props.legal.expectedTime;
+ selectedConsent.value = props.legal.consent[0];
+ selectedAssent.value = props.legal.assent[0];
}
});
@@ -556,10 +581,30 @@ watch(noConsent, () => {
}
});
-
diff --git a/src/components/CreateAdministration.vue b/src/components/CreateAdministration.vue
index a94474e2d..d1743e1e0 100644
--- a/src/components/CreateAdministration.vue
+++ b/src/components/CreateAdministration.vue
@@ -55,11 +55,10 @@
v-model="state.dateStarted"
class="w-full"
:min-date="minStartDate"
- input-id="start-date"
:number-of-months="1"
:manual-input="false"
- show-icon
icon="pi pi-calendar text-white p-1"
+ input-id="start-date"
show-button-bar
data-cy="input-start-date"
/>
@@ -78,7 +77,6 @@
input-id="end-date"
:number-of-months="1"
:manual-input="false"
- show-icon
icon="pi pi-calendar text-white p-1"
show-button-bar
data-cy="input-end-date"
@@ -124,11 +122,19 @@
-
+
@@ -677,17 +683,6 @@ function findVariantWithParams(variants, params) {
background-color: var(--surface-100);
}
-button.p-button.p-component.p-button-icon-only.p-datepicker-trigger {
- border: none;
- background-color: var(--primary-color);
- margin-left: -0.5rem;
- width: 3rem;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 20%;
- border-bottom-right-radius: 20%;
-}
-
.divider {
min-height: 100%;
max-width: 0;
@@ -769,4 +764,24 @@ button.p-button.p-component.p-button-icon-only.p-datepicker-trigger {
display: none;
}
}
+.p-radiobutton.p-component.p-radiobutton-checked {
+ position: relative;
+ width: 20px; /* adjust as needed */
+ height: 20px; /* adjust as needed */
+ background-color: var(--primary-color);
+ border-color: var(--primary-color) !important;
+ border-radius: 50%; /* make the element itself circular */
+}
+
+.p-radiobutton.p-component.p-radiobutton-checked::before {
+ content: '';
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 5px; /* adjust size of the inner circle as needed */
+ height: 5px; /* adjust size of the inner circle as needed */
+ background-color: white; /* color of the inner circle */
+ border-radius: 50%; /* make the inner element circular */
+ transform: translate(-50%, -50%); /* center the inner circle */
+}
diff --git a/src/components/CreateOrgs.vue b/src/components/CreateOrgs.vue
index 38d5cbd3e..32f32aad9 100644
--- a/src/components/CreateOrgs.vue
+++ b/src/components/CreateOrgs.vue
@@ -161,7 +161,7 @@
:options="allTags"
:suggestions="tagSuggestions"
name="tags"
- class="w-full card"
+ class="w-full"
data-cy="input-autocomplete"
@complete="searchTags"
/>
@@ -569,6 +569,23 @@ button.p-button.p-component.p-button-icon-only.p-autocomplete-dropdown {
}
}
+.p-autocomplete-token {
+ display: inline-flex;
+ align-items: center;
+ flex: 0 0 auto;
+ background: var(--primary-color);
+ padding: 0.25rem;
+ border-radius: 0.35rem;
+ color: white;
+ margin: 0.05rem;
+}
+
+.p-autocomplete-token-icon,
+g {
+ margin-left: 0.5rem;
+ color: white;
+}
+
#required-asterisk {
color: #ff0000;
}
diff --git a/src/components/EditVariantDialog.vue b/src/components/EditVariantDialog.vue
index f1b575e74..eb53fa472 100644
--- a/src/components/EditVariantDialog.vue
+++ b/src/components/EditVariantDialog.vue
@@ -169,6 +169,7 @@
option-value="value"
editable
placeholder="Type or choose field"
+ data-cy="dropdown-optional-field"
>
@@ -181,6 +182,7 @@
option-label="label"
option-value="value"
placeholder="Select Operator"
+ data-cy="dropdown-optional-operator"
>
@@ -193,7 +195,7 @@
-
+
@@ -223,6 +225,7 @@
class="bg-primary text-white border-none border-round p-2 hover:bg-red-900"
:disabled="optionalForAllFlag === true"
@click="addOptionalCondition"
+ data-cy="button-optional-condition"
/>
@@ -243,10 +246,10 @@
[],
+ },
});
+onMounted(() => {
+ getAllConditions(props.assessment.task.id);
+});
+
+function getAllConditions(taskId) {
+ const existingAssignedConditions = getAssignedConditions(taskId);
+ const existingOptionalConditions = getOptionalConditions(taskId);
+ setAssignedConditions(existingAssignedConditions);
+ setOptionalConditions(existingOptionalConditions);
+}
+
+// Get the assigned and optional conditions from the pre-existing admin info
+function getAssignedConditions(taskId) {
+ return props.preExistingAssessmentInfo.find((assessment) => assessment.taskId === taskId)?.conditions?.assigned
+ ?.conditions;
+}
+
+function getOptionalConditions(taskId) {
+ const task = props.preExistingAssessmentInfo.find((assessment) => assessment.taskId === taskId);
+ const hasOptionalConditions = task?.conditions?.optional?.conditions;
+
+ if (hasOptionalConditions) {
+ optionalForAllFlag.value = false;
+ return hasOptionalConditions;
+ } else {
+ optionalForAllFlag.value = !!task?.conditions?.optional;
+ return [];
+ }
+}
+
+// Set the assigned and optional conditions from the pre-existing admin info
+function setAssignedConditions(existingAssignedConditions) {
+ if (!existingAssignedConditions) return;
+ for (const condition of existingAssignedConditions) {
+ assignedConditions.value = [condition, ...assignedConditions.value];
+ }
+}
+
+function setOptionalConditions(existingOptionalConditions) {
+ if (!existingOptionalConditions) return;
+ for (const condition of existingOptionalConditions) {
+ optionalConditions.value = [condition, ...optionalConditions.value];
+ }
+}
+
const addOptionalCondition = () => {
- optionalConditions.value.push({ id: assignedConditions.value.length, field: '', op: '', value: '' });
+ optionalConditions.value.push({ id: optionalConditions.value.length, field: '', op: '', value: '' });
optionalEditingRows.value = [
...optionalEditingRows.value,
optionalConditions.value[optionalConditions.value.length - 1],
@@ -298,7 +350,11 @@ const errorSubmitText = ref('');
const handleOptionalForAllSwitch = () => {
if (optionalForAllFlag.value === true) {
+ // Store the optional conditions in case the optionalForAllFlag is toggled on and off again
+ previousOptionalConditions.value = optionalConditions.value;
optionalConditions.value = [];
+ } else {
+ optionalConditions.value = previousOptionalConditions.value;
}
};
@@ -306,21 +362,14 @@ const optionalAllFlagAndOptionalConditionsPresent = computed(() => {
return optionalForAllFlag.value && computedConditions.value['optional']?.conditions?.length > 0;
});
-onMounted(() => {
- if (props.assessment?.conditions) {
- optionalConditions.value = props.assessments?.conditions?.optional?.conditions;
- assignedConditions.value = props.assessments?.conditions?.assigned?.conditions;
- }
-});
+const handleReset = () => {
+ assignedConditions.value = [];
+ assignedEditingRows.value = [];
-const handleClose = () => {
- if (assignedEditingRows.value.length > 0) {
- assignedEditingRows.value = [];
- }
- if (optionalEditingRows.value.length > 0) {
- optionalEditingRows.value = [];
- }
- visible.value = false;
+ optionalConditions.value = [];
+ optionalEditingRows.value = [];
+
+ getAllConditions(props.assessment.task.id);
};
const handleSubmit = () => {
@@ -345,7 +394,7 @@ const handleSubmit = () => {
}
// Check for error where rows are still being edited
- if (optionalEditingRows.value.length > 0 && assignedEditingRows.value.length > 0) {
+ if (optionalEditingRows.value.length > 0 || assignedEditingRows.value.length > 0) {
error = true;
errorSubmitText.value = 'Please save all rows before submitting.';
}
@@ -367,15 +416,55 @@ const handleSubmit = () => {
return;
};
+const removeRowById = (type, index) => {
+ if (type === 'assigned') {
+ // Get the current data of the row to match later for deletion
+ const currentData = assignedConditions.value[index];
+
+ // Remove the row from the editing rows array by matching the id
+ const editingRowIndex = assignedEditingRows.value.findIndex((item) => item.id === currentData.id);
+ if (editingRowIndex > -1) {
+ assignedEditingRows.value.splice(editingRowIndex, 1);
+ }
+ } else if (type === 'optional') {
+ // Get the current data of the row to match later for deletion
+ const currentData = optionalConditions.value[index];
+
+ // Remove the row from the editing rows array by matching the id
+ const editingRowIndex = optionalEditingRows.value.findIndex((item) => item.id === currentData.id);
+ if (editingRowIndex > -1) {
+ optionalEditingRows.value.splice(editingRowIndex, 1);
+ }
+ } else {
+ console.error('Invalid type, choose one of "optional" or "assigned"');
+ }
+};
+
const removeAssignedRow = (index) => {
+ removeRowById('assigned', index);
+
assignedConditions.value.splice(index, 1);
+ // Update the id of each condition after removing a row to maintain proper indexing
+ for (let i = 0; i < assignedConditions.value.length; i++) {
+ assignedConditions.value[i].id = i;
+ }
};
const removeOptionalRow = (index) => {
+ removeRowById('optional', index);
+
+ // Remove the row from the conditions array
optionalConditions.value.splice(index, 1);
+
+ // Update the id of each condition after removing a row to maintain proper indexing
+ for (let i = 0; i < optionalConditions.value.length; i++) {
+ optionalConditions.value[i].id = i;
+ }
};
const optionalConditions = ref([]);
const assignedConditions = ref([]);
+// Store optional conditions in case the optionalForAllFlag is toggled on and off again (prevents the form from resetting to the original state)
+const previousOptionalConditions = ref([]);
const computedConditions = computed(() => {
return {
@@ -409,17 +498,13 @@ const onAssignedRowEditSave = (event) => {
let { newData, index } = event;
// Update the specific row in the conditions array
assignedConditions.value[index] = newData;
-
- // Remove the index from the editingRows array to stop editing
- assignedEditingRows.value.splice(assignedEditingRows.value.indexOf(index), 1);
+ removeRowById('assigned', index);
};
const onOptionalRowEditSave = (event) => {
let { newData, index } = event;
// Update the specific row in the conditions array
optionalConditions.value[index] = newData;
-
- // Remove the index from the editingRows array to stop editing
- optionalEditingRows.value.splice(optionalEditingRows.value.indexOf(index), 1);
+ removeRowById('optional', index);
};
diff --git a/src/components/ListOrgs.vue b/src/components/ListOrgs.vue
index 59f5ebc81..4f9fef390 100644
--- a/src/components/ListOrgs.vue
+++ b/src/components/ListOrgs.vue
@@ -1,4 +1,5 @@
+
@@ -58,12 +59,57 @@
:loading="isLoading || isFetching"
:allow-filtering="false"
@export-all="exportAll"
+ @selected-org-id="showCode"
/>
+
+
+
+ Invitation
+
+ Link:
+
+
+
+
+
+
+ Code:
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tasks/ManageVariants.vue b/src/components/tasks/ManageVariants.vue
new file mode 100644
index 000000000..e21467d7c
--- /dev/null
+++ b/src/components/tasks/ManageVariants.vue
@@ -0,0 +1,849 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/tasks/RegisterTask.vue b/src/components/tasks/RegisterTask.vue
deleted file mode 100644
index a5eaf313e..000000000
--- a/src/components/tasks/RegisterTask.vue
+++ /dev/null
@@ -1,547 +0,0 @@
-
-
-
-
-
-
Register a New Task
-
-
-
-
-
-
Your task has been created!
-
- Redirect to this URL upon task completion. ParticipantId can be any string, completed should be set to true.
-
-
roar.education/?participantId=[$PARTICIPANT_ID]&completed=[$BOOLEAN]
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/helpers/query/orgs.js b/src/helpers/query/orgs.js
index 331b5d20a..f569c0d58 100644
--- a/src/helpers/query/orgs.js
+++ b/src/helpers/query/orgs.js
@@ -231,7 +231,13 @@ export const fetchOrgByName = async (orgType, orgName, selectedDistrict, selecte
return axiosInstance.post(':runQuery', requestBody).then(({ data }) => mapFields(data));
};
-export const orgFetcher = async (orgType, selectedDistrict, isSuperAdmin, adminOrgs, select = ['name', 'id']) => {
+export const orgFetcher = async (
+ orgType,
+ selectedDistrict,
+ isSuperAdmin,
+ adminOrgs,
+ select = ['name', 'id', 'currentActivationCode'],
+) => {
if (isSuperAdmin.value) {
const axiosInstance = getAxiosInstance();
const requestBody = getOrgsRequestBody({
diff --git a/src/helpers/query/tasks.js b/src/helpers/query/tasks.js
index 6697f432a..66ac6fdf3 100644
--- a/src/helpers/query/tasks.js
+++ b/src/helpers/query/tasks.js
@@ -5,6 +5,7 @@ import { convertValues, getAxiosInstance, mapFields } from './utils';
export const getTasksRequestBody = ({
registered = true,
+ allData = false,
orderBy,
aggregationQuery,
pageLimit,
@@ -24,9 +25,11 @@ export const getTasksRequestBody = ({
requestBody.structuredQuery.offset = page * pageLimit;
}
- requestBody.structuredQuery.select = {
- fields: select.map((field) => ({ fieldPath: field })),
- };
+ if (!allData) {
+ requestBody.structuredQuery.select = {
+ fields: select.map((field) => ({ fieldPath: field })),
+ };
+ }
}
requestBody.structuredQuery.from = [
@@ -63,13 +66,14 @@ export const getTasksRequestBody = ({
return requestBody;
};
-export const taskFetcher = async (registered = true, select = ['name', 'testData', 'demoData']) => {
+export const taskFetcher = async (registered = true, allData = false, select = ['name', 'testData', 'demoData']) => {
const axiosInstance = getAxiosInstance('app');
const requestBody = getTasksRequestBody({
registered,
+ allData,
aggregationQuery: false,
paginate: false,
- select: select,
+ select: allData ? '' : select,
});
return axiosInstance.post(':runQuery', requestBody).then(({ data }) => mapFields(data));
diff --git a/src/helpers/query/utils.js b/src/helpers/query/utils.js
index b013c2ef3..5a70336e0 100644
--- a/src/helpers/query/utils.js
+++ b/src/helpers/query/utils.js
@@ -70,10 +70,13 @@ export const getProjectId = (project = 'admin') => {
return roarfirekit.value.roarConfig?.[project]?.projectId;
};
-export const getAxiosInstance = (db = 'admin') => {
+export const getAxiosInstance = (db = 'admin', unauthenticated = false) => {
const authStore = useAuthStore();
const { roarfirekit } = storeToRefs(authStore);
const axiosOptions = _get(roarfirekit.value.restConfig, db) ?? {};
+ if (unauthenticated) {
+ delete axiosOptions.headers;
+ }
return axios.create(axiosOptions);
};
@@ -93,7 +96,14 @@ export const exportCsv = (data, filename) => {
document.body.removeChild(a);
};
-export const fetchDocById = async (collection, docId, select, db = 'admin') => {
+export const fetchDocById = async (
+ collection,
+ docId,
+ select,
+ db = 'admin',
+ unauthenticated = false,
+ swallowErrors = false,
+) => {
if (!collection || !docId) {
console.warn(
`fetchDocById: Collection or docId not provided. Called with collection "${collection}" and docId "${docId}"`,
@@ -101,7 +111,7 @@ export const fetchDocById = async (collection, docId, select, db = 'admin') => {
return {};
}
const docPath = `/${collection}/${docId}`;
- const axiosInstance = getAxiosInstance(db);
+ const axiosInstance = getAxiosInstance(db, unauthenticated);
const queryParams = (select ?? []).map((field) => `mask.fieldPaths=${field}`);
const queryString = queryParams.length > 0 ? `?${queryParams.join('&')}` : '';
return axiosInstance
@@ -114,7 +124,9 @@ export const fetchDocById = async (collection, docId, select, db = 'admin') => {
};
})
.catch((error) => {
- console.error(error);
+ if (!swallowErrors) {
+ console.error(error);
+ }
return {
data: `${error.code === '404' ? 'Document not found' : error.message}`,
};
diff --git a/src/pages/HomeParticipant.vue b/src/pages/HomeParticipant.vue
index d46a9a3d6..aef977183 100644
--- a/src/pages/HomeParticipant.vue
+++ b/src/pages/HomeParticipant.vue
@@ -24,7 +24,7 @@
}}
diff --git a/src/pages/Maintenance.vue b/src/pages/MaintenancePage.vue
similarity index 100%
rename from src/pages/Maintenance.vue
rename to src/pages/MaintenancePage.vue
diff --git a/src/pages/RegisterGame.vue b/src/pages/ManageTasksVariants.vue
similarity index 70%
rename from src/pages/RegisterGame.vue
rename to src/pages/ManageTasksVariants.vue
index aa8569094..d22c6968d 100644
--- a/src/pages/RegisterGame.vue
+++ b/src/pages/ManageTasksVariants.vue
@@ -4,19 +4,28 @@
-
+
-
Register a new task or variant.
+
Manage tasks and variants.
diff --git a/src/pages/SignIn.vue b/src/pages/SignIn.vue
index 60552fc1d..86e725643 100644
--- a/src/pages/SignIn.vue
+++ b/src/pages/SignIn.vue
@@ -183,7 +183,6 @@ const authWithGoogle = () => {
if (isMobileBrowser()) {
authStore.signInWithGoogleRedirect();
} else {
- // authStore.signInWithGoogleRedirect();
authStore
.signInWithGooglePopup()
.then(async () => {
@@ -214,14 +213,15 @@ const modalPassword = ref('');
const authWithClever = () => {
console.log('---> authWithClever');
- if (isMobileBrowser()) {
- authStore.signInWithCleverRedirect();
- spinner.value = true;
- } else {
- authStore.signInWithCleverRedirect();
- // authStore.signInWithCleverPopup();
- spinner.value = true;
- }
+ const isLocalHost = import.meta.env.DEV;
+ // // if localhost or not testing, use popup
+ // if (isLocalHost) {
+ // authStore.signInWithCleverPopup();
+ // spinner.value = true;
+ // } else {
+ authStore.signInWithCleverRedirect();
+ spinner.value = true;
+ // }
};
const authWithClassLink = () => {
diff --git a/src/router/index.js b/src/router/index.js
index 453961734..ef8e0bbee 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -195,15 +195,16 @@ const routes = [
},
{
- path: '/register-game',
- name: 'RegisterGame',
- component: () => import('../pages/RegisterGame.vue'),
- meta: { pageTitle: 'Register Game', requireAdmin: true, requireSuperAdmin: true },
+ path: '/manage-tasks-variants',
+ name: 'ManageTasksVariants',
+ component: () => import('../pages/ManageTasksVariants.vue'),
+ meta: { pageTitle: 'Manage Tasks', requireAdmin: true, requireSuperAdmin: true },
},
{
path: '/register',
name: 'Register',
component: () => import('../pages/RegisterFamilyUsers.vue'),
+ props: (route) => ({ code: route.query.code }),
children: [
{
name: 'Register',
@@ -403,7 +404,7 @@ const routes = [
{
path: '/maintenance',
name: 'Maintenance',
- component: () => import('../pages/Maintenance.vue'),
+ component: () => import('../pages/MaintenancePage.vue'),
meta: { pageTitle: 'Down for Maintenance' },
},
];
diff --git a/src/router/sidebarActions.js b/src/router/sidebarActions.js
index e9fbff78a..5a0386449 100644
--- a/src/router/sidebarActions.js
+++ b/src/router/sidebarActions.js
@@ -62,9 +62,9 @@ const sidebarActionOptions = [
category: 'Administrations',
},
{
- title: 'Register Task',
+ title: 'Manage Tasks',
icon: 'pi pi-pencil',
- buttonLink: { name: 'RegisterGame' },
+ buttonLink: { name: 'ManageTasksVariants' },
requiresSuperAdmin: true,
requiresAdmin: true,
project: 'ALL',
diff --git a/vite.config.js b/vite.config.js
index b6d4237ad..57e9aa92c 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -19,7 +19,7 @@ export default defineConfig({
injectManifest: {
injectionPoint: undefined,
rollupFormat: 'iife',
- globPatterns: ['**/*.{html}'],
+ globPatterns: ['**/*'],
},
manifest: {
// Modify manifest options here...