Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7c938b1
Align dummy app runtime on ember-source 4.12
phndiaye Oct 28, 2026
63b33a6
Use history location in the dummy app
phndiaye Oct 28, 2026
9b2dea1
Bump ember-page-title to ^8.0.0
phndiaye Oct 29, 2026
90f70f0
Run ember-cli-update --to 5.12
phndiaye Oct 29, 2026
a16eb9a
Keep the 5.12 runtime and test toolchain from the blueprint
phndiaye Oct 29, 2026
5714471
Use Ember's native types instead of DefinitelyTyped
phndiaye Oct 30, 2026
0f0231e
Resolve oss-components to its TypeScript sources again
phndiaye Oct 30, 2026
4840dd9
Pin oss-components to its native-types commit until it is released
phndiaye Oct 30, 2026
4657c7f
Build the declarations when installed from a git commit
phndiaye Oct 30, 2026
ca4e42c
Import service instead of inject from @ember/service
phndiaye Nov 2, 2026
a510a0b
Cover the classic hyper-table template actions with integration tests
phndiaye Nov 2, 2026
608f716
Replace the action helper and modifier with bound methods and on
phndiaye Nov 2, 2026
f11d9a5
Cover the table state arrays and the list renderer before dropping th…
phndiaye Nov 2, 2026
8f46ee8
Replace the Ember array extensions with native array code in the clas…
phndiaye Nov 2, 2026
7537434
Move to Ember 6.12.1 and ember-cli 6.12.0
phndiaye Nov 2, 2026
61ed6ae
Bump ember-cli-typescript to ^5.3.0
phndiaye Nov 3, 2026
20df9a5
linter fix
phndiaye Nov 5, 2026
40598dd
ci: remove ember-next tests
phndiaye Nov 5, 2026
1dd60b4
Depend on oss-components 4.0.0-beta.2
phndiaye Nov 6, 2026
55a9ed7
Merge master into the Ember 6.12 upgrade
phndiaye Nov 6, 2026
bfe07fc
Depend on oss-components 4.0.0-beta.3 and publish under the beta tag
phndiaye Nov 6, 2026
bd95aed
Skip the upfluence-web bump for prerelease tags
phndiaye Nov 6, 2026
253a731
4.0.0-beta.0
phndiaye Nov 6, 2026
3fc817e
build: require Node 24
phndiaye Nov 12, 2026
72d230b
ci: read the Node version from vars.NODE_VERSION
phndiaye Nov 12, 2026
d3e8661
Merge pull request #299 from upfluence/pn/ember-6-12-green
phndiaye Nov 12, 2026
5814474
[skip ci] Refresh the README and add the repository logo
phndiaye Nov 12, 2026
b6969f1
[skip ci] Remove the dead CONTRIBUTING.md link from the README
phndiaye Nov 13, 2026
60b6e5f
[skip ci] Require the 6.12 majors of internal peers and ember-source …
phndiaye Nov 13, 2026
30d1d00
Use the stable 6.12 majors of internal packages
phndiaye Nov 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 2 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
pull_request:

env:
NODE_VERSION: 20
NODE_VERSION: ${{ vars.NODE_VERSION }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FONTAWESOME_NPM_AUTH_TOKEN: ${{ secrets.FONTAWESOME_NPM_AUTH_TOKEN }}

Expand Down Expand Up @@ -48,8 +48,6 @@ jobs:
include:
- name: current
command: pnpm test:ember
- name: next
command: pnpm ember try:one ember-4.12
steps:
- uses: webfactory/ssh-agent@v0.5.0
with:
Expand Down Expand Up @@ -95,6 +93,7 @@ jobs:
id: pkg_version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/v}
- name: Trigger upfluence-web/deploy
if: ${{ !contains(github.ref, '-') }}
uses: benc-uk/workflow-dispatch@v1
with:
repo: upfluence/upfluence-web
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sonarqube-sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches:
- master
env:
NODE_VERSION: '20'
NODE_VERSION: ${{ vars.NODE_VERSION }}
GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
FONTAWESOME_NPM_AUTH_TOKEN: ${{ secrets.FONTAWESOME_NPM_AUTH_TOKEN }}

