wx-svelte-grid 1.3.3 → 2.0.0-beta-2

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": "wx-svelte-grid",
3
- "version": "1.3.3",
3
+ "version": "2.0.0-beta-2",
4
4
  "description": "A powerful and flexible DataGrid component written in Svelte",
5
5
  "productTag": "grid",
6
6
  "needsTrial": true,
@@ -8,7 +8,7 @@
8
8
  "scripts": {
9
9
  "build": "vite build",
10
10
  "build:tests": "vite build --mode test",
11
- "lint": "yarn eslint ./demos ./src --ext .svelte,.ts,.js",
11
+ "lint": "yarn eslint ./demos ./src",
12
12
  "start": "vite --open",
13
13
  "start:tests": "vite --open=/tests/ --mode test --host 0.0.0.0 --port 5100",
14
14
  "test": "true",
@@ -34,11 +34,11 @@
34
34
  "wx-lib-dom": "0.6.0",
35
35
  "wx-lib-state": "1.9.0",
36
36
  "wx-lib-svelte": "0.4.0",
37
- "wx-svelte-menu": "1.3.0",
38
- "wx-svelte-core": "1.3.1",
39
- "wx-grid-data-provider": "1.3.3",
40
- "wx-grid-locales": "1.3.3",
41
- "wx-grid-store": "1.3.3"
37
+ "wx-svelte-menu": "2.0.0-beta-2",
38
+ "wx-svelte-core": "2.0.0-beta-2",
39
+ "wx-grid-data-provider": "2.0.0-beta-2",
40
+ "wx-grid-locales": "2.0.0-beta-2",
41
+ "wx-grid-store": "2.0.0-beta-2"
42
42
  },
