@emamid/svelte-data-table 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.
@@ -3,6 +3,8 @@
3
3
  * @typedef {object} DataTable
4
4
  * @property {ColumnConfig[]} columns - Configuration for each column to be displayed in the table.
5
5
  * @property {any[]} items - Data for the rows in the table.
6
+ * @property {RowBoolean} [allowRowDrag] -
7
+ * @property {RowDropBoolean} [allowRowDrop] -
6
8
  * @property {string} [sortKey] - Data property to sort by.
7
9
  * @property {SortFunction} [sortFunction] - Function for more complex-sorting.
8
10
  * @property {boolean} [reverseSort] - True when sorting is reversed.
@@ -1,9 +1,10 @@
1
- "use strict";
2
1
  /**
3
2
  * The DataTable component based on {@link https://flowbite-svelte.com/docs/components/table}
4
3
  * @typedef {object} DataTable
5
4
  * @property {ColumnConfig[]} columns - Configuration for each column to be displayed in the table.
6
5
  * @property {any[]} items - Data for the rows in the table.
6
+ * @property {RowBoolean} [allowRowDrag] -
7
+ * @property {RowDropBoolean} [allowRowDrop] -
7
8
  * @property {string} [sortKey] - Data property to sort by.
8
9
  * @property {SortFunction} [sortFunction] - Function for more complex-sorting.
9
10
  * @property {boolean} [reverseSort] - True when sorting is reversed.
@@ -42,6 +43,7 @@
42
43
  * @fires headerClicked
43
44
  * @fires rowClicked
44
45
  */
