lkt-item-crud 1.1.29 → 1.2.1

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.
@@ -1,253 +1,260 @@
1
1
  <script setup lang="ts">
2
- import {ref, watch, useSlots, computed, nextTick} from "vue";
3
- import {httpCall, HTTPResponse} from "lkt-http-client";
4
- import {DataState} from "lkt-data-state";
5
- import {debug} from "../functions/debug";
6
- import {LktObject} from "lkt-ts-interfaces";
7
- import {ModalCallbackConfig} from "../types/ModalCallbackConfig";
8
- import {runModalCallback} from "../functions/modalCallbacks";
9
- import {__} from "lkt-i18n";
10
- import {Settings} from "../settings/Settings";
11
-
12
- const props = withDefaults(defineProps<{
13
- modelValue: LktObject
14
- title: string
15
- editModeText: string
16
- saveText: string
17
- saveIcon: string
18
- dropText: string
19
- dropIcon: string
20
- hiddenSave: boolean
21
- hiddenDrop: boolean
22
- hiddenButtons: boolean
23
- readResource: string
24
- createResource: string
25
- updateResource: string
26
- dropResource: string
27
- readData: LktObject
28
- createData: LktObject
29
- updateData: LktObject
30
- dropData: LktObject
31
- isCreate: boolean
32
- createConfirm: string
33
- updateConfirm: string
34
- dropConfirm: string
35
- createConfirmData: LktObject
36
- updateConfirmData: LktObject
37
- dropConfirmData: LktObject
38
- createDisabled: boolean
39
- updateDisabled: boolean
40
- dropDisabled: boolean
41
- saveValidator: Function
42
- beforeEmitUpdate: Function | undefined
43
- onCreate: Function | undefined
44
- onUpdate: Function | undefined
45
- insideModal: boolean
46
- hideSwitchEdition: boolean
47
- dataStateConfig: LktObject
48
- onCreateModalCallbacks: ModalCallbackConfig[]
49
- onUpdateModalCallbacks: ModalCallbackConfig[]
50
- onDropModalCallbacks: ModalCallbackConfig[]
51
- editing: boolean
52
- }>(), {
53
- modelValue: () => ({}),
54
- title: '',
55
- editModeText: 'Edition Mode',
56
- saveText: 'Save',
57
- dropText: 'Delete',
58
- saveIcon: () => Settings.defaultSaveIcon,
59
- dropIcon: () => Settings.defaultDropIcon,
60
- hiddenSave: false,
61
- hiddenDrop: false,
62
- hiddenButtons: false,
63
- readResource: '',
64
- createResource: '',
65
- updateResource: '',
66
- dropResource: '',
67
- readData: () => ({}),
68
- createData: () => ({}),
69
- updateData: () => ({}),
70
- dropData: () => ({}),
71
- isCreate: false,
72
- createConfirm: '',
73
- updateConfirm: '',
74
- dropConfirm: '',
75
- createConfirmData: () => ({}),
76
- updateConfirmData: () => ({}),
77
- dropConfirmData: () => ({}),
78
- createDisabled: false,
79
- updateDisabled: false,
80
- dropDisabled: false,
81
- saveValidator: () => true,
82
- beforeEmitUpdate: undefined,
83
- onCreate: undefined,
84
- onUpdate: undefined,
85
- insideModal: false,
86
- hideSwitchEdition: false,
87
- dataStateConfig: () => ({}),
88
- onCreateModalCallbacks: () => [],
89
- onUpdateModalCallbacks: () => [],
90
- onDropModalCallbacks: () => [],
91
- editing: false,
92
- });
93
-
94
- const slots = useSlots();
95
-
96
- const emit = defineEmits(['update:modelValue', 'update:isCreate', 'update:editing', 'read', 'create', 'update', 'drop', 'before-save', 'perms', 'error', 'modified-data']);
97
-
98
- let basePerms: string[] = [];
99
-
100
- const isLoading = ref(true),
101
- item = ref(props.modelValue),
102
- perms = ref(basePerms),
103
- editMode = ref(props.editing),
104
- httpSuccessRead = ref(false),
105
- showStoreMessage = ref(false),
106
- httpStatus = ref(200),
107
- saveButton = ref(null),
108
- dropButton = ref(null),
109
- dataState = ref(new DataState(item.value, props.dataStateConfig)),
110
- readDataState = ref(new DataState(props.readData)),
111
- createMode = ref(props.isCreate),
112
- itemBeingEdited = ref(false);
113
-
114
- const saveConfirm = computed(() => {
115
- return createMode.value
116
- ? props.createConfirm
117
- : props.updateConfirm;
118
- }),
119
- confirmData = computed(() => {
120
- return createMode.value
121
- ? props.createConfirmData
122
- : props.updateConfirmData;
123
- }),
124
- saveResource = computed(() => {
125
- return createMode.value
126
- ? props.createResource
127
- : props.updateResource;
128
- }),
129
- saveData = computed(() => {
130
- if (createMode.value) {
131
- return {...props.createData, ...JSON.parse(JSON.stringify(item.value))};
132
- }
133
- return {...props.updateData, ...JSON.parse(JSON.stringify(item.value))};
134
- }),
135
- saveDisabled = computed(() => {
136
- return createMode.value
137
- ? props.createDisabled
138
- : props.updateDisabled;
139
- }),
140
- canUpdate = computed(() => !createMode.value && perms.value.includes('update')),
141
- canDrop = computed(() => !createMode.value && perms.value.includes('drop'));
142
-
143
- const fetchItem = async () => {
144
- debug('fetchItem');
145
- isLoading.value = true;
146
- httpStatus.value = -1;
147
- showStoreMessage.value = false;
148
- try {
149
- const r = await httpCall(props.readResource, props.readData);
150
- debug('fetchItem -> response', r);
151
- isLoading.value = false;
152
- httpStatus.value = r.httpStatus;
153
- if (!r.success) {
154
- httpSuccessRead.value = false;
2
+ import { ref, watch, useSlots, computed, nextTick } from 'vue';
3
+ import { httpCall, HTTPResponse } from 'lkt-http-client';
4
+ import { DataState } from 'lkt-data-state';
5
+ import { debug } from '../functions/debug';
6
+ import { LktObject } from 'lkt-ts-interfaces';
7
+ import { ModalCallbackConfig } from '../types/ModalCallbackConfig';
8
+ import { runModalCallback } from '../functions/modalCallbacks';
9
+ import { __ } from 'lkt-i18n';
10
+ import { Settings } from '../settings/Settings';
11
+
12
+ const props = withDefaults(defineProps<{
13
+ modelValue: LktObject
14
+ title: string
15
+ editModeText: string
16
+ saveText: string
17
+ saveIcon: string
18
+ dropText: string
19
+ dropIcon: string
20
+ hiddenSave: boolean
21
+ hiddenDrop: boolean
22
+ hiddenButtons: boolean
23
+ readResource: string
24
+ createResource: string
25
+ updateResource: string
26
+ dropResource: string
27
+ readData: LktObject
28
+ createData: LktObject
29
+ updateData: LktObject
30
+ dropData: LktObject
31
+ isCreate: boolean
32
+ createConfirm: string
33
+ updateConfirm: string
34
+ dropConfirm: string
35
+ createConfirmData: LktObject
36
+ updateConfirmData: LktObject
37
+ dropConfirmData: LktObject
38
+ createDisabled: boolean
39
+ updateDisabled: boolean
40
+ dropDisabled: boolean
41
+ saveValidator: Function
42
+ beforeEmitUpdate: Function | undefined
43
+ onCreate: Function | undefined
44
+ onUpdate: Function | undefined
45
+ insideModal: boolean
46
+ hideSwitchEdition: boolean
47
+ dataStateConfig: LktObject
48
+ onCreateModalCallbacks: ModalCallbackConfig[]
49
+ onUpdateModalCallbacks: ModalCallbackConfig[]
50
+ onDropModalCallbacks: ModalCallbackConfig[]
51
+ editing: boolean
52
+
53
+ // Modal props
54
+ size: string
55
+ preTitle: string
56
+ showClose: boolean
57
+ disabledClose: boolean
58
+ disabledVeilClick: boolean
59
+ modalName: string
60
+ modalKey: string
61
+ zIndex: number
62
+ editedCloseConfirm: string
63
+ editedCloseConfirmKey: string|number
64
+ beforeClose: Function|undefined
65
+
66
+ }>(), {
67
+ modelValue: () => ({}),
68
+ title: '',
69
+ editModeText: 'Edition Mode',
70
+ saveText: 'Save',
71
+ dropText: 'Delete',
72
+ saveIcon: () => Settings.defaultSaveIcon,
73
+ dropIcon: () => Settings.defaultDropIcon,
74
+ hiddenSave: false,
75
+ hiddenDrop: false,
76
+ hiddenButtons: false,
77
+ readResource: '',
78
+ createResource: '',
79
+ updateResource: '',
80
+ dropResource: '',
81
+ readData: () => ({}),
82
+ createData: () => ({}),
83
+ updateData: () => ({}),
84
+ dropData: () => ({}),
85
+ isCreate: false,
86
+ createConfirm: '',
87
+ updateConfirm: '',
88
+ dropConfirm: '',
89
+ createConfirmData: () => ({}),
90
+ updateConfirmData: () => ({}),
91
+ dropConfirmData: () => ({}),
92
+ createDisabled: false,
93
+ updateDisabled: false,
94
+ dropDisabled: false,
95
+ saveValidator: () => true,
96
+ beforeEmitUpdate: undefined,
97
+ onCreate: undefined,
98
+ onUpdate: undefined,
99
+ insideModal: false,
100
+ hideSwitchEdition: false,
101
+ dataStateConfig: () => ({}),
102
+ onCreateModalCallbacks: () => [],
103
+ onUpdateModalCallbacks: () => [],
104
+ onDropModalCallbacks: () => [],
105
+ editing: false,
106
+
107
+ // Modal props
108
+ size: '',
109
+ preTitle: '',
110
+ showClose: true,
111
+ disabledClose: false,
112
+ disabledVeilClick: false,
113
+ modalName: '',
114
+ modalKey: '_',
115
+ zIndex: 500,
116
+ editedCloseConfirm: '',
117
+ editedCloseConfirmKey: '_',
118
+ beforeClose: undefined,
119
+ });
120
+
121
+ const slots = useSlots();
122
+
123
+ const emit = defineEmits(['update:modelValue', 'update:isCreate', 'update:editing', 'read', 'create', 'update', 'drop', 'before-save', 'perms', 'error', 'modified-data']);
124
+
125
+ let basePerms: string[] = [];
126
+
127
+ const isLoading = ref(true),
128
+ item = ref(props.modelValue),
129
+ perms = ref(basePerms),
130
+ editMode = ref(props.editing),
131
+ httpSuccessRead = ref(false),
132
+ showStoreMessage = ref(false),
133
+ httpStatus = ref(200),
134
+ saveButton = ref(null),
135
+ dropButton = ref(null),
136
+ dataState = ref(new DataState(item.value, props.dataStateConfig)),
137
+ readDataState = ref(new DataState(props.readData)),
138
+ createMode = ref(props.isCreate),
139
+ itemBeingEdited = ref(false);
140
+
141
+ const saveConfirm = computed(() => {
142
+ return createMode.value
143
+ ? props.createConfirm
144
+ : props.updateConfirm;
145
+ }),
146
+ confirmData = computed(() => {
147
+ return createMode.value
148
+ ? props.createConfirmData
149
+ : props.updateConfirmData;
150
+ }),
151
+ saveResource = computed(() => {
152
+ return createMode.value
153
+ ? props.createResource
154
+ : props.updateResource;
155
+ }),
156
+ saveData = computed(() => {
157
+ if (createMode.value) {
158
+ return { ...props.createData, ...JSON.parse(JSON.stringify(item.value)) };
159
+ }
160
+ return { ...props.updateData, ...JSON.parse(JSON.stringify(item.value)) };
161
+ }),
162
+ saveDisabled = computed(() => {
163
+ return createMode.value
164
+ ? props.createDisabled
165
+ : props.updateDisabled;
166
+ }),
167
+ canUpdate = computed(() => !createMode.value && perms.value.includes('update')),
168
+ canDrop = computed(() => !createMode.value && perms.value.includes('drop'));
169
+
170
+ const fetchItem = async () => {
171
+ debug('fetchItem');
172
+ isLoading.value = true;
173
+ httpStatus.value = -1;
174
+ showStoreMessage.value = false;
175
+ try {
176
+ const r = await httpCall(props.readResource, props.readData);
177
+ debug('fetchItem -> response', r);
178
+ isLoading.value = false;
155
179
  httpStatus.value = r.httpStatus;
156
- emit('error', r.httpStatus);
180
+ if (!r.success) {
181
+ httpSuccessRead.value = false;
182
+ httpStatus.value = r.httpStatus;
183
+ emit('error', r.httpStatus);
184
+ return;
185
+ }
186
+ httpSuccessRead.value = true;
187
+ item.value = r.data;
188
+ perms.value = r.perms;
189
+ dataState.value.increment(item.value).turnStoredIntoOriginal();
190
+ readDataState.value.turnStoredIntoOriginal();
191
+ emit('read', r);
192
+ } catch (e) {
193
+ isLoading.value = false;
194
+ httpSuccessRead.value = false;
195
+ httpStatus.value = 404;
196
+ emit('error', 404);
157
197
  return;
158
198
  }
199
+ };
200
+
201
+
202
+ watch(() => props.modelValue, v => {
203
+ item.value = v;
204
+ dataState.value.increment(v);
205
+ }, { deep: true });
206
+
207
+ watch(item, (v) => {
208
+ itemBeingEdited.value = true;
209
+ debug('item updated ->', item.value);
210
+ if (typeof props.beforeEmitUpdate === 'function') {
211
+ debug('item updated -> has beforeEmitUpdate');
212
+ let override = props.beforeEmitUpdate(item.value);
213
+ debug('item updated -> override with: ', override);
214
+ if (typeof override === 'object') item.value = override;
215
+ }
216
+ emit('update:modelValue', item.value);
217
+ debug('item updated -> update dataState');
218
+ dataState.value.increment(v);
219
+ nextTick(() => itemBeingEdited.value = false);
220
+ }, { deep: true });
221
+
222
+ watch(perms, () => emit('perms', perms.value));
223
+
224
+ const ableToSave = computed(() => {
225
+ if (saveDisabled.value) return false;
226
+ if (!createMode.value && !canUpdate.value) return false;
227
+
228
+ if (typeof props.saveValidator === 'function' && !props.saveValidator(item.value)) return false;
229
+
230
+ return dataState.value.changed();
231
+ });
232
+ watch(ableToSave, (v) => emit('modified-data', v));
233
+ watch(createMode, (v) => emit('update:isCreate', v));
234
+
235
+ watch(() => props.readData, v => {
236
+ readDataState.value.increment(v);
237
+ if (readDataState.value.changed()) fetchItem();
238
+ });
239
+
240
+ watch(() => props.editing, v => {
241
+ debug('editing updated -> updating editMode', v);
242
+ editMode.value = v;
243
+ });
244
+ watch(editMode, (v) => {
245
+ debug('editMode updated -> emit update', v);
246
+ emit('update:editing', v);
247
+ });
248
+
249
+ // Fetch item
250
+ if (props.readResource && !createMode.value) fetchItem();
251
+ else if (createMode.value) {
159
252
  httpSuccessRead.value = true;
160
- item.value = r.data;
161
- perms.value = r.perms;
162
- dataState.value.increment(item.value).turnStoredIntoOriginal();
163
- readDataState.value.turnStoredIntoOriginal();
164
- emit('read', r);
165
- } catch (e) {
253
+ editMode.value = true;
166
254
  isLoading.value = false;
167
- httpSuccessRead.value = false;
168
- httpStatus.value = 404;
169
- emit('error', 404);
170
- return;
171
- }
172
- }
173
-
174
-
175
- watch(() => props.modelValue, v => {
176
- item.value = v;
177
- dataState.value.increment(v);
178
- }, {deep: true});
179
-
180
- watch(item, (v) => {
181
- itemBeingEdited.value = true;
182
- debug('item updated ->', item.value);
183
- if (typeof props.beforeEmitUpdate === 'function') {
184
- debug('item updated -> has beforeEmitUpdate');
185
- let override = props.beforeEmitUpdate(item.value);
186
- debug('item updated -> override with: ', override);
187
- if (typeof override === 'object') item.value = override;
188
255
  }
189
- emit('update:modelValue', item.value);
190
- debug('item updated -> update dataState');
191
- dataState.value.increment(v);
192
- nextTick(() => itemBeingEdited.value = false)
193
- }, {deep: true});
194
-
195
- watch(perms, () => emit('perms', perms.value));
196
-
197
- const ableToSave = computed(() => {
198
- if (saveDisabled.value) return false;
199
- if (!createMode.value && !canUpdate.value) return false;
200
-
201
- if (typeof props.saveValidator === 'function' && !props.saveValidator(item.value)) return false;
202
-
203
- return dataState.value.changed();
204
- });
205
- watch(ableToSave, (v) => emit('modified-data', v));
206
- watch(createMode, (v) => emit('update:isCreate', v));
207
-
208
- watch(() => props.readData, v => {
209
- readDataState.value.increment(v);
210
- if (readDataState.value.changed()) fetchItem()
211
- })
212
-
213
- watch(() => props.editing, v => {
214
- debug('editing updated -> updating editMode', v);
215
- editMode.value = v;
216
- });
217
- watch(editMode, (v) => {
218
- debug('editMode updated -> emit update', v);
219
- emit('update:editing', v)
220
- });
221
-
222
- // Fetch item
223
- if (props.readResource && !createMode.value) fetchItem();
224
- else if (createMode.value) {
225
- httpSuccessRead.value = true;
226
- editMode.value = true;
227
- isLoading.value = false;
228
- }
229
-
230
- const onDrop = ($event: PointerEvent, r: HTTPResponse) => {
231
- isLoading.value = false;
232
- httpStatus.value = r.httpStatus;
233
- if (!r.success) {
234
- showStoreMessage.value = true;
235
- emit('error', r.httpStatus);
236
- return;
237
- }
238
- showStoreMessage.value = true;
239
- if (props.onDropModalCallbacks.length > 0) {
240
- debug('onDrop -> has onDropModalCallbacks');
241
- props.onDropModalCallbacks.forEach(cb => {
242
- runModalCallback(cb);
243
- });
244
- }
245
- emit('drop', r)
246
- },
247
- onSave = ($event: PointerEvent, r: HTTPResponse) => {
248
- debug('onSave -> received response:', r);
249
- emit('before-save');
250
- if (saveResource.value) {
256
+
257
+ const onDrop = ($event: PointerEvent, r: HTTPResponse) => {
251
258
  isLoading.value = false;
252
259
  httpStatus.value = r.httpStatus;
253
260
  if (!r.success) {
@@ -256,186 +263,247 @@ const onDrop = ($event: PointerEvent, r: HTTPResponse) => {
256
263
  return;
257
264
  }
258
265
  showStoreMessage.value = true;
259
- }
260
- let emits: 'create' | 'update' = createMode.value ? 'create' : 'update';
261
- if (!createMode.value) {
262
- debug('onSave -> turn stored data into original');
263
- dataState.value.turnStoredIntoOriginal();
264
- }
265
-
266
- if (emits === 'create') {
267
- if (typeof props.onCreate === 'function') {
268
- debug('onSave -> trigger onCreate callback');
269
- props.onCreate(r);
270
- if (props.onCreateModalCallbacks.length > 0) {
271
- debug('onSave -> has onCreateModalCallbacks');
272
- props.onCreateModalCallbacks.forEach(cb => {
273
- runModalCallback(cb);
274
- });
266
+ if (props.onDropModalCallbacks.length > 0) {
267
+ debug('onDrop -> has onDropModalCallbacks');
268
+ props.onDropModalCallbacks.forEach(cb => {
269
+ runModalCallback(cb);
270
+ });
271
+ }
272
+ emit('drop', r);
273
+ },
274
+ onSave = ($event: PointerEvent, r: HTTPResponse) => {
275
+ debug('onSave -> received response:', r);
276
+ emit('before-save');
277
+ if (saveResource.value) {
278
+ isLoading.value = false;
279
+ httpStatus.value = r.httpStatus;
280
+ if (!r.success) {
281
+ showStoreMessage.value = true;
282
+ emit('error', r.httpStatus);
283
+ return;
275
284
  }
285
+ showStoreMessage.value = true;
276
286
  }
277
- } else {
278
- if (typeof props.onUpdate === 'function') {
279
- debug('onSave -> trigger onUpdate callback');
280
- props.onUpdate(r);
281
- if (props.onUpdateModalCallbacks.length > 0) {
282
- debug('onSave -> has onUpdateModalCallbacks');
283
- props.onUpdateModalCallbacks.forEach(cb => {
284
- runModalCallback(cb);
285
- });
287
+ let emits: 'create' | 'update' = createMode.value ? 'create' : 'update';
288
+ if (!createMode.value) {
289
+ debug('onSave -> turn stored data into original');
290
+ dataState.value.turnStoredIntoOriginal();
291
+ }
292
+
293
+ if (emits === 'create') {
294
+ if (typeof props.onCreate === 'function') {
295
+ debug('onSave -> trigger onCreate callback');
296
+ props.onCreate(r);
297
+ if (props.onCreateModalCallbacks.length > 0) {
298
+ debug('onSave -> has onCreateModalCallbacks');
299
+ props.onCreateModalCallbacks.forEach(cb => {
300
+ runModalCallback(cb);
301
+ });
302
+ }
303
+ }
304
+ } else {
305
+ if (typeof props.onUpdate === 'function') {
306
+ debug('onSave -> trigger onUpdate callback');
307
+ props.onUpdate(r);
308
+ if (props.onUpdateModalCallbacks.length > 0) {
309
+ debug('onSave -> has onUpdateModalCallbacks');
310
+ props.onUpdateModalCallbacks.forEach(cb => {
311
+ runModalCallback(cb);
312
+ });
313
+ }
286
314
  }
287
315
  }
288
- }
289
316
 
290
- if (!props.insideModal && r.autoReloadId) {
291
- debug('onSave -> autoReloadId detected: ', r.autoReloadId);
292
- props.readData['id'] = r.autoReloadId;
293
- debug('onSave -> turning off create mode');
294
- createMode.value = false;
295
- fetchItem();
296
- }
297
- emit(emits, r)
298
- },
299
- onButtonLoading = () => {
300
- isLoading.value = true;
301
- httpStatus.value = -1;
302
- },
303
- onButtonLoaded = () => {
304
- isLoading.value = false;
305
- },
306
- doSave = () => {
307
- // @ts-ignore
308
- if (saveButton.value && typeof saveButton.value.click === 'function') saveButton.value.click();
309
- },
310
- doDrop = () => {
311
- // @ts-ignore
312
- if (dropButton.value && typeof dropButton.value.click === 'function') dropButton.value.click();
313
- }
317
+ if (!props.insideModal && r.autoReloadId) {
318
+ debug('onSave -> autoReloadId detected: ', r.autoReloadId);
319
+ props.readData['id'] = r.autoReloadId;
320
+ debug('onSave -> turning off create mode');
321
+ createMode.value = false;
322
+ fetchItem();
323
+ }
324
+ emit(emits, r);
325
+ },
326
+ onButtonLoading = () => {
327
+ isLoading.value = true;
328
+ httpStatus.value = -1;
329
+ },
330
+ onButtonLoaded = () => {
331
+ isLoading.value = false;
332
+ },
333
+ doSave = () => {
334
+ // @ts-ignore
335
+ if (saveButton.value && typeof saveButton.value.click === 'function') saveButton.value.click();
336
+ },
337
+ doDrop = () => {
338
+ // @ts-ignore
339
+ if (dropButton.value && typeof dropButton.value.click === 'function') dropButton.value.click();
340
+ };
314
341
 
315
- defineExpose({
316
- doDrop,
317
- doRefresh: fetchItem,
318
- doSave,
319
- hasModifiedData: () => dataState.value.changed()
320
- });
342
+ defineExpose({
343
+ doDrop,
344
+ doRefresh: fetchItem,
345
+ doSave,
346
+ hasModifiedData: () => dataState.value.changed(),
347
+ });
321
348
 
322
- const showDropButton = computed(() => {
323
- if (!canUpdate.value && canDrop.value) return true;
324
349
 
325
- return !props.hiddenDrop
326
- && !isLoading.value
327
- && editMode.value
328
- && httpSuccessRead.value;
329
- }),
330
- showSaveButton = computed(() => {
331
350
 
332
- if (dataState.value.changed()) return true;
333
- if (isLoading.value) return false;
351
+ const closeConfirm = computed(() => {
352
+ return dataState.value.changed() ? props.editedCloseConfirm : '';
353
+ })
334
354
 
335
- if (createMode.value) return true;
355
+ const showDropButton = computed(() => {
356
+ if (!canUpdate.value && canDrop.value) return true;
336
357
 
337
- return !props.hiddenSave
338
- && editMode.value
339
- && httpSuccessRead.value;
340
- }),
341
- showSwitchButton = computed(() => {
342
- if (props.hideSwitchEdition) return false;
343
- if (!canUpdate.value && !canDrop.value) return false;
344
- if (!canUpdate.value && canDrop.value) return false;
345
-
346
- return !isLoading.value
347
- && !createMode.value
348
- && httpSuccessRead.value
349
- && !(props.dropDisabled && props.updateDisabled);
350
- }),
351
- showButtons = computed(() => {
352
- return !props.hiddenButtons && (showSaveButton.value || showDropButton.value || showSwitchButton.value);
358
+ return !props.hiddenDrop
359
+ && !isLoading.value
360
+ && editMode.value
361
+ && httpSuccessRead.value;
362
+ }),
363
+ showSaveButton = computed(() => {
364
+
365
+ if (dataState.value.changed()) return true;
366
+ if (isLoading.value) return false;
367
+
368
+ if (createMode.value) return true;
369
+
370
+ return !props.hiddenSave
371
+ && editMode.value
372
+ && httpSuccessRead.value;
373
+ }),
374
+ showSwitchButton = computed(() => {
375
+ if (props.hideSwitchEdition) return false;
376
+ if (!canUpdate.value && !canDrop.value) return false;
377
+ if (!canUpdate.value && canDrop.value) return false;
378
+
379
+ return !isLoading.value
380
+ && !createMode.value
381
+ && httpSuccessRead.value
382
+ && !(props.dropDisabled && props.updateDisabled);
383
+ }),
384
+ showButtons = computed(() => {
385
+ return !props.hiddenButtons && (showSaveButton.value || showDropButton.value || showSwitchButton.value);
386
+ }),
387
+ computedTitle = computed(() => {
388
+ if (props.title.startsWith('__:')) {
389
+ return String(__(props.title.substring(3)));
390
+ }
391
+ return props.title;
392
+ }),
393
+ displayHeader = computed(() => {
394
+ if (isLoading.value) return false;
395
+
396
+ return computedTitle.value.length > 0 || !!slots['post-title'];
397
+ }),
398
+ computedContainerTag = computed(() => {
399
+ if (props.insideModal) return 'lkt-modal';
400
+ return 'section';
353
401
  }),
354
- computedTitle = computed(() => {
355
- if (props.title.startsWith('__:')) {
356
- return String(__(props.title.substring(3)));
402
+ computedContainerAttrs = computed(() => {
403
+ if (computedContainerTag.value === 'lkt-modal') {
404
+ return {
405
+ 'modal-name': props.modalName,
406
+ 'modal-key': props.modalKey,
407
+ 'z-index': props.zIndex,
408
+ 'pre-title': props.preTitle,
409
+ 'show-close': props.showClose,
410
+ 'before-close': props.beforeClose,
411
+ 'disabled-close': props.disabledClose,
412
+ 'disabled-veil-click': props.disabledVeilClick,
413
+ 'close-confirm': closeConfirm.value,
414
+ 'close-confirm-key': props.editedCloseConfirmKey,
415
+ title: props.title,
416
+ size: props.size,
417
+ }
357
418
  }
358
- return props.title;
359
- }),
360
- displayHeader = computed(() => {
361
- if (isLoading.value) return false;
362
-
363
- return computedTitle.value.length > 0 || !!slots['post-title'];
419
+ return {};
364
420
  });
365
421
  </script>
366
422
 
367
423
  <template>
368
- <article class="lkt-item-crud">
369
- <header class="lkt-item-crud_header" v-if="displayHeader">
370
- <div class="lkt-item-crud_header-slot" v-if="slots['pre-title']">
371
- <slot name="pre-title" v-bind:item="item" v-bind:loading="isLoading"></slot>
372
- </div>
373
- <h1 class="lkt-item-crud_header-title" v-if="computedTitle.length > 0">{{ computedTitle }}</h1>
374
- <div class="lkt-item-crud_header-slot" v-if="slots['post-title']">
375
- <slot name="post-title" v-bind:item="item" v-bind:loading="isLoading"></slot>
424
+ <component
425
+ :is="computedContainerTag"
426
+ v-bind="computedContainerAttrs"
427
+ >
428
+ <article class="lkt-item-crud">
429
+ <header class="lkt-item-crud_header" v-if="!insideModal && displayHeader">
430
+ <div class="lkt-item-crud_header-slot" v-if="slots['pre-title']">
431
+ <slot name="pre-title" :item="item" :loading="isLoading"></slot>
432
+ </div>
433
+ <h1 class="lkt-item-crud_header-title" v-if="computedTitle.length > 0">{{ computedTitle }}</h1>
434
+ <div class="lkt-item-crud_header-slot" v-if="slots['post-title']">
435
+ <slot name="post-title" :item="item" :loading="isLoading"></slot>
436
+ </div>
437
+ </header>
438
+ <div class="lkt-item-crud-buttons" v-show="showButtons">
439
+ <lkt-button
440
+ :ref="(el:any) => saveButton = el"
441
+ v-show="showSaveButton"
442
+ palette="success"
443
+ :disabled="!ableToSave"
444
+ :confirm-modal="saveConfirm"
445
+ :confirm-data="confirmData"
446
+ :resource="saveResource"
447
+ :resource-data="saveData"
448
+ :text="slots['button-save'] ? '' : saveText"
449
+ :icon="slots['button-save'] ? '' : saveIcon"
450
+ v-on:loading="onButtonLoading"
451
+ v-on:loaded="onButtonLoaded"
452
+ v-on:click="onSave">
453
+ <slot v-if="!!slots['button-save']" name="button-save" :item="item"
454
+ :edit-mode="editMode"
455
+ :is-create="createMode"
456
+ :can-update="canUpdate"
457
+ :can-drop="canDrop"></slot>
458
+ </lkt-button>
459
+
460
+ <lkt-button
461
+ :ref="(el:any) => dropButton = el"
462
+ v-show="showDropButton"
463
+ v-if="!createMode"
464
+ palette="danger"
465
+ :disabled="dropDisabled || !canDrop"
466
+ :confirm-modal="dropConfirm"
467
+ :confirm-data="dropConfirmData"
468
+ :resource="dropResource"
469
+ :resource-data="dropData"
470
+ :text="slots['button-drop'] ? '' : dropText"
471
+ :icon="slots['button-drop'] ? '' : dropIcon"
472
+ v-on:loading="onButtonLoading"
473
+ v-on:loaded="onButtonLoaded"
474
+ v-on:click="onDrop">
475
+ <slot v-if="!!slots['button-drop']" name="button-drop" :item="item"
476
+ :edit-mode="editMode"
477
+ :is-create="createMode"
478
+ :can-update="canUpdate"
479
+ :can-drop="canDrop"></slot>
480
+ </lkt-button>
481
+
482
+ <div class="lkt-item-crud-buttons" v-if="slots.buttons" v-show="editMode">
483
+ <slot name="buttons"/>
484
+ </div>
485
+
486
+ <lkt-button
487
+ v-show="showSwitchButton"
488
+ v-model:checked="editMode"
489
+ class="lkt-item-crud--switch-mode-button"
490
+ show-switch
491
+ :text="editModeText"/>
376
492
  </div>
377
- </header>
378
- <div class="lkt-item-crud-buttons" v-show="showButtons">
379
- <lkt-button
380
- :ref="(el:any) => dropButton = el"
381
- v-show="showDropButton"
382
- v-if="!createMode"
383
- palette="danger"
384
- v-bind:disabled="dropDisabled || !canDrop"
385
- v-bind:confirm-modal="dropConfirm"
386
- v-bind:confirm-data="dropConfirmData"
387
- v-bind:resource="dropResource"
388
- v-bind:resource-data="dropData"
389
- :text="slots['button-drop'] ? '' : dropText"
390
- :icon="slots['button-drop'] ? '' : dropIcon"
391
- v-on:loading="onButtonLoading"
392
- v-on:loaded="onButtonLoaded"
393
- v-on:click="onDrop">
394
- <slot v-if="!!slots['button-drop']" name="button-drop" v-bind:item="item"
395
- v-bind:edit-mode="editMode"
396
- v-bind:is-create="createMode"
397
- v-bind:can-update="canUpdate"
398
- v-bind:can-drop="canDrop"></slot>
399
- </lkt-button>
400
-
401
- <lkt-button
402
- :ref="(el:any) => saveButton = el"
403
- v-show="showSaveButton"
404
- palette="success"
405
- v-bind:disabled="!ableToSave"
406
- v-bind:confirm-modal="saveConfirm"
407
- v-bind:confirm-data="confirmData"
408
- v-bind:resource="saveResource"
409
- v-bind:resource-data="saveData"
410
- :text="slots['button-save'] ? '' : saveText"
411
- :icon="slots['button-save'] ? '' : saveIcon"
412
- v-on:loading="onButtonLoading"
413
- v-on:loaded="onButtonLoaded"
414
- v-on:click="onSave">
415
- <slot v-if="!!slots['button-save']" name="button-save" v-bind:item="item"
416
- v-bind:edit-mode="editMode"
417
- v-bind:is-create="createMode"
418
- v-bind:can-update="canUpdate"
419
- v-bind:can-drop="canDrop"></slot>
420
- </lkt-button>
421
-
422
- <lkt-field-switch
423
- v-show="showSwitchButton" v-model="editMode"
424
- :label="editModeText"></lkt-field-switch>
425
- </div>
426
- <div class="lkt-item-crud_content" v-if="!isLoading">
427
- <div v-if="httpSuccessRead" class="lkt-grid-1">
428
- <lkt-http-info :code="httpStatus" v-if="showStoreMessage" quick
429
- :palette="httpStatus === 200 ? 'success' : 'danger'" can-close
430
- v-on:close="showStoreMessage = false"></lkt-http-info>
431
- <slot name="item" v-bind:item="item" v-bind:loading="isLoading" v-bind:edit-mode="editMode"
432
- v-bind:is-create="createMode"
433
- v-bind:can-update="canUpdate"
434
- v-bind:can-drop="canDrop"
435
- v-bind:item-being-edited="itemBeingEdited"></slot>
493
+ <div class="lkt-item-crud_content" v-if="!isLoading">
494
+ <div v-if="httpSuccessRead" class="lkt-grid-1">
495
+ <lkt-http-info :code="httpStatus" v-if="showStoreMessage" quick
496
+ :palette="httpStatus === 200 ? 'success' : 'danger'" can-close
497
+ v-on:close="showStoreMessage = false"></lkt-http-info>
498
+ <slot name="item" :item="item" :loading="isLoading" :edit-mode="editMode"
499
+ :is-create="createMode"
500
+ :can-update="canUpdate"
501
+ :can-drop="canDrop"
502
+ :item-being-edited="itemBeingEdited"></slot>
503
+ </div>
504
+ <lkt-http-info :code="httpStatus" v-else></lkt-http-info>
436
505
  </div>
437
- <lkt-http-info :code="httpStatus" v-else></lkt-http-info>
438
- </div>
439
- <lkt-loader v-if="isLoading"></lkt-loader>
440
- </article>
506
+ <lkt-loader v-if="isLoading"></lkt-loader>
507
+ </article>
508
+ </component>
441
509
  </template>