@explorer-1/vue 0.2.35 → 0.2.37

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@explorer-1/vue",
3
- "version": "0.2.35",
3
+ "version": "0.2.37",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -18,6 +18,7 @@ const sizeMap: Attributes = {
18
18
  }
19
19
 
20
20
  interface BasePillProps {
21
+ text?: string
21
22
  variant?: string
22
23
  size?: string
23
24
  contentType?: string
@@ -44,14 +45,16 @@ const metadataAttrs = computed(() => {
44
45
  }
45
46
  return { variant: undefined, label: undefined }
46
47
  })
48
+ const theText = computed(() => {
49
+ return props.text || metadataAttrs.value.label
50
+ })
47
51
  </script>
48
52
  <template>
49
53
  <p
50
54
  :class="`${variantMap[metadataAttrs.variant || props.variant]} ${sizeMap[props.size]}`"
51
55
  class="ThemeVariantLight text-contrast-none inline-block text-white font-bold edu:font-extrabold rounded-full leading-tight m-0 uppercase print:border-none print:px-0"
52
56
  >
53
- <template v-if="metadataAttrs.label"> {{ metadataAttrs.label }} </template>
54
- <template v-else> <slot /></template>
57
+ {{ theText }}
55
58
  <span class="sr-only">.</span>
56
59
  </p>
57
60
  </template>
@@ -47,9 +47,8 @@
47
47
  :class="{ 'mb-2': !large, 'mb-4': large }"
48
48
  size="sm"
49
49
  :content-type="metadataType"
50
- >
51
- {{ (theItem as EventCardObject).eventType }}
52
- </BasePill>
50
+ :text="(theItem as EventCardObject).eventType"
51
+ />
53
52
  </template>
54
53
  <template
55
54
  v-else-if="themeStore.isEdu && theItem.parent?.title && theItem.parent?.title !== 'EDU'"
@@ -117,7 +116,7 @@
117
116
  <MetadataEvent
118
117
  v-if="metadataType === 'EDUEventPage'"
119
118
  :event="theItem"
120
- :show-time="false"
119
+ :show-time="large"
121
120
  :show-location="false"
122
121
  compact
123
122
  />