43
43
  "files": [
44
44
  "src",
@@ -2,13 +2,22 @@
2
2
  import { getStyle } from "../helpers/columnWidth";
3
3
  import { getRenderValue } from "wx-grid-store";
4
4
 
5
- export let row;
6
- export let col;
7
- export let cellStyle = null;
8
- export let columnStyle = null;
5
+ /**
6
+ * @typedef {Object} Props
7
+ * @property {any} row
8
+ * @property {any} col
9
+ * @property {any} [cellStyle]
10
+ * @property {any} [columnStyle]
11
+ * @property {import('svelte').Snippet} [children]
12
+ */
9
13
 
10
- let style, css;
11
- $: style = getStyle(col.width, col.flexgrow, col.fixed, col.left);
14
+ /** @type {Props} */
15
+ let { row, col, cellStyle = null, columnStyle = null, children } = $props();
16
+
17
+ let style = $derived(
18
+ getStyle(col.width, col.flexgrow, col.fixed, col.left)
19
+ ),
20
+ css = $derived(buildCellCss(columnStyle, cellStyle));
12
21
 
13
22
  function buildCellCss(columnStyle, cellStyle) {
14
23
  let css = "wx-cell";
@@ -17,7 +26,6 @@
17
26
  return css;
18
27
  }
19
28
  // params are needed for css update
20
- $: css = buildCellCss(columnStyle, cellStyle);
21
29
  </script>
22
30
 
23
31
  <div
@@ -29,20 +37,24 @@
29
37
  >
30
38
  {#if col.treetoggle}
31
39
  <div class="wx-tree-cell">
32
- <span style="margin-left:{row.$level * 28}px;" />
40
+ <span style="margin-left:{row.$level * 28}px;"></span>
33
41
  {#if row.$count}
34
42
  <i
35
43
  data-action="toggle-row"
36
44
  class="wx-table-tree-toggle wxi-menu-{row.open !== false
37
45
  ? 'down'
38
46
  : 'right'}"
39
- />
47
+ ></i>
40
48
  {/if}
41
- <slot>{getRenderValue(row, col)}</slot>
49
+ {#if children}{@render children()}{:else}{getRenderValue(
50
+ row,
51
+ col
52
+ )}{/if}
42
53
  </div>
43
- {:else}
44
- <slot>{getRenderValue(row, col)}</slot>
45
- {/if}
54
+ {:else if children}{@render children()}{:else}{getRenderValue(
55
+ row,
56
+ col
57
+ )}{/if}
46
58
  </div>
47
59
 
48
60
  <style>
@@ -1,21 +1,19 @@
1
1
  <script>
2
2
  import { getStyle, getCssName } from "../helpers/columnWidth";
3
3
 
4
- export let cell;
5
- export let column;
6
- export let columnStyle;
4
+ let { cell, column, columnStyle } = $props();
7
5
 
8
- let style;
9
- $: style = getStyle(
10
- cell.width,
11
- cell.flexgrow,
12
- column.fixed,
13
- column.left,
14
- cell.height
6
+ let style = $derived(
7
+ getStyle(
8
+ cell.width,
9
+ cell.flexgrow,
10
+ column.fixed,
11
+ column.left,
12
+ cell.height
13
+ )
15
14
  );
16
15
 
17
- let css = "";
18
- $: css = getCssName(column, cell, columnStyle);
16
+ let css = $derived(getCssName(column, cell, columnStyle));
19
17
  </script>
20
18
 
21
19
  <div class="wx-cell {css} {cell.css || ''}" {style}>
@@ -1,8 +1,7 @@
1
1
  <script>
2
2
  // svelte core
3
- import { createEventDispatcher, getContext, setContext } from "svelte";
3
+ import { getContext, setContext } from "svelte";
4
4
  import { writable } from "svelte/store";
5
- const dispatch = createEventDispatcher();
6
5
 
7
6
  // core widgets lib
8
7
  import { Locale } from "wx-svelte-core";
@@ -15,66 +14,113 @@
15
14
  // ui
16
15
  import Layout from "./Layout.svelte";
17
16
 
18
- // incoming parameters
19
- export let data = [];
20
- export let columns = [];
17
+ let {
18
+ data = [],
19
+ columns = [],
20
+ rowStyle = null,
21
+ columnStyle = null,
22
+ cellStyle = null,
23
+ selectedRows = [],
24
+ select = true,
25
+ multiselect = false,
26
+ header = true,
27
+ footer = false,
28
+ dynamic = null,
29
+ editor = null,
30
+ filter = null,
31
+ overlay = null,
32
+ autoRowHeight = false,
33
+ sizes = {},
34
+ split = { left: 0 },
35
+ tree = false,
36
+ autoConfig = false,
37
+ init = null,
38
+ ...restProps
39
+ } = $props();
21
40
 
22
- export let rowStyle = null;
23
- export let columnStyle = null;
24
- export let cellStyle = null;
25
-
26
- export let selected = null;
27
- export let selectedRows = [];
28
- export let select = true;
29
- export let multiselect = false;
41
+ // init stores
42
+ const dataStore = new DataStore(writable);
30
43
 
31
- export let header = true;
32
- export let footer = false;
33
- export let dynamic = null;
34
- export let filter = null;
35
- export let overlay = null;
36
- export let autoRowHeight = false;
37
- export let sizes = {};
38
- export let split = { left: 0 };
44
+ // define event route
45
+ let firstInRoute = dataStore.in;
39
46
 
40
- export let tree = false;
41
- export let autoConfig = false;
47
+ const dash = /-/g;
48
+ let lastInRoute = new EventBusRouter((a, b) => {
49
+ const name = "on" + a.replace(dash, "");
50
+ if (restProps[name]) {
51
+ restProps[name](b);
52
+ }
53
+ });
54
+ firstInRoute.setNext(lastInRoute);
42
55
 
43
- export let init = null;
56
+ // public API
57
+ export const // state
58
+ getState = dataStore.getState.bind(dataStore),
59
+ getReactiveState = dataStore.getReactive.bind(dataStore),
60
+ getStores = () => ({ data: dataStore }),
61
+ // events
62
+ exec = firstInRoute.exec,
63
+ setNext = ev => (lastInRoute = lastInRoute.setNext(ev)),
64
+ intercept = firstInRoute.intercept.bind(firstInRoute),
65
+ on = firstInRoute.on.bind(firstInRoute),
66
+ detach = firstInRoute.detach.bind(firstInRoute),
67
+ // extra api
68
+ getRow = id => dataStore.getRow(id),
69
+ getColumn = id => dataStore.getColumn(id);
70
+
71
+ const api = {
72
+ exec,
73
+ setNext,
74
+ intercept,
75
+ on,
76
+ detach,
77
+ getRow,
78
+ getColumn,
79
+ getState,
80
+ getReactiveState,
81
+ getStores,
82
+ };
44
83
 
84
+ // common API available in components
85
+ setContext("grid-store", {
86
+ getState: dataStore.getState.bind(dataStore),
87
+ getReactiveState: dataStore.getReactive.bind(dataStore),
88
+ exec: firstInRoute.exec.bind(firstInRoute),
89
+ getRow: dataStore.getRow.bind(dataStore),
90
+ });
45
91
  // auto config columns
46
- $: if (autoConfig && !columns.length && data.length) {
47
- const test = data[0];
48
-
49
- for (let key in test)
50
- if (key != "id" && key[0] != "$") {
51
- let col = {
52
- id: key,
53
- header: key[0].toUpperCase() + key.substr(1),
54
- };
55
-
56
- if (typeof autoConfig === "object")
57
- col = { ...col, ...autoConfig };
58
- columns.push(col);
92
+ const finalColumns = $derived.by(() => {
93
+ let res = columns;
94
+ if (autoConfig && !res.length && data.length) {
95
+ const test = data[0];
96
+
97
+ for (let key in test) {
98
+ if (key != "id" && key[0] != "$") {
99
+ let col = {
100
+ id: key,
101
+ header: key[0].toUpperCase() + key.substr(1),
102
+ };
103
+
104
+ if (typeof autoConfig === "object")
105
+ col = { ...col, ...autoConfig };
106
+ columns.push(col);
107
+ }
59
108
  }
60
- }
61
- //sync selection props
62
- $: {
63
- if (selectedRows.length) selected = selectedRows[0];
64
- else if (selected) selectedRows.push(selected);
65
- }
109
+ }
110
+
111
+ return columns;
112
+ });
66
113
 
67
- $: _skin = getContext("wx-theme");
114
+ let _skin = $derived(getContext("wx-theme"));
68
115
 
69
- // init stores
70
- const dataStore = new DataStore(writable);
71
- $: {
116
+ let init_once = true;
117
+ const reinitStore = () => {
72
118
  dataStore.init({
73
119
  data,
74
- columns,
120
+ editor,
121
+ columns: finalColumns,
75
122
  split,
76
123
  sizes,
77
- selected,
78
124
  selectedRows,
79
125
  dynamic,
80
126
  filter,
@@ -82,42 +128,14 @@
82
128
  _skin,
83
129
  });
84
130
 
85
- if (init) {
131
+ if (init_once && init) {
86
132
  init(api);
87
- init = null;
133
+ init_once = false;
88
134
  }
89
- }
90
-
91
- // define event route
92
- let firstInRoute = dataStore.in;
93
- let lastInRoute = new EventBusRouter(dispatch);
94
- firstInRoute.setNext(lastInRoute);
95
-
96
- // public API
97
- export const api = {
98
- // state
99
- getState: dataStore.getState.bind(dataStore),
100
- getReactiveState: dataStore.getReactive.bind(dataStore),
101
- getStores: () => ({ data: dataStore }),
102
-
103
- // events
104
- exec: firstInRoute.exec,
105
- setNext: ev => (lastInRoute = lastInRoute.setNext(ev)),
106
- intercept: firstInRoute.intercept.bind(firstInRoute),
107
- on: firstInRoute.on.bind(firstInRoute),
108
- detach: firstInRoute.detach.bind(firstInRoute),
109
-
110
- // extra api
111
- getRow: id => dataStore.getRow(id),
112
- getColumn: id => dataStore.getColumn(id),
113
135
  };
114
136
 
115
- // common API available in components
116
- setContext("grid-store", {
117
- getReactiveState: dataStore.getReactive.bind(dataStore),
118
- exec: firstInRoute.exec.bind(firstInRoute),
119
- getRow: dataStore.getRow.bind(dataStore),
120
- });
137
+ reinitStore();
138
+ $effect(reinitStore);
121
139
  </script>
122
140
 
123
141
  <Locale words={en} optional={true}>
@@ -3,11 +3,7 @@
3
3
  import { resize } from "../helpers/actions/resize";
4
4
  import { getCssName, getStyle } from "../helpers/columnWidth";
5
5
 
6
- export let cell;
7
- export let column;
8
- export let row;
9
- export let lastRow;
10
- export let columnStyle;
6
+ let { cell, column, row, lastRow, columnStyle } = $props();
11
7
 
12
8
  const api = getContext("grid-store");
13
9
 
@@ -27,29 +23,31 @@
27
23
  function sort(ev) {
28
24
  api.exec("sort-rows", { key: cell.id, add: ev.ctrlKey });
29
25
  }
30
- function collapse() {
26
+ function collapse(ev) {
27
+ if (ev) ev.stopPropagation();
31
28
  api.exec("collapse-column", { id: cell.id, row });
32
29
  }
33
30
 
34
- let style;
35
- $: style = getStyle(
36
- cell.width,
37
- cell.flexgrow,
38
- column.fixed,
39
- column.left,
40
- cell.height
31
+ let style = $derived(
32
+ getStyle(
33
+ cell.width,
34
+ cell.flexgrow,
35
+ column.fixed,
36
+ column.left,
37
+ cell.height
38
+ )
41
39
  );
42
40
 
43
- let css = "";
44
- $: css = getCssName(column, cell, columnStyle);
41
+ const css = $derived(getCssName(column, cell, columnStyle));
45
42
  </script>
46
43
 
47
44
  {#if cell.collapsed && column.collapsed}
48
- <!-- svelte-ignore a11y-click-events-have-key-events -->
45
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
46
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
49
47
  <div
50
48
  class="wx-cell {css} {cell.css || ''} wx-collapsed"
51
49
  {style}
52
- on:click|stopPropagation={collapse}
50
+ onclick={collapse}
53
51
  data-header-id={column.id}
54
52
  >
55
53
  <div class="wx-text">{cell.text || ""}</div>
@@ -61,21 +59,23 @@
61
59
  data-header-id={column.id}
62
60
  >
63
61
  {#if cell.collapsible}
64
- <!-- svelte-ignore a11y-click-events-have-key-events -->
65
- <div class="wx-collapse" on:click|stopPropagation={collapse}>
66
- <i class="wxi-angle-{cell.collapsed ? 'down' : 'right'}" />
62
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
63
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
64
+ <div class="wx-collapse" onclick={collapse}>
65
+ <i class="wxi-angle-{cell.collapsed ? 'down' : 'right'}"></i>
67
66
  </div>
68
67
  {/if}
69
68
 
70
69
  <div class="wx-text">{cell.text || ""}</div>
71
70
 
72
71
  {#if column.resize && lastRow}
73
- <div class="wx-grip" use:resize={{ down, move }} />
72
+ <div class="wx-grip" use:resize={{ down, move }}></div>
74
73
  {/if}
75
74
 
76
75
  {#if column.sort}
77
- <!-- svelte-ignore a11y-click-events-have-key-events -->
78
- <div class="wx-sort" on:click={sort}>
76
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
77
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
78
+ <div class="wx-sort" onclick={sort}>
79
79
  {#if column.$sort && lastRow}
80
80
  {#if column.$sort.index > 0}
81
81
  <div class="wx-order">{column.$sort.index}</div>
@@ -84,7 +84,7 @@
84
84
  class="wxi-arrow-{column.$sort.order === 'asc'
85
85
  ? 'up'
86
86
  : 'down'}"
87
- />
87
+ ></i>
88
88
  {/if}
89
89
  </div>
90
90
  {/if}
@@ -3,28 +3,28 @@
3
3
  import HeaderCell from "./HeaderCell.svelte";
4
4
  import FooterCell from "./FooterCell.svelte";
5
5
 
6
- export let deltaLeft;
7
- export let contentWidth;
8
- export let columns;
9
- export let type = "header";
10
-
11
- export let columnStyle;
6
+ let {
7
+ deltaLeft,
8
+ contentWidth,
9
+ columns,
10
+ type = "header",
11
+ columnStyle,
12
+ } = $props();
12
13
 
13
14
  const api = getContext("grid-store");
14
15
  const { _sizes: sizes } = api.getReactiveState();
15
- $: rowHeights = $sizes[`${type}RowHeights`];
16
+ let rowHeights = $derived($sizes[`${type}RowHeights`]);
16
17
 
17
- let renderedHeader = [];
18
- $: {
18
+ let renderedHeader = $derived.by(() => {
19
+ let res = [];
19
20
  if (columns.length) {
20
21
  const rowsCount = columns[0][type].length;
21
- renderedHeader = [];
22
22
  for (let ri = 0; ri < rowsCount; ri++) {
23
23
  let inSpan = 0;
24
- renderedHeader.push([]);
24
+ res.push([]);
25
25
  columns.forEach(col => {
26
26
  if (!inSpan) {
27
- renderedHeader[ri].push(col[type][ri]);
27
+ res[ri].push(col[type][ri]);
28
28
  }
29
29
 
30
30
  if (col[type][ri].colspan > 1) {
@@ -33,7 +33,8 @@
33
33
  });
34
34
  }
35
35
  }
36
- }
36
+ return res;
37
+ });
37
38
 
38
39
  function getColumn(id) {
39
40
  return columns.find(c => c.id === id);