quasar-ui-danx 0.0.40 → 0.0.42
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.
package/package.json
CHANGED
@@ -21,7 +21,7 @@ const props = defineProps({
|
|
21
21
|
},
|
22
22
|
target: {
|
23
23
|
type: [Array, Object],
|
24
|
-
|
24
|
+
default: () => []
|
25
25
|
},
|
26
26
|
tooltip: {
|
27
27
|
type: String,
|
@@ -34,10 +34,13 @@ const props = defineProps({
|
|
34
34
|
}
|
35
35
|
});
|
36
36
|
|
37
|
-
const hasTarget = computed(() => !!props.target
|
37
|
+
const hasTarget = computed(() => Array.isArray(props.target) ? props.target.length > 0 : !!props.target);
|
38
38
|
|
39
39
|
const activeActions = computed(() => props.actions.filter(action => {
|
40
|
-
if (
|
41
|
-
|
40
|
+
if (Array.isArray(props.target)) {
|
41
|
+
return action.batchEnabled ? action.batchEnabled(props.target) : true;
|
42
|
+
}
|
43
|
+
|
44
|
+
return action.enabled ? action.enabled(props.target) : true;
|
42
45
|
}));
|
43
46
|
</script>
|
@@ -61,7 +61,7 @@
|
|
61
61
|
:params="[rowProps.row]"
|
62
62
|
:component="rowProps.col.component"
|
63
63
|
:text="rowProps.value"
|
64
|
-
@action="$emit('action',
|
64
|
+
@action="action => $emit('action', {action,target: rowProps.row})"
|
65
65
|
/>
|
66
66
|
<div v-else-if="rowProps.col.fieldList">
|
67
67
|
<div v-for="field in rowProps.col.fieldList" :key="field">
|
@@ -77,8 +77,8 @@
|
|
77
77
|
<ActionMenu
|
78
78
|
:actions="rowProps.col.actions"
|
79
79
|
:target="rowProps.row"
|
80
|
-
:loading="
|
81
|
-
@action="(action) => $emit('action',
|
80
|
+
:loading="isSavingRow(rowProps.row)"
|
81
|
+
@action="(action) => $emit('action', action, rowProps.row)"
|
82
82
|
/>
|
83
83
|
</div>
|
84
84
|
</component>
|
@@ -116,7 +116,7 @@ const props = defineProps({
|
|
116
116
|
type: Object,
|
117
117
|
required: true
|
118
118
|
},
|
119
|
-
|
119
|
+
isSavingTarget: {
|
120
120
|
type: Object,
|
121
121
|
default: null
|
122
122
|
},
|
@@ -158,6 +158,15 @@ function getColumnStyle(column) {
|
|
158
158
|
}
|
159
159
|
return null;
|
160
160
|
}
|
161
|
+
|
162
|
+
function isSavingRow(row) {
|
163
|
+
if (!props.isSavingTarget) return false;
|
164
|
+
|
165
|
+
if (Array.isArray(props.isSavingTarget)) {
|
166
|
+
return !!props.isSavingTarget.find(t => t.id === row.id);
|
167
|
+
}
|
168
|
+
return props.isSavingTarget.id === row.id;
|
169
|
+
}
|
161
170
|
</script>
|
162
171
|
|
163
172
|
<style lang="scss" scoped>
|
@@ -1,9 +1,16 @@
|
|
1
1
|
<template>
|
2
2
|
<Component
|
3
|
+
v-if="content"
|
3
4
|
:is="resolvedComponent.is"
|
4
5
|
v-bind="{...resolvedComponent.props, ...overrideProps}"
|
5
6
|
@action="$emit('action', $event)"
|
6
|
-
>{{
|
7
|
+
>{{ content }}</Component>
|
8
|
+
<Component
|
9
|
+
v-else
|
10
|
+
:is="resolvedComponent.is"
|
11
|
+
v-bind="{...resolvedComponent.props, ...overrideProps}"
|
12
|
+
@action="$emit('action', $event)"
|
13
|
+
/>
|
7
14
|
</template>
|
8
15
|
<script setup>
|
9
16
|
import { computed } from 'vue';
|
@@ -20,7 +27,7 @@ const props = defineProps({
|
|
20
27
|
},
|
21
28
|
text: {
|
22
29
|
type: String,
|
23
|
-
default:
|
30
|
+
default: undefined
|
24
31
|
},
|
25
32
|
overrideProps: {
|
26
33
|
type: Object,
|
@@ -28,6 +35,7 @@ const props = defineProps({
|
|
28
35
|
}
|
29
36
|
});
|
30
37
|
|
38
|
+
const content = computed(() => resolvedComponent.value?.value || resolvedComponent.value?.props?.text || props.text);
|
31
39
|
const resolvedComponent = computed(() => {
|
32
40
|
if (typeof props.component === 'function') {
|
33
41
|
return props.component(...props.params);
|
package/src/helpers/actions.ts
CHANGED
@@ -2,12 +2,15 @@ import { shallowRef } from "vue";
|
|
2
2
|
import { FlashMessages } from "./index";
|
3
3
|
|
4
4
|
interface ActionOptions {
|
5
|
-
name
|
6
|
-
label
|
5
|
+
name?: string;
|
6
|
+
label?: string;
|
7
7
|
menu?: boolean;
|
8
8
|
batch?: boolean;
|
9
|
+
category?: string;
|
10
|
+
class?: string;
|
9
11
|
inputComponent?: (target: object[] | object) => any;
|
10
12
|
enabled?: (target: object) => boolean;
|
13
|
+
batchEnabled?: (targets: object[]) => boolean;
|
11
14
|
onAction?: (action: string | null, target: object, input: any) => Promise<any>;
|
12
15
|
onBatchAction?: (action: string | null, targets: object[], input: any) => Promise<any>;
|
13
16
|
onSuccess?: (action: string | null, targets: object, input: any) => any;
|
@@ -69,8 +72,6 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
69
72
|
* TODO: HOW TO INTEGRATE optimistic updates and single item updates?
|
70
73
|
*/
|
71
74
|
async applyAction(item, input, itemData = {}) {
|
72
|
-
isSavingItem.value = item;
|
73
|
-
|
74
75
|
setItemInPagedList({ ...item, ...input, ...itemData });
|
75
76
|
const result = await applyActionRoute(item, input);
|
76
77
|
if (result.success) {
|
@@ -85,7 +86,6 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
85
86
|
activeItem.value = { ...activeItem.value, ...result.item };
|
86
87
|
}
|
87
88
|
}
|
88
|
-
isSavingItem.value = null;
|
89
89
|
return result;
|
90
90
|
},
|
91
91
|
|
@@ -112,10 +112,19 @@ export function useActions(actions: ActionOptions[], globalOptions: ActionOption
|
|
112
112
|
result = await new Promise((resolve, reject) => {
|
113
113
|
activeActionInput.value = {
|
114
114
|
component,
|
115
|
-
confirm: async
|
116
|
-
|
115
|
+
confirm: async input => {
|
116
|
+
const result = await onConfirmAction(action, target, input);
|
117
|
+
|
118
|
+
// Only resolve when we have a non-error response, so we can show the error message w/o
|
119
|
+
// hiding the dialog / inputComponent
|
120
|
+
if (result === undefined || result === true || result?.success) {
|
121
|
+
resolve(result);
|
122
|
+
}
|
123
|
+
},
|
124
|
+
cancel: resolve
|
117
125
|
};
|
118
126
|
});
|
127
|
+
|
119
128
|
activeActionInput.value = null;
|
120
129
|
} else {
|
121
130
|
result = await onConfirmAction(action, target, input);
|
@@ -145,16 +154,14 @@ async function onConfirmAction(action: ActionOptions, target: object[] | object,
|
|
145
154
|
}
|
146
155
|
|
147
156
|
// If there is no return value or the result marks it as successful, we show a success message
|
148
|
-
if (result === undefined || result?.success) {
|
149
|
-
|
150
|
-
|
151
|
-
FlashMessages.success(`The update was successful`);
|
157
|
+
if (result === undefined || result === true || result?.success) {
|
158
|
+
if (result?.success && Array.isArray(target)) {
|
159
|
+
FlashMessages.success(`Successfully performed action ${action.label} on ${target.length} items`);
|
152
160
|
}
|
153
161
|
|
154
162
|
if (action.onSuccess) {
|
155
163
|
action.onSuccess(result, target, input);
|
156
164
|
}
|
157
|
-
|
158
165
|
} else {
|
159
166
|
const errors = [];
|
160
167
|
if (result.errors) {
|
@@ -176,5 +183,6 @@ async function onConfirmAction(action: ActionOptions, target: object[] | object,
|
|
176
183
|
action.onFinish(result, target, input);
|
177
184
|
}
|
178
185
|
|
186
|
+
console.log("onConrirm result", result);
|
179
187
|
return result;
|
180
188
|
}
|