@worksafevictoria/wcl7.5 1.13.0-beta.9 → 1.14.0-beta.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@worksafevictoria/wcl7.5",
3
- "version": "1.13.0-beta.9",
3
+ "version": "1.14.0-beta.1",
4
4
  "main": "src/index.js",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,7 +21,10 @@
21
21
  :img-alt="item.imageAlt"
22
22
  @click.prevent="handleClick(item.linkURL)"
23
23
  >
24
- <h4>{{ item.title }}</h4>
24
+ <span
25
+ :class="carousel-caption"
26
+ :aria-label="item.title ? item.title : 'No caption available'"
27
+ :style="item.title === null || item.title === '' ? 'height: 32px;' : null">{{ item.title }}</span>
25
28
  </BCarouselSlide>
26
29
  </BCarousel>
27
30
  </div>
@@ -118,17 +121,28 @@ methods: {
118
121
  position: relative;
119
122
  margin-bottom: 10px;
120
123
  }
124
+
125
+ .carousel-inner {
126
+ border-radius: 8px ;
127
+ }
121
128
  /* Introduced changes to make image responsive */
122
129
  .carousel img {
123
130
  object-fit: cover;
124
- max-height: 420px;
131
+ max-height: 392px;
132
+ height: auto;
125
133
  width: 100%;
126
134
  }
127
135
 
136
+ .carousel-indicators {
137
+ justify-content: end !important;
138
+ margin-right: 10px !important;
139
+ }
140
+
128
141
  .carousel-indicators button {
129
142
  width: 10px !important;
130
143
  height: 10px !important;
131
144
  border-radius: 50% !important;
145
+ background-color: yellow !important;
132
146
  }
133
147
 
134
148
  .carousel-indicators button:focus,
@@ -138,14 +152,24 @@ methods: {
138
152
  }
139
153
 
140
154
  .carousel-caption {
155
+ display: flex;
156
+ font-size: 24px;
157
+ font-weight: normal;
158
+ flex-direction: column;
159
+ align-items: flex-start;
160
+ text-align: left !important;
161
+ width: 100%;
141
162
  color: white;
142
- text-decoration: underline;
143
163
  background-color: black;
164
+ left: 0 !important;
165
+ right: 0 !important;
166
+ bottom: 0 !important;
167
+ padding: 1rem !important;
144
168
  }
145
169
 
146
170
  .carousel-control-next,
147
171
  .carousel-control-prev {
148
- bottom: 7rem;
172
+ bottom: 4rem;
149
173
  }
150
174
 
151
175
  .carousel-control-prev:focus,
