quasar-ui-danx 0.0.39 → 0.0.40
Sign up to get free protection for your applications and to get access to all the features.
package/package.json
CHANGED
@@ -84,6 +84,9 @@
|
|
84
84
|
</component>
|
85
85
|
</q-td>
|
86
86
|
</template>
|
87
|
+
<template #bottom>
|
88
|
+
<ActionInputComponent />
|
89
|
+
</template>
|
87
90
|
</q-table>
|
88
91
|
</template>
|
89
92
|
|
@@ -92,7 +95,7 @@ import { ref } from 'vue';
|
|
92
95
|
import { getItem, setItem } from '../../helpers';
|
93
96
|
import { DragHandleIcon as RowResizeIcon } from '../../svg';
|
94
97
|
import { HandleDraggable } from '../DragAndDrop';
|
95
|
-
import { mapSortBy, RenderComponent } from '../index';
|
98
|
+
import { ActionInputComponent, mapSortBy, RenderComponent } from '../index';
|
96
99
|
import { ActionMenu, EmptyTableState, registerStickyScrolling, TableSummaryRow } from './index';
|
97
100
|
|
98
101
|
defineEmits(['action', 'filter', 'update:quasar-pagination', 'update:selected-rows']);
|
@@ -4,18 +4,20 @@
|
|
4
4
|
v-if="activeActionInput"
|
5
5
|
:component="activeActionInput.component"
|
6
6
|
:is-saving="isSaving"
|
7
|
-
@confirm="
|
7
|
+
@confirm="onConfirm"
|
8
8
|
@close="activeActionInput.cancel"
|
9
9
|
/>
|
10
10
|
</div>
|
11
11
|
</template>
|
12
12
|
<script setup>
|
13
|
-
import
|
13
|
+
import { ref } from 'vue';
|
14
14
|
import { activeActionInput } from '../../../helpers';
|
15
|
+
import RenderComponent from './RenderComponent';
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
const isSaving = ref(false);
|
18
|
+
async function onConfirm(input) {
|
19
|
+
isSaving.value = true;
|
20
|
+
await activeActionInput.value.confirm(input);
|
21
|
+
isSaving.value = false;
|
22
|
+
}
|
21
23
|
</script>
|
package/src/helpers/actions.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { shallowRef } from "vue";
|
2
2
|
import { FlashMessages } from "./index";
|
3
3
|
|
4
4
|
interface ActionOptions {
|
@@ -8,9 +8,11 @@ interface ActionOptions {
|
|
8
8
|
batch?: boolean;
|
9
9
|
inputComponent?: (target: object[] | object) => any;
|
10
10
|
enabled?: (target: object) => boolean;
|
11
|
-
onAction?: (action: string | null, target: object, input: any) => any
|
12
|
-
onBatchAction?: (action: string | null, targets: object[], input: any) => any
|
13
|
-
|
11
|
+
onAction?: (action: string | null, target: object, input: any) => Promise<any>;
|
12
|
+
onBatchAction?: (action: string | null, targets: object[], input: any) => Promise<any>;
|
13
|
+
onSuccess?: (action: string | null, targets: object, input: any) => any;
|
14
|
+
onError?: (action: string | null, targets: object, input: any) => any;
|
15
|
+
onFinish?: (action: string | null, targets: object, input: any) => any;
|
14
16
|
}
|
15
17
|
|
16
18
|
export const activeActionInput = shallowRef(null);
|
@@ -23,8 +25,7 @@ export const activeActionInput = shallowRef(null);
|
|
23
25
|
* @param {ActionOptions} globalOptions
|
24
26
|
*/
|
25
27
|
export function useActions(actions: ActionOptions[], globalOptions: ActionOptions = null) {
|
26
|
-
const
|
27
|
-
const activeTarget = ref(null);
|
28
|
+
const isSavingTarget = shallowRef(null);
|
28
29
|
|
29
30
|
/**
|
30
31
|
* Resolves an action by name or object, adds globalOptions and overrides any passes options
|
@@ -44,8 +45,7 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
44
45
|
|
45
46
|
return {
|
46
47
|
actions,
|
47
|
-
|
48
|
-
activeTarget,
|
48
|
+
isSavingTarget,
|
49
49
|
resolveAction,
|
50
50
|
|
51
51
|
/**
|
@@ -66,7 +66,7 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
66
66
|
},
|
67
67
|
|
68
68
|
/**
|
69
|
-
*
|
69
|
+
* TODO: HOW TO INTEGRATE optimistic updates and single item updates?
|
70
70
|
*/
|
71
71
|
async applyAction(item, input, itemData = {}) {
|
72
72
|
isSavingItem.value = item;
|
@@ -99,24 +99,35 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
99
99
|
async performAction(name: string | object, target: object[] | object, input: any = null) {
|
100
100
|
const action = resolveAction(name);
|
101
101
|
const component = action.inputComponent && action.inputComponent(target);
|
102
|
+
let result = null;
|
102
103
|
|
104
|
+
isSavingTarget.value = target;
|
105
|
+
|
106
|
+
// If no component input is required, we can directly perform the action
|
103
107
|
if (component) {
|
104
|
-
|
108
|
+
// If the action requires an input, we set the activeActionInput to the input component.
|
109
|
+
// This will tell the ActionInputComponent to render the input component, and confirm or cancel the
|
110
|
+
// action The confirm function has the input from the component passed and will resolve the promise
|
111
|
+
// with the result of the action
|
112
|
+
result = await new Promise((resolve, reject) => {
|
105
113
|
activeActionInput.value = {
|
106
114
|
component,
|
107
|
-
confirm: resolve,
|
115
|
+
confirm: async () => resolve(await onConfirmAction(action, target, input)),
|
108
116
|
cancel: reject
|
109
117
|
};
|
110
118
|
});
|
111
119
|
activeActionInput.value = null;
|
120
|
+
} else {
|
121
|
+
result = await onConfirmAction(action, target, input);
|
112
122
|
}
|
113
123
|
|
114
|
-
|
124
|
+
isSavingTarget.value = null;
|
125
|
+
return result;
|
115
126
|
}
|
116
127
|
};
|
117
128
|
}
|
118
129
|
|
119
|
-
async function onConfirmAction(action, target, input) {
|
130
|
+
async function onConfirmAction(action: ActionOptions, target: object[] | object, input: any = null) {
|
120
131
|
if (!action.onAction) {
|
121
132
|
throw new Error("No onAction handler found for the selected action:" + action.name);
|
122
133
|
}
|
@@ -141,7 +152,7 @@ async function onConfirmAction(action, target, input) {
|
|
141
152
|
}
|
142
153
|
|
143
154
|
if (action.onSuccess) {
|
144
|
-
|
155
|
+
action.onSuccess(result, target, input);
|
145
156
|
}
|
146
157
|
|
147
158
|
} else {
|
@@ -157,12 +168,12 @@ async function onConfirmAction(action, target, input) {
|
|
157
168
|
FlashMessages.combine("error", errors);
|
158
169
|
|
159
170
|
if (action.onError) {
|
160
|
-
|
171
|
+
action.onError(result, target, input);
|
161
172
|
}
|
162
173
|
}
|
163
174
|
|
164
175
|
if (action.onFinish) {
|
165
|
-
|
176
|
+
action.onFinish(result, target, input);
|
166
177
|
}
|
167
178
|
|
168
179
|
return result;
|