Skip to content

Commit fc2132f

Browse files
committed
feat(services): convert jQuery to native elements
1 parent 177b68f commit fc2132f

File tree

2 files changed

+42
-26
lines changed

2 files changed

+42
-26
lines changed

src/app/modules/angular-slickgrid/services/__tests__/groupingAndColspan.service.spec.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ describe('GroupingAndColspanService', () => {
155155
let mockColumns: Column[];
156156

157157
beforeEach(() => {
158+
const mockParentPreHeaderElm = document.createElement('div');
159+
const mockPreHeaderPanelElm = document.createElement('div');
160+
mockPreHeaderPanelElm.className = 'slick-header-columns';
161+
mockPreHeaderPanelElm.style.left = '-1000px';
162+
mockPreHeaderPanelElm.style.width = '2815px';
163+
mockParentPreHeaderElm.appendChild(mockPreHeaderPanelElm);
158164
mockColumns = [
159165
{ id: 'title', name: 'Title', field: 'title', sortable: true, columnGroup: 'Common Factor' },
160166
{ id: 'duration', name: 'Duration', field: 'duration', width: 100, columnGroup: 'Common Factor' },
@@ -163,7 +169,9 @@ describe('GroupingAndColspanService', () => {
163169
];
164170
gridStub.getColumns = jest.fn();
165171
jest.spyOn(gridStub, 'getColumns').mockReturnValue(mockColumns);
166-
jest.spyOn(gridStub, 'getPreHeaderPanel').mockReturnValue(`<div style="width: 2815px; left: -1000px;" class="slick-header-columns"></div>`);
172+
jest.spyOn(gridStub, 'getPreHeaderPanel').mockReturnValue(mockPreHeaderPanelElm);
173+
jest.spyOn(gridStub, 'getPreHeaderPanelLeft').mockReturnValue(document.createElement('div'));
174+
jest.spyOn(gridStub, 'getPreHeaderPanelRight').mockReturnValue(document.createElement('div'));
167175
});
168176

169177
it('should call the "renderPreHeaderRowGroupingTitles" on initial load even when there are no column definitions', () => {
@@ -350,8 +358,8 @@ describe('GroupingAndColspanService', () => {
350358
const frozenColumns = 2;
351359
gridOptionMock.frozenColumn = frozenColumns;
352360
const headerGroupSpy = jest.spyOn(service, 'renderHeaderGroups');
353-
const preHeaderLeftSpy = jest.spyOn(gridStub, 'getPreHeaderPanelLeft');
354-
const preHeaderRightSpy = jest.spyOn(gridStub, 'getPreHeaderPanelRight');
361+
const preHeaderLeftSpy = jest.spyOn(gridStub, 'getPreHeaderPanelLeft').mockReturnValue(document.createElement('div'));
362+
const preHeaderRightSpy = jest.spyOn(gridStub, 'getPreHeaderPanelRight').mockReturnValue(document.createElement('div'));
355363
const divHeaderColumns = document.getElementsByClassName('slick-header-columns');
356364

357365
service.init(gridStub, dataViewStub);

src/app/modules/angular-slickgrid/services/groupingAndColspan.service.ts

+31-23
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Column, GridOption, SlickEventHandler, ExtensionName } from './../model
55
import { ExtensionUtility } from '../extensions/extensionUtility';
66
import { ExtensionService } from './extension.service';
77
import { ResizerService } from './resizer.service';
8-
import { unsubscribeAllObservables } from './utilities';
8+
import { emptyElement, unsubscribeAllObservables } from './utilities';
99
import { SharedService } from './shared.service';
1010

1111
// using external non-typed js libraries
@@ -101,56 +101,64 @@ export class GroupingAndColspanService {
101101
renderPreHeaderRowGroupingTitles() {
102102
if (this._gridOptions && this._gridOptions.frozenColumn !== undefined && this._gridOptions.frozenColumn >= 0) {
103103
// Add column groups to left panel
104-
let $preHeaderPanel = $(this._grid.getPreHeaderPanelLeft());
105-
this.renderHeaderGroups($preHeaderPanel, 0, this._gridOptions.frozenColumn + 1);
104+
let preHeaderPanelElm = this._grid.getPreHeaderPanelLeft();
105+
this.renderHeaderGroups(preHeaderPanelElm, 0, this._gridOptions.frozenColumn + 1);
106106

107107
// Add column groups to right panel
108-
$preHeaderPanel = $(this._grid.getPreHeaderPanelRight());
109-
this.renderHeaderGroups($preHeaderPanel, this._gridOptions.frozenColumn + 1, this._columnDefinitions.length);
108+
preHeaderPanelElm = this._grid.getPreHeaderPanelRight();
109+
this.renderHeaderGroups(preHeaderPanelElm, this._gridOptions?.frozenColumn + 1, this._columnDefinitions.length);
110110
} else {
111111
// regular grid (not a frozen grid)
112-
const $preHeaderPanel = $(this._grid.getPreHeaderPanel());
113-
this.renderHeaderGroups($preHeaderPanel, 0, this._columnDefinitions.length);
112+
const preHeaderPanelElm = this._grid.getPreHeaderPanel();
113+
this.renderHeaderGroups(preHeaderPanelElm, 0, this._columnDefinitions.length);
114114
}
115115
}
116116

117-
renderHeaderGroups(preHeaderPanel: any, start: number, end: number) {
118-
preHeaderPanel.empty()
119-
.addClass('slick-header-columns')
120-
.css('left', '-1000px')
121-
.width(this._grid.getHeadersWidth());
122-
preHeaderPanel.parent().addClass('slick-header');
117+
renderHeaderGroups(preHeaderPanel: HTMLElement, start: number, end: number) {
118+
emptyElement(preHeaderPanel);
119+
preHeaderPanel.className = 'slick-header-columns';
120+
preHeaderPanel.style.left = '-1000px';
121+
preHeaderPanel.style.width = `${this._grid.getHeadersWidth()}px`;
122+
123+
if (preHeaderPanel.parentElement) {
124+
preHeaderPanel.parentElement.classList.add('slick-header');
125+
}
123126

124127
const headerColumnWidthDiff = this._grid.getHeaderColumnWidthDiff();
125128

126129
let colDef;
127-
let header;
130+
let headerElm: HTMLDivElement | null = null;
128131
let lastColumnGroup = '';
129132
let widthTotal = 0;
130-
const frozenHeaderWidthCalcDifferential = this._gridOptions && this._gridOptions.frozenHeaderWidthCalcDifferential || 0;
131-
const isFrozenGrid = (this._gridOptions && (this._gridOptions.frozenColumn !== undefined && this._gridOptions.frozenColumn >= 0));
133+
const frozenHeaderWidthCalcDifferential = this._gridOptions?.frozenHeaderWidthCalcDifferential ?? 0;
134+
const isFrozenGrid = (this._gridOptions?.frozenColumn !== undefined && this._gridOptions.frozenColumn >= 0);
132135

133136
for (let i = start; i < end; i++) {
134137
colDef = this._columnDefinitions[i];
135138
if (colDef) {
136139
if (lastColumnGroup === colDef.columnGroup && i > 0) {
137140
widthTotal += colDef.width || 0;
138-
if (header && header.width) {
139-
header.width(widthTotal - headerColumnWidthDiff - frozenHeaderWidthCalcDifferential); // remove possible frozen border
141+
if (headerElm?.style) {
142+
headerElm.style.width = `${widthTotal - headerColumnWidthDiff - frozenHeaderWidthCalcDifferential}px`; // remove possible frozen border
140143
}
141144
} else {
142145
widthTotal = colDef.width || 0;
143-
header = $(`<div class="ui-state-default slick-header-column ${isFrozenGrid ? 'frozen' : ''}" />`)
144-
.html(`<span class="slick-column-name">${colDef.columnGroup || ''}</span>`)
145-
.width(widthTotal - headerColumnWidthDiff)
146-
.appendTo(preHeaderPanel);
146+
headerElm = document.createElement('div');
147+
headerElm.className = `ui-state-default slick-header-column ${isFrozenGrid ? 'frozen' : ''}`;
148+
headerElm.style.width = `${widthTotal - headerColumnWidthDiff}px`;
149+
150+
const spanColumnNameElm = document.createElement('span');
151+
spanColumnNameElm.className = 'slick-column-name';
152+
spanColumnNameElm.textContent = colDef.columnGroup || '';
153+
154+
headerElm.appendChild(spanColumnNameElm);
155+
preHeaderPanel.appendChild(headerElm);
147156
}
148157
lastColumnGroup = colDef.columnGroup || '';
149158
}
150159
}
151160
}
152161

153-
154162
/** Translate Column Group texts and re-render them afterward. */
155163
translateGroupingAndColSpan() {
156164
const currentColumnDefinitions = this._grid.getColumns();

0 commit comments

Comments
 (0)