@@ -158,9 +182,12 @@ methods: {
158
182
 
159
183
  .carousel-control-prev-icon,
160
184
  .carousel-control-next-icon {
161
- height: 50px !important;
162
- width: 50px !important;
163
- outline:none !important;
185
+ height: 60px !important;
186
+ width: 60px !important;
187
+ }
188
+
189
+ .carousel-item {
190
+ position: relative;
164
191
  }
165
192
 
166
193
  .carouselPara {
@@ -38,16 +38,7 @@
38
38
  :stretch="true"
39
39
  >{{ link.text }}</cta-button
40
40
  >
41
- <cta-button
42
- class="iebtn"
43
- url="/choose-your-language"
44
- type="dark"
45
- :stretch="true"
46
- :glyph="earthIcon"
47
- :is-centred="false"
48
- >Choose your language</cta-button
49
- >
50
- </div>
41
+ </div>
51
42
  </template>
52
43
  </hero-header>
53
44
  </template>
@@ -86,7 +77,7 @@ export default {
86
77
 
87
78
  .homepage-header {
88
79
  border-bottom: none !important;
89
-
80
+
90
81
  :deep(.wysiwyg) {
91
82
  h1 {
92
83
  @media screen and (max-width: 390px) {
@@ -13,7 +13,7 @@
13
13
 
14
14
  <div class="homepage-header__content-wrapper">
15
15
  <container class="homepage-header__content-wrapper__content">
16
- <row>
16
+ <row id="header-row">
17
17
  <!-- changes made to bootstrap grid breakpoints -->
18
18
  <column
19
19
  class="homepage-header__content-wrapper__content-col col-12 col-md-7 col-lg-8 homepage-header__content-wrapper__content-col--split wcl-rich-text--ltr"
@@ -25,6 +25,7 @@
25
25
  />
26
26
  </column>
27
27
  <column
28
+ id="header-links"
28
29
  class="homepage-header__side col-12 col-md-5 col-lg-4"
29
30
  >
30
31
  <div>
@@ -33,8 +34,9 @@
33
34
  :key="i"
34
35
  class="iebtn"
35
36
  :url="link.path"
36
- type="dark"
37
37
  :stretch="true"
38
+ type="dark"
39
+
38
40
  >{{ link.text }}</cta-button
39
41
  >
40
42
  </div>
@@ -83,7 +85,35 @@ export default {
83
85
 
84
86
  data: () => ({
85
87
  earthIcon,
86
- })
88
+ }),
89
+ mounted() {
90
+ window.addEventListener('resize', this.setCarouselHeight)
91
+ this.setCarouselHeight()
92
+ },
93
+ beforeDestroy() {
94
+ window.removeEventListener('resize', this.setCarouselHeight)
95
+ },
96
+ methods: {
97
+ setCarouselHeight() {
98
+ this.$nextTick(() => {
99
+ const sideMenu = this.$el.querySelector('.homepage-header__side')
100
+ const carousel = this.$el.querySelector('.carousel')
101
+ const carouselItem = this.$el.querySelector('.carousel-item')
102
+
103
+ if (sideMenu && carousel && window.innerWidth >= 450 ) {
104
+ const menuHeight = sideMenu.offsetHeight
105
+ const newHeight = menuHeight - 16 // 16px padding adjustment
106
+ carousel.style.height = `${newHeight}px`
107
+ if (carouselItem) {
108
+ carouselItem.style.height = `${newHeight}px`
109
+ }
110
+ } else if (carousel) {
111
+ carousel.removeAttribute('style') // Reset to default styles
112
+ carouselItem.removeAttribute('style') // Reset to default styles
113
+ }
114
+ })
115
+ },
116
+ }
87
117
  }
88
118
  </script>
89
119
 
@@ -99,6 +129,8 @@ export default {
99
129
  border-bottom: none !important;
100
130
  height: auto;
101
131
  align-items: normal;
132
+ padding-top: 30px;
133
+ padding-bottom: 30px;
102
134
 
103
135
  :deep(.wysiwyg) {
104
136
  h1 {
@@ -171,7 +203,6 @@ export default {
171
203
  }
172
204
 
173
205
  &__search {
174
- margin-top: 10px;
175
206
  z-index: 1;
176
207
  width: auto;
177
208
  position: relative;
@@ -218,5 +249,4 @@ export default {
218
249
  }
219
250
  }
220
251
 
221
-
222
252
  </style>
@@ -506,7 +506,6 @@ export default {
506
506
  this.windowWidth = window.innerWidth;
507
507
  },
508
508
  firstLevelClick(item, ref) {
509
- // Reset screen to fix whitespace
510
509
  if (window && window.scrollTo && this.screen === "desktop") {
511
510
  window.scrollTo(0, 0);
512
511
  }
@@ -536,10 +535,8 @@ export default {
536
535
  this.isSecondLevelOpen === true &&
537
536
  selectedItem === previouslyOpenItem
538
537
  ) {
539
- selectedItem.classList.remove("isActiveParent");
540
- selectedItem.getElementsByTagName("a")[0].setAttribute("aria-expanded", "false");
541
- this.isSecondLevelOpen = false;
542
- this.letBodyOverflow(true);
538
+ this.closeMegaMenu();
539
+
543
540
  }
544
541
  // If the link has no children then go to that page
545
542
  else if (!item.below) {
@@ -587,6 +584,7 @@ export default {
587
584
  }
588
585
  // If the menu is already open and the same item is clicked,
589
586
  // close it
587
+
590
588
  else if (
591
589
  item.below &&
592
590
  this.isThirdLevelOpen === true &&
@@ -3,6 +3,7 @@
3
3
  .app-header {
4
4
  &.isMobile {
5
5
  padding: 0;
6
+ width: 100vw;
6
7
 
7
8
  .app-header {
8
9
  &__wrap {
@@ -300,7 +301,8 @@
300
301
  border-collapse: separate;
301
302
  border-spacing: 5px;
302
303
  }
303
- }
304
+
305
+ }
304
306
 
305
307
  .imgMobile {
306
308
  display: block;
@@ -323,6 +325,10 @@
323
325
  background-color: #f2f2f2;
324
326
  border: 1px solid #f2f2f2;
325
327
  border-radius: 8px;
328
+
329
+ &:focus, &:hover {
330
+ border: 1px solid #BABABA;
331
+ }
326
332
  }
327
333
 
328
334
  .app-header__wrap_mobile {
@@ -331,6 +337,6 @@
331
337
  }
332
338
 
333
339
  .flex-container_contrast_mobile {
334
- margin-left: -10px;
340
+ margin-left: -167px;
335
341
  }
336
342
 
@@ -4,8 +4,8 @@
4
4
  color: $app-menu-white;
5
5
  z-index: 27;
6
6
  position: relative;
7
- padding: 0px 10px;
8
- width: 100%;
7
+ padding: 0px;
8
+ width: 100vw;
9
9
  font-size: 14px;
10
10
 
11
11
  &__wrap {
@@ -45,9 +45,14 @@
45
45
  }
46
46
  .isActiveChild {
47
47
  > a {
48
- background: $app-header-active;
49
- color: $app-header-text-colour;
48
+ background: $app-header-hover;
49
+ color: black;
50
50
  border-bottom: 1px solid transparent;
51
+
52
+ svg.caret-right {
53
+ filter: invert(0%) sepia(12%) saturate(108%) hue-rotate(344deg)
54
+ brightness(94%) contrast(80%);
55
+ }
51
56
  }
52
57
  }
53
58
 
@@ -430,7 +435,7 @@
430
435
  .logoImg {
431
436
  height: 55px;
432
437
  width: auto;
433
- margin-left: 10px;
438
+ margin-left: 20px;
434
439
  }
435
440
 
436
441
  .semi-circle {
@@ -25,7 +25,7 @@
25
25
  />
26
26
  </template>
27
27
 
28
- <template v-if="filters.taxonomies.length > 0" v-slot:cardGroupPreContent>
28
+ <template v-if="filters?.taxonomies?.length > 0" v-slot:cardGroupPreContent>
29
29
  <directory-filters
30
30
  class="wcl-browse-content__filter"
31
31
  :filters="filters"
@@ -38,250 +38,245 @@
38
38
  </card-group>
39
39
  </template>
40
40
 
41
- <script>
42
- import CardGroup from '../../SubComponents/CardGroup/index.vue'
43
- import DirectoryFilters from '../../Global/DirectoryFilters/index.vue'
44
- import Switcher from './switcher.vue'
41
+ <script setup>
42
+ // import { CardGroup, DirectoryFilters, Switcher } from '@worksafevictoria/wcl7.5'
45
43
 
46
- export default {
47
- name: 'BrowseContent',
48
- components: {
49
- CardGroup,
50
- DirectoryFilters,
51
- Switcher,
44
+ const nuxtApp = useNuxtApp()
45
+ const hasMorePages = ref(false)
46
+ const displayedCards = ref([])
47
+ const loading = ref(false)
48
+ const bundleCache = ref({})
49
+ const displayLimit = ref(0)
50
+ const allCards = ref(undefined)
51
+ const props = defineProps({
52
+ background: {
53
+ type: String,
54
+ default: 'grey',
52
55
  },
53
- props: {
54
- background: {
55
- type: String,
56
- default: 'grey',
57
- },
58
- title: {
59
- type: String,
60
- default: '',
61
- },
62
- titleTag: {
63
- type: String,
64
- default: 'h2',
65
- },
66
- bundle: {
67
- type: Array,
68
- default: () => [''],
69
- },
70
- columns: {
71
- type: Number,
72
- default: 0,
73
- },
74
- initialDisplyLimit: {
75
- type: Number,
76
- default: 0,
77
- },
78
- fetchContent: {
79
- type: Function,
80
- required: true,
81
- },
82
- fetchFilters: {
83
- type: Function,
84
- required: false,
85
- default: null,
86
- },
87
- enableBundleFilter: {
88
- type: Boolean,
89
- },
90
- getBundleAlias: {
91
- type: Function,
92
- required: false,
93
- default: null,
94
- },
95
- showMore: {
96
- type: Boolean,
97
- },
98
- type: {
99
- type: String,
100
- required: true,
101
- },
56
+ title: {
57
+ type: String,
58
+ default: '',
102
59
  },
103
- // Temp use of mounted to replace fetch
104
- async mounted() {
105
- if (this.displayedCards.length === 0) {
106
- await this.loadFiltersAndContent()
107
- }
60
+ titleTag: {
61
+ type: String,
62
+ default: 'h2',
108
63
  },
109
- // TODO useAsyncData <script setup>
110
- // async fetch() {
111
- // if (this.displayedCards.length === 0) {
112
- // await this.loadFiltersAndContent()
113
- // }
114
- // },
115
- data() {
116
- return {
117
- hasMorePages: false,
118
- displayedCards: [],
119
- loading: true,
120
- bundleCache: {},
121
- displayLimit: 0,
122
- allCards: undefined,
123
- filters: {
124
- taxonomies: [],
125
- selected: {},
126
- availableBundles: [],
127
- },
128
- }
64
+ bundle: {
65
+ type: Array,
66
+ default: () => [''],
129
67
  },
130
- fetchKey: 'ws-browscontent',
131
- methods: {
132
- async loadFiltersAndContent() {
133
- await Promise.all([
134
- this.fetchFilters ? this.loadFilters() : Promise.resolve(),
135
- this.loadMoreCards(true),
136
- ])
137
- },
138
- init() {
139
- this.allCards = {
140
- total: 0,
141
- cards: [],
142
- }
143
- this.displayLimit = 0
144
- this.hasMorePages = false
145
- this.displayedCards = []
146
- this.bundleCache = {}
147
- },
148
- async fetchCards(currentDisplayedCards, allCards, addMoreBy, bundles) {
149
- const shouldMakeNewFetchCall =
150
- currentDisplayedCards.length + addMoreBy > allCards.cards.length
151
- if (shouldMakeNewFetchCall) {
152
- const cardBundles = await Promise.all(
153
- bundles.map((bundle, index) =>
154
- this.getBundle(bundle, addMoreBy, index),
155
- ),
156
- )
157
- allCards = this.getShuffledCards(cardBundles)
68
+ columns: {
69
+ type: Number,
70
+ default: 0,
71
+ },
72
+ initialDisplyLimit: {
73
+ type: Number,
74
+ default: 0,
75
+ },
76
+ fetchContent: {
77
+ type: Function,
78
+ required: true,
79
+ },
80
+ fetchFilters: {
81
+ type: Function,
82
+ required: false,
83
+ default: null,
84
+ },
85
+ enableBundleFilter: {
86
+ type: Boolean,
87
+ },
88
+ getBundleAlias: {
89
+ type: Function,
90
+ required: false,
91
+ default: null,
92
+ },
93
+ showMore: {
94
+ type: Boolean,
95
+ },
96
+ type: {
97
+ type: String,
98
+ required: true,
99
+ },
100
+ id: {
101
+ type: String,
102
+ required: true,
103
+ },
104
+ })
158
105
 
159
- if (
160
- this.type === 'paragraph--cards_group_latest' ||
161
- this.type === 'paragraph--browse_content'
162
- ) {
163
- allCards.cards = this.sortByDate(allCards.cards)
164
- }
165
- }
166
- return allCards
167
- },
168
- async loadMoreCards(init) {
169
- const attrs = {
170
- group: this.$pageStore?.content?.title,
171
- }
172
- if (this.$gtm && !init) {
173
- this.$gtm.push({ event: 'custom.interaction.showmore.click', ...attrs })
174
- }
175
- if (init) {
176
- this.init()
177
- }
178
- this.loading = true
179
- const addMoreBy = this.initialDisplyLimit
180
- this.displayLimit += addMoreBy
181
- const bundles =
182
- this.filters.availableBundles.length > 0
183
- ? this.filters.availableBundles
184
- : this.bundle
185
- this.allCards = await this.fetchCards(
186
- this.displayedCards,
187
- this.allCards,
188
- addMoreBy,
189
- bundles,
190
- )
191
- this.hasMorePages = this.allCards.total > this.allCards.cards.length
192
- this.displayedCards = this.allCards.cards.slice(0, this.displayLimit)
193
- this.loading = false
194
- },
195
- getBundle(bundle, addMoreBy, index) {
196
- let start
197
- const rows = addMoreBy
198
- const cache = (this.bundleCache[bundle] = this.bundleCache[bundle] || {
199
- response: {
200
- results: [],
201
- numFound: 0,
202
- },
203
- qs: {
204
- start,
205
- },
106
+ const filterKey = computed(() => `filters-${props.id}`)
107
+ const { data: filters } = await useAsyncData(filterKey, async () => {
108
+ try {
109
+ const filters = {
110
+ taxonomies: [],
111
+ selected: {},
112
+ availableBundles: [],
113
+ }
114
+ if (props.fetchFilters) {
115
+ await props.fetchFilters().then((taxonomies) => {
116
+ filters.taxonomies = taxonomies
206
117
  })
118
+ }
119
+ return filters
120
+ } catch (err) {
121
+ console.log('🚀 ~ err:', err)
122
+ }
123
+ })
207
124
 
208
- if (cache.qs.start === undefined) {
209
- start = 0
210
- } else if (cache.response.numFound > cache.response.results.length) {
211
- start = cache.response.results.length
212
- } else {
213
- return Promise.resolve(cache.response)
214
- }
215
-
216
- const qs = {
217
- bundle,
218
- rows,
219
- start,
220
- }
221
- return this.fetchContent(qs, this.filters.selected, index).then(
222
- (response) => {
223
- cache.qs.start = qs.start
224
- cache.response.numFound = response.numFound
225
- cache.response.results.push(...response.results)
226
- return cache.response
227
- },
228
- )
229
- },
230
- getShuffledCards(cardBundles) {
231
- const shuffled = []
232
- const bundleWithMostCards = cardBundles.reduce(
233
- (a, b) => (a.results.length > b.results.length ? a : b),
234
- { results: [] },
235
- ).results.length
125
+ const cardsKey = computed(() => `cards-${props.id}`)
126
+ const { data: savedCards } = await useAsyncData(cardsKey, async () => {
127
+ await loadMoreCards(true)
128
+ return {
129
+ cards: JSON.parse(JSON.stringify(allCards.value)),
130
+ bundle: JSON.parse(JSON.stringify(bundleCache.value)),
131
+ }
132
+ })
236
133
 
237
- for (let i = 0; i < bundleWithMostCards; i++) {
238
- cardBundles.forEach((bundle) => {
239
- if (bundle.results[i]) {
240
- shuffled.push(bundle.results[i])
241
- }
242
- })
243
- }
134
+ watch(
135
+ () => savedCards.value,
136
+ (newVal, oldVal) => {
137
+ if (newVal && allCards.value === undefined) {
138
+ allCards.value = JSON.parse(JSON.stringify(savedCards.value.cards))
139
+ bundleCache.value = JSON.parse(JSON.stringify(savedCards.value.bundle))
140
+ displayLimit.value += props.initialDisplyLimit
141
+ hasMorePages.value = allCards.value.total > allCards.value.cards.length
142
+ displayedCards.value = allCards.value.cards.slice(0, displayLimit.value)
143
+ }
144
+ },
145
+ { immediate: true },
146
+ )
244
147
 
245
- const total = cardBundles.reduce((acc, bundle) => {
246
- return acc + bundle.numFound
247
- }, 0)
148
+ function initial() {
149
+ allCards.value = {
150
+ total: 0,
151
+ cards: [],
152
+ }
153
+ displayLimit.value = 0
154
+ hasMorePages.value = false
155
+ displayedCards.value = []
156
+ bundleCache.value = {}
157
+ }
158
+ async function fetchCards(currentDisplayedCards, allCards, addMoreBy, bundles) {
159
+ const shouldMakeNewFetchCall =
160
+ currentDisplayedCards.length + addMoreBy > allCards.cards.length
161
+ if (shouldMakeNewFetchCall) {
162
+ const cardBundles = await Promise.all(
163
+ bundles.map((bundle, index) => getBundle(bundle, addMoreBy, index)),
164
+ )
165
+ allCards = getShuffledCards(cardBundles)
248
166
 
249
- return { cards: shuffled, total }
250
- },
251
- loadFilters() {
252
- return this.fetchFilters().then((taxonomies) => {
253
- this.filters.taxonomies = taxonomies
254
- return Promise.resolve(taxonomies)
255
- })
167
+ if (
168
+ props.type === 'paragraph--cards_group_latest' ||
169
+ props.type === 'paragraph--browse_content'
170
+ ) {
171
+ allCards.cards = sortByDate(allCards.cards)
172
+ }
173
+ }
174
+ return allCards
175
+ }
176
+ async function loadMoreCards(init) {
177
+ const attrs = {
178
+ group: nuxtApp.$pageStore?.content?.title,
179
+ }
180
+ if (nuxtApp.$gtm && !init) {
181
+ nuxtApp.$gtm.push({ event: 'custom.interaction.showmore.click', ...attrs })
182
+ }
183
+ if (init) {
184
+ initial()
185
+ }
186
+ loading.value = true
187
+ // const addMoreBy = props.initialDisplyLimit
188
+ displayLimit.value += props.initialDisplyLimit
189
+ const bundles =
190
+ filters.value.availableBundles.length > 0
191
+ ? filters.value.availableBundles
192
+ : props.bundle
193
+ allCards.value = await fetchCards(
194
+ displayedCards.value,
195
+ allCards.value,
196
+ props.initialDisplyLimit, //addMoreBy,
197
+ bundles,
198
+ )
199
+ hasMorePages.value = allCards.value.total > allCards.value.cards.length
200
+ displayedCards.value = allCards.value.cards.slice(0, displayLimit.value)
201
+ loading.value = false
202
+ }
203
+ async function getBundle(bundle, addMoreBy, index) {
204
+ let start
205
+ const rows = addMoreBy
206
+ const cache = (bundleCache.value[bundle] = bundleCache.value[bundle] || {
207
+ response: {
208
+ results: [],
209
+ numFound: 0,
256
210
  },
257
- onFilter(filters) {
258
- this.bundleCache = {}
259
- Object.keys(filters).forEach((filter) => {
260
- this.filters.selected[filter] = filters[filter].map((obj) => obj.tid)
261
- })
262
- this.loadMoreCards(true)
211
+ qs: {
212
+ start,
263
213
  },
264
- onSwitcher(switchToBundle) {
265
- this.filters.selected = {}
266
- this.filters.availableBundles.length = 0
267
- if (switchToBundle) {
268
- this.filters.availableBundles.push(switchToBundle)
214
+ })
215
+ if (cache.qs.start === undefined) {
216
+ start = 0
217
+ } else if (cache.response.numFound > cache.response.results.length) {
218
+ start = cache.response.results.length
219
+ } else {
220
+ return Promise.resolve(cache.response)
221
+ }
222
+ const qs = {
223
+ bundle,
224
+ rows,
225
+ start,
226
+ }
227
+ let response = await props.fetchContent(qs, filters.value.selected)
228
+ cache.qs.start = qs.start
229
+ cache.response.numFound = response.numFound
230
+ cache.response.results.push(...response.results)
231
+ return cache.response
232
+ }
233
+ function getShuffledCards(cardBundles) {
234
+ const shuffled = []
235
+ const bundleWithMostCards = cardBundles.reduce(
236
+ (a, b) => (a.results.length > b.results.length ? a : b),
237
+ { results: [] },
238
+ ).results.length
239
+
240
+ for (let i = 0; i < bundleWithMostCards; i++) {
241
+ cardBundles.forEach((bundle) => {
242
+ if (bundle.results[i]) {
243
+ shuffled.push(bundle.results[i])
269
244
  }
270
- this.loadMoreCards(true)
271
- },
272
- async reset() {
273
- this.bundleCache = {}
274
- this.filters.selected = {}
275
- this.filters.availableBundles.length = 0
276
- await this.loadMoreCards(true)
277
- },
278
- sortByDate(cards) {
279
- const sorted = cards.sort((a, b) => {
280
- return new Date(b.dateSort) - new Date(a.dateSort)
281
- })
282
- return sorted
283
- },
284
- },
245
+ })
246
+ }
247
+
248
+ const total = cardBundles.reduce((acc, bundle) => {
249
+ return acc + bundle.numFound
250
+ }, 0)
251
+
252
+ return { cards: shuffled, total }
253
+ }
254
+ const onFilter = (fltrs) => {
255
+ bundleCache.value = {}
256
+ Object.keys(fltrs).forEach((filter) => {
257
+ filters.value.selected[filter] = fltrs[filter].map((obj) => obj.tid)
258
+ })
259
+ loadMoreCards(true)
260
+ }
261
+ const onSwitcher = (switchToBundle) => {
262
+ filters.value.selected = {}
263
+ filters.value.availableBundles.length = 0
264
+ if (switchToBundle) {
265
+ filters.value.availableBundles.push(switchToBundle)
266
+ }
267
+ loadMoreCards(true)
268
+ }
269
+ const reset = async () => {
270
+ bundleCache.value = {}
271
+ filters.value.selected = {}
272
+ filters.value.availableBundles.length = 0
273
+ await loadMoreCards(true)
274
+ }
275
+ function sortByDate(cards) {
276
+ const sorted = cards.sort((a, b) => {
277
+ return new Date(b.dateSort) - new Date(a.dateSort)
278
+ })
279
+ return sorted
285
280
  }
286
281
  </script>
287
282
  <style lang="scss" scoped>
@@ -17,6 +17,7 @@
17
17
  $multiplier: calc(($max - $min) / ($end - $start) * 100);
18
18
  $adder: calc(($min * $end - $max * $start) / ($end - $start));
19
19
  $formula: calc(#{$multiplier + 0vw} + #{$adder + 0px});
20
+ #{$property}: $formula;
20
21
  @if $clip and $clipAtStart {
21
22
  @media (max-width: #{$start + 0px}) {
22
23
  #{$property}: $min + 0px;
@@ -27,5 +28,4 @@
27
28
  #{$property}: $max + 0px;
28
29
  }
29
30
  }
30
- #{$property}: $formula;
31
31
  }
package/src/index.js CHANGED
@@ -1,13 +1,13 @@
1
- // Global Components
1
+ // Global Componentsn - replace HomePageheader with HomepageHeaderNew to introduce new header
2
2
  import Container from './components/Containers/Container/index.vue'
3
3
  import Row from './components/Containers/Row/index.vue'
4
4
  import Column from './components/Containers/Column/index.vue'
5
- import HomepageHeader from './components/Containers/HomepageHeaderNew/index.vue'
5
+ import HomepageHeader from './components/Containers/HomepageHeader/index.vue'
6
6
  import Subheader from './components/Containers/Subheader/index.vue'
7
7
  import SectionGroup from './components/Containers/SectionGroup/index.vue'
8
8
  import CarouselComponent from './components/Containers/Carousel/index.vue'
9
9
 
10
- import AppHeader from './components/Global/AppHeaderNew/index.vue'
10
+ import AppHeader from './components/Global/AppHeader/index.vue'
11
11
  import AppFooter from './components/Global/AppFooter/index.vue'
12
12
  import HeroHeader from './components/Global/HeroHeader/index.vue'
13
13
  import SocialShare from './components/Global/SocialShare/index.vue'
@@ -59,9 +59,6 @@ import Search from './components/SubComponents/Search/index.vue'
59
59
  import VideoThumbnail from './components/SubComponents/VideoThumbnail/index.vue'
60
60
  import ResourceGroup from './components/SubComponents/ResourceGroup/index.vue'
61
61
 
62
- // Temp Components for testing
63
- import BrowseContent2 from './components/Paragraphs/BrowseContent/setup.vue'
64
-
65
62
  // Export Global Components
66
63
  export {
67
64
  Container,
@@ -128,15 +125,8 @@ export {
128
125
  ResourceGroup,
129
126
  }
130
127
 
131
- // Export for BrowseContent
128
+ // DEPRECATED - to be removed in future
132
129
  import DirectoryFilters from './components/Global/DirectoryFilters/index.vue'
133
130
  import Switcher from './components/Paragraphs/BrowseContent/switcher.vue'
134
131
 
135
- export {
136
- // CardGroup, already imported
137
- DirectoryFilters,
138
- Switcher,
139
- }
140
-
141
- // Temp Components for testing
142
- export { BrowseContent2 }
132
+ export { DirectoryFilters, Switcher }
@@ -1,284 +0,0 @@
1
- <template>
2
- <card-group
3
- :title="title"
4
- :title-tag="titleTag"
5
- :background="background"
6
- :cards="displayedCards"
7
- :loading="loading"
8
- :columns="columns"
9
- :show-load-more="showMore && hasMorePages"
10
- :class="`wcl-browse-content card_group__card--col-${columns}`"
11
- :card-browse-content="true"
12
- @loadMore="() => loadMoreCards(false)"
13
- >
14
- <template
15
- v-if="enableBundleFilter && bundle.length > 1"
16
- v-slot:cardGroupFilter
17
- >
18
- <switcher
19
- v-if="enableBundleFilter"
20
- :options="bundle"
21
- class="wcl-browse-content__switcher"
22
- :get-option-alias="getBundleAlias"
23
- @switched="onSwitcher"
24
- @reset="onSwitcher"
25
- />
26
- </template>
27
-
28
- <template v-if="filters.taxonomies.length > 0" v-slot:cardGroupPreContent>
29
- <directory-filters
30
- class="wcl-browse-content__filter"
31
- :filters="filters"
32
- :results="allCards.total"
33
- :is-filtering="loading"
34
- @onFilter="onFilter"
35
- @onReset="reset"
36
- />
37
- </template>
38
- </card-group>
39
- </template>
40
-
41
- <script setup>
42
- import CardGroup from '../../SubComponents/CardGroup/index.vue'
43
- import DirectoryFilters from '../../Global/DirectoryFilters/index.vue'
44
- import Switcher from './switcher.vue'
45
-
46
- const nuxtApp = useNuxtApp()
47
-
48
- const hasMorePages = ref(false)
49
- const displayedCards = ref([])
50
- const loading = ref(true)
51
- const bundleCache = ref({})
52
- const displayLimit = ref(0)
53
- const allCards = ref(undefined)
54
- const filters = ref({
55
- taxonomies: [],
56
- selected: {},
57
- availableBundles: [],
58
- })
59
- const props = defineProps({
60
- background: {
61
- type: String,
62
- default: 'grey',
63
- },
64
- title: {
65
- type: String,
66
- default: '',
67
- },
68
- titleTag: {
69
- type: String,
70
- default: 'h2',
71
- },
72
- bundle: {
73
- type: Array,
74
- default: () => [''],
75
- },
76
- columns: {
77
- type: Number,
78
- default: 0,
79
- },
80
- initialDisplyLimit: {
81
- type: Number,
82
- default: 0,
83
- },
84
- fetchContent: {
85
- type: Function,
86
- required: true,
87
- },
88
- fetchFilters: {
89
- type: Function,
90
- required: false,
91
- default: null,
92
- },
93
- enableBundleFilter: {
94
- type: Boolean,
95
- },
96
- getBundleAlias: {
97
- type: Function,
98
- required: false,
99
- default: null,
100
- },
101
- showMore: {
102
- type: Boolean,
103
- },
104
- type: {
105
- type: String,
106
- required: true,
107
- },
108
- })
109
-
110
- await useAsyncData('fetchData', async () => {
111
- try {
112
- await Promise.all([
113
- props.fetchFilters ? loadFilters() : Promise.resolve(),
114
- loadMoreCards(true),
115
- ])
116
- } catch (err) {
117
- console.log('🚀 ~ err:', err)
118
- }
119
- })
120
-
121
- function initial() {
122
- allCards.value = {
123
- total: 0,
124
- cards: [],
125
- }
126
- displayLimit.value = 0
127
- hasMorePages.value = false
128
- displayedCards.value = []
129
- bundleCache.value = {}
130
- }
131
- async function fetchCards(currentDisplayedCards, allCards, addMoreBy, bundles) {
132
- const shouldMakeNewFetchCall =
133
- currentDisplayedCards.length + addMoreBy > allCards.cards.length
134
- if (shouldMakeNewFetchCall) {
135
- const cardBundles = await Promise.all(
136
- bundles.map((bundle, index) => getBundle(bundle, addMoreBy, index)),
137
- )
138
- allCards = getShuffledCards(cardBundles)
139
-
140
- if (
141
- props.type === 'paragraph--cards_group_latest' ||
142
- props.type === 'paragraph--browse_content'
143
- ) {
144
- allCards.cards = sortByDate(allCards.cards)
145
- }
146
- }
147
- return allCards
148
- }
149
-
150
- async function loadMoreCards(init) {
151
- const attrs = {
152
- group: nuxtApp.$pageStore?.content?.title,
153
- }
154
- if (nuxtApp.$gtm && !init) {
155
- nuxtApp.$gtm.push({ event: 'custom.interaction.showmore.click', ...attrs })
156
- }
157
- if (init) {
158
- initial()
159
- }
160
- loading.value = true
161
- const addMoreBy = props.initialDisplyLimit
162
- displayLimit.value += addMoreBy
163
- const bundles =
164
- filters.value.availableBundles.length > 0
165
- ? filters.value.availableBundles
166
- : props.bundle
167
- allCards.value = await fetchCards(
168
- displayedCards.value,
169
- allCards.value,
170
- addMoreBy,
171
- bundles,
172
- )
173
- hasMorePages.value = allCards.value.total > allCards.value.cards.length
174
- displayedCards.value = allCards.value.cards.slice(0, displayLimit.value)
175
- loading.value = false
176
- }
177
- async function getBundle(bundle, addMoreBy, index) {
178
- let start
179
- const rows = addMoreBy
180
- const cache = (bundleCache.value[bundle] = bundleCache.value[bundle] || {
181
- response: {
182
- results: [],
183
- numFound: 0,
184
- },
185
- qs: {
186
- start,
187
- },
188
- })
189
- if (cache.qs.start === undefined) {
190
- start = 0
191
- } else if (cache.response.numFound > cache.response.results.length) {
192
- start = cache.response.results.length
193
- } else {
194
- return Promise.resolve(cache.response)
195
- }
196
- const qs = {
197
- bundle,
198
- rows,
199
- start,
200
- }
201
- let response = await props.fetchContent(qs, filters.value.selected)
202
- cache.qs.start = qs.start
203
- cache.response.numFound = response.numFound
204
- cache.response.results.push(...response.results)
205
- return cache.response
206
- }
207
- function getShuffledCards(cardBundles) {
208
- const shuffled = []
209
- const bundleWithMostCards = cardBundles.reduce(
210
- (a, b) => (a.results.length > b.results.length ? a : b),
211
- { results: [] },
212
- ).results.length
213
-
214
- for (let i = 0; i < bundleWithMostCards; i++) {
215
- cardBundles.forEach((bundle) => {
216
- if (bundle.results[i]) {
217
- shuffled.push(bundle.results[i])
218
- }
219
- })
220
- }
221
-
222
- const total = cardBundles.reduce((acc, bundle) => {
223
- return acc + bundle.numFound
224
- }, 0)
225
-
226
- return { cards: shuffled, total }
227
- }
228
- function loadFilters() {
229
- return props.fetchFilters().then((taxonomies) => {
230
- filters.value.taxonomies = taxonomies
231
-
232
- return Promise.resolve(taxonomies)
233
- })
234
- }
235
- const onFilter = (fltrs) => {
236
- bundleCache.value = {}
237
- Object.keys(fltrs).forEach((filter) => {
238
- filters.values.selected[filter] = fltrs[filter].map((obj) => obj.tid)
239
- })
240
- loadMoreCards(true)
241
- }
242
- const onSwitcher = (switchToBundle) => {
243
- filters.value.selected = {}
244
- filters.value.availableBundles.length = 0
245
- if (switchToBundle) {
246
- filters.value.availableBundles.push(switchToBundle)
247
- }
248
- loadMoreCards(true)
249
- }
250
- const reset = async () => {
251
- bundleCache.value = {}
252
- filters.value.selected = {}
253
- filters.value.availableBundles.length = 0
254
- await loadMoreCards(true)
255
- }
256
- function sortByDate(cards) {
257
- const sorted = cards.sort((a, b) => {
258
- return new Date(b.dateSort) - new Date(a.dateSort)
259
- })
260
- return sorted
261
- }
262
- </script>
263
- <style lang="scss" scoped>
264
- .wcl-browse-content {
265
- &__filter {
266
- align-items: flex-end;
267
- place-content: flex-end;
268
- }
269
-
270
- &.card_group__card--col-4 {
271
- :deep(.card-grid__column .card-grid-item__description) {
272
- display: none;
273
- }
274
- }
275
-
276
- :deep(.card_group__card--blue .card_item__desc p) {
277
- margin-top: 12px;
278
- }
279
-
280
- :deep(.card_group__card--red .card_item__desc p) {
281
- margin-top: 12px;
282
- }
283
- }
284
- </style>