@windward/core 0.7.0 → 0.9.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 (64) hide show
  1. package/.eslintrc.js +5 -1
  2. package/.prettierrc +3 -2
  3. package/components/Content/Blocks/Accordion.vue +10 -2
  4. package/components/Content/Blocks/BlockQuote.vue +6 -2
  5. package/components/Content/Blocks/ClickableIcons.vue +12 -10
  6. package/components/Content/Blocks/Email.vue +7 -7
  7. package/components/Content/Blocks/GenerateAIQuestionButton.vue +85 -18
  8. package/components/Content/Blocks/HorizontalRule.vue +2 -0
  9. package/components/Content/Blocks/Image.vue +7 -182
  10. package/components/Content/Blocks/OpenResponse.vue +25 -0
  11. package/components/Content/Blocks/OpenResponseCollate.vue +13 -12
  12. package/components/Content/Blocks/ScenarioChoice.vue +10 -2
  13. package/components/Content/Blocks/Tab.vue +27 -3
  14. package/components/Content/Blocks/UserUpload.vue +5 -3
  15. package/components/Content/Blocks/Video.vue +33 -7
  16. package/components/Navigation/Items/GlossaryNav.vue +25 -10
  17. package/components/Settings/AccordionSettings.vue +20 -34
  18. package/components/Settings/BlockQuoteSettings.vue +17 -41
  19. package/components/Settings/ClickableIconsSettings.vue +18 -40
  20. package/components/Settings/EmailSettings.vue +12 -38
  21. package/components/Settings/FileDownloadSettings.vue +10 -35
  22. package/components/Settings/ImageSettings.vue +13 -247
  23. package/components/Settings/OpenResponseCollateSettings.vue +47 -55
  24. package/components/Settings/OpenResponseSettings.vue +62 -36
  25. package/components/Settings/ScenarioChoiceSettings.vue +13 -35
  26. package/components/Settings/TabSettings.vue +25 -34
  27. package/components/Settings/UserUploadSettings.vue +6 -30
  28. package/components/Settings/VideoSettings/SourcePicker.vue +1 -0
  29. package/components/Settings/VideoSettings.vue +6 -42
  30. package/components/utils/ContentViewer.vue +0 -3
  31. package/components/utils/FillInBlank/FillInBlankInput.vue +29 -47
  32. package/components/utils/TinyMCEWrapper.vue +42 -81
  33. package/components/utils/glossary/GlossaryToolTip.vue +6 -0
  34. package/helpers/GlossaryHelper.ts +12 -2
  35. package/helpers/tinymce/WindwardPlugins.ts +166 -118
  36. package/i18n/en-US/components/content/blocks/generate_questions.ts +3 -2
  37. package/i18n/en-US/components/settings/open_response_collate.ts +1 -1
  38. package/i18n/en-US/components/settings/scenario_choice.ts +3 -2
  39. package/i18n/en-US/components/settings/video.ts +1 -1
  40. package/i18n/en-US/components/utils/FillInBlank/FillInBlankInput.ts +2 -0
  41. package/i18n/en-US/components/utils/tiny_mce_wrapper.ts +1 -0
  42. package/i18n/en-US/shared/settings.ts +1 -1
  43. package/i18n/es-ES/components/content/blocks/generate_questions.ts +2 -1
  44. package/i18n/es-ES/components/settings/open_response_collate.ts +1 -1
  45. package/i18n/es-ES/components/settings/scenario_choice.ts +3 -2
  46. package/i18n/es-ES/components/settings/video.ts +1 -1
  47. package/i18n/es-ES/components/utils/FillInBlank/FillInBlankInput.ts +2 -0
  48. package/i18n/es-ES/components/utils/tiny_mce_wrapper.ts +3 -2
  49. package/i18n/es-ES/shared/settings.ts +1 -1
  50. package/i18n/sv-SE/components/content/blocks/generate_questions.ts +2 -1
  51. package/i18n/sv-SE/components/settings/open_response_collate.ts +1 -1
  52. package/i18n/sv-SE/components/settings/scenario_choice.ts +3 -2
  53. package/i18n/sv-SE/components/settings/video.ts +1 -1
  54. package/i18n/sv-SE/components/utils/FillInBlank/FillInBlankInput.ts +2 -0
  55. package/i18n/sv-SE/components/utils/tiny_mce_wrapper.ts +2 -0
  56. package/package.json +3 -2
  57. package/pages/glossary.vue +1 -1
  58. package/stylelint.config.js +14 -0
  59. package/test/Components/Content/Blocks/OpenResponseCollate.spec.js +3 -3
  60. package/test/Components/Settings/TabSettings.spec.js +2 -2
  61. package/test/__mocks__/contentBlockMock.js +20 -0
  62. package/test/__mocks__/modelMock.js +1 -1
  63. package/test/helpers/GlossaryHelper.spec.js +22 -3
  64. package/test/mocks.js +8 -0
