@windward/integrations 0.16.0 → 0.18.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/components/Integration/AiAgentIntegration/ChatWindow.vue +916 -0
  3. package/components/Integration/Driver/LoginSamlButton.vue +119 -0
  4. package/components/Integration/Driver/ManageSaml.vue +327 -0
  5. package/components/LLM/BloomTaxonomySelector.vue +120 -0
  6. package/components/LLM/ContentSelector.vue +66 -0
  7. package/components/LLM/GenerateContent/AssessmentQuestionGenerateButton.vue +285 -0
  8. package/components/LLM/GenerateContent/BlockQuestionGenerateButton.vue +514 -0
  9. package/components/LLM/GenerateContent/FakeTextStream.vue +67 -0
  10. package/components/SecretField.vue +62 -5
  11. package/config/integration.config.js +2 -0
  12. package/helpers/Driver/SamlSso.ts +12 -0
  13. package/i18n/en-US/components/ai_agent/chat.ts +20 -0
  14. package/i18n/en-US/components/ai_agent/index.ts +5 -0
  15. package/i18n/en-US/components/index.ts +4 -0
  16. package/i18n/en-US/components/integration/driver.ts +23 -0
  17. package/i18n/en-US/components/llm/blooms.ts +15 -0
  18. package/i18n/en-US/components/llm/content_selector.ts +3 -0
  19. package/i18n/en-US/components/llm/generate_content/fake_text_stream.ts +62 -0
  20. package/i18n/en-US/components/llm/generate_content/generate_questions.ts +81 -0
  21. package/i18n/en-US/components/llm/generate_content/index.ts +7 -0
  22. package/i18n/en-US/components/llm/index.ts +10 -0
  23. package/i18n/en-US/pages/login/index.ts +2 -0
  24. package/i18n/en-US/pages/login/saml.ts +7 -0
  25. package/i18n/en-US/shared/permission.ts +10 -0
  26. package/i18n/en-US/shared/settings.ts +2 -1
  27. package/i18n/es-ES/components/ai_agent/chat.ts +20 -0
  28. package/i18n/es-ES/components/ai_agent/index.ts +5 -0
  29. package/i18n/es-ES/components/index.ts +4 -0
  30. package/i18n/es-ES/components/integration/driver.ts +23 -0
  31. package/i18n/es-ES/components/llm/blooms.ts +15 -0
  32. package/i18n/es-ES/components/llm/content_selector.ts +3 -0
  33. package/i18n/es-ES/components/llm/generate_content/fake_text_stream.ts +62 -0
  34. package/i18n/es-ES/components/llm/generate_content/generate_questions.ts +85 -0
  35. package/i18n/es-ES/components/llm/generate_content/index.ts +7 -0
  36. package/i18n/es-ES/components/llm/index.ts +10 -0
  37. package/i18n/es-ES/pages/login/index.ts +2 -0
  38. package/i18n/es-ES/pages/login/saml.ts +7 -0
  39. package/i18n/es-ES/shared/permission.ts +10 -0
  40. package/i18n/es-ES/shared/settings.ts +2 -1
  41. package/i18n/sv-SE/components/ai_agent/chat.ts +19 -0
  42. package/i18n/sv-SE/components/ai_agent/index.ts +5 -0
  43. package/i18n/sv-SE/components/index.ts +4 -0
  44. package/i18n/sv-SE/components/integration/driver.ts +23 -0
  45. package/i18n/sv-SE/components/llm/blooms.ts +15 -0
  46. package/i18n/sv-SE/components/llm/content_selector.ts +3 -0
  47. package/i18n/sv-SE/components/llm/generate_content/fake_text_stream.ts +62 -0
  48. package/i18n/sv-SE/components/llm/generate_content/generate_questions.ts +82 -0
  49. package/i18n/sv-SE/components/llm/generate_content/index.ts +7 -0
  50. package/i18n/sv-SE/components/llm/index.ts +10 -0
  51. package/i18n/sv-SE/pages/login/index.ts +2 -0
  52. package/i18n/sv-SE/pages/login/saml.ts +7 -0
  53. package/i18n/sv-SE/shared/permission.ts +10 -0
  54. package/i18n/sv-SE/shared/settings.ts +1 -0
  55. package/jest.config.js +3 -0
  56. package/models/Activity.ts +8 -0
  57. package/models/AgentChat.ts +12 -0
  58. package/models/AgentChatMessage.ts +12 -0
  59. package/models/Auth/Saml.ts +21 -0
  60. package/package.json +2 -1
  61. package/plugin.js +51 -1
  62. package/test/__mocks__/componentsMock.js +81 -1
  63. package/test/setup.js +1 -0
