@triptyk/ember-yeti-table 3.0.0 → 3.0.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/LICENSE.md +1 -1
- package/README.md +9 -115
- package/declarations/components/yeti-table/body.d.ts +32 -0
- package/declarations/components/yeti-table/body.d.ts.map +1 -0
- package/declarations/components/yeti-table/header.d.ts +33 -0
- package/declarations/components/yeti-table/header.d.ts.map +1 -0
- package/declarations/components/yeti-table/pagination.d.ts +40 -0
- package/declarations/components/yeti-table/pagination.d.ts.map +1 -0
- package/declarations/components/yeti-table/table.d.ts +21 -0
- package/declarations/components/yeti-table/table.d.ts.map +1 -0
- package/declarations/components/yeti-table/tbody/row/cell.d.ts +44 -0
- package/declarations/components/yeti-table/tbody/row/cell.d.ts.map +1 -0
- package/declarations/components/yeti-table/tbody/row.d.ts +37 -0
- package/declarations/components/yeti-table/tbody/row.d.ts.map +1 -0
- package/declarations/components/yeti-table/tbody.d.ts +29 -0
- package/declarations/components/yeti-table/tbody.d.ts.map +1 -0
- package/declarations/components/yeti-table/tfoot/row/cell.d.ts +40 -0
- package/declarations/components/yeti-table/tfoot/row/cell.d.ts.map +1 -0
- package/declarations/components/yeti-table/tfoot/row.d.ts +37 -0
- package/declarations/components/yeti-table/tfoot/row.d.ts.map +1 -0
- package/declarations/components/yeti-table/tfoot.d.ts +27 -0
- package/declarations/components/yeti-table/tfoot.d.ts.map +1 -0
- package/declarations/components/yeti-table/thead/row/cell.d.ts +54 -0
- package/declarations/components/yeti-table/thead/row/cell.d.ts.map +1 -0
- package/declarations/components/yeti-table/thead/row/column.d.ts +69 -0
- package/declarations/components/yeti-table/thead/row/column.d.ts.map +1 -0
- package/declarations/components/yeti-table/thead/row.d.ts +55 -0
- package/declarations/components/yeti-table/thead/row.d.ts.map +1 -0
- package/declarations/components/yeti-table/thead.d.ts +34 -0
- package/declarations/components/yeti-table/thead.d.ts.map +1 -0
- package/declarations/components/yeti-table.d.ts +107 -0
- package/declarations/components/yeti-table.d.ts.map +1 -0
- package/declarations/index.d.ts +1 -0
- package/declarations/index.d.ts.map +1 -0
- package/declarations/template-registry.d.ts +1 -0
- package/declarations/template-registry.d.ts.map +1 -0
- package/declarations/themes/default-theme.d.ts +3 -27
- package/declarations/themes/default-theme.d.ts.map +1 -1
- package/declarations/types.d.ts +82 -0
- package/declarations/types.d.ts.map +1 -0
- package/declarations/utils/create-regex.d.ts +1 -1
- package/declarations/utils/create-regex.d.ts.map +1 -1
- package/declarations/utils/filtering-utils.d.ts +2 -4
- package/declarations/utils/filtering-utils.d.ts.map +1 -1
- package/declarations/utils/sorting-utils.d.ts +6 -15
- package/declarations/utils/sorting-utils.d.ts.map +1 -1
- package/dist/components/yeti-table/body.js +19 -14
- package/dist/components/yeti-table/body.js.map +1 -1
- package/dist/components/yeti-table/header.js +10 -10
- package/dist/components/yeti-table/header.js.map +1 -1
- package/dist/components/yeti-table/pagination.js +14 -44
- package/dist/components/yeti-table/pagination.js.map +1 -1
- package/dist/components/yeti-table/table.js +1 -23
- package/dist/components/yeti-table/table.js.map +1 -1
- package/dist/components/yeti-table/tbody/row/cell.js +12 -12
- package/dist/components/yeti-table/tbody/row/cell.js.map +1 -1
- package/dist/components/yeti-table/tbody/row.js +15 -21
- package/dist/components/yeti-table/tbody/row.js.map +1 -1
- package/dist/components/yeti-table/tbody.js +1 -0
- package/dist/components/yeti-table/tbody.js.map +1 -1
- package/dist/components/yeti-table/tfoot/row/cell.js +9 -9
- package/dist/components/yeti-table/tfoot/row/cell.js.map +1 -1
- package/dist/components/yeti-table/tfoot/row.js +11 -11
- package/dist/components/yeti-table/tfoot/row.js.map +1 -1
- package/dist/components/yeti-table/tfoot.js +1 -0
- package/dist/components/yeti-table/tfoot.js.map +1 -1
- package/dist/components/yeti-table/thead/row/cell.js +11 -8
- package/dist/components/yeti-table/thead/row/cell.js.map +1 -1
- package/dist/components/yeti-table/thead/row/column.js +27 -128
- package/dist/components/yeti-table/thead/row/column.js.map +1 -1
- package/dist/components/yeti-table/thead/row.js +15 -15
- package/dist/components/yeti-table/thead/row.js.map +1 -1
- package/dist/components/yeti-table/thead.js +3 -22
- package/dist/components/yeti-table/thead.js.map +1 -1
- package/dist/components/yeti-table.js +102 -303
- package/dist/components/yeti-table.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/template-registry.js +2 -0
- package/dist/template-registry.js.map +1 -0
- package/dist/themes/default-theme.js +3 -2
- package/dist/themes/default-theme.js.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/create-regex.js +6 -6
- package/dist/utils/create-regex.js.map +1 -1
- package/dist/utils/filtering-utils.js +20 -8
- package/dist/utils/filtering-utils.js.map +1 -1
- package/dist/utils/sorting-utils.js +13 -18
- package/dist/utils/sorting-utils.js.map +1 -1
- package/package.json +37 -16
- package/src/components/yeti-table/{body.gjs → body.gts} +49 -45
- package/src/components/yeti-table/header.gts +67 -0
- package/src/components/yeti-table/pagination.gts +118 -0
- package/src/components/yeti-table/table.gts +27 -0
- package/src/components/yeti-table/tbody/row/{cell.gjs → cell.gts} +38 -19
- package/src/components/yeti-table/tbody/row.gts +76 -0
- package/src/components/yeti-table/tbody.gts +53 -0
- package/src/components/yeti-table/tfoot/row/cell.gts +64 -0
- package/src/components/yeti-table/tfoot/row.gts +59 -0
- package/src/components/yeti-table/tfoot.gts +41 -0
- package/src/components/yeti-table/thead/row/{cell.gjs → cell.gts} +36 -13
- package/src/components/yeti-table/thead/row/column.gts +177 -0
- package/src/components/yeti-table/thead/row.gts +105 -0
- package/src/components/yeti-table/thead.gts +65 -0
- package/src/components/yeti-table.gts +633 -0
- package/src/template-registry.ts +10 -0
- package/src/themes/{default-theme.js → default-theme.ts} +5 -1
- package/src/types.ts +94 -0
- package/src/utils/{create-regex.js → create-regex.ts} +10 -10
- package/src/utils/filtering-utils.ts +91 -0
- package/src/utils/{sorting-utils.js → sorting-utils.ts} +35 -26
- package/dist/_app_/themes/default-theme.js +0 -1
- package/dist/_app_/utils/create-regex.js +0 -1
- package/dist/_app_/utils/filtering-utils.js +0 -1
- package/dist/_app_/utils/sorting-utils.js +0 -1
- package/src/components/yeti-table/header.gjs +0 -54
- package/src/components/yeti-table/pagination.gjs +0 -155
- package/src/components/yeti-table/table.gjs +0 -34
- package/src/components/yeti-table/tbody/row.gjs +0 -89
- package/src/components/yeti-table/tbody.gjs +0 -55
- package/src/components/yeti-table/tfoot/row/cell.gjs +0 -45
- package/src/components/yeti-table/tfoot/row.gjs +0 -44
- package/src/components/yeti-table/tfoot.gjs +0 -33
- package/src/components/yeti-table/thead/row/column.gjs +0 -260
- package/src/components/yeti-table/thead/row.gjs +0 -71
- package/src/components/yeti-table/thead.gjs +0 -45
- package/src/components/yeti-table.gjs +0 -780
- package/src/utils/filtering-utils.js +0 -75
- /package/src/{.gitkeep → index.ts} +0 -0
|
@@ -4,19 +4,19 @@ import { scheduleOnce, later, schedule } from '@ember/runloop';
|
|
|
4
4
|
import { isPresent, isEmpty } from '@ember/utils';
|
|
5
5
|
import Component from '@glimmer/component';
|
|
6
6
|
import { cached, tracked } from '@glimmer/tracking';
|
|
7
|
+
import Helper from '@ember/component/helper';
|
|
7
8
|
import merge from 'deepmerge';
|
|
8
9
|
import { use } from 'ember-resources';
|
|
9
10
|
import { trackedFunction } from 'reactiveweb/function';
|
|
10
11
|
import { keepLatest } from 'reactiveweb/keep-latest';
|
|
11
12
|
import { localCopy, dedupeTracked } from 'tracked-toolbox';
|
|
12
|
-
import
|
|
13
|
+
import { hash } from '@ember/helper';
|
|
14
|
+
import defaultTheme from '../themes/default-theme.js';
|
|
13
15
|
import filterData from '../utils/filtering-utils.js';
|
|
14
16
|
import { sortMultiple, compareValues, mergeSort } from '../utils/sorting-utils.js';
|
|
15
|
-
import Helper from '@ember/component/helper';
|
|
16
|
-
import { hash } from '@ember/helper';
|
|
17
17
|
import Table from './yeti-table/table.js';
|
|
18
18
|
import Header from './yeti-table/header.js';
|
|
19
|
-
import
|
|
19
|
+
import THeadComponent from './yeti-table/thead.js';
|
|
20
20
|
import Body from './yeti-table/body.js';
|
|
21
21
|
import TBody from './yeti-table/tbody.js';
|
|
22
22
|
import TFoot from './yeti-table/tfoot.js';
|
|
@@ -27,16 +27,13 @@ import { g, i, n } from 'decorator-transforms/runtime-esm';
|
|
|
27
27
|
|
|
28
28
|
const TASK_CANCELATION_NAME = 'TaskCancelation';
|
|
29
29
|
const didCancel = function (e) {
|
|
30
|
-
return e && e.name === TASK_CANCELATION_NAME;
|
|
30
|
+
return !!e && e.name === TASK_CANCELATION_NAME;
|
|
31
31
|
};
|
|
32
|
-
|
|
32
|
+
function getConfigWithDefault(key, defaultValue) {
|
|
33
33
|
return function () {
|
|
34
34
|
return this.config[key] ?? defaultValue;
|
|
35
35
|
};
|
|
36
|
-
}
|
|
37
|
-
// we keep `totalRows` updated manually in xwaan untracked property
|
|
38
|
-
// to allow the user to update it in a loadData call and avoid
|
|
39
|
-
// a re-run of the main tracked function
|
|
36
|
+
}
|
|
40
37
|
class UpdateTotalRows extends Helper {
|
|
41
38
|
compute(positional, {
|
|
42
39
|
context
|
|
@@ -47,9 +44,6 @@ class UpdateTotalRows extends Helper {
|
|
|
47
44
|
return '';
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
|
-
// we need some control of how we update the filter property, hence this modifier
|
|
51
|
-
// in this case, any falsy value will be considered as en empty string, which will then
|
|
52
|
-
// be deduped.
|
|
53
47
|
class UpdateFilter extends Helper {
|
|
54
48
|
compute(positional, {
|
|
55
49
|
context
|
|
@@ -59,94 +53,27 @@ class UpdateFilter extends Helper {
|
|
|
59
53
|
}
|
|
60
54
|
}
|
|
61
55
|
class ProcessedData extends Helper {
|
|
62
|
-
compute(
|
|
56
|
+
compute(_positional, {
|
|
63
57
|
loadData,
|
|
64
58
|
context
|
|
65
59
|
}) {
|
|
66
|
-
|
|
60
|
+
const data = context.latestData ?? [];
|
|
67
61
|
if (!loadData) {
|
|
68
62
|
context.processData(data);
|
|
69
63
|
} else {
|
|
70
|
-
// This is instrumental to ignoreDataChanges working
|
|
71
64
|
context.processedData = data;
|
|
72
65
|
}
|
|
73
66
|
return '';
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
69
|
class YetiTable extends Component {
|
|
77
|
-
static {
|
|
78
|
-
setComponentTemplate(precompileTemplate("{{#let (hash table=(component Table theme=this.mergedTheme parent=this) header=(component Header columns=this.columns onColumnClick=this.onColumnSort sortable=this.sortable sortSequence=this.sortSequence parent=this theme=this.mergedTheme) thead=(component THead columns=this.columns onColumnClick=this.onColumnSort sortable=this.sortable sortSequence=this.sortSequence theme=this.mergedTheme parent=this) body=(component Body data=this.processedData columns=this.columns theme=this.mergedTheme parent=this) tbody=(component TBody data=this.processedData columns=this.columns theme=this.mergedTheme parent=this) tfoot=(component TFoot columns=this.columns theme=this.mergedTheme parent=this) pagination=(component Pagination disabled=this.isLoading theme=this.mergedTheme paginationData=this.paginationData paginationActions=(hash previousPage=this.previousPage nextPage=this.nextPage goToPage=this.goToPage changePageSize=this.changePageSize)) actions=this.publicApi paginationData=this.paginationData isLoading=this.resolvedData.isPending columns=this.columns visibleColumns=this.visibleColumns rows=this.normalizedRows totalRows=this.normalizedTotalRows visibleRows=this.processedData theme=this.mergedTheme) as |api|}}\n {{UpdateTotalRows @totalRows context=this}}\n {{UpdateFilter @filter context=this}}\n {{ProcessedData loadData=@loadData context=this}}\n\n {{#if this.renderTableElement}}\n <Table @theme={{this.mergedTheme}} @parent={{this}} ...attributes>\n {{yield api}}\n </Table>\n {{else}}\n {{yield api}}\n {{/if}}\n\n{{/let}}", {
|
|
79
|
-
strictMode: true,
|
|
80
|
-
scope: () => ({
|
|
81
|
-
hash,
|
|
82
|
-
Table,
|
|
83
|
-
Header,
|
|
84
|
-
THead,
|
|
85
|
-
Body,
|
|
86
|
-
TBody,
|
|
87
|
-
TFoot,
|
|
88
|
-
Pagination,
|
|
89
|
-
UpdateTotalRows,
|
|
90
|
-
UpdateFilter,
|
|
91
|
-
ProcessedData
|
|
92
|
-
})
|
|
93
|
-
}), this);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* An object that contains classes for yeti table to apply when rendering its various table
|
|
97
|
-
* html elements. The theme object your pass in will be deeply merged with yeti-table's default theme
|
|
98
|
-
* and with a theme defined in your environment.js at `ENV['ember-yeti-table'].theme`.
|
|
99
|
-
*
|
|
100
|
-
* @argument theme
|
|
101
|
-
* @type {Object}
|
|
102
|
-
*/ /**
|
|
103
|
-
* The data for Yeti Table to render. It can be an array or a promise that resolves with an array.
|
|
104
|
-
* The only case when `@data` is optional is if a `@loadData` was passed in.
|
|
105
|
-
* @argument data
|
|
106
|
-
* @type {Array | Promise<Array>}
|
|
107
|
-
*/ /**
|
|
108
|
-
* The function that will be called when Yeti Table needs data. This argument is used
|
|
109
|
-
* when you don't have all the data available or loading all rows at once isn't possible,
|
|
110
|
-
* e.g the dataset is too large.
|
|
111
|
-
*
|
|
112
|
-
* By passing in a function to `@loadData` you assume the responsibility to filter, sort and
|
|
113
|
-
* paginate the data (if said features are enabled).
|
|
114
|
-
*
|
|
115
|
-
* This function must return an array or a promise that resolves with an array.
|
|
116
|
-
*
|
|
117
|
-
* This function will be called with an argument with the current state of the table.
|
|
118
|
-
* Use this object to know what data to fetch, pass it to the server, etc.
|
|
119
|
-
* Please check the "Async Data" guide to understand what that object contains and
|
|
120
|
-
* an example of its usage.
|
|
121
|
-
*
|
|
122
|
-
* @argument loadData
|
|
123
|
-
* @type {Function}
|
|
124
|
-
*/
|
|
125
70
|
publicApi = {
|
|
126
|
-
previousPage: this.previousPage,
|
|
127
|
-
nextPage: this.nextPage,
|
|
128
|
-
goToPage: this.goToPage,
|
|
129
|
-
changePageSize: this.changePageSize,
|
|
130
|
-
reloadData: this.reloadData
|
|
71
|
+
previousPage: () => this.previousPage(),
|
|
72
|
+
nextPage: () => this.nextPage(),
|
|
73
|
+
goToPage: n => this.goToPage(n),
|
|
74
|
+
changePageSize: n => this.changePageSize(n),
|
|
75
|
+
reloadData: () => this.reloadData()
|
|
131
76
|
};
|
|
132
|
-
/**
|
|
133
|
-
* This function will be called when Yeti Table initializes. It will be called with
|
|
134
|
-
* an object argument containing the functions for the possible actions you can make
|
|
135
|
-
* on a table. This object contains the following actions:
|
|
136
|
-
* - previousPage
|
|
137
|
-
* - nextPage
|
|
138
|
-
* - goToPage
|
|
139
|
-
* - changePageSize
|
|
140
|
-
* - reloadData
|
|
141
|
-
*
|
|
142
|
-
* @argument registerApi
|
|
143
|
-
* @type {Function}
|
|
144
|
-
*/ /**
|
|
145
|
-
* Use this argument to enable the pagination feature. Default is `false`.
|
|
146
|
-
*
|
|
147
|
-
* @argument pagination
|
|
148
|
-
* @type {Boolean}
|
|
149
|
-
*/
|
|
150
77
|
static {
|
|
151
78
|
g(this.prototype, "pagination", [localCopy('args.pagination', getConfigWithDefault('pagination', false))]);
|
|
152
79
|
}
|
|
@@ -155,49 +82,11 @@ class YetiTable extends Component {
|
|
|
155
82
|
g(this.prototype, "pageSize", [localCopy('args.pageSize', getConfigWithDefault('pageSize', 15))]);
|
|
156
83
|
}
|
|
157
84
|
#pageSize = (i(this, "pageSize"), void 0);
|
|
158
|
-
/**
|
|
159
|
-
* Controls the size of each page. Default is `15`.
|
|
160
|
-
*
|
|
161
|
-
* @argument pageSize
|
|
162
|
-
* @type {number}
|
|
163
|
-
*/
|
|
164
85
|
static {
|
|
165
86
|
g(this.prototype, "pageNumber", [localCopy('args.pageNumber', 1)]);
|
|
166
87
|
}
|
|
167
88
|
#pageNumber = (i(this, "pageNumber"), void 0);
|
|
168
|
-
/**
|
|
169
|
-
* Controls the current page to show. Default is `1`.
|
|
170
|
-
*
|
|
171
|
-
* @argument pageNumber
|
|
172
|
-
* @type {number}
|
|
173
|
-
*/
|
|
174
|
-
/**
|
|
175
|
-
* Optional argument that informs yeti table of how many rows your data has.
|
|
176
|
-
* Only needed when using a `@loadData` function and `@pagination={{true}}`.
|
|
177
|
-
* When you use `@data`, Yeti Table uses the size of that array.
|
|
178
|
-
* This information is used to calculate the pagination information that is yielded
|
|
179
|
-
* and passed to the `@loadData` function.
|
|
180
|
-
*
|
|
181
|
-
* @argument totalRows
|
|
182
|
-
* @type {number}
|
|
183
|
-
*/
|
|
184
89
|
totalRows;
|
|
185
|
-
// we keep `totalRows` updated manually in an untracked property
|
|
186
|
-
// to allow the user to update it in a loadData call and avoid
|
|
187
|
-
// a re-run of the main tracked function
|
|
188
|
-
// @action
|
|
189
|
-
// updateTotalRows(totalRows) {
|
|
190
|
-
// this.totalRows = totalRows;
|
|
191
|
-
// notifyPropertyChange(this, 'normalizedTotalRows');
|
|
192
|
-
// notifyPropertyChange(this, 'paginationData');
|
|
193
|
-
// }
|
|
194
|
-
/**
|
|
195
|
-
* The global filter. If passed in, Yeti Table will search all the rows that contain this
|
|
196
|
-
* string and show them. Defaults to `''`.
|
|
197
|
-
*
|
|
198
|
-
* @argument filter
|
|
199
|
-
* @type {String}
|
|
200
|
-
*/
|
|
201
90
|
static {
|
|
202
91
|
g(this.prototype, "filter", [dedupeTracked], function () {
|
|
203
92
|
return '';
|
|
@@ -207,120 +96,31 @@ class YetiTable extends Component {
|
|
|
207
96
|
static {
|
|
208
97
|
g(this.prototype, "sortable", [localCopy('args.sortable', getConfigWithDefault('sortable', true))]);
|
|
209
98
|
}
|
|
210
|
-
#sortable = (i(this, "sortable"), void 0);
|
|
211
|
-
// in this case, any falsy value will be considered as en empty string, which will then
|
|
212
|
-
// be deduped.
|
|
213
|
-
// @action
|
|
214
|
-
// updateFilter(filter) {
|
|
215
|
-
// this.filter = filter || '';
|
|
216
|
-
// }
|
|
217
|
-
/**
|
|
218
|
-
* An optional function to customize the filtering logic. This function should return true
|
|
219
|
-
* or false to either include or exclude the row on the resulting set. If this function depends
|
|
220
|
-
* on a value, pass that value as the `@filterUsing` argument.
|
|
221
|
-
*
|
|
222
|
-
* This function will be called with two arguments:
|
|
223
|
-
* - `row` - the current data row to use for filtering
|
|
224
|
-
* - `filterUsing` - the value you passed in as `@filterUsing`
|
|
225
|
-
*
|
|
226
|
-
* @argument filterFunction
|
|
227
|
-
* @type {Function}
|
|
228
|
-
*/
|
|
229
|
-
/**
|
|
230
|
-
* If you `@filterFunction` function depends on a different value (other that `@filter`)
|
|
231
|
-
* to show, pass it in this argument. Yeti Table uses this argument to know when to recalculate
|
|
232
|
-
* the fitlered rows.
|
|
233
|
-
*
|
|
234
|
-
* @argument filterUsing
|
|
235
|
-
* @type {Object}
|
|
236
|
-
*/
|
|
237
|
-
/**
|
|
238
|
-
* Used to enable/disable sorting on all columns. You should use this to avoid passing
|
|
239
|
-
* the @sortable argument to all columns. Defaults to `true`.
|
|
240
|
-
*
|
|
241
|
-
* @argument sortable
|
|
242
|
-
* @type {Boolean}
|
|
243
|
-
*/
|
|
99
|
+
#sortable = (i(this, "sortable"), void 0);
|
|
244
100
|
static {
|
|
245
101
|
g(this.prototype, "sortFunction", [localCopy('args.sortFunction', () => sortMultiple)]);
|
|
246
102
|
}
|
|
247
103
|
#sortFunction = (i(this, "sortFunction"), void 0);
|
|
248
|
-
/**
|
|
249
|
-
* Use the `@sortFunction` if you want to completely customize how the row sorting is done.
|
|
250
|
-
* It will be invoked with two rows, the current sortings that are applied and the `@compareFunction`.
|
|
251
|
-
*
|
|
252
|
-
* @argument sortFunction
|
|
253
|
-
* @type {Function}
|
|
254
|
-
*/
|
|
255
104
|
static {
|
|
256
105
|
g(this.prototype, "compareFunction", [localCopy('args.compareFunction', () => compareValues)]);
|
|
257
106
|
}
|
|
258
107
|
#compareFunction = (i(this, "compareFunction"), void 0);
|
|
259
|
-
/**
|
|
260
|
-
* Use `@compareFunction` if you just want to customize how two values relate to each other (not the entire row).
|
|
261
|
-
* It will be invoked with two values and you just need to return `-1`, `0` or `1` depending on if first value is
|
|
262
|
-
* greater than the second or not. The default compare function used is the `compare` function from `@ember/utils`.
|
|
263
|
-
*
|
|
264
|
-
* @argument compareFunction
|
|
265
|
-
* @type {Function}
|
|
266
|
-
*/
|
|
267
108
|
static {
|
|
268
109
|
g(this.prototype, "sortSequence", [localCopy('args.sortSequence', getConfigWithDefault('sortSequence', ['asc', 'desc']))]);
|
|
269
110
|
}
|
|
270
111
|
#sortSequence = (i(this, "sortSequence"), void 0);
|
|
271
|
-
/**
|
|
272
|
-
* Use `@sortSequence` to customize the sequence in which the sorting order will cycle when
|
|
273
|
-
* clicking on the table headers. You can either pass in a comma-separated string or an array
|
|
274
|
-
* of strings. Accepted values are `'asc'`, `'desc'` and `'unsorted'`. The default value is `['asc', 'desc']`.
|
|
275
|
-
*
|
|
276
|
-
* @argument sortSequence
|
|
277
|
-
* @type {Array<string> | string}
|
|
278
|
-
*/
|
|
279
112
|
static {
|
|
280
113
|
g(this.prototype, "ignoreDataChanges", [localCopy('args.ignoreDataChanges', getConfigWithDefault('ignoreDataChanges', false))]);
|
|
281
114
|
}
|
|
282
115
|
#ignoreDataChanges = (i(this, "ignoreDataChanges"), void 0);
|
|
283
|
-
/**
|
|
284
|
-
* Use `@ignoreDataChanges` to prevent yeti table from observing changes to the underlying data and resorting or
|
|
285
|
-
* refiltering. Useful when doing inline editing in a table.
|
|
286
|
-
*
|
|
287
|
-
* Defaults to `false`.
|
|
288
|
-
*
|
|
289
|
-
* This is an initial render only value. Changing it after the table has been rendered will not be respected.
|
|
290
|
-
*
|
|
291
|
-
* @argument ignoreDataChanges
|
|
292
|
-
* @type {boolean}
|
|
293
|
-
*/
|
|
294
116
|
static {
|
|
295
117
|
g(this.prototype, "renderTableElement", [localCopy('args.renderTableElement', true)]);
|
|
296
118
|
}
|
|
297
119
|
#renderTableElement = (i(this, "renderTableElement"), void 0);
|
|
298
|
-
/**
|
|
299
|
-
* Use `@renderTableElement` to prevent yeti table from rendering the topmost <table> element.
|
|
300
|
-
* Might be useful for styling purposes (e.g if you want to place your pagination controls outside
|
|
301
|
-
* of your table element). If you set this to `false`, you should render the table element yourself
|
|
302
|
-
* using the yielded `<t.table>` component.
|
|
303
|
-
*
|
|
304
|
-
* Defaults to `true`.
|
|
305
|
-
*
|
|
306
|
-
* @argument renderTableElement
|
|
307
|
-
* @type {boolean}
|
|
308
|
-
*/
|
|
309
|
-
/**
|
|
310
|
-
* The `@isColumnVisible` argument can be used to initialize the column visibility in a programmatic way.
|
|
311
|
-
* For example, let's say you store the initial column visibility in local storage, then you can
|
|
312
|
-
* use this function to initialize the `visible` column of the specific column. The given function should
|
|
313
|
-
* return a boolean which will be assigned to the `visible` property of the column. An object representing
|
|
314
|
-
* the column is passed in. Sou can use column.prop and column.name to know which column your computed
|
|
315
|
-
* the visibility for.
|
|
316
|
-
*
|
|
317
|
-
* @argument isColumnVisible
|
|
318
|
-
* @type {Function}
|
|
319
|
-
*/ // If the theme is replaced, this will invalidate, but not if any prop under theme is changed
|
|
320
120
|
get mergedTheme() {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
return merge.all([
|
|
121
|
+
const configTheme = this.config.theme || {};
|
|
122
|
+
const localTheme = this.args.theme || {};
|
|
123
|
+
return merge.all([defaultTheme, configTheme, localTheme]);
|
|
324
124
|
}
|
|
325
125
|
static {
|
|
326
126
|
n(this.prototype, "mergedTheme", [cached]);
|
|
@@ -331,43 +131,38 @@ class YetiTable extends Component {
|
|
|
331
131
|
static {
|
|
332
132
|
n(this.prototype, "visibleColumns", [cached]);
|
|
333
133
|
}
|
|
334
|
-
config = getOwner(this)
|
|
134
|
+
config = getOwner(this)?.resolveRegistration?.('config:environment')?.['ember-yeti-table'] || {};
|
|
335
135
|
get normalizedTotalRows() {
|
|
336
136
|
if (!this.args.loadData) {
|
|
337
|
-
// sync scenario using @data
|
|
338
137
|
return this.processedDataRows?.length || 0;
|
|
339
138
|
} else {
|
|
340
|
-
// async scenario. @loadData is present.
|
|
341
139
|
if (this.totalRows === undefined) {
|
|
342
|
-
// @totalRows was not passed in. Use the latest returned data set length as a fallback
|
|
343
140
|
return this.previousResolvedData.length || 0;
|
|
344
141
|
} else {
|
|
345
|
-
// @totalRows was passed in.
|
|
346
142
|
return this.totalRows;
|
|
347
143
|
}
|
|
348
144
|
}
|
|
349
145
|
}
|
|
350
146
|
get normalizedRows() {
|
|
351
147
|
if (!this.args.loadData) {
|
|
352
|
-
// sync scenario using @data
|
|
353
148
|
return this.processedDataRows;
|
|
354
149
|
} else {
|
|
355
|
-
// async scenario. @loadData is present.
|
|
356
150
|
return this.processedData;
|
|
357
151
|
}
|
|
358
152
|
}
|
|
359
153
|
get paginationData() {
|
|
360
|
-
|
|
154
|
+
const pageSize = this.pageSize;
|
|
361
155
|
let pageNumber = this.pageNumber;
|
|
362
|
-
|
|
363
|
-
let isLastPage
|
|
156
|
+
const totalRows = this.normalizedTotalRows;
|
|
157
|
+
let isLastPage;
|
|
158
|
+
let totalPages;
|
|
364
159
|
if (totalRows) {
|
|
365
160
|
totalPages = Math.ceil(totalRows / pageSize);
|
|
366
161
|
pageNumber = Math.min(pageNumber, totalPages);
|
|
367
162
|
isLastPage = pageNumber === totalPages;
|
|
368
163
|
}
|
|
369
|
-
|
|
370
|
-
|
|
164
|
+
const isFirstPage = pageNumber === 1;
|
|
165
|
+
const pageStart = (pageNumber - 1) * pageSize + 1;
|
|
371
166
|
let pageEnd = pageStart + pageSize - 1;
|
|
372
167
|
if (totalRows) {
|
|
373
168
|
pageEnd = Math.min(pageEnd, totalRows);
|
|
@@ -389,44 +184,42 @@ class YetiTable extends Component {
|
|
|
389
184
|
});
|
|
390
185
|
}
|
|
391
186
|
#columns = (i(this, "columns"), void 0);
|
|
392
|
-
constructor(owner, args) {
|
|
393
|
-
super(...arguments);
|
|
394
|
-
console.log(owner, args);
|
|
395
|
-
if (typeof this.args.registerApi === 'function') {
|
|
396
|
-
// eslint-disable-next-line ember/no-runloop
|
|
397
|
-
scheduleOnce('actions', null, this.args.registerApi, this.publicApi);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
187
|
previousResolvedData = [];
|
|
188
|
+
static {
|
|
189
|
+
g(this.prototype, "processedData", [tracked]);
|
|
190
|
+
}
|
|
191
|
+
#processedData = (i(this, "processedData"), void 0);
|
|
192
|
+
static {
|
|
193
|
+
g(this.prototype, "processedDataRows", [tracked]);
|
|
194
|
+
}
|
|
195
|
+
#processedDataRows = (i(this, "processedDataRows"), void 0);
|
|
401
196
|
resolvedData = trackedFunction(this, async () => {
|
|
402
197
|
let data = this.args.data;
|
|
403
198
|
if (this.columns.length == 0) {
|
|
199
|
+
if (typeof this.args.loadData === 'function') {
|
|
200
|
+
return this.previousResolvedData;
|
|
201
|
+
}
|
|
404
202
|
return [];
|
|
405
203
|
}
|
|
406
|
-
// call loadData if exists
|
|
407
204
|
if (typeof this.args.loadData === 'function') {
|
|
408
|
-
|
|
205
|
+
const params = this.computeLoadDataParams();
|
|
409
206
|
try {
|
|
410
|
-
console.log("loadData", params);
|
|
411
207
|
data = await this.args.loadData(params);
|
|
412
|
-
console.log("loadData end");
|
|
413
208
|
} catch (e) {
|
|
414
209
|
console.log(e);
|
|
415
210
|
if (!didCancel(e)) {
|
|
416
|
-
// re-throw the non-cancellation error
|
|
417
211
|
throw e;
|
|
418
212
|
}
|
|
419
213
|
}
|
|
420
|
-
} else if (data
|
|
421
|
-
// resolve the data promise (either from the @loadData call or @data)
|
|
214
|
+
} else if (data && typeof data.then === 'function') {
|
|
422
215
|
data = await data;
|
|
423
216
|
}
|
|
424
217
|
if (this.isDestroyed) {
|
|
425
218
|
return;
|
|
426
219
|
}
|
|
427
|
-
|
|
428
|
-
this.previousResolvedData =
|
|
429
|
-
return
|
|
220
|
+
const resolved = data || [];
|
|
221
|
+
this.previousResolvedData = resolved;
|
|
222
|
+
return resolved;
|
|
430
223
|
});
|
|
431
224
|
static {
|
|
432
225
|
g(this.prototype, "latestData", [use], function () {
|
|
@@ -437,44 +230,39 @@ class YetiTable extends Component {
|
|
|
437
230
|
});
|
|
438
231
|
}
|
|
439
232
|
#latestData = (i(this, "latestData"), void 0);
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
233
|
+
constructor(owner, args) {
|
|
234
|
+
super(owner, args);
|
|
235
|
+
if (typeof this.args.registerApi === 'function') {
|
|
236
|
+
// eslint-disable-next-line ember/no-runloop
|
|
237
|
+
scheduleOnce('actions', null, this.args.registerApi, this.publicApi);
|
|
238
|
+
}
|
|
446
239
|
}
|
|
447
|
-
#processedDataRows = (i(this, "processedDataRows"), void 0);
|
|
448
240
|
processData(data) {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
let sortings = sortableColumns.map(c => ({
|
|
241
|
+
const columns = this.columns.filter(c => c.filterable && isPresent(c.prop));
|
|
242
|
+
const sortableColumns = this.columns.filter(c => !isEmpty(c.sort));
|
|
243
|
+
const sortings = sortableColumns.map(c => ({
|
|
453
244
|
prop: c.prop,
|
|
454
245
|
direction: c.sort
|
|
455
246
|
}));
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
data = filterData(data, columns, filter, filterFunction, filterUsing);
|
|
462
|
-
// Sort the data
|
|
247
|
+
const filterFunction = this.args.filterFunction;
|
|
248
|
+
const filterUsing = this.args.filterUsing;
|
|
249
|
+
const filter = this.filter;
|
|
250
|
+
const processTheData = () => {
|
|
251
|
+
let working = filterData(data, columns, filter, filterFunction, filterUsing);
|
|
463
252
|
if (sortings.length > 0) {
|
|
464
|
-
|
|
253
|
+
working = mergeSort(working, (itemA, itemB) => {
|
|
465
254
|
return this.sortFunction(itemA, itemB, sortings, this.compareFunction);
|
|
466
255
|
});
|
|
467
256
|
}
|
|
468
|
-
this.processedDataRows =
|
|
469
|
-
// Paginate the Data
|
|
257
|
+
this.processedDataRows = working;
|
|
470
258
|
if (this.pagination) {
|
|
471
|
-
|
|
259
|
+
const {
|
|
472
260
|
pageStart,
|
|
473
261
|
pageEnd
|
|
474
262
|
} = this.paginationData;
|
|
475
|
-
|
|
263
|
+
working = working.slice(pageStart - 1, pageEnd);
|
|
476
264
|
}
|
|
477
|
-
this.processedData =
|
|
265
|
+
this.processedData = working;
|
|
478
266
|
};
|
|
479
267
|
if (this.ignoreDataChanges) {
|
|
480
268
|
// eslint-disable-next-line ember/no-runloop
|
|
@@ -484,32 +272,33 @@ class YetiTable extends Component {
|
|
|
484
272
|
}
|
|
485
273
|
}
|
|
486
274
|
computeLoadDataParams() {
|
|
487
|
-
|
|
275
|
+
const params = {
|
|
276
|
+
sortData: this.columns.filter(c => !isEmpty(c.sort)).map(c => ({
|
|
277
|
+
prop: c.prop,
|
|
278
|
+
direction: c.sort
|
|
279
|
+
})),
|
|
280
|
+
filterData: {
|
|
281
|
+
filter: this.filter,
|
|
282
|
+
filterUsing: this.args.filterUsing,
|
|
283
|
+
columnFilters: this.columns.map(c => ({
|
|
284
|
+
prop: c.prop,
|
|
285
|
+
filter: c.filter,
|
|
286
|
+
filterUsing: c.filterUsing
|
|
287
|
+
}))
|
|
288
|
+
}
|
|
289
|
+
};
|
|
488
290
|
if (this.pagination) {
|
|
489
291
|
params.paginationData = this.paginationData;
|
|
490
292
|
}
|
|
491
|
-
params.sortData = this.columns.filter(c => !isEmpty(c.sort)).map(c => ({
|
|
492
|
-
prop: c.prop,
|
|
493
|
-
direction: c.sort
|
|
494
|
-
}));
|
|
495
|
-
params.filterData = {
|
|
496
|
-
filter: this.filter,
|
|
497
|
-
filterUsing: this.args.filterUsing,
|
|
498
|
-
columnFilters: this.columns.map(c => ({
|
|
499
|
-
prop: c.prop,
|
|
500
|
-
filter: c.filter,
|
|
501
|
-
filterUsing: c.filterUsing
|
|
502
|
-
}))
|
|
503
|
-
};
|
|
504
293
|
return params;
|
|
505
294
|
}
|
|
506
295
|
paginateData(data) {
|
|
507
296
|
if (this.pagination) {
|
|
508
|
-
|
|
297
|
+
const {
|
|
509
298
|
pageStart,
|
|
510
299
|
pageEnd
|
|
511
300
|
} = this.paginationData;
|
|
512
|
-
data = data.slice(pageStart - 1, pageEnd);
|
|
301
|
+
data = data.slice(pageStart - 1, pageEnd);
|
|
513
302
|
}
|
|
514
303
|
return data;
|
|
515
304
|
}
|
|
@@ -521,30 +310,22 @@ class YetiTable extends Component {
|
|
|
521
310
|
}
|
|
522
311
|
onColumnSort(column, e) {
|
|
523
312
|
if (column.isSorted) {
|
|
524
|
-
// if this column is already sorted, calculate the next
|
|
525
|
-
// sorting on the sequence.
|
|
526
313
|
let direction = column.sort;
|
|
527
|
-
|
|
314
|
+
const sortSequence = column.normalizedSortSequence;
|
|
528
315
|
direction = sortSequence[(sortSequence.indexOf(direction) + 1) % sortSequence.length];
|
|
529
316
|
if (direction === 'unsorted') {
|
|
530
317
|
direction = null;
|
|
531
318
|
}
|
|
532
319
|
column.sort = direction;
|
|
533
320
|
if (!e.shiftKey) {
|
|
534
|
-
|
|
535
|
-
let columns = this.columns.filter(c => c !== column);
|
|
321
|
+
const columns = this.columns.filter(c => c !== column);
|
|
536
322
|
columns.forEach(c => c.sort = null);
|
|
537
323
|
}
|
|
538
324
|
} else {
|
|
539
|
-
|
|
540
|
-
let direction = column.normalizedSortSequence[0];
|
|
541
|
-
// create new sorting
|
|
325
|
+
const direction = column.normalizedSortSequence[0];
|
|
542
326
|
column.sort = direction;
|
|
543
|
-
// normal click replaces all sortings with the new one
|
|
544
|
-
// shift click adds a new sorting to the existing ones
|
|
545
327
|
if (!e.shiftKey) {
|
|
546
|
-
|
|
547
|
-
let columns = this.columns.filter(c => c !== column);
|
|
328
|
+
const columns = this.columns.filter(c => c !== column);
|
|
548
329
|
columns.forEach(c => c.sort = null);
|
|
549
330
|
}
|
|
550
331
|
}
|
|
@@ -562,7 +343,7 @@ class YetiTable extends Component {
|
|
|
562
343
|
}
|
|
563
344
|
nextPage() {
|
|
564
345
|
if (this.pagination) {
|
|
565
|
-
|
|
346
|
+
const {
|
|
566
347
|
isLastPage
|
|
567
348
|
} = this.paginationData;
|
|
568
349
|
if (!isLastPage) {
|
|
@@ -575,7 +356,7 @@ class YetiTable extends Component {
|
|
|
575
356
|
}
|
|
576
357
|
goToPage(pageNumber) {
|
|
577
358
|
if (this.pagination) {
|
|
578
|
-
|
|
359
|
+
const {
|
|
579
360
|
totalPages
|
|
580
361
|
} = this.paginationData;
|
|
581
362
|
pageNumber = Math.max(pageNumber, 1);
|
|
@@ -590,7 +371,7 @@ class YetiTable extends Component {
|
|
|
590
371
|
}
|
|
591
372
|
changePageSize(pageSize) {
|
|
592
373
|
if (this.pagination) {
|
|
593
|
-
this.pageSize = parseInt(pageSize);
|
|
374
|
+
this.pageSize = parseInt(String(pageSize));
|
|
594
375
|
}
|
|
595
376
|
}
|
|
596
377
|
static {
|
|
@@ -612,6 +393,24 @@ class YetiTable extends Component {
|
|
|
612
393
|
this.columns = this.columns.filter(c => c !== column);
|
|
613
394
|
}
|
|
614
395
|
}
|
|
396
|
+
static {
|
|
397
|
+
setComponentTemplate(precompileTemplate("{{#let (hash table=(component Table theme=this.mergedTheme parent=this) header=(component HeaderComponent columns=this.columns onColumnClick=this.onColumnSort sortable=this.sortable sortSequence=this.sortSequence parent=this theme=this.mergedTheme) thead=(component THead columns=this.columns onColumnClick=this.onColumnSort sortable=this.sortable sortSequence=this.sortSequence theme=this.mergedTheme parent=this) body=(component Body data=this.processedData columns=this.columns theme=this.mergedTheme parent=this) tbody=(component TBody data=this.processedData columns=this.columns theme=this.mergedTheme parent=this) tfoot=(component TFoot columns=this.columns theme=this.mergedTheme parent=this) pagination=(component Pagination disabled=this.resolvedData.isPending theme=this.mergedTheme paginationData=this.paginationData paginationActions=(hash previousPage=this.previousPage nextPage=this.nextPage goToPage=this.goToPage changePageSize=this.changePageSize)) actions=this.publicApi paginationData=this.paginationData isLoading=this.resolvedData.isPending columns=this.columns visibleColumns=this.visibleColumns rows=this.normalizedRows totalRows=this.normalizedTotalRows visibleRows=this.processedData theme=this.mergedTheme) as |api|}}\n {{UpdateTotalRows @totalRows context=this}}\n {{UpdateFilter @filter context=this}}\n {{ProcessedData loadData=@loadData context=this}}\n\n {{#if this.renderTableElement}}\n <Table @theme={{this.mergedTheme}} @parent={{this}} ...attributes>\n {{yield api}}\n </Table>\n {{else}}\n {{yield api}}\n {{/if}}\n\n{{/let}}", {
|
|
398
|
+
strictMode: true,
|
|
399
|
+
scope: () => ({
|
|
400
|
+
hash,
|
|
401
|
+
Table,
|
|
402
|
+
HeaderComponent: Header,
|
|
403
|
+
THead: THeadComponent,
|
|
404
|
+
Body,
|
|
405
|
+
TBody,
|
|
406
|
+
TFoot,
|
|
407
|
+
Pagination,
|
|
408
|
+
UpdateTotalRows,
|
|
409
|
+
UpdateFilter,
|
|
410
|
+
ProcessedData
|
|
411
|
+
})
|
|
412
|
+
}), this);
|
|
413
|
+
}
|
|
615
414
|
}
|
|
616
415
|
|
|
617
416
|
export { YetiTable as default };
|