@windward/core 0.14.0 → 0.15.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 (48) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/bitbucket-pipelines.yml +8 -0
  3. package/components/Content/Blocks/UserUpload/ManageDataTableUserFiles.vue +2 -11
  4. package/components/Content/Blocks/Video.vue +1 -1
  5. package/components/Glossary/GlossaryVerification.vue +240 -0
  6. package/components/Navigation/Items/GlossaryNav.vue +8 -2
  7. package/components/Navigation/Items/UserUploadNav.vue +10 -2
  8. package/components/Settings/AccordionSettings.vue +37 -27
  9. package/components/Settings/ClickableIconsSettings.vue +1 -0
  10. package/components/Settings/ImageSettings.vue +5 -12
  11. package/components/Settings/TabSettings.vue +33 -23
  12. package/components/Settings/TextEditorSettings.vue +16 -245
  13. package/components/Settings/VideoSettings.vue +1 -1
  14. package/components/utils/ContentViewer.vue +3 -3
  15. package/components/utils/TinyMCEWrapper.vue +24 -14
  16. package/components/utils/glossary/CourseGlossary.vue +66 -91
  17. package/components/utils/glossary/CourseGlossaryForm.vue +42 -13
  18. package/components/utils/glossary/GlossaryToolTip.vue +7 -11
  19. package/helpers/GlossaryHelper.ts +18 -16
  20. package/i18n/en-US/pages/glossary.ts +3 -1
  21. package/i18n/en-US/shared/notification.ts +5 -0
  22. package/i18n/en-US/shared/permission.ts +4 -0
  23. package/i18n/es-ES/pages/glossary.ts +3 -1
  24. package/i18n/es-ES/shared/notification.ts +5 -0
  25. package/i18n/es-ES/shared/permission.ts +8 -4
  26. package/i18n/sv-SE/pages/glossary.ts +3 -1
  27. package/i18n/sv-SE/shared/notification.ts +4 -0
  28. package/i18n/sv-SE/shared/permission.ts +8 -4
  29. package/jest.config.js +3 -0
  30. package/models/BaseModel.ts +16 -0
  31. package/models/CourseGlossaryTerm.ts +22 -0
  32. package/models/UserFileAsset.ts +1 -0
  33. package/package.json +4 -3
  34. package/pages/glossary.vue +11 -3
  35. package/pages/userUpload.vue +1 -1
  36. package/plugin.js +33 -11
  37. package/store/glossary.js +57 -0
  38. package/test/Components/Content/Blocks/Feedback.spec.js +3 -1
  39. package/test/Components/Content/Blocks/Video.spec.js +2 -2
  40. package/test/Components/Glossary/GlossaryVerification.spec.js +19 -0
  41. package/test/Components/utils/glossary/CourseGlossary.spec.js +19 -0
  42. package/test/Components/utils/glossary/CourseGlossaryForm.spec.js +28 -0
  43. package/test/__mocks__/helpersMock.js +0 -24
  44. package/test/__mocks__/modelMock.js +5 -0
  45. package/test/helpers/GlossaryHelper.spec.js +32 -14
  46. package/test/mocks.js +11 -0
  47. package/test/setup/before.js +15 -0
  48. package/helpers/GlossaryTerm.ts +0 -31
@@ -10,29 +10,21 @@
10
10
  class="elevation-1"
11
11
  >
12
12
  <template #top>
13
- <v-toolbar flat>
13
+ <v-toolbar
14
+ v-if="
15
+ $PermissionService.userHasAccessTo(
16
+ 'plugin.windward.core.organization.course.glossary',
17
+ 'writable'
18
+ )
19
+ "
20
+ flat
21
+ >
14
22
  <DialogBox
15
23
  v-model="dialog"
16
24
  color="primary"