@@ -1,8 +1,9 @@
1
1
  export default {
2
2
  title: {
3
3
  lti_consumer: 'Consumidor LTI',
4
+ ai_chat: 'Chat de IA',
4
5
  },
5
6
  errors: {
6
- input_limitations: 'Debe tener menos de {0} caracteres.'
7
+ input_limitations: 'Debe tener menos de {0} caracteres.',
7
8
  },
8
9
  }
@@ -0,0 +1,19 @@
1
+ export default {
2
+ new_chat: 'Ny chatt',
3
+ recent_chats: 'Senaste chattar',
4
+ untitled_chat: 'Namnlös chatt',
5
+ no_history: 'Inga senaste chattar',
6
+ system_tip:
7
+ 'Hej! Jag är här för att hjälpa till med din kurs. Fråga gärna om lärandemål, innehållsstruktur eller bästa praxis.',
8
+ placeholder: 'Fråga om ditt kursinnehåll...',
9
+ hint: 'Tryck Enter för att skicka, Skift+Enter för ny rad',
10
+ error_generic: 'Något gick fel. Försök igen.',
11
+ error_with_status: 'Något gick fel. Försök igen. (Fel {status})',
12
+ action_try_again: 'Försök igen',
13
+ action_dismiss: 'Avfärda',
14
+ sender_you: 'Du',
15
+ sender_agent: 'Assistent',
16
+ limit_reached:
17
+ 'Du har nått det maximala antalet tillåtna meddelanden i den här chatten. Starta en ny chatt för att fortsätta.',
18
+ aria_open_history: 'Öppna chatthistorik',
19
+ }
@@ -0,0 +1,5 @@
1
+ import chat from './chat'
2
+
3
+ export default {
4
+ chat,
5
+ }
@@ -4,12 +4,16 @@ import navigation from './navigation'
4
4
  import integration from './integration'
5
5
  import externalIntegration from './external_integration'
6
6
  import fileImport from './file_import'
7
+ import aiAgent from './ai_agent'
8
+ import llm from './llm'
7
9
 
8
10
  export default {
9
11
  content,
10
12
  settings,
11
13
  navigation,
12
14
  integration,
15
+ llm,
13
16
  external_integration: externalIntegration,
14
17
  file_import: fileImport,
18
+ ai_agent: aiAgent,
15
19
  }
