lkt-item-crud 1.1.29 → 1.2.0

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,237 @@ 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
- });
321
-
322
- const showDropButton = computed(() => {
323
- if (!canUpdate.value && canDrop.value) return true;
324
-
325
- return !props.hiddenDrop
326
- && !isLoading.value
327
- && editMode.value
328
- && httpSuccessRead.value;
329
- }),
330
- showSaveButton = computed(() => {
331
-
332
- if (dataState.value.changed()) return true;
333
- if (isLoading.value) return false;
334
-
335
- if (createMode.value) return true;
336
-
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);
353
- }),
354
- computedTitle = computed(() => {
355
- if (props.title.startsWith('__:')) {
356
- return String(__(props.title.substring(3)));
357
- }
358
- return props.title;
359
- }),
360
- displayHeader = computed(() => {
361
- if (isLoading.value) return false;
342
+ defineExpose({
343
+ doDrop,
344
+ doRefresh: fetchItem,
345
+ doSave,
346
+ hasModifiedData: () => dataState.value.changed(),
347
+ });
348
+
349
+ const showDropButton = computed(() => {
350
+ if (!canUpdate.value && canDrop.value) return true;
351
+
352
+ return !props.hiddenDrop
353
+ && !isLoading.value
354
+ && editMode.value
355
+ && httpSuccessRead.value;
356
+ }),
357
+ showSaveButton = computed(() => {
358
+
359
+ if (dataState.value.changed()) return true;
360
+ if (isLoading.value) return false;
362
361
 
363
- return computedTitle.value.length > 0 || !!slots['post-title'];
362
+ if (createMode.value) return true;
363
+
364
+ return !props.hiddenSave
365
+ && editMode.value
366
+ && httpSuccessRead.value;
367
+ }),
368
+ showSwitchButton = computed(() => {
369
+ if (props.hideSwitchEdition) return false;
370
+ if (!canUpdate.value && !canDrop.value) return false;
371
+ if (!canUpdate.value && canDrop.value) return false;
372
+
373
+ return !isLoading.value
374
+ && !createMode.value
375
+ && httpSuccessRead.value
376
+ && !(props.dropDisabled && props.updateDisabled);
377
+ }),
378
+ showButtons = computed(() => {
379
+ return !props.hiddenButtons && (showSaveButton.value || showDropButton.value || showSwitchButton.value);
380
+ }),
381
+ computedTitle = computed(() => {
382
+ if (props.title.startsWith('__:')) {
383
+ return String(__(props.title.substring(3)));
384
+ }
385
+ return props.title;
386
+ }),
387
+ displayHeader = computed(() => {
388
+ if (isLoading.value) return false;
389
+
390
+ return computedTitle.value.length > 0 || !!slots['post-title'];
391
+ }),
392
+ computedContainerTag = computed(() => {
393
+ if (props.insideModal) return 'lkt-modal';
394
+ return 'section';
364
395
  });
396
+
397
+ const closeConfirm = computed(() => {
398
+ return dataState.value.changed() ? props.editedCloseConfirm : '';
399
+ })
365
400
  </script>
366
401
 
367
402
  <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>
403
+ <component
404
+ :is="computedContainerTag"
405
+ :pre-title="preTitle"
406
+ :title="title"
407
+ :modal-name="modalName"
408
+ :modal-key="modalKey"
409
+ :z-index="zIndex"
410
+ :size="size"
411
+ :show-close="showClose"
412
+ :before-close="beforeClose"
413
+ :disabled-close="disabledClose"
414
+ :disabled-veil-click="disabledVeilClick"
415
+ :close-confirm="closeConfirm"
416
+ :close-confirm-key="editedCloseConfirmKey"
417
+ >
418
+ <article class="lkt-item-crud">
419
+ <header class="lkt-item-crud_header" v-if="!insideModal && displayHeader">
420
+ <div class="lkt-item-crud_header-slot" v-if="slots['pre-title']">
421
+ <slot name="pre-title" :item="item" :loading="isLoading"></slot>
422
+ </div>
423
+ <h1 class="lkt-item-crud_header-title" v-if="computedTitle.length > 0">{{ computedTitle }}</h1>
424
+ <div class="lkt-item-crud_header-slot" v-if="slots['post-title']">
425
+ <slot name="post-title" :item="item" :loading="isLoading"></slot>
426
+ </div>
427
+ </header>
428
+ <div class="lkt-item-crud-buttons" v-show="showButtons">
429
+ <lkt-button
430
+ :ref="(el:any) => saveButton = el"
431
+ v-show="showSaveButton"
432
+ palette="success"
433
+ :disabled="!ableToSave"
434
+ :confirm-modal="saveConfirm"
435
+ :confirm-data="confirmData"
436
+ :resource="saveResource"
437
+ :resource-data="saveData"
438
+ :text="slots['button-save'] ? '' : saveText"
439
+ :icon="slots['button-save'] ? '' : saveIcon"
440
+ v-on:loading="onButtonLoading"
441
+ v-on:loaded="onButtonLoaded"
442
+ v-on:click="onSave">
443
+ <slot v-if="!!slots['button-save']" name="button-save" :item="item"
444
+ :edit-mode="editMode"
445
+ :is-create="createMode"
446
+ :can-update="canUpdate"
447
+ :can-drop="canDrop"></slot>
448
+ </lkt-button>
449
+
450
+ <lkt-button
451
+ :ref="(el:any) => dropButton = el"
452
+ v-show="showDropButton"
453
+ v-if="!createMode"
454
+ palette="danger"
455
+ :disabled="dropDisabled || !canDrop"
456
+ :confirm-modal="dropConfirm"
457
+ :confirm-data="dropConfirmData"
458
+ :resource="dropResource"
459
+ :resource-data="dropData"
460
+ :text="slots['button-drop'] ? '' : dropText"
461
+ :icon="slots['button-drop'] ? '' : dropIcon"
462
+ v-on:loading="onButtonLoading"
463
+ v-on:loaded="onButtonLoaded"
464
+ v-on:click="onDrop">
465
+ <slot v-if="!!slots['button-drop']" name="button-drop" :item="item"
466
+ :edit-mode="editMode"
467
+ :is-create="createMode"
468
+ :can-update="canUpdate"
469
+ :can-drop="canDrop"></slot>
470
+ </lkt-button>
471
+
472
+ <div class="lkt-item-crud-buttons" v-if="slots.buttons" v-show="editMode">
473
+ <slot name="buttons"/>
474
+ </div>
475
+
476
+ <lkt-button
477
+ v-show="showSwitchButton"
478
+ v-model:checked="editMode"
479
+ class="lkt-item-crud--switch-mode-button"
480
+ show-switch
481
+ :text="editModeText"/>
376
482
  </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>
483
+ <div class="lkt-item-crud_content" v-if="!isLoading">
484
+ <div v-if="httpSuccessRead" class="lkt-grid-1">
485
+ <lkt-http-info :code="httpStatus" v-if="showStoreMessage" quick
486
+ :palette="httpStatus === 200 ? 'success' : 'danger'" can-close
487
+ v-on:close="showStoreMessage = false"></lkt-http-info>
488
+ <slot name="item" :item="item" :loading="isLoading" :edit-mode="editMode"
489
+ :is-create="createMode"
490
+ :can-update="canUpdate"
491
+ :can-drop="canDrop"
492
+ :item-being-edited="itemBeingEdited"></slot>
493
+ </div>
494
+ <lkt-http-info :code="httpStatus" v-else></lkt-http-info>
436
495
  </div>
437
- <lkt-http-info :code="httpStatus" v-else></lkt-http-info>
438
- </div>
439
- <lkt-loader v-if="isLoading"></lkt-loader>
440
- </article>
496
+ <lkt-loader v-if="isLoading"></lkt-loader>
497
+ </article>
498
+ </component>
441
499
  </template>