igniteui-angular 21.1.0-rc.4 → 21.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/fesm2022/igniteui-angular-grids-core.mjs +5 -3
- package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-grid.mjs +6 -1
- package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +1 -0
- package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs.map +1 -1
- package/fesm2022/igniteui-angular-grids-lite.mjs +2 -0
- package/fesm2022/igniteui-angular-grids-lite.mjs.map +1 -1
- package/fesm2022/igniteui-angular-simple-combo.mjs +1 -1
- package/fesm2022/igniteui-angular-simple-combo.mjs.map +1 -1
- package/lib/core/styles/components/grid/_grid-theme.scss +4 -1
- package/migrations/migration-collection.json +7 -0
- package/migrations/update-21_1_0_add-agent-skills/index.d.ts +3 -0
- package/migrations/update-21_1_0_add-agent-skills/index.js +46 -0
- package/package.json +4 -4
- package/skills/igniteui-angular-components/SKILL.md +71 -0
- package/skills/igniteui-angular-components/references/charts.md +447 -0
- package/skills/igniteui-angular-components/references/data-display.md +347 -0
- package/skills/igniteui-angular-components/references/directives.md +149 -0
- package/skills/igniteui-angular-components/references/feedback.md +141 -0
- package/skills/igniteui-angular-components/references/form-controls.md +298 -0
- package/skills/igniteui-angular-components/references/layout-manager.md +415 -0
- package/skills/igniteui-angular-components/references/layout.md +216 -0
- package/skills/igniteui-angular-components/references/setup.md +157 -0
- package/skills/igniteui-angular-grids/SKILL.md +110 -0
- package/skills/igniteui-angular-grids/references/data-operations.md +436 -0
- package/skills/igniteui-angular-grids/references/editing.md +480 -0
- package/skills/igniteui-angular-grids/references/features.md +218 -0
- package/skills/igniteui-angular-grids/references/paging-remote.md +388 -0
- package/skills/igniteui-angular-grids/references/state.md +448 -0
- package/skills/igniteui-angular-grids/references/structure.md +290 -0
- package/skills/igniteui-angular-grids/references/types.md +428 -0
- package/skills/igniteui-angular-theming/SKILL.md +530 -0
- package/styles/igniteui-angular-dark.css +1 -1
- package/styles/igniteui-angular.css +1 -1
- package/styles/igniteui-bootstrap-dark.css +1 -1
- package/styles/igniteui-bootstrap-light.css +1 -1
- package/styles/igniteui-dark-green.css +1 -1
- package/styles/igniteui-fluent-dark-excel.css +1 -1
- package/styles/igniteui-fluent-dark-word.css +1 -1
- package/styles/igniteui-fluent-dark.css +1 -1
- package/styles/igniteui-fluent-light-excel.css +1 -1
- package/styles/igniteui-fluent-light-word.css +1 -1
- package/styles/igniteui-fluent-light.css +1 -1
- package/styles/igniteui-indigo-dark.css +1 -1
- package/styles/igniteui-indigo-light.css +1 -1
- package/styles/maps/igniteui-angular-dark.css.map +1 -1
- package/styles/maps/igniteui-angular.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
- package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
- package/styles/maps/igniteui-dark-green.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-dark.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
- package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
- package/styles/maps/igniteui-fluent-light.css.map +1 -1
- package/styles/maps/igniteui-indigo-dark.css.map +1 -1
- package/styles/maps/igniteui-indigo-light.css.map +1 -1
- package/types/igniteui-angular-grids-lite.d.ts +2 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# Data Display & Other UI Components
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
|
|
4
|
+
> For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
|
|
5
|
+
|
|
6
|
+
## List
|
|
7
|
+
|
|
8
|
+
> **Docs:** [List Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/list)
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import { IGX_LIST_DIRECTIVES } from 'igniteui-angular/list';
|
|
12
|
+
import { IgxAvatarComponent } from 'igniteui-angular/avatar';
|
|
13
|
+
import { IgxIconComponent } from 'igniteui-angular/icon';
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<igx-list>
|
|
18
|
+
<igx-list-item [isHeader]="true">Contacts</igx-list-item>
|
|
19
|
+
@for (contact of contacts; track contact.id) {
|
|
20
|
+
<igx-list-item>
|
|
21
|
+
<igx-avatar igxListThumbnail [src]="contact.avatar" shape="circle"></igx-avatar>
|
|
22
|
+
<span igxListLine>{{ contact.name }}</span>
|
|
23
|
+
<span igxListLineSubTitle>{{ contact.phone }}</span>
|
|
24
|
+
<span igxListLineTitle>{{ contact.email }}</span>
|
|
25
|
+
<igx-icon igxListAction (click)="call(contact)">phone</igx-icon>
|
|
26
|
+
</igx-list-item>
|
|
27
|
+
}
|
|
28
|
+
</igx-list>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Auxiliary directives for list items: `igxListThumbnail`, `igxListAction`, `igxListLine`, `igxListLineTitle`, `igxListLineSubTitle`.
|
|
32
|
+
|
|
33
|
+
## Tree
|
|
34
|
+
|
|
35
|
+
> **Docs:** [Tree Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tree)
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { IGX_TREE_DIRECTIVES } from 'igniteui-angular/tree';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<igx-tree [selection]="'BiCascade'" (nodeSelection)="onNodeSelect($event)">
|
|
43
|
+
@for (node of treeData; track node.id) {
|
|
44
|
+
<igx-tree-node [data]="node" [expanded]="node.expanded">
|
|
45
|
+
<igx-icon>folder</igx-icon>
|
|
46
|
+
{{ node.label }}
|
|
47
|
+
@for (child of node.children; track child.id) {
|
|
48
|
+
<igx-tree-node [data]="child">
|
|
49
|
+
<igx-icon>description</igx-icon>
|
|
50
|
+
{{ child.label }}
|
|
51
|
+
</igx-tree-node>
|
|
52
|
+
}
|
|
53
|
+
</igx-tree-node>
|
|
54
|
+
}
|
|
55
|
+
</igx-tree>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Selection modes: `'None'`, `'BiCascade'`, `'Cascade'`.
|
|
59
|
+
|
|
60
|
+
## Card
|
|
61
|
+
|
|
62
|
+
> **Docs:** [Card Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card)
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { IgxCardComponent, IgxCardHeaderComponent, IgxCardContentDirective, IgxCardActionsComponent, IgxCardMediaDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardHeaderThumbnailDirective } from 'igniteui-angular/card';
|
|
66
|
+
import { IgxAvatarComponent } from 'igniteui-angular/avatar';
|
|
67
|
+
import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
|
|
68
|
+
import { IgxRippleDirective } from 'igniteui-angular/directives';
|
|
69
|
+
import { IgxIconComponent } from 'igniteui-angular/icon';
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<igx-card>
|
|
74
|
+
<igx-card-media height="200px">
|
|
75
|
+
<img [src]="article.coverImage" />
|
|
76
|
+
</igx-card-media>
|
|
77
|
+
<igx-card-header>
|
|
78
|
+
<igx-avatar igxCardHeaderThumbnail [src]="author.photo" shape="circle"></igx-avatar>
|
|
79
|
+
<h3 igxCardHeaderTitle>{{ article.title }}</h3>
|
|
80
|
+
<h5 igxCardHeaderSubtitle>{{ author.name }}</h5>
|
|
81
|
+
</igx-card-header>
|
|
82
|
+
<igx-card-content>
|
|
83
|
+
<p>{{ article.excerpt }}</p>
|
|
84
|
+
</igx-card-content>
|
|
85
|
+
<igx-card-actions>
|
|
86
|
+
<button igxButton="flat" igxRipple>Read More</button>
|
|
87
|
+
<button igxIconButton="flat" igxRipple>
|
|
88
|
+
<igx-icon>favorite</igx-icon>
|
|
89
|
+
</button>
|
|
90
|
+
</igx-card-actions>
|
|
91
|
+
</igx-card>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Chips
|
|
95
|
+
|
|
96
|
+
> **Docs:** [Chip Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chip)
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { IgxChipComponent, IgxChipsAreaComponent } from 'igniteui-angular/chips';
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<igx-chips-area (reorder)="onChipsReorder($event)">
|
|
104
|
+
@for (tag of tags; track tag) {
|
|
105
|
+
<igx-chip [removable]="true" [selectable]="true" (remove)="removeTag(tag)">
|
|
106
|
+
{{ tag }}
|
|
107
|
+
</igx-chip>
|
|
108
|
+
}
|
|
109
|
+
</igx-chips-area>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Avatar & Badge
|
|
113
|
+
|
|
114
|
+
> **Docs:** [Avatar](https://www.infragistics.com/products/ignite-ui-angular/angular/components/avatar) · [Badge](https://www.infragistics.com/products/ignite-ui-angular/angular/components/badge)
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { IgxAvatarComponent } from 'igniteui-angular/avatar';
|
|
118
|
+
import { IgxBadgeComponent } from 'igniteui-angular/badge';
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```html
|
|
122
|
+
<!-- Image avatar with badge overlay -->
|
|
123
|
+
<igx-avatar [src]="user.photo" shape="circle" size="large">
|
|
124
|
+
<igx-badge igxAvatarBadge [type]="'success'" [icon]="'check'"></igx-badge>
|
|
125
|
+
</igx-avatar>
|
|
126
|
+
|
|
127
|
+
<!-- Initials avatar -->
|
|
128
|
+
<igx-avatar initials="JD" shape="circle"></igx-avatar>
|
|
129
|
+
|
|
130
|
+
<!-- Icon avatar -->
|
|
131
|
+
<igx-avatar icon="person"></igx-avatar>
|
|
132
|
+
|
|
133
|
+
<!-- Standalone badge -->
|
|
134
|
+
<igx-badge [type]="'error'" [value]="unreadCount"></igx-badge>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Avatar shapes: `'circle'`, `'rounded'`, `'square'`. Sizes: `'small'`, `'medium'`, `'large'`, or custom CSS.
|
|
138
|
+
Badge types: `'default'`, `'info'`, `'success'`, `'warning'`, `'error'`.
|
|
139
|
+
|
|
140
|
+
## Icon
|
|
141
|
+
|
|
142
|
+
> **Docs:** [Icon Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/icon)
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { IgxIconComponent, IgxIconService } from 'igniteui-angular/icon';
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
```html
|
|
149
|
+
<!-- Material icon (default ligature-based) -->
|
|
150
|
+
<igx-icon>settings</igx-icon>
|
|
151
|
+
<igx-icon color="#e41c77">favorite</igx-icon>
|
|
152
|
+
|
|
153
|
+
<!-- SVG icon from a registered custom family -->
|
|
154
|
+
<igx-icon [family]="'my-icons'" [name]="'logo'"></igx-icon>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Register custom SVG icons in a service or component constructor:
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
export class AppComponent {
|
|
161
|
+
constructor() {
|
|
162
|
+
const iconService = inject(IgxIconService);
|
|
163
|
+
// From inline SVG string
|
|
164
|
+
iconService.addSvgIconFromText('logo', '<svg xmlns="..." viewBox="...">...</svg>', 'my-icons');
|
|
165
|
+
// From URL
|
|
166
|
+
iconService.addSvgIcon('arrow', '/assets/icons/arrow.svg', 'my-icons');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Carousel
|
|
172
|
+
|
|
173
|
+
> **Docs:** [Carousel Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/carousel)
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
import { IgxCarouselComponent, IgxSlideComponent } from 'igniteui-angular/carousel';
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```html
|
|
180
|
+
<igx-carousel [interval]="3000" [pause]="true" [loop]="true" [navigation]="true">
|
|
181
|
+
@for (slide of slides; track slide.id) {
|
|
182
|
+
<igx-slide>
|
|
183
|
+
<img [src]="slide.image" [alt]="slide.alt" />
|
|
184
|
+
<div class="slide-caption">{{ slide.caption }}</div>
|
|
185
|
+
</igx-slide>
|
|
186
|
+
}
|
|
187
|
+
</igx-carousel>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
> **AGENT INSTRUCTION:** Carousel uses Angular animations — ensure `provideAnimations()` is present in `app.config.ts`.
|
|
191
|
+
|
|
192
|
+
## Paginator
|
|
193
|
+
|
|
194
|
+
> **Docs:** [Paginator Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/paginator)
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import { IgxPaginatorComponent } from 'igniteui-angular/paginator';
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<igx-paginator
|
|
202
|
+
[totalRecords]="totalItems()"
|
|
203
|
+
[perPage]="pageSize()"
|
|
204
|
+
[selectOptions]="[5, 10, 25, 50]"
|
|
205
|
+
(perPageChange)="onPageSizeChange($event)"
|
|
206
|
+
(pageChange)="onPageChange($event)">
|
|
207
|
+
</igx-paginator>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
> **NOTE:** For grid paging, attach `<igx-paginator>` inside the grid element. See [`../../igniteui-angular-grids/references/paging-remote.md`](../../igniteui-angular-grids/references/paging-remote.md) for grid-specific paging patterns.
|
|
211
|
+
|
|
212
|
+
## Progress Indicators
|
|
213
|
+
|
|
214
|
+
> **Docs:** [Linear Progress](https://www.infragistics.com/products/ignite-ui-angular/angular/components/linear-progress) · [Circular Progress](https://www.infragistics.com/products/ignite-ui-angular/angular/components/circular-progress)
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import { IgxLinearProgressBarComponent } from 'igniteui-angular/progressbar';
|
|
218
|
+
import { IgxCircularProgressBarComponent } from 'igniteui-angular/progressbar';
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```html
|
|
222
|
+
<!-- Linear progress bar -->
|
|
223
|
+
<igx-linear-bar
|
|
224
|
+
[value]="uploadProgress()"
|
|
225
|
+
[max]="100"
|
|
226
|
+
[type]="'info'"
|
|
227
|
+
[striped]="true"
|
|
228
|
+
[animate]="true"
|
|
229
|
+
[textVisibility]="true">
|
|
230
|
+
</igx-linear-bar>
|
|
231
|
+
|
|
232
|
+
<!-- Circular progress (determinate) -->
|
|
233
|
+
<igx-circular-bar [value]="65" [max]="100" [animate]="true"></igx-circular-bar>
|
|
234
|
+
|
|
235
|
+
<!-- Circular progress (indeterminate) -->
|
|
236
|
+
<igx-circular-bar [indeterminate]="true"></igx-circular-bar>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Types for linear bar: `'default'`, `'info'`, `'success'`, `'warning'`, `'danger'`.
|
|
240
|
+
|
|
241
|
+
## Chat (AI Chat Component)
|
|
242
|
+
|
|
243
|
+
> **Docs:** [Chat Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/chat)
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
import { IgxChatComponent } from 'igniteui-angular/chat';
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```html
|
|
250
|
+
<igx-chat
|
|
251
|
+
[options]="options()"
|
|
252
|
+
[messages]="messages()"
|
|
253
|
+
[draftMessage]="draftMessage"
|
|
254
|
+
[templates]="templates()"
|
|
255
|
+
(messageCreated)="onMessageCreated($event)">
|
|
256
|
+
</igx-chat>
|
|
257
|
+
|
|
258
|
+
<ng-template #messageHeader let-message>
|
|
259
|
+
@if (message.sender !== 'user') {
|
|
260
|
+
<div>
|
|
261
|
+
<span style="font-weight: bold; color: #c00000;"
|
|
262
|
+
>Developer Support</span
|
|
263
|
+
>
|
|
264
|
+
</div>
|
|
265
|
+
}
|
|
266
|
+
</ng-template>
|
|
267
|
+
|
|
268
|
+
<ng-template #suggestionPrefix>
|
|
269
|
+
<span style="font-weight: bold">💡</span>
|
|
270
|
+
</ng-template>
|
|
271
|
+
|
|
272
|
+
<ng-template #messageContent let-message igxChatMessageContext>
|
|
273
|
+
<div [innerHTML]="message.text | fromMarkdown | async"></div>
|
|
274
|
+
</ng-template>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { IgxChatComponent, IgxChatMessageContextDirective, type IgxChatOptions } from 'igniteui-angular/chat';
|
|
279
|
+
import { MarkdownPipe } from 'igniteui-angular/chat-extras';
|
|
280
|
+
|
|
281
|
+
@Component({
|
|
282
|
+
selector: 'app-chat-features-sample',
|
|
283
|
+
styleUrls: ['./features-sample.component.scss'],
|
|
284
|
+
templateUrl: './features-sample.component.html',
|
|
285
|
+
imports: [IgxChatComponent, IgxChatMessageContextDirective, AsyncPipe, MarkdownPipe]
|
|
286
|
+
})
|
|
287
|
+
export class ChatFeaturesSampleComponent {
|
|
288
|
+
private _messageHeader = viewChild.required('messageHeader');
|
|
289
|
+
private _suggestionPrefix = viewChild.required('suggestionPrefix');
|
|
290
|
+
private _messageContent = viewChild.required('messageContent');
|
|
291
|
+
|
|
292
|
+
...
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
public options = signal<IgxChatOptions>({
|
|
296
|
+
disableAutoScroll: false,
|
|
297
|
+
disableInputAttachments: false,
|
|
298
|
+
inputPlaceholder: 'Type your message here...',
|
|
299
|
+
headerText: 'Developer Support',
|
|
300
|
+
suggestionsPosition: "below-input",
|
|
301
|
+
suggestions: [ 'Send me an e-mail when support is available.' ]
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
public templates = signal({});
|
|
305
|
+
|
|
306
|
+
constructor() {
|
|
307
|
+
effect(() => {
|
|
308
|
+
const messageHeader = this._messageHeader();
|
|
309
|
+
const suggestionPrefix = this._suggestionPrefix();
|
|
310
|
+
const messageContent = this._messageContent();
|
|
311
|
+
|
|
312
|
+
if (messageHeader && suggestionPrefix && messageContent) {
|
|
313
|
+
this.templates.set({
|
|
314
|
+
messageHeader: messageHeader,
|
|
315
|
+
suggestionPrefix: suggestionPrefix,
|
|
316
|
+
messageContent: messageContent
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
public onMessageCreated(e: any): void {
|
|
323
|
+
const newMessage = e;
|
|
324
|
+
this.messages.update(messages => [...messages, newMessage]);
|
|
325
|
+
this.options.update(options => ({ ...options, isTyping: true, suggestions: [] }));
|
|
326
|
+
|
|
327
|
+
const responseMessage = {
|
|
328
|
+
id: Date.now().toString(),
|
|
329
|
+
text: 'Our support team is currently unavailable. We\'ll get back to you as soon as possible.',
|
|
330
|
+
sender: 'support',
|
|
331
|
+
timestamp: Date.now().toString()
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
this.draftMessage = { text: '', attachments: [] };
|
|
335
|
+
this.messages.update(messages => [...messages, responseMessage]);
|
|
336
|
+
this.options.update(options => ({ ...options, isTyping: false }));
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## See Also
|
|
341
|
+
|
|
342
|
+
- [`setup.md`](./setup.md) — App providers, architecture, all entry points
|
|
343
|
+
- [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
|
|
344
|
+
- [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
|
|
345
|
+
- [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner
|
|
346
|
+
- [`directives.md`](./directives.md) — Button, Ripple, Tooltip, Drag and Drop
|
|
347
|
+
- [`../../igniteui-angular-grids/references/paging-remote.md`](../../igniteui-angular-grids/references/paging-remote.md) — Grid-specific paginator usage
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Directives
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
|
|
4
|
+
> For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
|
|
5
|
+
|
|
6
|
+
## Button & Icon Button
|
|
7
|
+
|
|
8
|
+
> **Docs:** [Button Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/button)
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import { IgxButtonDirective, IgxIconButtonDirective } from 'igniteui-angular/directives';
|
|
12
|
+
import { IgxIconComponent } from 'igniteui-angular/icon';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<!-- Text buttons -->
|
|
17
|
+
<button igxButton="flat">Flat</button>
|
|
18
|
+
<button igxButton="raised">Raised</button>
|
|
19
|
+
<button igxButton="outlined">Outlined</button>
|
|
20
|
+
<button igxButton="fab">
|
|
21
|
+
<igx-icon>add</igx-icon>
|
|
22
|
+
</button>
|
|
23
|
+
|
|
24
|
+
<!-- Icon-only buttons -->
|
|
25
|
+
<button igxIconButton="flat"><igx-icon>edit</igx-icon></button>
|
|
26
|
+
<button igxIconButton="outlined"><igx-icon>delete</igx-icon></button>
|
|
27
|
+
<button igxIconButton="contained"><igx-icon>save</igx-icon></button>
|
|
28
|
+
|
|
29
|
+
<!-- Disabled state -->
|
|
30
|
+
<button igxButton="raised" [disabled]="isLoading()">Submit</button>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Button variants for `igxButton`: `'flat'`, `'raised'`, `'outlined'`, `'fab'`.
|
|
34
|
+
Button variants for `igxIconButton`: `'flat'`, `'outlined'`, `'contained'`.
|
|
35
|
+
|
|
36
|
+
## Ripple Effect
|
|
37
|
+
|
|
38
|
+
> **Docs:** [Ripple Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/ripple)
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { IgxRippleDirective } from 'igniteui-angular/directives';
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<!-- Add to any clickable element for Material-style ink ripple -->
|
|
46
|
+
<button igxButton="raised" igxRipple>Click me</button>
|
|
47
|
+
<div igxRipple igxRippleTarget=".my-class" class="custom-surface">Interactive div</div>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Inputs: `[igxRipple]` (ripple color), `[igxRippleCentered]` (always start from center), `[igxRippleDisabled]`.
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<button igxButton="raised" igxRipple="#ff4081" [igxRippleCentered]="true">Pink ripple</button>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Tooltip
|
|
57
|
+
|
|
58
|
+
> **Docs:** [Tooltip Directive](https://www.infragistics.com/products/ignite-ui-angular/angular/components/tooltip)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { IgxTooltipDirective, IgxTooltipTargetDirective } from 'igniteui-angular/directives';
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<button igxButton [igxTooltipTarget]="myTooltip" [igxTooltipTargetShowDelay]="500">
|
|
66
|
+
Hover or focus me
|
|
67
|
+
</button>
|
|
68
|
+
<div igxTooltip #myTooltip="tooltip">Helpful tooltip text</div>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Inputs on `[igxTooltipTarget]`: `[igxTooltipTargetShowDelay]` (ms), `[igxTooltipTargetHideDelay]` (ms), `[tooltipDisabled]`.
|
|
72
|
+
|
|
73
|
+
Programmatic control:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
tooltip = viewChild.required<IgxTooltipDirective>('myTooltip');
|
|
77
|
+
|
|
78
|
+
showTooltip() { this.tooltip().open(); }
|
|
79
|
+
hideTooltip() { this.tooltip().close(); }
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Drag and Drop
|
|
83
|
+
|
|
84
|
+
> **Docs:** [Drag and Drop](https://www.infragistics.com/products/ignite-ui-angular/angular/components/drag-drop)
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { IgxDragDirective, IgxDropDirective, IDragMoveEventArgs, IDropDroppedEventArgs } from 'igniteui-angular/directives';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Basic drag and drop
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<!-- Draggable source -->
|
|
94
|
+
<div igxDrag [dragData]="item" (dragMove)="onDragMove($event)" (dragEnd)="onDragEnd($event)">
|
|
95
|
+
<igx-icon>drag_indicator</igx-icon>
|
|
96
|
+
{{ item.name }}
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<!-- Drop target -->
|
|
100
|
+
<div igxDrop (dropped)="onDrop($event)" (dragEnter)="onDragEnter($event)" (dragLeave)="onDragLeave($event)">
|
|
101
|
+
Drop here
|
|
102
|
+
</div>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
onDrop(event: IDropDroppedEventArgs) {
|
|
107
|
+
const draggedItem = event.drag.data;
|
|
108
|
+
// Move draggedItem to this drop zone
|
|
109
|
+
event.cancel = false; // allow the drop
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Ghost element (custom drag preview)
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<div igxDrag [ghostTemplate]="ghostTmpl">Drag me</div>
|
|
117
|
+
|
|
118
|
+
<ng-template #ghostTmpl>
|
|
119
|
+
<div class="custom-ghost">
|
|
120
|
+
<igx-icon>content_copy</igx-icon> Moving...
|
|
121
|
+
</div>
|
|
122
|
+
</ng-template>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Reorderable list
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<igx-list>
|
|
129
|
+
@for (item of items; track item.id) {
|
|
130
|
+
<igx-list-item igxDrag [dragData]="item" igxDrop (dropped)="reorder($event, item)">
|
|
131
|
+
<igx-icon igxListAction>drag_handle</igx-icon>
|
|
132
|
+
<span igxListLine>{{ item.name }}</span>
|
|
133
|
+
</igx-list-item>
|
|
134
|
+
}
|
|
135
|
+
</igx-list>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Key drag events: `(dragStart)`, `(dragMove)`, `(dragEnd)`, `(dragClick)`, `(transitioned)`.
|
|
139
|
+
Key drop events: `(dragEnter)`, `(dragLeave)`, `(dragOver)`, `(dropped)`.
|
|
140
|
+
|
|
141
|
+
> **NOTE:** For touch-based drag, add `importProvidersFrom(HammerModule)` to `app.config.ts` providers.
|
|
142
|
+
|
|
143
|
+
## See Also
|
|
144
|
+
|
|
145
|
+
- [`setup.md`](./setup.md) — App providers, architecture, all entry points
|
|
146
|
+
- [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
|
|
147
|
+
- [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
|
|
148
|
+
- [`data-display.md`](./data-display.md) — List, Tree, Card and other display components
|
|
149
|
+
- [`feedback.md`](./feedback.md) — Dialog, Snackbar, Toast, Banner
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Feedback & Overlay Components
|
|
2
|
+
|
|
3
|
+
> **Part of the [`igniteui-angular-components`](../SKILL.md) skill hub.**
|
|
4
|
+
> For app setup, providers, and import patterns — see [`setup.md`](./setup.md).
|
|
5
|
+
|
|
6
|
+
> **AGENT INSTRUCTION:** All components in this file rely on Angular animations and the Ignite UI overlay system. Before using any of them, ensure `provideAnimations()` (or `provideAnimationsAsync()`) is present in `app.config.ts`. If it is missing, add it — these components will throw runtime errors or silently fail to animate without it.
|
|
7
|
+
|
|
8
|
+
## Dialog
|
|
9
|
+
|
|
10
|
+
> **Docs:** [Dialog Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/dialog)
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { IgxDialogComponent, IgxDialogTitleDirective, IgxDialogActionsDirective } from 'igniteui-angular/dialog';
|
|
14
|
+
import { IgxButtonDirective } from 'igniteui-angular/directives';
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<igx-dialog
|
|
19
|
+
#confirmDialog
|
|
20
|
+
[isModal]="true"
|
|
21
|
+
[closeOnEscape]="true"
|
|
22
|
+
[closeOnOutsideSelect]="false"
|
|
23
|
+
title="Confirm Delete"
|
|
24
|
+
(closed)="onDialogClosed()">
|
|
25
|
+
<igx-dialog-title>Confirm Delete</igx-dialog-title>
|
|
26
|
+
<p>Are you sure you want to delete this item? This action cannot be undone.</p>
|
|
27
|
+
<div igxDialogActions>
|
|
28
|
+
<button igxButton="flat" (click)="confirmDialog.close()">Cancel</button>
|
|
29
|
+
<button igxButton="raised" (click)="deleteItem(); confirmDialog.close()">Delete</button>
|
|
30
|
+
</div>
|
|
31
|
+
</igx-dialog>
|
|
32
|
+
|
|
33
|
+
<button igxButton="raised" (click)="confirmDialog.open()">Delete Item</button>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Programmatic control:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
dialog = viewChild.required<IgxDialogComponent>('confirmDialog');
|
|
40
|
+
|
|
41
|
+
open() { this.dialog().open(); }
|
|
42
|
+
close() { this.dialog().close(); }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Events: `(opening)`, `(opened)`, `(closing)`, `(closed)`, `(leftButtonSelect)`, `(rightButtonSelect)`.
|
|
46
|
+
|
|
47
|
+
## Snackbar
|
|
48
|
+
|
|
49
|
+
> **Docs:** [Snackbar Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/snackbar)
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { IgxSnackbarComponent, IgxSnackbarActionDirective } from 'igniteui-angular/snackbar';
|
|
53
|
+
import { IgxButtonDirective } from 'igniteui-angular/directives';
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<igx-snackbar
|
|
58
|
+
#snackbar
|
|
59
|
+
[displayTime]="3000"
|
|
60
|
+
[autoHide]="true"
|
|
61
|
+
(animationDone)="onSnackbarDone()">
|
|
62
|
+
Item saved successfully
|
|
63
|
+
<button igxButton="flat" igxSnackbarAction (click)="undo()">UNDO</button>
|
|
64
|
+
</igx-snackbar>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Trigger in TypeScript:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
snackbar = viewChild.required<IgxSnackbarComponent>('snackbar');
|
|
71
|
+
|
|
72
|
+
save() {
|
|
73
|
+
this.dataService.save(this.item);
|
|
74
|
+
this.snackbar().open('Item saved'); // optional: pass message text
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Toast
|
|
79
|
+
|
|
80
|
+
> **Docs:** [Toast Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/toast)
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { IgxToastComponent } from 'igniteui-angular/toast';
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<igx-toast #toast [displayTime]="2000">Operation complete</igx-toast>
|
|
88
|
+
|
|
89
|
+
<button igxButton (click)="toast.open()">Trigger Toast</button>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Toast vs Snackbar: Toast is non-interactive (no action button), always auto-hides. Snackbar supports an action button and can be persistent.
|
|
93
|
+
|
|
94
|
+
## Banner
|
|
95
|
+
|
|
96
|
+
> **Docs:** [Banner Component](https://www.infragistics.com/products/ignite-ui-angular/angular/components/banner)
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { IgxBannerComponent, IgxBannerActionsDirective } from 'igniteui-angular/banner';
|
|
100
|
+
import { IgxIconComponent } from 'igniteui-angular/icon';
|
|
101
|
+
import { IgxButtonDirective } from 'igniteui-angular/directives';
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<igx-banner #banner (closed)="onBannerClosed()">
|
|
106
|
+
<igx-icon igxBannerIcon>wifi_off</igx-icon>
|
|
107
|
+
You are offline. Some features may not be available.
|
|
108
|
+
<div igxBannerActions>
|
|
109
|
+
<button igxButton="flat" (click)="banner.dismiss()">Dismiss</button>
|
|
110
|
+
<button igxButton="flat" (click)="retry()">Retry</button>
|
|
111
|
+
</div>
|
|
112
|
+
</igx-banner>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Trigger in TypeScript:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
banner = viewChild.required<IgxBannerComponent>('banner');
|
|
119
|
+
|
|
120
|
+
showOfflineWarning() { this.banner().open(); }
|
|
121
|
+
hideWarning() { this.banner().close(); }
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Events: `(opening)`, `(opened)`, `(closing)`, `(closed)`.
|
|
125
|
+
|
|
126
|
+
Banner always renders inline (not overlaid) — it pushes page content down when open.
|
|
127
|
+
|
|
128
|
+
## Key Rules
|
|
129
|
+
|
|
130
|
+
- **`provideAnimations()` is required** — add it to `app.config.ts` before using Dialog, Snackbar, Toast, or Banner
|
|
131
|
+
- **Dialog** uses the Ignite UI overlay system — set `[isModal]="true"` for blocking modals
|
|
132
|
+
- **Snackbar** vs **Toast**: Snackbar supports action buttons and can be persistent; Toast is always auto-hiding and non-interactive
|
|
133
|
+
- **Banner** renders **inline** (pushes content), not as an overlay — use Dialog for blocking prompts
|
|
134
|
+
|
|
135
|
+
## See Also
|
|
136
|
+
|
|
137
|
+
- [`setup.md`](./setup.md) — App providers, architecture, all entry points
|
|
138
|
+
- [`form-controls.md`](./form-controls.md) — Input Group, Combo, Select, Date/Time Pickers, Calendar, Checkbox, Radio, Switch, Slider
|
|
139
|
+
- [`layout.md`](./layout.md) — Tabs, Stepper, Accordion, Splitter, Navigation Drawer
|
|
140
|
+
- [`data-display.md`](./data-display.md) — List, Tree, Card and other display components
|
|
141
|
+
- [`directives.md`](./directives.md) — Button, Ripple, Tooltip, Drag and Drop
|