quasar-ui-danx 0.0.26 → 0.0.28

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar-ui-danx",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "author": "Dan <dan@flytedesk.com>",
5
5
  "description": "DanX Vue / Quasar component library",
6
6
  "license": "MIT",
@@ -5,19 +5,11 @@
5
5
  :items="items"
6
6
  @action-item="onAction"
7
7
  />
8
- <Component
9
- v-if="confirmDialog"
10
- :is="confirmDialog.is"
11
- v-bind="confirmDialog.props"
12
- :is-saving="isSaving"
13
- @close="onCancel"
14
- @confirm="onConfirmAction"
15
- />
16
8
  </div>
17
9
  </template>
18
10
  <script setup>
19
11
  import { ref, shallowRef } from 'vue';
20
- import { FlashMessages } from '../../helpers';
12
+ import { FlashMessages, performAction } from '../../helpers';
21
13
  import { PopoverMenu } from '../Utility';
22
14
 
23
15
  const emit = defineEmits(['action']);
@@ -40,13 +32,7 @@ const isSaving = ref(false);
40
32
  function onAction(item) {
41
33
  emit('action', item);
42
34
 
43
- activeAction.value = item;
44
-
45
- if (item.confirmDialog) {
46
- confirmDialog.value = typeof item.confirmDialog === 'function' ? item.confirmDialog(props.rows) : item.confirmDialog;
47
- } else {
48
- console.log('handle default action');
49
- }
35
+ performAction(item, props.rows);
50
36
  }
51
37
 
