diff --git a/package.json b/package.json
index ba4f04513..d2c7487f5 100644
--- a/package.json
+++ b/package.json
@@ -53,13 +53,13 @@
},
"dependencies": {
"@ngx-translate/core": "^15.0.0",
- "@slickgrid-universal/common": "~5.11.0",
- "@slickgrid-universal/custom-footer-component": "~5.11.0",
- "@slickgrid-universal/empty-warning-component": "~5.11.0",
- "@slickgrid-universal/event-pub-sub": "~5.10.2",
- "@slickgrid-universal/pagination-component": "~5.11.0",
- "@slickgrid-universal/row-detail-view-plugin": "~5.11.0",
- "@slickgrid-universal/rxjs-observable": "~5.11.0",
+ "@slickgrid-universal/common": "~5.12.0",
+ "@slickgrid-universal/custom-footer-component": "~5.12.0",
+ "@slickgrid-universal/empty-warning-component": "~5.12.0",
+ "@slickgrid-universal/event-pub-sub": "~5.12.0",
+ "@slickgrid-universal/pagination-component": "~5.12.0",
+ "@slickgrid-universal/row-detail-view-plugin": "~5.12.0",
+ "@slickgrid-universal/rxjs-observable": "~5.12.0",
"dequal": "^2.0.3",
"rxjs": "^7.8.1"
},
@@ -91,13 +91,13 @@
"@ng-select/ng-select": "^13.9.1",
"@ngx-translate/http-loader": "^8.0.0",
"@popperjs/core": "^2.11.8",
- "@release-it/conventional-changelog": "^9.0.4",
- "@slickgrid-universal/composite-editor-component": "~5.11.0",
- "@slickgrid-universal/custom-tooltip-plugin": "~5.11.0",
- "@slickgrid-universal/excel-export": "~5.11.0",
- "@slickgrid-universal/graphql": "~5.11.0",
- "@slickgrid-universal/odata": "~5.11.0",
- "@slickgrid-universal/text-export": "~5.11.0",
+ "@release-it/conventional-changelog": "^10.0.0",
+ "@slickgrid-universal/composite-editor-component": "~5.12.0",
+ "@slickgrid-universal/custom-tooltip-plugin": "~5.12.0",
+ "@slickgrid-universal/excel-export": "~5.12.0",
+ "@slickgrid-universal/graphql": "~5.12.0",
+ "@slickgrid-universal/odata": "~5.12.0",
+ "@slickgrid-universal/text-export": "~5.12.0",
"@types/fnando__sparkline": "^0.3.7",
"@types/jest": "^29.5.14",
"@types/node": "^22.10.7",
@@ -106,7 +106,7 @@
"bootstrap": "^5.3.3",
"copyfiles": "^2.4.1",
"custom-event-polyfill": "^1.0.7",
- "cypress": "^13.17.0",
+ "cypress": "^14.0.0",
"cypress-real-events": "^1.13.0",
"dompurify": "^3.2.3",
"eslint": "^9.18.0",
@@ -119,7 +119,7 @@
"ngx-bootstrap": "^18.1.3",
"npm-run-all2": "^7.0.2",
"prettier": "^3.4.2",
- "release-it": "^17.11.0",
+ "release-it": "^18.1.1",
"rimraf": "^5.0.10",
"rxjs": "^7.8.1",
"sass": "^1.83.4",
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index a4158e5cf..7f98e1963 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -40,6 +40,8 @@ import { GridTradingComponent } from './examples/grid-trading.component';
import { GridTreeDataHierarchicalComponent } from './examples/grid-tree-data-hierarchical.component';
import { GridTreeDataParentChildComponent } from './examples/grid-tree-data-parent-child.component';
import { Grid18Component } from './examples/grid18.component';
+import { Grid43Component } from './examples/grid43.component';
+import { Grid44Component } from './examples/grid44.component';
import { SwtCommonGridTestComponent } from './examples/swt-common-grid-test.component';
import { NgModule } from '@angular/core';
@@ -85,6 +87,8 @@ const routes: Routes = [
{ path: 'resize-by-content', component: GridResizeByContentComponent },
{ path: 'rowdetail', component: GridRowDetailComponent },
{ path: 'rowmove', component: GridRowMoveComponent },
+ { path: 'rowspan-timesheets', component: Grid43Component },
+ { path: 'rowspan-large', component: Grid44Component },
{ path: 'selection', component: GridRowSelectionComponent },
{ path: 'trading', component: GridTradingComponent },
{ path: 'tree-data-parent-child', component: GridTreeDataParentChildComponent },
diff --git a/src/app/app.component.html b/src/app/app.component.html
index 7ac0520ed..7bb295a95 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -172,7 +172,15 @@
41- Drag & Drop
- 42- Custom Pagination
+ 42- Custom Pagination
+
+
+ 43- Colspan/Rowspan (timesheets)
+
+
+ 44- Colspan/Rowspan (large data)
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 8f75ea11e..301b97b60 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -56,6 +56,8 @@ import { GridTradingComponent } from './examples/grid-trading.component';
import { GridTreeDataHierarchicalComponent } from './examples/grid-tree-data-hierarchical.component';
import { GridTreeDataParentChildComponent } from './examples/grid-tree-data-parent-child.component';
import { Grid18Component } from './examples/grid18.component';
+import { Grid43Component } from './examples/grid43.component';
+import { Grid44Component } from './examples/grid44.component';
import { HomeComponent } from './examples/home.component';
import { CustomPagerComponent } from './examples/grid-custom-pager.component';
import { RowDetailPreloadComponent } from './examples/rowdetail-preload.component';
@@ -145,6 +147,8 @@ export function appInitializerFactory(translate: TranslateService, injector: Inj
GridTreeDataParentChildComponent,
GridTreeDataHierarchicalComponent,
Grid18Component,
+ Grid43Component,
+ Grid44Component,
RowDetailPreloadComponent,
RowDetailViewComponent,
SwtCommonGridTestComponent,
diff --git a/src/app/examples/grid-colspan.component.ts b/src/app/examples/grid-colspan.component.ts
index 66929d585..eeda7f61e 100644
--- a/src/app/examples/grid-colspan.component.ts
+++ b/src/app/examples/grid-colspan.component.ts
@@ -59,7 +59,11 @@ export class GridColspanComponent implements OnInit {
showPreHeaderPanel: true,
preHeaderPanelHeight: 28,
explicitInitialization: true,
- colspanCallback: this.renderDifferentColspan,
+ dataView: {
+ globalItemMetadataProvider: {
+ getRowMetadata: (item: any, row: any) => this.renderDifferentColspan(item, row),
+ },
+ },
gridMenu: {
iconButtonContainer: 'preheader', // we can display the grid menu icon in either the preheader or in the column header (default)
},
@@ -142,8 +146,8 @@ export class GridColspanComponent implements OnInit {
* Your callback will always have the "item" argument which you can use to decide on the colspan
* Your return must always be in the form of:: return { columns: {}}
*/
- renderDifferentColspan(item: any): ItemMetadata {
- if (item.id % 2 === 1) {
+ renderDifferentColspan(item: any, row: number): ItemMetadata {
+ if (item.id % 2 === 1 || row % 2 === 1) {
return {
columns: {
duration: {
diff --git a/src/app/examples/grid43.component.html b/src/app/examples/grid43.component.html
new file mode 100644
index 000000000..179d6ce97
--- /dev/null
+++ b/src/app/examples/grid43.component.html
@@ -0,0 +1,88 @@
+
+
+ Example 43: colspan/rowspan - Employees Timesheets
+
+
+ code
+
+
+
+
+
+
+
+
+
+ NOTES : rowspan is an opt-in feature, because of its small perf hit (it needs to loop through all row
+ metadatas to map all rowspan), and requires the enableCellRowSpan grid option to be enabled to work properly.
+ The colspan/rowspan are both using DataView item metadata and are both based on row indexes and
+ will not keep the row in sync with the data. It is really up to you the user to update the metadata logic of how and
+ where the cells should span when a side effect kicks in. (i.e: Filtering/Sorting/Paging/Column Reorder... will
+ not change/update the spanning in the grid by itself and that is why they these features are all disabled in this
+ example). Also, column/row freezing (pinning) are also not supported, or at least not recommended unless you know exactly
+ what you're doing (like in this demo here because we know our pinning doesn't intersect)! Any freezing column/row that could
+ intersect with a colspan/rowspan will cause problems .
+
+
+
+
+
+ Navigate Up Cell
+
+
+
+ Navigate Down Cell
+
+
+
+ Navigate to Left Cell
+
+
+
+ Navigate to Right Cell
+
+
+
+ Toggle Editing: {{ isEditable }}
+
+
+
+
+
diff --git a/src/app/examples/grid43.component.scss b/src/app/examples/grid43.component.scss
new file mode 100644
index 000000000..77d968cad
--- /dev/null
+++ b/src/app/examples/grid43.component.scss
@@ -0,0 +1,30 @@
+#grid43 {
+ --slick-border-color: #d4d4d4;
+ // --slick-cell-border-left: 1px solid var(--slick-border-color);
+ --slick-header-menu-display: none;
+ --slick-header-column-height: 20px;
+ --slick-grid-border-color: #d4d4d4;
+ --slick-row-selected-color: #d4ebfd;
+ --slick-cell-active-box-shadow: inset 0 0 0 1px #3ca4ff;
+
+ --slick-row-mouse-hover-box-shadow: 0;
+ --slick-cell-odd-background-color: #fff;
+ --slick-cell-border-right: 1px solid var(--slick-border-color);
+ --slick-cell-border-bottom: 0;
+ --slick-cell-border-top: 1px solid var(--slick-border-color);
+ --slick-header-filter-row-border-bottom: 1px solid var(--slick-border-color);
+ --slick-cell-border-left: 0;
+ --slick-cell-box-shadow: none;
+ --slick-row-mouse-hover-color: #fff;
+ --slick-cell-display: flex;
+
+ .slick-cell.rowspan {
+ // background: white;
+ z-index: 9;
+ }
+ .slick-cell {
+ display: flex;
+ align-items: center;
+ /* justify-content: center; */
+ }
+}
diff --git a/src/app/examples/grid43.component.ts b/src/app/examples/grid43.component.ts
new file mode 100644
index 000000000..bf74c4580
--- /dev/null
+++ b/src/app/examples/grid43.component.ts
@@ -0,0 +1,415 @@
+import { Component, OnInit, ViewEncapsulation } from '@angular/core';
+import { AngularGridInstance, Column, Editors, GridOption, type ItemMetadata } from './../modules/angular-slickgrid';
+import { ExcelExportService } from '@slickgrid-universal/excel-export';
+
+@Component({
+ styleUrls: ['grid43.component.scss'],
+ templateUrl: './grid43.component.html',
+ encapsulation: ViewEncapsulation.None,
+})
+export class Grid43Component implements OnInit {
+ columnDefinitions: Column[] = [];
+ angularGrid!: AngularGridInstance;
+ gridOptions!: GridOption;
+ dataset: any[] = [];
+ isEditable = false;
+ showSubTitle = true;
+ metadata: ItemMetadata | Record = {
+ // 10001: Davolio
+ 0: {
+ columns: {
+ 1: { rowspan: 2 },
+ 2: { colspan: 2 },
+ 6: { colspan: 3 },
+ 10: { colspan: 3, rowspan: 10 },
+ 13: { colspan: 2 },
+ 17: { colspan: 2, rowspan: 2 },
+ },
+ },
+ // 10002: (Buchanan... name not shown since Davolio has rowspan=2)
+ 1: {
+ columns: {
+ 3: { colspan: 3 },
+ 6: { colspan: 4 },
+ 13: { colspan: 2, rowspan: 5 },
+ 15: { colspan: 2 },
+ },
+ },
+ // 10003: Fuller
+ 2: {
+ columns: {
+ 2: { colspan: 3, rowspan: 2 },
+ 5: { colspan: 2 },
+ 7: { colspan: 3 },
+ 15: { colspan: 2 },
+ 17: { colspan: 2 },
+ },
+ },
+ // 10004: Leverling
+ 3: {
+ columns: {
+ 6: { colspan: 4 },
+ 16: { colspan: 2 },
+ },
+ },
+ // 10005: Peacock
+ 4: {
+ columns: {
+ 2: { colspan: 4 },
+ 7: { colspan: 3 },
+ 15: { colspan: 2, rowspan: 2 },
+ 17: { colspan: 2 },
+ },
+ },
+ // 10006: Janet
+ 5: {
+ columns: {
+ 2: { colspan: 2 },
+ 4: { colspan: 3 },
+ 7: { colspan: 3 },
+ 17: { colspan: 2 },
+ },
+ },
+ // 10007: Suyama
+ 6: {
+ columns: {
+ 2: { colspan: 2 },
+ 5: { colspan: 2 },
+ 7: { colspan: 3 },
+ 14: { colspan: 2 },
+ 16: { colspan: 3 },
+ },
+ },
+ // 10008: Robert
+ 7: {
+ columns: {
+ 2: { colspan: 3 },
+ 5: { colspan: 3 },
+ 13: { colspan: 3, rowspan: 2 },
+ 16: { colspan: 2 },
+ },
+ },
+ // 10009: Andrew
+ 8: {
+ columns: {
+ 2: { colspan: 3 },
+ 7: { colspan: 3, rowspan: 2 },
+ 17: { colspan: 2 },
+ },
+ },
+ // 10010: Michael
+ 9: {
+ columns: {
+ 2: { colspan: 3 },
+ 5: { colspan: 2 },
+ 13: { colspan: 3 },
+ 16: { colspan: 3 },
+ },
+ },
+ };
+
+ angularGridReady(angularGrid: AngularGridInstance) {
+ this.angularGrid = angularGrid;
+ }
+
+ ngOnInit(): void {
+ // define the grid options & columns and then create the grid itself
+ this.defineGrid();
+
+ // mock a dataset
+ this.dataset = this.loadData();
+ }
+
+ defineGrid() {
+ this.columnDefinitions = [
+ { id: 'employeeID', name: 'Employee ID', field: 'employeeID', minWidth: 100 },
+ { id: 'employeeName', name: 'Employee Name', field: 'employeeName', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '9:00', name: '9:00 AM', field: '9:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '9:30', name: '9:30 AM', field: '9:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '10:00', name: '10:00 AM', field: '10:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '10:30', name: '10:30 AM', field: '10:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '11:00', name: '11:00 AM', field: '11:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '11:30', name: '11:30 AM', field: '11:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '12:00', name: '12:00 PM', field: '12:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '12:30', name: '12:30 PM', field: '12:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '1:00', name: '1:00 PM', field: '1:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '1:30', name: '1:30 PM', field: '1:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '2:00', name: '2:00 PM', field: '2:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '2:30', name: '2:30 PM', field: '2:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '3:00', name: '3:00 PM', field: '3:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '3:30', name: '3:30 PM', field: '3:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '4:00', name: '4:00 PM', field: '4:00', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '4:30', name: '4:30 PM', field: '4:30', editor: { model: Editors.text }, minWidth: 120 },
+ { id: '5:00', name: '5:00 PM', field: '5:00', editor: { model: Editors.text }, minWidth: 120 },
+ ];
+
+ this.gridOptions = {
+ autoResize: {
+ bottomPadding: 30,
+ rightPadding: 50,
+ },
+ enableCellNavigation: true,
+ enableColumnReorder: true,
+ enableCellRowSpan: true,
+ enableExcelExport: true,
+ externalResources: [new ExcelExportService()],
+ enableExcelCopyBuffer: true,
+ autoEdit: true,
+ editable: false,
+ datasetIdPropertyName: 'employeeID',
+ frozenColumn: 0,
+ gridHeight: 348,
+ rowHeight: 30,
+ dataView: {
+ globalItemMetadataProvider: {
+ getRowMetadata: (_item, row) => {
+ return (this.metadata as Record)[row];
+ },
+ },
+ },
+ rowTopOffsetRenderType: 'top', // rowspan doesn't render well with 'transform', default is 'top'
+ };
+ }
+
+ navigateDown() {
+ this.angularGrid?.slickGrid?.navigateDown();
+ }
+
+ navigateUp() {
+ this.angularGrid?.slickGrid?.navigateUp();
+ }
+
+ navigateNext() {
+ this.angularGrid?.slickGrid?.navigateNext();
+ }
+
+ navigatePrev() {
+ this.angularGrid?.slickGrid?.navigatePrev();
+ }
+
+ toggleEditing() {
+ this.isEditable = !this.isEditable;
+ this.angularGrid.slickGrid.setOptions({ editable: this.isEditable });
+ }
+
+ loadData() {
+ return [
+ {
+ employeeID: 10001,
+ employeeName: 'Davolio',
+ '9:00': 'Analysis Tasks',
+ '9:30': 'Analysis Tasks',
+ '10:00': 'Team Meeting',
+ '10:30': 'Testing',
+ '11:00': 'Development',
+ '11:30': 'Development',
+ '12:00': 'Development',
+ '12:30': 'Support',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Testing',
+ '3:00': 'Testing',
+ '3:30': 'Development',
+ '4:00': 'Conference',
+ '4:30': 'Team Meeting',
+ '5:00': 'Team Meeting',
+ },
+ {
+ employeeID: 10002,
+ employeeName: 'Buchanan',
+ '9:00': 'Task Assign',
+ '9:30': 'Support',
+ '10:00': 'Support',
+ '10:30': 'Support',
+ '11:00': 'Testing',
+ '11:30': 'Testing',
+ '12:00': 'Testing',
+ '12:30': 'Testing',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Development',
+ '3:00': 'Development',
+ '3:30': 'Check Mail',
+ '4:00': 'Check Mail',
+ '4:30': 'Team Meeting',
+ '5:00': 'Team Meeting',
+ },
+ {
+ employeeID: 10003,
+ employeeName: 'Fuller',
+ '9:00': 'Check Mail',
+ '9:30': 'Check Mail',
+ '10:00': 'Check Mail',
+ '10:30': 'Analysis Tasks',
+ '11:00': 'Analysis Tasks',
+ '11:30': 'Support',
+ '12:00': 'Support',
+ '12:30': 'Support',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Development',
+ '3:00': 'Development',
+ '3:30': 'Team Meeting',
+ '4:00': 'Team Meeting',
+ '4:30': 'Development',
+ '5:00': 'Development',
+ },
+ {
+ employeeID: 10004,
+ employeeName: 'Leverling',
+ '9:00': 'Testing',
+ '9:30': 'Check Mail',
+ '10:00': 'Check Mail',
+ '10:30': 'Support',
+ '11:00': 'Testing',
+ '11:30': 'Testing',
+ '12:00': 'Testing',
+ '12:30': 'Testing',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Development',
+ '3:00': 'Development',
+ '3:30': 'Check Mail',
+ '4:00': 'Conference',
+ '4:30': 'Conference',
+ '5:00': 'Team Meeting',
+ },
+ {
+ employeeID: 10005,
+ employeeName: 'Peacock',
+ '9:00': 'Task Assign',
+ '9:30': 'Task Assign',
+ '10:00': 'Task Assign',
+ '10:30': 'Task Assign',
+ '11:00': 'Check Mail',
+ '11:30': 'Support',
+ '12:00': 'Support',
+ '12:30': 'Support',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Development',
+ '3:00': 'Development',
+ '3:30': 'Team Meeting',
+ '4:00': 'Team Meeting',
+ '4:30': 'Testing',
+ '5:00': 'Testing',
+ },
+ {
+ employeeID: 10006,
+ employeeName: 'Janet',
+ '9:00': 'Testing',
+ '9:30': 'Testing',
+ '10:00': 'Support',
+ '10:30': 'Support',
+ '11:00': 'Support',
+ '11:30': 'Team Meeting',
+ '12:00': 'Team Meeting',
+ '12:30': 'Team Meeting',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Development',
+ '3:00': 'Development',
+ '3:30': 'Team Meeting',
+ '4:00': 'Team Meeting',
+ '4:30': 'Development',
+ '5:00': 'Development',
+ },
+ {
+ employeeID: 10007,
+ employeeName: 'Suyama',
+ '9:00': 'Analysis Tasks',
+ '9:30': 'Analysis Tasks',
+ '10:00': 'Testing',
+ '10:30': 'Development',
+ '11:00': 'Development',
+ '11:30': 'Testing',
+ '12:00': 'Testing',
+ '12:30': 'Testing',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Support',
+ '3:00': 'Build',
+ '3:30': 'Build',
+ '4:00': 'Check Mail',
+ '4:30': 'Check Mail',
+ '5:00': 'Check Mail',
+ },
+ {
+ employeeID: 10008,
+ employeeName: 'Robert',
+ '9:00': 'Task Assign',
+ '9:30': 'Task Assign',
+ '10:00': 'Task Assign',
+ '10:30': 'Development',
+ '11:00': 'Development',
+ '11:30': 'Development',
+ '12:00': 'Testing',
+ '12:30': 'Support',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Check Mail',
+ '3:00': 'Check Mail',
+ '3:30': 'Check Mail',
+ '4:00': 'Team Meeting',
+ '4:30': 'Team Meeting',
+ '5:00': 'Build',
+ },
+ {
+ employeeID: 10009,
+ employeeName: 'Andrew',
+ '9:00': 'Check Mail',
+ '9:30': 'Team Meeting',
+ '10:00': 'Team Meeting',
+ '10:30': 'Support',
+ '11:00': 'Testing',
+ '11:30': 'Development',
+ '12:00': 'Development',
+ '12:30': 'Development',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Check Mail',
+ '3:00': 'Check Mail',
+ '3:30': 'Check Mail',
+ '4:00': 'Team Meeting',
+ '4:30': 'Development',
+ '5:00': 'Development',
+ },
+ {
+ employeeID: 10010,
+ employeeName: 'Michael',
+ '9:00': 'Task Assign',
+ '9:30': 'Task Assign',
+ '10:00': 'Task Assign',
+ '10:30': 'Analysis Tasks',
+ '11:00': 'Analysis Tasks',
+ '11:30': 'Development',
+ '12:00': 'Development',
+ '12:30': 'Development',
+ '1:00': 'Lunch Break',
+ '1:30': 'Lunch Break',
+ '2:00': 'Lunch Break',
+ '2:30': 'Testing',
+ '3:00': 'Testing',
+ '3:30': 'Testing',
+ '4:00': 'Build',
+ '4:30': 'Build',
+ '5:00': 'Build',
+ },
+ ];
+ }
+
+ toggleSubTitle() {
+ this.showSubTitle = !this.showSubTitle;
+ const action = this.showSubTitle ? 'remove' : 'add';
+ document.querySelector('.subtitle')?.classList[action]('hidden');
+ }
+}
diff --git a/src/app/examples/grid44.component.html b/src/app/examples/grid44.component.html
new file mode 100644
index 000000000..098476849
--- /dev/null
+++ b/src/app/examples/grid44.component.html
@@ -0,0 +1,91 @@
+
+
+ Example 44: colspan/rowspan with large dataset
+
+
+ code
+
+
+
+
+
+
+
+
+
+ This page demonstrates colspan & rowspan using DataView with item metadata. Note :
+ colspan & rowspan are rendered via row/cell indexes, any operations that could change these
+ indexes (i.e. Filtering/Sorting/Paging/Column Reorder) will require you to implement proper logic to recalculate these
+ indexes (it becomes your responsability). This demo does not show this because it is up to you to decide what to do when the
+ span changes shape (i.e. you default to 3 rowspan but you filter a row in the middle, how do you want to proceed?).
+
+
+
+
+
+
500 rows
+
5k rows
+
+ 50k rows
+
+
+ 500k rows
+
+
data length:
+
+
+ Toggle blue cell colspan & rowspan
+
+
+
+ Scroll To Row
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/examples/grid44.component.scss b/src/app/examples/grid44.component.scss
new file mode 100644
index 000000000..ea9fca584
--- /dev/null
+++ b/src/app/examples/grid44.component.scss
@@ -0,0 +1,50 @@
+#grid44 {
+ --slick-cell-active-box-shadow: inset 0 0 0 1px #e35ddc;
+
+ .slick-row.even .slick-cell.cell-very-high {
+ background-color: #f0ffe0;
+ }
+ .slick-row.odd .slick-cell.cell-var-span {
+ background-color: #87ceeb;
+ }
+ .slick-row .slick-cell.rowspan {
+ background-color: #95b7a2;
+ z-index: 10;
+ }
+ .slick-row[data-row='3'] .slick-cell.l3.rowspan {
+ background-color: #95b7a2;
+ }
+ .slick-row[data-row='2'] .slick-cell.l3.r5 {
+ background-color: #ddfffc;
+ }
+ .slick-row[data-row='0'] .slick-cell.rowspan,
+ .slick-row[data-row='8'] .slick-cell.rowspan {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAQ0lEQVQYV2N8/fr1fwY84M6dOwyM+BSBFKioqOBWBFMAsgSrScgKsCpCV4ChCJsCFEW4FMAV4VMAVnT8+PH/IG/iAwDA1DlezHn8bwAAAABJRU5ErkJggg==);
+ }
+ .slick-row[data-row='8'] .slick-cell.rowspan:nth-child(4) {
+ background: #f0ffe0;
+ }
+ .slick-row[data-row='12'] .slick-cell.rowspan {
+ background: #bd8b8b;
+ }
+ .slick-row[data-row='15'] .slick-cell.rowspan {
+ background: #edc12e;
+ }
+ .slick-row[data-row='85'] .slick-cell.rowspan {
+ background: #8baebd;
+ }
+ .slick-cell.active {
+ /* use a different active cell color to make it a bit more obvious */
+ box-shadow: inset 0 0 0 1px #e35ddc;
+ }
+ .cellValue {
+ float: right;
+ font-size: 14px;
+ }
+ .valueComment {
+ color: #7c8983;
+ font-size: 12px;
+ font-style: italic;
+ width: fit-content;
+ }
+}
diff --git a/src/app/examples/grid44.component.ts b/src/app/examples/grid44.component.ts
new file mode 100644
index 000000000..1591eddbc
--- /dev/null
+++ b/src/app/examples/grid44.component.ts
@@ -0,0 +1,238 @@
+import { Component, OnInit, ViewEncapsulation } from '@angular/core';
+import { AngularGridInstance, Column, Formatter, GridOption, type ItemMetadata } from './../modules/angular-slickgrid';
+
+const rowCellValueFormatter: Formatter = (row, cell, value) => {
+ return `${value.toFixed(2)}
`;
+};
+
+@Component({
+ styleUrls: ['grid44.component.scss'],
+ templateUrl: './grid44.component.html',
+ encapsulation: ViewEncapsulation.None,
+})
+export class Grid44Component implements OnInit {
+ columnDefinitions: Column[] = [];
+ gridOptions!: GridOption;
+ angularGrid!: AngularGridInstance;
+ dataLn: number | string = 'loading...';
+ dataset: any[] = [];
+ showSubTitle = true;
+ scrollToRow = 100;
+ metadata: Record = {
+ 0: {
+ columns: {
+ 1: { rowspan: 3 },
+ },
+ },
+ 2: {
+ columns: {
+ 0: { rowspan: 3 },
+ 3: { colspan: 3 },
+ },
+ },
+ 3: {
+ columns: {
+ 1: { rowspan: 5, colspan: 1, cssClass: 'cell-var-span' },
+ // 1: { rowspan: 3, colspan: 2, cssClass: "cell-var-span" },
+ 3: { rowspan: 3, colspan: 5 },
+ },
+ },
+ 8: {
+ columns: {
+ 1: { rowspan: 80 },
+ 3: { rowspan: 1999, colspan: 2, cssClass: 'cell-very-high' },
+ },
+ },
+ 12: {
+ columns: {
+ 11: { rowspan: 3 },
+ },
+ },
+ 15: {
+ columns: {
+ 18: { colspan: 4, rowspan: 3 },
+ },
+ },
+ 85: {
+ columns: {
+ 5: { rowspan: 20 },
+ },
+ },
+ };
+
+ angularGridReady(angularGrid: AngularGridInstance) {
+ this.angularGrid = angularGrid;
+ }
+
+ ngOnInit(): void {
+ // define the grid options & columns and then create the grid itself
+ this.defineGrid();
+
+ // mock a dataset
+ this.loadData(500);
+ }
+
+ defineGrid() {
+ this.columnDefinitions = [
+ { id: 'title', name: 'Title', field: 'title', minWidth: 80 },
+ { id: 'revenueGrowth', name: 'Revenue Growth', field: 'revenueGrowth', formatter: rowCellValueFormatter, minWidth: 120 },
+ {
+ id: 'pricingPolicy',
+ name: 'Pricing Policy',
+ field: 'pricingPolicy',
+ minWidth: 110,
+ sortable: true,
+ formatter: rowCellValueFormatter,
+ },
+ { id: 'policyIndex', name: 'Policy Index', field: 'policyIndex', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'expenseControl', name: 'Expense Control', field: 'expenseControl', minWidth: 110, formatter: rowCellValueFormatter },
+ { id: 'excessCash', name: 'Excess Cash', field: 'excessCash', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'netTradeCycle', name: 'Net Trade Cycle', field: 'netTradeCycle', minWidth: 110, formatter: rowCellValueFormatter },
+ { id: 'costCapital', name: 'Cost of Capital', field: 'costCapital', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'revenueGrowth2', name: 'Revenue Growth', field: 'revenueGrowth2', formatter: rowCellValueFormatter, minWidth: 120 },
+ {
+ id: 'pricingPolicy2',
+ name: 'Pricing Policy',
+ field: 'pricingPolicy2',
+ minWidth: 110,
+ sortable: true,
+ formatter: rowCellValueFormatter,
+ },
+ { id: 'policyIndex2', name: 'Policy Index', field: 'policyIndex2', minWidth: 100, formatter: rowCellValueFormatter },
+ {
+ id: 'expenseControl2',
+ name: 'Expense Control',
+ field: 'expenseControl2',
+ minWidth: 110,
+ formatter: rowCellValueFormatter,
+ },
+ { id: 'excessCash2', name: 'Excess Cash', field: 'excessCash2', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'netTradeCycle2', name: 'Net Trade Cycle', field: 'netTradeCycle2', minWidth: 110, formatter: rowCellValueFormatter },
+ { id: 'costCapital2', name: 'Cost of Capital', field: 'costCapital2', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'revenueGrowth3', name: 'Revenue Growth', field: 'revenueGrowth3', formatter: rowCellValueFormatter, minWidth: 120 },
+ {
+ id: 'pricingPolicy3',
+ name: 'Pricing Policy',
+ field: 'pricingPolicy3',
+ minWidth: 110,
+ sortable: true,
+ formatter: rowCellValueFormatter,
+ },
+ { id: 'policyIndex3', name: 'Policy Index', field: 'policyIndex3', minWidth: 100, formatter: rowCellValueFormatter },
+ {
+ id: 'expenseControl3',
+ name: 'Expense Control',
+ field: 'expenseControl3',
+ minWidth: 110,
+ formatter: rowCellValueFormatter,
+ },
+ { id: 'excessCash3', name: 'Excess Cash', field: 'excessCash3', minWidth: 100, formatter: rowCellValueFormatter },
+ { id: 'netTradeCycle3', name: 'Net Trade Cycle', field: 'netTradeCycle3', minWidth: 110, formatter: rowCellValueFormatter },
+ { id: 'costCapital3', name: 'Cost of Capital', field: 'costCapital3', minWidth: 100, formatter: rowCellValueFormatter },
+ ];
+
+ this.gridOptions = {
+ enableCellNavigation: true,
+ enableColumnReorder: true,
+ enableCellRowSpan: true,
+ gridHeight: 600,
+ gridWidth: 900,
+ rowHeight: 30,
+ dataView: {
+ globalItemMetadataProvider: {
+ getRowMetadata: (item: any, row: number) => this.renderDifferentColspan(item, row),
+ },
+ },
+ rowTopOffsetRenderType: 'top', // rowspan doesn't render well with 'transform', default is 'top'
+ };
+ }
+
+ clearScrollTo() {
+ this.scrollToRow = 0;
+ document.querySelector('#nRow')?.focus();
+ }
+
+ loadData(count: number) {
+ this.dataLn = 'loading...';
+
+ // add a delay just to show the "loading" text before it loads all data
+ setTimeout(() => {
+ // mock data
+ const tmpArray: any[] = [];
+ for (let i = 0; i < count; i++) {
+ tmpArray[i] = {
+ id: i,
+ title: 'Task ' + i,
+ revenueGrowth: Math.random() * Math.pow(10, Math.random() * 3),
+ pricingPolicy: Math.random() * Math.pow(10, Math.random() * 3),
+ policyIndex: Math.random() * Math.pow(10, Math.random() * 3),
+ expenseControl: Math.random() * Math.pow(10, Math.random() * 3),
+ excessCash: Math.random() * Math.pow(10, Math.random() * 3),
+ netTradeCycle: Math.random() * Math.pow(10, Math.random() * 3),
+ costCapital: Math.random() * Math.pow(10, Math.random() * 3),
+ revenueGrowth2: Math.random() * Math.pow(10, Math.random() * 3),
+ pricingPolicy2: Math.random() * Math.pow(10, Math.random() * 3),
+ policyIndex2: Math.random() * Math.pow(10, Math.random() * 3),
+ expenseControl2: Math.random() * Math.pow(10, Math.random() * 3),
+ excessCash2: Math.random() * Math.pow(10, Math.random() * 3),
+ netTradeCycle2: Math.random() * Math.pow(10, Math.random() * 3),
+ costCapital2: Math.random() * Math.pow(10, Math.random() * 3),
+ revenueGrowth3: Math.random() * Math.pow(10, Math.random() * 3),
+ pricingPolicy3: Math.random() * Math.pow(10, Math.random() * 3),
+ policyIndex3: Math.random() * Math.pow(10, Math.random() * 3),
+ expenseControl3: Math.random() * Math.pow(10, Math.random() * 3),
+ excessCash3: Math.random() * Math.pow(10, Math.random() * 3),
+ netTradeCycle3: Math.random() * Math.pow(10, Math.random() * 3),
+ costCapital3: Math.random() * Math.pow(10, Math.random() * 3),
+ };
+ }
+
+ // let's keep column 3-4 as the row spanning from row 8 until the end of the grid
+ this.metadata[8].columns![3].rowspan = tmpArray.length - 8;
+
+ this.angularGrid?.dataView?.beginUpdate();
+ this.angularGrid?.dataView?.setItems(tmpArray);
+ this.angularGrid?.dataView?.endUpdate();
+ this.dataLn = count;
+ }, 20);
+ }
+
+ /**
+ * A callback to render different row column span
+ * Your callback will always have the "item" argument which you can use to decide on the colspan
+ * Your return object must always be in the form of:: { columns: { [columnName]: { colspan: number|'*' } }}
+ */
+ renderDifferentColspan(_item: any, row: number): any {
+ return (this.metadata[row] as ItemMetadata)?.attributes
+ ? this.metadata[row]
+ : (this.metadata[row] = { attributes: { 'data-row': row }, ...this.metadata[row] });
+ }
+
+ handleToggleSpans() {
+ const cell = this.metadata[3].columns![1];
+ if (cell.colspan === 1) {
+ cell.rowspan = 3;
+ cell.colspan = 2;
+ } else {
+ cell.rowspan = 5;
+ cell.colspan = 1;
+ }
+
+ // row index 3 can have a rowspan of up to 5 rows, so we need to invalidate from row 3 + 5 (-1 because of zero index)
+ // so: 3 + 5 - 1 => row indexes 3 to 7
+ this.angularGrid.slickGrid?.invalidateRows([3, 4, 5, 6, 7]);
+ this.angularGrid.slickGrid?.render();
+ }
+
+ handleScrollTo() {
+ // const args = event.detail && event.detail.args;
+ this.angularGrid.slickGrid?.scrollRowToTop(this.scrollToRow);
+ return false;
+ }
+
+ toggleSubTitle() {
+ this.showSubTitle = !this.showSubTitle;
+ const action = this.showSubTitle ? 'remove' : 'add';
+ document.querySelector('.subtitle')?.classList[action]('hidden');
+ }
+}
diff --git a/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts b/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts
index 4dee59392..0c215b718 100644
--- a/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts
+++ b/src/app/modules/angular-slickgrid/components/angular-slickgrid.component.ts
@@ -1052,6 +1052,7 @@ export class AngularSlickgridComponent implements AfterViewInit, On
}
}
+ // @deprecated @user `dataview.globalItemMetadataProvider.getRowMetadata`
// did the user add a colspan callback? If so, hook it into the DataView getItemMetadata
if (gridOptions?.colspanCallback && dataView && dataView.getItem && dataView.getItemMetadata) {
dataView.getItemMetadata = (rowNumber: number) => {
diff --git a/test/cypress/e2e/example43.cy.ts b/test/cypress/e2e/example43.cy.ts
new file mode 100644
index 000000000..343e68bcf
--- /dev/null
+++ b/test/cypress/e2e/example43.cy.ts
@@ -0,0 +1,406 @@
+describe('Example 43 - colspan/rowspan - Employees Timesheets', { retries: 0 }, () => {
+ const GRID_ROW_HEIGHT = 30;
+ const fullTitles = [
+ 'Employee ID',
+ 'Employee Name',
+ '9:00 AM',
+ '9:30 AM',
+ '10:00 AM',
+ '10:30 AM',
+ '11:00 AM',
+ '11:30 AM',
+ '12:00 PM',
+ '12:30 PM',
+ '1:00 PM',
+ '1:30 PM',
+ '2:00 PM',
+ '2:30 PM',
+ '3:00 PM',
+ '3:30 PM',
+ '4:00 PM',
+ '4:30 PM',
+ '5:00 PM',
+ ];
+
+ it('should display Example title', () => {
+ cy.visit(`${Cypress.config('baseUrl')}/rowspan-timesheets`);
+ cy.get('h2').should('contain', 'Example 43: colspan/rowspan - Employees Timesheets');
+ });
+
+ it('should have exact column titles', () => {
+ cy.get('.slick-header-columns')
+ .children()
+ .each(($child, index) => expect($child.text()).to.eq(fullTitles[index]));
+ });
+
+ it('should expect 1st column to be frozen (frozen)', () => {
+ cy.get('.grid-canvas-left .slick-cell.frozen').should('have.length', 10);
+ cy.get('.grid-canvas-right .slick-cell:not(.frozen)').should('have.length.above', 60);
+ });
+
+ describe('Spanning', () => {
+ it('should expect "Davolio", "Check Mail", and "Development" to all have rowspan of 2 in morning hours', () => {
+ cy.get(`[data-row=0] > .slick-cell.l1.r1.rowspan`).should('contain', 'Davolio');
+ cy.get(`[data-row=0] > .slick-cell.l1.r1.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2)
+ );
+
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.rowspan`).should('contain', 'Check Mail');
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2)
+ );
+
+ cy.get(`[data-row=8] > .slick-cell.l7.r9.rowspan`).should('contain', 'Development');
+ cy.get(`[data-row=8] > .slick-cell.l7.r9.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 2)
+ );
+ });
+
+ it('should expect "Lunch Break" to span over 3 columns and over all rows', () => {
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break');
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 10)
+ );
+ });
+
+ it('should expect a large "Development" section that spans over multiple columns & rows in the afternoon', () => {
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development');
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5)
+ );
+ });
+ });
+
+ describe('Basic Key Navigations', () => {
+ it('should start at Employee 10001, then type "End" key and expect to be in "Team Meeting" between 4:30-5:00pm', () => {
+ cy.get('[data-row=0] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l0.r0.active').should('contain', '10001');
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=0] > .slick-cell.l17.r18.active').should('contain', 'Team Meeting');
+ });
+
+ it('should start at Employee 10002, then type "End" key and also expect to be in "Team Meeting" between 4:30-5:00pm', () => {
+ cy.get('[data-row=1] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=1] > .slick-cell.l0.r0.active').should('contain', '10002');
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=0] > .slick-cell.l17.r18.active').should('contain', 'Team Meeting');
+ });
+
+ it('should start at Employee 10004, then type "ArrowRight" key twice and expect to be in "Check Mail" between 9:00-10:30am', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}');
+ cy.get('[data-row=2] > .slick-cell.l2.r4.active').should('contain', 'Check Mail');
+ });
+
+ it('should start at Employee 10004, then type "ArrowRight" key 4x times and expect to be in "Testing" between 11:00-1:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}');
+ cy.get('[data-row=3] > .slick-cell.l6.r9.active').should('contain', 'Testing');
+ });
+
+ it('should start at Employee 10004, then type "ArrowRight" key 5x times and expect to be in "Lunch Break"', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}');
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, then type "ArrowRight" key 6x times and expect to be in "Development" between 2:30-3:30pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}{rightarrow}');
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development');
+ });
+
+ // then rollback by going backward
+ it('should be on Employee 10004 row at previous "Development" cell, then type "ArrowLeft" key once and expect to be in "Lunch Break"', () => {
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).as('active_cell').click();
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development');
+ cy.get('@active_cell').type('{leftarrow}');
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key once and expect to be in "Conference" between 4:00-5:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).type('{leftarrow}');
+ cy.get(`[data-row=3] > .slick-cell.l16.r17.active`).should('contain', 'Conference');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 3x times and expect to be back to "Development" between 2:30-3:30pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).type('{leftarrow}{leftarrow}{leftarrow}');
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 4x times and expect to be back to "Lunch Break"', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{leftarrow}{leftarrow}{leftarrow}{leftarrow}');
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "ArrowLeft" key 5x times and expect to be back to "Testing" between 11:00-1:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{leftarrow}{leftarrow}{leftarrow}{leftarrow}{leftarrow}');
+ cy.get(`[data-row=3] > .slick-cell.l6.r9.active`).should('contain', 'Testing');
+ });
+
+ // going down
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key once and expect to be in "Support" between 9:30-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}');
+ cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key twice and expect to be in "Check Email" between 9:00-10:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}');
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 3x times and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}');
+ cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times and expect to be in "Support" between 10:00-11:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}');
+ cy.get(`[data-row=5] > .slick-cell.l4.r6.active`).should('contain', 'Support');
+ });
+
+ // going up from inverse
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" once and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}');
+ cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 2x times and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}');
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 3x times and expect to be in "Support" between 10:00-11:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}{uparrow}');
+ cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 4x times and expect to be back to same "Team Meeting"', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('@active_cell').type('{downarrow}{downarrow}{downarrow}{downarrow}{uparrow}{uparrow}{uparrow}{uparrow}');
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ });
+ });
+
+ describe('Grid Navigate Functions', () => {
+ it('should start at Employee 10004, then type "Navigate Right" twice and expect to be in "Check Mail" between 9:00-10:30am', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-test="goto-next"]').click().click();
+ cy.get('[data-row=2] > .slick-cell.l2.r4.active').should('contain', 'Check Mail');
+ });
+
+ it('should start at Employee 10004, then type "Navigate Right" 4x times and expect to be in "Testing" between 11:00-1:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('[data-test="goto-next"]').click().click().click().click();
+ cy.get('[data-row=3] > .slick-cell.l6.r9.active').should('contain', 'Testing');
+ });
+
+ it('should start at Employee 10004, then type "Navigate Right" 5x times and expect to be in "Lunch Break"', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('[data-test="goto-next"]').click().click().click().click().click();
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, then type "Navigate Right" 6x times and expect to be in "Development" between 2:30-3:30pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('[data-test="goto-next"]').click().click().click().click().click().click();
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development');
+ });
+
+ // then rollback by going backward
+ it('should be on Employee 10004 row at previous "Development" cell, then type "Navigate Left" once and expect to be in "Lunch Break"', () => {
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).as('active_cell').click();
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan`).should('contain', 'Development');
+ cy.get('[data-test="goto-prev"]').click();
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" once and expect to be in "Conference" between 4:00-5:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-prev"]').click();
+ cy.get(`[data-row=3] > .slick-cell.l16.r17.active`).should('contain', 'Conference');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 3x times and expect to be back to "Development" between 2:30-3:30pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-prev"]').click().click().click();
+ cy.get(`[data-row=1] > .slick-cell.l13.r14.rowspan.active`).should('contain', 'Development');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 4x times and expect to be back to "Lunch Break"', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-prev"]').click().click().click().click();
+ cy.get(`[data-row=0] > .slick-cell.l10.r12.rowspan.active`).should('contain', 'Lunch Break');
+ });
+
+ it('should start at Employee 10004, type "End" and be at "Team Meeting" at 5pm, then type "Navigate Left" 5x times and expect to be back to "Testing" between 11:00-1:00pm', () => {
+ cy.get('[data-row=3] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=3] > .slick-cell.l0.r0.active').should('contain', '10004');
+ cy.get('@active_cell').type('{end}');
+ cy.get(`[data-row=3] > .slick-cell.l18.r18.active`).as('active_cell').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-prev"]').click().click().click().click().click();
+ cy.get(`[data-row=3] > .slick-cell.l6.r9.active`).should('contain', 'Testing');
+ });
+
+ // going down
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key once and expect to be in "Support" between 9:30-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click();
+ cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key twice and expect to be in "Check Email" between 9:00-10:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click();
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 3x times and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click();
+ cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times and expect to be in "Support" between 10:00-11:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click().click();
+ cy.get(`[data-row=5] > .slick-cell.l4.r6.active`).should('contain', 'Support');
+ });
+
+ // going up from inverse
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" once and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click().click();
+ cy.get('[data-test="goto-up"]').click();
+ cy.get(`[data-row=4] > .slick-cell.l2.r5.active`).should('contain', 'Task Assign');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 2x times and expect to be in "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click().click();
+ cy.get('[data-test="goto-up"]').click().click();
+ cy.get(`[data-row=2] > .slick-cell.l2.r4.active`).should('contain', 'Check Mail');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 3x times and expect to be in "Support" between 10:00-11:30am', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click().click();
+ cy.get('[data-test="goto-up"]').click().click().click();
+ cy.get(`[data-row=1] > .slick-cell.l3.r5.active`).should('contain', 'Support');
+ });
+
+ it('should start at 10am "Team Meeting, then type "ArrowDown" key 4x times, then "ArrowUp" 4x times and expect to be back to same "Team Meeting"', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ cy.get('[data-test="goto-down"]').click().click().click().click();
+ cy.get('[data-test="goto-up"]').click().click().click().click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('contain', 'Team Meeting');
+ });
+ });
+
+ describe('Grid Editing', () => {
+ it('should toggle editing', () => {
+ cy.get('#isEditable').contains('false');
+ cy.get('[data-row=0] > .slick-cell.l4.r4').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active .editor-text').should('not.exist');
+
+ cy.get('[data-test=toggle-editing]').click();
+ cy.get('#isEditable').contains('true');
+
+ cy.get('[data-row=0] > .slick-cell.l4.r4').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active.editable .editor-text').should('exist');
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active.editable .editor-text').type('Team Meeting.xyz{enter}');
+ });
+
+ // going down
+ it('should have changed active cell to "Support" between 9:30-11:00am', () => {
+ cy.get('[data-row=1] > .slick-cell.l3.r5.active.editable .editor-text')
+ .invoke('val')
+ .then((text) => expect(text).to.eq('Support'));
+ cy.get('[data-row=1] > .slick-cell.l3.r5.active.editable .editor-text').type('Support.xyz{enter}');
+ });
+
+ it('should have changed active cell to "Check Email" between 9:00-10:30am', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r4.active.editable .editor-text')
+ .invoke('val')
+ .then((text) => expect(text).to.eq('Check Mail'));
+ cy.get('[data-row=2] > .slick-cell.l2.r4.active.editable .editor-text').type('Check Mail.xyz{enter}');
+ });
+
+ it('should have changed active cell to "Task Assign" between 9:00-11:00am', () => {
+ cy.get('[data-row=4] > .slick-cell.l2.r5.active.editable .editor-text')
+ .invoke('val')
+ .then((text) => expect(text).to.eq('Task Assign'));
+ cy.get('[data-row=4] > .slick-cell.l2.r5.active.editable .editor-text').type('Task Assign.xyz{enter}');
+ });
+
+ it('should have changed active cell to "Support" between 10:00-11:30am', () => {
+ cy.get('[data-row=5] > .slick-cell.l4.r6.active.editable .editor-text')
+ .invoke('val')
+ .then((text) => expect(text).to.eq('Support'));
+ cy.get('[data-row=5] > .slick-cell.l4.r6.active.editable .editor-text').type('Support.xyz{enter}');
+ });
+
+ it('should have changed active cell to "Testing" and cancel editing when typing "Escape" key', () => {
+ cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text')
+ .invoke('val')
+ .then((text) => expect(text).to.eq('Testing'));
+ cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text').type('{esc}');
+ cy.get('[data-row=6] > .slick-cell.l4.r4.active.editable .editor-text').should('not.exist');
+ });
+ });
+});
diff --git a/test/cypress/e2e/example44.cy.ts b/test/cypress/e2e/example44.cy.ts
new file mode 100644
index 000000000..60ea88d42
--- /dev/null
+++ b/test/cypress/e2e/example44.cy.ts
@@ -0,0 +1,463 @@
+describe('Example 44 - Column & Row Span', { retries: 0 }, () => {
+ const GRID_ROW_HEIGHT = 30;
+ const fullTitles = [
+ 'Title',
+ 'Revenue Growth',
+ 'Pricing Policy',
+ 'Policy Index',
+ 'Expense Control',
+ 'Excess Cash',
+ 'Net Trade Cycle',
+ 'Cost of Capital',
+ 'Revenue Growth',
+ 'Pricing Policy',
+ 'Policy Index',
+ 'Expense Control',
+ 'Excess Cash',
+ 'Net Trade Cycle',
+ 'Cost of Capital',
+ 'Revenue Growth',
+ 'Pricing Policy',
+ 'Policy Index',
+ 'Expense Control',
+ 'Excess Cash',
+ 'Net Trade Cycle',
+ 'Cost of Capital',
+ ];
+
+ it('should display Example title', () => {
+ cy.visit(`${Cypress.config('baseUrl')}/rowspan-large`);
+ cy.get('h2').should('contain', 'Example 44: colspan/rowspan with large dataset');
+ });
+
+ it('should have exact column titles', () => {
+ cy.get('.slick-header-columns')
+ .children()
+ .each(($child, index) => expect($child.text()).to.eq(fullTitles[index]));
+ });
+
+ it('should drag Title column to swap with 2nd column "Revenue Growth" in the grid and expect rowspan to stay at same position with Task 0 to spread instead', () => {
+ const expectedTitles = ['Revenue Growth', 'Title', 'Pricing Policy'];
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+
+ cy.get('.slick-header-columns').children('.slick-header-column:nth(0)').contains('Title').drag('.slick-header-column:nth(1)');
+ cy.get('.slick-header-column:nth(0)').contains('Revenue Growth');
+ cy.get('.slick-header-column:nth(1)').contains('Title');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1`).should('contain', 'Task 0');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l1.r1`).should('not.exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1`).should('contain', 'Task 3');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+
+ cy.get('.slick-header-columns')
+ .children()
+ .each(($child, index) => {
+ if (index < expectedTitles.length) {
+ expect($child.text()).to.eq(expectedTitles[index]);
+ }
+ });
+ });
+
+ it('should drag back Title column to reswap with 2nd column "Revenue Growth" in the grid and expect rowspan to stay at same position with Revenue Growth to now spread', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+ cy.get('.slick-header-columns')
+ .children('.slick-header-column:nth(0)')
+ .contains('Revenue Growth')
+ .drag('.slick-header-column:nth(1)');
+ cy.get('.slick-header-column:nth(0)').contains('Title');
+ cy.get('.slick-header-column:nth(1)').contains('Revenue Growth');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 1}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 1');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 2');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l0.r0`).should('not.exist');
+
+ const expectedTitles = ['Title', 'Revenue Growth', 'Pricing Policy'];
+ cy.get('.slick-header-columns')
+ .children()
+ .each(($child, index) => {
+ if (index < expectedTitles.length) {
+ expect($child.text()).to.eq(expectedTitles[index]);
+ }
+ });
+ });
+
+ describe('spanning', () => {
+ it('should expect first row to be regular rows without any spanning', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0');
+
+ for (let i = 2; i <= 6; i++) {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l${i}.r${i}`).should('exist');
+ }
+ });
+
+ it('should expect 1st row, second cell to span (rowspan) across 3 rows', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 0');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 0}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => {
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3);
+ });
+
+ for (let i = 2; i <= 14; i++) {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 1}px;"] > .slick-cell:nth(${i})`).contains(/\d+$/); // use regexp to make sure it's a number
+ }
+ });
+
+ it('should expect 3rd row first cell to span (rowspan) across 3 rows', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should('contain', 'Task 2');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell.l0.r0.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+
+ for (let i = 2; i <= 5; i++) {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 2}px;"] > .slick-cell:nth(${i})`).contains(/\d+$/);
+ }
+ });
+
+ it('should expect 4th row to have 2 sections (blue, green) spanning across 3 rows (rowspan) and 2 columns (colspan)', () => {
+ // blue rowspan section
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5)
+ );
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l2.r2`)
+ .should('exist')
+ .contains(/\d+$/);
+
+ // green colspan/rowspan section
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l3.r7`)
+ .should('exist')
+ .contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l8.r8`)
+ .should('exist')
+ .contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l9.r9`)
+ .should('exist')
+ .contains(/\d+$/);
+ });
+
+ it('should click on "Toggle blue cell colspan..." and expect colspan to widen from 1 column to 2 columns and from 5 rows to 3 rowspan', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should('exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r1.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 5)
+ );
+
+ cy.get('[data-test="toggleSpans"]').click();
+ cy.get('.slick-cell.l1.r1.rowspan').should('exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell.l1.r2.rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+ });
+
+ it('should expect Task 8 on 2nd column to have rowspan spanning 80 cells', () => {
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 8');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => {
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 80);
+ });
+ });
+
+ it('should scroll to the right and still expect spans without any extra texts', () => {
+ cy.get('.slick-viewport-top.slick-viewport-left').scrollTo(400, 0).wait(10);
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1)`).contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(0).rowspan`).should('exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1).rowspan`).should('exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 3}px;"] > .slick-cell:nth(1).rowspan`).should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+
+ // next rows are regular cells
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 4}px;"] > .slick-cell.l3.r3`).should('not.exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 4}px;"] > .slick-cell.l4.r4`).should('not.exist');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 5}px;"] > .slick-cell.l3.r3`).should('not.exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 5}px;"] > .slick-cell.l3.r3`).should('not.exist');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 6}px;"] > .slick-cell.l4.r4`).should('exist');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 6}px;"] > .slick-cell.l4.r4`).should('exist');
+ });
+
+ it('should scroll back to left and expect Task 8 to have 2 different spans (Revenue Grow: rowspan=80, Policy Index: rowspan=2000,colspan=2)', () => {
+ cy.get('.slick-viewport-top.slick-viewport-left').scrollTo(0, 0).wait(10);
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 8');
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1).rowspan`).should(($el) => {
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 80);
+ });
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(1)`).contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell:nth(2)`).contains(/\d+$/);
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 8}px;"] > .slick-cell.l3.r4`).should('exist');
+
+ cy.get(`[style*="top: ${GRID_ROW_HEIGHT * 9}px;"] > .slick-cell.l0.r0`).should('contain', 'Task 9');
+ });
+
+ it('should scroll to row 85 and still expect 3 spans in the screen, "Revenue Growth" and "Policy Index" spans', () => {
+ cy.get('[data-test="clearScrollTo"]').click();
+ cy.get('[data-test="nbrows"]').type('{backspace}85');
+ cy.get('[data-test="scrollToBtn"]').click();
+
+ // left dashed rowspan "Revenue Growth"
+ cy.get(`[data-row=85] > .slick-cell.l0.r0`).should('contain', 'Task 85');
+ cy.get(`[data-row=85] > .slick-cell.l2.r2`).contains(/\d+$/);
+
+ // rowspan middle (yellowish) "Policy Index"
+ cy.get(`[data-row=88] > .slick-cell.l0.r0`).should('contain', 'Task 88');
+ cy.get(`[data-row=88] > .slick-cell.l1.r1`).should('exist');
+ });
+
+ it('should scroll to the end of the grid and still expect "PolicyIndex" column to span across 2 columns and rows until the end of the grid', () => {
+ cy.get('[data-test="clearScrollTo"]').click();
+ cy.get('[data-test="nbrows"]').type('{backspace}490');
+ cy.get('[data-test="scrollToBtn"]').click();
+
+ cy.get(`[data-row=485] > .slick-cell.l0.r0`).should('contain', 'Task 485');
+
+ cy.get(`[data-row=499] > .slick-cell.l0.r0`).should('contain', 'Task 499');
+ cy.get(`[data-row=499] > .slick-cell.l1.r1`).should('exist');
+ cy.get(`[data-row=499] > .slick-cell.l2.r2`).should('exist');
+ cy.get(`[data-row=499] > .slick-cell.l5.r5`).should('exist');
+ });
+
+ it('should load 5K data and expect 8.3 rowspan row height to increase/decrease when data changes from 500 to 5K back to 500', () => {
+ cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (500 - 8))
+ );
+
+ cy.get('[data-test="add-5k-rows-btn"]').click();
+ cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (5000 - 8))
+ );
+
+ cy.get('[data-test="add-500-rows-btn"]').click();
+ cy.get('[data-row=8] .slick-cell.l3.r4').should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * (500 - 8))
+ );
+ });
+ });
+
+ describe('Basic Key Navigations', () => {
+ it('should scroll back to top', () => {
+ cy.get('[data-test="clearScrollTo"]').click();
+ cy.get('[data-test="nbrows"]').type('0');
+ cy.get('[data-test="scrollToBtn"]').click();
+ });
+
+ it('should start at Task 6 on PolicyIndex column, then type "Arrow Up" key and expect active cell to become the green section in the middle', () => {
+ cy.get('[data-row=6] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=6] > .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{uparrow}');
+ cy.get('[data-row=3] > .slick-cell.l1.r2.active').should('have.length', 1);
+ });
+
+ it('should start at Task 6 on PricingPolicy column, then type "Arrow Left" key and expect active cell to become the green section in the middle', () => {
+ cy.get('[data-row=6] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=6] > .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('[data-test="toggleSpans"]').click();
+ cy.get('@active_cell').type('{leftarrow}');
+ cy.get('[data-row=3] .slick-cell.l1.r1.active').should('have.length', 1);
+ });
+
+ it('should start at Task 5 on Task 5 column, then type "Arrow Right" key 3x times and expect active cell to become the wide green section in the middle', () => {
+ cy.get('[data-row=5] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}');
+ cy.get('[data-row=5] .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('[data-row=5] .slick-cell.l2.r2.active').type('{rightarrow}');
+ cy.get('[data-row=3] .slick-cell.l3.r7.active').should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+ });
+
+ it('should start at Task 2 on PricingPolicy column, then type "Arrow Left" key and expect active cell to become the dashed section beside Task 0-3 on RevenueGrowth column', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{leftarrow}');
+ cy.get('[data-row=0] > .slick-cell.l1.r1.active').should('have.length', 1);
+ });
+
+ it('should start at Task 2 on PricingPolicy column, then type "Arrow Left" key twice and expect active cell to become Task 2 cell', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{leftarrow}{leftarrow}');
+ cy.get('[data-row=2] > .slick-cell.l0.r0.active').contains('Task 2');
+ cy.get('[data-row=2] > .slick-cell.l0.r0.active').should('have.length', 1);
+ });
+
+ it('should start at Task 2 on PricingPolicy column, then type "Home" key and expect active cell to become Task 2 cell', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=2] .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{home}');
+ cy.get('[data-row=2] .slick-cell.l0.r0.active').contains('Task 2');
+ cy.get('[data-row=2] .slick-cell.l0.r0.active').should('have.length', 1);
+ });
+
+ it('should start at Task 2 on PricingPolicy column, then type "End" key and expect active cell to become Task 2 cell', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=2] .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=2] .slick-cell.l21.r21.active').should('have.length', 1);
+ });
+
+ it('should start at RevenueGrowth column on first dashed cell, then type "Ctrl+End" then "Ctrl+Home" keys and expect active cell to go to bottom/top of grid on same column', () => {
+ cy.get('[data-row=0] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l2.r2.active').should('have.length', 1);
+ cy.get('@active_cell').type('{ctrl}{end}', { release: false });
+ cy.get('[data-row=499] > .slick-cell.l21.r21.active').should('have.length', 1);
+ cy.get('[data-row=499] > .slick-cell.l21.r21.active').type('{ctrl}{home}', { release: false });
+ cy.get('[data-row=0] .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('[data-row=0] .slick-cell.l1.r1').should(($el) =>
+ expect(parseInt(`${$el.outerHeight()}`, 10)).to.eq(GRID_ROW_HEIGHT * 3)
+ );
+ });
+
+ it('should start at first row on PolicyIndex column, then type "Ctrl+DownArrow" keys and expect active cell to become yellowish section', () => {
+ cy.get('[data-row=0] > .slick-cell.l3.r3').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l3.r3.active').should('have.length', 1);
+ cy.get('@active_cell').type('{ctrl}{downarrow}', { release: false });
+ cy.get('[data-row=8] > .slick-cell.l3.r4.active').should('have.length', 1);
+ });
+
+ it('should start at first row on ExpenseControl column, then type "Ctrl+DownArrow" keys and expect active cell to become the cell just above the yellowish section', () => {
+ cy.get('[data-row=0] > .slick-cell.l4.r4').as('active_cell').click();
+ cy.get('[data-row=0] > .slick-cell.l4.r4.active').should('have.length', 1);
+ cy.get('@active_cell').type('{ctrl}{downarrow}', { release: false });
+ cy.get('[data-row=7] .slick-cell.l4.r4.active').should('have.length', 1);
+ });
+
+ it('should start at Task 13, type "End" key and expect active cell to be the last span cell', () => {
+ cy.get('[data-row=13] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=13] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=13] > .slick-cell.l21.r21.active').should('have.length', 1);
+ });
+
+ it('should go to Task 13 last cell, type "Home" key and expect active cell to become Task 13', () => {
+ cy.get('[data-row=13] > .slick-cell.l21.r21').as('active_cell').click();
+ cy.get('[data-row=13] > .slick-cell.l21.r21.active').should('have.length', 1);
+ cy.get('@active_cell').type('{home}');
+ cy.get('[data-row=13] > .slick-cell.l0.r0.active').should('have.length', 1);
+ });
+
+ it('should start at Task 15, type "End" key and expect active cell to be on the last orange span cell', () => {
+ cy.get('[data-row=15] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=15] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=15] > .slick-cell.l18.r21.active').should('have.length', 1);
+ cy.get('[data-row=15] > .slick-cell.l18.r21.active').type('{home}');
+ });
+
+ it('should start at Task 17, type "End" key and expect active cell to be on the last orange span cell', () => {
+ cy.get('[data-row=17] > .slick-cell.l0.r0').as('active_cell').click();
+ cy.get('[data-row=17] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{end}');
+ cy.get('[data-row=15] > .slick-cell.l18.r21.active').should('have.length', 1);
+ cy.get('[data-row=15] > .slick-cell.l18.r21.active').type('{home}');
+ });
+
+ it('should start at Task 5, type "ArrowRight" key 3x times and expect active cell to be at cell 3.3', () => {
+ cy.get('[data-row=15] > .slick-cell.l0.r0').type('{ctrl}{uparrow}');
+ cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click();
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}');
+ cy.get('[data-row=3] > .slick-cell.l3.r7.active').should('have.length', 1);
+ });
+
+ it('should start at Task 5, type "ArrowRight" key 4x times and expect active cell to be at cell 5.8', () => {
+ cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click();
+ cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}');
+ cy.get('[data-row=5] > .slick-cell.l8.r8.active').should('have.length', 1);
+ });
+
+ it('should start at Task 5, type "ArrowRight" key 4x times, then "ArrowLeft" 4x times and be back at Task 5', () => {
+ cy.get('[data-row=5] > .slick-cell.l0.r0').contains('Task 5').as('active_cell').click();
+ cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1);
+ cy.get('@active_cell').type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}{leftarrow}{leftarrow}{leftarrow}{leftarrow}');
+ cy.get('[data-row=5] > .slick-cell.l0.r0.active').should('have.length', 1);
+ });
+
+ it('should start at Task 2 on Pricing Policy column and type "PageDown" key 3x times and be on Task 59 on same column', () => {
+ cy.get('[data-row=2] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('@active_cell').type('{pagedown}{pagedown}{pagedown}');
+ cy.get('[data-row=59] > .slick-cell.l2.r2.active').should('have.length', 1);
+ });
+
+ it('should start at Task 59 on Pricing Policy column and type "PageUp" key 3x times and be back to Task 2 on same column', () => {
+ cy.get('[data-row=59] > .slick-cell.l2.r2').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}{pageup}{pageup}');
+ cy.get('[data-row=2] > .slick-cell.l2.r2.active').should('have.length', 1);
+ });
+
+ it('should start at Task 0 on Policy Index column and type "PageDown" key 2x times but expect active cell to stay on initial cell but still scroll down around Task 40', () => {
+ cy.get('[data-row=0] > .slick-cell.l3.r3').as('active_cell').click();
+ cy.get('@active_cell').type('{pagedown}{pagedown}');
+ cy.get('[data-row=0] > .slick-cell.l3.r3.active').should('have.length', 1);
+ cy.get('[data-row=40]').should('be.visible');
+ });
+
+ it('should start at Task 1 on Excess Cash column and type "PageDown" key 4x times and be on Task 77 on same column', () => {
+ cy.get('[data-row=0] > .slick-cell.l3.r3.active').type('{ctrl}{uparrow}');
+ cy.get('[data-row=1] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pagedown}{pagedown}{pagedown}{pagedown}');
+ cy.get('[data-row=77] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+
+ it('should start at Task 77 on Excess Cash column and type "PageDown" key 4x times and be on Task 105 on same column', () => {
+ cy.get('[data-row=77] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pagedown}');
+ cy.get('[data-row=105] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+
+ it('should start at Task 105 on Excess Cash column and type "PageUp" key once and be on Task 85 on same column', () => {
+ cy.get('[data-row=105] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}');
+ cy.get('[data-row=85] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+
+ it('should start at Task 85 on Excess Cash column and type "PageUp" key once and be on Task 66 on same column', () => {
+ cy.get('[data-row=85] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}');
+ cy.get('[data-row=66] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+
+ it('should start at Task 66 on Excess Cash column and type "PageUp" key 3x times and be on Task 9 on same column', () => {
+ cy.get('[data-row=66] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}{pageup}{pageup}');
+ cy.get('[data-row=9] > .slick-cell.l5.r5.active').should('have.length', 1).type('{pageup}');
+ });
+
+ it('should start at Task 0 on Revenue Growth column and type "PageDown" key once and be on Task 88 on same column', () => {
+ cy.get('[data-row=0] > .slick-cell.l1.r1').as('active_cell').click();
+ cy.get('@active_cell').type('{pagedown}');
+ cy.get('[data-row=88] > .slick-cell.l1.r1.active').should('have.length', 1);
+ });
+
+ it('should start at Task 88 on Revenue Growth column and type "PageUp" key once and be on Task 8 on same column', () => {
+ cy.get('[data-row=88] > .slick-cell.l1.r1').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}');
+ cy.get('[data-row=8] > .slick-cell.l1.r1.active').should('have.length', 1);
+ });
+
+ it('should start at Task 9 on Excess Cash column and type "PageUp" key once and be on Task 0 on same column', () => {
+ cy.get('[data-row=9] > .slick-cell.l5.r5').as('active_cell').click();
+ cy.get('@active_cell').type('{pageup}');
+ cy.get('[data-row=0] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+
+ it('should start at Task 9 on Excess Cash column and type "PageDown" key 26x times and be on last Task 499 on same column', () => {
+ cy.get('[data-row=9] > .slick-cell.l5.r5').as('active_cell').click();
+ let command = '';
+ for (let i = 1; i <= 26; i++) {
+ command += '{pagedown}';
+ }
+ cy.get('@active_cell').type(command);
+ cy.get('[data-row=499] > .slick-cell.l5.r5.active').should('have.length', 1);
+ });
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index c43b49154..8c971299a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1883,6 +1883,17 @@
ansi-escapes "^4.3.2"
yoctocolors-cjs "^2.1.2"
+"@inquirer/checkbox@^4.0.6":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.0.6.tgz#e71401a7e1900332f17ed68c172a89fe20225f49"
+ integrity sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/figures" "^1.0.9"
+ "@inquirer/type" "^3.0.2"
+ ansi-escapes "^4.3.2"
+ yoctocolors-cjs "^2.1.2"
+
"@inquirer/confirm@3.1.22", "@inquirer/confirm@^3.1.22":
version "3.1.22"
resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037"
@@ -1891,6 +1902,29 @@
"@inquirer/core" "^9.0.10"
"@inquirer/type" "^1.5.2"
+"@inquirer/confirm@^5.1.3":
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.3.tgz#c1ad57663f54758981811ccb86f823072ddf5c1a"
+ integrity sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+
+"@inquirer/core@^10.1.2", "@inquirer/core@^10.1.4":
+ version "10.1.4"
+ resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.4.tgz#02394e68d894021935caca0d10fc68fd4f3a3ead"
+ integrity sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==
+ dependencies:
+ "@inquirer/figures" "^1.0.9"
+ "@inquirer/type" "^3.0.2"
+ ansi-escapes "^4.3.2"
+ cli-width "^4.1.0"
+ mute-stream "^2.0.0"
+ signal-exit "^4.1.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^6.2.0"
+ yoctocolors-cjs "^2.1.2"
+
"@inquirer/core@^9.0.10":
version "9.0.10"
resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.10.tgz#4270191e2ad3bea6223530a093dd9479bcbc7dd0"
@@ -1919,6 +1953,15 @@
"@inquirer/type" "^1.5.2"
external-editor "^3.1.0"
+"@inquirer/editor@^4.2.3":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.3.tgz#0858adcd07d9607b0614778eaa5ce8a83871c367"
+ integrity sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+ external-editor "^3.1.0"
+
"@inquirer/expand@^2.1.22":
version "2.1.22"
resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-2.1.22.tgz#7593e93a516a49434629c41f3738479c8234d2df"
@@ -1928,11 +1971,25 @@
"@inquirer/type" "^1.5.2"
yoctocolors-cjs "^2.1.2"
-"@inquirer/figures@^1.0.3", "@inquirer/figures@^1.0.5":
+"@inquirer/expand@^4.0.6":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.6.tgz#8676e6049c6114fb306df23358375bd84fa1c92c"
+ integrity sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+ yoctocolors-cjs "^2.1.2"
+
+"@inquirer/figures@^1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790"
integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==
+"@inquirer/figures@^1.0.9":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.9.tgz#9d8128f8274cde4ca009ca8547337cab3f37a4a3"
+ integrity sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==
+
"@inquirer/input@^2.2.9":
version "2.2.9"
resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.2.9.tgz#08fdf9a48e4f6fc64c2d508b9d10afac843f9bd8"
@@ -1941,6 +1998,14 @@
"@inquirer/core" "^9.0.10"
"@inquirer/type" "^1.5.2"
+"@inquirer/input@^4.1.3":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.3.tgz#fa0ea9a392b2ec4ddd763c504d0b0c8839a48fe2"
+ integrity sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+
"@inquirer/number@^1.0.10":
version "1.0.10"
resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-1.0.10.tgz#ac2b440ca57b5de5a231e4898c12d4453683c055"
@@ -1949,6 +2014,14 @@
"@inquirer/core" "^9.0.10"
"@inquirer/type" "^1.5.2"
+"@inquirer/number@^3.0.6":
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.6.tgz#19bba46725df194bdd907762cf432a37e053b300"
+ integrity sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+
"@inquirer/password@^2.1.22":
version "2.1.22"
resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.1.22.tgz#ec7ee5709923cf285b3e0ae53eed4fdc3c05b422"
@@ -1958,6 +2031,15 @@
"@inquirer/type" "^1.5.2"
ansi-escapes "^4.3.2"
+"@inquirer/password@^4.0.6":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.6.tgz#4bbee12fe7cd1d37435401098c296ddc4586861b"
+ integrity sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+ ansi-escapes "^4.3.2"
+
"@inquirer/prompts@5.3.8":
version "5.3.8"
resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-5.3.8.tgz#f394050d95076c2f1b046be324f06f619b257c3e"
@@ -1974,6 +2056,22 @@
"@inquirer/search" "^1.0.7"
"@inquirer/select" "^2.4.7"
+"@inquirer/prompts@^7.2.1":
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.2.3.tgz#8a0d7cb5310d429bf815d25bbff108375fc6315b"
+ integrity sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q==
+ dependencies:
+ "@inquirer/checkbox" "^4.0.6"
+ "@inquirer/confirm" "^5.1.3"
+ "@inquirer/editor" "^4.2.3"
+ "@inquirer/expand" "^4.0.6"
+ "@inquirer/input" "^4.1.3"
+ "@inquirer/number" "^3.0.6"
+ "@inquirer/password" "^4.0.6"
+ "@inquirer/rawlist" "^4.0.6"
+ "@inquirer/search" "^3.0.6"
+ "@inquirer/select" "^4.0.6"
+
"@inquirer/rawlist@^2.2.4":
version "2.2.4"
resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-2.2.4.tgz#73d5d4fafa2ca012e6cfb9eb1d8ddf33bab2dde0"
@@ -1983,6 +2081,15 @@
"@inquirer/type" "^1.5.2"
yoctocolors-cjs "^2.1.2"
+"@inquirer/rawlist@^4.0.6":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.0.6.tgz#b55d5828d850f07bc6792bbce3b2a963e33b3ef5"
+ integrity sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/type" "^3.0.2"
+ yoctocolors-cjs "^2.1.2"
+
"@inquirer/search@^1.0.7":
version "1.0.7"
resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-1.0.7.tgz#72ab9ccfb57f05dd81a8b2df26214588e048be18"
@@ -1993,6 +2100,16 @@
"@inquirer/type" "^1.5.2"
yoctocolors-cjs "^2.1.2"
+"@inquirer/search@^3.0.6":
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.6.tgz#5537e3f46b7d31ab65ca22b831cf546f88db1d5b"
+ integrity sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/figures" "^1.0.9"
+ "@inquirer/type" "^3.0.2"
+ yoctocolors-cjs "^2.1.2"
+
"@inquirer/select@^2.4.7":
version "2.4.7"
resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.4.7.tgz#6a23742b4f76d228186dfd42571d973def378ffa"
@@ -2004,6 +2121,17 @@
ansi-escapes "^4.3.2"
yoctocolors-cjs "^2.1.2"
+"@inquirer/select@^4.0.6":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.0.6.tgz#3062c02c82f7bbe238972672def6d8394732bb2b"
+ integrity sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==
+ dependencies:
+ "@inquirer/core" "^10.1.4"
+ "@inquirer/figures" "^1.0.9"
+ "@inquirer/type" "^3.0.2"
+ ansi-escapes "^4.3.2"
+ yoctocolors-cjs "^2.1.2"
+
"@inquirer/type@^1.5.1", "@inquirer/type@^1.5.2":
version "1.5.2"
resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.2.tgz#15f5e4a4dae02c4203650cb07c8a000cdd423939"
@@ -2011,6 +2139,11 @@
dependencies:
mute-stream "^1.0.0"
+"@inquirer/type@^3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.2.tgz#baff9f8d70947181deb36772cd9a5b6876d3e60c"
+ integrity sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==
+
"@isaacs/cliui@^8.0.2":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
@@ -2497,100 +2630,99 @@
proc-log "^4.0.0"
which "^4.0.0"
-"@octokit/auth-token@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7"
- integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==
-
-"@octokit/core@^5.0.2":
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea"
- integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==
- dependencies:
- "@octokit/auth-token" "^4.0.0"
- "@octokit/graphql" "^7.1.0"
- "@octokit/request" "^8.3.1"
- "@octokit/request-error" "^5.1.0"
- "@octokit/types" "^13.0.0"
- before-after-hook "^2.2.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/endpoint@^9.0.1":
- version "9.0.5"
- resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44"
- integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==
- dependencies:
- "@octokit/types" "^13.1.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/graphql@^7.1.0":
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0"
- integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==
- dependencies:
- "@octokit/request" "^8.3.0"
- "@octokit/types" "^13.0.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/openapi-types@^22.2.0":
- version "22.2.0"
- resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e"
- integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==
-
-"@octokit/plugin-paginate-rest@11.3.1":
- version "11.3.1"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364"
- integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==
- dependencies:
- "@octokit/types" "^13.5.0"
-
-"@octokit/plugin-request-log@^4.0.0":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958"
- integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==
+"@octokit/auth-token@^5.0.0":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07"
+ integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==
+
+"@octokit/core@^6.1.2":
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.3.tgz#280d3bb66c702297baac0a202219dd66611286e4"
+ integrity sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==
+ dependencies:
+ "@octokit/auth-token" "^5.0.0"
+ "@octokit/graphql" "^8.1.2"
+ "@octokit/request" "^9.1.4"
+ "@octokit/request-error" "^6.1.6"
+ "@octokit/types" "^13.6.2"
+ before-after-hook "^3.0.2"
+ universal-user-agent "^7.0.0"
+
+"@octokit/endpoint@^10.0.0":
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.2.tgz#d38e727e2a64287114fdaa1eb9cd7c81c09460df"
+ integrity sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==
+ dependencies:
+ "@octokit/types" "^13.6.2"
+ universal-user-agent "^7.0.2"
+
+"@octokit/graphql@^8.1.2":
+ version "8.1.2"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.2.tgz#98b9072b22e0471b782d52ed0da08e2b2de52b17"
+ integrity sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==
+ dependencies:
+ "@octokit/request" "^9.1.4"
+ "@octokit/types" "^13.6.2"
+ universal-user-agent "^7.0.0"
+
+"@octokit/openapi-types@^23.0.1":
+ version "23.0.1"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e"
+ integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==
+
+"@octokit/plugin-paginate-rest@^11.0.0":
+ version "11.4.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.0.tgz#a9c3347113d793e48a014f0aa549eada00de7c9a"
+ integrity sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==
+ dependencies:
+ "@octokit/types" "^13.7.0"
+
+"@octokit/plugin-request-log@^5.3.1":
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz#ccb75d9705de769b2aa82bcd105cc96eb0c00f69"
+ integrity sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==
-"@octokit/plugin-rest-endpoint-methods@13.2.2":
- version "13.2.2"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638"
- integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==
+"@octokit/plugin-rest-endpoint-methods@^13.0.0":
+ version "13.3.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.0.tgz#ee18b9d6364bbae1d86e960d5576b555b41d2079"
+ integrity sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ==
dependencies:
- "@octokit/types" "^13.5.0"
+ "@octokit/types" "^13.7.0"
-"@octokit/request-error@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30"
- integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==
+"@octokit/request-error@^6.0.1", "@octokit/request-error@^6.1.6":
+ version "6.1.6"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.6.tgz#5f42c7894e7c3ab47c63aa3241f78cee8a826644"
+ integrity sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==
dependencies:
- "@octokit/types" "^13.1.0"
- deprecation "^2.0.0"
- once "^1.4.0"
+ "@octokit/types" "^13.6.2"
-"@octokit/request@^8.3.0", "@octokit/request@^8.3.1":
- version "8.4.0"
- resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974"
- integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==
+"@octokit/request@^9.1.4":
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.2.0.tgz#21aa1e72ff645f5b99ccf4a590cc33c4578bb356"
+ integrity sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw==
dependencies:
- "@octokit/endpoint" "^9.0.1"
- "@octokit/request-error" "^5.1.0"
- "@octokit/types" "^13.1.0"
- universal-user-agent "^6.0.0"
+ "@octokit/endpoint" "^10.0.0"
+ "@octokit/request-error" "^6.0.1"
+ "@octokit/types" "^13.6.2"
+ fast-content-type-parse "^2.0.0"
+ universal-user-agent "^7.0.2"
-"@octokit/rest@20.1.1":
- version "20.1.1"
- resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95"
- integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==
+"@octokit/rest@21.0.2":
+ version "21.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972"
+ integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==
dependencies:
- "@octokit/core" "^5.0.2"
- "@octokit/plugin-paginate-rest" "11.3.1"
- "@octokit/plugin-request-log" "^4.0.0"
- "@octokit/plugin-rest-endpoint-methods" "13.2.2"
+ "@octokit/core" "^6.1.2"
+ "@octokit/plugin-paginate-rest" "^11.0.0"
+ "@octokit/plugin-request-log" "^5.3.1"
+ "@octokit/plugin-rest-endpoint-methods" "^13.0.0"
-"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0":
- version "13.5.0"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883"
- integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==
+"@octokit/types@^13.6.2", "@octokit/types@^13.7.0":
+ version "13.7.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.7.0.tgz#22d0e26a8c9f53599bfb907213d8ccde547f36aa"
+ integrity sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA==
dependencies:
- "@octokit/openapi-types" "^22.2.0"
+ "@octokit/openapi-types" "^23.0.1"
"@parcel/watcher-android-arm64@2.4.1":
version "2.4.1"
@@ -2706,10 +2838,10 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
-"@release-it/conventional-changelog@^9.0.4":
- version "9.0.4"
- resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-9.0.4.tgz#d9b19b77f3ce1cd4872938cbc4ca32013b7ac87f"
- integrity sha512-eSZVATX2qiyxzpXdIVNczxTGR+uD4lG/ZEfDDYBJ8vKIj6fKp+eYicIS8Ff/eL3bA9XiQTmllKqxPRzmz9d45w==
+"@release-it/conventional-changelog@^10.0.0":
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/@release-it/conventional-changelog/-/conventional-changelog-10.0.0.tgz#25a9b4785d59ea1c2dce9acafc3c0cc86552826f"
+ integrity sha512-49qf9phGmPUIGpY2kwfgehs9en1znbPv2zdNn1WMLAH9DtHUh4m6KNSB+mLFGAMUhv24JhsA8ruYRYgluc2UJw==
dependencies:
concat-stream "^2.0.0"
conventional-changelog "^6.0.0"
@@ -2923,6 +3055,11 @@
"@angular-devkit/schematics" "18.2.12"
jsonc-parser "3.3.1"
+"@sec-ant/readable-stream@^0.4.1":
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c"
+ integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==
+
"@sigstore/bundle@^2.3.2":
version "2.3.2"
resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e"
@@ -2979,6 +3116,11 @@
resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958"
integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
+"@sindresorhus/merge-streams@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz#abb11d99aeb6d27f1b563c38147a72d50058e339"
+ integrity sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==
+
"@sinonjs/commons@^3.0.0":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd"
@@ -2993,21 +3135,21 @@
dependencies:
"@sinonjs/commons" "^3.0.0"
-"@slickgrid-universal/binding@~5.10.2":
- version "5.10.2"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/binding/-/binding-5.10.2.tgz#3f5515c2445bbc891fa5bde61b08ce62591d48a4"
- integrity sha512-Hfn6ooFE28W9JOCLAOPDqlnrBJ1bfIkkXmV04bToCZk3SyKhUr6uYkmJMaMzs3S4U3a2aEe7srILPpLjfOmfmw==
+"@slickgrid-universal/binding@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/binding/-/binding-5.12.0.tgz#57e0157e1e8debf85a53f660c82411752d055a6f"
+ integrity sha512-A4RNtlSkpAg7+lmtrUF0TVYM+Li/p9WxX7IHC8McqCA/4T412Twit+/cNeohTuje8P/zo5cpHpQlbciuh9HsbA==
-"@slickgrid-universal/common@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/common/-/common-5.11.0.tgz#9708e732b1b8080ac7feb49f6eaacd28dcd0b77b"
- integrity sha512-+lNvysOFL/CD++m47KcixYlkRG4ywgwwAqIW7mFWHk4m5ZikQst3i8PPPK2GZo+U4r370Jb/F768dtvr9nALHQ==
+"@slickgrid-universal/common@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/common/-/common-5.12.0.tgz#77fe6864168c1f7022af0f84404134379e430f7b"
+ integrity sha512-u3DX6sIkLeqaKotyaRM9gVGqKEP2uum0vjvblOH78vy8wqyST4DK3a4m5p9CgHypuRBnMnNsd6NdmjuKjsj74A==
dependencies:
"@excel-builder-vanilla/types" "^3.0.14"
"@formkit/tempo" "^0.1.2"
- "@slickgrid-universal/binding" "~5.10.2"
- "@slickgrid-universal/event-pub-sub" "~5.10.2"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/binding" "~5.12.0"
+ "@slickgrid-universal/event-pub-sub" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
"@types/sortablejs" "^1.15.8"
"@types/trusted-types" "^2.0.7"
autocompleter "^9.3.2"
@@ -3017,108 +3159,108 @@
un-flatten-tree "^2.0.12"
vanilla-calendar-pro "^2.9.10"
-"@slickgrid-universal/composite-editor-component@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/composite-editor-component/-/composite-editor-component-5.11.0.tgz#0eedc2216bc3b7e26284fa759f41107512fd5a6e"
- integrity sha512-zI5cXIqnXupAxzfh7ZQJjXmJVUwYLk21lNrskau/HN7XSYKvnvLPyGYMWH1CGWmwMCKyGZ+yrhBzaqhzmXa2ew==
+"@slickgrid-universal/composite-editor-component@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/composite-editor-component/-/composite-editor-component-5.12.0.tgz#0380287a15f316068446c350cb29a8db682036bf"
+ integrity sha512-IocfF5j2YrOm5bA4y3/XC0ZFXNL/zU94zvJihaFg/p84/7nnA0X5I/V+TKY4Ff8OaArkJUtkwVbfhbr8hBZ+Dg==
dependencies:
- "@slickgrid-universal/binding" "~5.10.2"
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/binding" "~5.12.0"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/custom-footer-component@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-footer-component/-/custom-footer-component-5.11.0.tgz#3bb36816e040532ef2e53bb97bc13b41eaf889cf"
- integrity sha512-mV5SQWklV2rTJi5RonGe8cGjtVAyP/YulxFO1TJe71DTDh8lR1Z+3QM7/5UKuamPxse+a0wntizErVxCwZdPBw==
+"@slickgrid-universal/custom-footer-component@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-footer-component/-/custom-footer-component-5.12.0.tgz#63be5edd19df522988edc9c8ae828746aeb247ae"
+ integrity sha512-V1yzQnaezqtHivuGd7UlLcyY7lhZ3oS3ArAZAWABJosh+HfhG3ttzn6qAJUrDg5oHzGuLq/WwCNRyfxy4yg0uQ==
dependencies:
"@formkit/tempo" "^0.1.2"
- "@slickgrid-universal/binding" "~5.10.2"
- "@slickgrid-universal/common" "~5.11.0"
+ "@slickgrid-universal/binding" "~5.12.0"
+ "@slickgrid-universal/common" "~5.12.0"
-"@slickgrid-universal/custom-tooltip-plugin@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-tooltip-plugin/-/custom-tooltip-plugin-5.11.0.tgz#7f96237ca627ac051c5504e0194481f65c41eeda"
- integrity sha512-GG1t96BILm/0bh70xWn/ocZ+EmnqVIY1Kf8ZmA9YVLfGBw5mleYDxe4CE/L5WvyguFIAhffI4q2rcRBE16/pRA==
+"@slickgrid-universal/custom-tooltip-plugin@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/custom-tooltip-plugin/-/custom-tooltip-plugin-5.12.0.tgz#5e0c8d8b4d3a9d676a01a745d56a597bc88b37cd"
+ integrity sha512-p8CONc2NwCpuPJj4EPkT1hIu0aU0fdyj1qvTQSXH658r1IOBQ2cjUlHQ3S4ymFPYF5RymNlYoaHsgHWwDSzmuA==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/empty-warning-component@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/empty-warning-component/-/empty-warning-component-5.11.0.tgz#18a8649d3c7e9b06897291304ec9876114b12dc9"
- integrity sha512-3SU8zk8sC9Oim2RlLwYCyK1QpVkAV7MjPtOXTn8lFvFJCRclJE9zgmQ70/Ptb7myMbg3CZSJCWX6YU2QnG7yYA==
+"@slickgrid-universal/empty-warning-component@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/empty-warning-component/-/empty-warning-component-5.12.0.tgz#4e4c700e8b5dfd1192b9e9f1d3b5d4863359a0dc"
+ integrity sha512-n7fUCeb4IEaSInphvrhf028DcdRdMdPDxEjDvr+CyQMZp1xQAePvAkt7I/dqVtstJtHToavk1ZFwrDc/pnpXVA==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
+ "@slickgrid-universal/common" "~5.12.0"
-"@slickgrid-universal/event-pub-sub@~5.10.2":
- version "5.10.2"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/event-pub-sub/-/event-pub-sub-5.10.2.tgz#d5a773d719ce64473ce3811e43833878d38a0ffe"
- integrity sha512-3l0rAZEf2CX2ApaXv4VCFVlExJSTu6VjDiWsNuZ9dh7+auWtiihsX4QZS8zskQIqEVrHtuJAlV8fq/l/XcwS+g==
+"@slickgrid-universal/event-pub-sub@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/event-pub-sub/-/event-pub-sub-5.12.0.tgz#ec206ec19b5a73a6a9549fd432c23651c03281bc"
+ integrity sha512-7EuBvsYykHRP12wiquzqW0LMv5ZyuVkQEzhMVE1pu0gp4K6Eh+Hdl7Kw5hLEr29ERfvUCN/zBlpDVIx6OlZ9PQ==
dependencies:
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/excel-export@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/excel-export/-/excel-export-5.11.0.tgz#7ba36943a9c5b9d51d4aad74a89880f23813c768"
- integrity sha512-iIGepwYYrnZ0mu1ZAZugnUUNByicdlQ4ojdd9ddvbuAjYG4p2JdjqqIxL4eQq3Dd0SJbKzEVaiXKpb/rXOXqZw==
+"@slickgrid-universal/excel-export@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/excel-export/-/excel-export-5.12.0.tgz#c6c16dbdc75d999df23e3a6e0243a233e591dfe4"
+ integrity sha512-yBxXr1QRqA6OGCVQ62/R8lXpgXQibcDh41jFlnV96k/dCinR5B/R1l4fX11Y+MhNn379tmBrfXFzMYCt4bPEHA==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
excel-builder-vanilla "^3.0.14"
-"@slickgrid-universal/graphql@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/graphql/-/graphql-5.11.0.tgz#543cf5c26eb5b86ef9dcc85c8433b64fa8260a1c"
- integrity sha512-Fd8Xy5WMlFvwVHUXlbLrtUTd4ZOOlw+bCBZ3x+pi39ZMVxztGowBn1ayi7iUfaFMYEiCNlsXIaoYx+LqfTDAjw==
+"@slickgrid-universal/graphql@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/graphql/-/graphql-5.12.0.tgz#e47472b9d4bc4ee75fc055b93a901a12471fddb4"
+ integrity sha512-S2JzVBjluAJJQIt0+ZneaMBDFgS3TtTkiclVfxGH7DKrFm5OHaNxbN1o6UIxJS1ksdTh1xRMsRuaZZS9aHi7dQ==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/odata@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/odata/-/odata-5.11.0.tgz#d385627679596a8adff071269d3942d5a2f1cf84"
- integrity sha512-P3abiZfIP6aNTRKDgnSEqwa167YpBKSZSEgMct+oU4haP+Xc9bX9mJxZlP0sog/ClOCwVXdHQHzGvRlQhZPyug==
+"@slickgrid-universal/odata@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/odata/-/odata-5.12.0.tgz#0630d0699f4900464dfb6ecc94ad18ffa6af0373"
+ integrity sha512-wI3AW4N/yRRPQEmpay5qiOL9nFH7eY9wHGriCHz8UHnTHR4xz+EGxZvjWqGLW2osvSMOvPkoeW/k/uEcgEuD6A==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/pagination-component@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/pagination-component/-/pagination-component-5.11.0.tgz#93cd547dd0ba81ffdcc5b33d2c868a3738f1ff53"
- integrity sha512-3Eq6aMcezmCVshveMW00wjDmLcK2hxEcG7qEjz2swFUyk8dy/RQM6bkScUl3670xfqwMcfTVKXjOydKC/OvdeA==
+"@slickgrid-universal/pagination-component@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/pagination-component/-/pagination-component-5.12.0.tgz#37332a8c076f814c7d88789a9c3a35c062d3466e"
+ integrity sha512-B2walKcTMsdtxcjctazkpuUUmKBXnwlJ2azsoJzKRREK02NVdktqK2051/0ZDebD6CCABoaC6U6fMmoa4lDk2A==
dependencies:
- "@slickgrid-universal/binding" "~5.10.2"
- "@slickgrid-universal/common" "~5.11.0"
+ "@slickgrid-universal/binding" "~5.12.0"
+ "@slickgrid-universal/common" "~5.12.0"
-"@slickgrid-universal/row-detail-view-plugin@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/row-detail-view-plugin/-/row-detail-view-plugin-5.11.0.tgz#2df353d011cca71a39a6436d62db055b5f5323ab"
- integrity sha512-v58lW77QphQiTTKAyZDecCMIILO8vqgTh6rwAfN2u7+jcSitUUbi7c/vr9c9Yboa2FLkudgYcEbWBmuhyAeNpw==
+"@slickgrid-universal/row-detail-view-plugin@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/row-detail-view-plugin/-/row-detail-view-plugin-5.12.0.tgz#48554a82b197f2e003f8ef43abb184015fbc85d4"
+ integrity sha512-wkkBcXxO6wv39fBTzg2q6oXaxNRinS1AAI0gM76ijsWQT8IDD1FuqmF1m8P7UQiraCU7A9C2rG6blDif6zF7gg==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
-"@slickgrid-universal/rxjs-observable@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/rxjs-observable/-/rxjs-observable-5.11.0.tgz#7ae4166c7f840e5da24e3c5e1d02d198ae5ea508"
- integrity sha512-HhuVrVcaH5abpYNmmBa3h8Z3RqyhhKzP/cUDzZAy3AoRB14bnC3KODr07VOJIg/LCajLZCx1e4t/GcGW1fS1Kg==
+"@slickgrid-universal/rxjs-observable@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/rxjs-observable/-/rxjs-observable-5.12.0.tgz#11bde3f6c7a1f067ac5aea5417b925f65efd0e4c"
+ integrity sha512-bulgCBGtxcF1cYSYI9qqMQAsMU/1YWeiltxi+a7jMTYSzZAb7NA39poLDs1PVVncvFuVvidoaGEu8s2mRn1izQ==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
+ "@slickgrid-universal/common" "~5.12.0"
rxjs "^7.8.1"
-"@slickgrid-universal/text-export@~5.11.0":
- version "5.11.0"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/text-export/-/text-export-5.11.0.tgz#185fabb6c96ee3ecdbee55b6b051772818cc3aa6"
- integrity sha512-KprafJz0+adqYpy3Wz0QyDJQXkKcjulfHMZsEMy/VVr8jauLsZzzXeDzUSQNos78SZby/XuC7GREzhk6GRf1IQ==
+"@slickgrid-universal/text-export@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/text-export/-/text-export-5.12.0.tgz#14f8b0370b12f729f749510d2c4f26e540e1ee8c"
+ integrity sha512-z4hoNPYsDvW6hjsF73FRgXdnDP2e1PxLwa41SfJrYhdOkz+25wH4q6qWjtoMDqOwfqwGEUOKK/QREYecCVZHEg==
dependencies:
- "@slickgrid-universal/common" "~5.11.0"
- "@slickgrid-universal/utils" "~5.10.2"
+ "@slickgrid-universal/common" "~5.12.0"
+ "@slickgrid-universal/utils" "~5.12.0"
text-encoding-utf-8 "^1.0.2"
-"@slickgrid-universal/utils@~5.10.2":
- version "5.10.2"
- resolved "https://registry.yarnpkg.com/@slickgrid-universal/utils/-/utils-5.10.2.tgz#2a2a30bc94d306bb47af82a310900ed74f98ff88"
- integrity sha512-cijV2/u3xKnfdUinaJeQNcoZuLy+9J4EgYSfUpNX22kanp948uKOICQxVrlb7Lj82Ki0U+vtuQ+fS59KQD3YOQ==
+"@slickgrid-universal/utils@~5.12.0":
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/@slickgrid-universal/utils/-/utils-5.12.0.tgz#8661af1e8fadb1d35b8b108ecf24fc502a1ff29b"
+ integrity sha512-vw5Is2bdY+EjYw8dAJaAW6f+Iir0trwcz43cVI+Cpic9sTC6c7+UP89cvyW1sISN7YsWYRdtJjDT+BW9i6sSwg==
"@tootallnate/once@2":
version "2.0.0"
@@ -3359,6 +3501,11 @@
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
+"@types/parse-path@^7.0.0":
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.0.3.tgz#cec2da2834ab58eb2eb579122d9a1fc13bd7ef36"
+ integrity sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==
+
"@types/qs@*":
version "6.9.15"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce"
@@ -4215,10 +4362,10 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
-before-after-hook@^2.2.0:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c"
- integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==
+before-after-hook@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d"
+ integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==
big.js@^5.2.2:
version "5.2.2"
@@ -5092,10 +5239,10 @@ cypress-real-events@^1.13.0:
resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.13.0.tgz#6b7cd32dcac172db1493608f97a2576c7d0bd5af"
integrity sha512-LoejtK+dyZ1jaT8wGT5oASTPfsNV8/ClRp99ruN60oPj8cBJYod80iJDyNwfPAu4GCxTXOhhAv9FO65Hpwt6Hg==
-cypress@^13.17.0:
- version "13.17.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d"
- integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==
+cypress@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.0.0.tgz#a71cb0a243a0bfeb97b6973ab9c5291ca5288e93"
+ integrity sha512-kEGqQr23so5IpKeg/dp6GVi7RlHx1NmW66o2a2Q4wk9gRaAblLZQSiZJuDI8UMC4LlG5OJ7Q6joAiqTrfRNbTw==
dependencies:
"@cypress/request" "^3.0.6"
"@cypress/xvfb" "^1.2.4"
@@ -5290,11 +5437,6 @@ dependency-graph@^1.0.0:
resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-1.0.0.tgz#bb5e85aec1310bc13b22dbd76e3196c4ee4c10d2"
integrity sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==
-deprecation@^2.0.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
- integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
-
dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
@@ -5891,22 +6033,25 @@ execa@4.1.0:
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
-execa@8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.0.tgz#bed67705f9966469cd93e521617868c52a4df6e8"
- integrity sha512-CTNS0BcKBcoOsawKBlpcKNmK4Kjuyz5jVLhf+PUsHGMqiKMVTa4cN3U7r7bRY8KTpfOGpXMo27fdy0dYVg2pqA==
+execa@9.5.2:
+ version "9.5.2"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-9.5.2.tgz#a4551034ee0795e241025d2f987dab3f4242dff2"
+ integrity sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==
dependencies:
+ "@sindresorhus/merge-streams" "^4.0.0"
cross-spawn "^7.0.3"
- get-stream "^8.0.1"
- human-signals "^5.0.0"
- is-stream "^3.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^5.1.0"
- onetime "^6.0.0"
+ figures "^6.1.0"
+ get-stream "^9.0.0"
+ human-signals "^8.0.0"
+ is-plain-obj "^4.1.0"
+ is-stream "^4.0.1"
+ npm-run-path "^6.0.0"
+ pretty-ms "^9.0.0"
signal-exit "^4.1.0"
- strip-final-newline "^3.0.0"
+ strip-final-newline "^4.0.0"
+ yoctocolors "^2.0.0"
-execa@^5.0.0, execa@^5.1.1:
+execa@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
@@ -5921,6 +6066,21 @@ execa@^5.0.0, execa@^5.1.1:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
+execa@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
+ integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^8.0.1"
+ human-signals "^5.0.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^4.1.0"
+ strip-final-newline "^3.0.0"
+
executable@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
@@ -6021,6 +6181,11 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+fast-content-type-parse@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz#c236124534ee2cb427c8d8e5ba35a4856947847b"
+ integrity sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -6092,6 +6257,13 @@ figures@^3.2.0:
dependencies:
escape-string-regexp "^1.0.5"
+figures@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-6.1.0.tgz#935479f51865fa7479f6fa94fc6fc7ac14e62c4a"
+ integrity sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==
+ dependencies:
+ is-unicode-supported "^2.0.0"
+
file-entry-cache@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
@@ -6328,6 +6500,14 @@ get-stream@^8.0.1:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
+get-stream@^9.0.0:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27"
+ integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==
+ dependencies:
+ "@sec-ant/readable-stream" "^0.4.1"
+ is-stream "^4.0.1"
+
get-tsconfig@^4.8.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471"
@@ -6375,20 +6555,20 @@ git-semver-tags@^8.0.0:
"@conventional-changelog/git-client" "^1.0.0"
meow "^13.0.0"
-git-up@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467"
- integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==
+git-up@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/git-up/-/git-up-8.0.0.tgz#674d398f95c4f70b4193f3f3d87c73cf28c2bee1"
+ integrity sha512-uBI8Zdt1OZlrYfGcSVroLJKgyNNXlgusYFzHk614lTasz35yg2PVpL1RMy0LOO2dcvF9msYW3pRfUSmafZNrjg==
dependencies:
is-ssh "^1.4.0"
- parse-url "^8.1.0"
+ parse-url "^9.2.0"
-git-url-parse@14.0.0:
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-14.0.0.tgz#18ce834726d5fbca0c25a4555101aa277017418f"
- integrity sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==
+git-url-parse@16.0.0:
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-16.0.0.tgz#04dcc54197ad9aa2c92795b32be541d217c11f70"
+ integrity sha512-Y8iAF0AmCaqXc6a5GYgPQW9ESbncNLOL+CeQAJRhmWUOmnPkKpBYeWYp4mFd3LA5j53CdGDdslzX12yEBVHQQg==
dependencies:
- git-up "^7.0.0"
+ git-up "^8.0.0"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
@@ -6724,6 +6904,11 @@ human-signals@^5.0.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
+human-signals@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-8.0.0.tgz#2d3d63481c7c2319f0373428b01ffe30da6df852"
+ integrity sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==
+
hyperdyperid@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b"
@@ -6861,23 +7046,18 @@ injection-js@^2.4.0:
dependencies:
tslib "^2.0.0"
-inquirer@9.3.2:
- version "9.3.2"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.3.2.tgz#9bc5ced19f572e848044baa05094a498f1e448c6"
- integrity sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw==
+inquirer@12.3.0:
+ version "12.3.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.3.0.tgz#c5142f49362f1347aa49a18e652db460f14092e6"
+ integrity sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ==
dependencies:
- "@inquirer/figures" "^1.0.3"
+ "@inquirer/core" "^10.1.2"
+ "@inquirer/prompts" "^7.2.1"
+ "@inquirer/type" "^3.0.2"
ansi-escapes "^4.3.2"
- cli-width "^4.1.0"
- external-editor "^3.1.0"
- mute-stream "1.0.0"
- ora "^5.4.1"
+ mute-stream "^2.0.0"
run-async "^3.0.0"
rxjs "^7.8.1"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
- wrap-ansi "^6.2.0"
- yoctocolors-cjs "^2.1.1"
interpret@^1.0.0:
version "1.4.0"
@@ -7050,6 +7230,11 @@ is-plain-obj@^3.0.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
+is-plain-obj@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
+ integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
+
is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@@ -7084,6 +7269,11 @@ is-stream@^3.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+is-stream@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b"
+ integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==
+
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -8072,7 +8262,7 @@ lru-cache@^7.14.1:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89"
integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
-macos-release@^3.1.0:
+macos-release@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.3.0.tgz#92cb67bc66d67c3fde4a9e14f5f909afa418b072"
integrity sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==
@@ -8390,11 +8580,16 @@ multiple-select-vanilla@^3.4.4:
dependencies:
"@types/trusted-types" "^2.0.7"
-mute-stream@1.0.0, mute-stream@^1.0.0:
+mute-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e"
integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==
+mute-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b"
+ integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==
+
nanoid@^3.3.7:
version "3.3.8"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
@@ -8665,6 +8860,14 @@ npm-run-path@^5.1.0:
dependencies:
path-key "^4.0.0"
+npm-run-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537"
+ integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==
+ dependencies:
+ path-key "^4.0.0"
+ unicorn-magic "^0.3.0"
+
nth-check@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
@@ -8749,7 +8952,7 @@ optionator@^0.9.3:
type-check "^0.4.0"
word-wrap "^1.2.5"
-ora@5.4.1, ora@^5.1.0, ora@^5.4.1:
+ora@5.4.1, ora@^5.1.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
@@ -8784,13 +8987,13 @@ ordered-binary@^1.4.1:
resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.1.tgz#94ccbf14181711081ee23931db0dc3f58aaa0df6"
integrity sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==
-os-name@5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/os-name/-/os-name-5.1.0.tgz#4f5ab5edfa6938b590112714f1570fe79f1d957a"
- integrity sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==
+os-name@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/os-name/-/os-name-6.0.0.tgz#9b891a5339d516420683aabdc31f4cc1a9c6aa31"
+ integrity sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==
dependencies:
- macos-release "^3.1.0"
- windows-release "^5.0.1"
+ macos-release "^3.2.0"
+ windows-release "^6.0.0"
os-tmpdir@~1.0.2:
version "1.0.2"
@@ -8951,6 +9154,11 @@ parse-json@^8.0.0:
index-to-position "^0.1.2"
type-fest "^4.7.1"
+parse-ms@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4"
+ integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==
+
parse-node-version@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
@@ -8963,11 +9171,12 @@ parse-path@^7.0.0:
dependencies:
protocols "^2.0.0"
-parse-url@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d"
- integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==
+parse-url@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-9.2.0.tgz#d75da32b3bbade66e4eb0763fb4851d27526b97b"
+ integrity sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==
dependencies:
+ "@types/parse-path" "^7.0.0"
parse-path "^7.0.0"
parse5-html-rewriting-stream@7.0.0:
@@ -9214,6 +9423,13 @@ pretty-format@^29.0.0, pretty-format@^29.7.0:
ansi-styles "^5.0.0"
react-is "^18.0.0"
+pretty-ms@^9.0.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.2.0.tgz#e14c0aad6493b69ed63114442a84133d7e560ef0"
+ integrity sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==
+ dependencies:
+ parse-ms "^4.0.0"
+
proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034"
@@ -9527,31 +9743,32 @@ regjsparser@^0.9.1:
dependencies:
jsesc "~0.5.0"
-release-it@^17.11.0:
- version "17.11.0"
- resolved "https://registry.yarnpkg.com/release-it/-/release-it-17.11.0.tgz#4cb858194f45fdc1966b8a53209efff887d1994e"
- integrity sha512-qQGgfMbUZ3/vpXUPmngsgjFObOLjlkwtiozHUYen9fo9AEGciXjG1ZpGr+FNmuBT8R7TOSY+x/s84wOCRKJjbA==
+release-it@^18.1.1:
+ version "18.1.1"
+ resolved "https://registry.yarnpkg.com/release-it/-/release-it-18.1.1.tgz#263f0dc67a6b2209b072528444a49cb0fa7ae015"
+ integrity sha512-rC/iVKri7U/Kp/Myujmsf7HG2gPq8My/LBVB72TbZZYKD14fmgDZC4Eyn8DD7Yh2h/G/YCCsRe1QQPrjXj9Mzg==
dependencies:
"@iarna/toml" "2.2.5"
- "@octokit/rest" "20.1.1"
+ "@octokit/rest" "21.0.2"
async-retry "1.3.3"
chalk "5.4.1"
ci-info "^4.1.0"
cosmiconfig "9.0.0"
- execa "8.0.0"
- git-url-parse "14.0.0"
+ execa "9.5.2"
+ git-url-parse "16.0.0"
globby "14.0.2"
- inquirer "9.3.2"
+ inquirer "12.3.0"
issue-parser "7.0.1"
lodash "4.17.21"
mime-types "2.1.35"
new-github-release-url "2.0.0"
open "10.1.0"
ora "8.1.1"
- os-name "5.1.0"
+ os-name "6.0.0"
proxy-agent "6.5.0"
semver "7.6.3"
shelljs "0.8.5"
+ undici "6.21.0"
update-notifier "7.3.1"
url-join "5.0.0"
wildcard-match "5.1.4"
@@ -10314,6 +10531,11 @@ strip-final-newline@^3.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+strip-final-newline@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz#35a369ec2ac43df356e3edd5dcebb6429aa1fa5c"
+ integrity sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==
+
strip-json-comments@3.1.1, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@@ -10684,6 +10906,11 @@ undici-types@~6.20.0:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+undici@6.21.0:
+ version "6.21.0"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4"
+ integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==
+
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@@ -10712,6 +10939,11 @@ unicorn-magic@^0.1.0:
resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4"
integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==
+unicorn-magic@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104"
+ integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==
+
unique-filename@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea"
@@ -10726,10 +10958,10 @@ unique-slug@^4.0.0:
dependencies:
imurmurhash "^0.1.4"
-universal-user-agent@^6.0.0:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa"
- integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==
+universal-user-agent@^7.0.0, universal-user-agent@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e"
+ integrity sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==
universalify@^0.2.0:
version "0.2.0"
@@ -11096,12 +11328,12 @@ wildcard@^2.0.1:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67"
integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
-windows-release@^5.0.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-5.1.1.tgz#7ac7019f9baeaea6c00ec889b11824f46c12ee8d"
- integrity sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==
+windows-release@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-6.0.1.tgz#9111c21fc5c3043fdb47b548df15ac14b94683b2"
+ integrity sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==
dependencies:
- execa "^5.1.1"
+ execa "^8.0.1"
word-wrap@^1.2.5:
version "1.2.5"
@@ -11243,11 +11475,16 @@ yocto-queue@^1.0.0:
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110"
integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==
-yoctocolors-cjs@^2.1.1, yoctocolors-cjs@^2.1.2:
+yoctocolors-cjs@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242"
integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==
+yoctocolors@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc"
+ integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==
+
zone.js@~0.15.0:
version "0.15.0"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.15.0.tgz#4810624e58d6dcf7b8379c1631765589917a0d8f"