3
3
class =" inner-calendar-container card bg-secondary"
4
4
:class =" expanded ? 'expanded' : 'minified'"
5
5
ref =" container" >
6
- <div class =" flex between p-medium" >
6
+ <div class =" flex between p-medium pb-small " >
7
7
<h2 class =" type-large color-text mb-none" >
8
8
Events
9
9
</h2 >
14
14
<filter-icon :color =" filtersOpen ? 'theme' : 'text'" class =" ml-2xsmall block" size =" 1rem" />
15
15
</button >
16
16
</div >
17
- <div class =" px-medium type-small" >
17
+ <div class =" px-medium type-small mb-small " >
18
18
<i >Includes unofficial events</i >
19
19
</div >
20
20
<div v-if =" filtersOpen" class =" p-medium" >
45
45
<input type =" checkbox" id =" official" v-model =" show.officialOnly" />
46
46
<label for =" official" class =" ml-2xsmall" >Show only official events</label >
47
47
</div >
48
+ <div class =" flex middle col-sm-12" >
49
+ <input type =" checkbox" id =" CFP" v-model =" show.types.CFP" />
50
+ <label for =" CFP" class =" ml-2xsmall" >List CFPs</label >
51
+ </div >
48
52
</div >
49
53
<!-- <div class="px-medium pb-small border-bottom-bg">
50
54
<input placeholder="Search by name, date, location..." class="search" />
54
58
</h3 >
55
59
<template v-else >
56
60
<article
57
- v-for =" (event, i) in filteredEvents "
61
+ v-for =" (event, i) in shownItems "
58
62
:key =" event.id"
59
63
:ref =" `article-${i}`"
60
- class =" px-medium py-small border-bottom-bg " >
64
+ class =" px-medium py-small" >
61
65
<div class =" badge" >
62
66
{{ event.eventType }}
63
67
</div >
67
71
{{ event.eventName }}
68
72
</span >
69
73
</a >
70
- <div class =" flex middle" >
71
- <calendar-icon size =" 1rem" color =" white" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
72
- {{ getDateString(new Date(event.date), new Date(event.dateEnd)) }}
73
- </div >
74
- <div v-if =" event.location && event.location.trim() !== ''" class =" flex" >
75
- <marker-icon class =" mr-2xsmall" size =" 1rem" style =" transform : translateY (3px )" />
76
- {{ event.location }}
77
- </div >
78
- <div v-if =" event.online" class =" flex middle" >
79
- <globe-icon class =" mr-2xsmall" size =" 0.85rem" style =" transform : translateY (-1px )" />
80
- Available Online
81
- </div >
82
- <div v-if =" event.hostedByFoundation" class =" flex middle" >
83
- <robot-icon size =" 1rem" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
84
- Hosted by Foundation
85
- </div >
86
- <details v-if =" event.description && event.description.trim() !== ''" >
87
- <summary class =" color-link cursor-pointer flex middle" @click =" showInfo($event.target.parentElement)" >
88
- <chevron-icon color =" theme" direction =" right" class =" chevron" size =" 1.25rem" />
89
- </summary >
90
- <div v-html =" parseDescription(event.description || '')" class =" description" />
91
- </details >
74
+ <template v-if =" event .eventType !== ' CFP' " >
75
+ <div class =" flex middle" >
76
+ <calendar-icon size =" 1rem" color =" white" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
77
+ {{ getDateString(new Date(event.date), new Date(event.dateEnd)) }}
78
+ </div >
79
+ <div v-if =" event.location && event.location.trim() !== ''" class =" flex" >
80
+ <marker-icon class =" mr-2xsmall" size =" 1rem" style =" transform : translateY (3px )" />
81
+ {{ event.location }}
82
+ </div >
83
+ <div v-if =" event.online" class =" flex middle" >
84
+ <globe-icon class =" mr-2xsmall" size =" 0.85rem" style =" transform : translateY (-1px )" />
85
+ Available Online
86
+ </div >
87
+ <div v-if =" event.hostedByFoundation" class =" flex middle" >
88
+ <robot-icon size =" 1rem" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
89
+ Hosted by Foundation
90
+ </div >
91
+ <details v-if =" event.description && event.description.trim() !== ''" >
92
+ <summary class =" color-link cursor-pointer flex middle" @click =" showInfo($event.target.parentElement)" >
93
+ <chevron-icon color =" theme" direction =" right" class =" chevron" size =" 1.25rem" />
94
+ </summary >
95
+ <div v-html =" parseDescription(event.description || '')" class =" description" />
96
+ </details >
97
+ </template >
98
+ <template v-else >
99
+ <div v-if =" !isPast(new Date(event.cfpStart))" class =" flex middle" >
100
+ <calendar-icon size =" 1rem" color =" white" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
101
+ CFP start: {{ getDateString(new Date(event.cfpStart)) }}
102
+ </div >
103
+ <div class =" flex middle" >
104
+ <calendar-icon size =" 1rem" color =" white" class =" mr-2xsmall" style =" transform : translateY (-2px )" />
105
+ CFP end: {{ getDateString(new Date(event.cfpEnd)) }}
106
+ </div >
107
+ </template >
108
+ </article >
109
+ <article class =" px-medium py-small flex center mb-medium" >
110
+ <a href =" https://forms.gle/1YnMYwySGtBc5BQn7" class =" color-black type-no-underline" >
111
+ <button class =" theme block" >
112
+ + Add event
113
+ </button >
114
+ </a >
92
115
</article >
93
116
</template >
94
117
<button v-if =" !expanded" class =" expand color-text" @click =" expand($event.target.parentElement)" >
@@ -112,7 +135,8 @@ export default {
112
135
Conference: true ,
113
136
Workshop: true ,
114
137
' Meet-up' : true ,
115
- Tutorial: true
138
+ Tutorial: true ,
139
+ CFP : false
116
140
},
117
141
past: false ,
118
142
officialOnly: false
@@ -138,17 +162,24 @@ export default {
138
162
const index = getMonth (this .selectedDate )
139
163
return monthNames[index]
140
164
},
141
- filteredEvents () {
142
- const filtered = this .events
165
+ shownItems () {
166
+ const events = this .events
143
167
.filter (({ eventType, date }) => {
168
+ if (! this .show .past && isPast (new Date (date))) return false
144
169
if (! this .show .types .Conference && eventType === ' Conference' ) return false
145
170
if (! this .show .types [' Meet-up' ] && eventType === ' Meet-up' ) return false
146
171
if (! this .show .types .Workshop && eventType === ' Workshop' ) return false
147
172
if (! this .show .types .Tutorial && eventType === ' Tutorial' ) return false
148
- if (! this .show .past && isPast (new Date (date))) return false
149
173
return true
150
174
})
151
- return filtered
175
+ const cfps = this .events
176
+ .filter (({ cfpEnd }) => cfpEnd && ! isPast (new Date (cfpEnd)))
177
+ .map ((event ) => ({
178
+ ... event ,
179
+ eventType: ' CFP'
180
+ }))
181
+ if (this .show .types .CFP ) return [... cfps, ... events]
182
+ return events
152
183
}
153
184
},
154
185
async mounted () {
@@ -161,6 +192,7 @@ export default {
161
192
})
162
193
},
163
194
methods: {
195
+ isPast,
164
196
parseDescription : (t ) => marked .parse (t),
165
197
getDateString (date , dateEnd ) {
166
198
const monthIndex = getMonth (date)
0 commit comments