17
- max-width="600"
18
- :trigger="
19
- $PermissionService.userHasAccessTo(
20
- 'windward.global.course,windward.organization.course.contentBlock',
21
- 'writable'
22
- )
23
- "
24
- :action-save-new="
25
- $PermissionService.userHasAccessTo(
26
- 'windward.global.course,windward.organization.course.contentBlock',
27
- 'writable'
28
- )
29
- "
30
- :action-save="
31
- $PermissionService.userHasAccessTo(
32
- 'windward.global.course,windward.organization.course.contentBlock',
33
- 'writable'
34
- )
35
- "
25
+ trigger
26
+ action-save-new
27
+ action-save
36
28
  :disabled="disabled"
37
29
  @click:save="save"
38
30
  @click:save-new="saveNew"
@@ -43,9 +35,9 @@
43
35
  >
44
36
  <template #title>
45
37
  {{
46
- $t('shared.forms.add') +
47
- ' ' +
48
- $t('windward.core.pages.glossary.term')
38
+ $t(
39
+ 'windward.core.pages.glossary.add_term'
40
+ )
49
41
  }}
50
42
  </template>
51
43
  <template #trigger>
@@ -53,7 +45,7 @@
53
45
  {{ $t('shared.forms.add') }}
54
46
  </template>
55
47
  <template #form="{ on, attrs }">
56
- <course-glossary-form
48
+ <CourseGlossaryForm
57
49
  v-model="selectedTerm"
58
50
  :glossary="glossaryTerms"
59
51
  :edit-mode="editMode"
@@ -92,16 +84,23 @@
92
84
  </div>
93
85
  </v-row>
94
86
  </td>
95
- <td>{{ item.related_term }}</td>
87
+ <td>
88
+ <v-chip
89
+ v-for="related in item.related_terms"
90
+ :key="related.id"
91
+ >
92
+ {{ related.term }}
93
+ </v-chip>
94
+ </td>
96
95
 
97
96
  <td
98
97
  v-if="
99
98
  $PermissionService.userHasAccessTo(
100
- 'windward.global.course,windward.organization.contentBlock,windward.organization.course.contentBlock',
99
+ 'plugin.windward.core.organization.course.glossary',
101
100
  'writable'
102
- ) &&
101
+ ) ||
103
102
  $PermissionService.userHasAccessTo(
104
- 'windward.organization.current,windward.organization.section,windward.organization.course',
103
+ 'plugin.windward.core.organization.course.glossary',
105
104
  'deletable'
106
105
  )
107
106
  "
@@ -112,16 +111,16 @@
112
111
  :disabled="disabled"
113
112
  >
114
113
  <v-btn
114
+ v-if="
115
+ $PermissionService.userHasAccessTo(
116
+ 'plugin.windward.core.organization.course.glossary',
117
+ 'deletable'
118
+ )
119
+ "
115
120
  color="error"
116
121
  class="outlined"
117
122
  elevation="0"
118
123
  outlined
119
- :disabled="
120
- !$PermissionService.userHasAccessTo(
121
- 'windward.global.course,windward.organization.course.contentBlock',
122
- 'writable'
123
- )
124
- "
125
124
  @click="onDelete(item)"
126
125
  >
127
126
  {{ $t('shared.forms.delete') }}
@@ -130,16 +129,16 @@
130
129
  }}</span>
131
130
  </v-btn>
132
131
  <v-btn
132
+ v-if="
133
+ $PermissionService.userHasAccessTo(
134
+ 'plugin.windward.core.organization.course.glossary',
135
+ 'writable'
136
+ )
137
+ "
133
138
  color="primary"
134
139
  class="outlined"
135
140
  elevation="0"
136
141
  outlined
137
- :disabled="
138
- !$PermissionService.userHasAccessTo(
139
- 'windward.global.course,windward.organization.course.contentBlock',
140
- 'writable'
141
- )
142
- "
143
142
  @click="editTerm(item)"
144
143
  >
145
144
  {{ $t('shared.forms.edit') }}
@@ -158,13 +157,14 @@
158
157
  </template>
159
158
 
160
159
  <script>
161
- import { mapGetters, mapMutations } from 'vuex'
160
+ import { mapGetters, mapMutations, mapActions } from 'vuex'
162
161
  import _ from 'lodash'
