quasar-ui-danx 0.0.8 → 0.0.10

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.8",
3
+ "version": "0.0.10",
4
4
  "author": "Dan <dan@flytedesk.com>",
5
5
  "description": "DanX Vue / Quasar component library",
6
6
  "license": "MIT",
@@ -7,7 +7,7 @@
7
7
  >
8
8
  <div class="flex items-center">
9
9
  <div v-if="showHandle">
10
- <img :src="DragHandleIcon" class="w-4 h-4" alt="drag-handle" />
10
+ <SvgImg :svg="DragHandleIcon" class="w-4 h-4" alt="drag-handle" />
11
11
  </div>
12
12
  <div class="flex-grow">
13
13
  <slot />
@@ -16,6 +16,7 @@
16
16
  </div>
17
17
  </template>
18
18
  <script setup>
19
+ import SvgImg from "../Utility/SvgImg";
19
20
  import { HandleDraggableDotsIcon as DragHandleIcon } from "./Icons";
20
21
  import { ListDragAndDrop } from "./listDragAndDrop";
21
22
 
@@ -7,231 +7,231 @@ import { DragAndDrop } from "./dragAndDrop";
7
7
  * @class
8
8
  */
9
9
  export class ListDragAndDrop extends DragAndDrop {
10
- listPosition = 0;
11
- cursorPosition = 0;
12
- initialPosition = 0;
13
- onPositionChangeCb = null;
14
- onDragPositionChangeCb = null;
15
- placeholder = null;
16
-
17
- constructor(options = {}) {
18
- super({
19
- showPlaceholder: true,
20
- ...options,
21
- });
22
- }
23
-
24
- /**
25
- * Callback that fires after dragging has ended and the list position has changed from the original
26
- * @param cb
27
- * @returns {ListDragAndDrop}
28
- */
29
- onPositionChange(cb) {
30
- this.onPositionChangeCb = cb;
31
- return this;
32
- }
33
-
34
- /**
35
- * Callback that fires while dragging the element when the cursor's position has changed in the list
36
- * @param cb
37
- * @returns {ListDragAndDrop}
38
- */
39
- onDragPositionChange(cb) {
40
- this.onDragPositionChangeCb = cb;
41
- return this;
42
- }
43
-
44
- /**
45
- * Start listening for drag events and prepare an element for drag/drop
46
- * @param e
47
- * @param data
48
- */
49
- dragStart(e, data) {
50
- super.dragStart(e, data);
51
-
52
- if (this.currentDropZone) {
53
- this.listPosition = this.getListPosition(e.target);
54
- this.initialPosition = this.listPosition;
55
- this.updateScrollPosition();
10
+ listPosition = 0;
11
+ cursorPosition = 0;
12
+ initialPosition = 0;
13
+ onPositionChangeCb = null;
14
+ onDragPositionChangeCb = null;
15
+ placeholder = null;
16
+
17
+ constructor(options = {}) {
18
+ super({
19
+ showPlaceholder: true,
20
+ ...options,
21
+ });
56
22
  }
57
- }
58
-
59
- /**
60
- * When dragging has ended, check for list position changes and fire the onPositionChange callback if it has
61
- */
62
- dragEnd(e) {
63
- const draggableData = this.draggableData;
64
- this.placeholder.remove();
65
- super.dragEnd(e);
66
-
67
- // If our list position has changed, trigger the drop callback
68
- if (this.listPosition !== this.initialPosition) {
69
- this.onPositionChangeCb &&
70
- this.onPositionChangeCb(this.listPosition, this.initialPosition, draggableData);
23
+
24
+ /**
25
+ * Callback that fires after dragging has ended and the list position has changed from the original
26
+ * @param cb
27
+ * @returns {ListDragAndDrop}
28
+ */
29
+ onPositionChange(cb) {
30
+ this.onPositionChangeCb = cb;
31
+ return this;
71
32
  }
72
- }
73
-
74
- /**
75
- * The dragging element is moving
76
- * @param e
77
- */
78
- dragOver(e) {
79
- super.dragOver(e);
80
- this.updateListPosition(e);
81
- }
82
-
83
- /**
84
- * Notify if the targeted position of the cursor is different from the current position
85
- * @param e
86
- */
87
- updateListPosition(e) {
88
- const prevPosition = this.listPosition;
89
- const newPosition = this.getListPositionOfPoint({
90
- x: e.clientX,
91
- y: e.clientY,
92
- });
93
-
94
- // If the cursor position has changed, we should update the rendering and see if our actual list position has
95
- // changed
96
- if (this.cursorPosition !== newPosition) {
97
- this.cursorPosition = newPosition;
98
- this.listPosition =
99
- this.initialPosition < this.cursorPosition
100
- ? this.cursorPosition - 1
101
- : this.cursorPosition;
102
- if (this.options.showPlaceholder) {
103
- this.renderPlaceholder();
104
- }
105
-
106
- // The position has changed, trigger the callback
107
- if (this.listPosition !== prevPosition) {
108
- this.onDragPositionChangeCb &&
109
- this.onDragPositionChangeCb(this.listPosition, this.draggableData);
110
- }
33
+
34
+ /**
35
+ * Callback that fires while dragging the element when the cursor's position has changed in the list
36
+ * @param cb
37
+ * @returns {ListDragAndDrop}
38
+ */
39
+ onDragPositionChange(cb) {
40
+ this.onDragPositionChangeCb = cb;
41
+ return this;
111
42
  }
112
- }
113
-
114
- /**
115
- * Find the numeric position of the element in the children of the list
116
- * @returns {Number|null}
117
- * @param item
118
- */
119
- getListPosition(item) {
120
- let index = 0;
121
- for (const child of this.getChildren()) {
122
- if (child === item) {
123
- return index;
124
- }
125
- index++;
43
+
44
+ /**
45
+ * Start listening for drag events and prepare an element for drag/drop
46
+ * @param e
47
+ * @param data
48
+ */
49
+ dragStart(e, data) {
50
+ super.dragStart(e, data);
51
+
52
+ if (this.currentDropZone) {
53
+ this.listPosition = this.getListPosition(e.target);
54
+ this.initialPosition = this.listPosition;
55
+ this.updateScrollPosition();
56
+ }
126
57
  }
127
58
 
128
- return null;
129
- }
130
-
131
- /**
132
- * Get all the children of the current drop zone, excluding the placeholder
133
- * @returns {*}
134
- */
135
- getChildren() {
136
- return [...this.currentDropZone.children].filter(
137
- (c) => c.className.match(/drag-placeholder/) === null
138
- );
139
- }
140
-
141
- /**
142
- * Find the element at the current cursor position in the given drop zone
143
- * @param point
144
- * @returns {null}
145
- */
146
- getListPositionOfPoint(point) {
147
- let index = 0;
148
- const children = this.getChildren();
149
-
150
- while (index < children.length) {
151
- const rect = children[index].getBoundingClientRect();
152
- if (this.isVertical()) {
153
- if (point.y < rect.top + rect.height / 2) {
154
- break;
59
+ /**
60
+ * When dragging has ended, check for list position changes and fire the onPositionChange callback if it has
61
+ */
62
+ dragEnd(e) {
63
+ const draggableData = this.draggableData;
64
+ this.placeholder?.remove();
65
+ super.dragEnd(e);
66
+
67
+ // If our list position has changed, trigger the drop callback
68
+ if (this.listPosition !== this.initialPosition) {
69
+ this.onPositionChangeCb &&
70
+ this.onPositionChangeCb(this.listPosition, this.initialPosition, draggableData);
155
71
  }
156
- } else {
157
- if (point.x < rect.left + rect.width / 2) {
158
- break;
72
+ }
73
+
74
+ /**
75
+ * The dragging element is moving
76
+ * @param e
77
+ */
78
+ dragOver(e) {
79
+ super.dragOver(e);
80
+ this.updateListPosition(e);
81
+ }
82
+
83
+ /**
84
+ * Notify if the targeted position of the cursor is different from the current position
85
+ * @param e
86
+ */
87
+ updateListPosition(e) {
88
+ const prevPosition = this.listPosition;
89
+ const newPosition = this.getListPositionOfPoint({
90
+ x: e.clientX,
91
+ y: e.clientY,
92
+ });
93
+
94
+ // If the cursor position has changed, we should update the rendering and see if our actual list position has
95
+ // changed
96
+ if (this.cursorPosition !== newPosition) {
97
+ this.cursorPosition = newPosition;
98
+ this.listPosition =
99
+ this.initialPosition < this.cursorPosition
100
+ ? this.cursorPosition - 1
101
+ : this.cursorPosition;
102
+ if (this.options.showPlaceholder) {
103
+ this.renderPlaceholder();
104
+ }
105
+
106
+ // The position has changed, trigger the callback
107
+ if (this.listPosition !== prevPosition) {
108
+ this.onDragPositionChangeCb &&
109
+ this.onDragPositionChangeCb(this.listPosition, this.draggableData);
110
+ }
159
111
  }
160
- }
161
- index++;
162
112
  }
163
113
 
164
- return index;
165
- }
166
-
167
- /**
168
- * Updates the scroll position while dragging an element so a user can navigate a longer list while dragging
169
- */
170
- updateScrollPosition() {
171
- if (this.currentDropZone) {
172
- const rect = this.currentDropZone.getBoundingClientRect();
173
- const threshold = 100;
174
- let velocity = 0;
175
- const velocityFn = (x) => x * 5;
176
- const cursorPos = this.isVertical() ? this.cursorY : this.cursorX;
177
- const rectStart = this.isVertical() ? rect.top : rect.left;
178
- const rectEnd = this.isVertical() ? rect.bottom : rect.right;
179
- const beforeDiff = rectStart + threshold - cursorPos;
180
- const afterDiff = cursorPos - (rectEnd - threshold);
181
-
182
- if (beforeDiff > 0) {
183
- velocity = -velocityFn(beforeDiff);
184
- } else if (afterDiff > 0) {
185
- velocity = velocityFn(afterDiff);
186
- }
187
-
188
- if (velocity) {
189
- if (this.isVertical()) {
190
- this.currentDropZone.scrollTo({
191
- top: this.currentDropZone.scrollTop + velocity,
192
- behavior: "smooth",
193
- });
194
- } else {
195
- this.currentDropZone.scrollTo({
196
- left: this.currentDropZone.scrollLeft + velocity,
197
- behavior: "smooth",
198
- });
114
+ /**
115
+ * Find the numeric position of the element in the children of the list
116
+ * @returns {Number|null}
117
+ * @param item
118
+ */
119
+ getListPosition(item) {
120
+ let index = 0;
121
+ for (const child of this.getChildren()) {
122
+ if (child === item) {
123
+ return index;
124
+ }
125
+ index++;
199
126
  }
200
- }
201
127
 
202
- setTimeout(() => this.updateScrollPosition(), 500);
128
+ return null;
129
+ }
130
+
131
+ /**
132
+ * Get all the children of the current drop zone, excluding the placeholder
133
+ * @returns {*}
134
+ */
135
+ getChildren() {
136
+ return [...this.currentDropZone.children].filter(
137
+ (c) => c.className.match(/drag-placeholder/) === null
138
+ );
203
139
  }
204
- }
205
-
206
- /**
207
- * Render a placeholder element at the given position (in between the elements)
208
- */
209
- renderPlaceholder() {
210
- if (!this.placeholder) {
211
- this.placeholder = document.createElement("div");
212
- this.placeholder.classList.add("drag-placeholder");
140
+
141
+ /**
142
+ * Find the element at the current cursor position in the given drop zone
143
+ * @param point
144
+ * @returns {null}
145
+ */
146
+ getListPositionOfPoint(point) {
147
+ let index = 0;
148
+ const children = this.getChildren();
149
+
150
+ while (index < children.length) {
151
+ const rect = children[index].getBoundingClientRect();
152
+ if (this.isVertical()) {
153
+ if (point.y < rect.top + rect.height / 2) {
154
+ break;
155
+ }
156
+ } else {
157
+ if (point.x < rect.left + rect.width / 2) {
158
+ break;
159
+ }
160
+ }
161
+ index++;
162
+ }
163
+
164
+ return index;
213
165
  }
214
166
 
215
- // Make sure the placeholder is oriented correctly
216
- if (this.isVertical()) {
217
- this.placeholder.classList.add("direction-vertical");
218
- this.placeholder.classList.remove("direction-horizontal");
219
- this.placeholder.style.height = undefined;
220
- } else {
221
- this.placeholder.classList.add("direction-horizontal");
222
- this.placeholder.classList.remove("direction-vertical");
223
- this.placeholder.style.height =
224
- this.currentDropZone.getBoundingClientRect().height + "px";
167
+ /**
168
+ * Updates the scroll position while dragging an element so a user can navigate a longer list while dragging
169
+ */
170
+ updateScrollPosition() {
171
+ if (this.currentDropZone) {
172
+ const rect = this.currentDropZone.getBoundingClientRect();
173
+ const threshold = 100;
174
+ let velocity = 0;
175
+ const velocityFn = (x) => x * 5;
176
+ const cursorPos = this.isVertical() ? this.cursorY : this.cursorX;
177
+ const rectStart = this.isVertical() ? rect.top : rect.left;
178
+ const rectEnd = this.isVertical() ? rect.bottom : rect.right;
179
+ const beforeDiff = rectStart + threshold - cursorPos;
180
+ const afterDiff = cursorPos - (rectEnd - threshold);
181
+
182
+ if (beforeDiff > 0) {
183
+ velocity = -velocityFn(beforeDiff);
184
+ } else if (afterDiff > 0) {
185
+ velocity = velocityFn(afterDiff);
186
+ }
187
+
188
+ if (velocity) {
189
+ if (this.isVertical()) {
190
+ this.currentDropZone.scrollTo({
191
+ top: this.currentDropZone.scrollTop + velocity,
192
+ behavior: "smooth",
193
+ });
194
+ } else {
195
+ this.currentDropZone.scrollTo({
196
+ left: this.currentDropZone.scrollLeft + velocity,
197
+ behavior: "smooth",
198
+ });
199
+ }
200
+ }
201
+
202
+ setTimeout(() => this.updateScrollPosition(), 500);
203
+ }
225
204
  }
226
205
 
227
- const children = this.getChildren();
228
- if (this.cursorPosition < children.length) {
229
- this.currentDropZone.insertBefore(
230
- this.placeholder,
231
- children[this.cursorPosition]
232
- );
233
- } else {
234
- this.currentDropZone.appendChild(this.placeholder);
206
+ /**
207
+ * Render a placeholder element at the given position (in between the elements)
208
+ */
209
+ renderPlaceholder() {
210
+ if (!this.placeholder) {
211
+ this.placeholder = document.createElement("div");
212
+ this.placeholder.classList.add("drag-placeholder");
213
+ }
214
+
215
+ // Make sure the placeholder is oriented correctly
216
+ if (this.isVertical()) {
217
+ this.placeholder.classList.add("direction-vertical");
218
+ this.placeholder.classList.remove("direction-horizontal");
219
+ this.placeholder.style.height = undefined;
220
+ } else {
221
+ this.placeholder.classList.add("direction-horizontal");
222
+ this.placeholder.classList.remove("direction-vertical");
223
+ this.placeholder.style.height =
224
+ this.currentDropZone.getBoundingClientRect().height + "px";
225
+ }
226
+
227
+ const children = this.getChildren();
228
+ if (this.cursorPosition < children.length) {
229
+ this.currentDropZone.insertBefore(
230
+ this.placeholder,
231
+ children[this.cursorPosition]
232
+ );
233
+ } else {
234
+ this.currentDropZone.appendChild(this.placeholder);
235
+ }
235
236
  }
236
- }
237
237
  }
@@ -0,0 +1,25 @@
1
+ <template>
2
+ <img
3
+ v-if="isString"
4
+ :src="resolvedSvg"
5
+ :alt="alt"
6
+ />
7
+ <component :is="resolvedSvg" v-else />
8
+ </template>
9
+ <script setup>
10
+ import { computed } from "vue";
11
+
12
+ const props = defineProps({
13
+ svg: {
14
+ type: [String, Object, Function],
15
+ required: true
16
+ },
17
+ alt: {
18
+ type: String,
19
+ default: ""
20
+ }
21
+ });
22
+
23
+ const resolvedSvg = computed(() => props.svg.default ? props.svg.default : props.svg);
24
+ const isString = computed(() => typeof resolvedSvg.value === "string");
25
+ </script>