lkt-item-crud 2.0.13 → 2.0.15

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.
@@ -4,6 +4,8 @@
4
4
  import { DataState } from 'lkt-data-state';
5
5
  import { debug } from '../functions/debug';
6
6
  import {
7
+ ButtonConfig,
8
+ ensureButtonConfig,
7
9
  getDefaultValues,
8
10
  ItemCrud,
9
11
  ItemCrudButtonNavPosition,
@@ -11,7 +13,7 @@
11
13
  ItemCrudMode,
12
14
  ItemCrudView,
13
15
  LktObject,
14
- LktSettings,
16
+ LktSettings, ModalConfig,
15
17
  NotificationType,
16
18
  TablePermission,
17
19
  ToastConfig,
@@ -65,6 +67,28 @@
65
67
  createMode.value = v === ItemCrudMode.Create;
66
68
  })
67
69
 
70
+ const safeCreateButton = ref(ensureButtonConfig(props.createButton, LktSettings.defaultCreateButton)),
71
+ safeUpdateButton = ref(ensureButtonConfig(props.updateButton, LktSettings.defaultUpdateButton)),
72
+ safeDropButton = ref(ensureButtonConfig(props.dropButton, LktSettings.defaultDropButton)),
73
+ safeEditModeButton = ref(ensureButtonConfig(props.editModeButton, LktSettings.defaultEditModeButton)),
74
+ safeGroupButton = ref(ensureButtonConfig(props.groupButton, LktSettings.defaultGroupButton));
75
+
76
+ watch(() => props.createButton, v => {
77
+ safeCreateButton.value = ensureButtonConfig(v, LktSettings.defaultCreateButton);
78
+ }, { deep: true });
79
+
80
+ watch(() => props.updateButton, v => {
81
+ safeUpdateButton.value = ensureButtonConfig(v, LktSettings.defaultUpdateButton);
82
+ }, { deep: true });
83
+
84
+ watch(() => props.dropButton, v => {
85
+ safeDropButton.value = ensureButtonConfig(v, LktSettings.defaultDropButton);
86
+ }, { deep: true });
87
+
88
+ watch(() => props.editModeButton, v => {
89
+ safeEditModeButton.value = ensureButtonConfig(v, LktSettings.defaultEditModeButton);
90
+ }, { deep: true });
91
+
68
92
  const fetchItem = async () => {
69
93
  debug('fetchItem');
70
94
  isLoading.value = true;
@@ -193,7 +217,7 @@
193
217
  },
