Skip to content

Commit 1fd4fcb

Browse files
committed
refactor: streamline menu and identities column handling in configuration
- Removed YAML parsing for menus and identities columns from nuxt.config.ts, simplifying the configuration process. - Updated app bar navigation to use 'href' for direct links and removed the backToIndex method for cleaner code. - Adjusted drawer component to utilize 'to' for routing, aligning with Vue Router best practices. - Enhanced useColumnsIdentities and useMenu composables to directly reference identitiesColumns and menus from the app configuration.
1 parent dc13ab7 commit 1fd4fcb

File tree

7 files changed

+82
-24
lines changed

7 files changed

+82
-24
lines changed

apps/web/nuxt.config.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { resolve } from 'path'
22
import { existsSync, readFileSync, statSync, writeFileSync } from 'fs'
33
import openapiTS, { astToString, COMMENT_HEADER } from 'openapi-typescript'
44
import { defineNuxtConfig } from 'nuxt/config'
5-
import { parse } from 'yaml'
65
import * as consola from 'consola'
76
import setupApp from './src/server/extension.setup'
87

@@ -266,20 +265,6 @@ export default defineNuxtConfig({
266265
},
267266
hooks: {
268267
ready: async (nuxt) => {
269-
try {
270-
const menus = parse(readFileSync('./config/menus.yml', 'utf8') || '{}')
271-
nuxt.options.appConfig.menus = { ...menus || {} }
272-
} catch (error) {
273-
console.debug('[Nuxt] Error while reading menus.yml', error)
274-
}
275-
276-
try {
277-
const identitiesColumns = parse(readFileSync('./config/identities-columns.yml', 'utf8') || '{}')
278-
nuxt.options.appConfig.identitiesColumns = { ...identitiesColumns || {} }
279-
} catch (error) {
280-
console.debug('[Nuxt] Error while reading identities-columns.yml', error)
281-
}
282-
283268
const forceOpenapiRefresh = /true|on|yes|1/i.test(`${process.env.SESAME_FORCE_OPENAPI_TYPES_REFRESH}`)
284269
const openapiTypesPath = '.nuxt/types/service-api.d.ts'
285270
const maxOpenapiTypesAgeMs = 1000 * 60 * 15

apps/web/src/components/layouts/default/appbar.vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template lang="pug">
22
q-header
33
q-toolbar.bg-primary.text-white(style={ height: '32px' })
4-
q-btn.q-pl-none(flat stretch @click="backToIndex()")
4+
q-btn.q-pl-none(flat stretch href='/')
55
q-avatar(square)
66
q-img(src="/config/logo.png" error-src="/default.png" alt="Sesame logo")
77
q-toolbar-title SESAME
@@ -104,9 +104,6 @@ export default defineNuxtComponent({
104104
}
105105
},
106106
methods: {
107-
backToIndex() {
108-
this.$router.push('/')
109-
},
110107
async syncAll() {
111108
this.syncing({ count: this.badgesValues.TO_SYNC })
112109
this.$http.post('/core/backends/syncall', {

apps/web/src/components/layouts/default/drawer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ q-drawer.flex(v-model="drawer" side="left" :mini="true" :breakpoint="0" bordered
33
template(#mini)
44
q-scroll-area.fit.mini-slot.cursor-pointer
55
q-list
6-
q-item(href="/" clickable v-ripple)
6+
q-item(to="/" clickable v-ripple)
77
q-item-section(avatar)
88
q-icon(name="mdi-home")
99
q-separator

apps/web/src/composables/useColumnsIdentities.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ type useColumnsIdentitesReturnType = {
7979
export function useColumnsIdentites(): useColumnsIdentitesReturnType {
8080
const dayjs = useDayjs()
8181
const config = useAppConfig()
82+
const identitiesEntries = (config?.identitiesColumns?.entries as any[]) || []
8283

8384
const columns = ref<QTableProps['columns'] & { type: string }[]>([
8485
{
@@ -87,7 +88,7 @@ export function useColumnsIdentites(): useColumnsIdentitesReturnType {
8788
field: 'state',
8889
align: 'left',
8990
},
90-
...config?.identitiesColumns?.entries || [],
91+
...identitiesEntries,
9192
{
9293
name: 'metadata.lastUpdatedAt',
9394
label: 'Date de modification',
@@ -111,14 +112,14 @@ export function useColumnsIdentites(): useColumnsIdentitesReturnType {
111112
})) as ColumnConfig[])
112113

113114
const visibleColumns = ref<QTableProps['visibleColumns']>([
114-
...config?.identitiesColumns?.entries.map((col: any) => col.name) || [],
115+
...identitiesEntries.map((col: any) => col.name),
115116
'metadata.lastUpdatedAt',
116117
'metadata.createdAt',
117118
'state',
118119
])
119120

120121
const columnsType = ref<ColumnType[]>([
121-
...config?.identitiesColumns?.entries.map((col: any) => {
122+
...identitiesEntries.map((col: any) => {
122123
// console.log('Processing column config', col)
123124
return {
124125
name: col.name,

apps/web/src/composables/useMenu.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type MenuPartItem = {
2323

2424
function useMenu(identityStateStore: ReturnType<typeof useIdentityStateStore>): useMenuReturnType {
2525
const menuParts = ref<MenuPartItem[]>(DefaultMenuParts)
26+
const menuEntries = (config?.menus?.entries as any[]) || []
2627
const { hasPermission, hasPermissionStartsWith } = useAccessControl()
2728

2829
if (config?.menus?.parts) {
@@ -158,7 +159,7 @@ function useMenu(identityStateStore: ReturnType<typeof useIdentityStateStore>):
158159
hideInMenuBar: false,
159160
_acl: '/management/identities',
160161
},
161-
...config?.menus?.entries
162+
...menuEntries
162163
.filter((entry: any) => {
163164
if (entry._acl) {
164165
return hasPermissionStartsWith([entry._acl])
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
type UiConfigPayload = {
2+
menus?: {
3+
entries?: Record<string, unknown>[]
4+
parts?: Record<string, unknown>[]
5+
}
6+
identitiesColumns?: {
7+
entries?: Record<string, unknown>[]
8+
}
9+
}
10+
11+
export default defineNuxtPlugin(async () => {
12+
const appConfig = useAppConfig()
13+
const mutableAppConfig = appConfig as Record<string, unknown>
14+
15+
try {
16+
const payload = await $fetch<UiConfigPayload>('/config/ui')
17+
18+
mutableAppConfig.menus = {
19+
entries: payload?.menus?.entries || [],
20+
parts: payload?.menus?.parts || [],
21+
}
22+
23+
mutableAppConfig.identitiesColumns = {
24+
entries: payload?.identitiesColumns?.entries || [],
25+
}
26+
} catch (error) {
27+
console.debug('[Nuxt] Error while loading ui config', error)
28+
}
29+
})
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { readFile } from 'node:fs/promises'
2+
import { defineEventHandler } from 'h3'
3+
import { parse } from 'yaml'
4+
5+
type MenuEntry = Record<string, unknown>
6+
type MenuPart = Record<string, unknown>
7+
type IdentityColumnEntry = Record<string, unknown>
8+
9+
type UiConfigPayload = {
10+
menus: {
11+
entries: MenuEntry[]
12+
parts: MenuPart[]
13+
}
14+
identitiesColumns: {
15+
entries: IdentityColumnEntry[]
16+
}
17+
}
18+
19+
function asArray(value: unknown): Record<string, unknown>[] {
20+
return Array.isArray(value) ? (value as Record<string, unknown>[]) : []
21+
}
22+
23+
async function readYamlFile(path: string): Promise<Record<string, unknown>> {
24+
try {
25+
const raw = await readFile(path, 'utf8')
26+
return (parse(raw || '{}') as Record<string, unknown>) || {}
27+
} catch {
28+
return {}
29+
}
30+
}
31+
32+
export default defineEventHandler(async () => {
33+
const menusFile = await readYamlFile('./config/menus.yml')
34+
const identitiesColumnsFile = await readYamlFile('./config/identities-columns.yml')
35+
36+
return {
37+
menus: {
38+
entries: asArray(menusFile.entries),
39+
parts: asArray(menusFile.parts),
40+
},
41+
identitiesColumns: {
42+
entries: asArray(identitiesColumnsFile.entries),
43+
},
44+
} satisfies UiConfigPayload
45+
})

0 commit comments

Comments
 (0)