@@ -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)',
@@ -0,0 +1,15 @@
1
+ export default {
2
+ blooms_taxonomy: 'Blooms taxonominivå',
3
+ none: 'Ingen vald',
4
+ remember: 'Komma ihåg',
5
+ understand: 'Förstå',
6
+ apply: 'Tillämpas',
7
+ analyze: 'Analysera',
8
+ evaluate: 'Utvärdera',
9
+ errors: {
10
+ insufficient_content_blooms:
11
+ 'Otillräckligt innehåll för att generera kvalitetsfrågor på {bloomsLevel}-nivån.',
12
+ insufficient_content_blooms_support:
13
+ 'Vänligen lägg till mer detaljerad text, exempel eller förklaringar till detta avsnitt. Vi rekommenderar minst {minimumRequired} ord av relevant innehåll för att generera lämpliga frågor på denna nivå.',
14
+ },
15
+ }
@@ -0,0 +1,3 @@
1
+ export default {
2
+ selected_pages: 'Vald sida',
3
+ }
@@ -0,0 +1,62 @@
1
+ export default {
2
+ options: [
3
+ 'Navigera neurala nätverk',
4
+ 'Konsultera oraklet',
5
+ 'Konsultera hivemind',
6
+ 'Tänka...',
7
+ 'Generera svar',
8
+ 'Gå igenom AI-tankelandskapet',
9
+ 'Syntetisera svar',
10
+ 'Kompilera bäst anpassade lösningar',
11
+ 'Utvärdera sannolikheter',
12
+ 'Retikulera splines',
13
+ 'Kiseltankar pågår...',
14
+ 'Arrangera nollor och ettor',
15
+ 'Åtkomst till cumulus',
16
+ 'Se smart ut på konstgjort sätt',
17
+ 'Begrunda det oändliga',
18
+ 'Översätta byte',
19
+ 'Övertyga data',
20
+ 'Initiera artificiell logik',
21
+ 'Tankar buffrar...',
22
+ 'Kontrollera väl av artificiell visdom',
23
+ 'Tillbaka till rekursiva toner.',
24
+ 'Brottas med GPU-marknaden',
25
+ 'Ställer in effekten till 1,21 gigawatt',
26
+ 'Fisker data från strömmen',
27
+ 'Konsulterar stjärnor',
28
+ 'Kontrollerar Schrödingers katt',
29
+ 'Förhandlar med kaffemaskinen',
30
+ 'Kretsar runt frågan. Landar snart',
31
+ 'Dammtorkar av gamla skriftrullar',
32
+ 'Prater med ethernetportarna',
33
+ 'Snurrar upp hamsterhjulen',
34
+ 'Hamstrarna blir trötta',
35
+ 'Avkodar kosmiska stavfel',
36
+ 'Synkronisera vibrationer',
37
+ 'Vallar elektroner',
38
+ 'Letar under soffan efter svar',
39
+ 'Förhör data',
40
+ 'Omkalibrerar elektronflödet',
41
+ 'Argumenterar med autokorrigering',
42
+ 'Be Clippy om svar',
43
+ 'Beräknar dramatisk paus...',
44
+ 'Skakar magisk 8-boll',
45
+ 'Laggar plothål',
46
+ 'Startar om routern...',
47
+ 'Stänger av och sätter på den igen',
48
+ 'Nästan där. Förmodligen. Kanske.',
49
+ 'Vänder digitala mynt',
50
+ 'Tänker utanför den simulerade boxen',
51
+ 'Lägger till sås i spaghettikod',
52
+ 'Vallar digitala katter',
53
+ 'Defragmenterar beslut',
54
+ 'Lyssnar på uppringningsljud',
55
+ 'Krypterar pinsam tystnad',
56
+ 'Be brödrost om råd',
57
+ 'Laddar skämtgeneratorn',
58
+ 'Polerar ettor och nollor',
59
+ 'Sträcker virtuella ben',
60
+ 'Konsulterar humörringarloggar',
61
+ ],
62
+ }
@@ -0,0 +1,82 @@
1
+ export default {
2
+ errors: {
3
+ default: 'Kunde inte generera fråga från tillhandahållet innehåll.',
4
+ default_support:
5
+ 'Försök igen eller kontakta supporten om problemet kvarstår.',
6
+
7
+ insufficient_content: 'Mer innehåll behövs för att generera frågor.',
8
+ insufficient_content_support:
9
+ 'Vänligen lägg till mer text, exempel eller förklaringar till det här avsnittet. Vi rekommenderar minst 2-3 stycken innehåll.',
10
+
11
+ insufficient_content_dynamic:
12
+ 'Otillräckligt innehåll för att generera kvalitetsfrågor.',
13
+ insufficient_content_dynamic_support:
14
+ 'Vänligen lägg till mer detaljerad text, exempel eller förklaringar till detta avsnitt. Vi rekommenderar minst {minimumRequired} ord av relevant innehåll för att generera lämpliga frågor.',
15
+
16
+ content_mismatch: 'Innehållet matchar inte frågetyp.',
17
+ content_mismatch_support:
18
+ 'Vänligen lägg till mer text, exempel eller förklaringar till detta avsnitt. Vi rekommenderar minst 50 ord av relevant innehåll för att generera lämpliga frågor.',
19
+
20
+ content_mismatch_bucket_game:
21
+ 'Innehållet är inte lämpligt för kategorispel.',
22
+ content_mismatch_bucket_game_support:
23
+ 'Överväg att lägga till innehåll med tydliga kategorier och flera sorterbara objekt som kan grupperas i 2-4 distinkta kategorier.',
24
+
25
+ content_mismatch_matching_game:
26
+ 'Innehållet är inte lämpligt för matchningsspel.',
27
+ content_mismatch_matching_game_support:
28
+ 'Överväg att lägga till innehåll som uttryckligen definierar relationer mellan termer, koncept eller kategorier som elever kan matcha.',
29
+
30
+ content_mismatch_sorting_game:
31
+ 'Innehållet är inte lämpligt för sorteringsspel.',
32
+ content_mismatch_sorting_game_support:
33
+ 'Överväg att lägga till innehåll med sekventiella steg, kronologiska händelser eller objekt som har en tydlig logisk ordning för elever att arrangera.',
34
+
35
+ content_mismatch_scenario_game:
36
+ 'Innehållet är inte lämpligt för scenariospel.',
37
+ content_mismatch_scenario_game_support:
38
+ 'Överväg att lägga till innehåll som beskriver koncept, processer eller principer som kan tillämpas i verkliga scenarier.',
39
+
40
+ content_mismatch_word_jumble:
41
+ 'Innehållet är inte lämpligt för ordvirrvarr-spel.',
42
+ content_mismatch_word_jumble_support:
43
+ 'Överväg att lägga till innehåll med tydliga vokabulärtermer, ordlistor eller nyckelkoncept som kan blandas.',
44
+
45
+ content_mismatch_multiple_choice:
46
+ 'Innehållet är inte lämpligt för flervalsfrågor.',
47
+ content_mismatch_multiple_choice_support:
48
+ 'Överväg att lägga till tydlig, förklarande text med distinkta koncept, definitioner eller exempel som stödjer skapandet av frågor och distraktorer.',
49
+
50
+ character_limit:
51
+ 'Ett fel uppstod när innehållet genererades. Försök generera igen.',
52
+ character_limit_detailed:
53
+ 'Fältet {field} överskrider gränsen på {limit} tecken (för närvarande {actual} tecken). Försök generera igen med kortare innehåll.',
54
+
55
+ llm_unavailable: 'Frågegenerering tillfälligt otillgänglig.',
56
+ llm_unavailable_support:
57
+ 'Vi kan inte ansluta till vår AI-tjänst för tillfället. Försök igen om några minuter.',
58
+
59
+ technical: 'Kan inte behandla begäran.',
60
+ technical_support:
61
+ 'Något gick fel. Försök igen eller kontakta supporten om detta fortsätter.',
62
+ },
63
+ button_label: 'Generera fråga',
64
+ button_label_flashcard: 'Generera flashkort',
65
+ button_label_bucket_game: 'Generera kategorier',
66
+ button_label_matching_game: 'Generera matchningar',
67
+ button_label_sorting_game: 'Generera objekt',
68
+ button_label_scenario_game: 'Generera scenarier',
69
+ button_label_word_jumble: 'Generera objekt',
70
+ button_label_seven_strikes: 'Generera objekt',
71
+ button_label_multiple_choice: 'Generera frågor',
72
+
73
+ replace_existing_flashcard: 'Ersätt befintliga flashcards',
74
+ replace_existing_bucket_game: 'Ersätt befintliga hinkar',
75
+ replace_existing_matching_game: 'Ersätt befintliga matchningar',
76
+ replace_existing_sorting_game: 'Ersätt befintliga objekt',
77
+ replace_existing_word_jumble: 'Ersätt befintliga ord',
78
+ replace_existing_multiple_choice: 'Ersätt befintliga frågor',
79
+ replace_existing: 'Ersätt befintlig',
80
+
81
+ replaces_content: 'Ersätter aktuellt blockinnehåll.',
82
+ }
@@ -0,0 +1,7 @@
1
+ import generateQuestions from './generate_questions'
2
+ import fakeTextStream from './fake_text_stream'
3
+
4
+ export default {
5
+ generate_questions: generateQuestions,
6
+ fake_text_stream: fakeTextStream,
7
+ }
@@ -0,0 +1,10 @@
1
+ import generateContent from './generate_content'
2
+ import blooms from './blooms'
3
+ import contentSelector from './content_selector'
4
+
5
+ export default {
6
+ ai_assistance: 'AI-hjälp',
7
+ generate_content: generateContent,
8
+ blooms,
9
+ content_selector: contentSelector,
10
+ }
@@ -1,5 +1,7 @@
1
1
  import lti from './lti'
