quasar-ui-danx 0.4.2 → 0.4.4

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.
Files changed (75) hide show
  1. package/dist/danx.es.js +7127 -6615
  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 +28 -41
  8. package/src/components/ActionTable/Columns/ActionTableColumn.vue +19 -18
  9. package/src/components/ActionTable/Filters/CollapsableFiltersSidebar.vue +6 -6
  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/MultiFileField.vue +48 -44
  16. package/src/components/ActionTable/Form/Fields/SelectField.vue +24 -38
  17. package/src/components/ActionTable/Form/Fields/SelectWithChildrenField.vue +28 -33
  18. package/src/components/ActionTable/Form/Fields/SingleFileField.vue +15 -15
  19. package/src/components/ActionTable/Form/Fields/SliderNumberField.vue +45 -0
  20. package/src/components/ActionTable/Form/Fields/TextField.vue +47 -66
  21. package/src/components/ActionTable/Form/Fields/index.ts +2 -0
  22. package/src/components/ActionTable/Form/RenderedForm.vue +50 -9
  23. package/src/components/ActionTable/Form/Utilities/MaxLengthCounter.vue +17 -0
  24. package/src/components/ActionTable/Form/Utilities/index.ts +1 -0
  25. package/src/components/ActionTable/Form/index.ts +1 -0
  26. package/src/components/ActionTable/Layouts/ActionTableLayout.vue +16 -15
  27. package/src/components/ActionTable/Toolbars/ActionToolbar.vue +6 -6
  28. package/src/components/ActionTable/listControls.ts +106 -166
  29. package/src/components/ActionTable/listHelpers.ts +2 -3
  30. package/src/components/ActionTable/tableColumns.ts +3 -27
  31. package/src/components/AuditHistory/AuditHistoryItemValue.vue +26 -26
  32. package/src/components/PanelsDrawer/PanelsDrawer.vue +17 -4
  33. package/src/components/PanelsDrawer/PanelsDrawerPanels.vue +6 -11
  34. package/src/components/PanelsDrawer/PanelsDrawerTabs.vue +20 -20
  35. package/src/components/Utility/Dialogs/ConfirmActionDialog.vue +39 -0
  36. package/src/components/Utility/Dialogs/ConfirmDialog.vue +10 -24
  37. package/src/components/Utility/Dialogs/DialogLayout.vue +10 -28
  38. package/src/components/Utility/Dialogs/FullscreenCarouselDialog.vue +42 -36
  39. package/src/components/Utility/Dialogs/index.ts +1 -0
  40. package/src/components/Utility/Files/FilePreview.vue +76 -73
  41. package/src/components/Utility/Layouts/ContentDrawer.vue +24 -31
  42. package/src/components/Utility/Tools/ActionVnode.vue +3 -3
  43. package/src/components/Utility/Tools/RenderVnode.vue +1 -1
  44. package/src/components/Utility/Transitions/MaxHeightTransition.vue +26 -0
  45. package/src/components/Utility/Transitions/index.ts +1 -0
  46. package/src/config/index.ts +36 -31
  47. package/src/helpers/FileUpload.ts +295 -297
  48. package/src/helpers/FlashMessages.ts +80 -71
  49. package/src/helpers/actions.ts +102 -82
  50. package/src/helpers/download.ts +189 -189
  51. package/src/helpers/downloadPdf.ts +55 -52
  52. package/src/helpers/formats.ts +151 -109
  53. package/src/helpers/index.ts +2 -0
  54. package/src/helpers/multiFileUpload.ts +72 -58
  55. package/src/helpers/objectStore.ts +52 -0
  56. package/src/helpers/request.ts +70 -51
  57. package/src/helpers/routes.ts +29 -0
  58. package/src/helpers/storage.ts +7 -3
  59. package/src/helpers/utils.ts +47 -29
  60. package/src/styles/quasar-reset.scss +16 -1
  61. package/src/styles/themes/danx/dialogs.scss +4 -0
  62. package/src/types/actions.d.ts +43 -0
  63. package/src/types/config.d.ts +15 -0
  64. package/src/types/controls.d.ts +99 -0
  65. package/src/types/dialogs.d.ts +32 -0
  66. package/src/types/fields.d.ts +20 -0
  67. package/src/types/files.d.ts +54 -0
  68. package/src/types/formats.d.ts +4 -0
  69. package/src/{components/ActionTable/Form/form.d.ts → types/forms.d.ts} +6 -0
  70. package/src/types/index.d.ts +12 -0
  71. package/src/types/requests.d.ts +13 -0
  72. package/src/types/shared.d.ts +15 -0
  73. package/src/types/tables.d.ts +27 -0
  74. package/types/index.d.ts +1 -1
  75. /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
  }
