@invopop/popui 0.0.20 → 0.0.22

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,15 +100,20 @@ function selectRange(to) {
96
100
  </script>
97
101
 
98
102
  <svelte:window
103
+ on:mousemove={() => {
104
+ selectionMode = 'mouse'
105
+ }}
99
106
  on:keydown={(event) => {
100
107
  event.preventDefault()
101
108
 
109
+ selectionMode = 'keyboard'
110
+
102
111
  if (event.key === 'Escape' || event.key === 'Esc') {
103
112
  selectedRows = []
104
113
  lastSelected = {}
105
114
  }
106
115
 
107
- if ((event.code === 'Space' || event.key === ' ') && lastSelected) {
116
+ if ((event.code === 'Space' || event.key === ' ') && lastSelectedIndex >= 0) {
108
117
  toggleRow(lastSelected)
109
118
  }
110
119
 
@@ -129,17 +138,21 @@ function selectRange(to) {
129
138
 
130
139
  if (!to) return
131
140
 
132
- const previousSelected = { ...lastSelected }
133
- lastSelected = to
141
+ if (!shiftKeyPressed) {
142
+ lastSelected = to
143
+ return
144
+ }
134
145
 
135
- if (!shiftKeyPressed) return
146
+ if (!rowIsSelected(lastSelected)) {
147
+ selectRow(lastSelected)
148
+ }
136
149
 
137
150
  if (toIndex < selectWithArrowPosition) {
138
- selectRow(previousSelected)
139
151
  selectRow(to)
140
152
  } else {
141
153
  unselectRow(lastSelected)
142
154
  }
155
+ lastSelected = to
143
156
  }
144
157
 
145
158
  if (event.key === 'ArrowDown') {
@@ -156,17 +169,21 @@ function selectRange(to) {
156
169
 
157
170
  if (!to) return
158
171
 
159
- const previousSelected = { ...lastSelected }
160
- lastSelected = to
172
+ if (!shiftKeyPressed) {
173
+ lastSelected = to
174
+ return
175
+ }
161
176
 
162
- if (!shiftKeyPressed) return
177
+ if (!rowIsSelected(lastSelected)) {
178
+ selectRow(lastSelected)
179
+ }
163
180
 
164
181
  if (toIndex > selectWithArrowPosition) {
165
- selectRow(previousSelected)
166
182
  selectRow(to)
167
183
  } else {
168
184
  unselectRow(lastSelected)
169
185
  }
186
+ lastSelected = to
170
187
  }
171
188
  }}
172
189
  on:keyup={(event) => {
@@ -248,6 +265,7 @@ function selectRange(to) {
248
265
  {selectable}
249
266
  {selectedRows}
250
267
  {selectedTrackedBy}
268
+ {selectionMode}
251
269
  selected={lastSelected && row[selectedTrackedBy] === lastSelected[selectedTrackedBy]}
252
270
  on:click={() => {
253
271
  if (disableRowClick) return
@@ -273,6 +291,10 @@ function selectRange(to) {
273
291
  unselectRow(row)
274
292
  }
275
293
  }}
294
+ on:hover={() => {
295
+ if (shiftKeyPressed) return
296
+ lastSelected = row
297
+ }}
276
298
  on:action
277
299
  on:copied
278
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.20",
4
+ "version": "0.0.22",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && npm run package",