@frxjs/ngx-timeline 1.0.5 → 1.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.
Files changed (31) hide show
  1. package/README.md +136 -136
  2. package/bundles/frxjs-ngx-timeline.umd.js +658 -653
  3. package/bundles/frxjs-ngx-timeline.umd.js.map +1 -1
  4. package/esm2015/frxjs-ngx-timeline.js +7 -7
  5. package/esm2015/lib/components/index.js +3 -3
  6. package/esm2015/lib/components/ngx-timeline-event/ngx-timeline-event.component.js +55 -55
  7. package/esm2015/lib/components/ngx-timeline.component.js +146 -147
  8. package/esm2015/lib/models/NgxConfigObj.js +93 -93
  9. package/esm2015/lib/models/NgxTimelineEvent.js +5 -5
  10. package/esm2015/lib/models/index.js +3 -3
  11. package/esm2015/lib/ngx-timeline.module.js +22 -22
  12. package/esm2015/lib/pipes/index.js +2 -2
  13. package/esm2015/lib/pipes/ngx-date-pipe.js +27 -27
  14. package/esm2015/public-api.js +7 -7
  15. package/fesm2015/frxjs-ngx-timeline.js +323 -324
  16. package/fesm2015/frxjs-ngx-timeline.js.map +1 -1
  17. package/frxjs-ngx-timeline.d.ts +7 -7
  18. package/frxjs-ngx-timeline.metadata.json +1 -1
  19. package/lib/components/index.d.ts +2 -2
  20. package/lib/components/ngx-timeline-event/ngx-timeline-event.component.d.ts +35 -35
  21. package/lib/components/ngx-timeline.component.d.ts +76 -76
  22. package/lib/models/NgxConfigObj.d.ts +59 -59
  23. package/lib/models/NgxTimelineEvent.d.ts +29 -29
  24. package/lib/models/index.d.ts +2 -2
  25. package/lib/ngx-timeline.module.d.ts +2 -2
  26. package/lib/pipes/index.d.ts +1 -1
  27. package/lib/pipes/ngx-date-pipe.d.ts +7 -7
  28. package/package.json +3 -3
  29. package/public-api.d.ts +4 -4
  30. package/bundles/frxjs-ngx-timeline.umd.min.js +0 -2
  31. package/bundles/frxjs-ngx-timeline.umd.min.js.map +0 -1
@@ -6,344 +6,343 @@ import localeFr from '@angular/common/locales/fr';
6
6
  import localeDe from '@angular/common/locales/de';
7
7
  import localeEs from '@angular/common/locales/es';
8
8
 
