@paris-ias/list 1.0.190 → 1.0.192

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/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@paris-ias/list",
3
3
  "configKey": "list",
4
- "version": "1.0.190",
4
+ "version": "1.0.192",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.4",
7
7
  "unbuild": "2.0.0"
@@ -34,7 +34,9 @@
34
34
 
35
35
  <template v-else>
36
36
  <div class="d-flex align-center flex-column">
37
- <div class="d-flex text-center text-wrap text-h3 text-black">
37
+ <div
38
+ class="d-flex text-center text-wrap text-h4 text-md-h3 text-black"
39
+ >
38
40
  {{ item.name }}
39
41
  </div>
40
42
 
@@ -165,7 +167,7 @@
165
167
  </v-row>
166
168
  </v-col>
167
169
 
168
- <v-col v-if="xs" class="ml-2" cols="12">
170
+ <v-col v-if="xs" cols="12">
169
171
  <MiscAtomsImageContainer
170
172
  cover
171
173
  :src="item.image.url ? item.image : '/default.png'"
@@ -13,7 +13,10 @@
13
13
  class="mr-2"
14
14
  />
15
15
 
16
- <div v-else-if="registrationStatus === 2" class="my-2 text-overline">
16
+ <div
17
+ v-else-if="registrationStatus === 2"
18
+ class="my-2 text-caption text-md-overline"
19
+ >
17
20
  <v-icon class="text-grey" size="x-large"> mdi-circle-medium </v-icon>
