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.
Files changed (80) hide show
  1. package/dist/danx.es.js +7234 -6741
  2. package/dist/danx.es.js.map +1 -1
  3. package/dist/danx.umd.js +11 -5
  4. package/dist/danx.umd.js.map +1 -1
  5. package/dist/style.css +1 -1
  6. package/package.json +3 -1
  7. package/src/components/ActionTable/ActionTable.vue +31 -43
  8. package/src/components/ActionTable/Columns/ActionTableColumn.vue +19 -18
  9. package/src/components/ActionTable/Filters/CollapsableFiltersSidebar.vue +15 -14
  10. package/src/components/ActionTable/Filters/{FilterFieldList.vue → FilterList.vue} +26 -26
  11. package/src/components/ActionTable/Filters/FilterableField.vue +28 -31
  12. package/src/components/ActionTable/Filters/index.ts +2 -2
  13. package/src/components/ActionTable/Form/Fields/EditOnClickTextField.vue +71 -0
  14. package/src/components/ActionTable/Form/Fields/FieldLabel.vue +8 -13
  15. package/src/components/ActionTable/Form/Fields/FileUploadButton.vue +34 -33
  16. package/src/components/ActionTable/Form/Fields/MultiFileField.vue +48 -44
  17. package/src/components/ActionTable/Form/Fields/NumberField.vue +60 -59
  18. package/src/components/ActionTable/Form/Fields/SelectField.vue +124 -138
  19. package/src/components/ActionTable/Form/Fields/SelectWithChildrenField.vue +28 -33
  20. package/src/components/ActionTable/Form/Fields/SingleFileField.vue +15 -15
  21. package/src/components/ActionTable/Form/Fields/SliderNumberField.vue +45 -0
  22. package/src/components/ActionTable/Form/Fields/TextField.vue +47 -66
  23. package/src/components/ActionTable/Form/Fields/index.ts +2 -0
  24. package/src/components/ActionTable/Form/RenderedForm.vue +50 -13
  25. package/src/components/ActionTable/Form/Utilities/MaxLengthCounter.vue +17 -0
  26. package/src/components/ActionTable/Form/Utilities/index.ts +1 -0
  27. package/src/components/ActionTable/Form/index.ts +1 -0
  28. package/src/components/ActionTable/Layouts/ActionTableLayout.vue +22 -16
  29. package/src/components/ActionTable/Toolbars/ActionToolbar.vue +11 -11
  30. package/src/components/ActionTable/listControls.ts +104 -166
  31. package/src/components/ActionTable/listHelpers.ts +2 -3
  32. package/src/components/ActionTable/tableColumns.ts +53 -77
  33. package/src/components/AuditHistory/AuditHistoryItemValue.vue +26 -26
  34. package/src/components/PanelsDrawer/PanelsDrawer.vue +17 -4
  35. package/src/components/PanelsDrawer/PanelsDrawerPanels.vue +6 -11
  36. package/src/components/PanelsDrawer/PanelsDrawerTabs.vue +20 -20
  37. package/src/components/Utility/Dialogs/ConfirmActionDialog.vue +39 -0
  38. package/src/components/Utility/Dialogs/ConfirmDialog.vue +57 -117
  39. package/src/components/Utility/Dialogs/DialogLayout.vue +77 -0
  40. package/src/components/Utility/Dialogs/FullscreenCarouselDialog.vue +42 -36
  41. package/src/components/Utility/Dialogs/InfoDialog.vue +40 -80
  42. package/src/components/Utility/Dialogs/index.ts +1 -0
  43. package/src/components/Utility/Files/FilePreview.vue +76 -73
  44. package/src/components/Utility/Layouts/ContentDrawer.vue +24 -31
  45. package/src/components/Utility/Tools/ActionVnode.vue +3 -3
  46. package/src/components/Utility/Tools/RenderVnode.vue +20 -11
  47. package/src/components/Utility/Transitions/MaxHeightTransition.vue +26 -0
  48. package/src/components/Utility/Transitions/index.ts +1 -0
  49. package/src/config/index.ts +36 -31
  50. package/src/helpers/FileUpload.ts +295 -297
  51. package/src/helpers/FlashMessages.ts +80 -71
  52. package/src/helpers/actions.ts +102 -82
  53. package/src/helpers/download.ts +189 -189
  54. package/src/helpers/downloadPdf.ts +55 -52
  55. package/src/helpers/formats.ts +151 -109
  56. package/src/helpers/index.ts +2 -0
  57. package/src/helpers/multiFileUpload.ts +72 -58
  58. package/src/helpers/objectStore.ts +52 -0
  59. package/src/helpers/request.ts +70 -51
  60. package/src/helpers/routes.ts +29 -0
  61. package/src/helpers/storage.ts +7 -3
  62. package/src/helpers/utils.ts +47 -29
  63. package/src/styles/quasar-reset.scss +94 -68
  64. package/src/styles/themes/danx/dialogs.scss +47 -0
  65. package/src/styles/themes/danx/forms.scss +18 -0
  66. package/src/styles/themes/danx/index.scss +4 -0
  67. package/src/types/actions.d.ts +43 -0
  68. package/src/types/config.d.ts +15 -0
  69. package/src/types/controls.d.ts +99 -0
  70. package/src/types/dialogs.d.ts +32 -0
  71. package/src/types/fields.d.ts +20 -0
  72. package/src/types/files.d.ts +54 -0
  73. package/src/types/formats.d.ts +4 -0
  74. package/src/{components/ActionTable/Form/form.d.ts → types/forms.d.ts} +6 -0
  75. package/src/types/index.d.ts +12 -0
  76. package/src/types/requests.d.ts +13 -0
  77. package/src/types/shared.d.ts +15 -0
  78. package/src/types/tables.d.ts +27 -0
  79. package/types/index.d.ts +1 -1
  80. /package/src/components/ActionTable/Filters/{FilterFieldItem.vue → FilterItem.vue} +0 -0
