+
Encyclopédie
Tous
Personnages
Lieux
Créatures
Peuples
@@ -102,11 +102,11 @@
-
@@ -114,6 +114,7 @@
+
+
+
diff --git a/app/pages/index.vue b/app/pages/index.vue
index d55f803..12b7f98 100644
--- a/app/pages/index.vue
+++ b/app/pages/index.vue
@@ -7,4 +7,7 @@
diff --git a/app/stores/entites.store.ts b/app/stores/entites.store.ts
index ae22380..ffe240d 100644
--- a/app/stores/entites.store.ts
+++ b/app/stores/entites.store.ts
@@ -1,18 +1,19 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
-import type { Entite } from '~/types/database.types'
+import type { Entite, EntiteTree, typeFilter } from '~/types/database.types'
export const useEntitesStore = defineStore('entites', () => {
const entites = ref
([])
- const typeFilter = ref<'tous' | 'personnage' | 'lieu' | 'creature' | 'peuple'>('tous')
+ const typeFilter = ref('tous')
const searchValue = ref('')
const isLoading = ref(true)
const isError = ref(false)
const errorMessage = ref('')
const currentPage = ref(1)
const hasMore = ref(true)
+ const tree = ref([])
- const loadEntites = async () => {
+ const getEntites = async () => {
if (!hasMore.value) return
isError.value = false
errorMessage.value = ''
@@ -39,7 +40,7 @@ export const useEntitesStore = defineStore('entites', () => {
const loadMore = () => {
if (hasMore.value && !isLoading.value) {
currentPage.value++
- loadEntites()
+ return getEntites()
}
}
@@ -47,7 +48,7 @@ export const useEntitesStore = defineStore('entites', () => {
entites.value = []
currentPage.value = 1
hasMore.value = true
- loadEntites()
+ return getEntites()
}
const getEntiteById = async (id: string) => {
@@ -63,7 +64,7 @@ export const useEntitesStore = defineStore('entites', () => {
const searchEntites = async (terme: string) => {
if (!terme) {
- await loadEntites()
+ await getEntites()
return
}
@@ -91,6 +92,30 @@ export const useEntitesStore = defineStore('entites', () => {
)
})
+ const getEntitesOnTree = async (selectedFamilyRoot: string) => {
+ isLoading.value = true
+ isError.value = false
+
+ try {
+ const data = await $fetch(`/api/genealogie/${selectedFamilyRoot}`)
+ tree.value = data
+ } catch (e) {
+ const err = e as Error
+ isError.value = true
+ errorMessage.value = err.message
+ } finally {
+ isLoading.value = false
+ }
+ }
+
+ const resetFilters = () => {
+ typeFilter.value = 'tous'
+ searchValue.value = ''
+ currentPage.value = 1
+ hasMore.value = true
+ entites.value = []
+ }
+
return {
entites,
typeFilter,
@@ -100,9 +125,11 @@ export const useEntitesStore = defineStore('entites', () => {
errorMessage,
entitesFilter,
loadMore,
- loadEntites,
+ getEntites,
resetAndLoad,
getEntiteById,
searchEntites,
+ getEntitesOnTree,
+ resetFilters,
}
})
diff --git a/app/types/database.types.ts b/app/types/database.types.ts
index 079c61a..35413f6 100644
--- a/app/types/database.types.ts
+++ b/app/types/database.types.ts
@@ -1,5 +1,7 @@
export type EntiteType = 'personnage' | 'lieu' | 'creature'
+export type typeFilter = 'tous' | 'personnage' | 'lieu' | 'creature' | 'peuple'
+
export type Entite = {
id: string
created_at: string
@@ -16,3 +18,11 @@ export type Entite = {
relations?: string[]
lieu_id?: string
}
+
+export interface EntiteTree {
+ id: string
+ nom: string
+ espece?: string
+ type?: string
+ highlight?: boolean
+}
diff --git a/commitlint.config.js b/commitlint.config.ts
similarity index 100%
rename from commitlint.config.js
rename to commitlint.config.ts
diff --git a/eslint.config.mjs b/eslint.config.mts
similarity index 100%
rename from eslint.config.mjs
rename to eslint.config.mts
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 509f9d5..279160e 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -74,8 +74,28 @@ export default defineNuxtConfig({
"'unsafe-eval'",
"'wasm-unsafe-eval'",
'https://cloud.umami.is',
+ 'https://esm.sh',
+ ],
+ 'script-src-elem': [
+ "'self'",
+ "'unsafe-inline'",
+ "'wasm-unsafe-eval'",
+ 'https://cloud.umami.is',
+ 'https://esm.sh',
+ ],
+ 'img-src': [
+ "'self'",
+ 'data:',
+ 'https://avatars.githubusercontent.com',
+ 'https://res.cloudinary.com',
+ 'https://cloud.umami.is',
],
},
},
},
+ image: {
+ cloudinary: {
+ baseURL: 'https://res.cloudinary.com/dbihnwsar/image/upload',
+ },
+ },
})
diff --git a/server/api/genealogie/families.ts b/server/api/genealogie/families.ts
new file mode 100644
index 0000000..3624413
--- /dev/null
+++ b/server/api/genealogie/families.ts
@@ -0,0 +1,58 @@
+import { serverSupabaseClient } from '#supabase/server'
+
+// type characterInTree = {
+// id: string
+// nom: string
+// espece: string
+// type: string
+// highlight?: boolean
+// }
+
+export default defineEventHandler(async (event) => {
+ const supabase = await serverSupabaseClient(event)
+
+ const { data: personnages, error } = await supabase
+ .from('entites')
+ .select('id, nom, espece, type')
+ .eq('type', 'personnage')
+
+ if (error) {
+ throw createError({
+ statusCode: 500,
+ message: 'Erreur lors de la récupération des personnages',
+ })
+ }
+
+ const findByName = (nom: string) => {
+ return personnages?.find((p) => p.nom.toLowerCase() === nom.toLowerCase())
+ }
+
+ return {
+ // Souche = génération 0 (les grands-parents)
+ souche: [[{ ...findByName('Zaboor') }, { ...findByName('Toolja') }].filter((p) => p?.id)],
+
+ // Les 3 branches côte à côte
+ branches: {
+ invisible: [
+ // Génération 1 : Parents
+ [[{ ...findByName('Noor') }, { ...findByName('Brunilla') }].filter((p) => p?.id)],
+ // Génération 2 : Enfants
+ [[{ ...findByName('Galdec') }, { ...findByName('Kheëna') }].filter((p) => p?.id)],
+ // Génération 3 : Petits-enfants
+ [[{ ...findByName('Weëna') }].filter((p) => p?.id)],
+ ],
+
+ maitresse: [
+ [[{ ...findByName('Skoor') }, { ...findByName('Naounë') }].filter((p) => p?.id)],
+ [[{ ...findByName("Ot'Skoor") }, { ...findByName('Eda') }].filter((p) => p?.id)],
+ [[{ ...findByName('Armskoor') }].filter((p) => p?.id)],
+ ],
+
+ morte: [
+ [[{ ...findByName('Tengoor') }, { ...findByName('Golja') }].filter((p) => p?.id)],
+ [[{ ...findByName("Ot'Tengoor") }, { ...findByName('Queënzy') }].filter((p) => p?.id)],
+ [[{ ...findByName('Morckoor') }, { ...findByName('Olja') }].filter((p) => p?.id)],
+ ],
+ },
+ }
+})