quasar-ui-danx 0.0.18 → 0.0.20
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/package.json +1 -1
- package/src/components/ActionTable/ActionTable.vue +22 -22
- package/src/components/ActionTable/index.ts +1 -1
- package/src/components/ActionTable/listActions.ts +19 -8
- package/src/components/ActionTable/tableColumns.ts +1 -1
- package/src/components/Utility/FlatList.vue +19 -0
- package/src/components/Utility/ImagePreview.vue +13 -10
- package/src/components/Utility/RefreshButton.vue +16 -0
- package/src/components/Utility/index.ts +2 -0
- package/src/config/index.ts +14 -0
- package/src/helpers/FileUpload.ts +8 -6
- package/src/helpers/singleFileUpload.ts +1 -1
- package/src/vue-plugin.js +2 -4
- /package/src/components/ActionTable/{RenderComponentColumn.vue → RenderComponent.vue} +0 -0
package/package.json
CHANGED
@@ -49,27 +49,27 @@
|
|
49
49
|
</template>
|
50
50
|
<template #body-cell="rowProps">
|
51
51
|
<q-td :key="rowProps.key" :props="rowProps">
|
52
|
-
<
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
</
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
</
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
</
|
72
|
-
</
|
52
|
+
<component
|
53
|
+
:is="rowProps.col.onClick ? 'a' : 'div'"
|
54
|
+
@click="() => rowProps.col.onClick && rowProps.col.onClick(rowProps.row)"
|
55
|
+
>
|
56
|
+
<template v-if="rowProps.col.component">
|
57
|
+
<RenderComponent
|
58
|
+
:row-props="rowProps"
|
59
|
+
@action="$emit('action', $event)"
|
60
|
+
/>
|
61
|
+
</template>
|
62
|
+
<template v-else-if="rowProps.col.fieldList">
|
63
|
+
<div v-for="field in rowProps.col.fieldList" :key="field">
|
64
|
+
{{ rowProps.row[field] }}
|
65
|
+
</div>
|
66
|
+
</template>
|
67
|
+
<template v-else>
|
68
|
+
<slot v-bind="{name: rowProps.col.name, row: rowProps.row, value: rowProps.value}">
|
69
|
+
{{ rowProps.value }}
|
70
|
+
</slot>
|
71
|
+
</template>
|
72
|
+
</component>
|
73
73
|
</q-td>
|
74
74
|
</template>
|
75
75
|
</q-table>
|
@@ -77,9 +77,9 @@
|
|
77
77
|
|
78
78
|
<script setup>
|
79
79
|
import { ref } from 'vue';
|
80
|
-
import { EmptyTableState, registerStickyScrolling, RenderComponentColumn, TableSummaryRow } from '.';
|
81
80
|
import { DragHandleIcon as RowResizeIcon } from '../../svg';
|
82
81
|
import { HandleDraggable } from '../DragAndDrop';
|
82
|
+
import { EmptyTableState, registerStickyScrolling, RenderComponent, TableSummaryRow } from './index';
|
83
83
|
|
84
84
|
defineEmits(['action', 'filter', 'update:quasar-pagination', 'update:selected-rows']);
|
85
85
|
defineProps({
|
@@ -6,5 +6,5 @@ export * from "./tableColumns";
|
|
6
6
|
export { default as ActionTable } from "./ActionTable.vue";
|
7
7
|
export { default as BatchActionMenu } from "./BatchActionMenu.vue";
|
8
8
|
export { default as EmptyTableState } from "./EmptyTableState.vue";
|
9
|
-
export { default as
|
9
|
+
export { default as RenderComponent } from "./RenderComponent.vue";
|
10
10
|
export { default as TableSummaryRow } from "./TableSummaryRow.vue";
|
@@ -16,9 +16,11 @@ export function useListActions(name, {
|
|
16
16
|
urlPattern = null,
|
17
17
|
filterDefaults = {}
|
18
18
|
}) {
|
19
|
+
let isInitialized = false;
|
19
20
|
const PAGE_SETTINGS_KEY = `${name}-pagination-settings`;
|
20
21
|
const pagedItems = ref(null);
|
21
22
|
const filter = ref({});
|
23
|
+
const globalFilter = ref({});
|
22
24
|
const showFilters = ref(getItem(`${name}-show-filters`, true));
|
23
25
|
const selectedRows = ref([]);
|
24
26
|
const isLoadingList = ref(false);
|
@@ -39,7 +41,7 @@ export function useListActions(name, {
|
|
39
41
|
const pager = computed(() => ({
|
40
42
|
perPage: quasarPagination.value.rowsPerPage,
|
41
43
|
page: quasarPagination.value.page,
|
42
|
-
filter: filter.value,
|
44
|
+
filter: { ...filter.value, ...globalFilter.value },
|
43
45
|
sort: columns ? mapSortBy(quasarPagination.value, columns) : undefined
|
44
46
|
}));
|
45
47
|
|
@@ -59,15 +61,17 @@ export function useListActions(name, {
|
|
59
61
|
}
|
60
62
|
|
61
63
|
async function loadList() {
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
if (isInitialized) {
|
65
|
+
isLoadingList.value = true;
|
66
|
+
setPagedItems(await listRoute(pager.value));
|
67
|
+
isLoadingList.value = false;
|
68
|
+
}
|
65
69
|
}
|
66
70
|
|
67
71
|
async function loadSummary() {
|
68
|
-
if (summaryRoute) {
|
72
|
+
if (summaryRoute && isInitialized) {
|
69
73
|
isLoadingSummary.value = true;
|
70
|
-
const summaryFilter = { id: null, ...filter.value };
|
74
|
+
const summaryFilter = { id: null, ...filter.value, ...globalFilter.value };
|
71
75
|
if (selectedRows.value.length) {
|
72
76
|
summaryFilter.id = selectedRows.value.map((row) => row.id);
|
73
77
|
}
|
@@ -146,7 +150,7 @@ export function useListActions(name, {
|
|
146
150
|
const newItems = await moreRoute({
|
147
151
|
page: index + 1,
|
148
152
|
perPage,
|
149
|
-
filter: filter.value
|
153
|
+
filter: { ...filter.value, ...globalFilter.value }
|
150
154
|
});
|
151
155
|
|
152
156
|
if (newItems && newItems.length > 0) {
|
@@ -169,6 +173,9 @@ export function useListActions(name, {
|
|
169
173
|
* Loads the filter and pagination settings from local storage.
|
170
174
|
*/
|
171
175
|
function loadSettings() {
|
176
|
+
// Only load settings when the class is fully initialized
|
177
|
+
if (!isInitialized) return;
|
178
|
+
|
172
179
|
const settings = getItem(PAGE_SETTINGS_KEY);
|
173
180
|
|
174
181
|
// Load the filter settings from local storage
|
@@ -324,12 +331,16 @@ export function useListActions(name, {
|
|
324
331
|
}
|
325
332
|
|
326
333
|
// Async load the settings for this Action List
|
327
|
-
setTimeout(
|
334
|
+
setTimeout(() => {
|
335
|
+
isInitialized = true;
|
336
|
+
loadSettings();
|
337
|
+
}, 1);
|
328
338
|
|
329
339
|
return {
|
330
340
|
// State
|
331
341
|
pagedItems,
|
332
342
|
filter,
|
343
|
+
globalFilter,
|
333
344
|
filterActiveCount,
|
334
345
|
showFilters,
|
335
346
|
summary,
|
@@ -11,7 +11,7 @@ export function useTableColumns(name, columns, options = { titleMinWidth: 120, t
|
|
11
11
|
const columnOrder = ref(getItem(COLUMN_ORDER_KEY) || []);
|
12
12
|
|
13
13
|
// Manages visible columns on the table
|
14
|
-
const hiddenColumnNames = ref(getItem(VISIBLE_COLUMNS_KEY,
|
14
|
+
const hiddenColumnNames = ref(getItem(VISIBLE_COLUMNS_KEY, []));
|
15
15
|
|
16
16
|
// Title columns will have their name appear on the first column of the table as part of the records' title
|
17
17
|
const titleColumnNames = ref(getItem(TITLE_COLUMNS_KEY, []));
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<template>
|
2
|
+
<ul>
|
3
|
+
<li v-for="item in items" :key="item[column]">
|
4
|
+
{{ item[column] }}
|
5
|
+
</li>
|
6
|
+
</ul>
|
7
|
+
</template>
|
8
|
+
<script setup>
|
9
|
+
defineProps({
|
10
|
+
items: {
|
11
|
+
type: Array,
|
12
|
+
required: true
|
13
|
+
},
|
14
|
+
column: {
|
15
|
+
type: String,
|
16
|
+
required: true
|
17
|
+
}
|
18
|
+
});
|
19
|
+
</script>
|
@@ -23,21 +23,21 @@
|
|
23
23
|
<PlayIcon class="w-16" />
|
24
24
|
</button>
|
25
25
|
</div>
|
26
|
-
<div
|
27
|
-
v-if="isPdf && !thumbUrl"
|
28
|
-
class="flex items-center justify-center h-full"
|
29
|
-
>
|
30
|
-
<PdfIcon class="w-24" />
|
31
|
-
</div>
|
32
26
|
<q-img
|
33
|
-
v-
|
27
|
+
v-if="thumbUrl || isPreviewable"
|
34
28
|
fit="scale-down"
|
35
29
|
class="non-selectable max-h-full max-w-full h-full"
|
36
30
|
:src="(thumbUrl || previewUrl) + '#t=0.1'"
|
37
31
|
preload="auto"
|
38
32
|
data-testid="previewed-image"
|
39
|
-
data-dusk="previewed-image"
|
40
33
|
/>
|
34
|
+
<div
|
35
|
+
v-else
|
36
|
+
class="flex items-center justify-center h-full"
|
37
|
+
>
|
38
|
+
<PdfIcon v-if="isPdf" class="w-24" />
|
39
|
+
<TextFileIcon v-else class="w-24" />
|
40
|
+
</div>
|
41
41
|
</div>
|
42
42
|
<div
|
43
43
|
v-if="$slots['action-button']"
|
@@ -98,7 +98,7 @@
|
|
98
98
|
</template>
|
99
99
|
|
100
100
|
<script setup>
|
101
|
-
import { DownloadIcon, PlayIcon } from '@heroicons/vue/outline';
|
101
|
+
import { DocumentTextIcon as TextFileIcon, DownloadIcon, PlayIcon } from '@heroicons/vue/outline';
|
102
102
|
import { computed, ref } from 'vue';
|
103
103
|
import { FullScreenCarouselDialog } from '.';
|
104
104
|
import { download } from '../../helpers';
|
@@ -148,6 +148,7 @@ const computedImage = computed(() => {
|
|
148
148
|
const mimeType = computed(
|
149
149
|
() => computedImage.value.type || computedImage.value.mime
|
150
150
|
);
|
151
|
+
const isImage = computed(() => mimeType.value.match(/^image\//));
|
151
152
|
const isVideo = computed(() => mimeType.value.match(/^video\//));
|
152
153
|
const isPdf = computed(() => mimeType.value.match(/^application\/pdf/));
|
153
154
|
const previewUrl = computed(
|
@@ -156,7 +157,9 @@ const previewUrl = computed(
|
|
156
157
|
const thumbUrl = computed(() => {
|
157
158
|
return computedImage.value.transcodes?.thumb?.url;
|
158
159
|
});
|
159
|
-
|
160
|
+
const isPreviewable = computed(() => {
|
161
|
+
return !!thumbUrl.value || isVideo.value || isImage.value;
|
162
|
+
});
|
160
163
|
const isConfirmingRemove = ref(false);
|
161
164
|
function onRemove() {
|
162
165
|
if (!isConfirmingRemove.value) {
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<template>
|
2
|
+
<QBtn
|
3
|
+
class="bg-neutral-plus-6"
|
4
|
+
:loading="loading"
|
5
|
+
>
|
6
|
+
<RefreshIcon class="w-5" />
|
7
|
+
</QBtn>
|
8
|
+
</template>
|
9
|
+
<script setup>
|
10
|
+
import { RefreshIcon } from "@heroicons/vue/solid";
|
11
|
+
|
12
|
+
defineEmits(["refresh"]);
|
13
|
+
defineProps({
|
14
|
+
loading: Boolean
|
15
|
+
});
|
16
|
+
</script>
|
@@ -1,11 +1,13 @@
|
|
1
1
|
export { default as CollapsableSidebar } from "./CollapsableSidebar.vue";
|
2
2
|
export { default as ConfirmDialog } from "./Dialogs/ConfirmDialog.vue";
|
3
3
|
export { default as ContentDrawer } from "./ContentDrawer.vue";
|
4
|
+
export { default as FlatList } from "./FlatList.vue";
|
4
5
|
export { default as FullScreenCarouselDialog } from "./Dialogs/FullscreenCarouselDialog.vue";
|
5
6
|
export { default as FullScreenDialog } from "./Dialogs/FullScreenDialog.vue";
|
6
7
|
export { default as ImagePreview } from "./ImagePreview.vue";
|
7
8
|
export { default as InfoDialog } from "./Dialogs/InfoDialog.vue";
|
8
9
|
export { default as InputDialog } from "./Dialogs/InputDialog.vue";
|
9
10
|
export { default as ListTransition } from "./Transitions/ListTransition.vue";
|
11
|
+
export { default as RefreshButton } from "./RefreshButton.vue";
|
10
12
|
export { default as SlideTransition } from "./Transitions/SlideTransition.vue";
|
11
13
|
export { default as StaggeredListTransition } from "./Transitions/StaggeredListTransition.vue";
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { uid } from "quasar";
|
2
|
+
import { danxOptions } from "../config";
|
2
3
|
import { resolveFileLocation } from "./files";
|
3
4
|
import { FlashMessages } from "./FlashMessages";
|
4
5
|
|
@@ -15,13 +16,9 @@ export class FileUpload {
|
|
15
16
|
onProgressCb = null;
|
16
17
|
onCompleteCb = null;
|
17
18
|
onAllCompleteCb = null;
|
18
|
-
options: FileUploadOptions =
|
19
|
-
directory: "file-upload",
|
20
|
-
presignedUploadUrl: null,
|
21
|
-
uploadCompletedUrl: null
|
22
|
-
};
|
19
|
+
options: FileUploadOptions = null;
|
23
20
|
|
24
|
-
constructor(files, options: FileUploadOptions) {
|
21
|
+
constructor(files, options: FileUploadOptions = null) {
|
25
22
|
if (!Array.isArray(files) && !(files instanceof FileList)) {
|
26
23
|
files = [files];
|
27
24
|
}
|
@@ -33,9 +30,14 @@ export class FileUpload {
|
|
33
30
|
this.onAllCompleteCb = null;
|
34
31
|
|
35
32
|
this.options = {
|
33
|
+
...danxOptions.fileUpload,
|
36
34
|
...this.options,
|
37
35
|
...options
|
38
36
|
};
|
37
|
+
|
38
|
+
if (!this.options.presignedUploadUrl) {
|
39
|
+
throw new Error("Please configure the danxOptions: import { configure } from 'quasar-ui-danx';");
|
40
|
+
}
|
39
41
|
this.prepare();
|
40
42
|
}
|
41
43
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { computed, ref } from "vue";
|
2
2
|
import { FileUpload, FileUploadOptions } from "./FileUpload";
|
3
3
|
|
4
|
-
export function useSingleFileUpload(options: FileUploadOptions) {
|
4
|
+
export function useSingleFileUpload(options: FileUploadOptions = null) {
|
5
5
|
const uploadedFile = ref(null);
|
6
6
|
const onCompleteCb = ref(null);
|
7
7
|
const onFileChangeCb = ref(null);
|
package/src/vue-plugin.js
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
+
export * from './config';
|
1
2
|
export * from './helpers';
|
2
|
-
export * from './components
|
3
|
-
export * from './components/ActionTable';
|
4
|
-
export * from './components/Utility';
|
3
|
+
export * from './components';
|
5
4
|
export * from './svg';
|
6
|
-
// export * from './components';
|
7
5
|
|
8
6
|
import packageJson from '../package.json';
|
9
7
|
|
File without changes
|