18
21
  {{
19
22
  $t("applications-closed-since-0", [
@@ -2,12 +2,26 @@
2
2
  <v-row
3
3
  v-ripple
4
4
  no-gutters
5
- class="cursor-pointer highlight-on-hover pt-2 pl-2"
5
+ class="cursor-pointer highlight-on-hover pt-2 pl-md-2"
6
6
  >
7
7
  <v-col
8
- align-self="center"
9
- cols="8"
10
- class="text-h5 dense"
8
+ v-if="mdAndUp"
9
+ cols="1"
10
+ class="align-center"
11
+ :offset="name.startsWith('search') ? 1 : 0"
12
+ >
13
+ <MiscAtomsImageContainer
14
+ cover
15
+ :loading="loading"
16
+ :src="item?.image?.url || '/default.png'"
17
+ :ratio="1 / 1"
18
+ :width="100"
19
+ />
20
+ </v-col>
21
+
22
+ <v-col
23
+ :cols="mdAndUp ? 8 : undefined"
24
+ class="text-h5 dense d-flex flex-column ml-md-2"
11
25
  :offset="name.startsWith('search') ? 1 : 0"
12
26
  >
13
27
  <v-skeleton-loader
@@ -25,16 +39,35 @@
25
39
  "
26
40
  />
27
41
  <FellowshipsBadges :item="item" :loading="loading" />
42
+
43
+ <template v-if="mdAndDown">
44
+ <v-skeleton-loader
45
+ v-if="loading"
46
+ type="chip"
47
+ width="260"
48
+ class="mt-2"
49
+ />
50
+ <MiscMoleculesChipContainer
51
+ v-else
52
+ :items="[
53
+ $t(
54
+ 'list.filters.fellowships.fellowshipType.' + item.fellowshipType,
55
+ ),
56
+ ...(props.item?.disciplines?.map((discipline) => discipline.name) ??
57
+ []),
58
+ ]"
59
+ />
60
+ </template>
28
61
  </v-col>
29
- <v-col align-self="center" cols="auto">
62
+
63
+ <v-col v-if="mdAndUp" class="d-flex flex-column">
30
64
  <v-skeleton-loader v-if="loading" type="chip" width="260" class="mt-2" />
31
65
  <MiscMoleculesChipContainer
32
66
  v-else
33
67
  :items="[
34
68
  $t('list.filters.fellowships.fellowshipType.' + item.fellowshipType),
35
- ...(props.item && props.item.disciplines
36
- ? props.item.disciplines.map((discipline) => discipline.name)
37
- : []),
69
+ ...(props.item?.disciplines?.map((discipline) => discipline.name) ??
70
+ []),
38
71
  ]"
39
72
  class="mt-2"
40
73
  />
@@ -43,12 +76,16 @@
43
76
  </template>
44
77
 
45
78
  <script setup>
79
+ import { useDisplay } from "vuetify"
46
80
  import { useNuxtApp, useRoute, computed } from "#imports"
47
81
  import { highlightAndTruncate } from "../../composables/useUtils"
48
82
  const { $rootStore, $stores } = useNuxtApp()
49
83
  const { name } = useRoute()
84
+ const { mdAndUp, mdAndDown } = useDisplay()
50
85
  const searchQuery = computed(() =>
51
- name.startsWith('search') ? $rootStore.search : ($stores['fellowships'].search || '')
86
+ name.startsWith("search")
87
+ ? $rootStore.search
88
+ : $stores["fellowships"].search || "",
52
89
  )
53
90
  const props = defineProps({
54
91
  item: {
@@ -33,10 +33,10 @@
33
33
  </template>
34
34
 
35
35
  <script setup>
36
- import { getLocalizedDate } from "../../composables/useUtils";
36
+ import { getLocalizedDate } from "../../composables/useUtils"
37
37
 
38
38
  const props = defineProps({
39
39
  item: { type: Object, required: true },
40
40
  view: { type: Boolean, required: false, default: false },
41
- });
41
+ })
42
42
  </script>
@@ -136,20 +136,34 @@ const props = defineProps({
136
136
  type: Boolean,
137
137
  default: false,
138
138
  },
139
+ filterOrder: {
140
+ type: Array,
141
+ default: () => [],
142
+ },
139
143
  })
140
144
 
141
145
  // Filter dropdown state
142
146
  const filterMenuOpen = ref(false)
143
147
 
144
148
  // Filter options
145
- const filterOptions = computed(() => [
146
- { value: "people", label: capitalize(t("items.people", 2)) },
147
- { value: "events", label: capitalize(t("items.events", 2)) },
148
- { value: "news", label: capitalize(t("items.news", 2)) },
149
- { value: "publications", label: capitalize(t("items.publications", 2)) },
150
- { value: "fellowships", label: capitalize(t("items.fellowships", 2)) },
151
- { value: "projects", label: capitalize(t("items.projects", 2)) },
152
- ])
149
+ const allFilterOptions = computed(() => ({
150
+ people: { value: "people", label: capitalize(t("items.people", 2)) },
151
+ events: { value: "events", label: capitalize(t("items.events", 2)) },
152
+ news: { value: "news", label: capitalize(t("items.news", 2)) },
153
+ publications: { value: "publications", label: capitalize(t("items.publications", 2)) },
154
+ fellowships: { value: "fellowships", label: capitalize(t("items.fellowships", 2)) },
155
+ projects: { value: "projects", label: capitalize(t("items.projects", 2)) },
156
+ }))
157
+
158
+ const filterOptions = computed(() => {
159
+ const map = allFilterOptions.value
160
+ if (props.filterOrder.length > 0) {
161
+ const ordered = props.filterOrder.filter((k) => map[k]).map((k) => map[k])
162
+ const rest = Object.values(map).filter((o) => !props.filterOrder.includes(o.value))
163
+ return [...ordered, ...rest]
164
+ }
165
+ return Object.values(map)
166
+ })
153
167
 
154
168
  // Toggle filter selection
155
169
  const toggleFilter = (option) => {
@@ -3,6 +3,7 @@
3
3
  type="all"
4
4
  :placeholder="$t('search')"
5
5
  :categories="selectedCategories"
6
+ :filter-order="sortedModules"
6
7
  filter
7
8
  @filter-change="handleFilterChange"
8
9
  class="mb-6"
@@ -2,7 +2,7 @@
2
2
  <v-row no-gutters>
3
3
  <v-col>
4
4
  <template v-for="(value, key, index) in socials" :key="key + value">
5
- <v-tooltip v-if="value" :location="location">
5
+ <v-tooltip v-if="value && key !== '__typename'" :location="location">
6
6
  <template #activator="{ props }">
7
7
  <v-btn
8
8
  tile
@@ -11,11 +11,15 @@
11
11
  :href="getSocialId(key, value)"
12
12
  :color="dark ? 'transparent' : 'white'"
13
13
  flat
14
+ class="pl-0"
14
15
  >
15
16
  <v-icon :color="dark ? 'white' : 'black'">
16
17
  {{ getProfileIcon(key) }}</v-icon
17
18
  >
18
- <div v-if="labelled" class="text-uppercase text-muted ml-3">
19
+ <div
20
+ v-if="labelled"
21
+ class="text-uppercase text-caption text-md-button ml-3"
22
+ >
19
23
  {{ key }}
20
24
  </div>
21
25
  </v-btn>
@@ -29,11 +33,11 @@
29
33
  </template>
30
34
 
31
35
  <script setup>
32
- import { useAttrs, mergeProps } from "vue";
33
- import { useDisplay } from "vuetify";
36
+ import { useAttrs, mergeProps } from "vue"
37
+ import { useDisplay } from "vuetify"
34
38
 
35
- const attrs = useAttrs();
36
- const { name } = useDisplay();
39
+ const attrs = useAttrs()
40
+ const { name } = useDisplay()
37
41
 
38
42
  const props = defineProps({
39
43
  socials: {
@@ -52,75 +56,75 @@ const props = defineProps({
52
56
  type: Boolean,
53
57
  default: false,
54
58
  },
55
- });
59
+ })
56
60
 
57
61
  const getSocialId = (name, id) => {
58
62
  switch (name) {
59
63
  case "idRef":
60
- return `https://www.idref.fr/${id}`;
64
+ return `https://www.idref.fr/${id}`
61
65
  case "mendeley":
62
- return `https://www.mendeley.com/${id}`;
66
+ return `https://www.mendeley.com/${id}`
63
67
  case "linkedin":
64
- return `https://www.linkedin.com/company/${id}`;
68
+ return `https://www.linkedin.com/company/${id}`
65
69
  case "twitter":
66
- return `https://x.com/${id}`;
70
+ return `https://x.com/${id}`
67
71
  case "orcid":
68
- return `https://orcid.org/${id}`;
72
+ return `https://orcid.org/${id}`
69
73
  case "scholar":
70
- return `https://scholar.google.com/${id}`;
74
+ return `https://scholar.google.com/${id}`
71
75
  case "wikipedia":
72
- return `https://fr.wikipedia.org/${id}`;
76
+ return `https://fr.wikipedia.org/${id}`
73
77
  case "researchgate":
74
- return `https://www.researchgate.net/${id}`;
78
+ return `https://www.researchgate.net/${id}`
75
79
  case "youtube":
76
- return `https://www.youtube.com/${id}`;
80
+ return `https://www.youtube.com/${id}`
77
81
  case "facebook":
78
- return `https://www.facebook.com/pages/${id}`;
82
+ return `https://www.facebook.com/pages/${id}`
79
83
  case "instagram":
80
- return `https://www.instagram.com/${id}`;
84
+ return `https://www.instagram.com/${id}`
81
85
  case "github":
82
- return `https://gitbub.com/${id}`;
86
+ return `https://gitbub.com/${id}`
83
87
  case "rss":
84
- return "";
88
+ return ""
85
89
  case "website":
86
- return "";
90
+ return ""
87
91
  }
88
- };
92
+ }
89
93
 
90
94
  const getProfileIcon = (name) => {
91
95
  switch (name) {
92
96
  case "idRef":
93
- return "mdi-account-plus-outline";
97
+ return "mdi-account-plus-outline"
94
98
  case "mendeley":
95
- return "mdi-book";
99
+ return "mdi-book"
96
100
  case "bluesky":
97
- return "mdi-cloud";
101
+ return "mdi-cloud"
98
102
  case "linkedin":
99
- return "mdi-linkedin";
103
+ return "mdi-linkedin"
100
104
  case "twitter":
101
- return "mdi-twitter";
105
+ return "mdi-twitter"
102
106
  case "orcid":
103
- return "mdi-account";
107
+ return "mdi-account"
104
108
  case "scholar":
105
- return "mdi-google";
109
+ return "mdi-google"
106
110
  case "wikipedia":
107
- return "mdi-wikipedia";
111
+ return "mdi-wikipedia"
108
112
  case "researchgate":
109
- return "mdi-account";
113
+ return "mdi-account"
110
114
  case "youtube":
111
- return "mdi-youtube";
115
+ return "mdi-youtube"
112
116
  case "facebook":
113
- return "mdi-facebook";
117
+ return "mdi-facebook"
114
118
  case "instagram":
115
- return "mdi-instagram";
119
+ return "mdi-instagram"
116
120
  case "github":
117
- return "mdi-github";
121
+ return "mdi-github"
118
122
  case "rss":
119
- return "mdi-rss";
123
+ return "mdi-rss"
120
124
  case "website":
121
- return "mdi-web";
125
+ return "mdi-web"
122
126
  }
123
- };
127
+ }
124
128
  </script>
125
129
 
126
130
  <style lang="scss"></style>
@@ -52,7 +52,7 @@
52
52
  </v-chip>
53
53
  <div
54
54
  v-if="item && item.name && mdAndUp"
55
- class="d-flex text-wrap text-h4 text-black"
55
+ class="d-flex text-wrap text-h4 text-md-h3 text-black"
56
56
  >
57
57
  {{ item.name }}
58
58
  </div>
@@ -175,4 +175,6 @@ const props = defineProps({
175
175
  loading: { type: Boolean, default: false },
176
176
  })
177
177
  $stores.people.loading = false
178
+
179
+ console.log("people", props.item)
178
180
  </script>
@@ -33,7 +33,7 @@
33
33
  <div v-else class="d-flex align-center flex-column mt-12">
34
34
  <div
35
35
  v-if="item && item.name"
36
- class="d-flex text-center text-wrap text-h3 text-black"
36
+ class="d-flex text-center text-wrap text-h4 text-md-h3 text-black"
37
37
  >
38
38
  {{ item.name }}
39
39
  </div>
@@ -32,7 +32,7 @@
32
32
  />
33
33
 
34
34
  <div v-else class="d-flex align-center flex-column mt-12">
35
- <div class="d-flex text-center text-wrap text-h3 text-black">
35
+ <div class="d-flex text-center text-wrap text-h4 text-md-h3 text-black">
36
36
  {{ item.name }}
37
37
  </div>
38
38
  <v-divider width="154px" class="mb-1 mt-6" />
@@ -75,7 +75,7 @@
75
75
  ]
76
76
  "
77
77
  />
78
- <div v-if="item.description" class="mt-md-n2 mx-10 mx-md-0">
78
+ <div v-if="item.description" class="mt-md-n2">
79
79
  <MDC :value="item.description" />
80
80
  </div>
81
81
  </v-col>
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "license": "AGPL-3.0-only",
3
3
  "main": "./dist/module.mjs",
4
- "version": "1.0.190",
4
+ "version": "1.0.192",
5
5
  "name": "@paris-ias/list",
6
6
  "repository": {
7
7
  "url": "git+https://github.com/IEA-Paris/list.git",
8
8
  "type": "git"
9
9
  },
10
10
  "dependencies": {
11
- "@paris-ias/trees": "^2.0.47"
11
+ "@paris-ias/trees": "^2.0.48"
12
12
  },
13
13
  "description": "Paris IAS List Module",
14
14
  "peerDependencies": {