@windward/games 0.0.1

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 (68) hide show
  1. package/.editorconfig +13 -0
  2. package/.eslintrc.js +11 -0
  3. package/.prettierrc +4 -0
  4. package/README.md +43 -0
  5. package/babel.config.js +1 -0
  6. package/components/content/CrudTable.vue +295 -0
  7. package/components/content/DataTableRowHandler.vue +113 -0
  8. package/components/content/DatableEditor.vue +223 -0
  9. package/components/content/blocks/BaseContentBlock.vue +8 -0
  10. package/components/content/blocks/dragDrop/BucketGame.vue +520 -0
  11. package/components/content/blocks/dragDrop/SortingGame.vue +303 -0
  12. package/components/content/blocks/flashcards/CardFace.vue +112 -0
  13. package/components/content/blocks/flashcards/Flashcard.vue +150 -0
  14. package/components/content/blocks/flashcards/FlashcardSlides.vue +121 -0
  15. package/components/content/blocks/matchingGame/MatchingGame.vue +545 -0
  16. package/components/content/blocks/quizshowGame/AnswerPanel.vue +338 -0
  17. package/components/content/blocks/quizshowGame/Gridview.vue +260 -0
  18. package/components/content/blocks/quizshowGame/QuizShow.vue +516 -0
  19. package/components/content/blocks/quizshowGame/feedbackIcons.vue +41 -0
  20. package/components/content/blocks/slideshow/SlideShow.vue +175 -0
  21. package/components/settings/BucketGameSettingsManager.vue +683 -0
  22. package/components/settings/FlashCardSlidesManager.vue +489 -0
  23. package/components/settings/MatchingGameManager.vue +775 -0
  24. package/components/settings/QuizShowSettingsManager.vue +408 -0
  25. package/components/settings/SlideShowManager.vue +248 -0
  26. package/components/settings/SortingGameSettingsManager.vue +286 -0
  27. package/i18n/en-US/components/content/blocks/bucket_game.ts +39 -0
  28. package/i18n/en-US/components/content/blocks/flashcard.ts +5 -0
  29. package/i18n/en-US/components/content/blocks/index.ts +15 -0
  30. package/i18n/en-US/components/content/blocks/matching_game.ts +26 -0
  31. package/i18n/en-US/components/content/blocks/quizshow_game.ts +35 -0
  32. package/i18n/en-US/components/content/blocks/slideshow.ts +13 -0
  33. package/i18n/en-US/components/content/blocks/sorting_game.ts +5 -0
  34. package/i18n/en-US/components/content/crud_table.ts +6 -0
  35. package/i18n/en-US/components/content/index.ts +7 -0
  36. package/i18n/en-US/components/index.ts +9 -0
  37. package/i18n/en-US/components/navigation/index.ts +5 -0
  38. package/i18n/en-US/components/settings/bucket_game.ts +35 -0
  39. package/i18n/en-US/components/settings/flashcard.ts +26 -0
  40. package/i18n/en-US/components/settings/index.ts +13 -0
  41. package/i18n/en-US/components/settings/matching_game.ts +15 -0
  42. package/i18n/en-US/components/settings/quizshow_game.ts +14 -0
  43. package/i18n/en-US/components/settings/slideshow.ts +11 -0
  44. package/i18n/en-US/index.ts +15 -0
  45. package/i18n/en-US/modules/index.ts +5 -0
  46. package/i18n/en-US/pages/index.ts +5 -0
  47. package/i18n/en-US/shared/content_blocks.ts +14 -0
  48. package/i18n/en-US/shared/index.ts +7 -0
  49. package/i18n/en-US/shared/settings.ts +10 -0
  50. package/i18n/en-US.ts +5 -0
  51. package/jest.config.js +18 -0
  52. package/package.json +51 -0
  53. package/plugin.js +150 -0
  54. package/test/blocks/dragDrop/BucketGame.spec.js +26 -0
  55. package/test/blocks/dragDrop/SortingGame.spec.js +47 -0
  56. package/test/blocks/flashcards/CardFace.spec.js +21 -0
  57. package/test/blocks/flashcards/FlashCardSlides.spec.js +24 -0
  58. package/test/blocks/flashcards/Flashcard.spec.js +24 -0
  59. package/test/blocks/matchingGame/MatchingGame.spec.js +26 -0
  60. package/test/blocks/quizShow/quizShow.spec.js +31 -0
  61. package/test/blocks/slideshow/slideshow.spec.js +24 -0
  62. package/test/mocks.js +2 -0
  63. package/test/settings/BucketGameManager.spec.js +125 -0
  64. package/test/settings/FlashCardSlidesManager.spec.js +24 -0
  65. package/test/settings/MatchingGameManager.spec.js +30 -0
  66. package/test/settings/SlideShowManager.spec.js +30 -0
  67. package/test/settings/SortingGameManager.spec.js +71 -0
  68. package/tsconfig.json +20 -0
