Skip to content

Commit fe05a3c

Browse files
authored
Merge branch '21.1.x' into iminchev/fix-16493
2 parents 08486c8 + a519e65 commit fe05a3c

15 files changed

Lines changed: 2027 additions & 1675 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Trigger Licensed Release
2+
3+
permissions:
4+
contents: read
5+
6+
on:
7+
release:
8+
types: [created]
9+
workflow_dispatch:
10+
inputs:
11+
release_tag:
12+
description: 'Release tag to dispatch (e.g. 21.1.1)'
13+
required: true
14+
type: string
15+
16+
jobs:
17+
dispatch-to-private-repo:
18+
runs-on: ubuntu-latest
19+
20+
steps:
21+
- name: Get app token
22+
id: app-token
23+
uses: actions/create-github-app-token@v2
24+
with:
25+
app-id: ${{ secrets.IGNITEUI_GITHUB_APP_ID }}
26+
private-key: ${{ secrets.IGNITEUI_GITHUB_APP_PRIVATE_KEY }}
27+
owner: IgniteUI
28+
29+
- name: Send repository dispatch to private repo
30+
uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3
31+
with:
32+
token: ${{ steps.app-token.outputs.token }}
33+
repository: IgniteUI/igniteui-actions
34+
event-type: igniteui-angular-public-release-created
35+
client-payload: |
36+
{
37+
"release_tag": "${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || github.event.release.tag_name }}",
38+
"public_repo": "${{ github.repository }}"
39+
}

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
All notable changes for each version of this project will be documented in this file.
44

5+
## 21.1.3
6+
7+
### Security Fixes
8+
- Bumped `jspdf` dependency to `4.2.1` to address a security vulnerability present in earlier versions.
9+
510
## 21.1.0
611

712
### New Features

package-lock.json

Lines changed: 1739 additions & 1660 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"igniteui-i18n-core": "^1.0.2",
8080
"igniteui-theming": "^25.0.0",
8181
"igniteui-trial-watermark": "^3.1.0",
82-
"jspdf": "^4.0.0",
82+
"jspdf": "^4.2.1",
8383
"lodash-es": "^4.17.21",
8484
"marked": "^17.0.1",
8585
"marked-shiki": "^1.2.1",

projects/igniteui-angular-elements/src/public_api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { registerI18n, setCurrentI18n } from 'igniteui-i18n-core';
2-
import { ByLevelTreeGridMergeStrategy, ColumnPinningPosition, DefaultMergeStrategy, DefaultTreeGridMergeStrategy, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, HorizontalAlignment, IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand, NoopFilteringStrategy, NoopSortingStrategy, SortingDirection, VerticalAlignment } from 'igniteui-angular/core';
2+
import { ByLevelTreeGridMergeStrategy, ColumnPinningPosition, DefaultMergeStrategy, DefaultTreeGridMergeStrategy, FilteringExpressionsTree, FilteringExpressionsTreeType, FilteringLogic, HorizontalAlignment, IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand, NoopFilteringStrategy, NoopSortingStrategy, SortingDirection, TransactionType, TransactionEventOrigin, VerticalAlignment } from 'igniteui-angular/core';
33
import { DropPosition, GridPagingMode, IgxDateSummaryOperand, IgxNumberSummaryOperand, IgxPivotAggregate, IgxPivotDateAggregate, IgxPivotDateDimension, IgxPivotNumericAggregate, IgxPivotTimeAggregate, IgxSummaryOperand, IgxTimeSummaryOperand, NoopPivotDimensionsStrategy, PivotDimensionType, RowPinningPosition } from 'igniteui-angular/grids/core';
44

55
/** Export Public API, TODO: reorganize, Generate all w/ renames? */
@@ -49,4 +49,8 @@ export {
4949
// i18n
5050
registerI18n,
5151
setCurrentI18n,
52+
53+
// Transactions API
54+
TransactionType,
55+
TransactionEventOrigin,
5256
}

projects/igniteui-angular/grids/core/src/columns/column.component.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2189,7 +2189,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
21892189
result.push(size.width + 'px');
21902190
} else {
21912191
const currentWidth = parseFloat(this.grid.getPossibleColumnWidth());
2192-
result.push((this.getConstrainedSizePx(currentWidth)) + 'px');
2192+
const target = size && size.ref ? size.ref : this;
2193+
result.push((target as IgxColumnComponent).getConstrainedSizePx(currentWidth) + 'px');
21932194
}
21942195
}
21952196
return result;
@@ -2682,7 +2683,7 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
26822683
} else if (this.minWidth && newSize <= this.userSetMinWidthPx) {
26832684
this.widthConstrained = true;
26842685
return this.userSetMinWidthPx;
2685-
} else if (!this.minWidth && (!this.widthSetByUser || this.width === 'fit-content') && !this.grid.columnWidthSetByUser && (!newSize || newSize <= this.grid.minColumnWidth)) {
2686+
} else if (!this.columnGroup && !this.minWidth && (!this.widthSetByUser || this.width === 'fit-content') && !this.grid.columnWidthSetByUser && (!newSize || newSize <= this.grid.minColumnWidth)) {
26862687
return this.grid.minColumnWidth;
26872688
} else {
26882689
this.widthConstrained = false;

projects/igniteui-angular/grids/grid/src/grid-base.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2841,7 +2841,7 @@ export abstract class IgxGridBaseDirective implements GridType,
28412841
}
28422842
}
28432843

2844-
/* blazorSuppress */
2844+
/* csSuppress */
28452845
/**
28462846
* Get transactions service for the grid.
28472847
*/