@@ -20,6 +20,7 @@ const props = withDefaults(defineProps<BlockLinkCardListProps>(), {
20
20
  :class="{ 'pt-3': index !== 0 }"
21
21
  :data="item"
22
22
  size="lg"
23
+ show-calendar-chip
23
24
  />
24
25
  </div>
25
26
  </template>
@@ -9,9 +9,8 @@
9
9
  :variant="pillColor"
10
10
  size="lg"
11
11
  class="mr-3"
12
- >
13
- {{ pillLabel }}
14
- </BasePill>
12
+ :text="pillLabel"
13
+ />
15
14
  </template>
16
15
  <template v-else>
17
16
  <div
@@ -40,9 +40,8 @@
40
40
  size="lg"
41
41
  class="mr-3"
42
42
  :content-type="customPillType"
43
- >
44
- {{ customPill }}
45
- </BasePill>
43
+ :text="customPill"
44
+ />
46
45
  <div
47
46
  v-else-if="label"
48
47
  class="font-secondary text-base font-semibold tracking-wider no-underline uppercase"
@@ -61,9 +61,8 @@
61
61
  size="sm"
62
62
  class="mr-3"
63
63
  :content-type="customPillType"
64
- >
65
- {{ customPill }}
66
- </BasePill>
64
+ :text="customPill"
65
+ />
67
66
  <p
68
67
  v-if="customLabel || feature.label"
69
68
  class="text-subtitle"
@@ -63,6 +63,8 @@
63
63
  <script lang="ts">
64
64
  // @ts-nocheck
65
65
  import isEqual from 'lodash/isEqual.js'
66
+ import { lookupContentType } from './../../utils/lookupContentType'
67
+
66
68
  export default {
67
69
  name: 'SearchFilterGroup',
68
70
  props: {
@@ -154,67 +156,8 @@ export default {
154
156
  }
155
157
  },
156
158
  prettyFilterNames(key) {
157
- if (key === 'news.News') {
158
- return 'News & Features'
159
- }
160
- if (key === 'home.HomePage') {
161
- return 'Homepage'
162
- }
163
- if (key === 'missions.Mission') {
164
- return 'Missions'
165
- }
166
- if (key === 'events.EventPage') {
167
- return 'Events'
168
- }
169
- if (key === 'image_detail.ImageDetailPage') {
170
- return 'Images'
171
- }
172
- if (key === 'audio_detail.AudioIndexPage') {
173
- return 'Audio Index'
174
- }
175
- if (key === 'audio_detail.AudioDetailPage') {
176
- return 'Audio'
177
- }
178
- if (key === 'infographics.InfographicsDetailPage') {
179
- return 'Infographics'
180
- }
181
- if (key === 'image_detail.CuratedGalleryPage') {
182
- return 'Curated Gallery'
183
- }
184
- if (key === 'topics.TopicPage') {
185
- return 'Topics'
186
- }
187
- if (key === 'asteroid_watch.AsteroidWatchIndexPage') {
188
- return 'Asteroid Watch Index'
189
- }
190
- if (key === 'asteroid_watch.AsteroidWatchContentPage') {
191
- return 'Asteroid Watch'
192
- }
193
- if (key === 'missions.MissionsIndexPage') {
194
- return 'Missions Index'
195
- }
196
- if (key === 'information_pages.ContentPage') {
197
- return 'Information pages'
198
- }
199
- if (key === 'robotics.RobotPage') {
200
- return 'Robots'
201
- }
202
- if (key === 'video_detail.VideoDetailPage') {
203
- return 'Video'
204
- }
205
- if (key === 'podcasts.PodcastPage') {
206
- return 'Podcasts'
207
- }
208
- if (key === 'go_pages.GoHomePage') {
209
- return 'Go Sites'
210
- }
211
- if (key === 'press_kits.PressKitHomePage') {
212
- return 'Press Kits'
213
- }
214
- if (key === 'profiles.ProfilePage') {
215
- return 'People'
216
- }
217
- return key
159
+ const name = lookupContentType(key, 'model', 'label')
160
+ return name ? name : key
218
161
  }
219
162
  }
220
163
  }
@@ -6,9 +6,7 @@
6
6
  size="lg"
7
7
  :data="{
8
8
  page: {
9
- __typename: pageContentType
10
- ? (searchContentTypeToPageType[pageContentType] as string)
11
- : undefined,
9
+ __typename: pageContentType ? getInterfaceFromEskey(pageContentType) : undefined,
12
10
  url,
13
11
  type,
14
12
  label: topic,
@@ -20,10 +18,13 @@
20
18
  startDate,
21
19
  endTime,
22
20
  endDate,
21
+ customDate,
23
22
  location,
24
- eventType: eventType
23
+ eventType: eventType,
24
+ ongoing
25
25
  }
26
26
  }"
27
+ show-calendar-chip
27
28
  />
28
29
  <EventCard
29
30
  v-else-if="isEvents"
@@ -218,7 +219,7 @@ import BaseImage from './../BaseImage/BaseImage.vue'
218
219
  import BaseImagePlaceholder from './../BaseImagePlaceholder/BaseImagePlaceholder.vue'
219
220
  import EventCard from './../EventCard/EventCard.vue'
220
221
  import BlockLinkCard from './../BlockLinkCard/BlockLinkCard.vue'
221
- import { searchContentTypeToPageType } from './../../constants'
222
+ import { lookupContentType } from '../../utils/lookupContentType'
222
223
  import type { HeadingLevel } from './../BaseHeading/BaseHeading.vue'
223
224
 
