@windward/integrations 0.21.0 → 0.23.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 (150) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/Content/Blocks/ActionPanel/TransformActivity.vue +386 -0
  3. package/components/Content/Blocks/ActionPanel/TransformBlock.vue +402 -59
  4. package/components/Content/Blocks/ExternalIntegration/LtiConsumer.vue +22 -2
  5. package/components/ExternalIntegration/Driver/Lti1p1/ManageConsumer.vue +8 -2
  6. package/components/ExternalIntegration/Driver/Lti1p1/ManageProvider.vue +4 -0
  7. package/components/ExternalIntegration/Driver/Lti1p3/ManageConsumer.vue +2 -2
  8. package/components/Integration/JobTable.vue +35 -3
  9. package/components/Integration/TranslateCourse.vue +574 -0
  10. package/components/Settings/ExternalIntegration/LtiConsumerSettings.vue +27 -0
  11. package/i18n/ar-SA/components/ai_agent/chat.ts +20 -0
  12. package/i18n/ar-SA/components/ai_agent/index.ts +5 -0
  13. package/i18n/ar-SA/components/content/blocks/action_panel/index.ts +5 -0
  14. package/i18n/ar-SA/components/content/blocks/action_panel/transform_block.ts +9 -0
  15. package/i18n/ar-SA/components/content/blocks/external_integration/index.ts +5 -0
  16. package/i18n/ar-SA/components/content/blocks/external_integration/lti_consumer.ts +17 -0
  17. package/i18n/ar-SA/components/content/blocks/index.ts +7 -0
  18. package/i18n/ar-SA/components/content/index.ts +5 -0
  19. package/i18n/ar-SA/components/external_integration/driver/lti1p1.ts +17 -0
  20. package/i18n/ar-SA/components/external_integration/driver/lti1p3.ts +25 -0
  21. package/i18n/ar-SA/components/external_integration/driver/scorm.ts +14 -0
  22. package/i18n/ar-SA/components/external_integration/index.ts +36 -0
  23. package/i18n/ar-SA/components/external_integration/provider_target.ts +9 -0
  24. package/i18n/ar-SA/components/file_import/index.ts +5 -0
  25. package/i18n/ar-SA/components/file_import/resourcespace.ts +4 -0
  26. package/i18n/ar-SA/components/index.ts +19 -0
  27. package/i18n/ar-SA/components/integration/driver.ts +67 -0
  28. package/i18n/ar-SA/components/integration/index.ts +9 -0
  29. package/i18n/ar-SA/components/integration/job.ts +25 -0
  30. package/i18n/ar-SA/components/integration/job_log.ts +24 -0
  31. package/i18n/ar-SA/components/llm/blooms.ts +15 -0
  32. package/i18n/ar-SA/components/llm/content_selector.ts +3 -0
  33. package/i18n/ar-SA/components/llm/generate_content/fake_text_stream.ts +62 -0
  34. package/i18n/ar-SA/components/llm/generate_content/generate_questions.ts +92 -0
  35. package/i18n/ar-SA/components/llm/generate_content/index.ts +8 -0
  36. package/i18n/ar-SA/components/llm/index.ts +10 -0
  37. package/i18n/ar-SA/components/navigation/index.ts +5 -0
  38. package/i18n/ar-SA/components/navigation/integrations.ts +9 -0
  39. package/i18n/ar-SA/components/settings/external_integration/index.ts +5 -0
  40. package/i18n/ar-SA/components/settings/external_integration/lti_consumer.ts +10 -0
  41. package/i18n/ar-SA/components/settings/index.ts +5 -0
  42. package/i18n/ar-SA/index.ts +16 -0
  43. package/i18n/ar-SA/modules/index.ts +5 -0
  44. package/i18n/ar-SA/pages/admin/index.ts +5 -0
  45. package/i18n/ar-SA/pages/admin/translateCourse.ts +68 -0
  46. package/i18n/ar-SA/pages/course/external_integration/index.ts +6 -0
  47. package/i18n/ar-SA/pages/course/index.ts +5 -0
  48. package/i18n/ar-SA/pages/importContent.ts +3 -0
  49. package/i18n/ar-SA/pages/importCourse.ts +13 -0
  50. package/i18n/ar-SA/pages/index.ts +15 -0
  51. package/i18n/ar-SA/pages/login/index.ts +9 -0
  52. package/i18n/ar-SA/pages/login/lti.ts +23 -0
  53. package/i18n/ar-SA/pages/login/saml.ts +7 -0
  54. package/i18n/ar-SA/pages/login/scorm.ts +28 -0
  55. package/i18n/ar-SA/pages/vendor.ts +11 -0
  56. package/i18n/ar-SA/shared/content_blocks.ts +9 -0
  57. package/i18n/ar-SA/shared/error.ts +9 -0
  58. package/i18n/ar-SA/shared/file.ts +5 -0
  59. package/i18n/ar-SA/shared/index.ts +17 -0
  60. package/i18n/ar-SA/shared/menu.ts +3 -0
  61. package/i18n/ar-SA/shared/notification.ts +14 -0
  62. package/i18n/ar-SA/shared/permission.ts +52 -0
  63. package/i18n/ar-SA/shared/settings.ts +9 -0
  64. package/i18n/en-US/components/content/blocks/action_panel/index.ts +2 -0
  65. package/i18n/en-US/components/content/blocks/action_panel/transform_activity.ts +8 -0
  66. package/i18n/en-US/components/content/blocks/action_panel/transform_block.ts +1 -1
  67. package/i18n/en-US/components/content/blocks/external_integration/lti_consumer.ts +1 -0
  68. package/i18n/en-US/components/integration/job.ts +2 -0
  69. package/i18n/en-US/components/navigation/integrations.ts +1 -0
  70. package/i18n/en-US/components/settings/external_integration/lti_consumer.ts +2 -0
  71. package/i18n/en-US/pages/admin/index.ts +5 -0
  72. package/i18n/en-US/pages/admin/translateCourse.ts +68 -0
  73. package/i18n/en-US/pages/index.ts +2 -0
  74. package/i18n/es-ES/components/content/blocks/action_panel/index.ts +2 -0
  75. package/i18n/es-ES/components/content/blocks/action_panel/transform_activity.ts +8 -0
  76. package/i18n/es-ES/components/content/blocks/action_panel/transform_block.ts +1 -1
  77. package/i18n/es-ES/components/content/blocks/external_integration/lti_consumer.ts +8 -7
  78. package/i18n/es-ES/components/integration/job.ts +2 -0
  79. package/i18n/es-ES/components/navigation/integrations.ts +1 -0
  80. package/i18n/es-ES/components/settings/external_integration/lti_consumer.ts +3 -0
  81. package/i18n/es-ES/pages/admin/index.ts +5 -0
  82. package/i18n/es-ES/pages/admin/translateCourse.ts +68 -0
  83. package/i18n/es-ES/pages/index.ts +2 -0
  84. package/i18n/fr-FR/components/ai_agent/chat.ts +20 -0
  85. package/i18n/fr-FR/components/ai_agent/index.ts +5 -0
  86. package/i18n/fr-FR/components/content/blocks/action_panel/index.ts +5 -0
  87. package/i18n/fr-FR/components/content/blocks/action_panel/transform_block.ts +9 -0
  88. package/i18n/fr-FR/components/content/blocks/external_integration/index.ts +5 -0
  89. package/i18n/fr-FR/components/content/blocks/external_integration/lti_consumer.ts +17 -0
  90. package/i18n/fr-FR/components/content/blocks/index.ts +7 -0
  91. package/i18n/fr-FR/components/content/index.ts +5 -0
  92. package/i18n/fr-FR/components/external_integration/driver/lti1p1.ts +17 -0
  93. package/i18n/fr-FR/components/external_integration/driver/lti1p3.ts +25 -0
  94. package/i18n/fr-FR/components/external_integration/driver/scorm.ts +14 -0
  95. package/i18n/fr-FR/components/external_integration/index.ts +36 -0
  96. package/i18n/fr-FR/components/external_integration/provider_target.ts +9 -0
  97. package/i18n/fr-FR/components/file_import/index.ts +5 -0
  98. package/i18n/fr-FR/components/file_import/resourcespace.ts +4 -0
  99. package/i18n/fr-FR/components/index.ts +19 -0
  100. package/i18n/fr-FR/components/integration/driver.ts +67 -0
  101. package/i18n/fr-FR/components/integration/index.ts +9 -0
  102. package/i18n/fr-FR/components/integration/job.ts +25 -0
  103. package/i18n/fr-FR/components/integration/job_log.ts +24 -0
  104. package/i18n/fr-FR/components/llm/blooms.ts +15 -0
  105. package/i18n/fr-FR/components/llm/content_selector.ts +3 -0
  106. package/i18n/fr-FR/components/llm/generate_content/fake_text_stream.ts +62 -0
  107. package/i18n/fr-FR/components/llm/generate_content/generate_questions.ts +92 -0
  108. package/i18n/fr-FR/components/llm/generate_content/index.ts +8 -0
  109. package/i18n/fr-FR/components/llm/index.ts +10 -0
  110. package/i18n/fr-FR/components/navigation/index.ts +5 -0
  111. package/i18n/fr-FR/components/navigation/integrations.ts +9 -0
  112. package/i18n/fr-FR/components/settings/external_integration/index.ts +5 -0
  113. package/i18n/fr-FR/components/settings/external_integration/lti_consumer.ts +10 -0
  114. package/i18n/fr-FR/components/settings/index.ts +5 -0
  115. package/i18n/fr-FR/index.ts +16 -0
  116. package/i18n/fr-FR/modules/index.ts +5 -0
  117. package/i18n/fr-FR/pages/admin/index.ts +5 -0
  118. package/i18n/fr-FR/pages/admin/translateCourse.ts +68 -0
  119. package/i18n/fr-FR/pages/course/external_integration/index.ts +6 -0
  120. package/i18n/fr-FR/pages/course/index.ts +5 -0
  121. package/i18n/fr-FR/pages/importContent.ts +3 -0
  122. package/i18n/fr-FR/pages/importCourse.ts +13 -0
  123. package/i18n/fr-FR/pages/index.ts +15 -0
  124. package/i18n/fr-FR/pages/login/index.ts +9 -0
  125. package/i18n/fr-FR/pages/login/lti.ts +23 -0
  126. package/i18n/fr-FR/pages/login/saml.ts +7 -0
  127. package/i18n/fr-FR/pages/login/scorm.ts +28 -0
  128. package/i18n/fr-FR/pages/vendor.ts +11 -0
  129. package/i18n/fr-FR/shared/content_blocks.ts +9 -0
  130. package/i18n/fr-FR/shared/error.ts +9 -0
  131. package/i18n/fr-FR/shared/file.ts +5 -0
  132. package/i18n/fr-FR/shared/index.ts +17 -0
  133. package/i18n/fr-FR/shared/menu.ts +3 -0
  134. package/i18n/fr-FR/shared/notification.ts +14 -0
  135. package/i18n/fr-FR/shared/permission.ts +52 -0
  136. package/i18n/fr-FR/shared/settings.ts +9 -0
  137. package/i18n/index.ts +4 -0
  138. package/i18n/sv-SE/components/content/blocks/action_panel/index.ts +2 -0
  139. package/i18n/sv-SE/components/content/blocks/action_panel/transform_activity.ts +8 -0
  140. package/i18n/sv-SE/components/content/blocks/action_panel/transform_block.ts +1 -1
  141. package/i18n/sv-SE/components/content/blocks/external_integration/lti_consumer.ts +9 -8
  142. package/i18n/sv-SE/components/integration/job.ts +6 -4
  143. package/i18n/sv-SE/components/navigation/integrations.ts +1 -0
  144. package/i18n/sv-SE/components/settings/external_integration/lti_consumer.ts +3 -0
  145. package/i18n/sv-SE/pages/admin/index.ts +5 -0
  146. package/i18n/sv-SE/pages/admin/translateCourse.ts +68 -0
  147. package/i18n/sv-SE/pages/index.ts +2 -0
  148. package/package.json +1 -1
  149. package/pages/admin/translateCourse.vue +81 -0
  150. package/plugin.js +32 -0
