@asd20/ui 3.2.594 → 3.2.596

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.
@@ -0,0 +1,547 @@
1
+ <template>
2
+ <div class="asd20-template-clubs">
3
+ <!-- Skip Nav -->
4
+ <asd20-skip-to />
5
+
6
+ <!-- Site Navigation -->
7
+ <asd20-site-navigation
8
+ :navigation="navigation"
9
+ :action-items="actionItems"
10
+ @update:menuOpen="$emit('update:menuOpen', $event)"
11
+ :menu-open="menuOpen"
12
+ @update:searchOpen="$emit('update:searchOpen', $event)"
13
+ :search-open="searchOpen"
14
+ :organization="organization"
15
+ :organization-options="organizationOptions"
16
+ >
17
+ </asd20-site-navigation>
18
+
19
+ <!-- Banner Notifications -->
20
+ <client-only>
21
+ <asd20-notification-group
22
+ :notifications="activeNotificationsByType.banner"
23
+ group-type="banner"
24
+ @dismiss="$emit('dismiss-notification', $event)"
25
+ @toggle-all="$emit('toggle-all')"
26
+ />
27
+ </client-only>
28
+
29
+ <!-- Page Header -->
30
+ <asd20-page-header
31
+ id="page-header"
32
+ v-if="pageHeaderContent"
33
+ v-bind="pageHeaderContent"
34
+ :organization="organization"
35
+ :organization-options="organizationOptions"
36
+ :languageCode="languageCode"
37
+ v-on="$listeners"
38
+ :breadcrumb-links="breadcrumbLinks"
39
+ >
40
+ <!-- Floating Notifications -->
41
+ <template slot="top">
42
+ <client-only>
43
+ <asd20-notification-group
44
+ class="asd20-notification-group--floating"
45
+ :notifications="activeNotificationsByType.floating"
46
+ :total-dismissed-notifications="totalDismissedNotifications"
47
+ group-type="floating"
48
+ @dismiss="$emit('dismiss-notification', $event)"
49
+ @toggle-all="$emit('toggle-all')"
50
+ ></asd20-notification-group>
51
+ </client-only>
52
+ </template>
53
+ <!-- <asd20-breadcrumb slot="top" :links="breadcrumbLinks"></asd20-breadcrumb> -->
54
+ </asd20-page-header>
55
+
56
+ <!-- Inline-Notifications -->
57
+ <client-only>
58
+ <asd20-notification-group
59
+ :notifications="activeNotificationsByType.inline"
60
+ group-type="inline"
61
+ @dismiss="$emit('dismiss-notification', $event)"
62
+ @toggle-all="$emit('toggle-all')"
63
+ ></asd20-notification-group>
64
+ </client-only>
65
+
66
+ <!-- Page Content -->
67
+ <asd20-page-content
68
+ :primary-messages="primaryMessages"
69
+ :secondary-messages="secondaryMessages"
70
+ omit-detail-links
71
+ omit-calls-to-action
72
+ grid
73
+ ></asd20-page-content>
74
+
75
+ <intersect @enter="$emit('stories-in-view')">
76
+ <div class="article-digest">
77
+ <h2 class="feed-title">
78
+ {{
79
+ storiesFeedProps && storiesFeedProps.title
80
+ ? storiesFeedProps.title
81
+ : 'Stories & Features'
82
+ }}
83
+ </h2>
84
+ <div class="search-header">
85
+ <asd20-search-field
86
+ :value="keywords"
87
+ @input="$emit('update:keywords', $event)"
88
+ medium
89
+ />
90
+ <asd20-multiselect-input
91
+ label="Categories"
92
+ :taggable="false"
93
+ :value="selectedCategories"
94
+ :items="categoryOptions"
95
+ @input="$emit('update:selected-categories', $event)"
96
+ />
97
+ </div>
98
+
99
+ <div v-if="cards.length < 1">
100
+ <br />
101
+ <p>There are currently no featues to view.</p>
102
+ </div>
103
+ <div class="feed" v-if="cards.length > 0">
104
+ <div
105
+ v-if="cards.length > numberToShow"
106
+ id="list-start"
107
+ class="article-pagination"
108
+ >
109
+ <p class="result-count">
110
+ Viewing article {{ counter }}
111
+ {{ counter === cards.length ? '' : '-' }}
112
+ {{
113
+ counter === cards.length
114
+ ? ''
115
+ : counter2 <= cards.length
116
+ ? counter2
117
+ : cards.length
118
+ }}
119
+ of {{ cards.length }}.
120
+ </p>
121
+ <div class="page-selector">
122
+ <div class="prev-next">
123
+ <asd20-button
124
+ @click.native="prevSet()"
125
+ class="load-more"
126
+ icon="chevron"
127
+ label="Prev"
128
+ :iconAngle="-90"
129
+ size="md"
130
+ horizontal
131
+ transparent
132
+ centered
133
+ opposite
134
+ />
135
+ <p>
136
+ Page {{ Math.ceil(counter2 / numberToShow) }} of
137
+ {{ Math.ceil(cards.length / numberToShow) }}
138
+ </p>
139
+ <asd20-button
140
+ @click.native="nextSet()"
141
+ class="load-more"
142
+ icon="chevron"
143
+ label="Next"
144
+ :iconAngle="90"
145
+ size="md"
146
+ horizontal
147
+ transparent
148
+ centered
149
+ />
150
+ </div>
151
+ </div>
152
+ </div>
153
+ <div class="feed-items">
154
+ <asd20-card
155
+ v-for="(card, index) in cards.slice(counter - 1, counter2)"
156
+ :key="index"
157
+ v-bind="card"
158
+ zoom
159
+ ></asd20-card>
160
+ </div>
161
+ <div v-if="cards.length > numberToShow" class="article-pagination">
162
+ <p class="result-count">
163
+ Viewing article {{ counter }}
164
+ {{ counter === cards.length ? '' : '-' }}
165
+ {{
166
+ counter === cards.length
167
+ ? ''
168
+ : counter2 <= cards.length
169
+ ? counter2
170
+ : cards.length
171
+ }}
172
+ of {{ cards.length }}.
173
+ </p>
174
+ <div class="page-selector">
175
+ <div class="prev-next">
176
+ <a href="#list-start">
177
+ <asd20-button
178
+ @click.native="prevSet()"
179
+ class="load-more"
180
+ icon="chevron"
181
+ label="Prev"
182
+ :iconAngle="-90"
183
+ size="md"
184
+ horizontal
185
+ transparent
186
+ centered
187
+ opposite
188
+ />
189
+ </a>
190
+ <p>
191
+ Page {{ Math.ceil(counter2 / numberToShow) }} of
192
+ {{ Math.ceil(cards.length / numberToShow) }}
193
+ </p>
194
+ <a href="#list-start">
195
+ <asd20-button
196
+ @click.native="nextSet()"
197
+ class="load-more"
198
+ icon="chevron"
199
+ label="Next"
200
+ :iconAngle="90"
201
+ size="md"
202
+ horizontal
203
+ transparent
204
+ centered
205
+ />
206
+ </a>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+ </intersect>
213
+
214
+ <asd20-media-section
215
+ v-if="combinedMessageImages.length > 1 || combinedMessageVideos.length"
216
+ :images="this.combinedMessageImages || []"
217
+ :videos="this.combinedMessageVideos || []"
218
+ >
219
+ </asd20-media-section>
220
+
221
+ <!-- Bottom Widgets -->
222
+ <asd20-widgets-section
223
+ v-if="widgetsSectionProps.footer || $slots.widgets"
224
+ v-bind="{ ...widgetsSectionProps.footer, ...widgetsSectionProps.sidebar }"
225
+ @events-in-view="$emit('events-in-view')"
226
+ @files-in-view="$emit('files-in-view')"
227
+ @people-in-view="$emit('people-in-view')"
228
+ full
229
+ ><slot name="widgets"
230
+ /></asd20-widgets-section>
231
+
232
+ <!-- Feeds -->
233
+ <asd20-feeds-section
234
+ :announcements="announcements"
235
+ :announcements-feed-props="announcementsFeedProps"
236
+ @announcements-in-view="$emit('announcements-in-view')"
237
+ ></asd20-feeds-section>
238
+
239
+ <!-- Quick Links -->
240
+ <asd20-quicklinks-menu slot="before-footer" :quick-links="quickLinks">
241
+ <slot name="quicklinks-menu" />
242
+ </asd20-quicklinks-menu>
243
+
244
+ <!-- Footer -->
245
+ <asd20-page-footer
246
+ :organization="organization"
247
+ :socialLinks="socialLinks"
248
+ :disclosureLinks="disclosureLinks"
249
+ :websiteLogoProps="websiteLogoProps"
250
+ >
251
+ <slot name="page-footer" />
252
+ </asd20-page-footer>
253
+ </div>
254
+ </template>
255
+
256
+ <script>
257
+ // Components
258
+ import Asd20SkipTo from '../../../components/atoms/Asd20SkipTo'
259
+ import Asd20PageHeader from '../../../components/organisms/Asd20PageHeader'
260
+
261
+ import Asd20SiteNavigation from '../../../components/organisms/Asd20SiteNavigation'
262
+ import Asd20PageContent from '../../../components/organisms/Asd20PageContent'
263
+
264
+ import Asd20WidgetsSection from '../../../components/organisms/Asd20WidgetsSection'
265
+ import Asd20FeedsSection from '../../../components/organisms/Asd20FeedsSection'
266
+ import Asd20MediaSection from '../../../components/organisms/Asd20MediaSection'
267
+
268
+ import Asd20PageFooter from '../../../components/organisms/Asd20PageFooter'
269
+ import Asd20QuicklinksMenu from '../../../components/organisms/Asd20QuicklinksMenu'
270
+ import Asd20NotificationGroup from '@asd20/notifications-ui/src/components/Asd20NotificationGroup'
271
+
272
+ import Asd20SearchField from '../../../components/molecules/Asd20SearchField'
273
+ import Asd20MultiselectInput from '../../../components/atoms/Asd20MultiselectInput'
274
+ import Asd20Card from '../../../components/molecules/Asd20Card'
275
+ import Asd20Button from '../../../components/atoms/Asd20Button'
276
+
277
+ import Intersect from 'vue-intersect'
278
+
279
+ // Mixins
280
+ import pageTemplateMixin from '../../../mixins/pageTemplateMixin'
281
+
282
+ // Helpers
283
+ import mapMessageToCard from '../../../helpers/mapMessageToCard'
284
+
285
+ export default {
286
+ name: 'ClubsTemplate',
287
+ mixins: [pageTemplateMixin],
288
+ components: {
289
+ Asd20PageContent,
290
+ Asd20SkipTo,
291
+ Asd20PageHeader,
292
+ Asd20PageFooter,
293
+ Asd20SiteNavigation,
294
+ Asd20WidgetsSection,
295
+ Asd20FeedsSection,
296
+ Asd20NotificationGroup,
297
+ Asd20QuicklinksMenu,
298
+ Asd20SearchField,
299
+ Asd20MultiselectInput,
300
+ Asd20Card,
301
+ Asd20Button,
302
+ Intersect,
303
+ Asd20MediaSection,
304
+ },
305
+
306
+ props: {
307
+ keywords: { type: String, default: '' },
308
+ selectedCategories: { type: Array, default: () => [] },
309
+ // categoryOptions: { type: Array, default: () => [] },
310
+ },
311
+ data: function() {
312
+ return {
313
+ numberToShow: 25,
314
+ counter: 1,
315
+ counter2: 25,
316
+ }
317
+ },
318
+ computed: {
319
+ cards() {
320
+ if (!Array.isArray(this.stories)) return []
321
+ return this.stories
322
+ .map(s =>
323
+ mapMessageToCard(s, {
324
+ // reversed: true,
325
+ date: '',
326
+ time: '',
327
+ // description: '',
328
+ // image: '',
329
+ pinned: false,
330
+ })
331
+ )
332
+ .sort((a, b) => (a.title > b.title ? 1 : b.title > a.title ? -1 : 0))
333
+ // .map(c => ({
334
+ // ...c,
335
+ // link: c.link.replace('/stories', '/announcements'),
336
+ // }))
337
+ },
338
+ categoryOptions() {
339
+ // get a unique array of categories with duplicates removed
340
+ return [
341
+ ...new Set(
342
+ this.cards.reduce((a, c) => a.concat(c.categories || []), []).sort()
343
+ ),
344
+ ]
345
+ },
346
+ // computedCategoryOptions() {
347
+ // // get a unique array of categories with duplicates removed
348
+ // if (this.categoryOptions.length === 0) {
349
+ // return [
350
+ // ...new Set(
351
+ // this.cards.reduce((a, c) => a.concat(c.categories || []), []).sort()
352
+ // ),
353
+ // ]
354
+ // }
355
+ // return this.categoryOptions
356
+ // },
357
+ },
358
+ watch: {
359
+ selectedCategories: function(newVal, oldVal) {
360
+ if (newVal !== oldVal) {
361
+ this.reset()
362
+ }
363
+ },
364
+ },
365
+ methods: {
366
+ nextSet() {
367
+ if (
368
+ Math.ceil(this.counter2 / this.numberToShow) <
369
+ Math.ceil(this.cards.length / this.numberToShow)
370
+ ) {
371
+ this.counter = this.counter + this.numberToShow
372
+ this.counter2 = this.counter2 + this.numberToShow
373
+ this.$emit('announcements-in-view')
374
+ }
375
+ },
376
+ prevSet() {
377
+ if (Math.ceil(this.counter2 / this.numberToShow) > 1) {
378
+ this.counter = this.counter - this.numberToShow
379
+ this.counter2 = this.counter2 - this.numberToShow
380
+ this.$emit('announcements-in-view')
381
+ }
382
+ },
383
+ reset() {
384
+ this.counter = 1
385
+ this.counter2 = 25
386
+ this.$emit('announcements-in-view')
387
+ },
388
+ },
389
+ }
390
+ </script>
391
+
392
+ <style lang="scss">
393
+ @import '../../../design/_variables.scss';
394
+ @import '../../../design/_mixins.scss';
395
+ @import '../../../design/_typography.scss';
396
+ @import '../../../design/_template.scss';
397
+ @import '../../../design/_print.scss';
398
+ @import '../../../design/tokens.css';
399
+
400
+ .asd20-template-clubs {
401
+ @include typography;
402
+ @include template;
403
+ display: flex;
404
+ flex-direction: column;
405
+ flex-grow: 1;
406
+ flex-shrink: 0;
407
+ overflow: hidden;
408
+ margin-top: space(2.25);
409
+ .asd20-notification-group--floating {
410
+ position: absolute;
411
+ top: space(2.0375);
412
+ // .bell {
413
+ // box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.125) !important;
414
+ // svg {
415
+ // fill: var(--color__accent) !important;
416
+ // }
417
+ // span {
418
+ // background: var(--color__accent) !important;
419
+ // top: inherit !important;
420
+ // right: inherit !important;
421
+ // width: 1.2rem !important;
422
+ // height: 1.2rem !important;
423
+ // font-size: 0.75rem !important;
424
+ // }
425
+ // }
426
+ }
427
+ .feed-title {
428
+ margin: space(1) 0 0 space(1);
429
+ }
430
+ .asd20-card {
431
+ margin-bottom: space(0.5);
432
+ // &__date-time {
433
+ // display: none;
434
+ // }
435
+ // &__description {
436
+ // display: none;
437
+ // }
438
+ }
439
+ .article-pagination {
440
+ display: flex;
441
+ align-items: center;
442
+ justify-content: space-between;
443
+ margin: space(1) space(0.25) space(0) space(0.25);
444
+ flex-direction: column;
445
+ p {
446
+ margin: 0;
447
+ }
448
+ .page-selector {
449
+ display: flex;
450
+ align-items: center;
451
+ .prev-next {
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: space-between;
455
+ a {
456
+ text-decoration: none !important;
457
+ }
458
+ .asd20-button {
459
+ padding: 0;
460
+ > .asd20-button__label {
461
+ margin: 0;
462
+ }
463
+ }
464
+ p {
465
+ margin: 0;
466
+ }
467
+ }
468
+ }
469
+ }
470
+ .notification-group--inline {
471
+ margin: space(2) space(1) space(1) space(1);
472
+ }
473
+ .search-header,
474
+ .result-count {
475
+ margin: space(0) space(1) space(1) space(1);
476
+ }
477
+
478
+ .asd20-search-field .asd20-icon {
479
+ margin-left: 0;
480
+ }
481
+ }
482
+
483
+ @media (min-width: 1024px) {
484
+ .asd20-template-clubs {
485
+ @include template-desktop;
486
+ margin-left: space(3);
487
+ margin-top: 0;
488
+ .asd20-notification-group--floating {
489
+ position: absolute;
490
+ top: space(1);
491
+ // .bell {
492
+ // span {
493
+ // background: var(--color__accent);
494
+ // top: -0.6em !important;
495
+ // right: -0.6em !important;
496
+ // }
497
+ // }
498
+ }
499
+ .feed-title {
500
+ margin-left: 0;
501
+ }
502
+
503
+ .asd20-page-content {
504
+ margin-top: space(1);
505
+ display: flex;
506
+ justify-content: space-between;
507
+ align-items: stretch;
508
+ flex-wrap: wrap;
509
+ }
510
+ .notification-group--inline {
511
+ margin: space(2) space(3) space(1) space(3);
512
+ flex-basis: 100%;
513
+ }
514
+ .prev-next {
515
+ margin: space(1) 0;
516
+ }
517
+ .primary-messaging-section {
518
+ max-width: 100vw;
519
+ }
520
+ .feed-items {
521
+ display: grid;
522
+ grid-template-columns: 1fr 1fr 1fr;
523
+ grid-gap: space(1);
524
+ margin-bottom: space(1);
525
+ .asd20-card {
526
+ margin-bottom: 0;
527
+ }
528
+ }
529
+ .search-header,
530
+ .result-count {
531
+ margin: space(0) space(0) space(1) space(0);
532
+ }
533
+ .search-header {
534
+ display: flex;
535
+ flex-basis: 100%;
536
+ justify-content: space-between;
537
+ }
538
+ .article-pagination {
539
+ flex-direction: row;
540
+ }
541
+ .article-digest {
542
+ // flex-basis: 100%;
543
+ margin: space(1) space(3) space(1) space(3);
544
+ }
545
+ }
546
+ }
547
+ </style>