quasar-ui-danx 0.4.60 → 0.4.68
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/.eslintrc.cjs +1 -1
- package/dist/danx.es.js +3609 -3614
- package/dist/danx.es.js.map +1 -1
- package/dist/danx.umd.js +77 -77
- package/dist/danx.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/components/ActionTable/Form/ActionForm.vue +1 -1
- package/src/components/ActionTable/Form/Fields/SelectField.vue +2 -1
- package/src/components/ActionTable/Form/Fields/SelectionMenuField.vue +38 -13
- package/src/components/Utility/Buttons/ActionButton.vue +4 -1
- package/src/helpers/request.ts +4 -1
- package/src/helpers/routes.ts +1 -2
- package/src/types/actions.d.ts +3 -3
- package/src/types/controls.d.ts +1 -1
- package/src/types/requests.d.ts +1 -1
- package/tsconfig.json +0 -11
package/package.json
CHANGED
@@ -63,7 +63,7 @@ const isValid = computed(() => {
|
|
63
63
|
for (let field of props.form.fields) {
|
64
64
|
const value = input.value[field.name];
|
65
65
|
|
66
|
-
if (field.required && !value && value !== false) {
|
66
|
+
if (field.required && !value && value !== false && value !== 0) {
|
67
67
|
return false;
|
68
68
|
}
|
69
69
|
}
|
@@ -175,6 +175,7 @@ const selectedOptions = computed(() => {
|
|
175
175
|
if (typeof v === "object") return v.value || v.id;
|
176
176
|
return v;
|
177
177
|
});
|
178
|
+
|
178
179
|
return computedOptions.value.filter((o) => {
|
179
180
|
return comparableValues.includes(o.value);
|
180
181
|
});
|
@@ -249,7 +250,7 @@ function resolveValue(option) {
|
|
249
250
|
if (!option || typeof option === "string") {
|
250
251
|
return option;
|
251
252
|
}
|
252
|
-
let value = option.value
|
253
|
+
let value = option.value !== undefined ? option.value : option.id;
|
253
254
|
if (typeof props.optionValue === "string") {
|
254
255
|
value = option[props.optionValue];
|
255
256
|
} else if (typeof props.optionValue === "function") {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<div class="group flex items-center flex-nowrap gap-x-
|
2
|
+
<div class="group flex items-center flex-nowrap gap-x-2 relative">
|
3
3
|
<ShowHideButton
|
4
4
|
v-if="selectable"
|
5
5
|
v-model="isSelecting"
|
@@ -8,7 +8,6 @@
|
|
8
8
|
:saving="loading"
|
9
9
|
:class="selectClass"
|
10
10
|
:show-icon="selectIcon || DefaultSelectIcon"
|
11
|
-
class="mr-2"
|
12
11
|
:size="size"
|
13
12
|
>
|
14
13
|
<QMenu
|
@@ -19,14 +18,14 @@
|
|
19
18
|
<div>
|
20
19
|
<div
|
21
20
|
v-for="option in optionsPlusSelected"
|
22
|
-
:key="option
|
21
|
+
:key="getId(option)"
|
23
22
|
v-ripple
|
24
23
|
class="cursor-pointer flex items-center relative"
|
25
|
-
:class="{'bg-sky-900 hover:bg-sky-800': selected
|
26
|
-
@click="selected = option"
|
24
|
+
:class="{'bg-sky-900 hover:bg-sky-800': getId(selected) === getId(option), 'hover:bg-slate-600': getId(selected) !== getId(option)}"
|
25
|
+
@click="selected = selectionType === 'object' ? option : getId(option)"
|
27
26
|
>
|
28
27
|
<div class="flex-grow px-4 py-2">
|
29
|
-
{{ option
|
28
|
+
{{ getName(option) }}
|
30
29
|
</div>
|
31
30
|
<ActionButton
|
32
31
|
v-if="deletable"
|
@@ -58,12 +57,12 @@
|
|
58
57
|
<template v-if="selected">
|
59
58
|
<EditableDiv
|
60
59
|
v-if="nameEditable"
|
61
|
-
:model-value="selected
|
60
|
+
:model-value="getName(selected)"
|
62
61
|
color="slate-600"
|
63
62
|
@update:model-value="name => $emit('update', {name})"
|
64
63
|
/>
|
65
64
|
<template v-else>
|
66
|
-
{{ selected
|
65
|
+
{{ getName(selected) }}
|
67
66
|
</template>
|
68
67
|
</template>
|
69
68
|
<template v-else>
|
@@ -104,16 +103,17 @@ import {
|
|
104
103
|
FaSolidPencil as EditIcon
|
105
104
|
} from "danx-icon";
|
106
105
|
import { computed, ref } from "vue";
|
107
|
-
import { ActionTargetItem } from "../../../../types";
|
106
|
+
import { ActionTargetItem, LabelValueItem } from "../../../../types";
|
108
107
|
import { ShowHideButton } from "../../../Utility/Buttons";
|
109
108
|
import { ActionButtonProps, default as ActionButton } from "../../../Utility/Buttons/ActionButton";
|
110
109
|
import EditableDiv from "./EditableDiv";
|
111
110
|
|
112
111
|
defineEmits(["create", "update", "delete"]);
|
113
|
-
const selected = defineModel<ActionTargetItem | null>("selected");
|
112
|
+
const selected = defineModel<ActionTargetItem | string | null>("selected");
|
114
113
|
const editing = defineModel<boolean>("editing");
|
115
114
|
const props = withDefaults(defineProps<{
|
116
|
-
options: ActionTargetItem[];
|
115
|
+
options: ActionTargetItem[] | LabelValueItem[];
|
116
|
+
selectionType?: "object" | "string";
|
117
117
|
showEdit?: boolean;
|
118
118
|
loading?: boolean;
|
119
119
|
selectText?: string;
|
@@ -137,6 +137,7 @@ const props = withDefaults(defineProps<{
|
|
137
137
|
editDisabled?: boolean;
|
138
138
|
size?: ActionButtonProps["size"];
|
139
139
|
}>(), {
|
140
|
+
selectionType: "object",
|
140
141
|
selectText: "",
|
141
142
|
createText: "",
|
142
143
|
editText: "",
|
@@ -154,8 +155,32 @@ const props = withDefaults(defineProps<{
|
|
154
155
|
const isSelecting = ref(false);
|
155
156
|
|
156
157
|
// If the selected option is not in the options list, it should be added in
|
157
|
-
const optionsPlusSelected = computed(() => {
|
158
|
-
if (!selected.value || props.options.find((o) => o
|
158
|
+
const optionsPlusSelected = computed<ActionTargetItem[]>(() => {
|
159
|
+
if (!selected.value || props.options.find((o) => getId(o) === getId(selected.value))) return props.options;
|
159
160
|
return [selected.value, ...props.options];
|
160
161
|
});
|
162
|
+
|
163
|
+
function resolveOption(option) {
|
164
|
+
if (typeof option === "object") {
|
165
|
+
return option;
|
166
|
+
}
|
167
|
+
|
168
|
+
return props.options.find((o) => {
|
169
|
+
if (typeof o === "object") {
|
170
|
+
return getId(o) === option;
|
171
|
+
}
|
172
|
+
return o === option;
|
173
|
+
});
|
174
|
+
}
|
175
|
+
|
176
|
+
function getId(option) {
|
177
|
+
option = resolveOption(option);
|
178
|
+
|
179
|
+
return option?.id || option?.value || option?.name || option;
|
180
|
+
}
|
181
|
+
|
182
|
+
function getName(option) {
|
183
|
+
option = resolveOption(option);
|
184
|
+
return option?.name || option?.label || option?.value || option;
|
185
|
+
}
|
161
186
|
</script>
|
@@ -62,6 +62,7 @@ import {
|
|
62
62
|
FaSolidCopy as CopyIcon,
|
63
63
|
FaSolidFileExport as ExportIcon,
|
64
64
|
FaSolidFileImport as ImportIcon,
|
65
|
+
FaSolidFolder as FolderIcon,
|
65
66
|
FaSolidMinus as MinusIcon,
|
66
67
|
FaSolidPause as PauseIcon,
|
67
68
|
FaSolidPencil as EditIcon,
|
@@ -74,7 +75,7 @@ import { computed, ref } from "vue";
|
|
74
75
|
import { ActionTarget, ResourceAction } from "../../../types";
|
75
76
|
|
76
77
|
export interface ActionButtonProps {
|
77
|
-
type?: "trash" | "create" | "edit" | "copy" | "play" | "stop" | "pause" | "refresh" | "confirm" | "cancel" | "export" | "import" | "minus";
|
78
|
+
type?: "trash" | "create" | "edit" | "copy" | "folder" | "play" | "stop" | "pause" | "refresh" | "confirm" | "cancel" | "export" | "import" | "minus";
|
78
79
|
color?: "red" | "blue" | "sky" | "sky-invert" | "green" | "green-invert" | "lime" | "white" | "gray" | "yellow" | "orange";
|
79
80
|
size?: "xxs" | "xs" | "sm" | "md" | "lg";
|
80
81
|
icon?: object | string;
|
@@ -190,6 +191,8 @@ const typeOptions = computed(() => {
|
|
190
191
|
return { icon: EditIcon };
|
191
192
|
case "copy":
|
192
193
|
return { icon: CopyIcon };
|
194
|
+
case "folder":
|
195
|
+
return { icon: FolderIcon };
|
193
196
|
case "play":
|
194
197
|
return { icon: PlayIcon };
|
195
198
|
case "stop":
|
package/src/helpers/request.ts
CHANGED
@@ -94,9 +94,12 @@ export const request: RequestApi = {
|
|
94
94
|
|
95
95
|
async poll(url: string, options, interval, fnUntil) {
|
96
96
|
let response;
|
97
|
+
if (!fnUntil) {
|
98
|
+
fnUntil = (response: HttpResponse) => !!response;
|
99
|
+
}
|
97
100
|
do {
|
98
101
|
response = await request.call(url, options);
|
99
|
-
await sleep(interval);
|
102
|
+
await sleep(interval || 1000);
|
100
103
|
} while (!fnUntil(response));
|
101
104
|
|
102
105
|
return response;
|
package/src/helpers/routes.ts
CHANGED
@@ -59,8 +59,7 @@ export function useActionRoutes(baseUrl: string, extend?: object): ListControlsR
|
|
59
59
|
ignoreAbort: true,
|
60
60
|
headers: {
|
61
61
|
...options?.headers,
|
62
|
-
|
63
|
-
"X-Timestamp": Date.now()
|
62
|
+
"X-Timestamp": Date.now().toString()
|
64
63
|
}
|
65
64
|
};
|
66
65
|
data = data || {};
|
package/src/types/actions.d.ts
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
import { FilterGroup, ListController, ListControlsRoutes } from "src/types/controls";
|
2
|
-
import { FormField } from "src/types/forms";
|
3
|
-
import { TableColumn } from "src/types/tables";
|
4
1
|
import { ComputedRef, Ref, ShallowRef, VNode } from "vue";
|
2
|
+
import { FilterGroup, ListController, ListControlsRoutes } from "./controls";
|
3
|
+
import { FormField } from "./forms";
|
5
4
|
import { AnyObject, TypedObject } from "./shared";
|
5
|
+
import { TableColumn } from "./tables";
|
6
6
|
|
7
7
|
export interface ActionTargetItem extends TypedObject {
|
8
8
|
isSaving?: boolean;
|
package/src/types/controls.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
import { RequestCallOptions } from "src/types/requests";
|
2
1
|
import { ComputedRef, Ref, ShallowRef } from "vue";
|
2
|
+
import { RequestCallOptions } from "../types";
|
3
3
|
import { ActionOptions, ActionTargetItem, ResourceAction } from "./actions";
|
4
4
|
import { AnyObject, LabelValueItem } from "./shared";
|
5
5
|
|
package/src/types/requests.d.ts
CHANGED
@@ -11,7 +11,7 @@ export interface RequestApi {
|
|
11
11
|
|
12
12
|
post(url: string, data?: object, options?: RequestCallOptions): Promise<any>;
|
13
13
|
|
14
|
-
poll(url: string, options?: RequestCallOptions, interval
|
14
|
+
poll(url: string, options?: RequestCallOptions, interval?: number, fnUntil?: (response) => boolean): Promise<any>;
|
15
15
|
}
|
16
16
|
|
17
17
|
export interface HttpResponse {
|