Skip to content

Commit 6f2114f

Browse files
NGPixelrjsparks
andauthored
feat: replace old agenda with agenda-neue (ietf-tools#4406)
* feat: remove old agenda (django-side) * fix: bring in latest commits * test: remove -neue from playwright tests * test: remove agenda selenium js tests * test: remove agenda views tests * fix: remove deprecated agenda views (week-view, agenda-by, floor-plan) * test: fix failing python tests * test: remove more deprecated tests * chore: remove deprecated templates * test: remove unused import * feat: handle agenda personalize with filter + move agenda specific stuff out of root component * fix: redirect deprecated urls to agenda / floorplan * feat: agenda - open picker mode when from personalize path * fix: safari doesn't support device-pixel-content-box property on ResizeObserver * test: move floor plan test into main agenda test Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
1 parent 8560bec commit 6f2114f

39 files changed

Lines changed: 286 additions & 3042 deletions

client/App.vue

Lines changed: 6 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<template lang="pug">
22
n-theme
33
n-message-provider
4-
.app-error(v-if='agendaStore.criticalError')
4+
.app-error(v-if='siteStore.criticalError')
55
i.bi.bi-x-octagon-fill.me-2
6-
span {{agendaStore.criticalError}}
6+
span {{siteStore.criticalError}}
77
.app-container(ref='appContainer')
88
router-view.meeting
99
</template>
@@ -12,13 +12,13 @@ n-theme
1212
import { onBeforeUnmount ,onMounted, ref } from 'vue'
1313
import { NMessageProvider } from 'naive-ui'
1414
15-
import { useAgendaStore } from './agenda/store'
15+
import { useSiteStore } from './shared/store'
1616
1717
import NTheme from './components/n-theme.vue'
1818
1919
// STORES
2020
21-
const agendaStore = useAgendaStore()
21+
const siteStore = useSiteStore()
2222
2323
// STATE
2424
@@ -29,14 +29,14 @@ const appContainer = ref(null)
2929
// --------------------------------------------------------------------
3030
3131
const resizeObserver = new ResizeObserver(entries => {
32-
agendaStore.$patch({ viewport: Math.round(window.innerWidth) })
32+
siteStore.$patch({ viewport: Math.round(window.innerWidth) })
3333
// for (const entry of entries) {
3434
// const newWidth = entry.contentBoxSize ? entry.contentBoxSize[0].inlineSize : entry.contentRect.width
3535
// }
3636
})
3737
3838
onMounted(() => {
39-
resizeObserver.observe(appContainer.value, { box: 'device-pixel-content-box' })
39+
resizeObserver.observe(appContainer.value)
4040
})
4141
4242
onBeforeUnmount(() => {
@@ -47,7 +47,6 @@ onBeforeUnmount(() => {
4747
<style lang="scss">
4848
@import "bootstrap/scss/functions";
4949
@import "bootstrap/scss/variables";
50-
@import "./shared/breakpoints";
5150
5251
.app-error {
5352
background-color: $red-500;
@@ -57,69 +56,4 @@ onBeforeUnmount(() => {
5756
padding: 1rem;
5857
text-align: center;
5958
}
60-
61-
.meeting {
62-
> h1 {
63-
font-weight: 500;
64-
color: $gray-700;
65-
display: flex;
66-
justify-content: space-between;
67-
align-items: center;
68-
69-
@media screen and (max-width: $bs5-break-sm) {
70-
justify-content: center;
71-
72-
> span {
73-
font-size: .95em;
74-
}
75-
}
76-
77-
strong {
78-
font-weight: 700;
79-
background: linear-gradient(220deg, $blue-500 20%, $purple-500 70%);
80-
background-clip: text;
81-
-webkit-background-clip: text;
82-
-webkit-text-fill-color: transparent;
83-
box-decoration-break: clone;
84-
}
85-
}
86-
87-
&-h1-badges {
88-
display: flex;
89-
justify-content: end;
90-
align-items: center;
91-
92-
> span {
93-
font-size: 13px;
94-
font-weight: 700;
95-
background-color: $pink-500;
96-
box-shadow: 0 0 5px 0 rgba($pink-500, .5);
97-
color: #FFF;
98-
padding: 5px 8px;
99-
border-radius: 6px;
100-
101-
& + span {
102-
margin-left: 10px;
103-
}
104-
}
105-
}
106-
107-
&-warning {
108-
background-color: $red-500 !important;
109-
box-shadow: 0 0 5px 0 rgba($red-500, .5) !important;
110-
color: #FFF;
111-
animation: warningBorderFlash 1s ease infinite;
112-
}
113-
114-
> h4 {
115-
@media screen and (max-width: $bs5-break-sm) {
116-
text-align: center;
117-
118-
> span {
119-
font-size: .8em;
120-
text-align: center;
121-
}
122-
}
123-
}
124-
}
12559
</style>

client/agenda/Agenda.vue

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
span #[strong IETF {{agendaStore.meeting.number}}] Meeting Agenda {{titleExtra}}
88
.meeting-h1-badges.d-none.d-sm-flex
99
span.meeting-warning(v-if='agendaStore.meeting.warningNote') {{agendaStore.meeting.warningNote}}
10-
span.meeting-beta BETA
1110
h4
1211
span {{agendaStore.meeting.city}}, {{ meetingDate }}
1312
h6.float-end.d-none.d-lg-inline(v-if='meetingUpdated') #[span.text-muted Updated:] {{ meetingUpdated }}
@@ -54,7 +53,7 @@
5453
@click='setTimezone(`UTC`)'
5554
) UTC
5655
n-select.agenda-timezone-ddn(
57-
v-if='agendaStore.viewport > 1250'
56+
v-if='siteStore.viewport > 1250'
5857
v-model:value='agendaStore.timezone'
5958
:options='timezones'
6059
placeholder='Select Time Zone'
@@ -134,7 +133,7 @@
134133
// -----------------------------------
135134
// -> Anchored Day Quick Access Menu
136135
// -----------------------------------
137-
.col-auto.d-print-none(v-if='agendaStore.viewport >= 990')
136+
.col-auto.d-print-none(v-if='siteStore.viewport >= 990')
138137
agenda-quick-access
139138

140139
agenda-mobile-bar
@@ -166,6 +165,9 @@ import MeetingNavigation from './MeetingNavigation.vue'
166165
import timezones from '../shared/timezones'
167166
168167
import { useAgendaStore } from './store'
168+
import { useSiteStore } from '../shared/store'
169+
170+
import './agenda.scss'
169171
170172
// MESSAGE PROVIDER
171173
@@ -174,6 +176,7 @@ const message = useMessage()
174176
// STORES
175177
176178
const agendaStore = useAgendaStore()
179+
const siteStore = useSiteStore()
177180
178181
// ROUTER
179182
@@ -215,7 +218,35 @@ watch(() => agendaStore.meetingDays, () => {
215218
})
216219
})
217220
218-
watch(() => agendaStore.isLoaded, handleCurrentMeetingRedirect)
221+
watch(() => agendaStore.isLoaded, () => {
222+
if (route.query.show) {
223+
// Handle legacy ?show= parameter
224+
const keywords = route.query.show.split(',').map(k => k.trim()).filter(k => !!k)
225+
if (keywords?.length > 0) {
226+
const pickedIds = []
227+
for (const ev of agendaStore.scheduleAdjusted) {
228+
if (keywords.includes(ev.sessionKeyword)) {
229+
pickedIds.push(ev.id)
230+
}
231+
}
232+
if (pickedIds.length > 0) {
233+
agendaStore.$patch({
234+
pickerMode: true,
235+
pickerModeView: true,
236+
pickedEvents: pickedIds
237+
})
238+
agendaStore.persistMeetingPreferences()
239+
}
240+
}
241+
}
242+
if (route.query.pick) {
243+
// Handle legacy /personalize path (open picker mode)
244+
agendaStore.$patch({ pickerMode: true })
245+
router.replace({ query: null })
246+
}
247+
248+
handleCurrentMeetingRedirect()
249+
})
219250
220251
// COMPUTED
221252

client/agenda/AgendaMobileBar.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template lang="pug">
2-
.agenda-mobile-bar(v-if='agendaStore.viewport < 990')
2+
.agenda-mobile-bar(v-if='siteStore.viewport < 990')
33
button(@click='agendaStore.$patch({ filterShown: true })')
44
i.bi.bi-filter-square-fill.me-2
55
span Filters
@@ -31,6 +31,7 @@ import {
3131
} from 'naive-ui'
3232
3333
import { useAgendaStore } from './store'
34+
import { useSiteStore } from '../shared/store';
3435
3536
// MESSAGE PROVIDER
3637
@@ -39,6 +40,7 @@ const message = useMessage()
3940
// STORES
4041
4142
const agendaStore = useAgendaStore()
43+
const siteStore = useSiteStore()
4244
4345
// Download Ics Options
4446

client/agenda/AgendaQuickAccess.vue

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108

109109
<script setup>
110110
import { computed, h } from 'vue'
111+
import { useRoute, useRouter } from 'vue-router'
111112
import { DateTime } from 'luxon'
112113
import {
113114
NAffix,
@@ -119,6 +120,7 @@ import {
119120
} from 'naive-ui'
120121
121122
import { useAgendaStore } from './store'
123+
import { useSiteStore } from '../shared/store';
122124
123125
// MESSAGE PROVIDER
124126
@@ -127,6 +129,12 @@ const message = useMessage()
127129
// STORES
128130
129131
const agendaStore = useAgendaStore()
132+
const siteStore = useSiteStore()
133+
134+
// ROUTER
135+
136+
const router = useRouter()
137+
const route = useRoute()
130138
131139
// Download Ics Options
132140
@@ -146,7 +154,7 @@ const downloadIcsOptions = [
146154
// COMPUTED
147155
148156
const shortMode = computed(() => {
149-
return agendaStore.viewport <= 1350
157+
return siteStore.viewport <= 1350
150158
})
151159
152160
// METHODS
@@ -163,6 +171,9 @@ function pickerModify () {
163171
}
164172
function pickerDiscard () {
165173
agendaStore.$patch({ pickerMode: false })
174+
if (route.query.show) {
175+
router.push({ query: null })
176+
}
166177
}
167178
168179
function downloadIcs (key) {

client/agenda/AgendaScheduleCalendar.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ n-drawer(v-model:show='isShown', placement='bottom', :height='state.drawerHeight
44
template(#header)
55
span Calendar View
66
.agenda-calendar-actions
7-
template(v-if='agendaStore.viewport > 990')
7+
template(v-if='siteStore.viewport > 990')
88
i.bi.bi-globe.me-2
99
small.me-2: strong Timezone:
1010
n-button-group
@@ -91,10 +91,12 @@ import bootstrap5Plugin from '@fullcalendar/bootstrap5'
9191
import AgendaDetailsModal from './AgendaDetailsModal.vue'
9292
9393
import { useAgendaStore } from './store'
94+
import { useSiteStore } from '../shared/store'
9495
9596
// STORES
9697
9798
const agendaStore = useAgendaStore()
99+
const siteStore = useSiteStore()
98100
99101
// STATE
100102

client/agenda/AgendaScheduleList.vue

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
th.agenda-table-head-check(v-if='pickerModeActive') &nbsp;
88
th.agenda-table-head-time Time
99
th.agenda-table-head-location(colspan='2') Location
10-
th.agenda-table-head-event(colspan='2') {{ agendaStore.viewport < 990 ? '' : 'Event' }}
10+
th.agenda-table-head-event(colspan='2') {{ siteStore.viewport < 990 ? '' : 'Event' }}
1111
tbody
1212
tr.agenda-table-display-noresult(
1313
v-if='!meetingEvents || meetingEvents.length < 1'
@@ -58,13 +58,13 @@
5858
span.badge {{item.location.short}}
5959
span {{item.location.name}}
6060
router-link.discreet(
61-
:to='`/meeting/` + agendaStore.meeting.number + `/floor-plan-neue?room=` + xslugify(item.room)'
61+
:to='`/meeting/` + agendaStore.meeting.number + `/floor-plan?room=` + xslugify(item.room)'
6262
:aria-label='item.room'
6363
) {{item.room}}
6464
span(v-else) {{item.room}}
6565
//- CELL - GROUP --------------------------
6666
td.agenda-table-cell-group(v-if='item.type === `regular`')
67-
span.badge(v-if='agendaStore.areaIndicatorsShown && agendaStore.viewport > 1200') {{item.groupAcronym}}
67+
span.badge(v-if='agendaStore.areaIndicatorsShown && siteStore.viewport > 1200') {{item.groupAcronym}}
6868
a.discreet(:href='`/group/` + item.acronym + `/about/`') {{item.acronym}}
6969
//- CELL - NAME ---------------------------
7070
td.agenda-table-cell-name
@@ -105,7 +105,7 @@
105105
template(v-else)
106106
span.badge.is-cancelled(v-if='!isMobile && item.status === `canceled`') Cancelled
107107
span.badge.is-rescheduled(v-else-if='!isMobile && item.status === `resched`') Rescheduled
108-
.agenda-table-cell-links-buttons(v-else-if='agendaStore.viewport < 1200 && item.links && item.links.length > 0')
108+
.agenda-table-cell-links-buttons(v-else-if='siteStore.viewport < 1200 && item.links && item.links.length > 0')
109109
n-dropdown(
110110
v-if='!agendaStore.colorPickerVisible'
111111
trigger='click'
@@ -201,6 +201,7 @@ import {
201201
import AgendaDetailsModal from './AgendaDetailsModal.vue'
202202
203203
import { useAgendaStore } from './store'
204+
import { useSiteStore } from '../shared/store'
204205
205206
// MESSAGE PROVIDER
206207
@@ -209,6 +210,7 @@ const message = useMessage()
209210
// STORES
210211
211212
const agendaStore = useAgendaStore()
213+
const siteStore = useSiteStore()
212214
213215
// DATA
214216
@@ -236,7 +238,7 @@ const meetingEvents = computed(() => {
236238
237239
return reduce(sortBy(agendaStore.scheduleAdjusted, 'adjustedStartDate'), (acc, item) => {
238240
const isLive = current >= item.adjustedStart && current < item.adjustedEnd
239-
const itemTimeSlot = agendaStore.viewport > 576 ?
241+
const itemTimeSlot = siteStore.viewport > 576 ?
240242
`${item.adjustedStart.toFormat('HH:mm')} - ${item.adjustedEnd.toFormat('HH:mm')}` :
241243
`${item.adjustedStart.toFormat('HH:mm')} ${item.adjustedEnd.toFormat('HH:mm')}`
242244
@@ -482,7 +484,7 @@ const pickedEvents = computed({
482484
})
483485
484486
const isMobile = computed(() => {
485-
return agendaStore.viewport < 576
487+
return siteStore.viewport < 576
486488
})
487489
488490
// METHODS

client/agenda/AgendaSettings.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ import {
198198
} from 'naive-ui'
199199
200200
import { useAgendaStore } from './store'
201+
import { useSiteStore } from '../shared/store'
202+
201203
import timezones from '../shared/timezones'
202204
203205
// MESSAGE PROVIDER
@@ -207,6 +209,7 @@ const message = useMessage()
207209
// STORES
208210
209211
const agendaStore = useAgendaStore()
212+
const siteStore = useSiteStore()
210213
211214
// STATE
212215
@@ -266,7 +269,7 @@ const calcOffset = computed(() => {
266269
return agendaStore.nowDebugDiff ? JSON.stringify(agendaStore.nowDebugDiff.toObject()) : 'None'
267270
})
268271
const panelWidth = computed(() => {
269-
return agendaStore.viewport > 500 ? 500 : agendaStore.viewport
272+
return siteStore.viewport > 500 ? 500 : siteStore.viewport
270273
})
271274
272275
// WATCHERS

0 commit comments

Comments
 (0)