@@ -15,6 +15,7 @@
15
15
  .q-toolbar {
16
16
  min-height: 0;
17
17
  padding: 0;
18
+ flex-shrink: 0;
18
19
  }
19
20
 
20
21
  .q-notification__actions {
@@ -46,6 +47,12 @@
46
47
  .q-field__control-container {
47
48
  padding-top: 1.1rem;
48
49
  }
50
+
51
+ &.q-textarea {
52
+ .q-field__control-container {
53
+ padding-bottom: 1.1rem;
54
+ }
55
+ }
49
56
  }
50
57
 
51
58
  .q-field__marginal, .q-field__input, .q-field__label {
@@ -56,7 +63,11 @@
56
63
 
57
64
  .q-btn {
58
65
  text-transform: inherit;
59
- @apply bg-inherit text-inherit;
66
+ @apply bg-inherit text-inherit min-h-[auto] p-2;
67
+
68
+ &:before {
69
+ @apply shadow-none;
70
+ }
60
71
  }
61
72
 
62
73
  .q-item {
@@ -89,3 +100,7 @@
89
100
  @apply p-0;
90
101
  }
91
102
  }
103
+
104
+ .q-banner {
105
+ @apply min-h-[auto];
106
+ }
@@ -1,4 +1,8 @@
1
1
  .dx-dialog {
2
+ .dx-dialog-card {
3
+ @apply overflow-hidden;
4
+ }
5
+
2
6
  .dx-dialog-title {
3
7
  @apply pl-6 pr-10 border-b border-gray-300 font-normal;
4
8
  }
@@ -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
+ }
@@ -0,0 +1,99 @@
1
+ import { ComputedRef, Ref, ShallowRef } from "vue";
2
+ import { ActionTargetItem } from "./actions";
3
+ import { LabelValueItem } from "./shared";
4
+
5
+ export interface ListControlsFilter {
6
+ [key: string]: object | object[] | null | undefined | string | number | boolean;
7
+ }
8
+
9
+ export interface FilterableField {
10
+ name: string;
11
+ label: string;
12
+ type: string;
13
+ options?: string[] | number[] | LabelValueItem[];
14
+ inline?: boolean;
15
+ }
16
+
17
+ export interface FilterGroup {
18
+ name?: string;
19
+ flat?: boolean;
20
+ fields: FilterableField[];
21
+ }
22
+
23
+ export interface ListControlsRoutes {
24
+ list: (pager: object) => Promise<ActionTargetItem[]>;
25
+ details?: (item: object) => Promise<ActionTargetItem> | null;
26
+ summary?: (filter: object | null) => Promise<object> | null;
27
+ fieldOptions?: (filter: object | null) => Promise<object> | null;
28
+ more?: (pager: object) => Promise<ActionTargetItem[]> | null;
29
+ export: (filter?: ListControlsFilter) => Promise<void>;
30
+ }
31
+
32
+ export interface ListControlsOptions {
33
+ label?: string,
34
+ routes: ListControlsRoutes;
35
+ urlPattern?: RegExp | null;
36
+ filterDefaults?: Record<string, object>;
37
+ refreshFilters?: boolean;
38
+ }
39
+
40
+ export interface ListControlsPagination {
41
+ __sort?: object[] | null;
42
+ sortBy?: string | null;
43
+ descending?: boolean;
44
+ page?: number;
45
+ rowsNumber?: number;
46
+ rowsPerPage?: number;
47
+ }
48
+
49
+ export interface PagedItems {
50
+ data: ActionTargetItem[] | undefined;
51
+ meta: {
52
+ total: number;
53
+ last_page?: number;
54
+ } | undefined;
55
+ }
56
+
57
+ export interface ActionController {
58
+ name: string;
59
+ label: string;
60
+ pagedItems: Ref<PagedItems | null>;
61
+ activeFilter: Ref<ListControlsFilter>;
62
+ globalFilter: Ref<ListControlsFilter>;
63
+ filterActiveCount: ComputedRef<number>;
64
+ showFilters: Ref<boolean>;
65
+ summary: ShallowRef<object | null>;
66
+ selectedRows: ShallowRef<ActionTargetItem[]>;
67
+ isLoadingList: Ref<boolean>;
68
+ isLoadingFilters: Ref<boolean>;
69
+ isLoadingSummary: Ref<boolean>;
70
+ pager: ComputedRef<{
71
+ perPage: number;
72
+ page: number;
73
+ filter: ListControlsFilter;
74
+ sort: object[] | undefined;
75
+ }>;
76
+ pagination: ShallowRef<ListControlsPagination>;
77
+ activeItem: ShallowRef<ActionTargetItem | null>;
78
+ activePanel: ShallowRef<string | null>;
79
+
80
+ // Actions
81
+ initialize: () => void;
82
+ resetPaging: () => void;
83
+ setPagination: (updated: ListControlsPagination) => void;
84
+ setSelectedRows: (selection: ActionTargetItem[]) => void;
85
+ clearSelectedRows: () => void;
86
+ loadList: (filter?: ListControlsFilter) => Promise<void>;
87
+ loadSummary: (filter?: ListControlsFilter) => Promise<void>;
88
+ loadListAndSummary: (filter?: ListControlsFilter) => Promise<void>;
89
+ loadMore: (index: number, perPage?: number) => Promise<boolean>;
90
+ getActiveItemDetails: () => Promise<void>;
91
+ refreshAll: () => Promise<void[]>;
92
+ exportList: (filter?: ListControlsFilter) => Promise<void>;
93
+ setActiveItem: (item: ActionTargetItem | null) => void;
94
+ getNextItem: (offset: number) => Promise<void>;
95
+ activatePanel: (item: ActionTargetItem | null, panel: string) => void;
96
+ setActiveFilter: (filter?: ListControlsFilter) => void;
97
+ applyFilterFromUrl: (url: string, filters?: Ref<FilterGroup[]> | null) => void;
98
+ getFieldOptions: (field: string) => any[];
99
+ }
@@ -0,0 +1,32 @@
1
+ import { ActionTargetItem } from "./actions";
2
+
3
+ export interface DialogLayoutProps {
4
+ modelValue?: string | boolean | object;
5
+ title?: string;
6
+ titleClass?: string;
7
+ subtitle?: string;
8
+ content?: string;
9
+ backdropDismiss?: boolean;
10
+ maximized?: boolean;
11
+ fullWidth?: boolean;
12
+ fullHeight?: boolean;
13
+ contentClass?: string;
14
+ }
15
+
16
+ export interface ConfirmDialogProps extends DialogLayoutProps {
17
+ disabled?: boolean;
18
+ isSaving?: boolean;
19
+ closeOnConfirm?: boolean;
20
+ hideConfirm?: boolean;
21
+ confirmText?: string;
22
+ cancelText?: string;
23
+ confirmClass?: string;
24
+ contentClass?: string;
25
+ }
26
+
27
+ export interface ConfirmActionDialogProps extends ConfirmDialogProps {
28
+ action: string,
29
+ label?: string,
30
+ target: ActionTargetItem | ActionTargetItem[]
31
+ message?: string,
32
+ }
@@ -0,0 +1,20 @@
1
+ import { QInputProps } from "quasar";
2
+ import { FormField } from "./forms";
3
+
4
+ export interface TextFieldProps {
5
+ modelValue?: string,
6
+ field?: FormField,
7
+ type?: QInputProps["type"],
8
+ label?: string,
9
+ labelClass?: string,
10
+ parentClass?: string,
11
+ inputClass?: string,
12
+ allowOverMax?: boolean,
13
+ maxLength?: number;
14
+ autogrow?: boolean;
15
+ noLabel?: boolean;
16
+ showName?: boolean;
17
+ disabled?: boolean;
18
+ readonly?: boolean;
19
+ debounce?: string | number;
20
+ }
@@ -0,0 +1,54 @@
1
+ export interface FileUploadOptions {
2
+ directory?: string,
3
+ createPresignedUpload?: ((path: string, name: string, mime?: string) => Promise<UploadedFile>) | null;
4
+ completePresignedUpload?: ((fileId: string) => Promise<UploadedFile>) | null;
5
+ }
6
+
7
+ export interface XHRFileUpload {
8
+ file: UploadedFile;
9
+ xhr?: XMLHttpRequest | null;
10
+ formData: FormData;
11
+ isComplete: boolean;
12
+ body?: FormData | UploadedFile | string;
13
+ }
14
+
15
+ export interface UploadedFile {
16
+ id: string,
17
+ resource_id?: string;
18
+ name: string,
19
+ size: number,
20
+ type: string;
21
+ mimeType?: string;
22
+ mime?: string;
23
+ progress?: number;
24
+ location?: string;
25
+ blobUrl?: string;
26
+ url?: string;
27
+ }
28
+
29
+ export interface FileUploadCompleteCallbackParams {
30
+ file?: UploadedFile | null;
31
+ uploadedFile?: UploadedFile | null;
32
+ }
33
+
34
+ export interface FileUploadAllCompleteCallbackParams {
35
+ files: XHRFileUpload[];
36
+ }
37
+
38
+ export interface FileUploadProgressCallbackParams {
39
+ file?: UploadedFile | null;
40
+ progress: number;
41
+ }
42
+
43
+ export interface FileUploadErrorCallbackParams {
44
+ e: InputEvent;
45
+ file: UploadedFile;
46
+ error: any;
47
+ }
48
+
49
+ export type FileUploadCompleteCallback = (params: FileUploadCompleteCallbackParams) => void
50
+ export type FileUploadAllCompleteCallback = (params: FileUploadAllCompleteCallbackParams) => void
51
+ export type FileUploadProgressCallback = (params: FileUploadProgressCallbackParams) => void
52
+ export type FileUploadErrorCallback = (params: FileUploadErrorCallbackParams) => void
53
+ export type OnFilesChangeCallback = (files: UploadedFile[]) => void;
54
+ export type VoidCallback = () => void;
@@ -0,0 +1,4 @@
1
+ export interface fDateOptions {
2
+ format?: string,
3
+ empty?: string
4
+ }
@@ -10,10 +10,16 @@ export interface FormField {
10
10
  type?: string;
11
11
  name: string;
12
12
  label: string;
13
+ placeholder?: string;
13
14
  vnode?: ((props) => VNode | any);
14
15
  component?: any;
16
+ clearable?: boolean;
15
17
  required?: boolean;
16
18
  required_group?: string;
19
+ toggleIndeterminate?: boolean;
20
+ inline?: boolean;
21
+ maxLength?: number;
22
+ minLength?: number;
17
23
  options?: FormFieldOption[];
18
24
  }
19
25
 
@@ -0,0 +1,12 @@
1
+ export * from "./actions";
2
+ export * from "./config";
3
+ export * from "./controls";
4
+ export * from "./dialogs";
5
+ export * from "./fields";
6
+ export * from "./files";
7
+ export * from "./formats";
8
+ export * from "./forms";
9
+ export * from "./requests";
10
+ export * from "./shared";
11
+ export * from "./tables";
12
+
@@ -0,0 +1,13 @@
1
+ export interface HttpResponse {
2
+ headers: any;
3
+ data?: any;
4
+ ok?: boolean;
5
+
6
+ blob(): any;
7
+ }
8
+
9
+ export interface RequestOptions {
10
+ baseUrl?: string;
11
+ headers?: object;
12
+ onUnauthorized?: (response) => object;
13
+ }