9
- let supportedLanguageCodes = ['en', 'it', 'fr', 'de', 'es'];
10
- let dateConfigMap = {
11
- en: {
12
- code: 'en-US',
13
- fullDate: 'MM/dd/yyyy h:mm a',
14
- dayMonthYear: 'dd MMMM yyyy',
15
- monthYear: 'MMMM yyyy',
16
- year: 'yyyy',
17
- hoursMinutes: 'hh:mm a'
18
- },
19
- it: {
20
- code: 'it-IT',
21
- fullDate: 'dd/MM/yyyy H:mm',
22
- dayMonthYear: 'dd MMMM yyyy',
23
- monthYear: 'MMMM yyyy',
24
- year: 'yyyy',
25
- hoursMinutes: 'HH:mm'
26
- },
27
- fr: {
28
- code: 'fr-FR',
29
- fullDate: 'dd/MM/yyyy H:mm',
30
- dayMonthYear: 'dd MMMM yyyy',
31
- monthYear: 'MMMM yyyy',
32
- year: 'yyyy',
33
- hoursMinutes: 'HH:mm'
34
- },
35
- de: {
36
- code: 'de',
37
- fullDate: 'dd/MM/yyyy H:mm',
38
- dayMonthYear: 'dd MMMM yyyy',
39
- monthYear: 'MMMM yyyy',
40
- year: 'yyyy',
41
- hoursMinutes: 'HH:mm'
42
- },
43
- es: {
44
- code: 'es',
45
- fullDate: 'dd/MM/yyyy H:mm',
46
- dayMonthYear: 'dd MMMM yyyy',
47
- monthYear: 'MMMM yyyy',
48
- year: 'yyyy',
49
- hoursMinutes: 'HH:mm'
50
- }
51
- };
52
- var NgxDateFormat;
53
- (function (NgxDateFormat) {
54
- NgxDateFormat["DAY_MONTH_YEAR"] = "DAY_MONTH_YEAR";
55
- NgxDateFormat["FULL_DATE"] = "FULL_DATE";
56
- NgxDateFormat["MONTH_YEAR"] = "MONTH_YEAR";
57
- NgxDateFormat["HOURS_MINUTES"] = "HOURS_MINUTES";
58
- NgxDateFormat["YEAR"] = "YEAR";
59
- })(NgxDateFormat || (NgxDateFormat = {}));
60
- let fieldConfigDate = {
61
- MONTH_YEAR: 'monthYear',
62
- YEAR: 'year',
63
- HOURS_MINUTES: 'hoursMinutes',
64
- FULL_DATE: 'fullDate',
65
- DAY_MONTH_YEAR: 'dayMonthYear'
66
- };
67
- /**
68
- * Enum used to set the group event logic
69
- */
70
- var NgxTimelineEventGroup;
71
- (function (NgxTimelineEventGroup) {
72
- NgxTimelineEventGroup["YEAR"] = "YEAR";
73
- NgxTimelineEventGroup["MONTH_YEAR"] = "MONTH_YEAR";
74
- NgxTimelineEventGroup["DAY_MONTH_YEAR"] = "DAY_MONTH_YEAR";
75
- })(NgxTimelineEventGroup || (NgxTimelineEventGroup = {}));
76
- let fieldsToAddEventGroup = {
77
- YEAR: ['getFullYear'],
78
- MONTH_YEAR: ['getFullYear', 'getMonth'],
79
- DAY_MONTH_YEAR: ['getFullYear', 'getMonth', 'getDate']
80
- };
81
- let periodKeyDateFormat = {
82
- YEAR: NgxDateFormat.YEAR,
83
- MONTH_YEAR: NgxDateFormat.MONTH_YEAR,
84
- DAY_MONTH_YEAR: NgxDateFormat.DAY_MONTH_YEAR,
85
- };
86
- /**
87
- * Enum used to set the change side event logic
88
- */
89
- var NgxTimelineEventChangeSideInGroup;
90
- (function (NgxTimelineEventChangeSideInGroup) {
91
- NgxTimelineEventChangeSideInGroup["ALL"] = "ALL";
92
- NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_HMS"] = "ON_DIFFERENT_HMS";
93
- NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_DAY"] = "ON_DIFFERENT_DAY";
94
- NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_MONTH"] = "ON_DIFFERENT_MONTH";
95
- })(NgxTimelineEventChangeSideInGroup || (NgxTimelineEventChangeSideInGroup = {}));
96
- let fieldsToCheckEventChangeSideInGroup = {
97
- ON_DIFFERENT_MONTH: ['getFullYear', 'getMonth'],
98
- ON_DIFFERENT_DAY: ['getFullYear', 'getMonth', 'getDate'],
99
- ON_DIFFERENT_HMS: ['getFullYear', 'getMonth', 'getDate', 'getHours', 'getMinutes', 'getSeconds']
9
+ let supportedLanguageCodes = ['en', 'it', 'fr', 'de', 'es'];
10
+ let dateConfigMap = {
11
+ en: {
12
+ code: 'en-US',
13
+ fullDate: 'MM/dd/yyyy h:mm a',
14
+ dayMonthYear: 'dd MMMM yyyy',
15
+ monthYear: 'MMMM yyyy',
16
+ year: 'yyyy',
17
+ hoursMinutes: 'hh:mm a'
18
+ },
19
+ it: {
20
+ code: 'it-IT',
21
+ fullDate: 'dd/MM/yyyy H:mm',
22
+ dayMonthYear: 'dd MMMM yyyy',
23
+ monthYear: 'MMMM yyyy',
24
+ year: 'yyyy',
25
+ hoursMinutes: 'HH:mm'
26
+ },
27
+ fr: {
28
+ code: 'fr-FR',
29
+ fullDate: 'dd/MM/yyyy H:mm',
30
+ dayMonthYear: 'dd MMMM yyyy',
31
+ monthYear: 'MMMM yyyy',
32
+ year: 'yyyy',
33
+ hoursMinutes: 'HH:mm'
34
+ },
35
+ de: {
36
+ code: 'de',
37
+ fullDate: 'dd/MM/yyyy H:mm',
38
+ dayMonthYear: 'dd MMMM yyyy',
39
+ monthYear: 'MMMM yyyy',
40
+ year: 'yyyy',
41
+ hoursMinutes: 'HH:mm'
42
+ },
43
+ es: {
44
+ code: 'es',
45
+ fullDate: 'dd/MM/yyyy H:mm',
46
+ dayMonthYear: 'dd MMMM yyyy',
47
+ monthYear: 'MMMM yyyy',
48
+ year: 'yyyy',
49
+ hoursMinutes: 'HH:mm'
50
+ }
51
+ };
52
+ var NgxDateFormat;
53
+ (function (NgxDateFormat) {
54
+ NgxDateFormat["DAY_MONTH_YEAR"] = "DAY_MONTH_YEAR";
55
+ NgxDateFormat["FULL_DATE"] = "FULL_DATE";
56
+ NgxDateFormat["MONTH_YEAR"] = "MONTH_YEAR";
57
+ NgxDateFormat["HOURS_MINUTES"] = "HOURS_MINUTES";
58
+ NgxDateFormat["YEAR"] = "YEAR";
59
+ })(NgxDateFormat || (NgxDateFormat = {}));
60
+ let fieldConfigDate = {
61
+ MONTH_YEAR: 'monthYear',
62
+ YEAR: 'year',
63
+ HOURS_MINUTES: 'hoursMinutes',
64
+ FULL_DATE: 'fullDate',
65
+ DAY_MONTH_YEAR: 'dayMonthYear'
66
+ };
67
+ /**
68
+ * Enum used to set the group event logic
69
+ */
70
+ var NgxTimelineEventGroup;
71
+ (function (NgxTimelineEventGroup) {
72
+ NgxTimelineEventGroup["YEAR"] = "YEAR";
73
+ NgxTimelineEventGroup["MONTH_YEAR"] = "MONTH_YEAR";
74
+ NgxTimelineEventGroup["DAY_MONTH_YEAR"] = "DAY_MONTH_YEAR";
75
+ })(NgxTimelineEventGroup || (NgxTimelineEventGroup = {}));
76
+ let fieldsToAddEventGroup = {
77
+ YEAR: ['getFullYear'],
78
+ MONTH_YEAR: ['getFullYear', 'getMonth'],
79
+ DAY_MONTH_YEAR: ['getFullYear', 'getMonth', 'getDate']
80
+ };
81
+ let periodKeyDateFormat = {
82
+ YEAR: NgxDateFormat.YEAR,
83
+ MONTH_YEAR: NgxDateFormat.MONTH_YEAR,
84
+ DAY_MONTH_YEAR: NgxDateFormat.DAY_MONTH_YEAR,
85
+ };
86
+ /**
87
+ * Enum used to set the change side event logic
88
+ */
89
+ var NgxTimelineEventChangeSideInGroup;
90
+ (function (NgxTimelineEventChangeSideInGroup) {
91
+ NgxTimelineEventChangeSideInGroup["ALL"] = "ALL";
92
+ NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_HMS"] = "ON_DIFFERENT_HMS";
93
+ NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_DAY"] = "ON_DIFFERENT_DAY";
94
+ NgxTimelineEventChangeSideInGroup["ON_DIFFERENT_MONTH"] = "ON_DIFFERENT_MONTH";
95
+ })(NgxTimelineEventChangeSideInGroup || (NgxTimelineEventChangeSideInGroup = {}));
96
+ let fieldsToCheckEventChangeSideInGroup = {
97
+ ON_DIFFERENT_MONTH: ['getFullYear', 'getMonth'],
98
+ ON_DIFFERENT_DAY: ['getFullYear', 'getMonth', 'getDate'],
99
+ ON_DIFFERENT_HMS: ['getFullYear', 'getMonth', 'getDate', 'getHours', 'getMinutes', 'getSeconds']
100
100
  };
101
101
 
102
- var NgxTimelineItemPosition;
103
- (function (NgxTimelineItemPosition) {
104
- NgxTimelineItemPosition["ON_LEFT"] = "ON_LEFT";
105
- NgxTimelineItemPosition["ON_RIGHT"] = "ON_RIGHT";
102
+ var NgxTimelineItemPosition;
103
+ (function (NgxTimelineItemPosition) {
104
+ NgxTimelineItemPosition["ON_LEFT"] = "ON_LEFT";
105
+ NgxTimelineItemPosition["ON_RIGHT"] = "ON_RIGHT";
106
106
  })(NgxTimelineItemPosition || (NgxTimelineItemPosition = {}));
107
107
 
108
- class NgxTimelineComponent {
109
- constructor() {
110
- /**
111
- * Boolean used to enable or disable the animations
112
- */
113
- this.enableAnimation = true;
114
- /**
115
- * Logic to be applied in order to group events
116
- */
117
- this.groupEvent = NgxTimelineEventGroup.MONTH_YEAR;
118
- /**
119
- * Logic to be applied in order to put evetns on LEFT or RIGHT
120
- */
121
- this.changeSideInGroup = NgxTimelineEventChangeSideInGroup.ON_DIFFERENT_DAY;
122
- /**
123
- * Output click event emitter
124
- */
125
- this.clickEmitter = new BehaviorSubject(null);
126
- this.groups = {};
127
- this.periods = [];
128
- this.items = [];
129
- this.ngxTimelineItemPosition = NgxTimelineItemPosition;
130
- this.ngxDateFormat = NgxDateFormat;
131
- this.separator = '/';
132
- }
133
- ngOnInit() {
134
- this.groupEvents(this.events);
135
- }
136
- ngOnChanges(changes) {
137
- this.groupEvents(this.events);
138
- }
139
- getPeriodKeyDateFormat() {
140
- return periodKeyDateFormat[this.groupEvent];
141
- }
142
- clear() {
143
- this.groups = {};
144
- this.periods = [];
145
- this.items = [];
146
- }
147
- groupEvents(events) {
148
- if (events) {
149
- this.clear();
150
- this.sortEvents(events);
151
- this.setGroups(events);
152
- this.setPeriods();
153
- this.setItems();
154
- }
155
- }
156
- sortEvents(events) {
157
- events.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
158
- }
159
- setGroups(events) {
160
- events.forEach((event) => {
161
- // conversion from string to actual Date
162
- event.timestamp = new Date(event.timestamp);
163
- const periodKey = this.getPeriodKeyFromEvent(event);
164
- if (!this.groups[periodKey]) {
165
- this.groups[periodKey] = [];
166
- }
167
- this.groups[periodKey].push(event);
168
- });
169
- }
170
- setItems() {
171
- this.periods.forEach((p) => {
172
- // insert first the period
173
- this.items.push(p);
174
- // in each period putting items on left
175
- const onLeft = true;
176
- const periodInfo = p.periodInfo;
177
- // insert then all the events in this period
178
- this.addPeriodEvents(periodInfo, onLeft);
179
- // onLeft = this.addEventItemsAndGetIfOnLeft(periodInfo, onLeft);
180
- });
181
- }
182
- addPeriodEvents(periodInfo, onLeft) {
183
- this.groups[periodInfo.periodKey].forEach((event, index) => {
184
- const prevEvent = this.groups[periodInfo.periodKey][index - 1];
185
- if (index > 0 && this.compareEvents(prevEvent, event)) {
186
- onLeft = !onLeft;
187
- }
188
- this.pushEventOnItems(event, onLeft);
189
- });
190
- // return onLeft;
191
- }
192
- pushEventOnItems(event, onLeft) {
193
- this.items.push({
194
- eventInfo: Object.assign({}, event),
195
- position: onLeft ?
196
- this.ngxTimelineItemPosition.ON_LEFT : this.ngxTimelineItemPosition.ON_RIGHT
197
- });
198
- }
199
- /**
200
- * Compare the events inside the same group
201
- */
202
- compareEvents(prevEvent, event) {
203
- return this.changeSideInGroup === NgxTimelineEventChangeSideInGroup.ALL ||
204
- this.compareEventsField(prevEvent, event, ...fieldsToCheckEventChangeSideInGroup[this.changeSideInGroup]);
205
- }
206
- compareEventsField(prevEvent, event, ...fields) {
207
- return fields.reduce((res, field) => res = res || prevEvent.timestamp[field]() !== event.timestamp[field](), !!false);
208
- }
209
- setPeriods() {
210
- this.periods = Object.keys(this.groups).map((periodKey) => {
211
- const split = periodKey.split(this.separator);
212
- return this.getPeriodInfo(split, periodKey);
213
- });
214
- }
215
- getPeriodInfo(split, periodKey) {
216
- return {
217
- periodInfo: {
218
- year: Number(split[0]),
219
- month: Number(split[1]),
220
- day: Number(split[2]),
221
- periodKey,
222
- firstDate: this.groups[periodKey][0].timestamp,
223
- },
224
- };
225
- }
226
- getPeriodKeyFromEvent(event) {
227
- return fieldsToAddEventGroup[this.groupEvent].map(field => event.timestamp[field]()).join(this.separator);
228
- }
229
- }
230
- NgxTimelineComponent.decorators = [
231
- { type: Component, args: [{
232
- selector: 'ngx-timeline',
233
- template: "<div class=\"main-container\">\r\n <div class=\"items-container\">\r\n <div *ngFor=\"let item of items; let index = index;\" class=\"row\">\r\n <!-- DESKTOP -->\r\n <div class=\"col col-left desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_LEFT\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_LEFT}\"></ng-container>\r\n </div>\r\n <div class=\"hour left\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_RIGHT\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-center desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"center-inner\" *ngIf=\"item.periodInfo\">\r\n <ng-container *ngTemplateOutlet=\"periodCustomTemplate || periodTemplate; context: {period: item.periodInfo, index: index}\"></ng-container>\r\n </div>\r\n <div class=\"center-inner no-period-key\" *ngIf=\"!item.periodInfo\">\r\n <ng-container *ngTemplateOutlet=\"centerLinesIconTemplate; context: {index: index}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-right desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_RIGHT\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_RIGHT}\"></ng-container>\r\n </div>\r\n <div class=\"hour right\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_LEFT\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- MOBILE -->\r\n <div class=\"col col-left mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"hour left\" *ngIf=\"item.eventInfo\">\r\n <div class=\"hour-inner-container\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-center mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"center-inner\" *ngIf=\"item.periodInfo;\">\r\n <ng-container *ngTemplateOutlet=\"periodCustomTemplate || periodTemplate; context: {period: item.periodInfo, index: index}\"></ng-container>\r\n </div>\r\n <div class=\"center-inner no-period-key\" *ngIf=\"!item.periodInfo;\">\r\n <ng-container *ngTemplateOutlet=\"centerLinesIconTemplate;context: {index: index}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-right mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_RIGHT}\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<ng-template #centerLinesIconTemplate let-index=index>\r\n <div class=\"line\"></div>\r\n <ng-container *ngTemplateOutlet=\"centerIconCustomTemplate || centerIconTemplate\"></ng-container>\r\n <div [ngClass]=\"{'transparent last-line': index === items.length - 1}\" class=\"line\"></div>\r\n</ng-template>\r\n\r\n<ng-template #centerIconTemplate>\r\n <div class=\"center-icon-container\">\r\n <div class=\"icon\"></div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateInstantTemplate let-item=item>\r\n <span>\r\n {{item?.timestamp | ngxdate : ngxDateFormat.HOURS_MINUTES : langCode}}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #periodTemplate let-period=period let-index=index>\r\n <div [ngClass]=\"{'transparent first-line': !index}\" class=\"line\"></div>\r\n <div class=\"period-container\">\r\n <div class=\"period-inner-container\">\r\n <span>{{period?.firstDate | ngxdate : getPeriodKeyDateFormat() : langCode}}</span>\r\n </div>\r\n </div>\r\n <div class=\"line\"></div>\r\n</ng-template>\r\n\r\n<ng-template #eventTemplate let-event=event let-colSidePosition=colSidePosition>\r\n <ngx-timeline-event\r\n [event]=\"event\"\r\n [langCode]=\"langCode\"\r\n [enableAnimation]=\"enableAnimation\"\r\n [innerEventCustomTemplate]=\"innerEventCustomTemplate\"\r\n [colSidePosition]=\"colSidePosition\"\r\n (clickEmitter)=\"clickEmitter.next($event)\">\r\n </ngx-timeline-event>\r\n</ng-template>\r\n\r\n",
234
- styles: [".main-container{display:flex;justify-content:center;width:100%}.items-container{padding:1rem 0;min-width:max(20rem,100%)}.row{display:flex;flex-wrap:wrap}.row>[class*=col-]{display:flex;flex-direction:column;justify-content:center}.col-left{align-items:flex-end}.col-left,.col-right{padding:0;flex:49 49 0}.col-right{align-items:flex-start}.col-center{min-height:6rem;padding:0;flex:2 2 0}.center-inner{width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%}.center-inner .line{min-height:50%;max-height:50%;height:50%;background:#464646;width:.1rem}.center-inner .line.transparent{background:transparent}.period-container{background:orange;color:#fff;margin:0;padding:.2rem .5rem}.period-container .period-inner-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;padding:.2rem .5rem;z-index:10}.center-icon-container{padding:.8rem 0;display:flex;justify-content:center;align-items:center;position:absolute;height:10px;width:10px;background:#fff}.center-icon-container .icon{height:1rem;width:1rem;border-radius:50%;background:orange;margin:0;position:absolute}.event-outer-container{margin:0 .5rem;width:100%}.hour{padding:.5rem;background:none;display:flex;justify-content:center;align-items:center}.hour.right{justify-content:flex-start}.hour.left{justify-content:flex-end}.hour .hour-inner-container{margin:0}.desktop{display:flex!important}.mobile{display:none!important}@media (max-width:900px){.desktop{display:none!important}.mobile{display:flex!important}.event-outer-container{margin:.5rem .3rem}.col-left{align-items:flex-start}.col-left .hour{font-size:12px;padding:0;margin-right:.3rem}.col-left.col-period{flex:18 18 0}.col-left.col-event{flex:18 18 0;padding:0;align-items:flex-end}.col-right{align-items:flex-start}.col-right.col-period{flex:77 77 0}.col-right.col-event{flex:77 77 0;padding:0}.col-center{min-height:6rem;justify-content:center;margin:0}.col-center.col-period{flex:5 5 0;min-height:3rem}.col-center.col-event{flex:5 5 0}.center-inner,.period-container{align-items:center}.period-container{min-height:20%;height:20%;max-height:20%;background:transparent;display:flex;justify-content:center;border-radius:6px}.period-container .period-inner-container{position:absolute;background:orange;color:#fff;width:-webkit-max-content;width:-moz-max-content;width:max-content;padding:.2rem .5rem;z-index:10}.center-icon-container{align-items:center;justify-content:center}.center-icon-container .icon{height:1rem;width:1rem;position:absolute}}"]
235
- },] }
236
- ];
237
- NgxTimelineComponent.ctorParameters = () => [];
238
- NgxTimelineComponent.propDecorators = {
239
- events: [{ type: Input }],
240
- langCode: [{ type: Input }],
241
- enableAnimation: [{ type: Input }],
242
- groupEvent: [{ type: Input }],
243
- changeSideInGroup: [{ type: Input }],
244
- periodCustomTemplate: [{ type: Input }],
245
- eventCustomTemplate: [{ type: Input }],
246
- centerIconCustomTemplate: [{ type: Input }],
247
- dateInstantCustomTemplate: [{ type: Input }],
248
- innerEventCustomTemplate: [{ type: Input }],
249
- clickEmitter: [{ type: Output }]
108
+ class NgxTimelineComponent {
109
+ constructor() {
110
+ /**
111
+ * Boolean used to enable or disable the animations
112
+ */
113
+ this.enableAnimation = true;
114
+ /**
115
+ * Logic to be applied in order to group events
116
+ */
117
+ this.groupEvent = NgxTimelineEventGroup.MONTH_YEAR;
118
+ /**
119
+ * Logic to be applied in order to put evetns on LEFT or RIGHT
120
+ */
121
+ this.changeSideInGroup = NgxTimelineEventChangeSideInGroup.ON_DIFFERENT_DAY;
122
+ /**
123
+ * Output click event emitter
124
+ */
125
+ this.clickEmitter = new BehaviorSubject(null);
126
+ this.groups = {};
127
+ this.periods = [];
128
+ this.items = [];
129
+ this.ngxTimelineItemPosition = NgxTimelineItemPosition;
130
+ this.ngxDateFormat = NgxDateFormat;
131
+ this.separator = '/';
132
+ }
133
+ ngOnInit() {
134
+ this.groupEvents(this.events);
135
+ }
136
+ ngOnChanges(changes) {
137
+ this.groupEvents(this.events);
138
+ }
139
+ getPeriodKeyDateFormat() {
140
+ return periodKeyDateFormat[this.groupEvent];
141
+ }
142
+ clear() {
143
+ this.groups = {};
144
+ this.periods = [];
145
+ this.items = [];
146
+ }
147
+ groupEvents(events) {
148
+ if (events) {
149
+ this.clear();
150
+ this.sortEvents(events);
151
+ this.setGroups(events);
152
+ this.setPeriods();
153
+ this.setItems();
154
+ }
155
+ }
156
+ sortEvents(events) {
157
+ events.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
158
+ }
159
+ setGroups(events) {
160
+ events.forEach((event) => {
161
+ // conversion from string to actual Date
162
+ event.timestamp = new Date(event.timestamp);
163
+ const periodKey = this.getPeriodKeyFromEvent(event);
164
+ if (!this.groups[periodKey]) {
165
+ this.groups[periodKey] = [];
166
+ }
167
+ this.groups[periodKey].push(event);
168
+ });
169
+ }
170
+ setItems() {
171
+ this.periods.forEach((p) => {
172
+ // insert first the period
173
+ this.items.push(p);
174
+ // in each period putting items on left
175
+ const onLeft = true;
176
+ const periodInfo = p.periodInfo;
177
+ // insert then all the events in this period
178
+ this.addPeriodEvents(periodInfo, onLeft);
179
+ // onLeft = this.addEventItemsAndGetIfOnLeft(periodInfo, onLeft);
180
+ });
181
+ }
182
+ addPeriodEvents(periodInfo, onLeft) {
183
+ this.groups[periodInfo.periodKey].forEach((event, index) => {
184
+ const prevEvent = this.groups[periodInfo.periodKey][index - 1];
185
+ if (index > 0 && this.compareEvents(prevEvent, event)) {
186
+ onLeft = !onLeft;
187
+ }
188
+ this.pushEventOnItems(event, onLeft);
189
+ });
190
+ // return onLeft;
191
+ }
192
+ pushEventOnItems(event, onLeft) {
193
+ this.items.push({
194
+ eventInfo: Object.assign({}, event), position: onLeft ?
195
+ this.ngxTimelineItemPosition.ON_LEFT : this.ngxTimelineItemPosition.ON_RIGHT
196
+ });
197
+ }
198
+ /**
199
+ * Compare the events inside the same group
200
+ */
201
+ compareEvents(prevEvent, event) {
202
+ return this.changeSideInGroup === NgxTimelineEventChangeSideInGroup.ALL ||
203
+ this.compareEventsField(prevEvent, event, ...fieldsToCheckEventChangeSideInGroup[this.changeSideInGroup]);
204
+ }
205
+ compareEventsField(prevEvent, event, ...fields) {
206
+ return fields.reduce((res, field) => res = res || prevEvent.timestamp[field]() !== event.timestamp[field](), !!false);
207
+ }
208
+ setPeriods() {
209
+ this.periods = Object.keys(this.groups).map((periodKey) => {
210
+ const split = periodKey.split(this.separator);
211
+ return this.getPeriodInfo(split, periodKey);
212
+ });
213
+ }
214
+ getPeriodInfo(split, periodKey) {
215
+ return {
216
+ periodInfo: {
217
+ year: Number(split[0]),
218
+ month: Number(split[1]),
219
+ day: Number(split[2]),
220
+ periodKey,
221
+ firstDate: this.groups[periodKey][0].timestamp,
222
+ },
223
+ };
224
+ }
225
+ getPeriodKeyFromEvent(event) {
226
+ return fieldsToAddEventGroup[this.groupEvent].map(field => event.timestamp[field]()).join(this.separator);
227
+ }
228
+ }
229
+ NgxTimelineComponent.decorators = [
230
+ { type: Component, args: [{
231
+ selector: 'ngx-timeline',
232
+ template: "<div class=\"main-container\">\r\n <div class=\"items-container\">\r\n <div *ngFor=\"let item of items; let index = index;\" class=\"row\">\r\n <!-- DESKTOP -->\r\n <div class=\"col col-left desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_LEFT\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_LEFT}\"></ng-container>\r\n </div>\r\n <div class=\"hour left\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_RIGHT\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-center desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"center-inner\" *ngIf=\"item.periodInfo\">\r\n <ng-container *ngTemplateOutlet=\"periodCustomTemplate || periodTemplate; context: {period: item.periodInfo, index: index}\"></ng-container>\r\n </div>\r\n <div class=\"center-inner no-period-key\" *ngIf=\"!item.periodInfo\">\r\n <ng-container *ngTemplateOutlet=\"centerLinesIconTemplate; context: {index: index}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-right desktop\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_RIGHT\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_RIGHT}\"></ng-container>\r\n </div>\r\n <div class=\"hour right\" *ngIf=\"item.eventInfo && item.position === ngxTimelineItemPosition.ON_LEFT\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- MOBILE -->\r\n <div class=\"col col-left mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"hour left\" *ngIf=\"item.eventInfo\">\r\n <div class=\"hour-inner-container\">\r\n <ng-container *ngTemplateOutlet=\"dateInstantCustomTemplate || dateInstantTemplate; context: {item: item.eventInfo}\" ></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-center mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"center-inner\" *ngIf=\"item.periodInfo;\">\r\n <ng-container *ngTemplateOutlet=\"periodCustomTemplate || periodTemplate; context: {period: item.periodInfo, index: index}\"></ng-container>\r\n </div>\r\n <div class=\"center-inner no-period-key\" *ngIf=\"!item.periodInfo;\">\r\n <ng-container *ngTemplateOutlet=\"centerLinesIconTemplate;context: {index: index}\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col col-right mobile\" [ngClass]=\"item.periodInfo ? 'col-period' : 'col-event'\">\r\n <div class=\"event-outer-container\" *ngIf=\"item.eventInfo\">\r\n <ng-container *ngTemplateOutlet=\"eventCustomTemplate || eventTemplate; context: {event: item, colSidePosition: ngxTimelineItemPosition.ON_RIGHT}\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<ng-template #centerLinesIconTemplate let-index=index>\r\n <div class=\"line\"></div>\r\n <ng-container *ngTemplateOutlet=\"centerIconCustomTemplate || centerIconTemplate\"></ng-container>\r\n <div [ngClass]=\"{'transparent last-line': index === items.length - 1}\" class=\"line\"></div>\r\n</ng-template>\r\n\r\n<ng-template #centerIconTemplate>\r\n <div class=\"center-icon-container\">\r\n <div class=\"icon\"></div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateInstantTemplate let-item=item>\r\n <span>\r\n {{item?.timestamp | ngxdate : ngxDateFormat.HOURS_MINUTES : langCode}}\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #periodTemplate let-period=period let-index=index>\r\n <div [ngClass]=\"{'transparent first-line': !index}\" class=\"line\"></div>\r\n <div class=\"period-container\">\r\n <div class=\"period-inner-container\">\r\n <span>{{period?.firstDate | ngxdate : getPeriodKeyDateFormat() : langCode}}</span>\r\n </div>\r\n </div>\r\n <div class=\"line\"></div>\r\n</ng-template>\r\n\r\n<ng-template #eventTemplate let-event=event let-colSidePosition=colSidePosition>\r\n <ngx-timeline-event\r\n [event]=\"event\"\r\n [langCode]=\"langCode\"\r\n [enableAnimation]=\"enableAnimation\"\r\n [innerEventCustomTemplate]=\"innerEventCustomTemplate\"\r\n [colSidePosition]=\"colSidePosition\"\r\n (clickEmitter)=\"clickEmitter.next($event)\">\r\n </ngx-timeline-event>\r\n</ng-template>\r\n\r\n",
233
+ styles: [".main-container{display:flex;justify-content:center;width:100%}.items-container{padding:1rem 0;min-width:max(20rem,100%)}.row{display:flex;flex-wrap:wrap}.row>[class*=col-]{display:flex;flex-direction:column;justify-content:center}.col-left{align-items:flex-end;padding:0;flex:49 49 0}.col-right{align-items:flex-start;padding:0;flex:49 49 0}.col-center{min-height:6rem;padding:0;flex:2 2 0}.center-inner{width:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%}.center-inner .line{min-height:50%;max-height:50%;height:50%;background:#464646;width:.1rem}.center-inner .line.transparent{background:transparent}.period-container{background:orange;color:#fff;margin:0;padding:.2rem .5rem}.period-container .period-inner-container{width:max-content;padding:.2rem .5rem;z-index:10}.center-icon-container{padding:.8rem 0;display:flex;justify-content:center;align-items:center;position:absolute;height:10px;width:10px;background:white}.center-icon-container .icon{height:1rem;width:1rem;border-radius:50%;background:orange;margin:0;position:absolute}.event-outer-container{margin:0 .5rem;width:100%}.hour{padding:.5rem;background:none;display:flex;justify-content:center;align-items:center}.hour.right{justify-content:flex-start}.hour.left{justify-content:flex-end}.hour .hour-inner-container{margin:0}.desktop{display:flex!important}.mobile{display:none!important}@media (max-width: 900px){.desktop{display:none!important}.mobile{display:flex!important}.event-outer-container{margin:.5rem .3rem}.col-left{align-items:flex-start}.col-left .hour{font-size:12px;padding:0;margin-right:.3rem}.col-left.col-period{flex:18 18 0}.col-left.col-event{flex:18 18 0;padding:0;align-items:flex-end}.col-right{align-items:flex-start}.col-right.col-period{flex:77 77 0}.col-right.col-event{flex:77 77 0;padding:0}.col-center{min-height:6rem;justify-content:center;margin:0}.col-center.col-period{flex:5 5 0;min-height:3rem}.col-center.col-event{flex:5 5 0}.center-inner{align-items:center}.period-container{min-height:20%;height:20%;max-height:20%;background:transparent;display:flex;justify-content:center;align-items:center;border-radius:6px}.period-container .period-inner-container{position:absolute;background:orange;color:#fff;width:max-content;padding:.2rem .5rem;z-index:10}.center-icon-container{align-items:center;justify-content:center}.center-icon-container .icon{height:1rem;width:1rem;position:absolute}}\n"]
234
+ },] }
235
+ ];
236
+ NgxTimelineComponent.ctorParameters = () => [];
237
+ NgxTimelineComponent.propDecorators = {
238
+ events: [{ type: Input }],
239
+ langCode: [{ type: Input }],
240
+ enableAnimation: [{ type: Input }],
241
+ groupEvent: [{ type: Input }],
242
+ changeSideInGroup: [{ type: Input }],
243
+ periodCustomTemplate: [{ type: Input }],
244
+ eventCustomTemplate: [{ type: Input }],
245
+ centerIconCustomTemplate: [{ type: Input }],
246
+ dateInstantCustomTemplate: [{ type: Input }],
247
+ innerEventCustomTemplate: [{ type: Input }],
248
+ clickEmitter: [{ type: Output }]
250
249
  };
251
250
 
252
- class NgxTimelineEventComponent {
253
- constructor() {
254
- /**
255
- * Boolean used to enable or disable the animations
256
- */
257
- this.enableAnimation = true;
258
- /**
259
- * Output click event emitter
260
- */
261
- this.clickEmitter = new BehaviorSubject(null);
262
- this.ngxTimelineItemPosition = NgxTimelineItemPosition;
263
- this.monthAbbr = 'MMM';
264
- this.dayFormat = 'dd';
265
- }
266
- getDateObj() {
267
- var _a, _b;
268
- let day;
269
- let month;
270
- let year;
271
- const dateTimestamp = (_b = (_a = this.event) === null || _a === void 0 ? void 0 : _a.eventInfo) === null || _b === void 0 ? void 0 : _b.timestamp;
272
- if (dateTimestamp) {
273
- const timestamp = new Date(dateTimestamp);
274
- const langCode = this.getLangCode();
275
- month = new DatePipe(langCode).transform(timestamp, this.monthAbbr);
276
- day = new DatePipe(langCode).transform(timestamp, this.dayFormat);
277
- year = timestamp.getFullYear();
278
- }
279
- return { day, month, year };
280
- }
281
- getLangCode() {
282
- return this.langCode && supportedLanguageCodes.includes(this.langCode) ? this.langCode : supportedLanguageCodes[0];
283
- }
284
- }
285
- NgxTimelineEventComponent.decorators = [
286
- { type: Component, args: [{
287
- selector: 'ngx-timeline-event',
288
- template: "<div class=\"event-wrapper-container\" (click)=\"clickEmitter.next(event)\">\n <div *ngIf=\"colSidePosition===ngxTimelineItemPosition.ON_RIGHT\" class=\"arrow left\"></div>\n <div class=\"event\" [ngClass]=\"{'enableAnimation': enableAnimation}\">\n <ng-container *ngTemplateOutlet=\"innerEventCustomTemplate || innerEventContainer; context: {event: event}\">\n </ng-container>\n </div>\n <div *ngIf=\"colSidePosition===ngxTimelineItemPosition.ON_LEFT\" class=\"arrow right\"></div>\n</div>\n\n<ng-template #innerEventContainer let-event=event>\n <div class=\"event-container\" [ngClass]=\"{'reverse': colSidePosition === ngxTimelineItemPosition.ON_LEFT}\">\n <div class=\"event-info-container\">\n <div class=\"event-info-header\">\n <div class=\"title-container\">{{event?.eventInfo?.title | titlecase}}</div>\n </div>\n <div class=\"event-info-body\">\n <p class=\"event-info-description\">{{event?.eventInfo?.description}}</p>\n </div>\n </div>\n\n <div class=\"event-divider-container\">\n <hr/>\n </div>\n\n <div class=\"event-date-container\" *ngIf=\"getDateObj() as dateObj\">\n <div>\n <p>{{dateObj?.month}}</p>\n </div>\n <div>\n <p class=\"day\">{{dateObj?.day}}</p>\n </div>\n <div>\n <p>{{dateObj?.year}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n",
289
- styles: [".event-wrapper-container{display:flex;justify-content:center;align-items:center;cursor:pointer}.arrow{width:0;height:0;border-top:.5rem solid transparent;border-bottom:.5rem solid transparent;border-radius:6px;z-index:10}.arrow.right{filter:drop-shadow(2px 0 0 #244a6e22);border-left:.5rem solid #fff}.arrow.left{filter:drop-shadow(-1px 0 0 #244a6e22);border-right:.5rem solid #fff}.event{background:#fff;border-radius:.8rem;padding:1rem;width:100%;margin:1rem 0}.event.enableAnimation:hover{padding:2rem;transition:all .5s ease-in-out}.event.enableAnimation:not(:hover){padding:1rem;transition:all .5s ease-in-out}.event:not(.hour){background:#fff 0 0 no-repeat padding-box;box-shadow:0 3px 6px rgba(36,74,110,.3215686274509804)}.event.hour{padding:.5rem;background:none;display:flex;justify-content:center;align-items:center}.event.hour.right{justify-content:flex-start}.event.hour.left{justify-content:flex-end}.event .hour-inner-container{margin:0}.event-container{display:flex}.event-container.reverse{flex-direction:row-reverse}.event-container .event-info-container{display:flex;flex-direction:column;align-items:flex-start;padding:.1rem;flex:88 88 0}.event-container .event-info-container .event-info-header{display:flex;align-items:center;width:100%}.event-container .event-info-container .event-info-header .icon-container{margin-right:.3rem}.event-container .event-info-container .event-info-header .icon-container nb-icon{color:orange;width:1.5rem;height:1.5rem;margin-bottom:.1rem}.event-container .event-info-container .event-info-header .title-container{font-weight:700;font-size:15px}.event-container .event-info-container .event-info-body{padding:.5rem 0;display:flex;flex-direction:column;justify-content:flex-start;overflow-wrap:anywhere}.event-container .event-info-container .event-info-body .event-info-description{margin-bottom:.5rem;font-size:13px}.event-container .event-info-container .event-info-body .category-container,.event-container .event-info-container .event-info-body .expiration-container{display:flex;font-size:13px;justify-content:flex-start;align-items:center}.event-container .event-info-container .event-info-body .category-container p,.event-container .event-info-container .event-info-body .expiration-container p{font-size:13px;margin:0}.event-container .event-info-container .event-info-body .category-container .category-label,.event-container .event-info-container .event-info-body .category-container .expiration-label,.event-container .event-info-container .event-info-body .expiration-container .category-label,.event-container .event-info-container .event-info-body .expiration-container .expiration-label{margin-right:.5rem}.event-container .event-info-container .event-info-body .category-container .category-value,.event-container .event-info-container .event-info-body .category-container .expiration-value,.event-container .event-info-container .event-info-body .expiration-container .category-value,.event-container .event-info-container .event-info-body .expiration-container .expiration-value{font-weight:700}.event-container .event-info-container .event-info-footer{font-size:15px;cursor:pointer;padding-top:1rem}.event-container .event-info-container .event-info-footer .footer-inner-container{display:flex;justify-content:flex-start;align-items:flex-end}.event-container .event-info-container .event-info-footer .footer-inner-container nb-icon{color:#006cb4;width:1rem;height:1rem;margin-bottom:.1rem}.event-container .event-info-container .event-info-footer p{margin:0;color:#006cb4}.event-container .event-divider-container{display:flex;justify-content:center;align-items:center;padding:.1rem;flex:5 5 0}.event-container .event-divider-container hr{height:100%;width:1px;background:#e9e9e9}.event-container .event-date-container{display:flex;justify-content:center;align-items:center;flex-direction:column;padding:.1rem;flex:15 15 0}.event-container .event-date-container p{margin:0;text-align:center}.event-container .event-date-container p.day{font-size:32px;font-weight:700;padding:.5rem 0}"]
290
- },] }
291
- ];
292
- NgxTimelineEventComponent.ctorParameters = () => [];
293
- NgxTimelineEventComponent.propDecorators = {
294
- event: [{ type: Input }],
295
- colSidePosition: [{ type: Input }],
296
- langCode: [{ type: Input }],
297
- innerEventCustomTemplate: [{ type: Input }],
298
- enableAnimation: [{ type: Input }],
299
- clickEmitter: [{ type: Output }]
251
+ class NgxTimelineEventComponent {
252
+ constructor() {
253
+ /**
254
+ * Boolean used to enable or disable the animations
255
+ */
256
+ this.enableAnimation = true;
257
+ /**
258
+ * Output click event emitter
259
+ */
260
+ this.clickEmitter = new BehaviorSubject(null);
261
+ this.ngxTimelineItemPosition = NgxTimelineItemPosition;
262
+ this.monthAbbr = 'MMM';
263
+ this.dayFormat = 'dd';
264
+ }
265
+ getDateObj() {
266
+ var _a, _b;
267
+ let day;
268
+ let month;
269
+ let year;
270
+ const dateTimestamp = (_b = (_a = this.event) === null || _a === void 0 ? void 0 : _a.eventInfo) === null || _b === void 0 ? void 0 : _b.timestamp;
271
+ if (dateTimestamp) {
272
+ const timestamp = new Date(dateTimestamp);
273
+ const langCode = this.getLangCode();
274
+ month = new DatePipe(langCode).transform(timestamp, this.monthAbbr);
275
+ day = new DatePipe(langCode).transform(timestamp, this.dayFormat);
276
+ year = timestamp.getFullYear();
277
+ }
278
+ return { day, month, year };
279
+ }
280
+ getLangCode() {
281
+ return this.langCode && supportedLanguageCodes.includes(this.langCode) ? this.langCode : supportedLanguageCodes[0];
282
+ }
283
+ }
284
+ NgxTimelineEventComponent.decorators = [
285
+ { type: Component, args: [{
286
+ selector: 'ngx-timeline-event',
287
+ template: "<div class=\"event-wrapper-container\" (click)=\"clickEmitter.next(event)\">\n <div *ngIf=\"colSidePosition===ngxTimelineItemPosition.ON_RIGHT\" class=\"arrow left\"></div>\n <div class=\"event\" [ngClass]=\"{'enableAnimation': enableAnimation}\">\n <ng-container *ngTemplateOutlet=\"innerEventCustomTemplate || innerEventContainer; context: {event: event}\">\n </ng-container>\n </div>\n <div *ngIf=\"colSidePosition===ngxTimelineItemPosition.ON_LEFT\" class=\"arrow right\"></div>\n</div>\n\n<ng-template #innerEventContainer let-event=event>\n <div class=\"event-container\" [ngClass]=\"{'reverse': colSidePosition === ngxTimelineItemPosition.ON_LEFT}\">\n <div class=\"event-info-container\">\n <div class=\"event-info-header\">\n <div class=\"title-container\">{{event?.eventInfo?.title | titlecase}}</div>\n </div>\n <div class=\"event-info-body\">\n <p class=\"event-info-description\">{{event?.eventInfo?.description}}</p>\n </div>\n </div>\n\n <div class=\"event-divider-container\">\n <hr/>\n </div>\n\n <div class=\"event-date-container\" *ngIf=\"getDateObj() as dateObj\">\n <div>\n <p>{{dateObj?.month}}</p>\n </div>\n <div>\n <p class=\"day\">{{dateObj?.day}}</p>\n </div>\n <div>\n <p>{{dateObj?.year}}</p>\n </div>\n </div>\n </div>\n</ng-template>\n",
288
+ styles: [".event-wrapper-container{display:flex;justify-content:center;align-items:center;cursor:pointer}.arrow{width:0;height:0;border-top:.5rem solid transparent;border-bottom:.5rem solid transparent;border-radius:6px;z-index:10}.arrow.right{filter:drop-shadow(2px 0px 0px #244a6e22);border-left:.5rem solid white}.arrow.left{filter:drop-shadow(-1px 0px 0px #244a6e22);border-right:.5rem solid white}.event{background:white;border-radius:.8rem;padding:1rem;width:100%;margin:1rem 0}.event.enableAnimation:hover{padding:2rem;transition:all .5s ease-in-out}.event.enableAnimation:not(:hover){padding:1rem;transition:all .5s ease-in-out}.event:not(.hour){background:#ffffff 0% 0% no-repeat padding-box;box-shadow:0 3px 6px #244a6e52}.event.hour{padding:.5rem;background:none;display:flex;justify-content:center;align-items:center}.event.hour.right{justify-content:flex-start}.event.hour.left{justify-content:flex-end}.event .hour-inner-container{margin:0}.event-container{display:flex}.event-container.reverse{flex-direction:row-reverse}.event-container .event-info-container{display:flex;flex-direction:column;align-items:flex-start;padding:.1rem;flex:88 88 0}.event-container .event-info-container .event-info-header{display:flex;align-items:center;width:100%}.event-container .event-info-container .event-info-header .icon-container{margin-right:.3rem}.event-container .event-info-container .event-info-header .icon-container nb-icon{color:orange;width:1.5rem;height:1.5rem;margin-bottom:.1rem}.event-container .event-info-container .event-info-header .title-container{font-weight:bold;font-size:15px}.event-container .event-info-container .event-info-body{padding:.5rem 0;display:flex;flex-direction:column;justify-content:flex-start;overflow-wrap:anywhere}.event-container .event-info-container .event-info-body .event-info-description{margin-bottom:.5rem;font-size:13px}.event-container .event-info-container .event-info-body .expiration-container,.event-container .event-info-container .event-info-body .category-container{display:flex;font-size:13px;justify-content:flex-start;align-items:center}.event-container .event-info-container .event-info-body .expiration-container p,.event-container .event-info-container .event-info-body .category-container p{font-size:13px;margin:0}.event-container .event-info-container .event-info-body .expiration-container .expiration-label,.event-container .event-info-container .event-info-body .expiration-container .category-label,.event-container .event-info-container .event-info-body .category-container .expiration-label,.event-container .event-info-container .event-info-body .category-container .category-label{margin-right:.5rem}.event-container .event-info-container .event-info-body .expiration-container .expiration-value,.event-container .event-info-container .event-info-body .expiration-container .category-value,.event-container .event-info-container .event-info-body .category-container .expiration-value,.event-container .event-info-container .event-info-body .category-container .category-value{font-weight:bold}.event-container .event-info-container .event-info-footer{font-size:15px;cursor:pointer;padding-top:1rem}.event-container .event-info-container .event-info-footer .footer-inner-container{display:flex;justify-content:flex-start;align-items:flex-end}.event-container .event-info-container .event-info-footer .footer-inner-container nb-icon{color:#006cb4;width:1rem;height:1rem;margin-bottom:.1rem}.event-container .event-info-container .event-info-footer p{margin:0;color:#006cb4}.event-container .event-divider-container{display:flex;justify-content:center;align-items:center;padding:.1rem;flex:5 5 0}.event-container .event-divider-container hr{height:100%;width:1px;background:#e9e9e9}.event-container .event-date-container{display:flex;justify-content:center;align-items:center;flex-direction:column;padding:.1rem;flex:15 15 0}.event-container .event-date-container p{margin:0;text-align:center}.event-container .event-date-container p.day{font-size:32px;font-weight:bold;padding:.5rem 0}\n"]
289
+ },] }
290
+ ];
291
+ NgxTimelineEventComponent.ctorParameters = () => [];
292
+ NgxTimelineEventComponent.propDecorators = {
293
+ event: [{ type: Input }],
294
+ colSidePosition: [{ type: Input }],
295
+ langCode: [{ type: Input }],
296
+ innerEventCustomTemplate: [{ type: Input }],
297
+ enableAnimation: [{ type: Input }],
298
+ clickEmitter: [{ type: Output }]
300
299
  };
301
300
 
302
- class NgxDatePipe {
303
- constructor() {
304
- }
305
- transform(date, dateFormat, langCode) {
306
- let transformedDate = null;
307
- if (date) {
308
- const objDate = this.getDateConfig(langCode);
309
- transformedDate = new DatePipe(objDate.code).transform(new Date(date), this.dateFormat(dateFormat, objDate));
310
- }
311
- return transformedDate;
312
- }
313
- dateFormat(dateFormat, configDate) {
314
- return configDate[fieldConfigDate[dateFormat]];
315
- }
316
- getDateConfig(langCode) {
317
- const code = langCode || supportedLanguageCodes[0];
318
- const configDate = dateConfigMap[code] || dateConfigMap[supportedLanguageCodes[0]];
319
- return configDate;
320
- }
321
- }
322
- NgxDatePipe.decorators = [
323
- { type: Pipe, args: [{ name: 'ngxdate', pure: false },] }
324
- ];
301
+ class NgxDatePipe {
302
+ constructor() {
303
+ }
304
+ transform(date, dateFormat, langCode) {
305
+ let transformedDate = null;
306
+ if (date) {
307
+ const objDate = this.getDateConfig(langCode);
308
+ transformedDate = new DatePipe(objDate.code).transform(new Date(date), this.dateFormat(dateFormat, objDate));
309
+ }
310
+ return transformedDate;
311
+ }
312
+ dateFormat(dateFormat, configDate) {
313
+ return configDate[fieldConfigDate[dateFormat]];
314
+ }
315
+ getDateConfig(langCode) {
316
+ const code = langCode || supportedLanguageCodes[0];
317
+ const configDate = dateConfigMap[code] || dateConfigMap[supportedLanguageCodes[0]];
318
+ return configDate;
319
+ }
320
+ }
321
+ NgxDatePipe.decorators = [
322
+ { type: Pipe, args: [{ name: 'ngxdate', pure: false },] }
323
+ ];
325
324
  NgxDatePipe.ctorParameters = () => [];
326
325
 
327
- registerLocaleData(localeIt);
328
- registerLocaleData(localeFr);
329
- registerLocaleData(localeDe);
330
- registerLocaleData(localeEs);
331
- class NgxTimelineModule {
332
- }
333
- NgxTimelineModule.decorators = [
334
- { type: NgModule, args: [{
335
- declarations: [NgxTimelineComponent, NgxTimelineEventComponent, NgxDatePipe],
336
- imports: [CommonModule],
337
- exports: [NgxTimelineComponent, NgxDatePipe]
338
- },] }
326
+ registerLocaleData(localeIt);
327
+ registerLocaleData(localeFr);
328
+ registerLocaleData(localeDe);
329
+ registerLocaleData(localeEs);
330
+ class NgxTimelineModule {
331
+ }
332
+ NgxTimelineModule.decorators = [
333
+ { type: NgModule, args: [{
334
+ declarations: [NgxTimelineComponent, NgxTimelineEventComponent, NgxDatePipe],
335
+ imports: [CommonModule],
336
+ exports: [NgxTimelineComponent, NgxDatePipe]
337
+ },] }
339
338
  ];
340
339
 
341
- /*
342
- * Public API Surface of ngx-timeline
340
+ /*
341
+ * Public API Surface of ngx-timeline
343
342
  */
344
343
 
345
- /**
346
- * Generated bundle index. Do not edit.
344
+ /**
345
+ * Generated bundle index. Do not edit.
347
346
  */
348
347
 
349
348
  export { NgxDateFormat, NgxDatePipe, NgxTimelineComponent, NgxTimelineEventChangeSideInGroup, NgxTimelineEventComponent, NgxTimelineEventGroup, NgxTimelineItemPosition, NgxTimelineModule, dateConfigMap, fieldConfigDate, fieldsToAddEventGroup, fieldsToCheckEventChangeSideInGroup, periodKeyDateFormat, supportedLanguageCodes, NgxTimelineComponent as ɵa, NgxTimelineEventComponent as ɵb, NgxDatePipe as ɵc };