@windward/core 0.27.0 → 0.29.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 CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## Release [0.29.0] - 2026-03-11
4
+
5
+ * Merged in feature/LE-2319-preselect-cc-transcript-language (pull request #491)
6
+ * Merged in bugfix/LE-2292-clickable-icon-instructions-fiel (pull request #490)
7
+ * Merged release/0.29.0 into bugfix/LE-2292-clickable-icon-instructions-fiel
8
+ * Merged in feature/LE-2076-matching-game-allow-rich-text-ed (pull request #489)
9
+ * Merged in bugfix/LE-2292-clickable-icon-instructions-fiel (pull request #486)
10
+
11
+
12
+ ## Release [0.28.0] - 2026-02-18
13
+
14
+ * Merged in feature/LE-2250/open-response-feedback-2 (pull request #485)
15
+ * Merged in feature/LE-2223-add-title-and-instructions-to-im (pull request #483)
16
+ * Merged in feature/LE-2250/open-response-feedback (pull request #482)
17
+ * Merged in feature/LE-2223-add-title-and-instructions-to-im (pull request #481)
18
+ * Merged in feature/LE-2208-translate-course (pull request #478)
19
+ * Merge remote-tracking branch 'origin/release/0.28.0' into feature/LE-2208-translate-course
20
+ * Merge branch 'develop' into feature/LE-2208-translate-course
21
+ * Merged in release/0.27.0 (pull request #462)
22
+ * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #476)
23
+ * Merged release/0.27.0 into feature/LE-2155-consistent-ui-for-adding-new-blo
24
+ * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #474)
25
+ * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #473)
26
+ * Merged release/0.27.0 into feature/LE-2155-consistent-ui-for-adding-new-blo
27
+ * Merged release/0.27.0 into feature/LE-2155-consistent-ui-for-adding-new-blo
28
+ * Merged in LE-1915-block-quote-design-updates (pull request #468)
29
+ * Merge remote-tracking branch 'origin/release/0.27.0' into LE-1915-block-quote-design-updates
30
+ * Merged in LE-2185-feedback-block-add-container-bac (pull request #469)
31
+ * Merge remote-tracking branch 'origin/release/0.27.0' into LE-2185-feedback-block-add-container-bac
32
+ * Merged in feature/LE-2236-bar-charts-for-non-open-ended-it (pull request #472)
33
+ * Merged in feature/LE-1788-transcript-generation (pull request #465)
34
+ * Merged release/0.27.0 into feature/LE-2236-bar-charts-for-non-open-ended-it
35
+ * Merged in LE-2186-file-upload-block-add-container- (pull request #470)
36
+ * Merged in feature/LE-2236-bar-charts-for-non-open-ended-it (pull request #471)
37
+ * Add localized "item header" message for ClickableIconsSettings and update "initial setup" text for OpenResponse block
38
+ * Merged in LE-1897-glossary-pop-up-displayy (pull request #467)
39
+ * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #464)
40
+ * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #466)
41
+ * Merged release/0.27.0 into feature/LE-2155-consistent-ui-for-adding-new-blo
42
+ * Merge remote-tracking branch 'origin/feature/LE-2155-consistent-ui-for-adding-new-blo' into feature/LE-2155-consistent-ui-for-adding-new-blo
43
+ * Merged release/0.27.0 into feature/LE-2155-consistent-ui-for-adding-new-blo
44
+ * Merged release/0.28.0 into feature/LE-2223-add-title-and-instructions-to-im
45
+ * Merged in feature/LE-2223-add-title-and-instructions-to-im (pull request #477)
46
+ * Merged in feature/LE-2215-clickable-icon-default-settings- (pull request #475)
47
+
48
+
3
49
  ## Release [0.27.0] - 2026-01-15
4
50
 
5
51
  * Merged in feature/LE-2155-consistent-ui-for-adding-new-blo (pull request #476)
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div>
2
+ <div :class="blockDirectionClasses" :dir="blockTextDirection">
3
3
  <v-container
4
4
  v-if="
5
5
  block.metadata.config.title ||
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-container :class="containerClasses">
2
+ <v-container :class="['container-left-border', blockDirectionClasses]" :dir="blockTextDirection">
3
3
  <v-row
4
4
  v-if="
5
5
  block.metadata.config.title ||
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div>
2
+ <div :class="blockDirectionClasses" :dir="blockTextDirection">
3
3
  <v-container class="pa-0">
4
4
  <h2
5
5
  v-if="
@@ -237,9 +237,6 @@ export default {
237
237
  )
238
238
  if (_.isEmpty(this.block.metadata.config.items)) {
239
239
  this.block.metadata.config.items = []
240
- this.block.metadata.config.description = this.$t(
241
- 'windward.core.components.settings.clickable_icon.information'
242
- )
243
240
  }
244
241
  if (_.isEmpty(this.block.metadata.config.title)) {
245
242
  this.block.metadata.config.title = this.$t(
@@ -249,15 +246,13 @@ export default {
249
246
  if (!_.isBoolean(this.block.metadata.config.display_title)) {
250
247
  this.$set(this.block.metadata.config, 'display_title', true)
251
248
  }
252
- if (_.isEmpty(this.block.metadata.config.description)) {
253
- this.block.metadata.config.description = ''
254
- }
255
249
  if (_.isEmpty(this.block.metadata.config.display)) {
256
250
  this.block.metadata.config.display = {
257
- show_title: false,
258
- show_background: false,
251
+ show_title: true,
252
+ show_background: true,
259
253
  round_icon: false,
260
254
  italic_icon: false,
255
+ large_icon: false,
261
256
  autocolor: true,
262
257
  }
263
258
  }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-container>
2
+ <v-container :class="blockDirectionClasses" :dir="blockTextDirection">
3
3
  <v-row
4
4
  v-if="
5
5
  block.metadata.config.title ||
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <v-container class="pa-0">
2
+ <div :class="blockDirectionClasses" :dir="blockTextDirection">
3
3
  <h2
4
4
  v-if="
5
5
  block.metadata.config.title &&
@@ -51,7 +51,7 @@
51
51
  "
52
52
  :value="resolvedItemAssets"
53
53
  ></FileLinks>
54
- </v-container>
54
+ </div>
55
55
  </template>
56
56
 
57
57
  <script>
@@ -1,5 +1,30 @@
1
1
  <template>
2
2
  <div>
3
+ <v-container
4
+ v-if="
5
+ block.metadata.config.title ||
6
+ block.metadata.config.instructions
7
+ "
8
+ class="pa-0"
9
+ >
10
+ <h2
11
+ v-if="
12
+ block.metadata.config.title &&
13
+ block.metadata.config.display_title
14
+ "
15
+ tabindex="0"
16
+ >
17
+ {{ block.metadata.config.title }}
18
+ </h2>
19
+
20
+ <p
21
+ v-if="block.metadata.config.instructions"
22
+ tabindex="0"
23
+ class="pt-3"
24
+ >
25
+ {{ block.metadata.config.instructions }}
26
+ </p>
27
+ </v-container>
3
28
  <ImageAssetViewer
4
29
  v-if="block.metadata.config.asset"
5
30
  v-model="block.metadata.config"
@@ -8,6 +33,24 @@
8
33
  <v-alert v-else type="warning">{{
9
34
  $t('windward.core.components.settings.image.no_image')
10
35
  }}</v-alert>
36
+
37
+ <!-- Visible image description for translated courses only -->
38
+ <!-- aria-hidden prevents screen readers from reading this twice (already read via aria-describedby on the image) -->
39
+ <div
40
+ v-if="isTranslatedBlock && imageDescription"
41
+ class="image-description mt-3 pa-3"
42
+ aria-hidden="true"
43
+ >
44
+ <h4
45
+ class="image-description__heading text-subtitle-2 font-weight-bold mb-1"
46
+ >
47
+ {{ $t('shared.file.image.description') }}
48
+ </h4>
49
+ <div
50
+ class="image-description__text text-body-2"
51
+ v-html="imageDescription"
52
+ ></div>
53
+ </div>
11
54
  </div>
12
55
  </template>
13
56
 
@@ -15,6 +58,7 @@
15
58
  import _ from 'lodash'
16
59
  import ImageAssetViewer from '~/components/Content/ImageAssetViewer.vue'
17
60
  import BaseContentBlock from '~/components/Content/Blocks/BaseContentBlock'
61
+ import Uuid from '~/helpers/Uuid'
18
62
 
19
63
  export default {
20
64
  name: 'ContentBlockImage',
@@ -25,6 +69,47 @@ export default {
25
69
  data() {
26
70
  return {}
27
71
  },
72
+ computed: {
73
+ /**
74
+ * Check if this block is from a translated course
75
+ * Translated blocks have metadata.translation object
76
+ */
77
+ isTranslatedBlock() {
78
+ return !!_.get(this.block, 'metadata.translation', null)
79
+ },
80
+ /**
81
+ * Get the file asset for this image
82
+ * Uses resolveAsset from BaseContentBlock which wraps FileAssetHelper
83
+ */
84
+ fileAsset() {
85
+ const config = _.get(this.block, 'metadata.config', {})
86
+ return this.resolveAsset(config.asset)
87
+ },
88
+ /**
89
+ * Get the image description (ariaDescribedBy) from config or asset
90
+ * Checks multiple sources in order of priority
91
+ */
92
+ imageDescription() {
93
+ const config = _.get(this.block, 'metadata.config', {})
94
+
95
+ // If not inheriting from global, use the config value
96
+ if (!config.inherit) {
97
+ return config.ariaDescribedBy || ''
98
+ }
99
+
100
+ // If inheriting, try to get from file asset (locale-aware props first)
101
+ return (
102
+ _.get(this.fileAsset, 'aria_describedby', null) ||
103
+ _.get(this.fileAsset, 'props.aria_describedby', null) ||
104
+ _.get(
105
+ this.fileAsset,
106
+ 'asset.metadata.props.aria_describedby',
107
+ null
108
+ ) ||
109
+ ''
110
+ )
111
+ },
112
+ },
28
113
  beforeMount() {
29
114
  if (_.isEmpty(this.block.metadata.config)) {
30
115
  this.block.metadata.config = {}
@@ -41,6 +126,61 @@ export default {
41
126
  if (_.isEmpty(this.block.metadata.config.ariaDescribedBy)) {
42
127
  this.block.metadata.config.ariaDescribedBy = ''
43
128
  }
129
+ // If the block is brand new and the title is missing then pre-set the word 'Image' to it
130
+ if (
131
+ !Uuid.test(this.block.id) &&
132
+ _.isEmpty(this.block.metadata.config.title)
133
+ ) {
134
+ this.block.metadata.config.title = this.$t(
135
+ 'windward.core.shared.content_blocks.title.image'
136
+ )
137
+ } else if (_.isEmpty(this.block.metadata.config.title)) {
138
+ // Otherwise make sure the title key at least exists
139
+ this.block.metadata.config.title = ''
140
+ }
141
+ if (!_.isBoolean(this.block.metadata.config.display_title)) {
142
+ this.$set(this.block.metadata.config, 'display_title', true)
143
+ }
144
+ if (_.isEmpty(this.block.metadata.config.instructions)) {
145
+ this.block.metadata.config.instructions = ''
146
+ }
44
147
  },
45
148
  }
46
149
  </script>
150
+
151
+ <style lang="scss" scoped>
152
+ .image-description {
153
+ background-color: rgba(var(--v-theme-surface-variant), 0.5);
154
+ border-radius: 4px;
155
+ border-left: 3px solid rgba(var(--v-theme-primary), 0.7);
156
+
157
+ &__heading {
158
+ color: rgba(var(--v-theme-on-surface), 0.87);
159
+ }
160
+
161
+ &__text {
162
+ color: rgba(var(--v-theme-on-surface), 0.7);
163
+
164
+ // Deep selector to style HTML content rendered via v-html
165
+ ::v-deep {
166
+ p {
167
+ margin-bottom: 0.5rem;
168
+
169
+ &:last-child {
170
+ margin-bottom: 0;
171
+ }
172
+ }
173
+
174
+ ul,
175
+ ol {
176
+ margin: 0.5rem 0;
177
+ padding-left: 1.5rem;
178
+ }
179
+
180
+ li {
181
+ margin-bottom: 0.25rem;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ </style>