194
218
  onCreate = ($event: PointerEvent, r: HTTPResponse) => {
195
219
  debug('onCreate');
196
- if (!ensureValidResourceSave(r, props.createButton.resource)) {
220
+ if (!ensureValidResourceSave(r, safeCreateButton.value.resource)) {
197
221
  if (props.notificationType === NotificationType.Toast) {
198
222
  openToast(<ToastConfig>{
199
223
  text: LktSettings.defaultCreateErrorText,
@@ -221,7 +245,7 @@
221
245
  },
222
246
  onUpdate = ($event: PointerEvent, r: HTTPResponse) => {
223
247
  debug('onUpdate');
224
- if (!ensureValidResourceSave(r, props.updateButton.resource)) {
248
+ if (!ensureValidResourceSave(r, safeUpdateButton.value.resource)) {
225
249
  if (props.notificationType === NotificationType.Toast) {
226
250
  openToast(<ToastConfig>{
227
251
  text: LktSettings.defaultUpdateErrorText,
@@ -247,7 +271,7 @@
247
271
  },
248
272
  onDrop = ($event: PointerEvent, r: HTTPResponse) => {
249
273
  debug('onDrop');
250
- if (!ensureValidResourceSave(r, props.dropButton.resource)) {
274
+ if (!ensureValidResourceSave(r, safeDropButton.value.resource)) {
251
275
  if (props.notificationType === NotificationType.Toast) {
252
276
  openToast(<ToastConfig>{
253
277
  text: LktSettings.defaultDropErrorText,
@@ -325,9 +349,36 @@
325
349
  if (computedInsideModal.value) return 'lkt-modal';
326
350
  return 'section';
327
351
  }),
352
+ ableToUpdate = computed(() => {
353
+ if (props.mode !== ItemCrudMode.Update || !canUpdate.value) return false;
354
+ if (!dataChanged.value) return false;
355
+
356
+ if (typeof safeUpdateButton.value?.disabled === 'function') return !safeUpdateButton.value.disabled(item.value);
357
+ if (typeof safeUpdateButton.value?.disabled === 'boolean') return !safeUpdateButton.value.disabled;
358
+
359
+ return true;
360
+ }),
361
+ ableToCreate = computed(() => {
362
+ if (props.mode !== ItemCrudMode.Create) return false;
363
+ if (!dataChanged.value) return false;
364
+
365
+ if (typeof safeCreateButton.value?.disabled === 'function') return !safeCreateButton.value.disabled(item.value);
366
+ if (typeof safeCreateButton.value?.disabled === 'boolean') return !safeCreateButton.value.disabled;
367
+
368
+ return true;
369
+ }),
370
+ ableToDrop = computed(() => {
371
+
372
+ if (!canDrop.value) return false;
373
+
374
+ if (typeof safeDropButton.value?.disabled === 'function') return !safeDropButton.value.disabled(item.value);
375
+ if (typeof safeDropButton.value?.disabled === 'boolean') return !safeDropButton.value.disabled;
376
+
377
+ return true;
378
+ }),
328
379
  computedContainerAttrs = computed(() => {
329
380
  if (computedContainerTag.value === 'lkt-modal') {
330
- return {
381
+ return <ModalConfig>{
331
382
  ...{
332
383
  title: props.title,
333
384
  item: item.value,
@@ -337,17 +388,68 @@
337
388
  beforeClose: crudBeforeClose,
338
389
  closeConfirm: closeConfirm.value,
339
390
  },
391
+ headerActionsButton: props.groupButton !== false ? <ButtonConfig>{
392
+ dot: ableToCreate.value || ableToUpdate.value,
393
+ } : false
340
394
  };
341
395
  }
342
396
  return {};
343
- });
397
+ })
344
398
  </script>
345
399
 
346
400
  <template>
347
401
  <component
348
402
  :is="computedContainerTag"
349
403
  v-bind="computedContainerAttrs"
404
+ class="lkt-item-crud"
350
405
  >
406
+ <template v-if="groupButton !== false && groupButtonAsModalActions" #header-actions>
407
+ <button-nav
408
+ ref="buttonNav"
409
+ v-if="buttonNavPosition === ItemCrudButtonNavPosition.Top"
410
+ v-model:loading="isLoading"
411
+ v-model:editing="editMode"
412
+ :item="item"
413
+ :mode="mode"
414
+ :view="view"
415
+ :grouped="true"
416
+ :button-nav-visibility="buttonNavVisibility"
417
+ :create-button="safeCreateButton"
418
+ :update-button="safeUpdateButton"
419
+ :drop-button="safeDropButton"
420
+ :edit-mode-button="safeEditModeButton"
421
+ :group-button="safeGroupButton"
422
+ :data-changed="dataChanged"
423
+ :http-success-read="httpSuccessRead"
424
+ :can-update="canUpdate"
425
+ :can-drop="canDrop"
426
+ :can-switch-edit-mode="canSwitchEditMode"
427
+ :group-button-as-modal-actions="groupButtonAsModalActions"
428
+ :able-to-create="ableToCreate"
429
+ :able-to-update="ableToUpdate"
430
+ :able-to-drop="ableToDrop"
431
+ :perms="perms"
432
+ @create="onCreate"
433
+ @save="onUpdate"
434
+ @drop="onDrop"
435
+ >
436
+ <template #prev-buttons-ever="{canUpdate, canDrop, perms}" v-if="slots['prev-buttons-ever']">
437
+ <slot name="prev-buttons-ever"
438
+ :can-update="canUpdate"
439
+ :can-drop="canDrop"
440
+ :perms="perms"
441
+ />
442
+ </template>
443
+ <template #prev-buttons="{canUpdate, canDrop, perms}" v-if="slots['prev-buttons']">
444
+ <slot name="prev-buttons"
445
+ :can-update="canUpdate"
446
+ :can-drop="canDrop"
447
+ :perms="perms"
448
+ />
449
+ </template>
450
+ </button-nav>
451
+ </template>
452
+
351
453
  <article class="lkt-item-crud">
352
454
  <header class="lkt-item-crud_header" v-if="!computedInsideModal && displayHeader">
353
455
  <div class="lkt-item-crud_header-slot" v-if="slots['pre-title']">
@@ -361,23 +463,28 @@
361
463
 
362
464
  <button-nav
363
465
  ref="buttonNav"
364
- v-if="buttonNavPosition === ItemCrudButtonNavPosition.Top"
466
+ v-if="buttonNavPosition === ItemCrudButtonNavPosition.Top && (groupButton === false || !groupButtonAsModalActions)"
365
467
  v-model:loading="isLoading"
366
468
  v-model:editing="editMode"
367
469
  :item="item"
368
470
  :mode="mode"
369
471
  :view="view"
472
+ :grouped="groupButton !== false"
370
473
  :button-nav-visibility="buttonNavVisibility"
371
- :create-button="createButton"
372
- :update-button="updateButton"
373
- :drop-button="dropButton"
374
- :edit-mode-button="editModeButton"
375
- :group-button="groupButton"
474
+ :create-button="safeCreateButton"
475
+ :update-button="safeUpdateButton"
476
+ :drop-button="safeDropButton"
477
+ :edit-mode-button="safeEditModeButton"
478
+ :group-button="safeGroupButton"
376
479
  :data-changed="dataChanged"
377
480
  :http-success-read="httpSuccessRead"
378
481
  :can-update="canUpdate"
379
482
  :can-drop="canDrop"
380
483
  :can-switch-edit-mode="canSwitchEditMode"
484
+ :group-button-as-modal-actions="groupButtonAsModalActions"
485
+ :able-to-create="ableToCreate"
486
+ :able-to-update="ableToUpdate"
487
+ :able-to-drop="ableToDrop"
381
488
  :perms="perms"
382
489
  @create="onCreate"
383
490
  @save="onUpdate"
@@ -425,23 +532,28 @@
425
532
 
426
533
  <button-nav
427
534
  ref="buttonNav"
428
- v-if="buttonNavPosition === ItemCrudButtonNavPosition.Bottom"
535
+ v-if="buttonNavPosition === ItemCrudButtonNavPosition.Bottom && (groupButton === false || !groupButtonAsModalActions)"
429
536
  v-model:loading="isLoading"
430
537
  v-model:editing="editMode"
431
538
  :item="item"
432
539
  :mode="mode"
433
540
  :view="view"
541
+ :grouped="groupButton !== false"
434
542
  :button-nav-visibility="buttonNavVisibility"
435
- :create-button="createButton"
436
- :update-button="updateButton"
437
- :drop-button="dropButton"
438
- :edit-mode-button="editModeButton"
439
- :group-button="groupButton"
543
+ :create-button="safeCreateButton"
544
+ :update-button="safeUpdateButton"
545
+ :drop-button="safeDropButton"
546
+ :edit-mode-button="safeEditModeButton"
547
+ :group-button="safeGroupButton"
440
548
  :data-changed="dataChanged"
441
549
  :http-success-read="httpSuccessRead"
442
550
  :can-update="canUpdate"
443
551
  :can-drop="canDrop"
444
552
  :can-switch-edit-mode="canSwitchEditMode"
553
+ :group-button-as-modal-actions="groupButtonAsModalActions"
554
+ :able-to-create="ableToCreate"
555
+ :able-to-update="ableToUpdate"
556
+ :able-to-drop="ableToDrop"
445
557
  :perms="perms"
446
558
  @create="onCreate"
447
559
  @save="onUpdate"