@@ -1,176 +1,10 @@
1
1
  <template>
2
2
  <v-container>
3
- <ContentBlockAsset
4
- mimes="image/jpeg,image/png,image/gif"
5
- v-model="block.metadata.config.asset"
6
- class="mb-4"
7
- :label="
8
- $t(
9
- 'windward.core.components.settings.image.current_image_file'
10
- ) + ':'
11
- "
12
- :disabled="render"
3
+ <ImageAssetSettings
4
+ v-model="block.metadata.config"
13
5
  :assets.sync="block.assets"
14
- @click:file="onFileSelect"
15
6
  >
16
- <template #title>
17
- {{ $t('windward.core.components.settings.image.place_image') }}
18
- </template>
19
- </ContentBlockAsset>
20
-
21
- <v-switch
22
- v-model="block.metadata.config.hideBackground"
23
- :label="
24
- $t('windward.core.components.settings.image.hide_background')
25
- "
26
- :disabled="render"
27
- ></v-switch>
28
- <v-switch
29
- v-model="block.metadata.config.modal"
30
- :label="$t('windward.core.components.settings.image.modal')"
31
- :disabled="render"
32
- ></v-switch>
33
- <v-tooltip top color="primary">
34
- <template #activator="{ on, attrs }">
35
- <v-switch
36
- v-model="block.metadata.config.decorative"
37
- :disabled="render"
38
- @change="onDecorativeToggled($event)"
39
- >
40
- <template #label>
41
- <span v-bind="attrs" v-on="on">
42
- {{
43
- $t(
44
- 'windward.core.components.settings.image.decorative'
45
- )
46
- }}
47
- <v-icon x-small class="help-offset-icon">
48
- mdi-help
49
- </v-icon>
50
- </span>
51
- </template>
52
- </v-switch>
53
- </template>
54
- <span class="span-description">{{
55
- $t(
56
- 'windward.core.components.settings.image.decorative_toggle_description'
57
- )
58
- }}</span>
59
- </v-tooltip>
60
-
61
- <v-form v-if="!block.metadata.config.decorative">
62
- <v-tooltip top color="primary">
63
- <template #activator="{ on, attrs }">
64
- <v-switch
65
- v-model="block.metadata.config.inherit"
66
- :disabled="render"
67
- >
68
- <template #label>
69
- <span v-bind="attrs" v-on="on">
70
- {{
71
- $t(
72
- 'windward.core.components.settings.image.inherit'
73
- )
74
- }}
75
- <v-icon x-small class="help-offset-icon">
76
- mdi-help
77
- </v-icon>
78
- </span>
79
- </template>
80
- </v-switch>
81
- </template>
82
- <span class="span-description">{{
83
- $t(
84
- 'windward.core.components.settings.image.inherit_global_toggle_description'
85
- )
86
- }}</span>
87
- </v-tooltip>
88
-
89
- <v-alert
90
- v-if="block.metadata.config.inherit && !assetAltText"
91
- type="warning"
92
- >
93
- {{
94
- $t('windward.core.components.settings.image.inherit_no_alt')
95
- }}
96
- </v-alert>
97
-
98
- <v-text-field
99
- v-if="block.metadata.config.inherit && assetAltText"
100
- :value="assetAltText"
101
- :label="
102
- $t('windward.core.components.navigation.image.default_alt')
103
- "
104
- outlined
105
- counter
106
- maxlength="125"
107
- :rules="validation.textRules"
108
- disabled
109
- >
110
- </v-text-field>
111
-
112
- <v-text-field
113
- v-if="!block.metadata.config.inherit"
114
- v-model="block.metadata.config.alt"
115
- outlined
116
- counter
117
- maxlength="125"
118
- :label="
119
- $t('windward.core.components.navigation.image.default_alt')
120
- "
121
- :rules="validation.textRules"
122
- :disabled="render"
123
- >
124
- <template #append>
125
- <v-tooltip top color="primary">
126
- <template #activator="{ on }">
127
- <v-icon v-on="on" small>mdi-help</v-icon>
128
- </template>
129
- <span class="span-description">{{
130
- $t(
131
- 'windward.core.components.settings.image.alt_description'
132
- )
133
- }}</span>
134
- </v-tooltip>
135
- </template>
136
- </v-text-field>
137
- <h5 class="pb-2">
138
- {{ $t('windward.core.components.settings.image.screenreader') }}
139
- <v-tooltip top color="primary">
140
- <template #activator="{ on }">
141
- <v-icon v-on="on" small class="help-offset-icon">
142
- mdi-help
143
- </v-icon>
144
- </template>
145
- <span class="span-description">{{
146
- $t(
147
- 'windward.core.components.settings.image.screenreader_description'
148
- )
149
- }}</span>
150
- </v-tooltip>
151
- </h5>
152
- <TextEditor
153
- v-if="!block.metadata.config.inherit"
154
- v-model="block.metadata.config.ariaDescribedBy"
155
- menubar="bullist numlist"
156
- :disabled="render"
157
- ></TextEditor>
158
-
159
- <div v-if="block.metadata.config.inherit">
160
- <v-card v-if="assetDescribedByText">
161
- <v-card-text>
162
- <TextViewer v-model="assetDescribedByText"></TextViewer>
163
- </v-card-text>
164
- </v-card>
165
- <v-alert v-if="!assetDescribedByText" type="warning">
166
- {{
167
- $t(
168
- 'windward.core.components.settings.image.inherit_no_aria'
169
- )
170
- }}
171
- </v-alert>
172
- </div>
173
- </v-form>
7
+ </ImageAssetSettings>
174
8
  </v-container>
