quasar-ui-danx 0.4.46 → 0.4.48

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.4.46",
3
+ "version": "0.4.48",
4
4
  "author": "Dan <dan@flytedesk.com>",
5
5
  "description": "DanX Vue / Quasar component library",
6
6
  "license": "MIT",
@@ -1,64 +1,57 @@
1
1
  <template>
2
2
  <div class="group flex items-center flex-nowrap gap-x-1 relative">
3
- <QInnerLoading
4
- v-if="loading"
5
- showing
6
- class="bg-sky-900 opacity-50 z-10 rounded"
7
- color="teal"
8
- />
9
3
  <ShowHideButton
10
4
  v-if="selectable"
11
5
  v-model="isSelecting"
12
6
  :disable="disable"
13
7
  :label="selectText"
8
+ :saving="loading"
14
9
  :class="selectClass"
15
10
  :show-icon="selectIcon || DefaultSelectIcon"
16
11
  class="mr-2"
12
+ :size="size"
17
13
  >
18
- <template #label>
19
- <QMenu
20
- :model-value="isSelecting"
21
- @before-hide="isSelecting = false"
22
- @hide="isSelecting = false"
23
- >
24
- <div>
25
- <div
26
- v-for="option in options"
27
- :key="option.id"
28
- v-ripple
29
- class="cursor-pointer flex items-center relative"
30
- :class="{'bg-sky-900 hover:bg-sky-800': selected?.id === option.id, 'hover:bg-slate-600': selected?.id !== option.id}"
31
- @click="selected = option"
32
- >
33
- <div class="flex-grow px-4 py-2">
34
- {{ option.name }}
35
- </div>
14
+ <QMenu
15
+ :model-value="isSelecting"
16
+ @before-hide="isSelecting = false"
17
+ @hide="isSelecting = false"
18
+ >
19
+ <div>
20
+ <div
21
+ v-for="option in options"
22
+ :key="option.id"
23
+ v-ripple
24
+ class="cursor-pointer flex items-center relative"
25
+ :class="{'bg-sky-900 hover:bg-sky-800': selected?.id === option.id, 'hover:bg-slate-600': selected?.id !== option.id}"
26
+ @click="selected = option"
27
+ >
28
+ <div class="flex-grow px-4 py-2">
29
+ {{ option.name }}
30
+ </div>
31
+ <ActionButton
32
+ v-if="deletable"
33
+ type="trash"
34
+ class="ml-4 mr-2"
35
+ :size="size"
36
+ @click.stop.prevent="$emit('delete', option)"
37
+ />
38
+ </div>
39
+ <template v-if="creatable">
40
+ <QSeparator class="bg-slate-400 my-2" />
41
+ <div class="px-4 mb-2">
36
42
  <ActionButton
37
- v-if="deletable"
38
- type="trash"
39
- class="ml-4 mr-2"
40
- @click.stop.prevent="$emit('delete', option)"
43
+ type="create"
44
+ color="green"
45
+ :class="createClass"
46
+ :label="createText"
47
+ :saving="loading"
48
+ :size="size"
49
+ @click="$emit('create')"
41
50
  />
42
51
  </div>
43
- <template v-if="creatable">
44
- <QSeparator class="bg-slate-400 my-2" />
45
- <div class="px-4 mb-2">
46
- <QBtn
47
- :class="createClass"
48
- :loading="loading"
49
- @click="$emit('create')"
50
- >
51
- <CreateIcon
52
- class="w-3"
53
- :class="createText ? 'mr-2' : ''"
54
- />
55
- {{ createText }}
56
- </QBtn>
57
- </div>
58
- </template>
59
- </div>
60
- </QMenu>
61
- </template>
52
+ </template>
53
+ </div>
54
+ </QMenu>
62
55
  </ShowHideButton>
63
56
 
64
57
  <div :class="labelClass">
@@ -85,6 +78,7 @@
85
78
  v-model="editing"
86
79
  :label="editText"
87
80
  :class="editClass"
81
+ :size="size"
88
82
  class="opacity-0 group-hover:opacity-100 transition-all"
89
83
  :show-icon="EditIcon"
90
84
  :hide-icon="DoneEditingIcon"
@@ -106,13 +100,12 @@ import {
106
100
  FaSolidCheck as DoneEditingIcon,
107
101
  FaSolidCircleXmark as ClearIcon,
108
102
  FaSolidListCheck as DefaultSelectIcon,
109
- FaSolidPencil as EditIcon,
110
- FaSolidPlus as CreateIcon
103
+ FaSolidPencil as EditIcon
111
104
  } from "danx-icon";
112
105
  import { ref } from "vue";
113
106
  import { ActionTargetItem } from "../../../../types";
114
107
  import { ShowHideButton } from "../../../Utility/Buttons";
115
- import ActionButton from "../../../Utility/Buttons/ActionButton";
108
+ import { ActionButtonProps, default as ActionButton } from "../../../Utility/Buttons/ActionButton";
116
109
  import EditableDiv from "./EditableDiv";
117
110
 
118
111
  defineEmits(["create", "update", "delete"]);