224
225
  export default defineComponent({
@@ -320,6 +321,11 @@ export default defineComponent({
320
321
  required: false,
321
322
  default: undefined
322
323
  },
324
+ customDate: {
325
+ type: String,
326
+ required: false,
327
+ default: undefined
328
+ },
323
329
  location: {
324
330
  type: String,
325
331
  required: false,
@@ -328,12 +334,18 @@ export default defineComponent({
328
334
  pageContentType: {
329
335
  type: String,
330
336
  default: undefined
337
+ },
338
+ ongoing: {
339
+ type: Boolean,
340
+ default: false
331
341
  }
332
342
  },
333
343
  computed: {
334
- ...mapStores(useThemeStore),
335
- searchContentTypeToPageType() {
336
- return searchContentTypeToPageType
344
+ ...mapStores(useThemeStore)
345
+ },
346
+ methods: {
347
+ getInterfaceFromEskey(key: string) {
348
+ return lookupContentType(key, 'eskey', 'interface')
337
349
  }
338
350
  }
339
351
  })
@@ -98,7 +98,7 @@ import BaseImagePlaceholder from './../BaseImagePlaceholder/BaseImagePlaceholder
98
98
  import BlockLinkCard from './../BlockLinkCard/BlockLinkCard.vue'
99
99
  import BlockLinkTile from './../BlockLinkTile/BlockLinkTile.vue'
100
100
  import CalendarChip from './../CalendarChip/CalendarChip.vue'
101
- import { searchContentTypeToPageType } from './../../constants'
101
+ import { lookupContentType } from '../../utils/lookupContentType'
102
102
  import type { HeadingLevel } from './../BaseHeading/BaseHeading.vue'
103
103
 
104
104
  export default defineComponent({
@@ -177,12 +177,9 @@ export default defineComponent({
177
177
  },
178
178
  computed: {
179
179
  ...mapStores(useThemeStore),
180
- searchContentTypeToPageType() {
181
- return searchContentTypeToPageType
182
- },
183
180
  typename() {
184
181
  return this.pageContentType
185
- ? (this.searchContentTypeToPageType[this.pageContentType] as string)
182
+ ? lookupContentType(this.pageContentType, 'eskey', 'interface')
186
183
  : undefined
187
184
  }
188
185
  }
@@ -23,10 +23,13 @@
23
23
  :topic="page.topic"
24
24
  :image="page.image"
25
25
  :date="page.date"
26
+ :custom-date="page.customDate"
26
27
  :start-date="page.startDate"
27
28
  :end-date="page.endDate"
28
29
  :start-time="page.startTime"
29
30
  :end-time="page.endTime"
31
+ :event-type="page.eventType"
32
+ :ongoing="page.ongoing"
30
33
  :location="page.location"
31
34
  :title="page.title"
32
35
  :summary="page.summary"
@@ -57,6 +60,7 @@
57
60
  <script lang="ts">
58
61
  import { defineComponent } from 'vue'
59
62
  import type { ElasticSearchPage } from '../../interfaces'
63
+
60
64
  // @ts-ignore
61
65
  import dayjs from 'dayjs'
62
66
  import SearchResultCard from './../SearchResultCard/SearchResultCard.vue'
@@ -131,6 +135,8 @@ export default defineComponent({
131
135
  const pageType = page._source[handle + '__label']
132
136
  if (handle === 'events_eventpage') {
133
137
  date = 'Event date: ' + parseDate(page._source[handle + '__start_datetime'])
138
+ } else if (handle === 'edu_events_edueventpage') {
139
+ date = null
134
140
  } else if (handle === 'missions_mission') {
135
141
  date = page._source.display_date_filter
136
142
  ? 'Launch date: ' + page._source.display_date_filter
@@ -155,13 +161,37 @@ export default defineComponent({
155
161
  page.topic = topic
156
162
  // properties for event's page
157
163
  page.location =
158
- handle === 'events_eventpage' ? page._source[handle + '__location'] : null
164
+ handle === 'events_eventpage' || handle === 'edu_events_edueventpage'
165
+ ? page._source[handle + '__location'] | page._source[handle + '__location_name']
166
+ : null
159
167
  page.startDate =
160
- handle === 'events_eventpage' ? page._source[handle + '__start_datetime'] : null
168
+ handle === 'events_eventpage' || handle === 'edu_events_edueventpage'
169
+ ? page._source[handle + '__start_datetime']
170
+ : null
161
171
  page.endDate =
162
- handle === 'events_eventpage' ? page._source[handle + '__end_datetime'] : null
172
+ handle === 'events_eventpage' || handle === 'edu_events_edueventpage'
173
+ ? page._source[handle + '__end_datetime']
174
+ : null
163
175
  page.startTime =
164
- handle === 'events_eventpage' ? page._source[handle + '__start_time_string'] : null
176
+ handle === 'events_eventpage' || handle === 'edu_events_edueventpage'
177
+ ? page._source[handle + '__start_time_string']
178
+ : null
179
+ page.endTime =
180
+ handle === 'events_eventpage' || handle === 'edu_events_edueventpage'
181
+ ? page._source[handle + '__end_time_string']
182
+ : null
183
+ page.eventType =
184
+ handle === 'edu_events_edueventpage'
185
+ ? page._source.edu_events_edueventpage__event_type_label_filter
186
+ : undefined
187
+ page.customDate =
188
+ handle === 'edu_events_edueventpage'
189
+ ? page._source.edu_events_edueventpage__custom_date
190
+ : undefined
191
+ page.ongoing =
192
+ handle === 'edu_events_edueventpage'
193
+ ? page._source.edu_events_edueventpage__ongoing
194
+ : undefined
165
195
  // properties that are different for profiles page
166
196
  page.summary =
167
197
  handle === 'profiles_profilepage'
package/src/constants.ts CHANGED
@@ -1,7 +1,8 @@
1
- import type { DictionaryInterface, PillDictionaryInterface } from './interfaces'
1
+ import type { PillDictionaryInterface } from './interfaces'
2
2
 
3
3
  export const eduMetadataDictionary: PillDictionaryInterface = {
4
4
  EDUEventPage: {
5
+ label: 'Event',
5
6
  variant: 'primary',
6
7
  icons: 'primary',
7
8
  type: 'event'
@@ -68,14 +69,184 @@ export const eduMetadataDictionary: PillDictionaryInterface = {
68
69
  }
69
70
  }
70
71
 
71
- // TODO: finish this
72
- export const searchContentTypeToPageType: DictionaryInterface = {
73
- news_news: 'News',
74
- events_eventpage: 'EventPage',
75
- missions_mission: 'Mission',
76
- eduevents_edueventpage: 'EDUEventPage',
77
- eduresources_educollectionsdetailpage: 'EDUCollectionsDetailPage',
78
- eduresources_eduexplainerarticlepage: 'EDUExplainerArticlePage',
79
- eduresources_edulessonpage: 'EDULessonPage',
80
- eduresources_eduteachablemomentpage: 'EDUTeachableMomentPage'
72
+ interface contentTypeObject {
73
+ model: string
74
+ label: string
81
75
  }
76
+
77
+ export const contentTypes: contentTypeObject[] = [
78
+ {
79
+ model: 'news.News',
80
+ label: 'News & Features'
81
+ },
82
+ {
83
+ model: 'home.HomePage',
84
+ label: 'Homepage'
85
+ },
86
+ {
87
+ model: 'missions.Mission',
88
+ label: 'Missions'
89
+ },
90
+ {
91
+ model: 'events.EventPage',
92
+ label: 'Events'
93
+ },
94
+ {
95
+ model: 'image_detail.ImageDetailPage',
96
+ label: 'Images'
97
+ },
98
+ {
99
+ model: 'audio_detail.AudioIndexPage',
100
+ label: 'Audio Index'
101
+ },
102
+ {
103
+ model: 'audio_detail.AudioDetailPage',
104
+ label: 'Audio'
105
+ },
106
+ {
107
+ model: 'infographics.InfographicsDetailPage',
108
+ label: 'Infographics'
109
+ },
110
+ {
111
+ model: 'image_detail.CuratedGalleryPage',
112
+ label: 'Curated Gallery'
113
+ },
114
+ {
115
+ model: 'topics.TopicPage',
116
+ label: 'Topics'
117
+ },
118
+ {
119
+ model: 'asteroid_watch.AsteroidWatchIndexPage',
120
+ label: 'Asteroid Watch Index'
121
+ },
122
+ {
123
+ model: 'asteroid_watch.AsteroidWatchContentPage',
124
+ label: 'Asteroid Watch'
125
+ },
126
+ {
127
+ model: 'missions.MissionsIndexPage',
128
+ label: 'Missions Index'
129
+ },
130
+ {
131
+ model: 'information_pages.ContentPage',
132
+ label: 'Information pages'
133
+ },
134
+ {
135
+ model: 'robotics.RobotPage',
136
+ label: 'Robots'
137
+ },
138
+ {
139
+ model: 'video_detail.VideoDetailPage',
140
+ label: 'Video'
141
+ },
142
+ {
143
+ model: 'podcasts.PodcastPage',
144
+ label: 'Podcasts'
145
+ },
146
+ {
147
+ model: 'go_pages.GoHomePage',
148
+ label: 'Go Sites'
149
+ },
150
+ {
151
+ model: 'press_kits.PressKitHomePage',
152
+ label: 'Press Kits'
153
+ },
154
+ {
155
+ model: 'profiles.ProfilePage',
156
+ label: 'People'
157
+ },
158
+ // EDU content types
159
+ {
160
+ model: 'edu_home.EDUHomePage',
161
+ label: 'Education Homepage'
162
+ },
163
+ {
164
+ model: 'edu_information_pages.EDUContentPage',
165
+ label: 'Information Pages'
166
+ },
167
+ {
168
+ model: 'edu_news.EDUNewsIndexPage',
169
+ label: 'News Index'
170
+ },
171
+ {
172
+ model: 'edu_events.EDUEventsIndexPage',
173
+ label: 'Events Index'
174
+ },
175
+ {
176
+ model: 'edu_events.EDUEventPage',
177
+ label: 'Events'
178
+ },
179
+ {
180
+ model: 'edu_news.EDUNewsPage',
181
+ label: 'News'
182
+ },
183
+ {
184
+ model: 'edu_resources.EDUExplainerArticlePage',
185
+ label: 'Explainer Articles'
186
+ },
187
+ {
188
+ model: 'edu_resources.EDUResourceLibraryIndexPage',
189
+ label: 'Resource Library Index'
190
+ },
191
+ {
192
+ model: 'edu_resources.EDULessonPage',
193
+ label: 'Lesson Plans'
194
+ },
195
+ {
196
+ model: 'edu_resources.EDUTeachableMomentPage',
197
+ label: 'Teachable Moments'
198
+ },
199
+ {
200
+ model: 'edu_resources.EDUCollectionsDetailPage',
201
+ label: 'Collections'
202
+ },
203
+ {
204
+ model: 'edu_resources.EDUGalleryDetailPage',
205
+ label: 'Galleries'
206
+ },
207
+ {
208
+ model: 'edu_resources.EDUImageDetailPage',
209
+ label: 'Images'
210
+ },
211
+ {
212
+ model: 'edu_resources.EDUInfographicDetailPage',
213
+ label: 'Infographics'
214
+ },
215
+ {
216
+ model: 'edu_resources.EDUDocumentDetailPage',
217
+ label: 'Documents'
218
+ },
219
+ {
220
+ model: 'edu_resources.EDUVideoDetailPage',
221
+ label: 'Videos'
222
+ }
223
+ ]
224
+
225
+ interface contentAliasObject extends contentTypeObject {
226
+ interface?: string
227
+ eskey?: string
228
+ }
229
+ const getContentAliases = (): contentAliasObject[] => {
230
+ const getInterface = (contentType: contentTypeObject) => {
231
+ const model = contentType.model
232
+ return model ? model.split('.').pop() : undefined
233
+ }
234
+ const getEskey = (contentType: contentTypeObject) => {
235
+ const model = contentType.model
236
+ return model ? model.toLowerCase().replace('.', '_') : undefined
237
+ }
238
+
239
+ let entries: contentAliasObject[] = []
240
+
241
+ contentTypes.forEach((contentType) => {
242
+ const entry: contentAliasObject = {
243
+ ...contentType,
244
+ interface: getInterface(contentType),
245
+ eskey: getEskey(contentType)
246
+ }
247
+ entries.push(entry)
248
+ })
249
+ return entries
250
+ }
251
+
252
+ export const contentAliases = getContentAliases()
package/src/interfaces.ts CHANGED
@@ -79,16 +79,19 @@ export interface ElasticSearchPage {
79
79
  content_type: string
80
80
  url: string
81
81
  type: string
82
- topic: string
83
- image: string | any
84
- date: string
85
- startDate: string
86
- endDate: string
87
- startTime: string
88
- endTime: string
89
- location: string
82
+ topic?: string
83
+ image?: string | any
84
+ date?: string
85
+ startDate?: string
86
+ endDate?: string
87
+ customDate?: string
88
+ startTime?: string
89
+ endTime?: string
90
+ location?: string
90
91
  title: string
91
- summary: string
92
+ summary?: string
93
+ eventType?: string
94
+ ongoing?: boolean
92
95
  }
93
96
 
94
97
  export interface FormOption {
@@ -36,9 +36,8 @@
36
36
  <BasePill
37
37
  variant="primary"
38
38
  size="lg"
39
- >
40
- {{ data.eventType }}
41
- </BasePill>
39
+ :text="data.eventType"
40
+ />
42
41
  </div>
43
42
  <BaseHeading
44
43
  level="h1"
@@ -0,0 +1,22 @@
1
+ import { contentAliases } from './../constants'
2
+
3
+ export const getInterfaceFromEskey = (eskey: string) => {
4
+ let match = undefined
5
+ contentAliases.forEach((alias) => (alias.eskey === eskey ? (match = alias.interface) : undefined))
6
+ return match
7
+ }
8
+
9
+ export const getEskeyFromInterface = (interfaceName: string) => {
10
+ let match = undefined
11
+ contentAliases.forEach((alias) =>
12
+ alias.interface === interfaceName ? (match = alias.eskey) : undefined
13
+ )
14
+ return match
15
+ }
16
+
17
+ export const lookupContentType = (key: string, source: string, target: string) => {
18
+ let match = undefined
19
+ // @ts-expect-error
20
+ contentAliases.forEach((entry) => (entry[source] === key ? (match = entry[target]) : undefined))
21
+ return match
22
+ }