projects/igniteui-angular/grids/grid/src/grid-collapsible-columns.spec.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
44
import {
55
CollapsibleColumnGroupTestComponent,
66
CollapsibleGroupsTemplatesTestComponent,
7-
CollapsibleGroupsDynamicColComponent
7+
CollapsibleGroupsDynamicColComponent,
8+
CollapsibleGroupWithExplicitChildWidthsComponent
89
} from '../../../test-utils/grid-samples.spec';
910
import { GridFunctions } from '../../../test-utils/grid-functions.spec';
1011
import { UIInteractions, wait } from '../../../test-utils/ui-interactions.spec';
@@ -28,7 +29,8 @@ describe('IgxGrid - multi-column headers #grid', () => {
2829
NoopAnimationsModule,
2930
CollapsibleColumnGroupTestComponent,
3031
CollapsibleGroupsTemplatesTestComponent,
31-
CollapsibleGroupsDynamicColComponent
32+
CollapsibleGroupsDynamicColComponent,
33+
CollapsibleGroupWithExplicitChildWidthsComponent
3234
]
3335
}).compileComponents();
3436
}));
@@ -617,6 +619,28 @@ describe('IgxGrid - multi-column headers #grid', () => {
617619
expect(spans.length).toBe(2);
618620
});
619621

622+
it('should not constrain collapsed column group width by default min width when children have explicit widths (#17042)', () => {
623+
const fix = TestBed.createComponent(CollapsibleGroupWithExplicitChildWidthsComponent);
624+
fix.detectChanges();
625+
const g: IgxGridComponent = fix.componentInstance.grid;
626+
627+
const customerInfoGroup = GridFunctions.getColGroup(g, 'Customer Information');
628+
expect(customerInfoGroup.expanded).toBe(false);
629+
expect(customerInfoGroup.collapsible).toBe(true);
630+
631+
// The only visible child when collapsed is CompanyName with width 100px.
632+
const visibleChildren = customerInfoGroup.children
633+
.filter(c => !c.hidden);
634+
expect(visibleChildren.length).toBe(1);
635+
636+
const visibleChildWidth = visibleChildren
637+
.reduce((sum, c) => sum + c.calcPixelWidth, 0);
638+
639+
const groupWidth = customerInfoGroup.calcPixelWidth;
640+
expect(groupWidth).toBe(visibleChildWidth);
641+
expect(groupWidth).toBe(100);
642+
});
643+
620644
it('Group By: test when group by a column', () => {
621645
addressInf.expanded = false;
622646
countryCol.visibleWhenCollapsed = false;

projects/igniteui-angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"fflate": "^0.8.2",
7474
"tslib": "^2.8.1",
7575
"igniteui-trial-watermark": "^3.1.0",
76-
"jspdf": "^4.0.0",
76+
"jspdf": "^4.2.1",
7777
"lodash-es": "^4.17.21",
7878
"igniteui-theming": "^25.0.0",
7979
"igniteui-i18n-core": "^1.0.2",

projects/igniteui-angular/paginator/src/paginator/paginator.component.spec.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,55 @@ describe('IgxPaginator with default settings', () => {
231231
expect(totalPages.innerText).toBe('1');
232232
});
233233

234+
it('should display the pager text ("of") in page navigation', () => {
235+
const fix = TestBed.createComponent(DefaultPaginatorComponent);
236+
fix.detectChanges();
237+
238+
const pageNavTextDiv = fix.debugElement.query(By.css('.igx-page-nav__text')).nativeElement;
239+
const spans = pageNavTextDiv.querySelectorAll('span');
240+
const paginator = fix.componentInstance.paginator;
241+
242+
// Should have 3 spans: current page, "of" text, total pages
243+
expect(spans.length).toBe(3);
244+
245+
// Check current page
246+
expect(spans[0].innerText.trim()).toBe('1');
247+
248+
// Check the "of" text
249+
expect(spans[1].innerText.trim()).toBe('of');
250+
251+
// Check total pages
252+
expect(spans[2].innerText.trim()).toBe('3');
253+
254+
// Verify the resource string is set
255+
expect(paginator.resourceStrings.igx_paginator_pager_text).toBe('of');
256+
});
257+
258+
it('should preserve default resource strings when partial resourceStrings are provided', () => {
259+
const fix = TestBed.createComponent(DefaultPaginatorComponent);
260+
fix.detectChanges();
261+
262+
const paginator = fix.componentInstance.paginator;
263+
264+
// Set only a partial resource string (only override label)
265+
paginator.resourceStrings = { igx_paginator_label: 'Custom per page' };
266+
fix.detectChanges();
267+
268+
const pageNavTextDiv = fix.debugElement.query(By.css('.igx-page-nav__text')).nativeElement;
269+
const spans = pageNavTextDiv.querySelectorAll('span');
270+
271+
// Verify the custom label is set
272+
expect(paginator.resourceStrings.igx_paginator_label).toBe('Custom per page');
273+
274+
// Verify the pager text ("of") is still present from defaults
275+
expect(paginator.resourceStrings.igx_paginator_pager_text).toBe('of');
276+
expect(spans[1].innerText.trim()).toBe('of');
277+
278+
// Verify other default strings are also preserved
279+
expect(paginator.resourceStrings.igx_paginator_first_page_button_text).toBe('Go to first page');
280+
expect(paginator.resourceStrings.igx_paginator_next_page_button_text).toBe('Next page');
281+
});
282+
234283
});
235284

236285
describe('IgxPaginator with custom settings', () => {

0 commit comments

Comments
 (0)