Expand Down
37 changes: 25 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
# Hypertable
<div align="center">
<img src=".github/assets/logo.svg" width="96" height="96" alt="">
<h1>@upfluence/hypertable</h1>
<p>Ember.js library to simplify the creation and management of complex data tables.</p>

[![ci](https://github.com/upfluence/hypertable/actions/workflows/ci.yml/badge.svg)](https://github.com/upfluence/hypertable/actions/workflows/ci.yml)
[![Coverage](https://sonarqube.upfluence.co/api/project_badges/measure?project=hypertable&metric=coverage&token=sqb_670d7e3c30119fb218ef8811f41648ba81213618)](https://sonarqube.upfluence.co/dashboard?id=hypertable)
[![Maintainability Rating](https://sonarqube.upfluence.co/api/project_badges/measure?project=hypertable&metric=sqale_rating&token=sqb_670d7e3c30119fb218ef8811f41648ba81213618)](https://sonarqube.upfluence.co/dashboard?id=hypertable)
[![Quality Gate Status](https://sonarqube.upfluence.co/api/project_badges/measure?project=hypertable&metric=alert_status&token=sqb_670d7e3c30119fb218ef8811f41648ba81213618)](https://sonarqube.upfluence.co/dashboard?id=hypertable)
[![Code Smells](https://sonarqube.upfluence.co/api/project_badges/measure?project=hypertable&metric=code_smells&token=sqb_670d7e3c30119fb218ef8811f41648ba81213618)](https://sonarqube.upfluence.co/dashboard?id=hypertable)

</div>

To follow the early life of this project, see
[oss-components#pn-flexbox-tables](https://github.com/upfluence/oss-components/pull/54/files)
Expand All @@ -23,14 +34,18 @@ The goal is to provide a consistent and maintainable way to build tables across

## Compatibility

- Ember.js v3.24 or above
- Ember CLI v3.24 or above
- Node.js v12 or above
- Ember.js v6.12 or above
- Node.js v24 or above
- pnpm 10

Required peer dependency: `ember-source` `^6.12.0`.

Apps on Ember.js below 6.12 should stay on `3.x`.

## Installation

```
pnpm install @upfluence/hypertable
pnpm add @upfluence/hypertable
```

Additionally, the following registry should be added to the `.npmrc` file:
Expand Down Expand Up @@ -627,7 +642,7 @@ this.handler.on('columns-loaded', () => {

- `git clone <repository-url>`
- `cd hypertable`
- `pnpm install`
- `make install`

### Linting

Expand All @@ -637,17 +652,15 @@ this.handler.on('columns-loaded', () => {

### Running tests

- `ember test` – Runs the test suite on the current Ember version
- `ember test --server` – Runs the test suite in "watch mode"
- `ember try:each` – Runs the test suite against multiple Ember versions
- `pnpm test:ember` – Runs the test suite on the current Ember version
- `make testserver` – Runs the test suite in "watch mode"
- `pnpm test:ember-compatibility` – Runs the test suite against multiple Ember versions

### Running the dummy application

- `ember serve`
- `pnpm start`
- Visit the dummy application at [http://localhost:4200](http://localhost:4200).

See the [Contributing](CONTRIBUTING.md) guide for details.

### License

This project is licensed under the [MIT License](LICENSE.md).
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { action } from '@ember/object';
import { inject as service } from '@ember/service';
import { service } from '@ember/service';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { action } from '@ember/object';
import { debounce } from '@ember/runloop';
import { inject as service } from '@ember/service';
import { service } from '@ember/service';
import { isEmpty } from '@ember/utils';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
Expand Down
9 changes: 4 additions & 5 deletions addon/components/hyper-table-v2/manage-columns.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { A } from '@ember/array';
import { set, action } from '@ember/object';
import { later, next } from '@ember/runloop';
import { isEmpty } from '@ember/utils';
import { compare, isEmpty } from '@ember/utils';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';

Expand Down Expand Up @@ -37,15 +36,15 @@ export default class HyperTableV2ManageColumns extends Component<HyperTableV2Man
}

get orderedFilteredClusters(): Map<string, ManagedColumn[]> {
const fields = A(
(this.args.handler.columnDefinitions || []).filter((columnDefinition) => {
const fields = (this.args.handler.columnDefinitions || [])
.filter((columnDefinition) => {
const search = (this.searchColumnDefinitionKeyword || '').toLowerCase();
const hasSearched =
!this.searchColumnDefinitionKeyword || columnDefinition.name.toLowerCase().indexOf(search) >= 0;
const hasActiveGroup = !this.activeColumnCategory || columnDefinition.category === this.activeColumnCategory;
return hasActiveGroup && hasSearched;
})
).sortBy('name');
.sort((a, b) => compare(a.name, b.name));

return this.groupByClusteringKey(fields);
}
Expand Down
2 changes: 1 addition & 1 deletion addon/components/hyper-table-v2/search.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { action } from '@ember/object';
import { debounce } from '@ember/runloop';
import { inject as service } from '@ember/service';
import { service } from '@ember/service';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';

Expand Down
2 changes: 1 addition & 1 deletion addon/components/hyper-table-v2/summary.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { assert } from '@ember/debug';
import { inject as service } from '@ember/service';
import { service } from '@ember/service';
import Component from '@glimmer/component';

import type { IntlService } from 'ember-intl';
Expand Down
2 changes: 1 addition & 1 deletion addon/components/hyper-table/cell-renderers/link.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
@square={{true}}
class={{if this.isCopied "success-tooltip"}}
{{enable-tooltip title=(if this.isCopied "Copied" "Copy") placement="top"}}
{{action "copy" bubbles=false}}
{{on "click" this.copy}}
/>
{{/if}}
15 changes: 8 additions & 7 deletions addon/components/hyper-table/cell-renderers/link.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Component from '@ember/component';
import { action } from '@ember/object';
import { debounce } from '@ember/runloop';

import CellRendererMixin from '@upfluence/hypertable/mixins/cell-renderer';
Expand All @@ -10,13 +11,13 @@ export default Component.extend(CellRendererMixin, {
this.set('isCopied', false);
},

actions: {
copy() {
this.set('isCopied', true);
copy: action(function (event) {
event.stopPropagation();

navigator.clipboard.writeText(this.value);
this.set('isCopied', true);

debounce(this, this.endCopy, 2500);
}
}
navigator.clipboard.writeText(this.value);

debounce(this, this.endCopy, 2500);
})
});
8 changes: 4 additions & 4 deletions addon/components/hyper-table/cell-renderers/list.hbs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{{#if this.emptyValue}}
—
{{else}}
<div class="list-container" {{action "toggleList" bubbles=false}}>
{{#if this.value.firstObject.name}}
<div class="list-container" {{on "click" this.toggleList}}>
{{#if this.firstItem.name}}
<div>
{{this.value.firstObject.name}}
{{this.firstItem.name}}
</div>
{{#if (eq this.manager.tetherOn this.elementId)}}
<div class="expandable-list">
{{#each this.value as |item|}}
<div
class="expandable-list__item
{{if item.locked 'expandable-list__item-disabled '}}fx-row fx-xalign-center fx-gap-px-6"
{{on "click" (action "goToUrl" (concat this.url item.id) item.locked bubbles=false)}}
{{on "click" (fn this.goToUrl (concat this.url item.id) item.locked)}}
>
{{item.name}}
{{#if item.locked}}
Expand Down
80 changes: 42 additions & 38 deletions addon/components/hyper-table/cell-renderers/list.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Component from '@ember/component';
import { computed } from '@ember/object';
import { action, computed } from '@ember/object';

import CellRendererMixin from '@upfluence/hypertable/mixins/cell-renderer';

Expand All @@ -10,46 +10,50 @@ export default Component.extend(CellRendererMixin, {

isEditing: false,

formattedList: computed('value', 'value.firstObject.name', function () {
if (this.value.firstObject.name) {
return this.value.mapBy('name').join('<br>');
firstItem: computed('value.[]', function () {
return this.value.slice()[0];
}),

formattedList: computed('value.[]', 'firstItem.name', function () {
if (this.firstItem.name) {
return this.value.map((item) => item.name).join('<br>');
}
return this.value.slice().join('<br>');
}),

actions: {
goToUrl(url, locked, event) {
if (!this.url || locked) {
event.preventDefault();
event.stopPropagation();
return;
}

window.open(url, '_blank');
},

toggleList() {
if (this.manager.tetherOn !== this.elementId) {
this.manager.destroyTetherInstance();
}

this.manager.triggerTetherContainer(
this.elementId,
'expandable-list',
{
element: `#${this.elementId} .expandable-list`,
target: `#${this.elementId} .list-container`,
attachment: 'top center',
targetAttachment: 'bottom center',
constraints: [
{
to: 'scrollParent'
}
]
},
false,
document.querySelector(`#${this.elementId} .list-container`).offsetWidth
);
goToUrl: action(function (url, locked, event) {
if (!this.url || locked) {
event.preventDefault();
event.stopPropagation();
return;
}

window.open(url, '_blank');
}),

toggleList: action(function (event) {
event.stopPropagation();

if (this.manager.tetherOn !== this.elementId) {
this.manager.destroyTetherInstance();
}
}

this.manager.triggerTetherContainer(
this.elementId,
'expandable-list',
{
element: `#${this.elementId} .expandable-list`,
target: `#${this.elementId} .list-container`,
attachment: 'top center',
targetAttachment: 'bottom center',
constraints: [
{
to: 'scrollParent'
}
]
},
false,
document.querySelector(`#${this.elementId} .list-container`).offsetWidth
);
})
});
10 changes: 5 additions & 5 deletions addon/components/hyper-table/cell-renderers/numeric.hbs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{{#if (and this.emptyValue (or (not this.editStatus.status) this.isSuccess))}}
{{#if this.isUpsertable}}
<span {{action "toggleEditing"}}>
<span {{on "click" this.startEditing}}>
{{or this.column.field.emptyPlaceholder "Add value"}}
</span>
{{else}}
Expand All @@ -12,11 +12,11 @@
<div class={{if this.isError "is-invalid"}}>
<Input
@type="number"
@insert-newline={{action "toggleEditing" this.editableValue}}
@insert-newline={{fn this.toggleEditing this.editableValue}}
@value={{this.value}}
aria-label={{or this.column.field.name "Value"}}
class="editing-input__field form-control"
{{on "focusout" (action "toggleEditing" this.editableValue)}}
{{on "focusout" (fn this.toggleEditing this.editableValue)}}
/>
</div>
{{else}}
Expand All @@ -33,10 +33,10 @@
{{#if this.isSaving}}
<LoadingState />
{{else if this.isSuccess}}
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{action "toggleEditing"}} />
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{on "click" this.startEditing}} />
<OSS::Icon @icon="fa-check" class="font-size-lg font-color-success-500" />
{{else if (not this.editStatus.status)}}
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{action "toggleEditing"}} />
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{on "click" this.startEditing}} />
{{/if}}
</div>
{{/if}}
10 changes: 5 additions & 5 deletions addon/components/hyper-table/cell-renderers/text.hbs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{{#if this.isUpsertable}}
<span {{action "toggleEditing"}}>
<span {{on "click" this.startEditing}}>
{{or this.column.field.emptyPlaceholder "Add value"}}
</span>
{{else}}
Expand All @@ -14,10 +14,10 @@
<Input
@type="text"
@value={{this.editableValue}}
@insert-newline={{action "toggleEditing" this.editableValue}}
@insert-newline={{fn this.toggleEditing this.editableValue}}
aria-label={{or this.column.field.name "Value"}}
class="editing-input__field form-control upf-input"
{{on "focusout" (action "toggleEditing" this.editableValue)}}
{{on "focusout" (fn this.toggleEditing this.editableValue)}}
/>
</div>
<div class="text-value" {{enable-tooltip title=this.editableValue placement="bottom"}}>
Expand All @@ -31,10 +31,10 @@
{{#if this.isSaving}}
<LoadingState />
{{else if this.isSuccess}}
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{action "toggleEditing"}} />
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{on "click" this.startEditing}} />
<OSS::Icon @icon="fa-check" class="font-size-lg font-color-success-500" />
{{else if (not this.editStatus.status)}}
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{action "toggleEditing"}} />
<OSS::Icon @icon="fa-pencil" class="cell-edition delayed" {{on "click" this.startEditing}} />
{{/if}}
</div>
{{/if}}
Loading
Loading