quasar-ui-danx 0.4.1 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/danx.es.js +7234 -6741
- package/dist/danx.es.js.map +1 -1
- package/dist/danx.umd.js +11 -5
- package/dist/danx.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +3 -1
- package/src/components/ActionTable/ActionTable.vue +31 -43
- package/src/components/ActionTable/Columns/ActionTableColumn.vue +19 -18
- package/src/components/ActionTable/Filters/CollapsableFiltersSidebar.vue +15 -14
- package/src/components/ActionTable/Filters/{FilterFieldList.vue → FilterList.vue} +26 -26
- package/src/components/ActionTable/Filters/FilterableField.vue +28 -31
- package/src/components/ActionTable/Filters/index.ts +2 -2
- package/src/components/ActionTable/Form/Fields/EditOnClickTextField.vue +71 -0
- package/src/components/ActionTable/Form/Fields/FieldLabel.vue +8 -13
- package/src/components/ActionTable/Form/Fields/FileUploadButton.vue +34 -33
- package/src/components/ActionTable/Form/Fields/MultiFileField.vue +48 -44
- package/src/components/ActionTable/Form/Fields/NumberField.vue +60 -59
- package/src/components/ActionTable/Form/Fields/SelectField.vue +124 -138
- package/src/components/ActionTable/Form/Fields/SelectWithChildrenField.vue +28 -33
- package/src/components/ActionTable/Form/Fields/SingleFileField.vue +15 -15
- package/src/components/ActionTable/Form/Fields/SliderNumberField.vue +45 -0
- package/src/components/ActionTable/Form/Fields/TextField.vue +47 -66
- package/src/components/ActionTable/Form/Fields/index.ts +2 -0
- package/src/components/ActionTable/Form/RenderedForm.vue +50 -13
- package/src/components/ActionTable/Form/Utilities/MaxLengthCounter.vue +17 -0
- package/src/components/ActionTable/Form/Utilities/index.ts +1 -0
- package/src/components/ActionTable/Form/index.ts +1 -0
- package/src/components/ActionTable/Layouts/ActionTableLayout.vue +22 -16
- package/src/components/ActionTable/Toolbars/ActionToolbar.vue +11 -11
- package/src/components/ActionTable/listControls.ts +104 -166
- package/src/components/ActionTable/listHelpers.ts +2 -3
- package/src/components/ActionTable/tableColumns.ts +53 -77
- package/src/components/AuditHistory/AuditHistoryItemValue.vue +26 -26
- package/src/components/PanelsDrawer/PanelsDrawer.vue +17 -4
- package/src/components/PanelsDrawer/PanelsDrawerPanels.vue +6 -11
- package/src/components/PanelsDrawer/PanelsDrawerTabs.vue +20 -20
- package/src/components/Utility/Dialogs/ConfirmActionDialog.vue +39 -0
- package/src/components/Utility/Dialogs/ConfirmDialog.vue +57 -117
- package/src/components/Utility/Dialogs/DialogLayout.vue +77 -0
- package/src/components/Utility/Dialogs/FullscreenCarouselDialog.vue +42 -36
- package/src/components/Utility/Dialogs/InfoDialog.vue +40 -80
- package/src/components/Utility/Dialogs/index.ts +1 -0
- package/src/components/Utility/Files/FilePreview.vue +76 -73
- package/src/components/Utility/Layouts/ContentDrawer.vue +24 -31
- package/src/components/Utility/Tools/ActionVnode.vue +3 -3
- package/src/components/Utility/Tools/RenderVnode.vue +20 -11
- package/src/components/Utility/Transitions/MaxHeightTransition.vue +26 -0
- package/src/components/Utility/Transitions/index.ts +1 -0
- package/src/config/index.ts +36 -31
- package/src/helpers/FileUpload.ts +295 -297
- package/src/helpers/FlashMessages.ts +80 -71
- package/src/helpers/actions.ts +102 -82
- package/src/helpers/download.ts +189 -189
- package/src/helpers/downloadPdf.ts +55 -52
- package/src/helpers/formats.ts +151 -109
- package/src/helpers/index.ts +2 -0
- package/src/helpers/multiFileUpload.ts +72 -58
- package/src/helpers/objectStore.ts +52 -0
- package/src/helpers/request.ts +70 -51
- package/src/helpers/routes.ts +29 -0
- package/src/helpers/storage.ts +7 -3
- package/src/helpers/utils.ts +47 -29
- package/src/styles/quasar-reset.scss +94 -68
- package/src/styles/themes/danx/dialogs.scss +47 -0
- package/src/styles/themes/danx/forms.scss +18 -0
- package/src/styles/themes/danx/index.scss +4 -0
- package/src/types/actions.d.ts +43 -0
- package/src/types/config.d.ts +15 -0
- package/src/types/controls.d.ts +99 -0
- package/src/types/dialogs.d.ts +32 -0
- package/src/types/fields.d.ts +20 -0
- package/src/types/files.d.ts +54 -0
- package/src/types/formats.d.ts +4 -0
- package/src/{components/ActionTable/Form/form.d.ts → types/forms.d.ts} +6 -0
- package/src/types/index.d.ts +12 -0
- package/src/types/requests.d.ts +13 -0
- package/src/types/shared.d.ts +15 -0
- package/src/types/tables.d.ts +27 -0
- package/types/index.d.ts +1 -1
- /package/src/components/ActionTable/Filters/{FilterFieldItem.vue → FilterItem.vue} +0 -0
package/src/helpers/request.ts
CHANGED
@@ -1,50 +1,69 @@
|
|
1
|
-
import {
|
1
|
+
import { Ref } from "vue";
|
2
|
+
import { danxOptions } from "../config";
|
3
|
+
import { AnyObject } from "../types";
|
2
4
|
|
3
|
-
interface RequestOptions {
|
4
|
-
baseUrl: string;
|
5
|
-
}
|
6
|
-
|
7
|
-
const requestOptions: Ref<RequestOptions> = ref({
|
8
|
-
baseUrl: ""
|
9
|
-
});
|
10
5
|
/**
|
11
6
|
* A simple request helper that wraps the fetch API
|
12
7
|
* to make GET and POST requests easier w/ JSON payloads
|
13
8
|
*/
|
14
9
|
export const request = {
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
url(url: string) {
|
11
|
+
if (url.startsWith("http")) {
|
12
|
+
return url;
|
13
|
+
}
|
14
|
+
return (danxOptions.value.request?.baseUrl || "").replace(/\/$/, "") + "/" + url;
|
15
|
+
},
|
16
|
+
|
17
|
+
async call(url: string, options: RequestInit): Promise<object> {
|
18
|
+
try {
|
19
|
+
const response = await fetch(request.url(url), options);
|
20
|
+
const result = await response.json();
|
21
|
+
|
22
|
+
if (response.status === 401) {
|
23
|
+
const onUnauthorized = danxOptions.value.request?.onUnauthorized;
|
24
|
+
return onUnauthorized ? onUnauthorized(response) : {
|
25
|
+
error: true,
|
26
|
+
message: "Unauthorized"
|
27
|
+
};
|
28
|
+
}
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
},
|
30
|
+
if (response.status > 400) {
|
31
|
+
if (result.exception && !result.error) {
|
32
|
+
result.error = true;
|
33
|
+
}
|
34
|
+
}
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
+
return result;
|
37
|
+
} catch (error: any) {
|
38
|
+
return {
|
39
|
+
error: error.message || "An error occurred fetching the data"
|
40
|
+
};
|
41
|
+
}
|
42
|
+
},
|
43
|
+
async get(url: string, options: RequestInit = {}): Promise<object> {
|
44
|
+
return await request.call(url, {
|
45
|
+
method: "get",
|
46
|
+
headers: {
|
47
|
+
Accept: "application/json",
|
48
|
+
"Content-Type": "application/json",
|
49
|
+
...danxOptions.value.request?.headers
|
50
|
+
},
|
51
|
+
...options
|
52
|
+
});
|
53
|
+
},
|
36
54
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
55
|
+
async post(url: string, data: AnyObject = {}, options: RequestInit = {}) {
|
56
|
+
return request.call(url, {
|
57
|
+
method: "post",
|
58
|
+
body: JSON.stringify(data),
|
59
|
+
headers: {
|
60
|
+
Accept: "application/json",
|
61
|
+
"Content-Type": "application/json",
|
62
|
+
...danxOptions.value.request?.headers
|
63
|
+
},
|
64
|
+
...options
|
65
|
+
});
|
66
|
+
}
|
48
67
|
};
|
49
68
|
|
50
69
|
/**
|
@@ -55,25 +74,25 @@ export const request = {
|
|
55
74
|
*
|
56
75
|
*/
|
57
76
|
export async function fetchResourceListWithSelected(fetchFn: (filter: object) => Promise<any[]>, list: Ref, id: string, filter: object): Promise<void> {
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
77
|
+
// First make sure we have the selected record, so we can always add it to the list
|
78
|
+
let selectedResource;
|
79
|
+
if (id) {
|
80
|
+
selectedResource = list.value.find((c: { id: string }) => c.id === id) || (await fetchFn({ id }))[0];
|
81
|
+
}
|
63
82
|
|
64
|
-
|
65
|
-
|
83
|
+
// Get the filtered campaign list
|
84
|
+
list.value = await fetchFn(filter);
|
66
85
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
86
|
+
// If our selected campaign is not in the filtered list, add it
|
87
|
+
if (selectedResource && !list.value.find((c: { id: string }) => c.id === id)) {
|
88
|
+
list.value.push(selectedResource);
|
89
|
+
}
|
71
90
|
}
|
72
91
|
|
73
92
|
/**
|
74
93
|
* Returns the value of the URL parameter (if it is set)
|
75
94
|
*/
|
76
95
|
export function getUrlParam(key: string, url?: string) {
|
77
|
-
|
78
|
-
|
96
|
+
const params = new URLSearchParams(url?.replace(/.*\?/, "") || window.location.search);
|
97
|
+
return params.get(key);
|
79
98
|
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { ActionTargetItem, AnyObject, ListControlsPagination } from "../types";
|
2
|
+
import { downloadFile } from "./downloadPdf";
|
3
|
+
import { request } from "./request";
|
4
|
+
|
5
|
+
export function useActionRoutes(baseUrl: string) {
|
6
|
+
return {
|
7
|
+
list(pager: ListControlsPagination) {
|
8
|
+
return request.post(`${baseUrl}/list`, pager);
|
9
|
+
},
|
10
|
+
summary(filter: AnyObject) {
|
11
|
+
return request.post(`${baseUrl}/summary`, { filter });
|
12
|
+
},
|
13
|
+
details(target: ActionTargetItem) {
|
14
|
+
return request.get(`${baseUrl}/${target.id}/details`);
|
15
|
+
},
|
16
|
+
fieldOptions() {
|
17
|
+
return request.get(`${baseUrl}/field-options`);
|
18
|
+
},
|
19
|
+
applyAction(action: string, target: ActionTargetItem | null, data: object) {
|
20
|
+
return request.post(`${baseUrl}/${target ? target.id : "new"}/apply-action`, { action, data });
|
21
|
+
},
|
22
|
+
batchAction(action: string, targets: ActionTargetItem[], data: object) {
|
23
|
+
return request.post(`${baseUrl}/batch-action`, { action, filter: { id: targets.map(r => r.id) }, data });
|
24
|
+
},
|
25
|
+
export(filter: AnyObject, name?: string) {
|
26
|
+
return downloadFile(`${baseUrl}/export`, name || "export.csv", { filter });
|
27
|
+
}
|
28
|
+
};
|
29
|
+
}
|
package/src/helpers/storage.ts
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
export function setItem(key: string, value: any) {
|
2
|
-
|
2
|
+
localStorage.setItem(key, JSON.stringify(value));
|
3
3
|
}
|
4
4
|
|
5
5
|
export function getItem(key: string, defaultValue: any = null) {
|
6
|
-
|
7
|
-
|
6
|
+
const item = localStorage.getItem(key);
|
7
|
+
try {
|
8
|
+
return item ? JSON.parse(item) : defaultValue;
|
9
|
+
} catch (e) {
|
10
|
+
return undefined;
|
11
|
+
}
|
8
12
|
}
|
package/src/helpers/utils.ts
CHANGED
@@ -6,72 +6,90 @@ import { Ref, watch } from "vue";
|
|
6
6
|
* eg: await sleep(5000);
|
7
7
|
*/
|
8
8
|
export function sleep(delay: number) {
|
9
|
-
|
9
|
+
return new Promise((resolve) => setTimeout(resolve, delay));
|
10
10
|
}
|
11
11
|
|
12
12
|
/**
|
13
13
|
* Wait for a ref to have a value and then resolve the promise
|
14
14
|
*/
|
15
15
|
export function waitForRef(ref: Ref, value: any) {
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
return new Promise<void>((resolve) => {
|
17
|
+
watch(ref, (newValue) => {
|
18
|
+
if (newValue === value) {
|
19
|
+
resolve();
|
20
|
+
}
|
21
|
+
});
|
22
|
+
});
|
23
23
|
}
|
24
24
|
|
25
25
|
/**
|
26
26
|
* Returns a number that is constrained to the given range.
|
27
27
|
*/
|
28
28
|
export function minmax(min: number, max: number, value: number) {
|
29
|
-
|
29
|
+
return Math.max(min, Math.min(max, value));
|
30
30
|
}
|
31
31
|
|
32
32
|
/**
|
33
33
|
* Convert meters to miles
|
34
34
|
*/
|
35
35
|
export function metersToMiles(meters: number) {
|
36
|
-
|
36
|
+
return meters * 0.000621371;
|
37
37
|
}
|
38
38
|
|
39
39
|
/**
|
40
40
|
* Convert miles to meters
|
41
41
|
*/
|
42
42
|
export function milesToMeters(miles: number) {
|
43
|
-
|
43
|
+
return miles / 0.000621371;
|
44
44
|
}
|
45
45
|
|
46
46
|
/**
|
47
47
|
* Parses a string for Lat and Long coords
|
48
48
|
*/
|
49
49
|
export function parseCoords(location: string) {
|
50
|
-
|
50
|
+
const latLong = location.split(",");
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
if (latLong.length === 2) {
|
53
|
+
const lat = parseFloat(latLong[0].trim());
|
54
|
+
const lng = parseFloat(latLong[1].trim());
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
if (!isNaN(lat) && !isNaN(lng)) {
|
57
|
+
return {
|
58
|
+
lat,
|
59
|
+
lng
|
60
|
+
};
|
61
|
+
}
|
62
|
+
}
|
63
63
|
|
64
|
-
|
64
|
+
return null;
|
65
65
|
}
|
66
66
|
|
67
67
|
/**
|
68
68
|
* Increment a name by adding a number to the end of it or incrementing the number if it already exists
|
69
69
|
*/
|
70
70
|
export function incrementName(name: string) {
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
name = (name || "New Item").trim();
|
72
|
+
const match = name.match(/(\d+)$/);
|
73
|
+
if (match) {
|
74
|
+
return name.replace(/\d+$/, (match: string) => "" + (parseInt(match) + 1));
|
75
|
+
}
|
76
|
+
return `${name} 1`;
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Check if a string is a valid JSON object. If an object is passed, always return true
|
81
|
+
*/
|
82
|
+
export function isJSON(string: string | object) {
|
83
|
+
if (!string) {
|
84
|
+
return false;
|
85
|
+
}
|
86
|
+
if (typeof string === "object") {
|
87
|
+
return true;
|
88
|
+
}
|
89
|
+
try {
|
90
|
+
JSON.parse(string);
|
91
|
+
return true;
|
92
|
+
} catch (e) {
|
93
|
+
return false;
|
94
|
+
}
|
77
95
|
}
|
@@ -1,80 +1,106 @@
|
|
1
1
|
.danx-app {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
2
|
+
.q-tab {
|
3
|
+
text-transform: capitalize
|
4
|
+
}
|
5
|
+
|
6
|
+
.q-table__card {
|
7
|
+
background: inherit;
|
8
|
+
color: inherit;
|
9
|
+
}
|
10
|
+
|
11
|
+
.q-checkbox__inner {
|
12
|
+
color: inherit;
|
13
|
+
}
|
14
|
+
|
15
|
+
.q-toolbar {
|
16
|
+
min-height: 0;
|
17
|
+
padding: 0;
|
18
|
+
flex-shrink: 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
.q-notification__actions {
|
22
|
+
color: inherit;
|
23
|
+
}
|
24
|
+
|
25
|
+
.q-date {
|
26
|
+
min-width: 100px;
|
27
|
+
|
28
|
+
.q-date__view {
|
29
|
+
min-height: 0;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
.q-field {
|
34
|
+
&.q-field--auto-height {
|
35
|
+
.q-field__control {
|
36
|
+
min-height: 0;
|
37
|
+
|
38
|
+
.q-field__native {
|
39
|
+
min-height: 0;
|
40
|
+
color: inherit;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
}
|
45
|
+
|
46
|
+
&.q-field--labeled {
|
47
|
+
.q-field__control-container {
|
48
|
+
padding-top: 1.1rem;
|
49
|
+
}
|
50
|
+
|
51
|
+
&.q-textarea {
|
52
|
+
.q-field__control-container {
|
53
|
+
padding-bottom: 1.1rem;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
.q-field__marginal, .q-field__input, .q-field__label {
|
59
|
+
color: inherit;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
.q-btn {
|
65
|
+
text-transform: inherit;
|
66
|
+
@apply bg-inherit text-inherit min-h-[auto] p-2;
|
67
|
+
|
68
|
+
&:before {
|
69
|
+
@apply shadow-none;
|
70
|
+
}
|
55
71
|
}
|
56
72
|
|
57
73
|
.q-item {
|
58
|
-
|
74
|
+
min-height: 0;
|
59
75
|
}
|
60
76
|
|
61
77
|
.q-tab-panels {
|
62
|
-
|
63
|
-
|
78
|
+
overflow: visible;
|
79
|
+
background: inherit;
|
80
|
+
|
81
|
+
.q-panel {
|
82
|
+
overflow: visible;
|
64
83
|
|
65
|
-
|
66
|
-
|
84
|
+
&.scroll {
|
85
|
+
overflow: auto;
|
86
|
+
}
|
67
87
|
|
68
|
-
|
69
|
-
|
70
|
-
|
88
|
+
.q-tab-panel {
|
89
|
+
padding: 0;
|
90
|
+
}
|
91
|
+
}
|
71
92
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
93
|
+
&.overflow-y-auto {
|
94
|
+
overflow-y: auto;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
.dx-dialog {
|
99
|
+
.q-card__section--vert {
|
100
|
+
@apply p-0;
|
101
|
+
}
|
102
|
+
}
|
76
103
|
|
77
|
-
|
78
|
-
|
79
|
-
}
|
104
|
+
.q-banner {
|
105
|
+
@apply min-h-[auto];
|
80
106
|
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
.dx-dialog {
|
2
|
+
.dx-dialog-card {
|
3
|
+
@apply overflow-hidden;
|
4
|
+
}
|
5
|
+
|
6
|
+
.dx-dialog-title {
|
7
|
+
@apply pl-6 pr-10 border-b border-gray-300 font-normal;
|
8
|
+
}
|
9
|
+
|
10
|
+
.dx-dialog-subtitle {
|
11
|
+
@apply mt-1 text-sm;
|
12
|
+
}
|
13
|
+
|
14
|
+
.dx-dialog-content {
|
15
|
+
@apply px-6 bg-gray-100;
|
16
|
+
}
|
17
|
+
|
18
|
+
.dx-dialog-actions {
|
19
|
+
@apply px-6 py-4 border-t border-gray-300;
|
20
|
+
}
|
21
|
+
|
22
|
+
.dx-dialog-button {
|
23
|
+
& + .dx-dialog-button {
|
24
|
+
@apply ml-4;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
.dx-close-button {
|
29
|
+
@apply p-4 text-black;
|
30
|
+
}
|
31
|
+
|
32
|
+
.dx-dialog-button-confirm .dx-dialog-button {
|
33
|
+
@apply bg-blue-600 text-white;
|
34
|
+
}
|
35
|
+
|
36
|
+
.dx-dialog-button-cancel {
|
37
|
+
@apply flex-grow;
|
38
|
+
}
|
39
|
+
|
40
|
+
&.dx-info-dialog {
|
41
|
+
.dx-dialog-actions {
|
42
|
+
& > .flex-grow {
|
43
|
+
@apply text-right;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
@@ -2,4 +2,22 @@
|
|
2
2
|
.q-field__label {
|
3
3
|
@apply text-sm text-gray-700;
|
4
4
|
}
|
5
|
+
|
6
|
+
&.dx-number-field {
|
7
|
+
&.dx-prepend-label {
|
8
|
+
@apply text-xs text-black font-normal;
|
9
|
+
}
|
10
|
+
|
11
|
+
&.dx-no-prepend-label {
|
12
|
+
@apply w-32;
|
13
|
+
|
14
|
+
.q-field__native {
|
15
|
+
@apply bg-white text-right;
|
16
|
+
}
|
17
|
+
|
18
|
+
.q-field__prepend {
|
19
|
+
padding: 0;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
5
23
|
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { VNode } from "vue";
|
2
|
+
import { TypedObject } from "./shared";
|
3
|
+
|
4
|
+
export interface ActionPanel {
|
5
|
+
name: string | number;
|
6
|
+
label: string;
|
7
|
+
category?: string;
|
8
|
+
class?: string | object;
|
9
|
+
enabled?: boolean | (() => boolean);
|
10
|
+
tabVnode?: (activePanel: string | number) => VNode | any;
|
11
|
+
vnode: (activePanel: string) => VNode | any;
|
12
|
+
}
|
13
|
+
|
14
|
+
export interface ActionTargetItem extends TypedObject {
|
15
|
+
isSaving?: boolean;
|
16
|
+
}
|
17
|
+
|
18
|
+
export type ActionTarget = ActionTargetItem[] | ActionTargetItem | null;
|
19
|
+
|
20
|
+
export interface ActionOptions {
|
21
|
+
name?: string;
|
22
|
+
alias?: string;
|
23
|
+
label?: string;
|
24
|
+
menu?: boolean;
|
25
|
+
batch?: boolean;
|
26
|
+
category?: string;
|
27
|
+
class?: string;
|
28
|
+
debounce?: number;
|
29
|
+
isApplying?: boolean;
|
30
|
+
optimistic?: boolean | ((action: ActionOptions, target: ActionTargetItem | null, input: any) => void);
|
31
|
+
trigger?: (target?: ActionTarget, input?: any) => Promise<any>;
|
32
|
+
vnode?: ((target: ActionTarget) => VNode) | any;
|
33
|
+
enabled?: (target: object) => boolean;
|
34
|
+
batchEnabled?: (targets: object[]) => boolean;
|
35
|
+
onAction?: (action: string | null | undefined, target: ActionTargetItem | null, input: any) => Promise<any> | void;
|
36
|
+
onBatchAction?: (action: string | null | undefined, targets: ActionTargetItem[], input: any) => Promise<any>;
|
37
|
+
onStart?: (action: ActionOptions | null, targets: ActionTarget, input: any) => boolean;
|
38
|
+
onSuccess?: (result: any, targets: ActionTarget, input: any) => any;
|
39
|
+
onBatchSuccess?: (result: any, targets: ActionTargetItem[], input: any) => any;
|
40
|
+
onError?: (result: any, targets: ActionTarget, input: any) => any;
|
41
|
+
onFinish?: (result: any, targets: ActionTarget, input: any) => any;
|
42
|
+
__type?: string;
|
43
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { QNotifyCreateOptions } from "quasar";
|
2
|
+
import { FileUploadOptions } from "./files";
|
3
|
+
import { RequestOptions } from "./requests";
|
4
|
+
|
5
|
+
export interface DanxOptions {
|
6
|
+
tinyMceApiKey?: string;
|
7
|
+
fileUpload?: FileUploadOptions;
|
8
|
+
request?: RequestOptions,
|
9
|
+
flashMessages?: {
|
10
|
+
default?: QNotifyCreateOptions;
|
11
|
+
success?: QNotifyCreateOptions;
|
12
|
+
warning?: QNotifyCreateOptions;
|
13
|
+
error?: QNotifyCreateOptions;
|
14
|
+
};
|
15
|
+
}
|