52
38
  function onCancel() {
@@ -7,7 +7,7 @@
7
7
  name="admin-ads"
8
8
  @update:collapse="$emit('update:show-filters', !$event)"
9
9
  >
10
- <FilterGroupList
10
+ <FilterFieldList
11
11
  :filter="filter"
12
12
  :filter-fields="filterFields"
13
13
  @update:filter="$emit('update:filter', $event)"
@@ -15,7 +15,7 @@
15
15
  </CollapsableSidebar>
16
16
  </template>
17
17
  <script setup>
18
- import { FilterGroupList } from '.';
18
+ import { FilterFieldList } from '.';
19
19
  import { CollapsableSidebar } from '../../Utility';
20
20
 
21
21
  defineEmits(['update:filter', 'update:show-filters']);
@@ -17,7 +17,7 @@
17
17
  />
18
18
  </template>
19
19
 
20
- <FilterGroupItem
20
+ <FilterFieldItem
21
21
  v-else
22
22
  :name="group.name"
23
23
  :count="activeCountByGroup[group.name]"
@@ -31,7 +31,7 @@
31
31
  class="mb-4"
32
32
  @update:model-value="updateFilter(field, $event)"
33
33
  />
34
- </FilterGroupItem>
34
+ </FilterFieldItem>
35
35
 
36
36
  <q-separator
37
37
  v-if="index < (filterFields.length - 1)"
@@ -44,7 +44,7 @@
44
44
  <script setup>
45
45
  import { computed } from 'vue';
46
46
  import FilterableField from './FilterableField';
47
- import FilterGroupItem from './FilterGroupItem';
47
+ import FilterFieldItem from './FilterFieldItem';
48
48
 
49
49
  const emit = defineEmits(['update:filter']);
50
50
  const props = defineProps({
@@ -1,6 +1,6 @@
1
1
  export {
2
2
  default as CollapsableFiltersSidebar
3
3
  } from "./CollapsableFiltersSidebar.vue";
4
- export { default as FilterGroupList } from "./FilterGroupList.vue";
4
+ export { default as FilterFieldList } from "./FilterFieldList.vue";
5
5
  export { default as FilterListToggle } from "./FilterListToggle.vue";
6
6
  export { default as FilterToolbarLayout } from "./FilterToolbarLayout.vue";
@@ -0,0 +1,15 @@
1
+ <template>
2
+ <div class="flex flex-grow flex-col flex-nowrap overflow-hidden h-full bg-white">
3
+ <slot name="top" />
4
+ <slot name="toolbar" />
5
+ <div class="flex flex-nowrap flex-grow overflow-hidden w-full">
6
+ <slot name="filters" />
7
+ <slot />
8
+ </div>
9
+ <ActionPerformerTool v-if="activeAction" :targets="actionTargets" :action="activeAction" />
10
+ </div>
11
+ </template>
12
+ <script setup>
13
+ import { actionTargets, activeAction } from '../../../helpers';
14
+ import { ActionPerformerTool } from '../../Utility';
15
+ </script>
@@ -0,0 +1 @@
1
+ export { default as ActionTableLayout } from "./ActionTableLayout.vue";
@@ -1,5 +1,6 @@
1
1
  export * from "./Filters";
2
2
  export * from "./Form";
3
+ export * from "./Layouts";
3
4
  export * from "./listActions";
4
5
  export * from "./listHelpers";
5
6
  export * from "./tableColumns";
@@ -10,7 +10,6 @@ export function useListActions(name, {
10
10
  applyActionRoute = null,
11
11
  applyBatchActionRoute = null,
12
12
  itemDetailsRoute = null,
13
- filterGroups = null,
14
13
  refreshFilters = false,
15
14
  urlPattern = null,
16
15
  filterDefaults = {}
@@ -98,10 +97,10 @@ export function useListActions(name, {
98
97
  /**
99
98
  * Watches for a filter URL parameter and applies the filter if it is set.
100
99
  */
101
- function applyFilterFromUrl(url, filterGroups = null) {
100
+ function applyFilterFromUrl(url, filterFields = null) {
102
101
  if (url.match(urlPattern)) {
103
102
  // A flat list of valid filterable field names
104
- const validFilterKeys = filterGroups?.value?.map(group => group.fields.map(field => field.name)).flat();
103
+ const validFilterKeys = filterFields?.value?.map(group => group.fields.map(field => field.name)).flat();
105
104
 
106
105
  const urlFilter = getFilterFromUrl(url, validFilterKeys);
107
106
 
@@ -352,7 +351,6 @@ export function useListActions(name, {
352
351
  isApplyingBatchAction,
353
352
  activeItem,
354
353
  formTab,
355
- filterGroups,
356
354
 
357
355
  // Actions
358
356
  loadSummary,
@@ -0,0 +1,42 @@
1
+ <template>
2
+ <div>
3
+ <Component v-if="confirmDialog" :is="confirmDialog" :is-saving="isSaving" @confirm="onConfirmAction" />
4
+ </div>
5
+ </template>
6
+ <script setup>
7
+ import { onMounted, ref, shallowRef } from 'vue';
8
+
9
+ const props = defineProps({
10
+ action: {
11
+ type: Object,
12
+ required: true
13
+ },
14
+ targets: {
15
+ type: Array,
16
+ required: true
17
+ }
18
+ });
19
+
20
+ const confirmDialog = shallowRef(props.action.confirmDialog ? props.action.confirmDialog(props.targets) : null);
21
+ const isSaving = ref(null);
22
+
23
+ onMounted(async () => {
24
+ console.log('mounting action', props.action, props.targets);
25
+ // If there is no dialog, we auto-confirm the action
26
+ if (!confirmDialog.value) {
27
+ onConfirmAction();
28
+ }
29
+ });
30
+
31
+ function onConfirmAction(input) {
32
+ console.log('action confirmed', input);
33
+ if (!props.action.onAction) {
34
+ throw new Error('No onAction handler found for the selected action:' + props.action.name);
35
+ }
36
+
37
+ isSaving.value = true;
38
+ props.action.onAction().then(() => {
39
+ isSaving.value = false;
40
+ });
41
+ }
42
+ </script>
@@ -0,0 +1 @@
1
+ export { default as ActionPerformerTool } from "./ActionPerformerTool.vue";
@@ -4,4 +4,5 @@ export * from "./Files";
4
4
  export * from "./Formats";
5
5
  export * from "./Layouts";
6
6
  export * from "./Popovers";
7
+ export * from "./Tools";
7
8
  export * from "./Transitions";
@@ -9,6 +9,7 @@ export * from "./FlashMessages";
9
9
  export * from "./formats";
10
10
  export * from "./http";
11
11
  export * from "./multiFileUpload";
12
+ export * from "./performAction";
12
13
  export * from "./singleFileUpload";
13
14
  export * from "./storage";
14
15
  export * from "./utils";
@@ -0,0 +1,10 @@
1
+ import { ref } from "vue";
2
+
3
+ export const activeAction = ref(null);
4
+ export const actionTargets = ref([]);
5
+
6
+ export async function performAction(action, targets) {
7
+ console.log("performing action", action, targets);
8
+ activeAction.value = action;
9
+ actionTargets.value = targets;
10
+ }