@invopop/popui 0.0.19 → 0.0.21

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.
@@ -16,6 +16,7 @@ let metaKeyPressed = false;
16
16
  let shiftKeyPressed = false;
17
17
  let lastSelected = {};
18
18
  let selectWithArrowPosition = -1;
19
+ let selectionMode = "keyboard";
19
20
  export let sortBy = "";
20
21
  export let sortDirection = "";
21
22
  export let fields = [];
@@ -74,8 +75,11 @@ function unselectRow(row) {
74
75
  lastSelected = {};
75
76
  }
76
77
  }
78
+ function rowIsSelected(row) {
79
+ return selectedRows.find((r) => r[selectedTrackedBy] === row[selectedTrackedBy]);
80
+ }
77
81
  function toggleRow(row) {
78
- if (selectedRows.find((r) => r[selectedTrackedBy] === row[selectedTrackedBy])) {
82
+ if (rowIsSelected(row)) {
79
83
  unselectRow(row);
80
84
  } else {
81
85
  selectRow(row);
@@ -96,7 +100,14 @@ function selectRange(to) {
96
100
  </script>
97
101
 
98
102
  <svelte:window
103
+ on:mousemove={() => {
104
+ selectionMode = 'mouse'
105
+ }}
99
106
  on:keydown={(event) => {
107
+ event.preventDefault()
108
+
109
+ selectionMode = 'keyboard'
110
+
100
111
  if (event.key === 'Escape' || event.key === 'Esc') {
101
112
  selectedRows = []
102
113
  lastSelected = {}
@@ -127,17 +138,21 @@ function selectRange(to) {
127
138
 
128
139
  if (!to) return
129
140
 
130
- const previousSelected = { ...lastSelected }
131
- lastSelected = to
141
+ if (!shiftKeyPressed) {
142
+ lastSelected = to
143
+ return
144
+ }
132
145
 
133
- if (!shiftKeyPressed) return
146
+ if (!rowIsSelected(lastSelected)) {
147
+ selectRow(lastSelected)
148
+ }
134
149
 
135
150
  if (toIndex < selectWithArrowPosition) {
136
- selectRow(previousSelected)
137
151
  selectRow(to)
138
152
  } else {
139
153
  unselectRow(lastSelected)
140
154
  }
155
+ lastSelected = to
141
156
  }
142
157
 
143
158
  if (event.key === 'ArrowDown') {
@@ -154,17 +169,21 @@ function selectRange(to) {
154
169
 
155
170
  if (!to) return
156
171
 
157
- const previousSelected = { ...lastSelected }
158
- lastSelected = to
172
+ if (!shiftKeyPressed) {
173
+ lastSelected = to
174
+ return
175
+ }
159
176
 
160
- if (!shiftKeyPressed) return
177
+ if (!rowIsSelected(lastSelected)) {
178
+ selectRow(lastSelected)
179
+ }
161
180
 
162
181
  if (toIndex > selectWithArrowPosition) {
163
- selectRow(previousSelected)
164
182
  selectRow(to)
165
183
  } else {
166
184
  unselectRow(lastSelected)
167
185
  }
186
+ lastSelected = to
168
187
  }
169
188
  }}
170
189
  on:keyup={(event) => {
@@ -246,6 +265,7 @@ function selectRange(to) {
246
265
  {selectable}
247
266
  {selectedRows}
248
267
  {selectedTrackedBy}
268
+ {selectionMode}
249
269
  selected={lastSelected && row[selectedTrackedBy] === lastSelected[selectedTrackedBy]}
250
270
  on:click={() => {
251
271
  if (disableRowClick) return
@@ -271,6 +291,10 @@ function selectRange(to) {
271
291
  unselectRow(row)
272
292
  }
273
293
  }}
294
+ on:hover={() => {
295
+ if (shiftKeyPressed) return
296
+ lastSelected = row
297
+ }}
274
298
  on:action
275
299
  on:copied
276
300
  />
@@ -13,6 +13,7 @@ export let disableRowClick = false;
13
13
  export let freeWrap = false;
14
14
  export let selectable = false;
15
15
  export let selected = false;
16
+ export let selectionMode = "keyboard";
16
17
  export let selectedTrackedBy = "id";
17
18
  export let selectedRows = [];
18
19
  $:
@@ -25,7 +26,7 @@ $:
25
26
  return field === row[selectedTrackedBy];
26
27
  });
27
28
  $:
28
- if (selected) {
29
+ if (selectionMode === "keyboard" && selected) {
29
30
  scrollIntoView();
30
31
  }
31
32
  function scrollIntoView() {
@@ -37,13 +38,19 @@ function scrollIntoView() {
37
38
  class:cursor-pointer={!disableRowClick}
38
39
  class:bg-neutral-50={selected}
39
40
  class:bg-workspace-accent-50={checked && !selected}
40
- class="hover:bg-neutral-50"
41
41
  on:click
42
42
  on:contextmenu|preventDefault={() => {
43
43
  if (!actionsDropdown) return
44
44
 
45
45
  actionsDropdown.toggle()
46
46
  }}
47
+ on:mouseover={() => {
48
+ if (selectionMode === 'keyboard') return
49
+ dispatch('hover')
50
+ }}
51
+ on:focus={() => {
52
+ dispatch('focus')
53
+ }}
47
54
  >
48
55
  {#if selectable}
49
56
  <td>
@@ -9,12 +9,15 @@ declare const __propDef: {
9
9
  freeWrap?: boolean | undefined;
10
10
  selectable?: boolean | undefined;
11
11
  selected?: boolean | undefined;
12
+ selectionMode?: string | undefined;
12
13
  selectedTrackedBy?: string | undefined;
13
14
  selectedRows?: TableDataRow[] | undefined;
14
15
  };
15
16
  events: {
16
17
  click: MouseEvent;
17
18
  copied: CustomEvent<any>;
19
+ hover: CustomEvent<any>;
20
+ focus: CustomEvent<any>;
18
21
  checked: CustomEvent<any>;
19
22
  action: CustomEvent<any>;
20
23
  } & {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@invopop/popui",
3
3
  "license": "MIT",
4
- "version": "0.0.19",
4
+ "version": "0.0.21",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && npm run package",