46
+ export {};
45
47
  /**
46
48
  * @event cellClicked
47
49
  * @type {object}
@@ -1,9 +1,15 @@
1
1
  <script>import { createEventDispatcher } from "svelte";
2
- import { Table, TableBody, TableBodyRow, TableHead } from "flowbite-svelte";
2
+ import { Table, TableBody, TableHead } from "flowbite-svelte";
3
3
  import { AngleDownSolid, AngleUpSolid } from "flowbite-svelte-icons";
4
- import DataTableDataCell from "./DataTableDataCell.svelte";
5
4
  import DataTableHeaderCell from "./DataTableHeaderCell.svelte";
6
- import { joinClasses } from "./common.js";
5
+ import DataTableRow from "./DataTableRow.svelte";
6
+ import {
7
+ getColumnID,
8
+ joinClasses,
9
+ setDataTableContext
10
+ } from "./common.js";
11
+ export let allowRowDrag = false;
12
+ export let allowRowDrop = !!allowRowDrag;
7
13
  export let columns = [];
8
14
  export let items = [];
9
15
  export let sortKey = "";
@@ -48,6 +54,7 @@ export let customColor = "";
48
54
  let sortedItems = [];
49
55
  let focusedColumnKeyID = null;
50
56
  let focusedItemKey = null;
57
+ setDataTableContext({});
51
58
  const sortBySortKey = (a, b) => {
52
59
  let aValue = a[sortKey];
53
60
  let bValue = b[sortKey];
@@ -76,7 +83,6 @@ $: {
76
83
  }
77
84
  const dispatch = createEventDispatcher();
78
85
  const getItemKey = (item) => item ? itemKey ? item[itemKey] || null : items.indexOf(item).toString() : null;
79
- const getColumnID = (column) => column ? column.id || null : null;
80
86
  const divClass = joinClasses(divClassOverride || divClassDefault, divClassAppend);
81
87
  const tableClass = joinClasses(tableClassOverride || tableClassDefault, tableClassAppend);
82
88
  const theadClass = joinClasses(theadClassOverride || theadClassDefault, theadClassAppend);
@@ -167,7 +173,8 @@ const enterPressed = (event) => {
167
173
  focusedItemKey = getItemKey(sortedItems[itemIndex + 1]);
168
174
  }
169
175
  };
170
- const cellClicked = (item, column) => {
176
+ const cellClicked = (event) => {
177
+ const { column, item } = event.detail;
171
178
  focusedColumnKeyID = null;
172
179
  focusedItemKey = null;
173
180
  if (column.canFocus) {
@@ -178,6 +185,9 @@ const cellClicked = (item, column) => {
178
185
  item,
179
186
  column
180
187
  });
188
+ dispatch("rowClicked", {
189
+ item
190
+ });
181
191
  };
182
192
  const headerClicked = (column) => {
183
193
  if (column.id && column.canSort) {
@@ -198,26 +208,6 @@ const headerClicked = (column) => {
198
208
  reverseSort
199
209
  });
200
210
  };
201
- const rowClicked = (item) => {
202
- dispatch("rowClicked", {
203
- item
204
- });
205
- };
206
- let draggedItem = null;
207
- const rowDragStart = (item) => {
208
- draggedItem = item;
209
- console.log("dispatching rowDragStart ", item);
210
- dispatch("rowDragStart", {
211
- draggedItem
212
- });
213
- };
214
- const rowDropped = (targetItem) => {
215
- console.log("dispatching rowDropped ", targetItem);
216
- dispatch("rowDropped", {
217
- draggedItem,
218
- targetItem
219
- });
220
- };
221
211
  </script>
222
212
 
223
213
  <Table class={tableClass} {divClass} {striped} {hoverable} {noborder} {shadow} {color} {customColor}>
@@ -237,29 +227,26 @@ const rowDropped = (targetItem) => {
237
227
  <TableBody {tableBodyClass}>
238
228
  {#each sortedItems as item}
239
229
  {@const isRowFocused = !!focusedItemKey && focusedItemKey === getItemKey(item)}
240
- <TableBodyRow
241
- class={getTRClass(item, isRowFocused)}
242
- draggable={true}
243
- on:click={() => rowClicked(item)}
244
- on:dragstart={() => rowDragStart(item)}
245
- on:drop={() => rowDropped(item)}
246
- >
247
- {#each internalColumns as column}
248
- {@const isCellFocused =
249
- isRowFocused && focusedColumnKeyID && focusedColumnKeyID === getColumnID(column)}
250
- <DataTableDataCell
251
- {column}
252
- {isCellFocused}
253
- {item}
254
- on:click={() => cellClicked(item, column)}
255
- on:enterPressed={enterPressed}
256
- on:prevTab={prevTab}
257
- on:nextTab={nextTab}
258
- on:action
259
- on:cellChanged
260
- />
261
- {/each}
262
- </TableBodyRow>
230
+ <DataTableRow
231
+ {allowRowDrag}
232
+ {allowRowDrop}
233
+ columns={internalColumns}
234
+ {focusedColumnKeyID}
235
+ {getTRClass}
236
+ {isRowFocused}
237
+ {item}
238
+ on:action
239
+ on:cellChanged
240
+ on:cellClicked={cellClicked}
241
+ on:cellDragStart
242
+ on:cellDropped
243
+ on:enterPressed={enterPressed}
244
+ on:nextTab={nextTab}
245
+ on:prevTab={prevTab}
246
+ on:rowClicked
247
+ on:rowDragStart
248
+ on:rowDropped
249
+ />
263
250
  {/each}
264
251
  </TableBody>
265
252
  </Table>
@@ -1,7 +1,9 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { ColumnConfig, EnterAction, RowClassFunction, SortFunction } from './common.js';
2
+ import type { ColumnConfig, EnterAction, RowBoolean, RowClassFunction, RowDropBoolean, SortFunction } from './common.js';
3
3
  declare const __propDef: {
4
4
  props: {
5
+ allowRowDrag?: RowBoolean | undefined;
6
+ allowRowDrop?: RowDropBoolean | undefined;
5
7
  columns?: ColumnConfig[] | undefined;
6
8
  items?: any[] | undefined;
7
9
  sortKey?: string | undefined;
@@ -39,11 +41,13 @@ declare const __propDef: {
39
41
  events: {
40
42
  action: any;
41
43
  cellChanged: any;
42
- cellClicked: CustomEvent<any>;
43
- headerClicked: CustomEvent<any>;
44
+ cellDragStart: CustomEvent<any>;
45
+ cellDropped: CustomEvent<any>;
44
46
  rowClicked: CustomEvent<any>;
45
47
  rowDragStart: CustomEvent<any>;
46
48
  rowDropped: CustomEvent<any>;
49
+ cellClicked: CustomEvent<any>;
50
+ headerClicked: CustomEvent<any>;
47
51
  } & {
48
52
  [evt: string]: CustomEvent<any>;
49
53
  };
@@ -1,14 +1,77 @@
1
- <script>import { TableBodyCell } from "flowbite-svelte";
2
- import { defaultCellRenderer } from "./common.js";
1
+ <script>import { createEventDispatcher, onDestroy } from "svelte";
2
+ import { TableBodyCell } from "flowbite-svelte";
3
+ import {
4
+ defaultCellRenderer,
5
+ evalCellDropBoolean,
6
+ evalRowBoolean,
7
+ getDataTableContext
8
+ } from "./common.js";
3
9
  export let column;
4
10
  export let item;
5
11
  export let isCellFocused;
12
+ const context = getDataTableContext();
13
+ let span;
14
+ const dispatch = createEventDispatcher();
15
+ const dragOverHandler = (event) => {
16
+ const { draggedColumn, draggedItem } = context;
17
+ event.preventDefault();
18
+ const canDrop = evalCellDropBoolean(draggedItem, draggedColumn, item, column.allowCellDrop);
19
+ if (canDrop) {
20
+ event.preventDefault();
21
+ if (event.dataTransfer) {
22
+ event.dataTransfer.dropEffect = "move";
23
+ }
24
+ }
25
+ };
26
+ const dragStartHandler = (dragEvent) => {
27
+ context.draggedColumn = column;
28
+ context.draggedItem = item;
29
+ dispatch("cellDragStart", {
30
+ dragEvent,
31
+ sourceColumn: column,
32
+ sourceItem: item
33
+ });
34
+ };
35
+ const dropHandler = (event) => {
36
+ const { draggedColumn, draggedItem } = context;
37
+ const canDrop = evalCellDropBoolean(draggedItem, draggedColumn, item, column.allowCellDrop);
38
+ if (canDrop) {
39
+ event.preventDefault();
40
+ dispatch("cellDropped", {
41
+ sourceColumn: draggedColumn,
42
+ sourceItem: draggedItem,
43
+ targetColumn: column,
44
+ targetItem: item
45
+ });
46
+ }
47
+ };
48
+ $: {
49
+ if (span && span.parentElement) {
50
+ span.parentElement.addEventListener("dragover", dragOverHandler);
51
+ span.parentElement.addEventListener("dragstart", dragStartHandler);
52
+ span.parentElement.addEventListener("drop", dropHandler);
53
+ }
54
+ }
55
+ onDestroy(() => {
56
+ if (span && span.parentElement) {
57
+ span.parentElement.removeEventListener("dragover", dragOverHandler);
58
+ span.parentElement.removeEventListener("dragstart", dragStartHandler);
59
+ span.parentElement.removeEventListener("drop", dropHandler);
60
+ }
61
+ });
6
62
  </script>
7
63
 
8
64
  {#await (column.cellRenderer || defaultCellRenderer)(column, item)}
9
65
  <TableBodyCell tdClass={column.getTDClass(item, '', isCellFocused)} />
10
66
  {:then { dataValue, displayValue }}
11
- <TableBodyCell tdClass={column.getTDClass(item, dataValue, isCellFocused)} on:click>
67
+ <TableBodyCell
68
+ draggable={evalRowBoolean(item, column.allowCellDrag)}
69
+ tdClass={column.getTDClass(item, dataValue, isCellFocused)}
70
+ on:click
71
+ >
72
+ {#if !!column.allowCellDrag || !!column.allowCellDrop}
73
+ <span style="display:none" bind:this={span}></span>
74
+ {/if}
12
75
  {#if column.viewComponent}
13
76
  <svelte:component
14
77
  this={column.viewComponent}
@@ -13,6 +13,8 @@ declare const __propDef: {
13
13
  enterPressed: any;
14
14
  prevTab: any;
15
15
  nextTab: any;
16
+ cellDragStart: CustomEvent<any>;
17
+ cellDropped: CustomEvent<any>;
16
18
  } & {
17
19
  [evt: string]: CustomEvent<any>;
18
20
  };
@@ -0,0 +1,93 @@
1
+ <script>import { createEventDispatcher, onDestroy, onMount } from "svelte";
2
+ import { TableBodyRow } from "flowbite-svelte";
3
+ import DataTableDataCell from "./DataTableDataCell.svelte";
4
+ import {
5
+ evalRowDropBoolean,
6
+ evalRowBoolean,
7
+ getColumnID,
8
+ getDataTableContext
9
+ } from "./common.js";
10
+ export let allowRowDrag;
11
+ export let allowRowDrop;
12
+ export let columns;
13
+ export let focusedColumnKeyID;
14
+ export let getTRClass;
15
+ export let isRowFocused;
16
+ export let item;
17
+ const context = getDataTableContext();
18
+ let span;
19
+ const dispatch = createEventDispatcher();
20
+ const cellClicked = (column) => dispatch("cellClicked", { column, item });
21
+ const rowClicked = () => dispatch("rowClicked", { item });
22
+ const dragOverHandler = (event) => {
23
+ const { draggedItem } = context;
24
+ const canDrop = evalRowDropBoolean(draggedItem, item, allowRowDrop);
25
+ if (canDrop) {
26
+ event.preventDefault();
27
+ if (event.dataTransfer) {
28
+ event.dataTransfer.dropEffect = "move";
29
+ }
30
+ }
31
+ };
32
+ const dragStartHandler = (dragEvent) => {
33
+ context.draggedColumn = void 0;
34
+ context.draggedItem = item;
35
+ dispatch("rowDragStart", {
36
+ dragEvent,
37
+ sourceItem: item
38
+ });
39
+ };
40
+ const dropHandler = (event) => {
41
+ const { draggedItem } = context;
42
+ const canDrop = evalRowDropBoolean(draggedItem, item, allowRowDrop);
43
+ if (canDrop) {
44
+ event.preventDefault();
45
+ dispatch("rowDropped", {
46
+ sourceItem: draggedItem,
47
+ targetItem: item
48
+ });
49
+ }
50
+ };
51
+ onMount(() => {
52
+ if (span && span.parentElement) {
53
+ span.parentElement.addEventListener("click", rowClicked);
54
+ span.parentElement.addEventListener("dragover", dragOverHandler);
55
+ span.parentElement.addEventListener("dragstart", dragStartHandler);
56
+ span.parentElement.addEventListener("drop", dropHandler);
57
+ }
58
+ });
59
+ onDestroy(() => {
60
+ if (span && span.parentElement) {
61
+ span.parentElement.removeEventListener("click", rowClicked);
62
+ span.parentElement.removeEventListener("dragover", dragOverHandler);
63
+ span.parentElement.removeEventListener("dragstart", dragStartHandler);
64
+ span.parentElement.removeEventListener("drop", dropHandler);
65
+ }
66
+ });
67
+ </script>
68
+
69
+ <TableBodyRow
70
+ class={getTRClass(item, isRowFocused)}
71
+ draggable={evalRowBoolean(item, allowRowDrag)}
72
+ >
73
+ {#if !!allowRowDrag || !!allowRowDrop}
74
+ <span style="display:none" bind:this={span}></span>
75
+ {/if}
76
+ {#each columns as column}
77
+ {@const isCellFocused =
78
+ isRowFocused && focusedColumnKeyID && focusedColumnKeyID === getColumnID(column)}
79
+ <DataTableDataCell
80
+ {column}
81
+ {isCellFocused}
82
+ {item}
83
+ on:click={() => cellClicked(column)}
84
+ on:enterPressed
85
+ on:prevTab
86
+ on:nextTab
87
+ on:action
88
+ on:cellChanged
89
+ on:cellDragStart
90
+ on:cellDropped
91
+ />
92
+ {/each}
93
+ </TableBodyRow>
@@ -0,0 +1,35 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { RowBoolean, RowDropBoolean, GetTRClassFunction, InternalColumnConfig } from './common.js';
3
+ declare const __propDef: {
4
+ props: {
5
+ allowRowDrag: RowBoolean;
6
+ allowRowDrop: RowDropBoolean;
7
+ columns: InternalColumnConfig[];
8
+ focusedColumnKeyID: any;
9
+ getTRClass: GetTRClassFunction;
10
+ isRowFocused: boolean;
11
+ item: any;
12
+ };
13
+ events: {
14
+ enterPressed: any;
15
+ prevTab: any;
16
+ nextTab: any;
17
+ action: any;
18
+ cellChanged: any;
19
+ cellDragStart: CustomEvent<any>;
20
+ cellDropped: CustomEvent<any>;
21
+ cellClicked: CustomEvent<any>;
22
+ rowClicked: CustomEvent<any>;
23
+ rowDragStart: CustomEvent<any>;
24
+ rowDropped: CustomEvent<any>;
25
+ } & {
26
+ [evt: string]: CustomEvent<any>;
27
+ };
28
+ slots: {};
29
+ };
30
+ export type DataTableRowProps = typeof __propDef.props;
31
+ export type DataTableRowEvents = typeof __propDef.events;
32
+ export type DataTableRowSlots = typeof __propDef.slots;
33
+ export default class DataTableRow extends SvelteComponent<DataTableRowProps, DataTableRowEvents, DataTableRowSlots> {
34
+ }
35
+ export {};
@@ -1,4 +1,6 @@
1
- <script context="module"></script>
1
+ <script context="module">import { Tooltip } from "flowbite-svelte";
2
+ import Icon from "@iconify/svelte";
3
+ </script>
2
4
 
3
5
  <script>import { createEventDispatcher } from "svelte";
4
6
  import { Button } from "flowbite-svelte";
@@ -25,7 +27,17 @@ const actionClicked = (action) => {
25
27
  disabled={action.isDisabled?.(item, column, action)}
26
28
  on:click={() => actionClicked(action)}
27
29
  >
28
- <svelte:component this={action.icon} class={action.iconClass || iconClass} />
30
+ {#if action.icon}
31
+ <svelte:component this={action.icon} class={action.iconClass || iconClass} />
32
+ {/if}
33
+ {#if action.iconify}
34
+ <Icon
35
+ {...action.iconify}
36
+ />
37
+ {/if}
29
38
  {#if action.caption}{action.caption}{/if}
30
39
  </Button>
40
+ {#if action.tooltip}
41
+ <Tooltip class="z-10">{action.tooltip}</Tooltip>
42
+ {/if}
31
43
  {/each}
@@ -1,15 +1,28 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { ColumnConfig } from '../common.js';
3
3
  type ButtonColor = 'red' | 'yellow' | 'green' | 'purple' | 'blue' | 'light' | 'dark' | 'primary' | 'none' | 'alternative' | undefined;
4
+ type IconifyProps = {
5
+ color?: string;
6
+ flip?: string;
7
+ height?: string | number;
8
+ hFlip?: boolean;
9
+ icon: string;
10
+ inline?: boolean;
11
+ rotate?: number;
12
+ vFlip?: boolean;
13
+ width?: string | number;
14
+ };
4
15
  export type ActionDisablementFunction = (item: any, column: ColumnConfig, action: Action) => boolean;
5
16
  export interface Action {
6
17
  buttonClass?: string;
7
18
  buttonColor?: ButtonColor;
8
19
  caption?: string;
9
20
  name: string;
10
- icon: ConstructorOfATypedSvelteComponent;
21
+ icon?: ConstructorOfATypedSvelteComponent;
11
22
  iconClass?: string;
23
+ iconify?: IconifyProps;
12
24
  isDisabled?: ActionDisablementFunction;
25
+ tooltip?: string;
13
26
  }
14
27
  declare const __propDef: {
15
28
  props: {
@@ -6,8 +6,7 @@ export let item;
6
6
  export let column;
7
7
  export let value;
8
8
  let internalValue;
9
- $:
10
- internalValue = value;
9
+ $: internalValue = value;
11
10
  const dispatch = createEventDispatcher();
12
11
  const dispatchCellChanged = () => {
13
12
  if (value !== internalValue) {
@@ -9,15 +9,14 @@ export let items = [];
9
9
  export let value;
10
10
  let newValue = value;
11
11
  const dispatch = createEventDispatcher();
12
- $:
13
- if (value !== newValue) {
14
- dispatch("cellChanged", {
15
- column,
16
- item,
17
- oldValue: value,
18
- newValue
19
- });
20
- }
12
+ $: if (value !== newValue) {
13
+ dispatch("cellChanged", {
14
+ column,
15
+ item,
16
+ oldValue: value,
17
+ newValue
18
+ });
19
+ }
21
20
  </script>
22
21
 
23
22
  <TabWrapper {column} {item} on:prevTab on:nextTab>
@@ -5,8 +5,7 @@ export let item;
5
5
  export let column;
6
6
  export let value;
7
7
  let internalValue;
8
- $:
9
- internalValue = value;
8
+ $: internalValue = value;
10
9
  const dispatch = createEventDispatcher();
11
10
  const dispatchCellChanged = () => {
12
11
  if (value !== internalValue) {
@@ -9,15 +9,14 @@ export let items = [];
9
9
  export let value;
10
10
  let newValue = value;
11
11
  const dispatch = createEventDispatcher();
12
- $:
13
- if (value !== newValue) {
14
- dispatch("cellChanged", {
15
- column,
16
- item,
17
- oldValue: value,
18
- newValue
19
- });
20
- }
12
+ $: if (value !== newValue) {
13
+ dispatch("cellChanged", {
14
+ column,
15
+ item,
16
+ oldValue: value,
17
+ newValue
18
+ });
19
+ }
21
20
  </script>
22
21
 
23
22
  <TabWrapper {column} {item} on:prevTab on:nextTab>
package/dist/common.d.ts CHANGED
@@ -56,6 +56,8 @@ b: any) => number;
56
56
  * @property {string} [id] - Used to distinguish between multiple columns that have the same key.
57
57
  * @property {string} [key] - Name of the property in each row item that will be used for this column's value.
58
58
  * @property {string} [title] - Text to display in the column's header.
59
+ * @property {RowBoolean} [allowCellDrag] -
60
+ * @property {CellDropBoolean} [allowCellDrop] -
59
61
  * @property {CellRenderer} [cellRenderer] - Dynamically determines the data value and display value for a cell.
60
62
  * @property {ConstructorOfATypedSvelteComponent} [viewComponent] - Svelte component class to be displayed in the cell regardless of focus. If set, focusComponent will be ignored.
61
63
  * @property {object} [viewComponentConfig] - Properties to be passed when creating viewComponent.
@@ -76,14 +78,19 @@ b: any) => number;
76
78
  * @property {string} [sortKey] - Item property to sort by, if sortFunction is not defined.
77
79
  */