2
+ import saml from './saml'
2
3
 
3
4
  export default {
4
5
  lti,
6
+ saml,
5
7
  }
@@ -0,0 +1,7 @@
1
+ export default {
2
+ or: 'ELLER',
3
+ processing: 'Bearbetar SSO-inloggning...',
4
+ success: 'Inloggningen lyckades! Omdirigerar...',
5
+ failed: 'SSO-inloggning misslyckades',
6
+ failed_description: 'SSO-inloggning misslyckades. Vänligen försök igen.',
7
+ }
@@ -10,6 +10,16 @@ export default {
10
10
  'plugin->windward->integrations->content': 'Innehållsintegrationer',
11
11
  'plugin->windward->integrations->course->externalIntegration':
12
12
  'Externa integrationer (LTI / SCORM / etc)',
13
+ 'plugin->windward->integrations->ai':
14
+ 'Globala behörigheter för generativ AI',
15
+ 'plugin->windward->integrations->ai->integration':
16
+ 'Behörigheter för att ändra AI‑uppmaningar',
17
+ 'plugin->windward->integrations->organization->ai':
18
+ 'Behörigheter för generativ AI endast i användarens nuvarande organisation',
19
+ 'plugin->windward->integrations->organization->aiAgentChat':
20
+ 'Tillåt åtkomst till AI‑agent',
21
+ 'plugin->windward->integrations->organization->course->ai':
22
+ 'Behörigheter för generativ AI endast i användarens nuvarande organisation och kurs för innehållsgenerering',
13
23
  },
