quasar-ui-danx 0.4.1 → 0.4.3
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/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
|
+
}
|