Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
1fc6065
feat(formulas): create new Formula Editor plugin
ghiscoding Aug 6, 2026
e366fb1
chore(deps): update excel-builder-vanilla with latest fixes
ghiscoding Aug 7, 2026
a9b454b
fix(deps): update all non-major dependencies to ^5.2.3 (#2713)
renovate-bot Aug 7, 2026
3a97372
docs: add more generic comment about min age exclusions
ghiscoding Aug 7, 2026
75842a3
chore(deps): update dependency eslint-plugin-cypress to v7 (#2715)
renovate-bot Aug 8, 2026
6da3880
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 8, 2026
1edcd29
chore: fix few styling issues & rename to Example47
ghiscoding Aug 8, 2026
798fa6c
chore: rename Cypress test to match example47
ghiscoding Aug 8, 2026
e8ca333
feat: build the footer row lazily when createFooterRow is enabled at …
ghiscoding Aug 10, 2026
be0547b
fix: canonicalize the frozen-row boundary across all comparison sites…
ghiscoding Aug 10, 2026
8f19df5
efactor: single scrollbar add and named slack in getHeadersWidth (#2717)
ghiscoding Aug 10, 2026
b72f4c9
refactor: give the frozen right header band its own width slack (#2718)
ghiscoding Aug 10, 2026
c601222
chore(tests): add basic Excel export Cypress tests (#2719)
ghiscoding Aug 10, 2026
5cd515b
feat: add core RTL support for headers and column resizing (#2714)
ghiscoding Aug 10, 2026
e79b78b
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 10, 2026
144cc05
chore(deps): update angular dependencies (#2720)
renovate-bot Aug 10, 2026
becff96
chore: fix range color mismatch, intellisense, copy formula
ghiscoding Aug 11, 2026
d80c78b
docs: add documentation on how to style cell dynamically
ghiscoding Aug 11, 2026
6fdc7d6
fix(grid): force top row offset for RowDetail in transform mode (#2722)
ghiscoding Aug 11, 2026
5254db2
refactor: improve unsupported zoom level warning
ghiscoding Aug 11, 2026
7ff4a99
docs: add missing WebMCP to packages list
ghiscoding Aug 12, 2026
42018f7
chore(demos): fix Draggable Grouping examples (#2724)
ghiscoding Aug 12, 2026
6dd9765
fix: allow grid events through range overlays and readonly paste (#2723)
ghiscoding Aug 12, 2026
e3db562
fix(core): sync plugin-added columns to Aurelia & Vue bindings (#2725)
ghiscoding Aug 12, 2026
e87f2ba
chore: add missing lerna-lite watch --no-bail to stop crashing on fai…
ghiscoding Aug 12, 2026
8b047c8
chore: address lefover TODO in unit test
ghiscoding Aug 12, 2026
1a521c9
fix(filters): collection observer disconnect() broke array mutations …
ghiscoding Aug 12, 2026
7751df4
fix(pagination): dedupe duplicate onPaginationChanged within reset cycle
ghiscoding Aug 12, 2026
e2883dd
refactor(pagination): improve pagination reset cycle after last commi…
ghiscoding Aug 12, 2026
e2a797f
refactor(odata): remove dead code from updateSorters (#2728)
ghiscoding Aug 13, 2026
4e23eb2
fix(selection): allow drag handle to shrink cell selection (#2729)
ghiscoding Aug 14, 2026
fb771cf
chore(deps): update pnpm/setup digest to 84cb39b (#2730)
renovate-bot Aug 14, 2026
6a5e9fd
Merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 14, 2026
45d500f
chore: decrease border styling
ghiscoding Aug 14, 2026
55248cf
chore(deps): replace Vite catalog alias in pnpm workspace to fix Reno…
ghiscoding Aug 14, 2026
23c5209
chore: move duplicate code to external file
ghiscoding Aug 15, 2026
3321ebf
Merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 15, 2026
ad926f8
chore: run Prettier formatting
ghiscoding Aug 16, 2026
e7fc732
docs: add Agents md file to make it more AI generic
ghiscoding Aug 16, 2026
029ea9f
docs: fix wrong prop name describe in Tree Data docs
ghiscoding Aug 17, 2026
5136cb5
chore: trim down Renovate PR table columns
ghiscoding Aug 17, 2026
8134521
fix(common): keep Tree Data synchronized after deletions (#2733)
ghiscoding Aug 17, 2026
0a1d791
docs: simplify resolved issue comment generated by bot
ghiscoding Aug 17, 2026
ff1a3c0
fix(deps): update all non-major dependencies (#2731)
renovate-bot Aug 17, 2026
75d6a2e
fix(common): handle dynamic scroll ancestors and cell CSS overlays (#…
ghiscoding Aug 17, 2026
e1d7c31
perf(slickgrid): stabilize paged scrolling edges and clarify paging p…
ghiscoding Aug 17, 2026
058d7be
perf(common): skip off-screen columns during cell rendering (#2736)
ghiscoding Aug 17, 2026
0be7225
fix(slickgrid): prevent native wheel drift with frozen columns (#2737)
ghiscoding Aug 18, 2026
1c76ae1
fix(row-detail): support transform rows with overlay rendering (#2738)
ghiscoding Aug 18, 2026
eb3edd7
docs: add agent instructions to run framework cypress tests
ghiscoding Aug 19, 2026
11f1160
fix(rowspan): support rowTopOffsetRenderType transform (#2739)
ghiscoding Aug 19, 2026
8afbee4
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 19, 2026
3de1a28
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 20, 2026
f3a8c8c
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 20, 2026
a909505
chore: store column/row references to work with column reordering
ghiscoding Aug 20, 2026
020b495
docs: update feature progression
ghiscoding Aug 20, 2026
a998e3e
chore: add drag-fill functionality to guess the formula series
ghiscoding Aug 21, 2026
621738e
chore: increase unit tests coverage & update progression file
ghiscoding Aug 21, 2026
03047a1
chore: increase unit tests coverage
ghiscoding Aug 21, 2026
9eac075
chore: increase unit tests coverage
ghiscoding Aug 21, 2026
5d5cb9b
Merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 22, 2026
db5525a
chore: security audit to safely handle object creation
ghiscoding Aug 22, 2026
49cbd0d
Merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 22, 2026
7a8e06a
chore: improve formula editor key events & styling
ghiscoding Aug 22, 2026
57293e4
chore: run Prettier formatter
ghiscoding Aug 24, 2026
fa46ca8
chore: merge branch 'master' into feat/cell-formula-plugin
ghiscoding Aug 26, 2026
1c2abc4
refactor: improve code after merging multi-selection code
ghiscoding Aug 26, 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 AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Changes in `packages/` can affect every framework. Preserve backward compatibili
- Unit tests use Vitest with `test/vitest.config.mts`.
- E2E tests use Cypress with `test/cypress.config.ts`.
- Cypress tests use `testIsolation: false`; preserve their execution order and inherited state.
- The Vanilla demo is the default Cypress target. Start its Vite watch server first with `pnpm serve:vite` (or use an already-running Vanilla server), then run `pnpm cypress:ci --spec test/cypress/e2e/<example>.cy.ts` for a focused spec.
- Framework demos provide headless Cypress CI scripts. Start the matching demo server first (`pnpm angular:serve`, `pnpm aurelia:serve`, `pnpm react:serve`, or `pnpm vue:serve`).
- Run the corresponding root CI command: `pnpm angular:cypress:ci`, `pnpm aurelia:cypress:ci`, `pnpm react:cypress:ci`, or `pnpm vue:cypress:ci` (for example, `pnpm aurelia:cypress:ci`). These commands use each framework's Cypress config and are preferred for validating framework-specific E2E suites.
- Add or update tests for behavior changes, especially in core packages.
Expand Down
3 changes: 2 additions & 1 deletion demos/vanilla/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"@slickgrid-universal/composite-editor-component": "workspace:*",
"@slickgrid-universal/custom-tooltip-plugin": "workspace:*",
"@slickgrid-universal/excel-export": "workspace:*",
"@slickgrid-universal/formula-plugin": "workspace:*",
"@slickgrid-universal/graphql": "workspace:*",
"@slickgrid-universal/odata": "workspace:*",
"@slickgrid-universal/pdf-export": "workspace:*",
Expand All @@ -42,4 +43,4 @@
"typescript": "catalog:",
"vite": "catalog:"
}
}
}
2 changes: 2 additions & 0 deletions demos/vanilla/src/app-routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import Example43 from './examples/example43.js';
import Example44 from './examples/example44.js';
import Example45 from './examples/example45.js';
import Example46 from './examples/example46.js';
import Example47 from './examples/example47.js';
import Icons from './examples/icons.js';
import type { RouterConfig } from './interfaces.js';

Expand Down Expand Up @@ -98,6 +99,7 @@ export class AppRouting {
{ route: 'example44', name: 'example44', view: './examples/example44.html', viewModel: Example44, title: 'Example44' },
{ route: 'example45', name: 'example45', view: './examples/example45.html', viewModel: Example45, title: 'Example45' },
{ route: 'example46', name: 'example46', view: './examples/example46.html', viewModel: Example46, title: 'Example46' },
{ route: 'example47', name: 'example47', view: './examples/example47.html', viewModel: Example47, title: 'Example47' },
{ route: '', redirect: 'example01' },
{ route: '**', redirect: 'example01' },
];
Expand Down
1 change: 1 addition & 0 deletions demos/vanilla/src/app.html
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ <h4 class="is-size-4 has-text-white">Slickgrid-Universal</h4>
<a class="navbar-item" onclick.trigger="loadRoute('example44')">Example44 - Variable Row Height (provider)</a>
<a class="navbar-item" onclick.trigger="loadRoute('example45')">Example45 - Variable Row Height (metadata)</a>
<a class="navbar-item" onclick.trigger="loadRoute('example46')">Example46 - RTL (Right-to-Left)</a>
<a class="navbar-item" onclick.trigger="loadRoute('example47')">Example47 - Formula Service</a>
</div>
</div>
</div>
Expand Down
92 changes: 92 additions & 0 deletions demos/vanilla/src/examples/example47.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<h3 class="title is-3">
Example 47 - Formula Service (MVP)
<span class="d-inline-flex">
<button class="button is-small" onclick.trigger="toggleDarkMode()" data-test="toggle-dark-mode">
<span class="mdi mdi-theme-light-dark"></span>
<span> Toggle Light/Dark</span>
</button>
</span>

<div class="subtitle code-link">
<span class="is-size-6">see</span>
<a
class="is-size-5"
target="_blank"
href="https://github.com/ghiscoding/slickgrid-universal/blob/master/demos/vanilla/src/examples/example47.ts"
>
<span class="mdi mdi-link-variant"></span> code
</a>
</div>
</h3>

<h5 class="title is-5 mb-2">
Use <code>allowFormula: true</code> columns with optional <code>FormulaService</code>, while keeping Excel export optional.
</h5>
<h6 class="is-6 mb-2 example-details">
This demo is based on Example23. It stores formulas in FormulaService (per rowId + columnId), and Excel Export migrates these formulas to
native Excel formulas when ungrouped. Group total rows still use <code>groupTotalsExcelExportOptions.valueParserCallback</code>.
</h6>
<h6 class="is-6 mb-2 example-details">
Excel-like UX: when editing any <code>allowFormula: true</code> column, headers are prefixed with Excel column letters (<code>A</code>,
<code>B</code>, ...).
</h6>
<h6 class="is-6 mb-4 example-details">
MVP note: formula editing is text-based and does not yet include token coloring, click-to-reference, or range composer UX.
</h6>

<section class="row mb-2">
<div class="mb-1">
<button class="button is-small" onclick.trigger="exportToExcel()" data-test="export-excel-btn">
<span class="mdi mdi-file-excel-outline color-success"></span>
<span>Export to Excel</span>
</button>
<button class="button is-small" onclick.trigger="exportToExcelPortable()" data-test="export-excel-portable-btn">
<span class="mdi mdi-file-excel-outline color-warning"></span>
<span>Export Portable Values</span>
</button>
<span>
<button class="button is-small" onclick.trigger="groupByTaxable()" data-test="group-by-btn">
<span>Group by Taxable</span>
</button>
<button class="button is-small" onclick.trigger="clearGrouping()" data-test="clear-grouping-btn">
<span>Clear grouping</span>
</button>
<button class="button is-small" onclick.trigger="loadDefaultFormulas()" data-test="reload-formulas-btn">
<span>Load Default Formulas</span>
</button>
<button class="button is-small" onclick.trigger="clearAllFormulas()" data-test="clear-formulas-btn">
<span>Clear Formula Store</span>
</button>
</span>
<span class="ml-4 text-bold">
Tax Rate (%):
<input type="number" value.bind="taxRate" class="is-narrow input is-small" step="0.25" data-test="taxrate" />
<button class="button is-small" onclick.trigger="updateTaxRate()" data-test="update-btn">Update</button>
</span>
</div>
</section>

<section class="row mb-2">
<div class="mb-1">
<b>Try formula input:</b>
edit any <em>Sub-Total</em>, <em>Taxes</em>, or <em>Total</em> cell and type for example
<code>=REF(COLUMN("price"),ROW("1"))*REF(COLUMN("qty"),ROW("1"))</code>
</div>
</section>

<section class="row mb-2">
<div class="mb-1">
<b>Compatibility note:</b>
workbook custom functions (for example <code>CUSTOMSUM(...)</code>) rely on modern Excel LAMBDA conventions. LibreOffice/OpenOffice
might show errors for these formulas. Use <em>Export Portable Values</em> when cross-suite compatibility is required.
</div>
</section>

<section class="row mb-3">
<div class="mb-1">
<b>Last Formula Event:</b>
<span>${lastFormulaEvent}</span>
</div>
</section>

<div class="grid47"></div>
43 changes: 43 additions & 0 deletions demos/vanilla/src/examples/example47.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
.grid47 {
--example47-row-index-bg: #ececec;
--example47-row-index-color: inherit;
--example47-sub-total-color: rgb(33, 80, 115);
--example47-taxes-color: rgb(198, 89, 17);
--example47-total-color: rgb(0, 90, 158);
--slick-text-editor-background: #fff;
--slick-cell-selected-color: #fff;

.slick-row:not(.slick-group) > .cell-unselectable {
background: var(--example47-row-index-bg) !important;
color: var(--example47-row-index-color);
font-weight: bold;
}

.text-sub-total {
font-style: italic;
color: var(--example47-sub-total-color);
}

.text-taxes {
font-style: italic;
color: var(--example47-taxes-color);
}

.text-total {
font-weight: bold;
color: var(--example47-total-color);
}
}

body[data-theme='dark'] .grid47,
.dark-mode .grid47,
.slick-dark-mode .grid47 {
--example47-row-index-bg: #334155;
--example47-row-index-color: #e2e8f0;
--example47-sub-total-color: #93c5fd;
--example47-taxes-color: #fdba74;
--example47-total-color: #60a5fa;
--slick-text-editor-background: #111827;
--slick-cell-selected-color: #2c2c2c;
--slick-cell-selected-editable-color: #333333;
}
Loading
Loading