175
9
  </template>
176
10
 
@@ -180,35 +14,22 @@ import TextEditor from '~/components/Text/TextEditor'
180
14
  import TextViewer from '~/components/Text/TextViewer'
181
15
  import BaseContentSettings from '~/components/Content/Settings/BaseContentSettings.js'
182
16
  import ContentBlockAsset from '~/components/Content/ContentBlockAsset.vue'
17
+ import ImageAssetSettings from '~/components/Content/Settings/ImageAssetSettings.vue'
183
18
 
184
19
  export default {
185
20
  name: 'ImageSettings',
186
21
  extends: BaseContentSettings,
187
- components: { ContentBlockAsset, TextEditor, TextViewer },
22
+ components: {
23
+ ImageAssetSettings,
24
+ ContentBlockAsset,
25
+ TextEditor,
26
+ TextViewer,
27
+ },
188
28
  props: {
189
29
  settings: { type: Object, required: false, default: null },
190
30
  context: { type: String, required: false, default: 'block' },
191
31
  },
192
- computed: {
193
- assetAltText() {
194
- // Get the block aria info and fallback to the asset metadata
195
- return _.get(this.fileAsset, 'metadata.props.alt', null)
196
- },
197
- assetDescribedByText() {
198
- // Get the block aria info and fallback to the asset metadata
199
- return _.get(
200
- this.fileAsset,
201
- 'metadata.props.aria_describedby',
202
- null
203
- )
204
- },
205
- fileAsset() {
206
- return _.get(this.block, 'assets[0].asset', null)
207
- },
208
- fileAssetMap() {
209
- return _.get(this.block, 'metadata.config.asset', null)
210
- },
211
- },
32
+ computed: {},
212
33
  beforeMount() {
213
34
  if (_.isEmpty(this.block)) {
214
35
  this.block = {}
@@ -245,65 +66,10 @@ export default {
245
66
  }
246
67
  },
247
68
  data() {
248
- return {
249
- validation: {
250
- textRules: [
251
- (v) => !!v || this.$t('shared.forms.errors.required'),
252
- ],
253
- },
254
- }
69
+ return {}
255
70
  },
256
71
  watch: {},
257
72
  mounted() {},
258
- methods: {
259
- onDecorativeToggled(evt) {
260
- if (evt) {
261
- this.block.metadata.config.ariaDescribedBy = ''
262
- this.block.metadata.config.alt = ''
263
- }
264
- },
265
- onFileSelect(file) {
266
- // Clear out the body since we're defining a proper file link now
267
- this.block.body = ''
268
-
269
- // file = null when you remove a file
270
- if (_.isEmpty(file)) {
271
- this.block.assets = []
272
- } else {
273
- this.block.assets = [file]
274
-
275
- //Assign height and width for skeleton loader
276
- if (!_.isEmpty(file.asset.metadata.props)) {
277
- this.block.metadata.config.height =
278
- file.asset.metadata.props['height']
279
- this.block.metadata.config.width =
280
- file.asset.metadata.props['width']
281
- }
282
- // Assign any alt text from the filemanager file
283
- this.block.metadata.config.alt = _.get(
284
- file,
285
- 'asset.metadata.props.alt',
286
- ''
287
- )
288
-
289
- this.block.metadata.config.ariaDescribedBy = _.get(
290
- file,
291
- 'asset.metadata.props.aria_describedby',
292
- ''
293
- )
294
- }
295
- },
296
- },
73
+ methods: {},
297
74
  }
298
75
  </script>
299
- <style>
300
- .span-description {
301
- display: flex;
302
- justify-content: center;
303
- width: 200px;
304
- }
305
- .help-offset-icon {
306
- position: relative;
307
- top: -8px;
308
- }
309
- </style>
@@ -33,41 +33,31 @@
33
33
  color="primary"
34
34
  @change="onLinkedChange"
35
35
  >
36
- <draggable
37
- v-bind="dragOptions"
38
- :list="contentBlocks"
39
- @change="onDragChange"
36
+ <v-list-item
37
+ v-for="contentBlock in contentBlocks"
38
+ :key="contentBlock.block_id"
39
+ :value="contentBlock.block_id"
40
40
  >
41
- <v-list-item
42
- v-for="contentBlock in contentBlocks"
43
- :key="contentBlock.block_id"
44
- :value="contentBlock.block_id"
45
- >
46
- <template #default="{ active }">
47
- <v-list-item-icon>
48
- <v-icon>mdi-drag</v-icon>
49
- </v-list-item-icon>
50
-
51
- <v-list-item-content>
52
- <v-list-item-title>
53
- {{
54
- contentBlock.block.body.replace(
55
- /<[^>]*>?/gm,
56
- ''
57
- )
58
- }}
59
- </v-list-item-title>
60
- </v-list-item-content>
61
- <v-list-item-action>
62
- <v-checkbox
63
- :input-value="active"
64
- color="primary"
65
- :disabled="render"
66
- ></v-checkbox>
67
- </v-list-item-action>
68
- </template>
69
- </v-list-item>
70
- </draggable>
41
+ <template #default="{ active }">
42
+ <v-list-item-content>
43
+ <v-list-item-title>
44
+ {{
45
+ contentBlock.body.replace(
46
+ /<[^>]*>?/gm,
47
+ ''
48
+ )
49
+ }}
50
+ </v-list-item-title>
51
+ </v-list-item-content>
52
+ <v-list-item-action>
53
+ <v-checkbox
54
+ :input-value="active"
55
+ color="primary"
56
+ :disabled="render"
57
+ ></v-checkbox>
58
+ </v-list-item-action>
59
+ </template>
60
+ </v-list-item>
71
61
  </v-list-item-group>
72
62
  </v-list>
73
63
  </v-form>
@@ -84,7 +74,7 @@ import ContentBlock from '~/models/ContentBlock'
84
74
  import Course from '~/models/Course'
85
75
 
86
76
  export default {
87
- name: 'ImageSettings',
77
+ name: 'OpenResponseCollateSettings',
88
78
  extends: BaseContentSettings,
89
79
  components: { draggable, TextEditor },
90
80
  props: {
@@ -117,6 +107,8 @@ export default {
117
107
  )
118
108
  .for(new Course({ id: this.course.id }))
119
109
  .get()
110
+
111
+ this.sortContentBlocks(this.contentBlocks)
120
112
  },
121
113
  beforeMount() {
122
114
  if (_.isEmpty(this.block)) {
@@ -141,34 +133,34 @@ export default {
141
133
  if (!_.isBoolean(this.block.metadata.config.include_prompts)) {
142
134
  this.block.metadata.config.include_prompts = false
143
135
  }
144
-
145
136
  this.linked = this.block.metadata.config.linked
146
137
  },
147
138
  watch: {},
148
139
  mounted() {},
149
140
  methods: {
150
- // Called when the order changes
151
- onDragChange(e) {
152
- this.setLinkedBlocks()
141
+ sortContentBlocks(contentBlocks) {
142
+ let contentBlocksByPage = []
143
+ const blockMap = []
144
+ // getting page order
145
+ const contentBlockTree = this.$ContentService.getFlatTree()
146
+ contentBlockTree.forEach(function (page, index) {
147
+ contentBlocks.forEach((block) => {
148
+ // If the block is on this page and it wasn't already used on a different page
149
+ if (
150
+ page.content_id === block.content_id &&
151
+ !blockMap.includes(block.block_id)
152
+ ) {
153
+ contentBlocksByPage.push(block)
154
+ blockMap.push(block.block_id)
155
+ }
156
+ })
157
+ })
158
+ this.contentBlocks = contentBlocksByPage
153
159
  },
154
160
  // Called when blocks are added / removed
155
161
  onLinkedChange() {
156
- this.setLinkedBlocks()
157
- },
158
- setLinkedBlocks() {
159
- const linkedBlockIds = []
160
-
161
- // Loop over content blocks since they have the correct order we want to collate
162
- this.contentBlocks.forEach((contentBlock) => {
163
- // If the unsorted this.linked includes the block id, add it in the right order
164
- if (this.linked.includes(contentBlock.block_id)) {
165
- linkedBlockIds.push(contentBlock.block_id)
166
- }
167
- })
168
-
169
- // Set the linked and also body for convenience
170
- this.block.metadata.config.linked = linkedBlockIds
171
- this.block.body = linkedBlockIds.join()
162
+ // update block with linked open response for download
163
+ this.block.metadata.config.linked = this.linked
172
164
  },
173
165
  },
174
166
  }
@@ -1,43 +1,63 @@
1
1
  <template>
2
2
  <v-container>
3
- <v-form>
4
- <p>
5
- {{
6
- $t(
7
- 'windward.core.components.settings.open_response.question'
8
- )
9
- }}
10
- </p>
11
- <TextEditor
12
- v-model="block.body"
13
- :height="200"
3
+ <v-row class="pl-3 pr-3">
4
+ <v-text-field
5
+ id="block-settings-title"
6
+ v-model="block.metadata.config.title"
7
+ :autofocus="true"
8
+ :rules="$Validation.getRule('block.title')"
9
+ :counter="$Validation.getLimit('block.title')"
10
+ outlined
11
+ :label="
12
+ $t('windward.core.components.settings.clickable_icon.title')
13
+ "
14
14
  :disabled="render"
15
- ></TextEditor>
16
- <p class="pt-4">
17
- {{
18
- $t(
19
- 'windward.core.components.settings.open_response.sample_response'
20
- )
21
- }}
22
- </p>
23
- <TextEditor
24
- v-model="block.metadata.config.sample_response"
25
- :height="200"
15
+ ></v-text-field>
16
+ <v-textarea
17
+ id="block-settings-instructions"
18
+ v-model="block.metadata.config.instructions"
19
+ :rules="$Validation.getRule('block.instructions')"
20
+ :counter="$Validation.getLimit('block.instructions')"
21
+ outlined
22
+ :label="$t('components.content.settings.base.instructions')"
26
23
  :disabled="render"
27
- ></TextEditor>
28
- <p class="pt-4">
29
- {{
30
- $t(
31
- 'windward.core.components.settings.open_response.starting_text'
32
- )
33
- }}
34
- </p>
35
- <TextEditor
36
- v-model="block.metadata.config.starting_text"
37
- :height="200"
38
- :disabled="render"
39
- ></TextEditor>
40
- </v-form>
24
+ ></v-textarea>
25
+ </v-row>
26
+ <p>
27
+ {{ $t('windward.core.components.settings.open_response.question') }}
28
+ </p>
29
+ <TextEditor
30
+ id="block-settings-body"
31
+ v-model="block.body"
32
+ :height="200"
33
+ :disabled="render"
34
+ ></TextEditor>
35
+ <p class="pt-4">
36
+ {{
37
+ $t(
38
+ 'windward.core.components.settings.open_response.sample_response'
39
+ )
40
+ }}
41
+ </p>
42
+ <TextEditor
43
+ id="block-settings-sample-response"
44
+ v-model="block.metadata.config.sample_response"
45
+ :height="200"
46
+ :disabled="render"
47
+ ></TextEditor>
48
+ <p class="pt-4">
49
+ {{
50
+ $t(
51
+ 'windward.core.components.settings.open_response.starting_text'
52
+ )
53
+ }}
54
+ </p>
55
+ <TextEditor
56
+ id="block-settings-starting-text"
57
+ v-model="block.metadata.config.starting_text"
58
+ :height="200"
59
+ :disabled="render"
60
+ ></TextEditor>
41
61
  </v-container>
42
62
  </template>
43
63
 
@@ -67,6 +87,12 @@ export default {
67
87
  if (_.isEmpty(this.block.metadata.config)) {
68
88
  this.block.metadata.config = {}
69
89
  }
90
+ if (_.isEmpty(this.block.metadata.config.title)) {
91
+ this.block.metadata.config.title = ''
92
+ }
93
+ if (_.isEmpty(this.block.metadata.config.instructions)) {
94
+ this.block.metadata.config.instructions = ''
95
+ }
70
96
  if (_.isEmpty(this.block.metadata.config.sample_response)) {
71
97
  this.block.metadata.config.sample_response = ''
72
98
  }
@@ -3,11 +3,11 @@
3
3
  <v-container class="pa-0">
4
4
  <v-col class="pa-0">
5
5
  <v-text-field
6
+ id="block-settings-title"
6
7
  v-model="block.metadata.config.title"
7
- :rules="validation.shortInputRules"
8
- :counter="50"
8
+ :rules="$Validation.getRule('block.title')"
9
+ :counter="$Validation.getLimit('block.title')"
9
10
  outlined
10
- id="title"
11
11
  :label="
12
12
  $t(
13
13
  'windward.core.components.settings.scenario_choice.title'
@@ -16,10 +16,10 @@
16
16
  :disabled="render"
17
17
  ></v-text-field>
18
18
  <v-textarea
19
+ id="block-settings-instructions"
19
20
  v-model="block.metadata.config.description"
20
- id="description"
21
- :rules="validation.instructionRule"
22
- :counter="255"
21
+ :rules="$Validation.getRule('block.instructions')"
22
+ :counter="$Validation.getLimit('block.instructions')"
23
23
  outlined
24
24
  :label="$t('components.content.settings.base.instructions')"
25
25
  :disabled="render"
@@ -77,8 +77,8 @@
77
77
  v-model="
78
78
  block.metadata.config.items[index].title
79
79
  "
80
- :rules="validation.shortInputRules"
81
- :counter="50"
80
+ :rules="$Validation.getRule('longInput')"
81
+ :counter="$Validation.getLimit('longInput')"
82
82
  outlined
83
83
  :id="'item-' + index + '-title'"
84
84
  :label="
@@ -128,7 +128,11 @@
128
128
  >
129
129
  <v-icon>mdi-plus</v-icon>
130
130
  <span v-if="block.metadata.config.items.length <= 26">
131
- {{ $t('shared.forms.add') }}
131
+ {{
132
+ $t(
133
+ 'windward.core.components.settings.scenario_choice.add_choice'
134
+ )
135
+ }}
132
136
  </span>
133
137
  <span v-else>
134
138
  {{
@@ -249,32 +253,6 @@ export default {
249
253
  value: 'number',
250
254
  },
251
255
  ],
252
- validation: {
253
- shortInputRules: [
254
- (v) => {
255
- if (v && v.length >= 50) {
256
- return this.$t(
257
- 'windward.core.shared.settings.errors.input_limitations',
258
- [50]
259
- )
260
- } else {
261
- return true
262
- }
263
- },
264
- ],
265
- instructionRule: [
266
- (v) => {
267
- if (v && v.length >= 255) {
268
- return this.$t(
269
- 'windward.core.shared.settings.errors.input_limitations',
270
- [255]
271
- )
272
- } else {
273
- return true
274
- }
275
- },
276
- ],
277
- },
278
256
  }
279
257
  },
280
258
  beforeMount() {