@@ -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...
@@ -84,20 +84,20 @@ q-splitter(
8484 q-btn( color ="primary" , icon ="mdi-chevron-left" @click ="cancel" tooltip ="Retour" )
8585 q-tooltip.text-body2 Retour
8686 q-separator.q-mx-sm ( vertical )
87- 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" )
87+ slot( name ="right-panel-actions-content" v-if ="defaultRightPanelButton" : target= "target" : isNew = "isNew" : crud = "crud" )
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
94- slot( name ="right-panel-actions-content-after" : target= "target" )
94+ slot( name ="right-panel-actions-content-after" : target= "target" : isNew = "isNew" : crud = "crud" )
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'
113113import { crush , pick } from ' radash'
114114import { routerKey } from ' vue-router'
115115
116+ const NEW_ID = ' 000000000000000000000000'
117+
116118defineOptions ({
117119 name: ' 2pan' ,
118120})
@@ -190,6 +192,7 @@ const props = defineProps({
190192 update: <T >(r : T ) => Promise <T >
191193 delete: <T >(r : T ) => Promise <T >
192194 cancel: () => Promise <void >
195+ add: <T >() => Promise <T >
193196 onMounted: <T = object >() => Promise <T | null >
194197 }>,
195198 default: {
@@ -207,6 +210,7 @@ const props = defineProps({
207210 },
208211
209212 cancel : async () => { },
213+ add : async () => { return {} },
210214 onMounted : async () => { },
211215 },
212216 },
@@ -222,6 +226,10 @@ watch(simple, (v) => {
222226})
223227const splitterModel = ref (isSimple .value ? 100 : 50 )
224228
229+ const leftBtnHidden = computed (() => {
230+ return isSimple .value || splitterModel .value > 40
231+ })
232+
225233const visibleColumnsInternal = ref (props .visibleColumns )
226234const visibleColumnsComputed = computed ({
227235 get() {
@@ -246,11 +254,12 @@ const { pagination, onRequest, initializePagination } = usePagination()
246254initializePagination (props .total )
247255
248256const emit = defineEmits ([' create' , ' refresh' , ' read' , ' update' , ' delete' ])
249- const debug = process . env . NODE_ENV === ' development '
257+ const { debug } = useDebug ()
250258
251259const selected = ref ([])
252260const tab = ref (' ' )
253- const target = ref <null | object >(null )
261+ const targetId = ref <null | string >(route .query ?.read ? ` ${route .query ?.read } ` : null )
262+ const target = ref <object >({})
254263const daysjs = useDayjs ()
255264
256265watch (target , (t ) => {
@@ -275,39 +284,59 @@ async function refresh() {
275284
276285async function cancel() {
277286 await props .actions .cancel ()
278- target .value = null
287+ targetId .value = null
288+ target .value = {}
279289 selected .value = []
280- router .push ({ query: { ... route .query , read: undefined } })
290+ await router .push ({ query: { ... route .query , read: null } })
281291}
282292async function read(row ) {
293+ targetId .value = row ?._id
283294 const response = await props .actions .read (row )
284- target .value = response
295+ target .value = { ... response }
285296 emit (' read' , response )
286297}
287298
299+ async function add() {
300+ const read = NEW_ID
301+ targetId .value = read
302+ target .value = await props .actions .add () || {}
303+ await router .push ({ query: { ... route .query , read } })
304+ }
305+
288306async function create(row ) {
307+ console .log (' create' , row )
289308 const response = await props .actions .create (row )
290- target .value = response
309+ console .log (' response' , response )
310+ // target.value = response
311+ // targetId.value = response?._id
291312 emit (' create' , response )
313+ if (response ) cancel ()
292314}
293315
294316async function update(row ) {
317+ targetId .value = row ?._id
295318 const response = await props .actions .update (row )
296- target .value = response
319+ target .value = { ... response }
297320 emit (' update' , response )
298321}
299322
300323async function remove(row ) {
324+ // targetId.value = row?._id
301325 const response = await props .actions .delete (row )
302326 target .value = response
327+ // target.value = response
303328 emit (' delete' , response )
304329}
305330
331+ const isNew = computed (() => {
332+ return targetId .value === NEW_ID
333+ })
334+
306335const getTitle = computed (() => {
307336 const keys = Array .isArray (props .titleKey ) ? props .titleKey : [props .titleKey ]
308337 if (! target .value ) return ' '
309338 const crushed = crush (target .value )
310- const valuesList = target .value ? pick (crushed , keys ) : {}
339+ const valuesList = target .value ? pick (crushed , keys as any ) : {}
311340 return Object .values (valuesList ).join (' ' )
312341})
313342
@@ -327,9 +356,15 @@ defineExpose({
327356})
328357
329358onMounted (async () => {
359+ if (isNew .value ) {
360+ await add ()
361+ return
362+ }
330363 const newTarget = await props .actions .onMounted ()
364+ // console.log('newTarget', newTarget)
331365 if (newTarget ) {
332- target .value = newTarget
366+ target .value = { ... newTarget }
367+ targetId .value = (newTarget as any )?._id
333368 }
334369})
335370 </script >
0 commit comments