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