Skip to content

Commit a3b1df6

Browse files
committed
feat: Add lazy loading for images in jsonFormRenderer.vue and persistent drawer in default.vue
1 parent 562e2e5 commit a3b1df6

File tree

20 files changed

+329
-211
lines changed

20 files changed

+329
-211
lines changed

src/components/2pan/btns/add.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
q-btn(flat icon="mdi-plus" @click="add" color="primary")
33
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") {{ tooltip }}
44
</template>
5-
5+
66
<script lang="ts" setup>
77
import type { PropType } from 'vue'
88
const props = defineProps({
@@ -16,4 +16,4 @@ const emit = defineEmits(['add'])
1616
function add() {
1717
emit('add')
1818
}
19-
</script>
19+
</script>
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<template lang="pug">
2-
q-btn(flat icon="mdi-refresh" @click="refresh" color="primary")
2+
q-btn(flat icon="mdi-refresh" @click="refresh" color="info")
33
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Rafraichir
44
</template>
5-
5+
66
<script lang="ts" setup>
77
import type { PropType } from 'vue'
88
const emit = defineEmits(['refresh'])
99
function refresh() {
1010
emit('refresh')
1111
}
12-
</script>
12+
</script>

src/components/2pan/btns/remove.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<template lang="pug">
22
q-btn(flat icon="mdi-delete" @click="remove" size="sm" color="negative")
3-
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") {{ tooltip }}
3+
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") {{ tooltip }}
44
</template>
5-
5+
66
<script lang="ts" setup>
77
import type { PropType } from 'vue'
88
const props = defineProps({
@@ -16,4 +16,4 @@ const emit = defineEmits(['remove'])
1616
function remove() {
1717
emit('remove')
1818
}
19-
</script>
19+
</script>

src/components/2pan/index.vue

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ q-splitter(
99
:style='{ "padding": isSimple ? "6px 0" : "0" }'
1010
)
1111
template(#before)
12-
q-card.full-height.q-pa-sm(bordered :class='{"hidden": isSimple && target}')
12+
q-card.full-height.q-pa-sm(bordered :class='{"hidden": isSimple && targetId}')
1313
q-table.sesame-sticky-last-column-table.full-height(
1414
v-bind="$attrs"
1515
selection="multiple"
@@ -33,18 +33,18 @@ q-splitter(
3333
template(v-for="(_, name) in $slots" v-slot:[name]="slotData")
3434
slot(:name="name" v-bind="slotData")
3535
template(v-slot:top-left)
36-
q-btn-group(rounded flat)
36+
q-btn-group(v-if="leftBtnHidden" rounded flat)
3737
slot(name="top-left-btn-grp" :selectedValues="selected")
3838
slot(name="top-left-btn-grp-content-before")
3939
slot(name="top-left-btn-grp-content-after")
4040
template(v-slot:top-right)
4141
q-btn-group(rounded flat)
4242
slot(name="top-right-btn-grp")
4343
slot(name="top-right-btn-grp-content-before")
44-
sesame-2pan-btns-add(@add="create" v-if="crud.create")
45-
q-btn.desktop-only(flat :icon="isSimple ? 'mdi-table-border' : 'mdi-table-merge-cells'" color="primary" @click="simple = !simple")
44+
sesame-2pan-btns-add(@add="add" v-if="crud.create")
45+
q-btn.desktop-only(flat :icon="isSimple ? 'mdi-table-border' : 'mdi-table-merge-cells'" color="info" @click="simple = !simple")
4646
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Mode simple/double panneaux
47-
q-btn(flat icon="mdi-table-headers-eye" color="primary")
47+
q-btn(flat icon="mdi-table-headers-eye" color="info")
4848
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") Afficher/cacher des colonnes
4949
q-menu(max-width="350px" max-height="350px").q-pa-md
5050
.row
@@ -53,21 +53,21 @@ q-splitter(
5353
sesame-2pan-btns-refresh(@refresh="refresh")
5454
slot(name="top-right-btn-grp-content-after")
5555

56-
template(v-slot:body-cell-actions="props" )
56+
template(v-slot:body-cell-actions="props")
5757
q-td(:props="props")
5858
q-btn-group(flat rounded)
5959
slot(name="body-cell-actions" :props="props")
6060
slot(name="body-cell-actions-content-before")
6161
sesame-2pan-btns-read(@read="read(props.row)" v-if="crud.read")
62-
sesame-2pan-btns-remove(@remove="remove(props.row)" v-if="crud.delete" )
62+
sesame-2pan-btns-remove(@remove="remove(props.row)" v-if="crud.delete")
6363
slot(name="body-cell-actions-content-after")
6464

6565
template(#separator)
6666
q-avatar(v-if='!isSimple' size="sm" color="primary" icon="mdi-unfold-more-vertical" class="text-white")
6767

6868
template(#after)
69-
q-card.full-height.q-pa-sm(bordered :class='{"hidden": isSimple && !target}')
70-
q-card-section.q-pa-none.flex.items-center.full-height.justify-center(v-if='!target')
69+
q-card.full-height.q-pa-sm(bordered :class='{"hidden": isSimple && !targetId}')
70+
q-card-section.q-pa-none.flex.items-center.full-height.justify-center(v-if='!targetId')
7171
slot(name="right-panel-empty")
7272
slot(name="right-panel-empty-content-before")
7373
p Selectionnez une entrée pour afficher son contenu...
@@ -85,19 +85,19 @@ q-splitter(
8585
q-tooltip.text-body2 Retour
8686
q-separator.q-mx-sm(vertical)
8787
slot(name="right-panel-actions-content" v-if="defaultRightPanelButton" :target="target")
88-
q-btn(color="positive" icon='mdi-content-save-plus' @click="create(target)" v-if="crud.create")
89-
q-tooltip.text-body2 Enregistrer
90-
q-btn(color="positive" icon='mdi-content-save' @click="update(target)" v-if="crud.update")
88+
q-btn(color="positive" icon='mdi-content-save-plus' @click="create(target)" v-show="isNew" v-if="crud.create")
89+
q-tooltip.text-body2 Créer
90+
q-btn(color="positive" icon='mdi-content-save' @click="update(target)" v-show="!isNew" v-if="crud.update")
9191
q-tooltip.text-body2 Enregistrer
92-
q-btn(color="negative" icon='mdi-delete' @click="remove(target)" v-if="crud.delete")
92+
q-btn(color="negative" icon='mdi-delete' @click="remove(target)" v-show="!isNew" v-if="crud.delete")
9393
q-tooltip.text-body2 Supprimer
9494
slot(name="right-panel-actions-content-after" :target="target")
9595
q-card-section.q-pa-none.fit.flex(style='flex-flow: column; overflow: hidden;')
9696
slot(name="right-panel-content" :payload="{ target }")
9797
slot(name="right-panel-content-before")
9898
slot(name="right-panel-content-after")
99-
q-expansion-item.bg-blue-grey-10(v-if='debug' label='Debug' icon='mdi-bug' dense)
100-
q-card.overflow-auto.bg-blue-grey-8(:style='{maxHeight: "250px", height: "250px"}')
99+
q-expansion-item.bg-blue-grey-10(v-if='debug' label='Debug' icon='mdi-bug' dark dense)
100+
q-card.overflow-auto.bg-blue-grey-8.text-white(:style='{maxHeight: "250px", height: "250px"}')
101101
q-card-section.q-pa-xs
102102
pre.q-ma-none(v-html='JSON.stringify(target, null, 2)')
103103
</template>
@@ -113,6 +113,8 @@ import type { PropType } from 'vue'
113113
import { crush, pick } from 'radash'
114114
import { routerKey } from 'vue-router'
115115
116+
const NEW_ID = '000000000000000000000000'
117+
116118
defineOptions({
117119
name: '2pan',
118120
})
@@ -222,6 +224,10 @@ watch(simple, (v) => {
222224
})
223225
const splitterModel = ref(isSimple.value ? 100 : 50)
224226
227+
const leftBtnHidden = computed(() => {
228+
return isSimple.value || splitterModel.value > 40
229+
})
230+
225231
const visibleColumnsInternal = ref(props.visibleColumns)
226232
const visibleColumnsComputed = computed({
227233
get() {
@@ -246,10 +252,11 @@ const { pagination, onRequest, initializePagination } = usePagination()
246252
initializePagination(props.total)
247253
248254
const emit = defineEmits(['create', 'refresh', 'read', 'update', 'delete'])
249-
const debug = process.env.NODE_ENV === 'development'
255+
const { debug } = useDebug()
250256
251257
const selected = ref([])
252258
const tab = ref('')
259+
const targetId = ref<null | string>(route.query?.read ? `${route.query?.read}` : null)
253260
const target = ref<null | object>(null)
254261
const daysjs = useDayjs()
255262
@@ -275,39 +282,57 @@ async function refresh() {
275282
276283
async function cancel() {
277284
await props.actions.cancel()
285+
targetId.value = null
278286
target.value = null
279287
selected.value = []
280288
router.push({ query: { ...route.query, read: undefined } })
281289
}
282290
async function read(row) {
291+
targetId.value = row?._id
283292
const response = await props.actions.read(row)
284293
target.value = response
285294
emit('read', response)
286295
}
287296
297+
async function add() {
298+
const read = NEW_ID
299+
targetId.value = read
300+
target.value = {}
301+
router.push({ query: { ...route.query, read } })
302+
}
303+
288304
async function create(row) {
305+
console.log('create', row)
289306
const response = await props.actions.create(row)
290-
target.value = response
307+
// target.value = response
308+
// targetId.value = response?._id
291309
emit('create', response)
292310
}
293311
294312
async function update(row) {
313+
targetId.value = row?._id
295314
const response = await props.actions.update(row)
296315
target.value = response
297316
emit('update', response)
298317
}
299318
300319
async function remove(row) {
320+
// targetId.value = row?._id
301321
const response = await props.actions.delete(row)
302322
target.value = response
323+
// target.value = response
303324
emit('delete', response)
304325
}
305326
327+
const isNew = computed(() => {
328+
return targetId.value === NEW_ID
329+
})
330+
306331
const getTitle = computed(() => {
307332
const keys = Array.isArray(props.titleKey) ? props.titleKey : [props.titleKey]
308333
if (!target.value) return ''
309334
const crushed = crush(target.value)
310-
const valuesList = target.value ? pick(crushed, keys) : {}
335+
const valuesList = target.value ? pick(crushed, keys as any) : {}
311336
return Object.values(valuesList).join(' ')
312337
})
313338
@@ -327,9 +352,14 @@ defineExpose({
327352
})
328353
329354
onMounted(async () => {
355+
if (isNew.value) {
356+
await add()
357+
return
358+
}
330359
const newTarget = await props.actions.onMounted()
331360
if (newTarget) {
332-
target.value = newTarget
361+
target.value = { ...newTarget }
362+
targetId.value = (newTarget as any)?._id
333363
}
334364
})
335365
</script>

src/components/appbar/Menu.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ q-btn(flat icon="mdi-dots-grid" size="20px" square)
88
q-icon(:name="app.icon.name" :color="app.icon.color" size="xl")
99
q-badge(v-if="app.badge" :color="app.badge.color" floating) {{ app.badge.value }}
1010
div.text-center(:class="`text-${app.title.color}`") {{ app.title.name }}
11-
1211
</template>
1312

1413
<script lang="ts" setup>

src/components/appbar/RightButtons.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ div
33
//q-btn(v-for="button in buttons" :key="button.icon" round flat :icon="button.icon" size="md").q-mx-sm
44
q-tooltip.text-body2(transition-show="scale" transition-hide="scale") {{ button.name }}
55
q-btn(v-if="badgesValues.TO_SYNC > 0" icon="mdi-sync" square color="amber-9" size="md" :label="badgesValues.TO_SYNC +' items à Synchroniser'" @click="syncAll")
6+
q-btn(v-if="debug" @click="$q.dark.toggle()" flat size="md" icon="mdi-theme-light-dark")
67
q-btn-dropdown(icon="mdi-account-circle-outline" :label="auth?.user?.displayName" round flat size="md")
78
q-list
89
q-item.q-pa-none(v-for="button in buttons" :key="button.name")
@@ -28,7 +29,8 @@ const badgesValues = ref({
2829
})
2930
3031
const auth = useAuth()
31-
console.log(auth)
32+
const { debug } = useDebug()
33+
// console.log(auth)
3234
const buttons = [
3335
// {
3436
// icon: 'mdi-cog',

src/components/appbar/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<template lang="pug">
22
q-header
33
q-toolbar.bg-primary.text-white(style={ height: '32px' })
4-
q-btn(flat @click="closeDrawer()" icon="mdi-menu")
5-
q-separator(vertical dark inset).q-mx-md
6-
7-
q-btn(flat @click="backToIndex()")
4+
//- div.desktop-hidden
5+
//- q-btn(flat @click="closeDrawer()" icon="mdi-menu")
6+
//- q-separator(vertical dark inset).q-mx-md
7+
q-btn.q-pl-none(flat @click="backToIndex()")
88
q-avatar(square)
99
q-img(src="/config/logo.png" error-src="/default.png" alt="Sesame logo")
1010
q-toolbar-title SESAME

src/components/identityForm/actions.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<template lang="pug">
22
div
3-
q-btn.q-mx-xs(@click="submit" color="primary" icon="mdi-check")
3+
q-btn.q-mx-xs(@click="submit" color="positive" icon="mdi-check")
44
q-tooltip.text-body2(slot="trigger") Enregistrer les modifications
5-
q-btn.q-mx-xs(@click="sync" color="primary" v-if="identity" :disabled="props.identity.state != IdentityState.TO_VALIDATE" icon="mdi-sync")
5+
q-btn.q-mx-xs(@click="sync" color="orange-8" v-if="identity" :disabled="props.identity.state != IdentityState.TO_VALIDATE" icon="mdi-sync")
66
q-tooltip.text-body2(slot="trigger" v-if="props.identity.state == IdentityState.TO_VALIDATE") Synchroniser l'identité
77
q-tooltip.text-body2(slot="trigger" v-else) L'état de l'identité ne permet pas de la synchroniser
8-
q-btn.q-mx-xs(@click="logs" color="primary" icon="mdi-file-document" :href="'/jobs?filters[:concernedTo.id]=' + props.identity._id")
8+
q-btn.q-mx-xs(@click="logs" color="grey-8" icon="mdi-file-document" :href="'/jobs?filters[:concernedTo.id]=' + props.identity?._id")
99
q-tooltip.text-body2(slot="trigger") Voir les logs de l'identité
1010
</template>
1111

src/components/identityForm/index.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ div
55
q-tab(v-for="tab in tabs" :key="tab" :name="tab" :label="tab" :alert="getTabValidations(tab)" alert-icon="mdi-alert" :class="`q-mr-xs`")
66

77
q-tab-panels(v-model="tab")
8-
q-tab-panel(name="inetOrgPerson")
8+
q-tab-panel(name="inetOrgPerson" v-if='identity && identity.inetOrgPerson')
99
sesame-json-form-renderer-api(
1010
schemaName="inetorgperson"
1111
v-model:data="identity.inetOrgPerson"
@@ -53,22 +53,23 @@ const { getStateColor, getStateName } = useIdentityStates()
5353
const { handleError } = useErrorHandling()
5454
5555
const identity = ref<Identity>(props.identity)
56-
const validations = ref<Record<string, unknown> | null>(props.identity.additionalFields?.validations ?? {})
56+
const tabs = ref(props.identity?.additionalFields?.objectClasses ?? [])
57+
const validations = ref<Record<string, unknown> | null>(props.identity?.additionalFields?.validations ?? {})
5758
5859
watch(() => props.identity, () => {
5960
identity.value = props.identity
60-
validations.value = props.identity.additionalFields?.validations ?? null
61+
tabs.value = props.identity?.additionalFields?.objectClasses ?? []
62+
validations.value = props.identity?.additionalFields?.validations ?? null
6163
})
6264
63-
const tabs = ref(props.identity?.additionalFields?.objectClasses ?? [])
6465
const tab = ref('inetOrgPerson')
6566
const error = ref(null)
6667
6768
async function submit() {
6869
console.log('submit from form')
6970
const sanitizedIdentity = { ...props.identity }
7071
delete sanitizedIdentity.metadata
71-
if (sanitizedIdentity.additionalFields?.validations) delete sanitizedIdentity.additionalFields.validations
72+
if (sanitizedIdentity?.additionalFields?.validations) delete sanitizedIdentity.additionalFields.validations
7273
7374
const { data: result, pending, error, refresh } = await useHttp<any>(`/management/identities/${props.identity._id}`, {
7475
method: 'PATCH',

src/components/jsonFormRenderer.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<template lang="pug">
22
json-forms(
3+
v-if="data"
34
:data="data"
45
:schema="schema"
56
:uischema="uischema"

0 commit comments

Comments
 (0)