@@ -0,0 +1,489 @@
1
+ <template>
2
+ <div>
3
+ <v-text-field
4
+ v-model="block.metadata.config.title"
5
+ :counter="50"
6
+ :label="
7
+ $t('plugin.games.components.settings.bucket_game.form.title')
8
+ "
9
+ ref="title"
10
+ ></v-text-field>
11
+ <br />
12
+ <v-textarea
13
+ outlined
14
+ auto-grow
15
+ v-model="block.metadata.config.instructions"
16
+ :label="
17
+ $t(
18
+ 'plugin.games.components.settings.bucket_game.form.instructions'
19
+ )
20
+ "
21
+ ></v-textarea>
22
+ <br />
23
+ <v-expansion-panels flat>
24
+ <v-expansion-panel>
25
+ <v-expansion-panel-header class="pa-0"
26
+ ><h3>Sortable Flashcards</h3></v-expansion-panel-header
27
+ >
28
+ <v-expansion-panel-content class="ma-0">
29
+ <v-container class="pa-0">
30
+ <draggable
31
+ v-model="block.metadata.config.cards"
32
+ class="d-flex flex-column mb-6"
33
+ group="cards"
34
+ >
35
+ <v-card
36
+ v-for="(item, index) in block.metadata.config
37
+ .cards"
38
+ :key="'card_' + index"
39
+ class="pa-2 flex-fill"
40
+ elevation="0"
41
+ outlined
42
+ tile
43
+ >
44
+ <v-row class="pa-3">
45
+ <div
46
+ class="text-truncate pa-0 ma-0"
47
+ @click="onOpenEditor(index)"
48
+ v-on:keyup.enter="onOpenEditor(index)"
49
+ @mouseover="onHover"
50
+ @mouseleave="onHoverLeave"
51
+ :class="cursor"
52
+ tabindex="0"
53
+ >
54
+ <v-icon class="pl-2"
55
+ >mdi-gesture-tap-hold
56
+ </v-icon>
57
+ {{
58
+ item.title
59
+ ? block.metadata.config.cards[
60
+ index
61
+ ].title
62
+ : $t(
63
+ 'plugin.games.components.settings.flashcard.form.card'
64
+ ) +
65
+ ' ' +
66
+ (index + 1)
67
+ }}
68
+ </div>
69
+ <v-spacer />
70
+ <v-icon
71
+ class="float-right"
72
+ @click="onDelete(index, $event)"
73
+ >
74
+ mdi-delete-outline
75
+ </v-icon>
76
+ </v-row>
77
+
78
+ <div
79
+ v-if="
80
+ block.metadata.config.cards[index]
81
+ .expand
82
+ "
83
+ >
84
+ <br />
85
+ <hr />
86
+
87
+ <v-row
88
+ class="d-flex justify-space-around pt-8"
89
+ align="center"
90
+ justify="center"
91
+ ><v-btn
92
+ @click="flipCardFront(index)"
93
+ color="primary"
94
+ :outlined="
95
+ !block.metadata.config.cards[
96
+ index
97
+ ].side
98
+ "
99
+ >{{
100
+ $t(
101
+ 'plugin.games.components.settings.flashcard.form.front'
102
+ )
103
+ }}</v-btn
104
+ >
105
+ {{
106
+ $t(
107
+ 'plugin.games.components.settings.flashcard.form.card'
108
+ ) +
109
+ ' ' +
110
+ (index + 1) +
111
+ ' ' +
112
+ (block.metadata.config.cards[index]
113
+ .side
114
+ ? $t(
115
+ 'plugin.games.components.settings.flashcard.form.front'
116
+ )
117
+ : $t(
118
+ 'plugin.games.components.settings.flashcard.form.back'
119
+ ))
120
+ }}<v-btn
121
+ @click="flipCardBack(index)"
122
+ color="primary"
123
+ :outlined="
124
+ block.metadata.config.cards[
125
+ index
126
+ ].side
127
+ "
128
+ >
129
+ {{
130
+ $t(
131
+ 'plugin.games.components.settings.flashcard.form.back'
132
+ )
133
+ }}</v-btn
134
+ ></v-row
135
+ ><br />
136
+ <v-form ref="form">
137
+ <v-text-field
138
+ v-model="
139
+ block.metadata.config.cards[
140
+ index
141
+ ].title
142
+ "
143
+ label="Title"
144
+ ></v-text-field>
145
+ <br />
146
+ <v-textarea
147
+ v-if="
148
+ block.metadata.config.cards[
149
+ index
150
+ ].side
151
+ "
152
+ outlined
153
+ auto-grow
154
+ v-model="
155
+ block.metadata.config.cards[
156
+ index
157
+ ].front.header
158
+ "
159
+ label="Header"
160
+ />
161
+ <v-textarea
162
+ v-if="
163
+ !block.metadata.config.cards[
164
+ index
165
+ ].side
166
+ "
167
+ outlined
168
+ auto-grow
169
+ v-model="
170
+ block.metadata.config.cards[
171
+ index
172
+ ].back.header
173
+ "
174
+ :counter="255"
175
+ label="Header"
176
+ required
177
+ />
178
+ <textEditor
179
+ v-show="
180
+ block.metadata.config.cards[
181
+ index
182
+ ].side
183
+ "
184
+ outlined
185
+ auto-grow
186
+ v-model="
187
+ block.metadata.config.cards[
188
+ index
189
+ ].front.text
190
+ "
191
+ label="Text"
192
+ required
193
+ />
194
+ <textEditor
195
+ v-show="
196
+ !block.metadata.config.cards[
197
+ index
198
+ ].side
199
+ "
200
+ outlined
201
+ auto-grow
202
+ v-model="
203
+ block.metadata.config.cards[
204
+ index
205
+ ].back.text
206
+ "
207
+ label="Text"
208
+ required
209
+ />
210
+ <br />
211
+ <ContentBlockAsset
212
+ v-show="
213
+ block.metadata.config.cards[
214
+ index
215
+ ].side
216
+ "
217
+ v-model="
218
+ block.metadata.config.cards[
219
+ index
220
+ ].front.img
221
+ "
222
+ mimes="image/png,image/jpeg"
223
+ @click:file="onImageSelect"
224
+ >
225
+ <template #title>
226
+ {{
227
+ $t(
228
+ 'plugin.games.components.settings.flashcard.form.image.title'
229
+ )
230
+ }}
231
+ </template>
232
+ <template #description>
233
+ {{
234
+ $t(
235
+ 'plugin.games.components.settings.flashcard.form.image.configure_blurb'
236
+ )
237
+ }}
238
+ </template>
239
+ </ContentBlockAsset>
240
+ <ContentBlockAsset
241
+ v-show="
242
+ !block.metadata.config.cards[
243
+ index
244
+ ].side
245
+ "
246
+ v-model="
247
+ block.metadata.config.cards[
248
+ index
249
+ ].back.img
250
+ "
251
+ mimes="image/png,image/jpeg"
252
+ @click:file="onImageSelect"
253
+ >
254
+ <template #title>
255
+ {{
256
+ $t(
257
+ 'plugin.games.components.settings.flashcard.form.image.title'
258
+ )
259
+ }}
260
+ </template>
261
+ <template #description>
262
+ {{
263
+ $t(
264
+ 'plugin.games.components.settings.flashcard.form.image.configure_blurb'
265
+ )
266
+ }}
267
+ </template>
268
+ </ContentBlockAsset>
269
+ <br />
270
+ <v-textarea
271
+ auto-grow
272
+ v-show="
273
+ block.metadata.config.cards[
274
+ index
275
+ ].side
276
+ "
277
+ outlined
278
+ v-model="
279
+ block.metadata.config.cards[
280
+ index
281
+ ].front.altText
282
+ "
283
+ label="Alt Text"
284
+ required
285
+ ></v-textarea>
286
+ <v-textarea
287
+ auto-grow
288
+ v-show="
289
+ !block.metadata.config.cards[
290
+ index
291
+ ].side
292
+ "
293
+ outlined
294
+ v-model="
295
+ block.metadata.config.cards[
296
+ index
297
+ ].back.altText
298
+ "
299
+ label="Alt Text"
300
+ required
301
+ ></v-textarea>
302
+ <v-row
303
+ class="d-flex justify-space-around pt-8"
304
+ align="center"
305
+ justify="center"
306
+ ><v-btn
307
+ @click="flipCardFront(index)"
308
+ color="primary"
309
+ :outlined="
310
+ !block.metadata.config
311
+ .cards[index].side
312
+ "
313
+ >{{
314
+ $t(
315
+ 'plugin.games.components.settings.flashcard.form.front'
316
+ )
317
+ }}</v-btn
318
+ >
319
+
320
+ <v-btn
321
+ @click="flipCardBack(index)"
322
+ color="primary"
323
+ :outlined="
324
+ block.metadata.config.cards[
325
+ index
326
+ ].side
327
+ "
328
+ >
329
+ {{
330
+ $t(
331
+ 'plugin.games.components.settings.flashcard.form.back'
332
+ )
333
+ }}</v-btn
334
+ ></v-row
335
+ >
336
+ <br />
337
+ </v-form>
338
+ </div>
339
+ </v-card>
340
+ </draggable>
341
+ <p
342
+ @click="onAddCard"
343
+ v-on:keyup.enter="onAddCard"
344
+ class="fullWidth"
345
+ tabindex="0"
346
+ >
347
+ <v-icon class="primary addIcon">mdi-plus</v-icon>
348
+ {{
349
+ $t(
350
+ 'plugin.games.components.settings.flashcard.form.add_card'
351
+ )
352
+ }}
353
+ </p>
354
+ </v-container>
355
+ </v-expansion-panel-content>
356
+ </v-expansion-panel>
357
+ </v-expansion-panels>
358
+ </div>
359
+ </template>
360
+
361
+ <script>
362
+ import _ from 'lodash'
363
+ import {
364
+ MathExpressionEditor,
365
+ MathLiveWrapper,
366
+ ContentViewer,
367
+ } from '@windward/core/utils'
368
+ import BaseContentSettings from '~/components/Content/Tool/BaseContentSettings.js'
369
+ import ContentBlockAsset from '~/components/Content/ContentBlockAsset.vue'
370
+ import TextEditor from '~/components/Text/TextEditor.vue'
371
+ import draggable from 'vuedraggable'
372
+
373
+ export default {
374
+ name: 'FlashCardSlidesManager',
375
+ extends: BaseContentSettings,
376
+ components: {
377
+ MathExpressionEditor,
378
+ MathLiveWrapper,
379
+ ContentViewer,
380
+ ContentBlockAsset,
381
+ draggable,
382
+ TextEditor,
383
+ },
384
+ data() {
385
+ return {
386
+ cursor: null,
387
+ }
388
+ },
389
+ beforeMount() {
390
+ if (_.isEmpty(this.block)) {
391
+ this.block = {}
392
+ }
393
+ if (_.isEmpty(this.block.metadata)) {
394
+ this.block.metadata = {}
395
+ }
396
+ if (_.isEmpty(this.block.metadata.config)) {
397
+ this.block.metadata.config = {}
398
+ this.block.metadata.config.currentSlide = 0
399
+ this.block.metadata.config.title = ''
400
+ this.block.metadata.config.instructions = ''
401
+ }
402
+ },
403
+
404
+ computed: {
405
+ defaultCard() {
406
+ return {
407
+ front: {
408
+ img: {},
409
+ header: 'front header',
410
+ text: 'front text',
411
+ imgAltText: 'alt',
412
+ },
413
+ back: {
414
+ img: {},
415
+ header: 'back header ',
416
+ text: 'back text ',
417
+ imgAltText: 'back alt ',
418
+ },
419
+ expand: false,
420
+ title: '',
421
+ side: true,
422
+ }
423
+ },
424
+ },
425
+ methods: {
426
+ onAddCard() {
427
+ this.block.metadata.config.cards.forEach((element) => {
428
+ element.expand = false
429
+ })
430
+ this.block.metadata.config.cards.push(this.defaultCard)
431
+ },
432
+ onDelete(index) {
433
+ this.$toast.info(this.$t('shared.forms.confirm_delete_text'), {
434
+ duration: null,
435
+ action: [
436
+ {
437
+ text: this.$t('shared.forms.cancel'),
438
+ onClick: (e, toastObject) => {
439
+ toastObject.goAway(0)
440
+ },
441
+ },
442
+ {
443
+ text: this.$t('shared.forms.confirm'),
444
+ onClick: (e, toastObject) => {
445
+ toastObject.goAway(0)
446
+ this.block.metadata.config.cards.splice(index, 1)
447
+ },
448
+ },
449
+ ],
450
+ })
451
+ },
452
+ onOpenEditor(index) {
453
+ this.block.metadata.config.currentSlide = index
454
+ this.block.metadata.config.cards[index].expand =
455
+ !this.block.metadata.config.cards[index].expand
456
+ this.block.metadata.config.cards.forEach(
457
+ (element, element_index) => {
458
+ if (index !== element_index) {
459
+ element.expand = false
460
+ }
461
+ }
462
+ )
463
+ },
464
+ onImageSelect(img) {
465
+ let currentSlide = this.block.metadata.config.currentSlide
466
+ this.block.metadata.config.cards[currentSlide].img = img
467
+ //this.face.img = img
468
+ },
469
+ flipCardFront(index) {
470
+ this.block.metadata.config.cards[index].side = true
471
+ },
472
+ flipCardBack(index) {
473
+ this.block.metadata.config.cards[index].side = false
474
+ },
475
+ onHover(index) {
476
+ this.cursor = 'changePointer'
477
+ },
478
+ onHoverLeave() {
479
+ this.cursor = ''
480
+ },
481
+ },
482
+ }
483
+ </script>
484
+
485
+ <style scoped>
486
+ .changePointer {
487
+ cursor: pointer !important;
488
+ }
489
+ </style>