@apexara/ng-components 1.0.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.
Files changed (59) hide show
  1. package/README.md +1867 -0
  2. package/fesm2022/apexara-ng-components-button.mjs +66 -0
  3. package/fesm2022/apexara-ng-components-button.mjs.map +1 -0
  4. package/fesm2022/apexara-ng-components-carousel.mjs +161 -0
  5. package/fesm2022/apexara-ng-components-carousel.mjs.map +1 -0
  6. package/fesm2022/apexara-ng-components-checkbox.mjs +64 -0
  7. package/fesm2022/apexara-ng-components-checkbox.mjs.map +1 -0
  8. package/fesm2022/apexara-ng-components-chip.mjs +26 -0
  9. package/fesm2022/apexara-ng-components-chip.mjs.map +1 -0
  10. package/fesm2022/apexara-ng-components-datepicker.mjs +2175 -0
  11. package/fesm2022/apexara-ng-components-datepicker.mjs.map +1 -0
  12. package/fesm2022/apexara-ng-components-dialog.mjs +65 -0
  13. package/fesm2022/apexara-ng-components-dialog.mjs.map +1 -0
  14. package/fesm2022/apexara-ng-components-drawer.mjs +69 -0
  15. package/fesm2022/apexara-ng-components-drawer.mjs.map +1 -0
  16. package/fesm2022/apexara-ng-components-expander.mjs +41 -0
  17. package/fesm2022/apexara-ng-components-expander.mjs.map +1 -0
  18. package/fesm2022/apexara-ng-components-image.mjs +201 -0
  19. package/fesm2022/apexara-ng-components-image.mjs.map +1 -0
  20. package/fesm2022/apexara-ng-components-input.mjs +129 -0
  21. package/fesm2022/apexara-ng-components-input.mjs.map +1 -0
  22. package/fesm2022/apexara-ng-components-listbox.mjs +308 -0
  23. package/fesm2022/apexara-ng-components-listbox.mjs.map +1 -0
  24. package/fesm2022/apexara-ng-components-radiobutton.mjs +40 -0
  25. package/fesm2022/apexara-ng-components-radiobutton.mjs.map +1 -0
  26. package/fesm2022/apexara-ng-components-select.mjs +620 -0
  27. package/fesm2022/apexara-ng-components-select.mjs.map +1 -0
  28. package/fesm2022/apexara-ng-components-services.mjs +290 -0
  29. package/fesm2022/apexara-ng-components-services.mjs.map +1 -0
  30. package/fesm2022/apexara-ng-components-snackbar.mjs +279 -0
  31. package/fesm2022/apexara-ng-components-snackbar.mjs.map +1 -0
  32. package/fesm2022/apexara-ng-components-table.mjs +686 -0
  33. package/fesm2022/apexara-ng-components-table.mjs.map +1 -0
  34. package/fesm2022/apexara-ng-components-textarea.mjs +82 -0
  35. package/fesm2022/apexara-ng-components-textarea.mjs.map +1 -0
  36. package/fesm2022/apexara-ng-components-tooltip.mjs +319 -0
  37. package/fesm2022/apexara-ng-components-tooltip.mjs.map +1 -0
  38. package/fesm2022/apexara-ng-components.mjs +8 -0
  39. package/fesm2022/apexara-ng-components.mjs.map +1 -0
  40. package/package.json +146 -0
  41. package/types/apexara-ng-components-button.d.ts +27 -0
  42. package/types/apexara-ng-components-carousel.d.ts +31 -0
  43. package/types/apexara-ng-components-checkbox.d.ts +29 -0
  44. package/types/apexara-ng-components-chip.d.ts +11 -0
  45. package/types/apexara-ng-components-datepicker.d.ts +172 -0
  46. package/types/apexara-ng-components-dialog.d.ts +24 -0
  47. package/types/apexara-ng-components-drawer.d.ts +22 -0
  48. package/types/apexara-ng-components-expander.d.ts +10 -0
  49. package/types/apexara-ng-components-image.d.ts +46 -0
  50. package/types/apexara-ng-components-input.d.ts +51 -0
  51. package/types/apexara-ng-components-listbox.d.ts +70 -0
  52. package/types/apexara-ng-components-radiobutton.d.ts +30 -0
  53. package/types/apexara-ng-components-select.d.ts +111 -0
  54. package/types/apexara-ng-components-services.d.ts +96 -0
  55. package/types/apexara-ng-components-snackbar.d.ts +73 -0
  56. package/types/apexara-ng-components-table.d.ts +157 -0
  57. package/types/apexara-ng-components-textarea.d.ts +34 -0
  58. package/types/apexara-ng-components-tooltip.d.ts +54 -0
  59. package/types/apexara-ng-components.d.ts +3 -0
