33 class =" inner-calendar-container card bg-secondary"
44 :class =" expanded ? 'expanded' : 'minified'"
55 ref =" container" >
6- <div class =" flex between p-medium" >
6+ <div class =" flex between p-medium pb-small " >
77 <h2 class =" type-large color-text mb-none" >
88 Events
99 </h2 >
1414 <filter-icon :color =" filtersOpen ? 'theme' : 'text'" class =" ml-2xsmall block" size =" 1rem" />
1515 </button >
1616 </div >
17- <div class =" px-medium type-small" >
17+ <div class =" px-medium type-small mb-small " >
1818 <i >Includes unofficial events</i >
1919 </div >
2020 <div v-if =" filtersOpen" class =" p-medium" >
4545 <input type =" checkbox" id =" official" v-model =" show.officialOnly" />
4646 <label for =" official" class =" ml-2xsmall" >Show only official events</label >
4747 </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 >
4852 </div >
4953 <!-- <div class="px-medium pb-small border-bottom-bg">
5054 <input placeholder="Search by name, date, location..." class="search" />
5458 </h3 >
5559 <template v-else >
5660 <article
57- v-for =" (event, i) in filteredEvents "
61+ v-for =" (event, i) in shownItems "
5862 :key =" event.id"
5963 :ref =" `article-${i}`"
60- class =" px-medium py-small border-bottom-bg " >
64+ class =" px-medium py-small" >
6165 <div class =" badge" >
6266 {{ event.eventType }}
6367 </div >
6771 {{ event.eventName }}
6872 </span >
6973 </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 >
92115 </article >
93116 </template >
94117 <button v-if =" !expanded" class =" expand color-text" @click =" expand($event.target.parentElement)" >
@@ -112,7 +135,8 @@ export default {
112135 Conference: true ,
113136 Workshop: true ,
114137 ' Meet-up' : true ,
115- Tutorial: true
138+ Tutorial: true ,
139+ CFP : false
116140 },
117141 past: false ,
118142 officialOnly: false
@@ -138,17 +162,24 @@ export default {
138162 const index = getMonth (this .selectedDate )
139163 return monthNames[index]
140164 },
141- filteredEvents () {
142- const filtered = this .events
165+ shownItems () {
166+ const events = this .events
143167 .filter (({ eventType, date }) => {
168+ if (! this .show .past && isPast (new Date (date))) return false
144169 if (! this .show .types .Conference && eventType === ' Conference' ) return false
145170 if (! this .show .types [' Meet-up' ] && eventType === ' Meet-up' ) return false
146171 if (! this .show .types .Workshop && eventType === ' Workshop' ) return false
147172 if (! this .show .types .Tutorial && eventType === ' Tutorial' ) return false
148- if (! this .show .past && isPast (new Date (date))) return false
149173 return true
150174 })
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
152183 }
153184 },
154185 async mounted () {
@@ -161,6 +192,7 @@ export default {
161192 })
162193 },
163194 methods: {
195+ isPast,
164196 parseDescription : (t ) => marked .parse (t),
165197 getDateString (date , dateEnd ) {
166198 const monthIndex = getMonth (date)
0 commit comments