14
24
 
15
25
  type_description: {
@@ -1,6 +1,7 @@
1
1
  export default {
2
2
  title: {
3
3
  lti_consumer: 'LTI konsument',
4
+ ai_chat: 'AI-chatt',
4
5
  },
5
6
  errors: {
6
7
  input_limitations: 'Måste vara mindre än {0} tecken.',
package/jest.config.js CHANGED
@@ -1,4 +1,7 @@
1
1
  module.exports = {
2
+ testEnvironment: 'jsdom',
3
+ setupFiles: ['<rootDir>/test/setup.js'],
4
+ testURL: 'http://localhost/',
2
5
  moduleNameMapper: {
3
6
  '^@/(.*)$': '<rootDir>/$1',
4
7
  '^vue$': 'vue/dist/vue.common.js',
@@ -0,0 +1,8 @@
1
+ import Model from '~/models/Model'
2
+
3
+ export default class Activity extends Model {
4
+ // Set the resource route of the model
5
+ resource() {
6
+ return 'activities'
7
+ }
8
+ }
@@ -0,0 +1,12 @@
1
+ import Model from '~/models/Model'
2
+
3
+ export default class AgentChat extends Model {
4
+ get required(): string[] {
5
+ return []
6
+ }
7
+
8
+ // Set the resource route of the model
9
+ resource() {
10
+ return 'agent-chat'
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ import Model from '~/models/Model'
2
+
3
+ export default class AgentChatMessage extends Model {
4
+ get required(): string[] {
5
+ return []
6
+ }
7
+
8
+ // Set the resource route of the model
9
+ resource() {
10
+ return 'messages'
11
+ }
12
+ }
@@ -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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windward/integrations",
3
- "version": "0.16.0",
3
+ "version": "0.18.0",
4
4
  "description": "Windward UI Plugin Integrations for 3rd Party Systems",
5
5
  "main": "plugin.js",
6
6
  "scripts": {
@@ -21,6 +21,7 @@
21
21
  "license": "MIT",
22
22
  "homepage": "https://bitbucket.org/mindedge/windward-ui-plugin-integrations#readme",
23
23
  "dependencies": {
24
+ "@mindedge/vue-api-query": "^1.15.1",
24
25
  "@windward/core": "^0.8.0",
25
26
  "canvas-confetti": "^1.6.0",
26
27
  "eslint": "^8.11.0",
package/plugin.js CHANGED
@@ -16,6 +16,12 @@ import FileImportGoogleDrive from './components/FileImport/GoogleDrive.vue'
16
16
  import FileImportDropbox from './components/FileImport/Dropbox.vue'
17
17
 
18
18
  import CourseJobLog from './components/Navigation/Items/CourseJobLog.vue'
19
+ import ChatWindow from './components/Integration/AiAgentIntegration/ChatWindow.vue'
20
+
21
+ import AssessmentQuestionGenerateButton from './components/LLM/GenerateContent/AssessmentQuestionGenerateButton.vue'
22
+ import BlockQuestionGenerateButton from './components/LLM/GenerateContent/BlockQuestionGenerateButton.vue'
23
+
24
+ import LoginSamlButton from './components/Integration/Driver/LoginSamlButton.vue'
19
25
 
20
26
  export default {
21
27
  name: 'windward.integrations.name',
@@ -62,6 +68,21 @@ export default {
62
68
  },
63
69
  ],
64
70
  components: {
71
+ userLogin: [
72
+ {
73
+ tag: 'windward-integrations-login-saml',
74
+ template: LoginSamlButton,
75
+ },
76
+ // Future SSO methods can be added here:
77
+ // {
78
+ // tag: 'windward-integrations-login-oauth2',
79
+ // template: LoginOAuth2Button,
80
+ // },
81
+ // {
82
+ // tag: 'windward-integrations-login-google',
83
+ // template: LoginGoogleButton,
84
+ // },
85
+ ],
65
86
  menu: [
66
87
  {
67
88
  ref_page: 'admin',
@@ -149,6 +170,19 @@ export default {
149
170
  },
150
171
  },
151
172
  },
173
+ {
174
+ tag: 'windward-integrations-ai-chat-agent',
175
+ template: ChatWindow,
176
+ context: ['course'],
177
+ icon: 'mdi-chat-outline',
178
+ i18n: 'windward.integrations.shared.settings.title.ai_chat',
179
+ display: ['toolpanel'],
180
+ permissions: {
181
+ 'plugin.windward.integrations.organization.aiAgentChat': {
182
+ writable: true,
183
+ },
184
+ },
185
+ },
152
186
  ],
153
187
  contentBlock: [
154
188
  {
@@ -162,7 +196,7 @@ export default {
162
196
  },
163
197
  },
164
198
  ],
165
- settings: [
199
+ contentBlockSetting: [
166
200
  {
167
201
  tag: 'windward-integrations-lti-consumer-settings',
168
202
  template: LtiConsumerBlockSettings,
@@ -172,6 +206,8 @@ export default {
172
206
  name: 'windward.integrations.shared.settings.title.lti_consumer',
173
207
  },
174
208
  },
209
+ ],
210
+ courseSetting: [
175
211
  {
176
212
  tag: 'windward-integrations-external-integration-settings',
177
213
  template: ManageCourseIntegrationSettings,
@@ -215,6 +251,20 @@ export default {
215
251
  },
216
252
  },
217
253
  ],
254
+ contentBlockSettingTool: [
255
+ {
256
+ tag: 'windward-integrations-llm-activity-generate',
257
+ template: BlockQuestionGenerateButton,
258
+ context: ['block'],
259
+ },
260
+ ],
261
+ contentBlockSettingAssessmentTool: [
262
+ {
263
+ tag: 'windward-integrations-llm-assessment-question-generate',
264
+ template: AssessmentQuestionGenerateButton,
265
+ context: ['block.content-blocks-assessment'],
266
+ },
267
+ ],
218
268
  },
219
269
  services: {
220
270
  Integration: IntegrationHelper,
@@ -1 +1,81 @@
1
- // Mock components from other repos
1
+ import Vue from 'vue'
2
+
3
+ Vue.component('SearchField', {
4
+ name: 'SearchField',
5
+ template: '<div>SearchField</div>',
6
+ })
7
+
8
+ Vue.component('v-expansion-panels', {
9
+ name: 'v-expansion-panels',
10
+ template: '<div>v-expansion-panels</div>',
11
+ })
12
+
13
+ Vue.component('v-expansion-panel', {
14
+ name: 'v-expansion-panel',
15
+ template: '<div>v-expansion-panel</div>',
16
+ })
17
+
18
+ Vue.component('v-expansion-panel-header', {
19
+ name: 'v-expansion-panel-header',
20
+ template: '<div>v-expansion-panel-header</div>',
21
+ })
22
+
23
+ Vue.component('v-expansion-panel-content', {
24
+ name: 'v-expansion-panel-content',
25
+ template: '<div>v-expansion-panel-content</div>',
26
+ })
27
+
28
+ Vue.component('v-tabs', {
29
+ name: 'v-tabs',
30
+ template: '<div>v-tabs</div>',
31
+ })
32
+
33
+ Vue.component('v-tabs-slider', {
34
+ name: 'v-tabs-slider',
35
+ template: '<div>v-tabs-slider</div>',
36
+ })
37
+
38
+ Vue.component('v-tab', {
39
+ name: 'v-tab',
40
+ template: '<div>v-tab</div>',
41
+ })
42
+
43
+ Vue.component('v-tabs-items', {
44
+ name: 'v-tabs-items',
45
+ template: '<div>v-tabs-items</div>',
46
+ })
47
+
48
+ Vue.component('v-tab-item', {
49
+ name: 'v-tab-item',
50
+ template: '<div>v-tab-item</div>',
51
+ })
52
+
53
+ Vue.component('v-select', {
54
+ name: 'v-select',
55
+ template: '<div>v-select</div>',
56
+ })
57
+
58
+ Vue.component('v-autocomplete', {
59
+ name: 'v-autocomplete',
60
+ template: '<div>v-autocomplete</div>',
61
+ })
62
+
63
+ Vue.component('v-switch', {
64
+ name: 'v-switch',
65
+ template: '<div>v-switch</div>',
66
+ })
67
+
68
+ Vue.component('v-divider', {
69
+ name: 'v-divider',
70
+ template: '<div>v-divider</div>',
71
+ })
72
+
73
+ Vue.component('v-progress-circular', {
74
+ name: 'v-progress-circular',
75
+ template: '<div>v-progress-circular</div>',
76
+ })
77
+
78
+ Vue.component('v-treeview', {
79
+ name: 'v-treeview',
80
+ template: '<div>v-treeview</div>',
81
+ })
package/test/setup.js ADDED
@@ -0,0 +1 @@
1
+ // This file is intentionally left blank.