78
80
  export interface ColumnConfig {
79
- id?: string;
80
- key?: string;
81
- title?: string;
81
+ allowCellDrag?: RowBoolean;
82
+ allowCellDrop?: CellDropBoolean;
83
+ canFocus?: boolean;
84
+ canSort?: boolean;
82
85
  cellRenderer?: CellRenderer;
83
- viewComponent?: ConstructorOfATypedSvelteComponent;
84
- viewComponentConfig?: any;
85
86
  focusComponent?: ConstructorOfATypedSvelteComponent;
86
87
  focusComponentConfig?: any;
88
+ id?: string;
89
+ key?: string;
90
+ sortAscendingIcon?: ConstructorOfATypedSvelteComponent;
91
+ sortDescendingIcon?: ConstructorOfATypedSvelteComponent;
92
+ sortFunction?: SortFunction;
93
+ sortKey?: string;
87
94
  tdClassAppend?: string;
88
95
  tdClassOverride?: string;
89
96
  tdFocusedClassAppend?: string;
@@ -91,12 +98,9 @@ export interface ColumnConfig {
91
98
  tdClassGetter?: DataCellClassFunction;
92
99
  thClassAppend?: string;
93
100
  thClassOverride?: string;
94
- canFocus?: boolean;
95
- canSort?: boolean;
96
- sortFunction?: SortFunction;
97
- sortKey?: string;
98
- sortAscendingIcon?: ConstructorOfATypedSvelteComponent;
99
- sortDescendingIcon?: ConstructorOfATypedSvelteComponent;
101
+ title?: string;
102
+ viewComponent?: ConstructorOfATypedSvelteComponent;
103
+ viewComponentConfig?: any;
100
104
  }
101
105
  /**
102
106
  * Returns the a class string for a data row.
@@ -128,9 +132,40 @@ export declare const joinClasses: (...classes: (string | false | null | undefine
128
132
  * @enum {string} EnterAction
129
133
  */
130
134
  export type EnterAction = 'next' | 'down' | 'stay';
135
+ export type GetItemKeyFunction = (item?: any) => any;
131
136
  export type GetTDClassFunction = (item: any, value: any, isFocused: boolean) => string;
137
+ export type GetTRClassFunction = (item: any, isRowFocused: boolean) => string;
132
138
  export interface InternalColumnConfig extends ColumnConfig {
133
139
  getTDClass: GetTDClassFunction;
134
140
  }
141
+ type CellDropBooleanFunction = (sourceItem: any, targetItem: any, targetColumn: ColumnConfig) => boolean;
142
+ /**
143
+ * @callback CellDropBoolean
144
+ * @returns {boolean}
145
+ */
146
+ export type CellDropBoolean = boolean | CellDropBooleanFunction;
147
+ type RowBooleanFunction = (item: any) => boolean;
148
+ /**
149
+ * @callback RowBoolean
150
+ * @returns {boolean}
151
+ */
152
+ export type RowBoolean = boolean | RowBooleanFunction;
153
+ type RowDropBooleanFunction = (sourceItem: any, targetItem: any) => boolean;
154
+ /**
155
+ * @callback RowDropBoolean
156
+ * @returns {boolean}
157
+ */
158
+ export type RowDropBoolean = boolean | RowDropBooleanFunction;
135
159
  export declare const blankCellValue: CellValue;
160
+ export declare const evalCellDropBoolean: (sourceItem: any, sourceColumn: ColumnConfig | undefined, targetItem: any, cellDropBoolean?: CellDropBoolean) => boolean | undefined;
161
+ export declare const evalRowBoolean: (item: any, rowBoolean?: RowBoolean) => boolean | undefined;
162
+ export declare const evalRowDropBoolean: (sourceItem: any, targetItem: any, rowDropBoolean?: RowDropBoolean) => boolean | undefined;
136
163
  export declare const defaultCellRenderer: CellRenderer;
164
+ export declare const getColumnID: (column?: ColumnConfig | null) => string | null;
165
+ interface DataTableContext {
166
+ draggedColumn?: InternalColumnConfig;
167
+ draggedItem?: any;
168
+ }
169
+ export declare const getDataTableContext: () => DataTableContext;
170
+ export declare const setDataTableContext: (context: DataTableContext) => DataTableContext;
171
+ export {};
package/dist/common.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { getContext, setContext } from 'svelte';
1
2
  /**
2
3
  * Joins an array of classes into a string, removing any falsey values.
3
4
  * @function joinClasses
@@ -9,6 +10,28 @@ export const blankCellValue = {
9
10
  dataValue: null,
10
11
  displayValue: '',
11
12
  };
13
+ export const evalCellDropBoolean = (sourceItem, sourceColumn, targetItem, cellDropBoolean) => {
14
+ if (typeof cellDropBoolean === 'boolean') {
15
+ return cellDropBoolean;
16
+ }
17
+ return cellDropBoolean && cellDropBoolean(sourceItem, sourceColumn, targetItem);
18
+ };
19
+ export const evalRowBoolean = (item, rowBoolean) => {
20
+ if (typeof rowBoolean === 'boolean') {
21
+ return rowBoolean;
22
+ }
23
+ return rowBoolean && rowBoolean(item);
24
+ };
25
+ export const evalRowDropBoolean = (sourceItem, targetItem, rowDropBoolean) => {
26
+ if (typeof rowDropBoolean == 'boolean') {
27
+ return rowDropBoolean;
28
+ }
29
+ return rowDropBoolean && rowDropBoolean(sourceItem, targetItem);
30
+ };
12
31
  export const defaultCellRenderer = async (column, item) => column.key
13
32
  ? { dataValue: item[column.key], displayValue: item[column.key] || '' }
14
33
  : blankCellValue;
34
+ export const getColumnID = (column) => (column ? column.id || null : null);
35
+ const dataTableContextName = 'data-grid';
36
+ export const getDataTableContext = () => getContext(dataTableContextName);
37
+ export const setDataTableContext = (context) => setContext(dataTableContextName, context);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emamid/svelte-data-table",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "homepage": "https://github.com/emamid/svelte-data-table",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
@@ -30,6 +30,8 @@
30
30
  "svelte": "^4.0.0"
31
31
  },
32
32
  "devDependencies": {
33
+ "@iconify/json": "^2.2.235",
34
+ "@iconify/svelte": "^4.0.2",
33
35
  "@sveltejs/adapter-auto": "^3.0.0",
34
36
  "@sveltejs/kit": "^2.0.0",
35
37
  "@sveltejs/package": "^2.0.0",