Skip to content

Commit f044cb3

Browse files
committed
Archives: test implementation of board meeting archives & discussions
1 parent 86fb95c commit f044cb3

File tree

4 files changed

+304
-3
lines changed

4 files changed

+304
-3
lines changed

src/components/cveRecordSearchModule.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
aria-labelledby="alertIcon" aria-hidden="false" />
6363
<ul class="pl-4" style="list-style: square">
6464
<li v-for="errorMsg in errorMessageStore.errorMessage"
65-
class="cve-help-text" v-html="errorMsg"></li>
65+
:key="errorMsg" class="cve-help-text" v-html="errorMsg"></li>
6666
</ul>
6767
</div>
6868
</div>

src/router/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import PartnerDetails from '@/views/PartnerInformation/PartnerDetails.vue';
1111
import Structure from '@/views/ProgramOrganization/Structure.vue';
1212
import ProgramRelationshipwithPartners from '@/views/ProgramOrganization/ProgramRelationshipwithPartners.vue';
1313
import Board from '@/views/ProgramOrganization/Board.vue';
14+
import BoardArchives from '@/views/ProgramOrganization/Archives.vue';
1415
import WorkingGroups from '@/views/ProgramOrganization/WorkingGroups.vue';
1516
import CNAs from '@/views/ProgramOrganization/CNAs.vue';
1617
import ADPs from '@/views/ProgramOrganization/ADPs.vue';
@@ -158,6 +159,14 @@ const router = createRouter({
158159
title: 'Board | CVE',
159160
},
160161
},
162+
{
163+
path: '/ProgramOrganization/BoardArchives',
164+
name: 'BoardArchives',
165+
component: BoardArchives,
166+
meta: {
167+
title: 'Board | CVE',
168+
},
169+
},
161170
{
162171
path: '/ProgramOrganization/WorkingGroups',
163172
name: 'WorkingGroups',
Lines changed: 292 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,292 @@
1+
<template>
2+
<div id="cve-secondary-page-main-container">
3+
<div class="columns is-centered">
4+
<div class="column is-8-desktop cve-main-column-content-width is-12-tablet">
5+
<main id="cve-main-page-content" role="main">
6+
<div class="content">
7+
<h1>Board Meetings & Discussion List Archives</h1>
8+
<div>
9+
<h2>Board Meeting Summaries Archive</h2>
10+
<p>The CVE Board regularly holds teleconferences,
11+
and periodically holds face-to-face meetings.
12+
Below are summaries of the Board meetings.
13+
</p>
14+
<div v-for="year of Object.keys(meetingData).sort().reverse()"
15+
:key="year">
16+
<button class="button cve-button cve-button-base-color"
17+
@click="toggleYearList(year, yearFlags.expandYear)">
18+
{{ year }}
19+
</button>
20+
<Transition name="fade">
21+
<ul v-show="expandYear === year">
22+
<li v-for="item of meetingData[year]" :key="item.name">
23+
<div v-if="item.path.length">
24+
<a :href="archivePath + '/' + item.path">{{ item.name }}
25+
</a>
26+
</div>
27+
<span v-else>
28+
{{ item.name }}
29+
</span>
30+
</li>
31+
</ul>
32+
</Transition>
33+
<br>
34+
</div>
35+
<br>
36+
</div>
37+
<div>
38+
<h2>Board Email Discussion List Archive</h2>
39+
<p>
40+
The CVE Board has made a commitment to make its discussions
41+
available to the public. The following archives of Board
42+
messages are available:
43+
</p>
44+
<form>
45+
<div class="radios">
46+
<span>Traverse discussions </span>
47+
<label class="radio">
48+
<input id="date" type="radio" name="discTraverse"
49+
v-model="traverse" value="date" checked />
50+
By Date
51+
</label>
52+
<label class="radio">
53+
<input id="thread" type="radio" name="discTraverse"
54+
v-model="traverse" value="thread" />
55+
By Thread
56+
</label>
57+
</div>
58+
</form>
59+
<br>
60+
<div v-for="year of discussionYears" :key="year">
61+
<button class="button cve-button cve-button-base-color"
62+
@click="toggleYearList(year, yearFlags.discYear)">
63+
{{ year }}
64+
</button>
65+
<Transition name="fade">
66+
<ul v-show="discYear === year">
67+
<li v-for="item of discussionData[year]" :key="item.month">
68+
<a :href="discussionURL(item)">{{ item.month }}</a>
69+
</li>
70+
</ul>
71+
</Transition>
72+
<br>
73+
</div>
74+
</div>
75+
</div>
76+
</main>
77+
</div>
78+
</div>
79+
</div>
80+
</template>
81+
82+
<script setup>
83+
import meetingData from '@/assets/data/boardMeetings.json';
84+
import {ref} from 'vue';
85+
86+
const archivePath = window.location.host + '/Resources/Media/Archives/Meetings'
87+
88+
const discussionDirs = [
89+
'1999-05',
90+
'1999-06',
91+
'1999-07',
92+
'1999-08',
93+
'1999-09',
94+
'1999-10',
95+
'1999-11',
96+
'1999-12',
97+
'2000-01',
98+
'2000-02',
99+
'2000-03',
100+
'2000-04',
101+
'2000-05',
102+
'2000-06',
103+
'2000-07',
104+
'2000-08',
105+
'2000-09',
106+
'2000-10',
107+
'2000-11',
108+
'2000-12',
109+
'2001-01',
110+
'2001-02',
111+
'2001-03',
112+
'2001-04',
113+
'2001-05',
114+
'2001-06',
115+
'2001-07',
116+
'2001-08',
117+
'2001-09',
118+
'2001-10',
119+
'2001-11',
120+
'2001-12',
121+
'2002-01',
122+
'2002-02',
123+
'2002-03',
124+
'2002-05',
125+
'2002-06',
126+
'2002-07',
127+
'2002-08',
128+
'2002-10',
129+
'2003-03',
130+
'2003-04',
131+
'2003-07',
132+
'2004-03',
133+
'2004-08',
134+
'2004-09',
135+
'2005-12',
136+
'2006-06',
137+
'2006-08',
138+
'2006-09',
139+
'2006-10',
140+
'2007-01',
141+
'2007-05',
142+
'2011-09',
143+
'2011-10',
144+
'2011-11',
145+
'2011-12',
146+
'2012-01',
147+
'2012-03',
148+
'2012-05',
149+
'2012-06',
150+
'2012-07',
151+
'2012-09',
152+
'2012-10',
153+
'2012-11',
154+
'2012-12',
155+
'2013-01',
156+
'2013-02',
157+
'2013-03',
158+
'2013-04',
159+
'2013-05',
160+
'2013-06',
161+
'2013-11',
162+
'2014-01',
163+
'2014-04',
164+
'2014-05',
165+
'2014-09',
166+
'2014-10',
167+
'2014-11',
168+
'2015-01',
169+
'2015-03',
170+
'2015-04',
171+
'2015-05',
172+
'2015-06',
173+
'2015-07',
174+
'2015-08',
175+
'2015-09',
176+
'2015-10',
177+
'2015-11',
178+
'2015-12',
179+
'2016-01',
180+
'2016-02',
181+
'2016-03',
182+
'2016-04',
183+
'2016-05',
184+
'2016-06',
185+
'2016-07',
186+
'2016-08',
187+
'2016-09',
188+
'2016-10',
189+
'2016-11',
190+
'2016-12',
191+
'2017-01',
192+
'2017-02',
193+
'2017-03',
194+
'2017-04',
195+
'2017-05',
196+
'2017-06',
197+
'2017-07',
198+
'2017-08',
199+
'2017-09',
200+
'2017-10',
201+
'2017-11',
202+
'2017-12',
203+
'2018-01',
204+
'2018-02',
205+
'2018-03',
206+
'2018-04',
207+
'2018-05',
208+
'2018-06',
209+
'2018-07',
210+
'2018-08',
211+
'2018-09',
212+
'2018-10',
213+
'2018-11',
214+
'2018-12',
215+
'2019-01'];
216+
217+
const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
218+
'August', 'September', 'October', 'November', 'December'];
219+
220+
const discYear = ref();
221+
const expandYear = ref();
222+
223+
const yearFlags = {
224+
// This construct is used to be able to pass the refs to the toggleYearList().
225+
// A ref is unwrapped if passed directly, but isn't if it's included in an
226+
// object (https://github.com/vuejs/composition-api/issues/605).
227+
228+
discYear: discYear,
229+
expandYear: expandYear
230+
}
231+
232+
const traverse = ref('date');
233+
234+
function toggleYearList(year, variable) {
235+
236+
console.log(variable.value);
237+
variable.value = variable.value === year ? null : year;
238+
}
239+
240+
function defaultDict(createValue) {
241+
return new Proxy(Object.create(null), {
242+
get(target, property) {
243+
if (!(property in target))
244+
target[property] = createValue(property);
245+
return target[property];
246+
}
247+
});
248+
}
249+
250+
function discussionURL(item) {
251+
const url = archivePath + '/' + item.month + '/'
252+
+ (traverse.value == 'date' ? 'maillist.html' : 'threads.html');
253+
254+
return url;
255+
}
256+
257+
function parseDiscussionDates(discussionData) {
258+
259+
for (let monthDir of discussionDirs.sort().reverse()) {
260+
261+
const match = /(?<year>\d{4})-(?<month>\d{2})/.exec(monthDir);
262+
263+
const year = match.groups.year;
264+
const month = months[parseInt(match.groups.month, 10) - 1];
265+
266+
discussionData[year].push({month: month, dir: monthDir});
267+
}
268+
}
269+
270+
const discussionData = defaultDict(() => []);
271+
272+
parseDiscussionDates(discussionData);
273+
274+
const discussionYears = Object.keys(discussionData).sort().reverse();
275+
</script>
276+
277+
<style lang="scss">
278+
@import '../../assets/style/globals.scss';
279+
</style>
280+
281+
<!-- Add "scoped" attribute to limit CSS to this component only -->
282+
<style scoped lang="scss">
283+
284+
.fade-enter-active, .fade-leave-active {
285+
transition: opacity 0.5s;
286+
}
287+
288+
.fade-enter, .fade-leave-to {
289+
opacity: 0;
290+
}
291+
292+
</style>

src/views/ProgramOrganization/Board.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
</h3>
3131
<ul class="tile-body cve-task-tile-list">
3232
<li class="cve-task-tile-list-item">
33-
<a href="https://cve.mitre.org/community/board/archive.html#meeting_summaries" target="_blank">
33+
<router-link to="/ProgramOrganization/BoardArchives">
3434
Board Meeting Summaries
35-
</a>
35+
</router-link>
3636
</li>
3737
<li class="cve-task-tile-list-item">
3838
<a href="https://www.mail-archive.com/[email protected]/" target="_blank">

0 commit comments

Comments
 (0)