163
162
  import { encode } from 'he'
164
163
  import CourseGlossaryForm from './CourseGlossaryForm'
165
164
  import DialogBox from '~/components/Core/DialogBox.vue'
166
165
  import Crypto from '~/helpers/Crypto'
167
166
  import Course from '~/models/Course'
167
+ import CourseGlossaryTerm from '../../../models/CourseGlossaryTerm'
168
168
  import SpeedDial from '~/components/Core/SpeedDial.vue'
169
169
  import TextViewer from '~/components/Text/TextViewer.vue'
170
170
 
@@ -180,22 +180,21 @@ export default {
180
180
  return {
181
181
  dialog: false,
182
182
  editMode: false,
183
- glossaryTerms: [],
184
183
  selectedTerm: {},
185
184
  search: '',
186
185
  tableKey: Crypto.id(),
187
186
  defaultTerm: {
188
187
  term: '',
189
188
  definition: '',
190
- alternate_forms: '',
191
- related_term: '',
189
+ alternate_forms: [],
190
+ related_terms: [],
192
191
  },
193
192
  }
194
193
  },
195
-
196
194
  computed: {
197
195
  ...mapGetters({
198
196
  course: 'course/get',
197
+ glossaryTerms: 'glossary/getTerms',
199
198
  }),
200
199
  ...mapMutations({
201
200
  saveCourse: 'course/set',
@@ -223,19 +222,19 @@ export default {
223
222
  value: 'alternate_forms',
224
223
  },
225
224
  {
226
- text: this.$t('windward.core.pages.glossary.related_term'),
225
+ text: this.$t('windward.core.pages.glossary.related_terms'),
227
226
  align: 'start',
228
227
  sortable: true,
229
- value: 'related_term',
228
+ value: 'related_terms',
230
229
  },
231
230
  ]
232
231
  if (
233
232
  this.$PermissionService.userHasAccessTo(
234
- 'windward.global.course,windward.organization.contentBlock,windward.organization.course.contentBlock',
233
+ 'plugin.windward.core.organization.course.glossary',
235
234
  'writable'
236
- ) &&
235
+ ) ||
237
236
  this.$PermissionService.userHasAccessTo(
238
- 'windward.organization.current,windward.organization.section,windward.organization.course',
237
+ 'plugin.windward.core.organization.course.glossary',
239
238
  'deletable'
240
239
  )
241
240
  ) {
@@ -248,40 +247,19 @@ export default {
248
247
  return headers
249
248
  },
250
249
  },
251
-
252
- beforeMount() {
253
- if (this.course.metadata && _.isArray(this.course.metadata.glossary)) {
254
- this.glossaryTerms = _.cloneDeep(this.course.metadata.glossary)
255
- }
256
- },
257
250
  methods: {
251
+ ...mapActions({
252
+ reloadGlossary: 'glossary/load',
253
+ }),
258
254
  async save() {
259
- let currentGlossaryItemIndex = -1
260
- this.glossaryTerms.filter((item, index) => {
261
- if (item.term === this.selectedTerm.term) {
262
- currentGlossaryItemIndex = index
263
- return item
264
- }
265
- })
266
- if (currentGlossaryItemIndex > -1) {
267
- this.glossaryTerms[currentGlossaryItemIndex] = this.selectedTerm
268
- } else {
269
- this.glossaryTerms.push(this.selectedTerm)
270
- }
271
- const course = new Course(_.cloneDeep(this.course))
272
- if (
273
- !course.hasOwnProperty('metadata') ||
274
- course.metadata === null
275
- ) {
276
- course.metadata = {}
277
- course.metadata.glossary = {}
278
- }
255
+ // Save the term
256
+ await new CourseGlossaryTerm(_.cloneDeep(this.selectedTerm))
257
+ .for(new Course(this.course))
258
+ .save()
259
+
260
+ // And update our local list
261
+ this.reloadGlossary(this.course)
279
262
 
280
- if (course.metadata.glossary !== undefined) {
281
- course.metadata.glossary = this.glossaryTerms
282
- }
283
- const updatedCourse = await course.save()
284
- this.$store.commit('course/set', updatedCourse)
285
263
  this.$toast.success(this.$t('shared.forms.saved'))
286
264
  // force update on datatable
287
265
  this.tableKey = Crypto.id()
@@ -327,16 +305,13 @@ export default {
327
305
  })
328
306
  },
329
307
  async deleteTerm(item) {
330
- const deleteIndex = this.glossaryTerms.indexOf(item)
331
- this.glossaryTerms.splice(deleteIndex, 1)
332
- const course = new Course(this.course)
333
- if (_.isEmpty(course.metadata)) {
334
- course.metadata = {}
335
- course.metadata.glossary = {}
336
- }
337
- course.metadata.glossary = this.glossaryTerms
338
- const updatedCourse = await course.save()
339
- this.$store.commit('course/set', updatedCourse)
308
+ // Delete the term
309
+ await new CourseGlossaryTerm(_.cloneDeep(item))
310
+ .for(new Course(this.course))
311
+ .delete()
312
+
313
+ // And update our local list
314
+ this.reloadGlossary(this.course)
340
315
  this.$toast.success(this.$t('shared.response.deleted'))
341
316
  },
342
317
  close() {
@@ -7,7 +7,7 @@
7
7
  :label="$t('windward.core.pages.glossary.term')"
8
8
  required
9
9
  :rules="validation.termRules"
10
- :disabled="editMode"
10
+ :disabled="editMode || disabled"
11
11
  ></v-text-field>
12
12
  <br />
13
13
  <v-textarea
@@ -16,6 +16,7 @@
16
16
  outlined
17
17
  required
18
18
  :rules="validation.definitionRules"
19
+ :disabled="disabled"
19
20
  ></v-textarea>
20
21
  <br />
21
22
  <v-combobox
@@ -25,12 +26,14 @@
25
26
  :label="$t('windward.core.pages.glossary.alternate_forms')"
26
27
  multiple
27
28
  solo
29
+ :disabled="disabled"
28
30
  >
29
- <template v-slot:selection="{ attrs, item, select, selected }">
31
+ <template #selection="{ attrs, item, select, selected }">
30
32
  <v-chip
31
33
  v-bind="attrs"
32
34
  :input-value="selected"
33
35
  close
36
+ :disabled="disabled"
34
37
  @click:close="removeAlternateForm(item)"
35
38
  >
36
39
  <strong>{{ item }}</strong>
@@ -38,17 +41,22 @@
38
41
  </template>
39
42
  </v-combobox>
40
43
  <br />
41
- <v-select
42
- v-model="selectedTerm.related_term"
44
+ <v-autocomplete
45
+ v-model="selectedTerm.related_terms"
43
46
  :items="termList"
47
+ item-text="term"
48
+ return-object
44
49
  outlined
45
50
  clearable
46
- :label="$t('windward.core.pages.glossary.related_term')"
47
- ></v-select>
51
+ multiple
52
+ :disabled="disabled"
53
+ :label="$t('windward.core.pages.glossary.related_terms')"
54
+ ></v-autocomplete>
48
55
  </v-form>
49
56
  </template>
50
57
 
51
58
  <script>
59
+ import _ from 'lodash'
52
60
  import Form from '~/components/Core/Form'
53
61
  export default {
54
62
  name: 'CourseGlossaryForm',
@@ -57,17 +65,23 @@ export default {
57
65
  value: { type: Object, required: true },
58
66
  glossary: { type: Array, required: true },
59
67
  editMode: { type: Boolean, required: false, default: false },
68
+ disabled: { type: Boolean, required: false, default: false },
60
69
  },
61
70
  data() {
62
71
  return {
63
- selectedTerm: {},
72
+ selectedTerm: {
73
+ term: '',
74
+ definition: '',
75
+ alternate_forms: [],
76
+ related_terms: [],
77
+ },
64
78
  relatedTerm: [],
65
79
  validation: {
66
80
  termRules: [
67
81
  (v) => !!v || this.$t('shared.forms.errors.required'),
68
82
  (v) =>
69
83
  (v && v.length <= 50) ||
70
- this.$t('forms.errors.text_lt', [50]),
84
+ this.$t('shared.forms.errors.text_lt', [50]),
71
85
  (v) =>
72
86
  (v && this.termIsUnique(v)) ||
73
87
  this.$t('shared.forms.errors.field_unique'),
@@ -84,18 +98,33 @@ export default {
84
98
  computed: {
85
99
  termList() {
86
100
  return this.glossary.flatMap((item) => {
87
- if (this.selectedTerm.term !== item.term) return item.term
101
+ if (this.selectedTerm.term !== item.term) return item
88
102
  })
89
103
  },
90
104
  },
91
105
  watch: {
92
- value() {
93
- // Refresh the question model when we open / close the dialog
94
- this.selectedTerm = this.value
106
+ value: {
107
+ deep: true,
108
+ handler(newValue) {
109
+ // Refresh the question model when we open / close the dialog
110
+ this.selectedTerm = _.merge(
111
+ this.selectedTerm,
112
+ _.cloneDeep(newValue)
113
+ )
114
+ },
115
+ },
116
+ selectedTerm: {
117
+ deep: true,
118
+ handler(newValue) {
119
+ if (!_.isEqual(newValue, this.value)) {
120
+ this.$emit('input', newValue)
121
+ }
122
+ },
95
123
  },
96
124
  },
97
125
  mounted() {
98
- this.selectedTerm = this.value
126
+ // Merge to preserve keys in case the value is an empty object for new glossary terms
127
+ this.selectedTerm = _.merge(this.selectedTerm, _.cloneDeep(this.value))
99
128
  },
100
129
  methods: {
101
130
  termIsUnique(term) {
@@ -8,11 +8,7 @@
8
8
  :z-index="20"
9
9
  >
10
10
  <template #activator="{ on }">
11
- <span
12
- tabindex="0"
13
- v-on="on"
14
- @click.stop="show = !show"
15
- >
11
+ <span tabindex="0" v-on="on" @click.stop="show = !show">
16
12
  <slot name="term"></slot>
17
13
  </span>
18
14
  </template>
@@ -34,7 +30,7 @@
34
30
  </p>
35
31
  </div>
36
32
  <div v-if="$slots['alternate_forms']">
37
- <h4 class="text-capitalize">
33
+ <h6 class="text-capitalize">
38
34
  <slot name="term"></slot>
39
35
  {{
40
36
  $t(
@@ -42,19 +38,19 @@
42
38
  )
43
39
  }}
44
40
  :
45
- </h4>
41
+ </h6>
46
42
  <p><slot name="alternate_forms"></slot></p>
47
43
  </div>
48
44
 
49
45
  <div v-if="$slots['related_terms']">
50
- <h4 class="text-capitalize">
46
+ <h6 class="text-capitalize">
51
47
  {{
52
48
  $t(
53
49
  'windward.core.components.utils.tiny_mce_wrapper.related_terms'
54
50
  )
55
51
  }}
56
52
  :
57
- </h4>
53
+ </h6>
58
54
  <p><slot name="related_terms"></slot></p>
59
55
  </div>
60
56
  </v-card-text>
@@ -68,12 +64,12 @@ export default {
68
64
  name: 'GlossaryToolTip',
69
65
  data() {
70
66
  return {
71
- show: false
67
+ show: false,
72
68
  }
73
69
  },
74
70
  beforeDestroy() {
75
71
  this.show = false
76
- }
72
+ },
77
73
  }
78
74
  </script>
79
75
 
@@ -1,28 +1,30 @@
1
1
  import * as _ from 'lodash'
2
2
  import { decode } from 'he'
3
- import GlossaryTerm from '../helpers/GlossaryTerm'
3
+ import CourseGlossaryTerm from '../models/CourseGlossaryTerm'
4
4
 
5
5
  export default class GlossaryHelper {
6
6
  private static glossaryRegex =
7
7
  /<span.*?.class="glossary-word".*?>(.*?)<\/span>/g
8
8
 
9
- public static makeToolTip(term: GlossaryTerm, text: String): string {
9
+ public static makeToolTip(term: CourseGlossaryTerm, text: String): string {
10
10
  const word = _.isString(term.term)
11
11
  ? '<template v-slot:term>' + text + '</template>'
12
12
  : ''
13
13
  const definition = _.isString(term.definition)
14
14
  ? '<template v-slot:definition>' + term.definition + '</template>'
15
15
  : ''
16
- const alternate_forms = _.isString(term.alternate_forms)
17
- ? '<template v-slot:alternate_forms>' +
18
- term.alternate_forms +
19
- '</template>'
20
- : ''
21
- const related_terms = _.isString(term.related_term)
22
- ? '<template v-slot:related_terms>' +
23
- term.related_term +
24
- '</template>'
25
- : ''
16
+ const alternate_forms =
17
+ _.isArray(term.alternate_forms) && term.alternate_forms.length > 0
18
+ ? '<template v-slot:alternate_forms>' +
19
+ term.alternate_forms.join(',') +
20
+ '</template>'
21
+ : ''
22
+ const related_terms =
23
+ _.isArray(term.related_terms) && term.related_terms.length > 0
24
+ ? '<template v-slot:related_terms>' +
25
+ term.related_terms.map((t) => t.term).join(',') +
26
+ '</template>'
27
+ : ''
26
28
  return (
27
29
  '<plugin-core-glossary-tool-tip>' +
28
30
  word +
@@ -47,7 +49,7 @@ export default class GlossaryHelper {
47
49
  const currentGlossary = glossary
48
50
 
49
51
  let match: any
50
- const verifiedTerms: GlossaryTerm[] = []
52
+ const verifiedTerms: CourseGlossaryTerm[] = []
51
53
  while ((match = regex.exec(content)) !== null) {
52
54
  // This is necessary to avoid infinite loops with zero-width matches
53
55
  if (match.index === regex.lastIndex) {
@@ -78,7 +80,7 @@ export default class GlossaryHelper {
78
80
  ))) &&
79
81
  addTerm
80
82
  ) {
81
- verifiedTerms.push(new GlossaryTerm(term))
83
+ verifiedTerms.push(new CourseGlossaryTerm(term))
82
84
  }
83
85
  })
84
86
  }
@@ -97,7 +99,7 @@ export default class GlossaryHelper {
97
99
  content,
98
100
  glossary
99
101
  )
100
- const unVerifiedTerms: GlossaryTerm[] = []
102
+ const unVerifiedTerms: CourseGlossaryTerm[] = []
101
103
  while ((match = regex.exec(content)) !== null) {
102
104
  // This is necessary to avoid infinite loops with zero-width matches
103
105
  if (match.index === regex.lastIndex) {
@@ -134,7 +136,7 @@ export default class GlossaryHelper {
134
136
  })
135
137
  if (inGlossary.length === 0 && !inUnverifiedArray) {
136
138
  unVerifiedTerms.push(
137
- new GlossaryTerm({
139
+ new CourseGlossaryTerm({
138
140
  term: _.trim(match[1]),
139
141
  definition: 'n/a',
140
142
  })
@@ -1,7 +1,9 @@
1
1
  export default {
2
2
  title: 'Course Glossary',
3
3
  term: 'Term',
4
- related_term: 'Related Term',
4
+ add_term: 'Add Term',
5
+ edit_term: 'Edit Term',
6
+ related_terms: 'Related Terms',
5
7
  definition: 'definition',
6
8
  alternate_forms: 'Alternate Forms',
7
9
  }
@@ -9,5 +9,10 @@ export default {
9
9
  'windward-core-ask-the-expert': 'Course Ask the Expert',
10
10
  'windward-core-contact-support': 'Course Contact Support',
11
11
  },
12
+
13
+ type_recipient_address: {
14
+ 'windward-core-ask-the-expert': '{{courseowner->email}}',
15
+ 'windward-core-contact-support': '',
16
+ },
12
17
  },
13
18
  }
@@ -4,6 +4,8 @@ export default {
4
4
  'Feedback access for the current user',
5
5
  'plugin->windward->core->organization->course->user->userUpload':
6
6
  'User upload block access for the current user',
7
+ 'plugin->windward->core->organization->course->glossary':
8
+ 'Course Glossary',
7
9
  },
8
10
 
9
11
  type_description: {
@@ -11,5 +13,7 @@ export default {
11
13
  'The current users access to the feedback block',
12
14
  'plugin->windward->core->organization->course->user->userUpload':
13
15
  'The current users access to the user upload block',
16
+ 'plugin->windward->core->organization->course->glossary':
17
+ 'Access and manage the course glossary in the current organization for your own courses',
14
18
  },
15
19
  }
@@ -1,7 +1,9 @@
1
1
  export default {
2
2
  title: 'Glosario del curso',
3
3
  term: 'Plazo',
4
- related_term: 'Término relacionado',
4
+ add_term: 'Agregar término',
5
+ edit_term: 'Editar término',
6
+ related_terms: 'Términos relacionados',
5
7
  definition: 'definición',
6
8
  alternate_forms: 'Formas alternativas',
7
9
  }
@@ -10,5 +10,10 @@ export default {
10
10
  'windward-core-ask-the-expert': 'Curso Pregúntele al experto',
11
11
  'windward-core-contact-support': 'Soporte de contacto del curso',
12
12
  },
13
+ type_recipient_address: {
14
+ 'windward-core-ask-the-expert':
15
+ 'Correo electrónico del autor del curso',
16
+ 'windward-core-contact-support': '',
17
+ },
13
18
  },
14
19
  }
@@ -1,15 +1,19 @@
1
1
  export default {
2
2
  type_title: {
3
3
  'plugin->windward->core->organization->course->user->feedback':
4
- 'Feedback access for the current user',
4
+ 'Acceso a comentarios para el usuario actual',
5
5
  'plugin->windward->core->organization->course->user->userUpload':
6
- 'User upload block access for the current user',
6
+ 'Acceso bloqueado a la carga de usuarios para el usuario actual',
7
+ 'plugin->windward->core->organization->course->glossary':
8
+ 'Glosario del curso',
7
9
  },
8
10
 
9
11
  type_description: {
10
12
  'plugin->windward->core->organization->course->user->feedback':
11
- 'The current users access to the feedback block',
13
+ 'Los usuarios actuales tienen acceso al bloque de comentarios',
12
14
  'plugin->windward->core->organization->course->user->userUpload':
13
- 'The current users access to the user upload block',
15
+ 'Los usuarios actuales tienen acceso al bloque de subida de usuarios',
16
+ 'plugin->windward->core->organization->course->glossary':
17
+ 'Accede y gestiona el glosario del curso en la organización actual para tus propios cursos',
14
18
  },
15
19
  }
@@ -1,7 +1,9 @@
1
1
  export default {
2
2
  title: 'Kursordlista',
3
3
  term: 'Term',
4
- related_term: 'Relaterad term',
4
+ add_term: 'Lägg till term',
5
+ edit_term: 'Redigera term',
6
+ related_terms: 'Relaterade villkor',
5
7
  definition: 'definition',
6
8
  alternate_forms: 'Alternativa formulär',
7
9
  }
@@ -9,5 +9,9 @@ export default {
9
9
  'windward-core-ask-the-expert': 'Kurs Fråga experten',
10
10
  'windward-core-contact-support': 'Course Contact Support',
11
11
  },
12
+ type_recipient_address: {
13
+ 'windward-core-ask-the-expert': 'Kursägarens e-post',
14
+ 'windward-core-contact-support': '',
15
+ },
12
16
  },
13
17
  }