@@ -64,7 +64,7 @@
64
64
  (consumer.id ? 'change_key' : 'key')
65
65
  )
66
66
  "
67
- :rules="$Validation.getRule('exists')"
67
+ :rules="isNew ? $Validation.getRule('exists') : []"
68
68
  ></v-text-field>
69
69
 
70
70
  <v-text-field
@@ -83,7 +83,7 @@
83
83
  : 'secret')
84
84
  )
85
85
  "
86
- :rules="$Validation.getRule('exists')"
86
+ :rules="isNew ? $Validation.getRule('exists') : []"
87
87
  >
88
88
  </v-text-field>
89
89
 
@@ -172,6 +172,7 @@ import Course from '~/models/Course'
172
172
  import TextEditor from '~/components/Text/TextEditor.vue'
173
173
  import FormVue from '~/components/Core/Form'
174
174
  import Crypto from '~/helpers/Crypto'
175
+ import Uuid from '~/helpers/Uuid'
175
176
 
176
177
  export default {
177
178
  name: 'ManageLti1p1ConsumerDriver',
@@ -196,6 +197,7 @@ export default {
196
197
  return {
197
198
  render: false,
198
199
  consumer: {
200
+ type: 'lti',
199
201
  version: '1.1',
200
202
  metadata: {
201
203
  custom: [],
@@ -237,6 +239,9 @@ export default {
237
239
  organization: 'organization/get',
238
240
  course: 'course/get',
239
241
  }),
242
+ isNew() {
243
+ return !Uuid.test(this.consumer.id)
244
+ },
240
245
  },
241
246
  created() {
242
247
  if (_.isEmpty(this.value)) {
@@ -314,6 +319,7 @@ export default {
314
319
  },
315
320
  resetConsumer() {
316
321
  const emptyConsumer = {
322
+ type: 'lti',
317
323
  version: '1.1',
318
324
  metadata: {
319
325
  custom: [],
@@ -268,6 +268,7 @@ import Role from '~/models/Role'
268
268
  import Organization from '~/models/Organization'
269
269
  import Course from '~/models/Course'
270
270
  import Crypto from '~/helpers/Crypto'
271
+ import Uuid from '~/helpers/Uuid'
271
272
 
272
273
  export default {
273
274
  name: 'ManageLti1p1ProviderDriver',
@@ -321,6 +322,9 @@ export default {
321
322
  course: 'course/get',
322
323
  contentTree: 'content/getTree',
323
324
  }),
325
+ isNew() {
326
+ return !Uuid.test(this.provider.id)
327
+ },
324
328
  },
325
329
  created() {
326
330
  if (_.isEmpty(this.value)) {
@@ -187,8 +187,8 @@ export default {
187
187
  return {
188
188
  render: false,
189
189
  consumer: {
190
- version: '1.3',
191
190
  type: 'lti',
191
+ version: '1.3',
192
192
  metadata: {
193
193
  custom: [],
194
194
  security_level: '',
@@ -307,8 +307,8 @@ export default {
307
307
  },
308
308
  resetConsumer() {
309
309
  const emptyConsumer = {
310
- version: '1.3',
311
310
  type: 'lti',
311
+ version: '1.3',
312
312
  metadata: {
313
313
  custom: [],
314
314
  security_level: '',
@@ -167,6 +167,7 @@ export default {
167
167
  props: {
168
168
  channel: { type: String, required: true },
169
169
  event: { type: String, required: true },
170
+ jobType: { type: String, default: null }, // 'translation' or null for all
170
171
  },
171
172
  data() {
172
173
  return {
@@ -196,6 +197,15 @@ export default {
196
197
  },
197
198
  vendorFromOrgIntegration() {
198
199
  return (id) => {
200
+ // Handle null organization_integration_id (translation jobs)
201
+ if (!id) {
202
+ return {
203
+ name: this.$t(
204
+ 'windward.integrations.components.integration.job.vendor_name_translation'
205
+ ),
206
+ }
207
+ }
208
+
199
209
  const orgIntegration = this.orgIntegrations.find(
200
210
  (o) => o.id === id
201
211
  )
@@ -208,12 +218,24 @@ export default {
208
218
  vendor = foundVendor
209
219
  }
210
220
  }
211
- // this.orgIntegrations.map(({ foo }) => foo)
212
221
  return vendor
213
222
  }
214
223
  },
215
224
  jobDetails() {
216
225
  return (job) => {
226
+ // Translation job details
227
+ if (_.get(job.metadata, 'type') === 'translation') {
228
+ const sourceCourseId = _.get(job.metadata, 'source_course_id', '')
229
+ const targetLocaleId = _.get(job.metadata, 'target_locale_id', '')
230
+ const courseIdShort = sourceCourseId.substring(sourceCourseId.length - 6).toUpperCase()
231
+ const localeIdShort = targetLocaleId.substring(targetLocaleId.length - 6).toUpperCase()
232
+ return this.$t(
233
+ 'windward.integrations.components.integration.job.job_details.translate_course',
234
+ [courseIdShort, localeIdShort]
235
+ )
236
+ }
237
+
238
+ // Import job details
217
239
  if (
218
240
  _.get(job.metadata, 'import.remote_course.id') &&
219
241
  _.get(job.metadata, 'import.remote_course.name')
@@ -240,6 +262,10 @@ export default {
240
262
  this.socket = this.$Integration.getSocket()
241
263
  this.connect(this.channel, this.event)
242
264
  },
265
+ // Refresh data when tab becomes active (for keep-alive components)
266
+ activated() {
267
+ this.loadJobs()
268
+ },
243
269
  methods: {
244
270
  doConfetti() {
245
271
  // launch a few confetti from the left edge
@@ -267,13 +293,19 @@ export default {
267
293
  .include('vendor')
268
294
  .get()
269
295
 
270
- this.jobs = await new Organization({
296
+ let jobsQuery = new Organization({
271
297
  id: this.organization.id,
272
298
  })
273
299
  .integrationJobs()
274
300
  .orderBy('-created_at')
275
301
  .limit(10)
276
- .get()
302
+
303
+ // Filter by job type if specified
304
+ if (this.jobType) {
305
+ jobsQuery = jobsQuery.where('metadata->type', this.jobType)
306
+ }
307
+
308
+ this.jobs = await jobsQuery.get()
277
309
  },
278
310
  connect(channel, event) {
279
311
  this.socket.connector.pusher.connection.bind(