@@ -1,50 +1,69 @@
1
- import { ref, Ref } from "vue";
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
- configure(options: RequestOptions) {
16
- requestOptions.value = options;
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
- url(url: string) {
20
- if (url.startsWith("http")) {
21
- return url;
22
- }
23
- return requestOptions.value.baseUrl + url;
24
- },
30
+ if (response.status > 400) {
31
+ if (result.exception && !result.error) {
32
+ result.error = true;
33
+ }
34
+ }
25
35
 
26
- async get(url: string, options = {}): Promise<object> {
27
- return fetch(request.url(url), {
28
- method: "get",
29
- headers: {
30
- Accept: "application/json",
31
- "Content-Type": "application/json"
32
- },
33
- ...options
34
- }).then((r) => r.json());
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
- async post(url: string, data = {}, options = {}) {
38
- return fetch(request.url(url), {
39
- method: "post",
40
- body: JSON.stringify(data),
41
- headers: {
42
- Accept: "application/json",
43
- "Content-Type": "application/json"
44
- },
45
- ...options
46
- }).then((r) => r.json());
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
- // First make sure we have the selected record, so we can always add it to the list
59
- let selectedResource;
60
- if (id) {
61
- selectedResource = list.value.find((c: { id: string }) => c.id === id) || (await fetchFn({ id }))[0];
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
- // Get the filtered campaign list
65
- list.value = await fetchFn(filter);
83
+ // Get the filtered campaign list
84
+ list.value = await fetchFn(filter);
66
85
 
67
- // If our selected campaign is not in the filtered list, add it
68
- if (selectedResource && !list.value.find((c: { id: string }) => c.id === id)) {
69
- list.value.push(selectedResource);
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
- const params = new URLSearchParams(url?.replace(/.*\?/, "") || window.location.search);
78
- return params.get(key);
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
+ }
@@ -1,8 +1,12 @@
1
1
  export function setItem(key: string, value: any) {
2
- localStorage.setItem(key, JSON.stringify(value));
2
+ localStorage.setItem(key, JSON.stringify(value));
3
3
  }
4
4
 
5
5
  export function getItem(key: string, defaultValue: any = null) {
6
- const item = localStorage.getItem(key);
7
- return item ? JSON.parse(item) : defaultValue;
6
+ const item = localStorage.getItem(key);
7
+ try {
8
+ return item ? JSON.parse(item) : defaultValue;
9
+ } catch (e) {
10
+ return undefined;
11
+ }
8
12
  }
@@ -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
- return new Promise((resolve) => setTimeout(resolve, delay));
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
- return new Promise<void>((resolve) => {
17
- watch(ref, (newValue) => {
18
- if (newValue === value) {
19
- resolve();
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
- return Math.max(min, Math.min(max, value));
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
- return meters * 0.000621371;
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
- return miles / 0.000621371;
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
- const latLong = location.split(",");
50
+ const latLong = location.split(",");
51
51
 
52
- if (latLong.length === 2) {
53
- const lat = parseFloat(latLong[0].trim());
54
- const lng = parseFloat(latLong[1].trim());
52
+ if (latLong.length === 2) {
53
+ const lat = parseFloat(latLong[0].trim());
54
+ const lng = parseFloat(latLong[1].trim());
55
55
 
56
- if (!isNaN(lat) && !isNaN(lng)) {
57
- return {
58
- lat,
59
- lng
60
- };
61
- }
62
- }
56
+ if (!isNaN(lat) && !isNaN(lng)) {
57
+ return {
58
+ lat,
59
+ lng
60
+ };
61
+ }
62
+ }
63
63
 
64
- return null;
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
- 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`;
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
- .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
- }
19
-
20
- .q-notification__actions {
21
- color: inherit;
22
- }
23
-
24
- .q-date {
25
- min-width: 100px;
26
-
27
- .q-date__view {
28
- min-height: 0;
29
- }
30
- }
31
-
32
- .q-field {
33
- &.q-field--auto-height {
34
- .q-field__control {
35
- min-height: 0;
36
-
37
- .q-field__native {
38
- min-height: 0;
39
- color: inherit;
40
- }
41
- }
42
-
43
- }
44
-
45
- &.q-field--labeled {
46
- .q-field__control-container {
47
- padding-top: 1.1rem;
48
- }
49
- }
50
-
51
- .q-field__marginal, .q-field__input, .q-field__label {
52
- color: inherit;
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
- min-height: 0;
74
+ min-height: 0;
59
75
  }
60
76
 
61
77
  .q-tab-panels {
62
- overflow: visible;
63
- background: inherit;
78
+ overflow: visible;
79
+ background: inherit;
80
+
81
+ .q-panel {
82
+ overflow: visible;
64
83
 
65
- .q-panel {
66
- overflow: visible;
84
+ &.scroll {
85
+ overflow: auto;
86
+ }
67
87
 
68
- &.scroll {
69
- overflow: auto;
70
- }
88
+ .q-tab-panel {
89
+ padding: 0;
90
+ }
91
+ }
71
92
 
72
- .q-tab-panel {
73
- padding: 0;
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
- &.overflow-y-auto {
78
- overflow-y: auto;
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
  }
@@ -1,3 +1,7 @@
1
1
  @import "action-table";
2
2
  @import "buttons";
3
+ @import "dialogs";
4
+ @import "forms";
5
+ @import "panels";
6
+ @import "sidebar";
3
7
  @import "toolbar";
@@ -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
+ }