@windward/integrations 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/components/Content/Blocks/ExternalIntegration/LtiConsumer.vue +3 -3
- package/components/Content/Blocks/ExternalIntegration/ScormConsumer.vue +34 -0
- package/components/ExternalIntegration/Driver/Lti1p1/ManageConsumer.vue +10 -8
- package/components/ExternalIntegration/Driver/Lti1p1/ManageConsumers.vue +2 -2
- package/components/ExternalIntegration/Driver/Lti1p1/ManageProvider.vue +8 -5
- package/components/ExternalIntegration/Driver/Lti1p1/ManageProviders.vue +3 -2
- package/components/ExternalIntegration/Driver/Lti1p3/ManageConsumer.vue +8 -6
- package/components/ExternalIntegration/Driver/Lti1p3/ManageConsumers.vue +2 -2
- package/components/ExternalIntegration/Driver/Lti1p3/ManageProvider.vue +27 -5
- package/components/ExternalIntegration/Driver/Lti1p3/ManageProviders.vue +4 -3
- package/components/ExternalIntegration/Driver/Lti1p3/ViewConsumer.vue +6 -5
- package/components/ExternalIntegration/Driver/ManageScorm.vue +45 -0
- package/components/ExternalIntegration/Driver/Scorm/ManageConsumer.vue +76 -0
- package/components/ExternalIntegration/Driver/Scorm/ManageConsumers.vue +233 -0
- package/components/ExternalIntegration/Driver/Scorm/ManageProvider.vue +475 -0
- package/components/ExternalIntegration/Driver/Scorm/ManageProviders.vue +299 -0
- package/components/Integration/Driver/LoginSamlButton.vue +119 -0
- package/components/Integration/Driver/ManageSaml.vue +327 -0
- package/components/LLM/GenerateContent/BlockQuestionGenerateButton.vue +34 -3
- package/components/SecretField.vue +99 -19
- package/components/Settings/ExternalIntegration/LtiConsumerSettings.vue +2 -2
- package/components/Settings/ExternalIntegration/ManageCourseIntegrationSettings.vue +6 -6
- package/components/Settings/ExternalIntegration/ScormConsumerSettings.vue +42 -0
- package/config/integration.config.js +2 -0
- package/helpers/Driver/SamlSso.ts +12 -0
- package/helpers/ExternalIntegration/ScormHelper.ts +155 -0
- package/i18n/en-US/components/external_integration/driver/lti1p3.ts +4 -1
- package/i18n/en-US/components/external_integration/driver/scorm.ts +14 -0
- package/i18n/en-US/components/external_integration/index.ts +3 -1
- package/i18n/en-US/components/integration/driver.ts +23 -0
- package/i18n/en-US/components/llm/generate_content/generate_questions.ts +7 -0
- package/i18n/en-US/pages/course/external_integration/index.ts +1 -1
- package/i18n/en-US/pages/login/index.ts +4 -0
- package/i18n/en-US/pages/login/lti.ts +2 -0
- package/i18n/en-US/pages/login/saml.ts +7 -0
- package/i18n/en-US/pages/login/scorm.ts +28 -0
- package/i18n/en-US/shared/content_blocks.ts +1 -0
- package/i18n/en-US/shared/settings.ts +1 -0
- package/i18n/es-ES/components/external_integration/driver/lti1p3.ts +4 -1
- package/i18n/es-ES/components/external_integration/driver/scorm.ts +15 -0
- package/i18n/es-ES/components/external_integration/index.ts +3 -1
- package/i18n/es-ES/components/integration/driver.ts +23 -0
- package/i18n/es-ES/components/llm/generate_content/generate_questions.ts +7 -0
- package/i18n/es-ES/pages/course/external_integration/index.ts +1 -1
- package/i18n/es-ES/pages/login/index.ts +4 -0
- package/i18n/es-ES/pages/login/lti.ts +2 -0
- package/i18n/es-ES/pages/login/saml.ts +7 -0
- package/i18n/es-ES/pages/login/scorm.ts +29 -0
- package/i18n/es-ES/shared/content_blocks.ts +1 -0
- package/i18n/es-ES/shared/settings.ts +1 -0
- package/i18n/sv-SE/components/external_integration/driver/lti1p3.ts +4 -1
- package/i18n/sv-SE/components/external_integration/driver/scorm.ts +14 -0
- package/i18n/sv-SE/components/external_integration/index.ts +3 -1
- package/i18n/sv-SE/components/integration/driver.ts +23 -0
- package/i18n/sv-SE/components/llm/generate_content/generate_questions.ts +7 -0
- package/i18n/sv-SE/pages/course/external_integration/index.ts +1 -1
- package/i18n/sv-SE/pages/login/index.ts +4 -0
- package/i18n/sv-SE/pages/login/lti.ts +2 -0
- package/i18n/sv-SE/pages/login/saml.ts +7 -0
- package/i18n/sv-SE/pages/login/scorm.ts +29 -0
- package/i18n/sv-SE/shared/content_blocks.ts +2 -1
- package/i18n/sv-SE/shared/settings.ts +1 -0
- package/jest.config.js +3 -0
- package/models/Auth/Saml.ts +21 -0
- package/models/ExternalIntegration/{LtiConsumer.ts → Consumer.ts} +2 -2
- package/models/ExternalIntegration/{LtiProvider.ts → Provider.ts} +2 -2
- package/package.json +2 -1
- package/pages/course/externalIntegration/index.vue +4 -0
- package/pages/login/scorm/error.vue +102 -0
- package/pages/login/scorm/promptEmail.vue +180 -0
- package/plugin.js +128 -7
- package/test/Components/ExternalIntegration/ManageScorm.spec.js +19 -0
- package/test/Components/ExternalIntegration/Scorm/ManageConsumer.spec.js +19 -0
- package/test/Components/ExternalIntegration/Scorm/ManageConsumers.spec.js +19 -0
- package/test/Components/ExternalIntegration/Scorm/ManageProvider.spec.js +19 -0
- package/test/Components/ExternalIntegration/Scorm/ManageProviders.spec.js +19 -0
- package/test/__mocks__/componentsMock.js +81 -1
- package/test/mocks.js +12 -0
- package/test/setup.js +1 -0
|
@@ -34,6 +34,29 @@ export default {
|
|
|
34
34
|
username: 'Användarnamn',
|
|
35
35
|
key: 'API Key',
|
|
36
36
|
},
|
|
37
|
+
saml_sso: {
|
|
38
|
+
manage_dialog_title: 'Hantera SAML SSO-integration',
|
|
39
|
+
idp_entity_id: 'Identitetsleverantörens enhets-ID',
|
|
40
|
+
idp_entity_id_hint: 'Den unika identifieraren för din IdP (t.ex. http://www.okta.com/exk1fxphPNZPCOB3v0g3)',
|
|
41
|
+
idp_sso_url: 'URL för enkel inloggning',
|
|
42
|
+
idp_sso_url_hint: 'URL:en dit användare omdirigeras för autentisering',
|
|
43
|
+
idp_slo_url: 'URL för enkel utloggning (Valfritt)',
|
|
44
|
+
idp_slo_url_hint: 'URL:en för att logga ut från IdP',
|
|
45
|
+
idp_x509_cert: 'X.509-certifikat',
|
|
46
|
+
idp_x509_cert_hint: 'Klistra in certifikatinnehållet från din IdP-metadata (utan BEGIN/END-rader)',
|
|
47
|
+
sp_details: 'Tjänsteleverantörsdetaljer',
|
|
48
|
+
sp_details_description: 'Ge dessa uppgifter till din identitetsleverantörsadministratör:',
|
|
49
|
+
cert_stored: 'Certifikat säkert lagrat',
|
|
50
|
+
button_settings: 'Inställningar för inloggningsknapp',
|
|
51
|
+
button_label: 'Knappetikett',
|
|
52
|
+
button_label_hint: 'Text att visa på SSO-inloggningsknappen',
|
|
53
|
+
button_label_default: 'Logga in med SSO',
|
|
54
|
+
button_icon: 'Knappikon',
|
|
55
|
+
button_icon_hint: 'Material Design-ikonnamn (t.ex. mdi-login, mdi-account-key)',
|
|
56
|
+
sp_entity_id_label: 'SP Entity ID',
|
|
57
|
+
acs_url_label: 'ACS URL',
|
|
58
|
+
slo_url_label: 'SLO URL',
|
|
59
|
+
},
|
|
37
60
|
enabled: 'Integration aktiverad',
|
|
38
61
|
disabled: 'Integration inaktiverad',
|
|
39
62
|
ssl_enabled: 'SSL aktiverat (Bör vara aktiverad för produktion)',
|
|
@@ -42,6 +42,11 @@ export default {
|
|
|
42
42
|
content_mismatch_word_jumble_support:
|
|
43
43
|
'Överväg att lägga till innehåll med tydliga vokabulärtermer, ordlistor eller nyckelkoncept som kan blandas.',
|
|
44
44
|
|
|
45
|
+
content_mismatch_crossword:
|
|
46
|
+
'Innehållet är inte lämpligt för korsordsspel.',
|
|
47
|
+
content_mismatch_crossword_support:
|
|
48
|
+
'Överväg att lägga till innehåll med ordlistetermer eller kortfattat ordförråd som kan bli korsordsord med korta ledtrådar.',
|
|
49
|
+
|
|
45
50
|
content_mismatch_multiple_choice:
|
|
46
51
|
'Innehållet är inte lämpligt för flervalsfrågor.',
|
|
47
52
|
content_mismatch_multiple_choice_support:
|
|
@@ -69,6 +74,7 @@ export default {
|
|
|
69
74
|
button_label_word_jumble: 'Generera objekt',
|
|
70
75
|
button_label_seven_strikes: 'Generera objekt',
|
|
71
76
|
button_label_multiple_choice: 'Generera frågor',
|
|
77
|
+
button_label_crossword: 'Generera objekt',
|
|
72
78
|
|
|
73
79
|
replace_existing_flashcard: 'Ersätt befintliga flashcards',
|
|
74
80
|
replace_existing_bucket_game: 'Ersätt befintliga hinkar',
|
|
@@ -76,6 +82,7 @@ export default {
|
|
|
76
82
|
replace_existing_sorting_game: 'Ersätt befintliga objekt',
|
|
77
83
|
replace_existing_word_jumble: 'Ersätt befintliga ord',
|
|
78
84
|
replace_existing_multiple_choice: 'Ersätt befintliga frågor',
|
|
85
|
+
replace_existing_crossword: 'Ersätt befintliga korsordsobjekt',
|
|
79
86
|
replace_existing: 'Ersätt befintlig',
|
|
80
87
|
|
|
81
88
|
replaces_content: 'Ersätter aktuellt blockinnehåll.',
|
|
@@ -4,6 +4,8 @@ export default {
|
|
|
4
4
|
missing_title: 'Fälten nedan saknas:',
|
|
5
5
|
error_title: 'Fel nedan uppstod:',
|
|
6
6
|
error: {
|
|
7
|
+
invalid_launch_request: 'Startbegäran var ogiltig',
|
|
8
|
+
tool_disabled: 'Detta LTI-paket är inaktiverat',
|
|
7
9
|
unknown: 'Ett okänt kommunikationsfel inträffade',
|
|
8
10
|
organization: 'Ogiltig organisation',
|
|
9
11
|
tool: 'Ogiltigt verktygs-id',
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
scorm_error: 'SCORM-fel',
|
|
3
|
+
email_required: 'E-postadress krävs för att fortsätta',
|
|
4
|
+
launch_error: 'SCORM-paketet misslyckades med att starta',
|
|
5
|
+
missing_title: 'Fälten nedan saknas:',
|
|
6
|
+
error_title: 'Felen nedan inträffade:',
|
|
7
|
+
enter_email:
|
|
8
|
+
'Ange din e-postadress nedan för att slutföra kontokonfigurationen. Din e-postadress kommer endast att användas för att underlätta kursrelaterad kommunikation, såsom frågor om kursinnehåll och teknisk support.',
|
|
9
|
+
privacy_policy: 'För mer information, se vår integritetspolicy.',
|
|
10
|
+
error: {
|
|
11
|
+
missing_data:
|
|
12
|
+
'Kunde inte ladda på grund av saknade data. Student-ID och/eller studentnamn saknas.',
|
|
13
|
+
missing_api: 'Kunde inte komma åt LMS SCORM API.',
|
|
14
|
+
invalid_launch_request: 'Startbegäran var ogiltig',
|
|
15
|
+
tool_disabled: 'Detta SCORM-paket är inaktiverat',
|
|
16
|
+
unknown: 'Ett okänt kommunikationsfel inträffade',
|
|
17
|
+
organization: 'Ogiltig organisation',
|
|
18
|
+
tool: 'Ogiltigt verktygs-ID',
|
|
19
|
+
tool_organization:
|
|
20
|
+
'Det här verktyget tillhör inte den här organisationen',
|
|
21
|
+
oauth: 'Ogiltig OAuth. Kontrollera din nyckel och hemlighet.',
|
|
22
|
+
},
|
|
23
|
+
missing: {
|
|
24
|
+
course_id: 'Kurs-ID saknas eller är ogiltigt.',
|
|
25
|
+
course_name: 'Kursnamnet saknas.',
|
|
26
|
+
callback: 'SCORM-återanropet saknas.',
|
|
27
|
+
state: 'SCORM-verifieringsstatus saknas.',
|
|
28
|
+
},
|
|
29
|
+
}
|
package/jest.config.js
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
import Model from '~/models/Model'
|
|
3
|
+
|
|
4
|
+
export default class Saml extends Model {
|
|
5
|
+
get required(): string[] {
|
|
6
|
+
return []
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Set the resource route of the model
|
|
10
|
+
resource() {
|
|
11
|
+
return 'saml'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Static method for custom endpoints
|
|
15
|
+
static custom(endpoint: string): any {
|
|
16
|
+
const instance = new Saml()
|
|
17
|
+
// Override the resource for this specific instance
|
|
18
|
+
instance.resource = () => endpoint
|
|
19
|
+
return instance
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// @ts-ignore
|
|
2
2
|
import Model from '~/models/Model'
|
|
3
3
|
|
|
4
|
-
export default class
|
|
4
|
+
export default class Consumer extends Model {
|
|
5
5
|
get required(): string[] {
|
|
6
6
|
return []
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
// Set the resource route of the model
|
|
10
10
|
resource() {
|
|
11
|
-
return 'external-
|
|
11
|
+
return 'external-integration-consumers'
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// @ts-ignore
|
|
2
2
|
import Model from '~/models/Model'
|
|
3
3
|
|
|
4
|
-
export default class
|
|
4
|
+
export default class Provider extends Model {
|
|
5
5
|
get required(): string[] {
|
|
6
6
|
return []
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
// Set the resource route of the model
|
|
10
10
|
resource() {
|
|
11
|
-
return 'external-
|
|
11
|
+
return 'external-integration-providers'
|
|
12
12
|
}
|
|
13
13
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windward/integrations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Windward UI Plugin Integrations for 3rd Party Systems",
|
|
5
5
|
"main": "plugin.js",
|
|
6
6
|
"scripts": {
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"@windward/core": "^0.8.0",
|
|
26
26
|
"canvas-confetti": "^1.6.0",
|
|
27
27
|
"eslint": "^8.11.0",
|
|
28
|
+
"jwt-decode": "^4.0.0",
|
|
28
29
|
"laravel-echo": "^1.15.0",
|
|
29
30
|
"prettier": "^2.6.0",
|
|
30
31
|
"pusher-js": "^8.0.1"
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<v-container>
|
|
3
|
+
<v-divider />
|
|
4
|
+
<v-row>
|
|
5
|
+
<v-col cols="12" md="6" offset-md="3">
|
|
6
|
+
<h1 class="text-center mt-5">
|
|
7
|
+
{{
|
|
8
|
+
$t(
|
|
9
|
+
'windward.integrations.pages.login.scorm.launch_error'
|
|
10
|
+
)
|
|
11
|
+
}}
|
|
12
|
+
</h1>
|
|
13
|
+
<v-alert
|
|
14
|
+
v-if="error.length === 0 && missing.length === 0"
|
|
15
|
+
type="error"
|
|
16
|
+
class="mt-5"
|
|
17
|
+
>
|
|
18
|
+
<strong>{{
|
|
19
|
+
$t(
|
|
20
|
+
'windward.integrations.pages.login.scorm.error.unknown'
|
|
21
|
+
)
|
|
22
|
+
}}</strong>
|
|
23
|
+
</v-alert>
|
|
24
|
+
<v-alert v-if="missing.length" type="warning" class="mt-5">
|
|
25
|
+
<strong>{{
|
|
26
|
+
$t(
|
|
27
|
+
'windward.integrations.pages.login.scorm.missing_title'
|
|
28
|
+
)
|
|
29
|
+
}}</strong>
|
|
30
|
+
<ul>
|
|
31
|
+
<li v-for="missingItem in missing" :key="missingItem">
|
|
32
|
+
{{
|
|
33
|
+
$t(
|
|
34
|
+
'windward.integrations.pages.login.scorm.missing.' +
|
|
35
|
+
missingItem
|
|
36
|
+
)
|
|
37
|
+
}}
|
|
38
|
+
</li>
|
|
39
|
+
</ul>
|
|
40
|
+
</v-alert>
|
|
41
|
+
<v-alert v-if="error.length" type="error" class="mt-5">
|
|
42
|
+
<strong>{{
|
|
43
|
+
$t(
|
|
44
|
+
'windward.integrations.pages.login.scorm.error_title'
|
|
45
|
+
)
|
|
46
|
+
}}</strong>
|
|
47
|
+
<ul>
|
|
48
|
+
<li v-for="errorItem in error" :key="errorItem">
|
|
49
|
+
{{
|
|
50
|
+
$t(
|
|
51
|
+
'windward.integrations.pages.login.scorm.error.' +
|
|
52
|
+
errorItem
|
|
53
|
+
)
|
|
54
|
+
}}
|
|
55
|
+
</li>
|
|
56
|
+
</ul>
|
|
57
|
+
</v-alert>
|
|
58
|
+
</v-col>
|
|
59
|
+
</v-row>
|
|
60
|
+
</v-container>
|
|
61
|
+
</template>
|
|
62
|
+
|
|
63
|
+
<script>
|
|
64
|
+
import _ from 'lodash'
|
|
65
|
+
export default {
|
|
66
|
+
name: 'PluginIntegrationsLoginScormErrorPage',
|
|
67
|
+
layout: 'default',
|
|
68
|
+
data() {
|
|
69
|
+
return {
|
|
70
|
+
missing: [],
|
|
71
|
+
error: [],
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
async fetch() {},
|
|
75
|
+
computed: {},
|
|
76
|
+
mounted() {
|
|
77
|
+
// Get the missing url parameters to display
|
|
78
|
+
if (!_.isEmpty(_.get(this.$route, 'query.missing', ''))) {
|
|
79
|
+
this.missing = _.get(this.$route, 'query.missing', '')
|
|
80
|
+
.split(',')
|
|
81
|
+
.map((v) => v.trim())
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Get the error url parameters to display
|
|
85
|
+
if (!_.isEmpty(_.get(this.$route, 'query.error', ''))) {
|
|
86
|
+
this.error = _.get(this.$route, 'query.error', '')
|
|
87
|
+
.split(',')
|
|
88
|
+
.map((v) => v.trim())
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Set the appropriate locale
|
|
92
|
+
if (!_.isEmpty(_.get(this.$route, 'query.locale', ''))) {
|
|
93
|
+
const locale = _.get(this.$route, 'query.locale', '')
|
|
94
|
+
|
|
95
|
+
if (this.$i18n.locales.includes(locale)) {
|
|
96
|
+
this.$i18n.setLocale(locale)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
methods: {},
|
|
101
|
+
}
|
|
102
|
+
</script>
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<v-container>
|
|
3
|
+
<v-divider />
|
|
4
|
+
<v-row v-if="error">
|
|
5
|
+
<v-col cols="12" lg="6" offset-lg="3">
|
|
6
|
+
<v-alert type="error" class="mt-5 text-center">
|
|
7
|
+
<strong>{{ error }}</strong>
|
|
8
|
+
</v-alert>
|
|
9
|
+
</v-col>
|
|
10
|
+
</v-row>
|
|
11
|
+
|
|
12
|
+
<div v-if="error === null">
|
|
13
|
+
<v-row>
|
|
14
|
+
<v-col cols="12" lg="6" offset-lg="3">
|
|
15
|
+
<h2 class="text-center my-5">
|
|
16
|
+
{{
|
|
17
|
+
$t(
|
|
18
|
+
'windward.integrations.pages.login.scorm.email_required'
|
|
19
|
+
)
|
|
20
|
+
}}
|
|
21
|
+
</h2>
|
|
22
|
+
|
|
23
|
+
<v-card>
|
|
24
|
+
<v-card-text>
|
|
25
|
+
<v-row>
|
|
26
|
+
<v-col v-if="course.icon" cols="4">
|
|
27
|
+
<v-img :src="course.icon" />
|
|
28
|
+
</v-col>
|
|
29
|
+
<v-col :cols="course.icon ? 8 : 12">
|
|
30
|
+
<p>
|
|
31
|
+
<strong>{{ course.name }}</strong>
|
|
32
|
+
</p>
|
|
33
|
+
<p>
|
|
34
|
+
{{
|
|
35
|
+
$t(
|
|
36
|
+
'windward.integrations.pages.login.scorm.enter_email'
|
|
37
|
+
)
|
|
38
|
+
}}
|
|
39
|
+
</p>
|
|
40
|
+
<p>
|
|
41
|
+
<a
|
|
42
|
+
:href="privacyPolicyUrl"
|
|
43
|
+
target="_blank"
|
|
44
|
+
>{{
|
|
45
|
+
$t(
|
|
46
|
+
'windward.integrations.pages.login.scorm.privacy_policy'
|
|
47
|
+
)
|
|
48
|
+
}}</a
|
|
49
|
+
>
|
|
50
|
+
</p>
|
|
51
|
+
</v-col>
|
|
52
|
+
</v-row>
|
|
53
|
+
|
|
54
|
+
<v-row>
|
|
55
|
+
<v-col cols="12">
|
|
56
|
+
<v-form
|
|
57
|
+
ref="form"
|
|
58
|
+
v-model="formValid"
|
|
59
|
+
lazy-validation
|
|
60
|
+
@submit.prevent="onSubmit"
|
|
61
|
+
>
|
|
62
|
+
<v-text-field
|
|
63
|
+
v-model="email"
|
|
64
|
+
:label="$t('shared.forms.email')"
|
|
65
|
+
:rules="
|
|
66
|
+
$Validation.getRule('email')
|
|
67
|
+
"
|
|
68
|
+
/>
|
|
69
|
+
<v-btn
|
|
70
|
+
color="primary"
|
|
71
|
+
:disabled="!formValid"
|
|
72
|
+
@click="onSubmit"
|
|
73
|
+
>
|
|
74
|
+
{{ $t('shared.forms.continue') }}
|
|
75
|
+
</v-btn>
|
|
76
|
+
</v-form>
|
|
77
|
+
</v-col>
|
|
78
|
+
</v-row>
|
|
79
|
+
</v-card-text>
|
|
80
|
+
</v-card>
|
|
81
|
+
</v-col>
|
|
82
|
+
</v-row>
|
|
83
|
+
<v-divider class="my-8" />
|
|
84
|
+
</div>
|
|
85
|
+
</v-container>
|
|
86
|
+
</template>
|
|
87
|
+
|
|
88
|
+
<script>
|
|
89
|
+
import _ from 'lodash'
|
|
90
|
+
import Uuid from '~/helpers/Uuid'
|
|
91
|
+
|
|
92
|
+
export default {
|
|
93
|
+
components: {},
|
|
94
|
+
name: 'PluginIntegrationsLoginScormErrorPage',
|
|
95
|
+
layout: 'default',
|
|
96
|
+
data() {
|
|
97
|
+
return {
|
|
98
|
+
loaded: false,
|
|
99
|
+
formValid: false,
|
|
100
|
+
email: null,
|
|
101
|
+
callback: null,
|
|
102
|
+
state: null,
|
|
103
|
+
course: {
|
|
104
|
+
id: null,
|
|
105
|
+
name: null,
|
|
106
|
+
icon: null,
|
|
107
|
+
},
|
|
108
|
+
privacyPolicyUrl: 'https://www.mindedge.com/privacy-policy/',
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
async fetch() {},
|
|
112
|
+
computed: {
|
|
113
|
+
error() {
|
|
114
|
+
if (!this.loaded) {
|
|
115
|
+
return null
|
|
116
|
+
} else if (!Uuid.test(this.course.id)) {
|
|
117
|
+
return this.$t(
|
|
118
|
+
'windward.integrations.pages.login.scorm.missing.course_id'
|
|
119
|
+
)
|
|
120
|
+
} else if (this.course.name === null) {
|
|
121
|
+
return this.$t(
|
|
122
|
+
'windward.integrations.pages.login.scorm.missing.course_name'
|
|
123
|
+
)
|
|
124
|
+
} else if (!this.callback) {
|
|
125
|
+
return this.$t(
|
|
126
|
+
'windward.integrations.pages.login.scorm.missing.callback'
|
|
127
|
+
)
|
|
128
|
+
} else if (!this.state) {
|
|
129
|
+
return this.$t(
|
|
130
|
+
'windward.integrations.pages.login.scorm.missing.state'
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
return null
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
mounted() {
|
|
137
|
+
// Get the state url parameter to callback with. This is just the encrypted payload from earlier
|
|
138
|
+
this.state = _.get(this.$route, 'query.state', null)
|
|
139
|
+
|
|
140
|
+
// Get the data url parameter to display course information
|
|
141
|
+
if (!_.isEmpty(_.get(this.$route, 'query.data', ''))) {
|
|
142
|
+
try {
|
|
143
|
+
const data = JSON.parse(
|
|
144
|
+
atob(_.get(this.$route, 'query.data', ''))
|
|
145
|
+
)
|
|
146
|
+
this.course.id = data.id
|
|
147
|
+
this.course.name = data.name
|
|
148
|
+
this.course.icon = data.icon
|
|
149
|
+
this.callback = data.callback
|
|
150
|
+
} catch (e) {
|
|
151
|
+
console.error('Could not parse course data', e)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Set the appropriate locale
|
|
156
|
+
if (!_.isEmpty(_.get(this.$route, 'query.locale', ''))) {
|
|
157
|
+
const locale = _.get(this.$route, 'query.locale', '')
|
|
158
|
+
|
|
159
|
+
if (this.$i18n.locales.includes(locale)) {
|
|
160
|
+
this.$i18n.setLocale(locale)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
this.loaded = true
|
|
165
|
+
},
|
|
166
|
+
methods: {
|
|
167
|
+
onSubmit() {
|
|
168
|
+
if (this.email) {
|
|
169
|
+
let url = this.callback
|
|
170
|
+
url += '?state=' + this.state
|
|
171
|
+
url += '&email=' + btoa(this.email.trim())
|
|
172
|
+
|
|
173
|
+
console.log('Redirecting to ', url)
|
|
174
|
+
// Redirect back to the callback url
|
|
175
|
+
window.location = url
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
</script>
|