@@ -0,0 +1,279 @@
1
+ import { trigger, state, style, transition, animate } from '@angular/animations';
2
+ import { NgClass } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { EventEmitter, Output, Input, ViewChild, Component, createComponent, Injectable } from '@angular/core';
5
+ import { IpiImageComponent } from '@apexara/ng-components/image';
6
+ import * as i1 from '@apexara/ng-components/services';
7
+
8
+ var VerticalPosition;
9
+ (function (VerticalPosition) {
10
+ VerticalPosition[VerticalPosition["Bottom"] = 0] = "Bottom";
11
+ VerticalPosition[VerticalPosition["Top"] = 1] = "Top";
12
+ })(VerticalPosition || (VerticalPosition = {}));
13
+ var HorizontalPosition;
14
+ (function (HorizontalPosition) {
15
+ HorizontalPosition[HorizontalPosition["Left"] = 0] = "Left";
16
+ HorizontalPosition[HorizontalPosition["Center"] = 1] = "Center";
17
+ HorizontalPosition[HorizontalPosition["Right"] = 2] = "Right";
18
+ })(HorizontalPosition || (HorizontalPosition = {}));
19
+ class IpiSnackbarComponent {
20
+ constructor() {
21
+ this.closing = false;
22
+ this.closed = new EventEmitter();
23
+ }
24
+ ngAfterViewInit() {
25
+ if (!this.container) {
26
+ return;
27
+ }
28
+ this.container.nativeElement.style.height = this.container.nativeElement.scrollHeight + 'px';
29
+ }
30
+ getAnimationParams() {
31
+ return { duration: this.options?.animationDuration ? this.options.animationDuration / 3 : 1 };
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: IpiSnackbarComponent, isStandalone: true, selector: "ipi-snackbar", inputs: { message: "message", options: "options", positionOptions: "positionOptions", closing: "closing" }, outputs: { closed: "closed" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n", styles: [":host{--ipi-snackbar-animation-duration: 10s;--ipi-snackbar-background-color: #14BD6C;--ipi-snackbar-placeholder-text-color: #FFFFFF;--ipi-snackbar-message-text-color: #FFFFFF;--ipi-snackbar-error-background-color: #F96138;--ipi-snackbar-progress-color: #FFFFFF;--ipi-snackbar-x-icon-color: #FFFFFF;pointer-events:all;touch-action:manipulation}.placeholder-wrapper{height:24px;display:flex;align-items:center;align-self:stretch;gap:4px}.custom-snackbar{width:360px;height:fit-content;display:flex;position:relative;flex-direction:column;justify-content:center;align-items:flex-start;border-radius:4px;overflow:hidden;box-sizing:border-box;opacity:0;background:var(--ipi-snackbar-background-color);padding:12px 16px 16px;margin-bottom:6px}ipi-img{width:20px;height:20px}.placeholder{flex:1 0 0;color:var(--ipi-snackbar-placeholder-text-color);font-size:18px;font-style:normal;font-weight:600;line-height:22px}.message-wrapper{display:flex;align-items:flex-start;align-self:stretch;gap:10px;padding-left:24px}.message-wrapper.no-padding{padding:0}.message{flex:1 0 0;color:var(--ipi-snackbar-message-text-color);font-size:16px;font-style:normal;font-weight:400;line-height:20px}.error{background-color:var(--ipi-snackbar-error-background-color)}.vertical-1{top:.5em}.vertical-0{bottom:.5em}.horizontal-0{animation:LeftPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-1{animation:CenterPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-2{animation:RightPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.progress{max-width:392px;height:4px;position:absolute;bottom:0;opacity:.5;background:var(--ipi-snackbar-progress-color);transform:translate(-16px);animation:shrinkProgress var(--ipi-snackbar-animation-duration) ease-in-out}.x-icon{width:20px;cursor:pointer;transition:transform .3s ease;opacity:.7;padding-top:8px}.x-icon:after{font-size:36px;color:var(--ipi-snackbar-x-icon-color);content:\"\\d7\"}.x-icon:hover{animation:rotate .3s linear}@media(max-width:460px){.custom-snackbar{width:300px}}@keyframes rotate{0%{transform:rotate(0)}25%{transform:rotate(-10deg)}75%{transform:rotate(10deg)}to{transform:rotate(0)}}@keyframes shrinkProgress{0%{width:100%}to{width:0%}}@keyframes LeftPopUp{0%{left:-2em;opacity:0}to{left:.5em;opacity:1}}@keyframes CenterPopUp{0%{opacity:0}to{opacity:1}}@keyframes RightPopUp{0%{right:-2em;opacity:0}to{right:.5em;opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IpiImageComponent, selector: "ipi-img", inputs: ["src", "ariaLabel"] }], animations: [
35
+ trigger('snackbarState', [
36
+ state('open', style({
37
+ opacity: 1,
38
+ transform: 'translateX(0)',
39
+ maxHeight: '*'
40
+ })),
41
+ state('closing', style({
42
+ opacity: 0,
43
+ transform: 'translateX(50px)',
44
+ height: '0px',
45
+ margin: 0,
46
+ padding: 0,
47
+ })),
48
+ transition('open => closing', [
49
+ animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),
50
+ animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),
51
+ ]),
52
+ ]),
53
+ ] }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'ipi-snackbar', imports: [
58
+ NgClass,
59
+ IpiImageComponent,
60
+ ], animations: [
61
+ trigger('snackbarState', [
62
+ state('open', style({
63
+ opacity: 1,
64
+ transform: 'translateX(0)',
65
+ maxHeight: '*'
66
+ })),
67
+ state('closing', style({
68
+ opacity: 0,
69
+ transform: 'translateX(50px)',
70
+ height: '0px',
71
+ margin: 0,
72
+ padding: 0,
73
+ })),
74
+ transition('open => closing', [
75
+ animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),
76
+ animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),
77
+ ]),
78
+ ]),
79
+ ], template: "<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n", styles: [":host{--ipi-snackbar-animation-duration: 10s;--ipi-snackbar-background-color: #14BD6C;--ipi-snackbar-placeholder-text-color: #FFFFFF;--ipi-snackbar-message-text-color: #FFFFFF;--ipi-snackbar-error-background-color: #F96138;--ipi-snackbar-progress-color: #FFFFFF;--ipi-snackbar-x-icon-color: #FFFFFF;pointer-events:all;touch-action:manipulation}.placeholder-wrapper{height:24px;display:flex;align-items:center;align-self:stretch;gap:4px}.custom-snackbar{width:360px;height:fit-content;display:flex;position:relative;flex-direction:column;justify-content:center;align-items:flex-start;border-radius:4px;overflow:hidden;box-sizing:border-box;opacity:0;background:var(--ipi-snackbar-background-color);padding:12px 16px 16px;margin-bottom:6px}ipi-img{width:20px;height:20px}.placeholder{flex:1 0 0;color:var(--ipi-snackbar-placeholder-text-color);font-size:18px;font-style:normal;font-weight:600;line-height:22px}.message-wrapper{display:flex;align-items:flex-start;align-self:stretch;gap:10px;padding-left:24px}.message-wrapper.no-padding{padding:0}.message{flex:1 0 0;color:var(--ipi-snackbar-message-text-color);font-size:16px;font-style:normal;font-weight:400;line-height:20px}.error{background-color:var(--ipi-snackbar-error-background-color)}.vertical-1{top:.5em}.vertical-0{bottom:.5em}.horizontal-0{animation:LeftPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-1{animation:CenterPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-2{animation:RightPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.progress{max-width:392px;height:4px;position:absolute;bottom:0;opacity:.5;background:var(--ipi-snackbar-progress-color);transform:translate(-16px);animation:shrinkProgress var(--ipi-snackbar-animation-duration) ease-in-out}.x-icon{width:20px;cursor:pointer;transition:transform .3s ease;opacity:.7;padding-top:8px}.x-icon:after{font-size:36px;color:var(--ipi-snackbar-x-icon-color);content:\"\\d7\"}.x-icon:hover{animation:rotate .3s linear}@media(max-width:460px){.custom-snackbar{width:300px}}@keyframes rotate{0%{transform:rotate(0)}25%{transform:rotate(-10deg)}75%{transform:rotate(10deg)}to{transform:rotate(0)}}@keyframes shrinkProgress{0%{width:100%}to{width:0%}}@keyframes LeftPopUp{0%{left:-2em;opacity:0}to{left:.5em;opacity:1}}@keyframes CenterPopUp{0%{opacity:0}to{opacity:1}}@keyframes RightPopUp{0%{right:-2em;opacity:0}to{right:.5em;opacity:1}}\n"] }]
80
+ }], propDecorators: { container: [{
81
+ type: ViewChild,
82
+ args: ['container']
83
+ }], message: [{
84
+ type: Input
85
+ }], options: [{
86
+ type: Input
87
+ }], positionOptions: [{
88
+ type: Input
89
+ }], closing: [{
90
+ type: Input
91
+ }], closed: [{
92
+ type: Output
93
+ }] } });
94
+
95
+ class IpiSnackbarService {
96
+ constructor(appRef, overlayService) {
97
+ this.appRef = appRef;
98
+ this.overlayService = overlayService;
99
+ this.maxSnackbars = 5;
100
+ this.snackbarContainerMap = {};
101
+ this.defaultSnackbarOptions = {
102
+ error: false,
103
+ shouldClose: true,
104
+ duration: 5,
105
+ animationDuration: 1,
106
+ position: {
107
+ verticalPosition: VerticalPosition.Bottom,
108
+ horizontalPosition: HorizontalPosition.Center,
109
+ },
110
+ backgroundColor: '#14BD6C',
111
+ errorBackgroundColor: '#F96138',
112
+ progressColor: '#FFFFFF',
113
+ placeholderTextColor: '#FFFFFF',
114
+ messageTextColor: '#FFFFFF',
115
+ xIconColor: '#FFFFFF',
116
+ };
117
+ this.snackbarsArray = [];
118
+ }
119
+ open(message, options, component, data) {
120
+ const snackbarOptions = {
121
+ ...this.defaultSnackbarOptions,
122
+ ...options,
123
+ };
124
+ const snackbarContainerRef = this.createSnackbarContainer(snackbarOptions.position);
125
+ const snackbarRef = this.createComponent(component ? component : IpiSnackbarComponent, snackbarOptions, snackbarContainerRef, component ? data : undefined);
126
+ if (!snackbarRef) {
127
+ return;
128
+ }
129
+ if (message && !component) {
130
+ snackbarRef.instance.message = message;
131
+ }
132
+ this.closeIfMaxSnackbar();
133
+ this.snackbarsArray.push({
134
+ containerId: this.generateSnackbarContainerId(snackbarOptions.position),
135
+ ref: snackbarRef,
136
+ options: snackbarOptions,
137
+ });
138
+ this.subscribeToClosingEvents(snackbarRef);
139
+ }
140
+ setMaxSnackbars(length) {
141
+ this.maxSnackbars = length;
142
+ }
143
+ updateDefaultOptions(options) {
144
+ this.defaultSnackbarOptions = { ...this.defaultSnackbarOptions, ...options };
145
+ }
146
+ createSnackbarContainer(position) {
147
+ const id = this.generateSnackbarContainerId(position);
148
+ if (this.snackbarContainerMap[id]) {
149
+ return this.snackbarContainerMap[id];
150
+ }
151
+ this.snackbarContainerMap[id] = document.createElement('div');
152
+ this.applySnackbarContainerStyles(this.snackbarContainerMap[id], position);
153
+ this.overlayService.appendToOverlay(this.snackbarContainerMap[id], false);
154
+ return this.snackbarContainerMap[id];
155
+ }
156
+ createComponent(component, options, container, data) {
157
+ const componentRef = createComponent(component, { environmentInjector: this.appRef.injector });
158
+ if (!componentRef.instance) {
159
+ return;
160
+ }
161
+ componentRef.instance.data = data;
162
+ componentRef.instance.options = options;
163
+ this.appRef.attachView(componentRef.hostView);
164
+ const snackbarElement = componentRef.hostView.rootNodes[0];
165
+ this.applySnackbarStyles(snackbarElement, options);
166
+ container.appendChild(snackbarElement);
167
+ if (options.shouldClose) {
168
+ setTimeout(() => {
169
+ const closeIndex = this.findSnackbarElementIndexFromRef(componentRef);
170
+ if (closeIndex === undefined) {
171
+ return;
172
+ }
173
+ this.close(closeIndex);
174
+ }, (2 * options.animationDuration + options.duration) * 1000);
175
+ }
176
+ return componentRef;
177
+ }
178
+ applySnackbarStyles(snackbarElement, options) {
179
+ const styles = {
180
+ '--ipi-snackbar-background-color': options.backgroundColor,
181
+ '--ipi-snackbar-placeholder-text-color': options.placeholderTextColor,
182
+ '--ipi-snackbar-message-text-color': options.messageTextColor,
183
+ '--ipi-snackbar-progress-color': options.progressColor,
184
+ '--ipi-snackbar-x-icon-color': options.xIconColor,
185
+ '--ipi-snackbar-animation-duration': options.animationDuration ? `${options.animationDuration}s` : undefined
186
+ };
187
+ for (const [cssVar, value] of Object.entries(styles)) {
188
+ if (value) {
189
+ snackbarElement.style.setProperty(cssVar, value);
190
+ }
191
+ }
192
+ const position = options.position ? options.position : this.defaultSnackbarOptions.position;
193
+ snackbarElement.querySelector('div:first-child').classList.add(`horizontal-${position.horizontalPosition}`, `vertical-${position.verticalPosition}`);
194
+ }
195
+ closeIfMaxSnackbar() {
196
+ if (this.snackbarsArray.length === this.maxSnackbars) {
197
+ this.close(0);
198
+ }
199
+ }
200
+ subscribeToClosingEvents(snackbarRef) {
201
+ snackbarRef.instance.closed.subscribe(() => {
202
+ const closeIndex = this.findSnackbarElementIndexFromRef(snackbarRef);
203
+ this.close(closeIndex);
204
+ });
205
+ snackbarRef.onDestroy(() => {
206
+ snackbarRef.instance.closed.unsubscribe();
207
+ });
208
+ }
209
+ applySnackbarContainerStyles(container, position) {
210
+ Object.assign(container.style, {
211
+ position: 'fixed',
212
+ zIndex: '1000',
213
+ display: 'flex',
214
+ flexDirection: 'column',
215
+ alignItems: 'flex-end',
216
+ });
217
+ Object.assign(container.style, {
218
+ left: '50%',
219
+ bottom: '0',
220
+ transform: 'translateX(-50%)',
221
+ });
222
+ switch (position.horizontalPosition) {
223
+ case HorizontalPosition.Left:
224
+ Object.assign(container.style, {
225
+ left: '0',
226
+ right: '',
227
+ transform: 'translateX(0)',
228
+ });
229
+ break;
230
+ case HorizontalPosition.Right:
231
+ Object.assign(container.style, {
232
+ right: '0',
233
+ left: '',
234
+ transform: 'translateX(0)',
235
+ });
236
+ }
237
+ if (position.verticalPosition === VerticalPosition.Top) {
238
+ container.style.top = '0';
239
+ container.style.bottom = '';
240
+ }
241
+ else {
242
+ container.style.flexDirection = 'column-reverse';
243
+ }
244
+ }
245
+ close(index) {
246
+ const snackbar = this.snackbarsArray[index];
247
+ if (!snackbar || !snackbar.ref || !snackbar.ref.instance) {
248
+ return;
249
+ }
250
+ if ('closing' in snackbar.ref.instance) {
251
+ snackbar.ref.instance.closing = true;
252
+ }
253
+ this.snackbarsArray.splice(index, 1);
254
+ setTimeout(() => {
255
+ snackbar.ref.destroy();
256
+ }, snackbar.options.animationDuration * 1000);
257
+ }
258
+ generateSnackbarContainerId(position) {
259
+ return `${position.horizontalPosition}_${position.verticalPosition}`;
260
+ }
261
+ findSnackbarElementIndexFromRef(ref) {
262
+ return this.snackbarsArray.findIndex(snackbar => snackbar.ref === ref);
263
+ }
264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, deps: [{ token: i0.ApplicationRef }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Injectable }); }
265
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, providedIn: 'root' }); }
266
+ }
267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, decorators: [{
268
+ type: Injectable,
269
+ args: [{
270
+ providedIn: 'root',
271
+ }]
272
+ }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i1.OverlayService }] });
273
+
274
+ /**
275
+ * Generated bundle index. Do not edit.
276
+ */
277
+
278
+ export { HorizontalPosition, IpiSnackbarComponent, IpiSnackbarService, VerticalPosition };
279
+ //# sourceMappingURL=apexara-ng-components-snackbar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apexara-ng-components-snackbar.mjs","sources":["../../../../projects/apexara/ng-components/snackbar/src/snackbar.component.ts","../../../../projects/apexara/ng-components/snackbar/src/snackbar.component.html","../../../../projects/apexara/ng-components/snackbar/src/snackbar.service.ts","../../../../projects/apexara/ng-components/snackbar/apexara-ng-components-snackbar.ts"],"sourcesContent":["import { trigger, state, style, transition, animate } from '@angular/animations';\nimport { NgClass } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';\n\nimport { IpiImageComponent } from '@apexara/ng-components/image';\n\nexport enum VerticalPosition {\n Bottom,\n Top,\n}\n\nexport enum HorizontalPosition {\n Left,\n Center,\n Right,\n}\n\nexport interface IpiSnackbarOptions {\n title?: string;\n icon?: string;\n error: boolean;\n shouldClose: boolean;\n duration: number;\n animationDuration: number;\n position: SnackbarPosition;\n backgroundColor: string;\n errorBackgroundColor: string;\n progressColor: string;\n placeholderTextColor: string;\n messageTextColor: string;\n xIconColor: string;\n}\n\nexport interface SnackbarPosition {\n horizontalPosition?: HorizontalPosition;\n verticalPosition?: VerticalPosition;\n}\n\n@Component({\n selector: 'ipi-snackbar',\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.css'],\n imports: [\n NgClass,\n IpiImageComponent,\n ],\n animations: [\n trigger('snackbarState', [\n state('open', style({\n opacity: 1,\n transform: 'translateX(0)',\n maxHeight: '*'\n })),\n state('closing', style({\n opacity: 0,\n transform: 'translateX(50px)',\n height: '0px',\n margin: 0,\n padding: 0,\n })),\n transition('open => closing', [\n animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),\n animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),\n ]),\n ]),\n ],\n})\n\nexport class IpiSnackbarComponent {\n\n @ViewChild('container') container!: ElementRef<HTMLDivElement>;\n\n @Input() message!: String;\n @Input() options!: IpiSnackbarOptions;\n\n @Input() positionOptions!: SnackbarPosition;\n\n @Input() closing: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public ngAfterViewInit(): void {\n if (!this.container) {\n return;\n }\n\n this.container.nativeElement.style.height = this.container.nativeElement.scrollHeight + 'px';\n }\n\n public getAnimationParams() {\n return { duration: this.options?.animationDuration ? this.options.animationDuration / 3 : 1 };\n }\n\n}\n","<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n","import { Injectable, ComponentRef, ApplicationRef, EmbeddedViewRef, createComponent } from '@angular/core';\n\nimport { OverlayService } from '@apexara/ng-components/services';\n\nimport { IpiSnackbarComponent, IpiSnackbarOptions, SnackbarPosition, VerticalPosition, HorizontalPosition } from './snackbar.component';\n\ntype SnackbarComponentRef = ComponentRef<IpiSnackbarComponent | unknown>;\n\ninterface SnackbarElement {\n containerId: string;\n ref: SnackbarComponentRef;\n options: IpiSnackbarOptions;\n}\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class IpiSnackbarService {\n\n constructor(\n private appRef: ApplicationRef,\n private overlayService: OverlayService) { }\n\n private maxSnackbars = 5;\n\n private snackbarContainerMap: Record<string, HTMLElement> = { };\n\n private defaultSnackbarOptions: IpiSnackbarOptions = {\n error: false,\n shouldClose: true,\n duration: 5,\n animationDuration: 1,\n position: {\n verticalPosition: VerticalPosition.Bottom,\n horizontalPosition: HorizontalPosition.Center,\n },\n backgroundColor: '#14BD6C',\n errorBackgroundColor: '#F96138',\n progressColor: '#FFFFFF',\n placeholderTextColor: '#FFFFFF',\n messageTextColor: '#FFFFFF',\n xIconColor: '#FFFFFF',\n };\n\n private snackbarsArray: SnackbarElement[] = [ ];\n\n public open(message?: string, options?: Partial<IpiSnackbarOptions>, component?: unknown, data?: Record<string, unknown>): void {\n const snackbarOptions: IpiSnackbarOptions = {\n ...this.defaultSnackbarOptions,\n ...options,\n };\n\n const snackbarContainerRef = this.createSnackbarContainer(snackbarOptions.position);\n\n const snackbarRef = this.createComponent(\n component ? component : IpiSnackbarComponent,\n snackbarOptions,\n snackbarContainerRef,\n component ? data : undefined,\n );\n\n if (!snackbarRef) {\n return;\n }\n\n if (message && !component) {\n snackbarRef.instance.message = message;\n }\n\n this.closeIfMaxSnackbar();\n\n this.snackbarsArray.push({\n containerId: this.generateSnackbarContainerId(snackbarOptions.position),\n ref: snackbarRef,\n options: snackbarOptions,\n });\n\n this.subscribeToClosingEvents(snackbarRef);\n }\n\n public setMaxSnackbars(length: number): void {\n this.maxSnackbars = length;\n }\n\n public updateDefaultOptions(options: Partial<IpiSnackbarOptions>): void {\n this.defaultSnackbarOptions = { ...this.defaultSnackbarOptions, ...options };\n }\n\n private createSnackbarContainer(position: SnackbarPosition): HTMLElement {\n const id = this.generateSnackbarContainerId(position);\n\n if (this.snackbarContainerMap[id]) {\n return this.snackbarContainerMap[id];\n }\n\n this.snackbarContainerMap[id] = document.createElement('div');\n\n this.applySnackbarContainerStyles(this.snackbarContainerMap[id], position);\n\n this.overlayService.appendToOverlay(this.snackbarContainerMap[id], false);\n\n return this.snackbarContainerMap[id];\n }\n\n private createComponent(component: any, options: IpiSnackbarOptions, container: HTMLElement, data?: Record<string, unknown>): ComponentRef<any> | void {\n const componentRef = createComponent(component, { environmentInjector: this.appRef.injector });\n\n if (!componentRef.instance) {\n return;\n }\n\n (componentRef.instance as any).data = data;\n (componentRef.instance as any).options = options;\n\n this.appRef.attachView(componentRef.hostView);\n\n const snackbarElement = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n\n this.applySnackbarStyles(snackbarElement, options);\n\n container.appendChild(snackbarElement);\n\n if (options.shouldClose) {\n setTimeout(() => {\n const closeIndex = this.findSnackbarElementIndexFromRef(componentRef);\n\n if (closeIndex === undefined) {\n return;\n }\n\n this.close(closeIndex);\n }, (2 * options.animationDuration + options.duration) * 1000);\n }\n\n return componentRef;\n }\n\n private applySnackbarStyles(snackbarElement: HTMLElement, options: IpiSnackbarOptions): void {\n const styles = {\n '--ipi-snackbar-background-color': options.backgroundColor,\n '--ipi-snackbar-placeholder-text-color': options.placeholderTextColor,\n '--ipi-snackbar-message-text-color': options.messageTextColor,\n '--ipi-snackbar-progress-color': options.progressColor,\n '--ipi-snackbar-x-icon-color': options.xIconColor,\n '--ipi-snackbar-animation-duration': options.animationDuration ? `${options.animationDuration}s` : undefined\n };\n \n for (const [cssVar, value] of Object.entries(styles)) {\n if (value) {\n snackbarElement.style.setProperty(cssVar, value);\n }\n }\n\n const position = options.position ? options.position : this.defaultSnackbarOptions.position!;\n\n snackbarElement.querySelector('div:first-child')!.classList.add(`horizontal-${position.horizontalPosition}`, `vertical-${position.verticalPosition}`);\n }\n\n private closeIfMaxSnackbar(): void {\n if (this.snackbarsArray.length === this.maxSnackbars) {\n this.close(0);\n }\n }\n\n private subscribeToClosingEvents(snackbarRef: SnackbarComponentRef): void {\n (snackbarRef.instance as any).closed.subscribe(() => {\n const closeIndex = this.findSnackbarElementIndexFromRef(snackbarRef);\n\n this.close(closeIndex);\n });\n\n snackbarRef.onDestroy(() => {\n (snackbarRef.instance as any).closed.unsubscribe();\n });\n }\n\n private applySnackbarContainerStyles(container: HTMLElement, position: SnackbarPosition): void {\n Object.assign(container.style, {\n position: 'fixed',\n zIndex: '1000',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n });\n\n Object.assign(container.style, {\n left: '50%',\n bottom: '0',\n transform: 'translateX(-50%)',\n });\n\n switch (position.horizontalPosition) {\n case HorizontalPosition.Left:\n Object.assign(container.style, {\n left: '0',\n right: '',\n transform: 'translateX(0)',\n });\n\n break;\n\n case HorizontalPosition.Right:\n Object.assign(container.style, {\n right: '0',\n left: '',\n transform: 'translateX(0)',\n });\n }\n\n if (position.verticalPosition === VerticalPosition.Top) {\n container.style.top = '0';\n container.style.bottom = '';\n } else {\n container.style.flexDirection = 'column-reverse';\n }\n }\n\n private close(index: number): void {\n const snackbar = this.snackbarsArray[index];\n\n if (!snackbar || !snackbar.ref || !snackbar.ref.instance) {\n return;\n }\n\n if ('closing' in (snackbar.ref.instance as object)) {\n (snackbar.ref.instance as any).closing = true;\n }\n\n this.snackbarsArray.splice(index, 1);\n\n setTimeout(() => {\n snackbar.ref.destroy();\n }, snackbar.options.animationDuration * 1000);\n }\n\n private generateSnackbarContainerId(position: SnackbarPosition): string {\n return `${position.horizontalPosition}_${position.verticalPosition}`;\n }\n\n private findSnackbarElementIndexFromRef(ref: SnackbarComponentRef): number {\n return this.snackbarsArray.findIndex(snackbar => snackbar.ref === ref);\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}