- @universal-ember/table 3.6.2 (patch)
@universal-ember/table- #164 Fix release (@NullVoxPopuli)
- Other
- #162 Fix release (@NullVoxPopuli)
@universal-ember/table 3.6.1 (patch)
@universal-ember/table,test-app
docs-app
@universal-ember/table 3.6.0 (minor)
@universal-ember/table,test-app
docs-appdocs-api,docs-app
@universal-ember/table 3.5.0 (minor)
@universal-ember/table,test-app
@universal-ember/table 3.4.3 (patch)
docs-app- #147 Update vertical collection (@NullVoxPopuli)
@universal-ember/table 3.4.2 (patch)
@universal-ember/table 3.4.1 (patch)
- #133 docs(contributor): contributors readme action update (@github-actions[bot])
@universal-ember/table 3.4.0 (minor)
docs-app,@universal-ember/table,test-app
@universal-ember/table 3.3.0 (minor)
@universal-ember/tabledocs-app,@universal-ember/table,test-app
@universal-ember/table
- #112 Add thank you to the contributors (@NullVoxPopuli)
- #113 docs(contributor): contributors readme action update (@github-actions[bot])
@universal-ember/table 3.2.0 (minor)
docs-app- #109 chore: Fix file name spelling (@jayden-leuciuc)
- #105 docs: Single row selection link (@MichalBryxi)
- Jayden Leuciuc (@jayden-leuciuc)
- Michal Bryxí (@MichalBryxi)
- @johanrd
@universal-ember/table 3.1.1 (patch)
@universal-ember/table 3.1.0 (minor)
docs-app,@universal-ember/table,test-app
@universal-ember/table 3.0.4 (patch)
docs-app
@universal-ember/table 3.0.3 (patch)
@universal-ember/table- #66 Include declarations (@NullVoxPopuli)
@universal-ember/table 3.0.2 (patch)
docs-app,@universal-ember/table,test-app- #63 Upgrade addon-dev to fix declaration output (@NullVoxPopuli)
- #64 Fix docs deploy (@NullVoxPopuli)
@universal-ember/table 3.0.1 (patch)
@universal-ember/table- #62 Fix publish (@NullVoxPopuli)
- Other
docs-app- #55 Fix api docs (typedocs) (@NullVoxPopuli)
@universal-ember/table 3.0.0 (major)
- Other
- #47 Drop support for TS 5.4 and lower, add support for TS 5.8 (@NullVoxPopuli)
docs-app,@universal-ember/table,test-app- #15 Remove support for @types/ember*, now only supporting the official types from ember-source (@NullVoxPopuli)
docs-app,@universal-ember/table,test-app- #22 Upgrade to ember-resources v7 (@NullVoxPopuli)
docs-api,docs-app,@universal-ember/table,test-app- #12 Rename ember-headless-table to @universal-ember/table (@NullVoxPopuli)
docs-app,@universal-ember/table,test-app- #42 Fix types (@NullVoxPopuli)
docs-app- #18 Resolve vuln: upgrade dompurify to v3 (@NullVoxPopuli)
docs-api,docs-app,test-app- #32 Use Vite (docs, tests) / Rewrite the docs / document things in terms of gjs and gts (@NullVoxPopuli)
docs-app,test-app- #52 Fix ember-try config (@NullVoxPopuli)
- #16 Fix the repository field in package.json (@NullVoxPopuli)
- #11 Upgrade linting (ESLint 9, Prettier 3, etc) (@NullVoxPopuli)
- #9 Replace internal sync-pnpm with the extracted pnpm-sync-dependencies-meta-injected (@NullVoxPopuli)
- #5 Upgrade local dev node from 14/16 to 22+ (@NullVoxPopuli)
- Other
- #49 Update Cloudflare Deploy (@NullVoxPopuli)
- #38 Update artifact actions (@NullVoxPopuli)
- #33 Use stricter .npmrc settings (@NullVoxPopuli)
- #28 Use a more targeted patch for github-changelog which prevents referencing the old repo (@NullVoxPopuli)
- #26 Drop support for TS < 5.1, test against TS 5.1+ (@NullVoxPopuli)
- #24 Use shared renovate config from NullVoxPopuli/renovate (@NullVoxPopuli)
- #23 Fix patch for github-changelog (@NullVoxPopuli)
- #21 Update github-changelog patch (@NullVoxPopuli)
- #20 Upgrade turbo (@NullVoxPopuli)
- #14 Don't use node18 in release-plan (@NullVoxPopuli)
- #10 Update CI.yml, remove custom pnpm action (@NullVoxPopuli)
- #7 Add release-plan (@NullVoxPopuli)
- #6 Set pnpm to v10 (@NullVoxPopuli)
docs-api,docs-app,@universal-ember/table,test-app- #44 Get test-app's tests working and passing again (with Vite) (@NullVoxPopuli)
- #40 Prepare for vite migration (@NullVoxPopuli)
- #13 Modernize build (upgrade rollup, TS, addon-dev, use extensions in imports) (@NullVoxPopuli)
@universal-ember/table- #45 Remove type aliases (@NullVoxPopuli)
- #36 Upgrade addon-dev (@NullVoxPopuli)
- #19 Fix URL change for Release (@NullVoxPopuli)
test-app- #43 lint:fix test-app (@NullVoxPopuli)
- #27 Test against 3.28+, and first and last LTS of each major thereafter (@NullVoxPopuli)
- #25 Only test against embroider (broccoli builds don't matter for this library) (@NullVoxPopuli)
docs-app,@universal-ember/table,test-app- #41 run prettier on everything (@NullVoxPopuli)
- #37 Update lint dependencies (@NullVoxPopuli)
- #35 Update prettier config (@NullVoxPopuli)
- #34 Upgrade prettier (so that CSS in template tag / gjs / gts is supported) (@NullVoxPopuli)
- #17 Update the author and remove directories key (@NullVoxPopuli)
docs-app- #39 Remove references to docfy and crowdstrike (@NullVoxPopuli)
docs-api- #29 Upgraed typedoc (@NullVoxPopuli)
- #236
3a737e9Thanks @NullVoxPopuli! - Use more permissive peer ranges for@ember/test-helpers,@ember/test-waiters, andember-source.
- #233
4dbf668Thanks @joelamb! - Fixes column resize and preference save sequencing to ensure that the functions always run in the correct order.
-
#226
6c58dfdThanks @nicolechung! - Bugfix: the plugin for resize was not checking if the table was destroyed first.This fixes that so the observer is not listening for a removed table, which was causing an error in the preferences (since it was trying to set preferences for a table which is not on screen)
- #219
4172870Thanks @joelamb! - Column widths are saved and reset in a single call to the preferences service, rather than on a per column basis, for improved UI performance
- #211
0a9415cThanks @joelamb! - Persists resized column widths to preferences. Width values are saved as strings after resizing. If present in preferences, width value will be restored to the table, overriding any initial options passed in.
- #214
58b2866Thanks @joelamb! - Refactor to bulk reset column visibility preferences in a single call to the preferences service
-
#176
f3435c3Thanks @NullVoxPopuli! - In prepr for supporting Glint 1.0, ember-headless-table no longer will support TypeScript < 4.8.Additionally, the support policy is changing from a minimum version, to a rolling window policy, as described in https://semver-ts.org.
The current and prior two TypeScript versions will be supported, giving a rolling window of 3 TypeScript versions.
-
#175
4681ecaThanks @NullVoxPopuli! - Officially support Glint 1.0+ -
#200
ced9ca3Thanks @joelamb! - fix: save table column order on setAll
- #157
57091d0Thanks @nicolechung! - Added toStyle helper in column-resizing plugin > helper. This should fix when aminWidthis passed in the column config and not getting converted tomin-widthfor the style attribute string.
-
#148
9b9fbe1Thanks @NullVoxPopuli! - Support ember-source@4.12. Test ember-source@v5 to the allowed peer versions for headless-table -
#149
8b8f170Thanks @nicolechung! - Bugfix, change minWidth to min-width for the Sticky columns plugin
-
#118
c02d49dThanks @NullVoxPopuli! - Address an issue where instances of plugins would be held on to after a Table is destroyed.This caused a memory leak due how plugins, and their associated metadata, held on to Table instances, which in turn, held on to the owner / container.
This was caused by the utility methods in
ember-headless-table/plugins,preferencesmetaoptions
Because data was stored in (Weak)Maps in module-space. This alone isn't a problem, but they were never cleaned up when the table was destroyed.
Cleanup of these objects could have occured via
associateDestroyableChildandregisterDestructorfrom@ember/destroyable, but it was easier to instead have this happen automatically via hosting the data needed for the "plugins utils" on the table itself. Since each plugin util requires "some instance of something", be that a row, column, or table, there is a direct path to the table, and therefor a direct way to access memory-scoped (Weak)Maps.
- #123
972749bThanks @NullVoxPopuli! - Fix an issue where columns using the ColumnResize plugin with the option isResizing set to false, the plugin could not recognize the column as having resizing turned off"
-
#121
2175782Thanks @NullVoxPopuli! - Add new util for the resizing plugin to help styles cells in non-header rows in non-tables (such as grids).To use it,
import { styleStringFor } from "ember-headless-table/plugins/column-resizing"; // ... // rows.gjs <template> {{#each @table.rows as |row|}} <div role="row"> {{#each @table.columns as |column|}} <div role="cell" style={{styleStringFor column}} >{{column.getValueForRow row}}</div> {{/each}} </div> {{/each}} </template>
-
#110
a9c19c7Thanks @NullVoxPopuli! - Add new "query" util:hasPlugin, allowing consumers of the headlessTable to ask if a plugin is active and get a boolean response.Example:
import { headlessTable } from "ember-headless-table"; import { hasPlugin } from "ember-headless-table/plugins"; import { DataSorting } from "ember-headless-table/plugins/data-sorting"; // ... ✂️ ... let table = headlessTable(this, { columns: () => [], data: () => [], plugins: [DataSorting], }); hasPlugin(table, DataSorting); // => true
-
#108
40649c9Thanks @NullVoxPopuli! -deserializeSortsnow will gracefully return an empty array upon receiving empty input.Example:
import { deserializeSorts } from "ember-headless-table"; deserializeSorts(""); // => []
Previously, an error would be reported:
No key found for input: `` using `.` as a separatorwhich wasn't all that helpful.
When using the data-sorting plugin with this util, it is perfectly safe to "deserialize sorts" to an empty array and have that empty array be equivelant to no sorting being applied at all.
-
#94
310a6e0Thanks @NullVoxPopuli! - An alternative, yet more verbose, option is now available for the sticky / pinnable columns plugin.This is, in part, due to waiting on RFC#883: add new timing capabilities to modifier manager.
But also, as an escape hatch for performance sensitive situations where one would want to avoid altering any style attributes during render (as is one of the primary use cases of RFC#883) as this causes repaint calculations and degraded performance in the browser.
This new technique for the sticky/pinnable colums plugin allows you to set the
styleattribute so that the browser can calculate layout in a single pass.To opt in to this, two things must be done:
-
invoke the
styleStringForhelper in the template, and set the result to thestyleattribute for thethandtdcells.import { styleStringFor } from "ember-headless-table/plugins/sticky-columns"; // ... <template> <div class="h-full overflow-auto"> <table> <thead> <tr class="relative"> {{#each @table.columns as |column|}} <th style="{{styleStringFor column}}"> {{column.name}} </th> {{/each}} </tr> </thead> <tbody> {{#each @table.rows as |row|}} <tr class="relative"> {{#each @table.columns as |column|}} <td style="{{styleStringFor column}}"> {{column.getValueForRow row}} </td> {{/each}} </tr> {{/each}} </tbody> </table> </div> </template>
-
when configuring the
StickyColumnsplugin inheadlessTable, configure the theworkaroundForModifierTimingUpdateRFC883flag totrue. This allows td and th cells to have modifiers without causing repaints due to style changes caused by the sticky columns plugin.
class Example { table = headlessTable(this, { columns: () => [ // ... ], // ... plugins: [ StickyColumns.with(() => ({ workaroundForModifierTimingUpdateRFC883: true, })), ], }); }
-
-
#81
57c22d4Thanks @NullVoxPopuli! - Prevent hard-to-debug issues that occur with incorrect column configs. One such way problems can occur is when thekeyproperty is duplicated for multiple column configs.This is now eagerly prevented via dev-time Error. All the column config validity checking code is removed in production builds via
@embroider/macrosmacroCondition(isDevelopingApp()).
-
#58
f885ebbThanks @NullVoxPopuli! - New Metadata plugin, for allowing arbitrary data to be stored for each column as well as the whole table. This can be useful eliminating prop-drilling in a UI Table implementation consuming the headlessTable.For example, setting up the table can be done like:
import { headlessTable } from "ember-headless-table"; class Example { /* ... */ table = headlessTable(this, { columns: () => [ { name: "A", key: "A" }, { name: "B", key: "B", pluginOptions: [ Metadata.forColumn(() => ({ isBulkSelectable: false, })), ], }, { name: "D", key: "D", pluginOptions: [Metadata.forColumn(() => ({ isRad: this.dRed }))], }, ], data: () => DATA, plugins: [ Metadata.with(() => ({ onBulkSelectionChange: (...args) => this.doSomething(...args), })), ], }); }
To allow "bulk selection" behaviors to be integrated into how the Table is rendered -- which for fancier tables, my span multiple components.
For example: rows may be their own component
// Two helpers are provided for accessing your Metadata import { forColumn /*, forTable */, } from "ember-headless-table/plugins/metadata"; const isBulkSelectable = (column) => forColumn(column, "isBulkSelectable"); export const Row = <template> <tr> {{#each @table.columns as |column|}} {{#if (isBulkSelectable column)}} ... render some checkbox UI ... {{else}} <td> {{column.getValueForRow @datum}} </td> {{/if}} {{/each}} </tr> </template>;
-
#66
3075a5cThanks @NullVoxPopuli! - Add a new API for the column-reordering plugin that allows for managing column order independently of the table's column order, for example, in a configuration UI / preview, one may want to see how their changes will look before applying them to the table.To use this new API, there are two relevant imports:
import { ColumnOrder, setColumnOrder, } from "ember-headless-table/plugins/column-reordering";
To manage the "preview column order", you'll want to instantiate the
ColumnOrderclass, and then once your changes are done, callsetColumnOrderand pass both the table and theColumnOrderinstance:class Demo { @tracked pendingColumnOrder; changeColumnOrder = () => { this.pendingColumnOrder = new ColumnOrder({ columns: () => this.columns, }); }; handleReconfigure = () => { setColumnOrder(this.table, this.pendingColumnOrder); this.pendingColumnOrder = null; }; }
In this example, when working with
this.pendingColumnOrder, you may use familiar "moveLeft" and "moveRight" behaviors,
-
#63
ecb68ffThanks @NullVoxPopuli! - Previously, ember-headless-table's releases were managed by semantic-release. Now, they are managed by changesets, which is a bit more manual, but has far better monorepo support and allows catering to humans when it comes to changelogs. -
#61
0356997Thanks @NullVoxPopuli! - Fixes the issue reported in CrowdStrike/ember-headless-table#60 Where the column reordering and visibility plugins were not integrating well together. In short, moving column, then hiding that same column, then moving a column "over the gap" between the columns resulted in all column reordering no longer working. Using both of the plugins together should now work as intuitively expected.
- plugin, resizing: add helper for knowing if a column has a resize handle (f525f50)
1.0.1 (2022-11-06)
- deps: update dependency highlightjs-glimmer to v2 (0881e12)
- column-reordering: reordering reactivity restored (bf8153c)
- columnReordering: rework how order state is maintained (39ae71e)
- columnResizing: fix the resize-handle modifier (e17c232)
- columnResizing: resizeHandle modifier needs to be an ember-modifier (90f7577)
- columnVisibility: bug where default hidden could not be unhidden (e6b7239)
- columnVisibility: work around a bug with tracked-built-ins' delete not being reactive (ce62498)
- columnVisibilty: bug where default / preferences clearing calculation was incorrect (e3e8480)
- deps: update dependency @ember/test-waiters to ^3.0.2 (dcb45d1)
- resizing: resizing depends on column order, not just visibility (6ac95ef)
- columnReordering: preferences are now persisted and read from (96e13c1)
- initial implementation (0fc2cbc)
- plugin: implement row selection plugin (e46ce50)
- plugins: simplify working with columns among plugins (48ef0bb)
- plugin: sticky columns (b9b8bfa)
- table: support @use (6561c30)
- brand new addon
- copied code from internal project
- successful build
This is an incremental step, as there is some dev work yet to complete
- finish plugins work
- rename
@crowdstrike/ember-headless-tabletoember-headless-table - Button up C.I.
- Create docs site with lots of examples, how to write plugins, etc