@windward/core 0.13.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.
- package/CHANGELOG.md +6 -0
- package/bitbucket-pipelines.yml +8 -0
- package/components/Content/Blocks/UserUpload/ManageDataTableUserFiles.vue +2 -11
- package/components/Content/Blocks/Video.vue +1 -1
- package/components/Glossary/GlossaryVerification.vue +240 -0
- package/components/Navigation/Items/AskTheExpert.vue +1 -37
- package/components/Navigation/Items/GlossaryNav.vue +8 -2
- package/components/Navigation/Items/UserUploadNav.vue +10 -2
- package/components/Settings/AccordionSettings.vue +37 -27
- package/components/Settings/ClickableIconsSettings.vue +34 -7
- package/components/Settings/ImageSettings.vue +5 -12
- package/components/Settings/TabSettings.vue +33 -23
- package/components/Settings/TextEditorSettings.vue +16 -245
- package/components/Settings/VideoSettings.vue +1 -1
- package/components/utils/ContentViewer.vue +3 -3
- package/components/utils/TinyMCEWrapper.vue +24 -14
- package/components/utils/glossary/CourseGlossary.vue +66 -91
- package/components/utils/glossary/CourseGlossaryForm.vue +42 -13
- package/components/utils/glossary/GlossaryToolTip.vue +7 -11
- package/helpers/GlossaryHelper.ts +18 -16
- package/i18n/en-US/pages/glossary.ts +3 -1
- package/i18n/en-US/shared/notification.ts +5 -0
- package/i18n/en-US/shared/permission.ts +4 -0
- package/i18n/es-ES/pages/glossary.ts +3 -1
- package/i18n/es-ES/shared/notification.ts +5 -0
- package/i18n/es-ES/shared/permission.ts +8 -4
- package/i18n/sv-SE/pages/glossary.ts +3 -1
- package/i18n/sv-SE/shared/notification.ts +4 -0
- package/i18n/sv-SE/shared/permission.ts +8 -4
- package/jest.config.js +3 -0
- package/models/BaseModel.ts +16 -0
- package/models/CourseGlossaryTerm.ts +22 -0
- package/models/UserFileAsset.ts +1 -0
- package/package.json +4 -3
- package/pages/glossary.vue +11 -3
- package/pages/userUpload.vue +1 -1
- package/plugin.js +32 -22
- package/store/glossary.js +57 -0
- package/test/Components/Content/Blocks/Feedback.spec.js +3 -1
- package/test/Components/Content/Blocks/Video.spec.js +2 -2
- package/test/Components/Glossary/GlossaryVerification.spec.js +19 -0
- package/test/Components/utils/glossary/CourseGlossary.spec.js +19 -0
- package/test/Components/utils/glossary/CourseGlossaryForm.spec.js +28 -0
- package/test/__mocks__/helpersMock.js +0 -24
- package/test/__mocks__/modelMock.js +5 -0
- package/test/helpers/GlossaryHelper.spec.js +32 -14
- package/test/mocks.js +11 -0
- package/test/setup/before.js +15 -0
- package/helpers/GlossaryTerm.ts +0 -31
|
@@ -10,29 +10,21 @@
|
|
|
10
10
|
class="elevation-1"
|
|
11
11
|
>
|
|
12
12
|
<template #top>
|
|
13
|
-
<v-toolbar
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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(
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
<
|
|
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>
|
|
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
|
-
'
|
|
99
|
+
'plugin.windward.core.organization.course.glossary',
|
|
101
100
|
'writable'
|
|
102
|
-
)
|
|
101
|
+
) ||
|
|
103
102
|
$PermissionService.userHasAccessTo(
|
|
104
|
-
'
|
|
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
|
-
|
|
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.
|
|
225
|
+
text: this.$t('windward.core.pages.glossary.related_terms'),
|
|
227
226
|
align: 'start',
|
|
228
227
|
sortable: true,
|
|
229
|
-
value: '
|
|
228
|
+
value: 'related_terms',
|
|
230
229
|
},
|
|
231
230
|
]
|
|
232
231
|
if (
|
|
233
232
|
this.$PermissionService.userHasAccessTo(
|
|
234
|
-
'
|
|
233
|
+
'plugin.windward.core.organization.course.glossary',
|
|
235
234
|
'writable'
|
|
236
|
-
)
|
|
235
|
+
) ||
|
|
237
236
|
this.$PermissionService.userHasAccessTo(
|
|
238
|
-
'
|
|
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
|
-
|
|
260
|
-
this.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
|
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-
|
|
42
|
-
v-model="selectedTerm.
|
|
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
|
-
|
|
47
|
-
|
|
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
|
|
101
|
+
if (this.selectedTerm.term !== item.term) return item
|
|
88
102
|
})
|
|
89
103
|
},
|
|
90
104
|
},
|
|
91
105
|
watch: {
|
|
92
|
-
value
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
|
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:
|
|
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 =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
139
|
+
new CourseGlossaryTerm({
|
|
138
140
|
term: _.trim(match[1]),
|
|
139
141
|
definition: 'n/a',
|
|
140
142
|
})
|
|
@@ -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
|
-
|
|
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
|
-
'
|
|
4
|
+
'Acceso a comentarios para el usuario actual',
|
|
5
5
|
'plugin->windward->core->organization->course->user->userUpload':
|
|
6
|
-
'
|
|
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
|
-
'
|
|
13
|
+
'Los usuarios actuales tienen acceso al bloque de comentarios',
|
|
12
14
|
'plugin->windward->core->organization->course->user->userUpload':
|
|
13
|
-
'
|
|
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
|
-
|
|
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
|
}
|