@worksafevictoria/wcl7.5 1.13.0-beta.16 → 1.13.0-beta.18
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 +1 -1
- package/src/components/Containers/Carousel/index.vue +35 -7
- package/src/components/Containers/HomepageHeaderNew/index.vue +35 -5
- package/src/components/Global/AppHeaderNew/index.vue +3 -5
- package/src/components/Paragraphs/BrowseContent/index.vue +226 -231
- package/src/includes/scss/mixins/src/fp.scss +1 -1
- package/src/index.js +2 -12
- package/src/components/Paragraphs/BrowseContent/setup.vue +0 -284
package/package.json
CHANGED
|
@@ -21,7 +21,10 @@
|
|
|
21
21
|
:img-alt="item.imageAlt"
|
|
22
22
|
@click.prevent="handleClick(item.linkURL)"
|
|
23
23
|
>
|
|
24
|
-
<
|
|
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>
|
|
@@ -30,6 +33,7 @@
|
|
|
30
33
|
<script>
|
|
31
34
|
import { BCarousel, BCarouselSlide } from "bootstrap-vue-next"
|
|
32
35
|
import { isAbsoluteUrl, navigateToPath } from "../../../../lib/utility"
|
|
36
|
+
import { is } from "date-fns/locale";
|
|
33
37
|
|
|
34
38
|
export default {
|
|
35
39
|
name: "CarouselComponent",
|
|
@@ -118,17 +122,28 @@ methods: {
|
|
|
118
122
|
position: relative;
|
|
119
123
|
margin-bottom: 10px;
|
|
120
124
|
}
|
|
125
|
+
|
|
126
|
+
.carousel-inner {
|
|
127
|
+
border-radius: 8px ;
|
|
128
|
+
}
|
|
121
129
|
/* Introduced changes to make image responsive */
|
|
122
130
|
.carousel img {
|
|
123
131
|
object-fit: cover;
|
|
124
|
-
max-height:
|
|
132
|
+
max-height: 392px;
|
|
133
|
+
height: auto;
|
|
125
134
|
width: 100%;
|
|
126
135
|
}
|
|
127
136
|
|
|
137
|
+
.carousel-indicators {
|
|
138
|
+
justify-content: end !important;
|
|
139
|
+
margin-right: 10px !important;
|
|
140
|
+
}
|
|
141
|
+
|
|
128
142
|
.carousel-indicators button {
|
|
129
143
|
width: 10px !important;
|
|
130
144
|
height: 10px !important;
|
|
131
145
|
border-radius: 50% !important;
|
|
146
|
+
background-color: yellow !important;
|
|
132
147
|
}
|
|
133
148
|
|
|
134
149
|
.carousel-indicators button:focus,
|
|
@@ -138,14 +153,24 @@ methods: {
|
|
|
138
153
|
}
|
|
139
154
|
|
|
140
155
|
.carousel-caption {
|
|
156
|
+
display: flex;
|
|
157
|
+
font-size: 24px;
|
|
158
|
+
font-weight: normal;
|
|
159
|
+
flex-direction: column;
|
|
160
|
+
align-items: flex-start;
|
|
161
|
+
text-align: left !important;
|
|
162
|
+
width: 100%;
|
|
141
163
|
color: white;
|
|
142
|
-
text-decoration: underline;
|
|
143
164
|
background-color: black;
|
|
165
|
+
left: 0 !important;
|
|
166
|
+
right: 0 !important;
|
|
167
|
+
bottom: 0 !important;
|
|
168
|
+
padding: 1rem !important;
|
|
144
169
|
}
|
|
145
170
|
|
|
146
171
|
.carousel-control-next,
|
|
147
172
|
.carousel-control-prev {
|
|
148
|
-
bottom:
|
|
173
|
+
bottom: 4rem;
|
|
149
174
|
}
|
|
150
175
|
|
|
151
176
|
.carousel-control-prev:focus,
|
|
@@ -158,9 +183,12 @@ methods: {
|
|
|
158
183
|
|
|
159
184
|
.carousel-control-prev-icon,
|
|
160
185
|
.carousel-control-next-icon {
|
|
161
|
-
height:
|
|
162
|
-
width:
|
|
163
|
-
|
|
186
|
+
height: 60px !important;
|
|
187
|
+
width: 60px !important;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.carousel-item {
|
|
191
|
+
position: relative;
|
|
164
192
|
}
|
|
165
193
|
|
|
166
194
|
.carouselPara {
|
|
@@ -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
|
-
|
|
540
|
-
|
|
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 &&
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
/>
|
|
26
26
|
</template>
|
|
27
27
|
|
|
28
|
-
<template v-if="filters
|
|
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 '
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
await this.loadFiltersAndContent()
|
|
107
|
-
}
|
|
60
|
+
titleTag: {
|
|
61
|
+
type: String,
|
|
62
|
+
default: 'h2',
|
|
108
63
|
},
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
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
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
@@ -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
|
-
//
|
|
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>
|