@@ -140,6 +133,7 @@ withDefaults(defineProps<{
140
133
  nameEditable?: boolean;
141
134
  clearable?: boolean;
142
135
  disable?: boolean;
136
+ size?: ActionButtonProps["size"];
143
137
  }>(), {
144
138
  selectText: "",
145
139
  createText: "",
@@ -147,11 +141,12 @@ withDefaults(defineProps<{
147
141
  clearText: "",
148
142
  placeholder: "(No selection)",
149
143
  selectClass: "bg-sky-800",
150
- createClass: "bg-green-900",
144
+ createClass: "",
151
145
  editClass: "",
152
146
  clearClass: "rounded-full",
153
147
  labelClass: "text-slate-600",
154
- selectIcon: null
148
+ selectIcon: null,
149
+ size: "md"
155
150
  });
156
151
 
157
152
  const isSelecting = ref(false);
@@ -35,7 +35,8 @@ export function useControls(name: string, options: ListControlsOptions): ListCon
35
35
  // Field options are the lists of field values available given the applied filter on the list query. These are used for drop-downs / options in forms, filters, etc.
36
36
  // (ie: all states available under the current filter)
37
37
  const fieldOptions = ref<AnyObject>({});
38
- const isLoadingFilters = ref(false);
38
+ const isLoadingFieldOptions = ref(false);
39
+ const hasLoadedFieldOptions = ref(false);
39
40
 
40
41
  const filterActiveCount = computed(() => Object.keys(activeFilter.value).filter(key => activeFilter.value[key] !== undefined).length);
41
42
 
@@ -108,6 +109,9 @@ export function useControls(name: string, options: ListControlsOptions): ListCon
108
109
  * Gets the field options for the given field name.
109
110
  */
110
111
  function getFieldOptions(field: string): any[] {
112
+ if (!hasLoadedFieldOptions.value) {
113
+ loadFieldOptions();
114
+ }
111
115
  return fieldOptions.value[field] || [];
112
116
  }
113
117
 
@@ -115,15 +119,16 @@ export function useControls(name: string, options: ListControlsOptions): ListCon
115
119
  * Loads the filter field options for the current filter.
116
120
  */
117
121
  async function loadFieldOptions() {
118
- if (isLoadingFilters.value || !options.routes.fieldOptions || options.isFieldOptionsEnabled === false) return;
122
+ if (isLoadingFieldOptions.value || !options.routes.fieldOptions || options.isFieldOptionsEnabled === false) return;
119
123
 
120
- isLoadingFilters.value = true;
124
+ isLoadingFieldOptions.value = true;
121
125
  try {
122
126
  fieldOptions.value = await options.routes.fieldOptions() || {};
127
+ hasLoadedFieldOptions.value = true;
123
128
  } catch (e) {
124
129
  // Fail silently
125
130
  } finally {
126
- isLoadingFilters.value = false;
131
+ isLoadingFieldOptions.value = false;
127
132
  }
128
133
  }
129
134
 
@@ -271,7 +276,7 @@ export function useControls(name: string, options: ListControlsOptions): ListCon
271
276
  loadSummary();
272
277
  }
273
278
 
274
- if (!isLoadingFilters.value) {
279
+ if (!isLoadingFieldOptions.value) {
275
280
  loadFieldOptions();
276
281
  }
277
282
  }, 1);
@@ -498,7 +503,8 @@ export function useControls(name: string, options: ListControlsOptions): ListCon
498
503
  summary,
499
504
  selectedRows,
500
505
  isLoadingList,
501
- isLoadingFilters,
506
+ isLoadingFieldOptions,
507
+ hasLoadedFieldOptions,
502
508
  isLoadingSummary,
503
509
  pager,
504
510
  pagination,
@@ -39,14 +39,12 @@ const props = withDefaults(defineProps<Props>(), {
39
39
  label: ""
40
40
  });
41
41
 
42
- console.log("isShowing", isShowing.value);
43
42
  const SETTINGS_KEY = "show-hide-button";
44
43
  const settings = getItem(SETTINGS_KEY, {});
45
44
 
46
45
  if (props.name) {
47
46
  if (settings[props.name] !== undefined) {
48
47
  isShowing.value = settings[props.name];
49
- console.log("setting is sowing to", isShowing.value);
50
48
  }
51
49
  }
52
50
 
@@ -3,6 +3,7 @@
3
3
  class="dx-confirm-dialog"
4
4
  v-bind="layoutProps"
5
5
  @close="onClose"
6
+ @keyup.enter="onConfirm"
6
7
  >
7
8
  <template
8
9
  v-for="slotName in childSlots"
@@ -21,6 +21,7 @@ const colorClasses = {
21
21
  yellow: "bg-yellow-950 text-yellow-400",
22
22
  blue: "bg-blue-950 text-blue-400",
23
23
  slate: "bg-slate-950 text-slate-400",
24
+ "slate-mid": "bg-slate-800 text-slate-400",
24
25
  gray: "bg-slate-700 text-gray-300",
25
26
  none: ""
26
27
  };
@@ -85,7 +85,8 @@ export interface ListController<T = ActionTargetItem> {
85
85
  summary: Ref<object | null>;
86
86
  selectedRows: Ref<T[]>;
87
87
  isLoadingList: Ref<boolean>;
88
- isLoadingFilters: Ref<boolean>;
88
+ isLoadingFieldOptions: Ref<boolean>;
89
+ hasLoadedFieldOptions: Ref<boolean>;
89
90
  isLoadingSummary: Ref<boolean>;
90
91
  pager: ComputedRef<{
91
92
  perPage: number;