@igo2/common 20.0.1 → 20.1.0-next.10

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 (84) hide show
  1. package/action/index.d.ts +22 -22
  2. package/clickout/index.d.ts +2 -2
  3. package/collapsible/index.d.ts +6 -10
  4. package/color/index.d.ts +3 -4
  5. package/context-menu/index.d.ts +9 -9
  6. package/datepicker/index.d.ts +65 -0
  7. package/drag-drop/index.d.ts +21 -23
  8. package/dynamic-component/index.d.ts +7 -7
  9. package/entity/index.d.ts +135 -72
  10. package/fesm2022/igo2-common-action.mjs +60 -97
  11. package/fesm2022/igo2-common-action.mjs.map +1 -1
  12. package/fesm2022/igo2-common-backdrop.mjs +7 -7
  13. package/fesm2022/igo2-common-badge.mjs +7 -7
  14. package/fesm2022/igo2-common-clickout.mjs +10 -12
  15. package/fesm2022/igo2-common-clickout.mjs.map +1 -1
  16. package/fesm2022/igo2-common-clone.mjs +7 -7
  17. package/fesm2022/igo2-common-collapsible.mjs +18 -39
  18. package/fesm2022/igo2-common-collapsible.mjs.map +1 -1
  19. package/fesm2022/igo2-common-color.mjs +14 -18
  20. package/fesm2022/igo2-common-color.mjs.map +1 -1
  21. package/fesm2022/igo2-common-confirm-dialog.mjs +10 -10
  22. package/fesm2022/igo2-common-context-menu.mjs +22 -31
  23. package/fesm2022/igo2-common-context-menu.mjs.map +1 -1
  24. package/fesm2022/igo2-common-custom-html.mjs +10 -10
  25. package/fesm2022/igo2-common-datepicker.mjs +316 -0
  26. package/fesm2022/igo2-common-datepicker.mjs.map +1 -0
  27. package/fesm2022/igo2-common-dom.mjs +7 -7
  28. package/fesm2022/igo2-common-drag-drop.mjs +59 -75
  29. package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
  30. package/fesm2022/igo2-common-dynamic-component.mjs +34 -52
  31. package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -1
  32. package/fesm2022/igo2-common-entity.mjs +284 -220
  33. package/fesm2022/igo2-common-entity.mjs.map +1 -1
  34. package/fesm2022/igo2-common-flexible.mjs +13 -16
  35. package/fesm2022/igo2-common-flexible.mjs.map +1 -1
  36. package/fesm2022/igo2-common-form.mjs +120 -174
  37. package/fesm2022/igo2-common-form.mjs.map +1 -1
  38. package/fesm2022/igo2-common-home-button.mjs +11 -12
  39. package/fesm2022/igo2-common-home-button.mjs.map +1 -1
  40. package/fesm2022/igo2-common-icon.mjs +18 -24
  41. package/fesm2022/igo2-common-icon.mjs.map +1 -1
  42. package/fesm2022/igo2-common-image.mjs +16 -20
  43. package/fesm2022/igo2-common-image.mjs.map +1 -1
  44. package/fesm2022/igo2-common-interactive-tour.mjs +28 -33
  45. package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -1
  46. package/fesm2022/igo2-common-json-dialog.mjs +11 -11
  47. package/fesm2022/igo2-common-json-dialog.mjs.map +1 -1
  48. package/fesm2022/igo2-common-keyvalue.mjs +7 -7
  49. package/fesm2022/igo2-common-list.mjs +49 -66
  50. package/fesm2022/igo2-common-list.mjs.map +1 -1
  51. package/fesm2022/igo2-common-panel.mjs +15 -28
  52. package/fesm2022/igo2-common-panel.mjs.map +1 -1
  53. package/fesm2022/igo2-common-resizable-bar.mjs +25 -32
  54. package/fesm2022/igo2-common-resizable-bar.mjs.map +1 -1
  55. package/fesm2022/igo2-common-select-value-dialog.mjs +10 -10
  56. package/fesm2022/igo2-common-sidenav.mjs +7 -7
  57. package/fesm2022/igo2-common-spinner.mjs +11 -11
  58. package/fesm2022/igo2-common-spinner.mjs.map +1 -1
  59. package/fesm2022/igo2-common-stop-propagation.mjs +10 -10
  60. package/fesm2022/igo2-common-table.mjs +57 -87
  61. package/fesm2022/igo2-common-table.mjs.map +1 -1
  62. package/fesm2022/igo2-common-timepicker.mjs +105 -0
  63. package/fesm2022/igo2-common-timepicker.mjs.map +1 -0
  64. package/fesm2022/igo2-common-tool.mjs +29 -35
  65. package/fesm2022/igo2-common-tool.mjs.map +1 -1
  66. package/fesm2022/igo2-common-widget.mjs +27 -36
  67. package/fesm2022/igo2-common-widget.mjs.map +1 -1
  68. package/fesm2022/igo2-common-workspace.mjs +34 -44
  69. package/fesm2022/igo2-common-workspace.mjs.map +1 -1
  70. package/flexible/index.d.ts +2 -2
  71. package/form/index.d.ts +31 -33
  72. package/home-button/index.d.ts +1 -2
  73. package/icon/index.d.ts +4 -5
  74. package/image/index.d.ts +3 -3
  75. package/interactive-tour/index.d.ts +5 -5
  76. package/list/index.d.ts +23 -23
  77. package/package.json +13 -4
  78. package/panel/index.d.ts +4 -6
  79. package/resizable-bar/index.d.ts +11 -13
  80. package/table/index.d.ts +13 -19
  81. package/timepicker/index.d.ts +33 -0
  82. package/tool/index.d.ts +5 -5
  83. package/widget/index.d.ts +9 -9
  84. package/workspace/index.d.ts +13 -12
@@ -1,7 +1,7 @@
1
1
  import { Overlay } from '@angular/cdk/overlay';
2
2
  import { TemplatePortal } from '@angular/cdk/portal';
3
3
  import * as i0 from '@angular/core';
4
- import { inject, ViewContainerRef, ElementRef, EventEmitter, HostListener, Output, Input, Directive, NgModule } from '@angular/core';
4
+ import { inject, ViewContainerRef, ElementRef, input, output, HostListener, Directive, NgModule } from '@angular/core';
5
5
  import { fromEvent } from 'rxjs';
6
6
  import { filter, take } from 'rxjs/operators';
7
7
 
@@ -11,8 +11,10 @@ class ContextMenuDirective {
11
11
  elementRef = inject(ElementRef);
12
12
  overlayRef;
13
13
  sub;
14
- menuContext;
15
- menuPosition = new EventEmitter();
14
+ menuContext = input(undefined, ...(ngDevMode ? [{ debugName: "menuContext", alias: 'igoContextMenu' }] : [{
15
+ alias: 'igoContextMenu'
16
+ }]));
17
+ menuPosition = output();
16
18
  onContextMenu(e) {
17
19
  let x;
18
20
  let y;
@@ -46,7 +48,7 @@ class ContextMenuDirective {
46
48
  positionStrategy,
47
49
  scrollStrategy: this.overlay.scrollStrategies.close()
48
50
  });
49
- this.overlayRef.attach(new TemplatePortal(this.menuContext, this.viewContainerRef, {
51
+ this.overlayRef.attach(new TemplatePortal(this.menuContext(), this.viewContainerRef, {
50
52
  $implicit: undefined
51
53
  }));
52
54
  this.sub = fromEvent(document, 'click')
@@ -80,21 +82,16 @@ class ContextMenuDirective {
80
82
  this.sub.unsubscribe();
81
83
  }
82
84
  }
83
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
84
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.14", type: ContextMenuDirective, isStandalone: true, selector: "[igoContextMenu]", inputs: { menuContext: ["igoContextMenu", "menuContext"] }, outputs: { menuPosition: "menuPosition" }, host: { listeners: { "longpress": "onContextMenu($event)", "contextmenu": "onContextMenu($event)" } }, ngImport: i0 });
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ContextMenuDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
86
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", type: ContextMenuDirective, isStandalone: true, selector: "[igoContextMenu]", inputs: { menuContext: { classPropertyName: "menuContext", publicName: "igoContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuPosition: "menuPosition" }, host: { listeners: { "longpress": "onContextMenu($event)", "contextmenu": "onContextMenu($event)" } }, ngImport: i0 });
85
87
  }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ContextMenuDirective, decorators: [{
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ContextMenuDirective, decorators: [{
87
89
  type: Directive,
88
90
  args: [{
89
91
  selector: '[igoContextMenu]',
90
92
  standalone: true
91
93
  }]
92
- }], propDecorators: { menuContext: [{
93
- type: Input,
94
- args: ['igoContextMenu']
95
- }], menuPosition: [{
96
- type: Output
97
- }], onContextMenu: [{
94
+ }], propDecorators: { menuContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "igoContextMenu", required: false }] }], menuPosition: [{ type: i0.Output, args: ["menuPosition"] }], onContextMenu: [{
98
95
  type: HostListener,
99
96
  args: ['longpress', ['$event']]
100
97
  }, {
@@ -110,9 +107,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
110
107
  */
111
108
  class LongPressDirective {
112
109
  touchTimeout;
113
- touchDuration = 400;
114
- onlyIOS = true;
115
- longpress = new EventEmitter();
110
+ touchDuration = input(400, ...(ngDevMode ? [{ debugName: "touchDuration" }] : []));
111
+ onlyIOS = input(true, ...(ngDevMode ? [{ debugName: "onlyIOS" }] : []));
112
+ longpress = output();
116
113
  touchstart(e) {
117
114
  if (e.touches.length > 1) {
118
115
  this.touchEnd();
@@ -120,7 +117,7 @@ class LongPressDirective {
120
117
  }
121
118
  this.touchTimeout = setTimeout(() => {
122
119
  this.longpress.emit(e);
123
- }, this.touchDuration);
120
+ }, this.touchDuration());
124
121
  }
125
122
  touchend() {
126
123
  this.touchEnd();
@@ -128,22 +125,16 @@ class LongPressDirective {
128
125
  touchEnd() {
129
126
  clearTimeout(this.touchTimeout);
130
127
  }
131
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LongPressDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
132
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.14", type: LongPressDirective, isStandalone: true, selector: "[igoLongPress]", inputs: { touchDuration: "touchDuration", onlyIOS: "onlyIOS" }, outputs: { longpress: "longpress" }, host: { listeners: { "touchstart": "touchstart($event)", "touchmove": "touchend()", "touchcancel": "touchend()", "touchend": "touchend()" } }, ngImport: i0 });
128
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LongPressDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
129
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", type: LongPressDirective, isStandalone: true, selector: "[igoLongPress]", inputs: { touchDuration: { classPropertyName: "touchDuration", publicName: "touchDuration", isSignal: true, isRequired: false, transformFunction: null }, onlyIOS: { classPropertyName: "onlyIOS", publicName: "onlyIOS", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { longpress: "longpress" }, host: { listeners: { "touchstart": "touchstart($event)", "touchmove": "touchend()", "touchcancel": "touchend()", "touchend": "touchend()" } }, ngImport: i0 });
133
130
  }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: LongPressDirective, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: LongPressDirective, decorators: [{
135
132
  type: Directive,
136
133
  args: [{
137
134
  selector: '[igoLongPress]',
138
135
  standalone: true
139
136
  }]
140
- }], propDecorators: { touchDuration: [{
141
- type: Input
142
- }], onlyIOS: [{
143
- type: Input
144
- }], longpress: [{
145
- type: Output
146
- }], touchstart: [{
137
+ }], propDecorators: { touchDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "touchDuration", required: false }] }], onlyIOS: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyIOS", required: false }] }], longpress: [{ type: i0.Output, args: ["longpress"] }], touchstart: [{
147
138
  type: HostListener,
148
139
  args: ['touchstart', ['$event']]
149
140
  }], touchend: [{
@@ -167,11 +158,11 @@ class IgoContextMenuModule {
167
158
  providers: []
168
159
  };
169
160
  }
170
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoContextMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
171
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: IgoContextMenuModule, imports: [ContextMenuDirective, LongPressDirective], exports: [ContextMenuDirective, LongPressDirective] });
172
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoContextMenuModule });
161
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoContextMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
162
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: IgoContextMenuModule, imports: [ContextMenuDirective, LongPressDirective], exports: [ContextMenuDirective, LongPressDirective] });
163
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoContextMenuModule });
173
164
  }
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoContextMenuModule, decorators: [{
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoContextMenuModule, decorators: [{
175
166
  type: NgModule,
176
167
  args: [{
177
168
  imports: [ContextMenuDirective, LongPressDirective],
@@ -1 +1 @@
1
- {"version":3,"file":"igo2-common-context-menu.mjs","sources":["../../../packages/common/context-menu/src/context-menu.directive.ts","../../../packages/common/context-menu/src/long-press.directive.ts","../../../packages/common/context-menu/src/context-menu.module.ts","../../../packages/common/context-menu/src/public_api.ts","../../../packages/common/context-menu/src/igo2-common-context-menu.ts"],"sourcesContent":["import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Directive,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output,\n ViewContainerRef,\n inject\n} from '@angular/core';\nimport type { TemplateRef } from '@angular/core';\n\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\n\n@Directive({\n selector: '[igoContextMenu]',\n standalone: true\n})\nexport class ContextMenuDirective {\n overlay = inject(Overlay);\n viewContainerRef = inject(ViewContainerRef);\n private elementRef = inject(ElementRef);\n\n private overlayRef: OverlayRef | null;\n private sub: Subscription;\n\n @Input('igoContextMenu') menuContext: TemplateRef<any>;\n @Output() menuPosition = new EventEmitter<{ x: number; y: number }>();\n\n @HostListener('longpress', ['$event'])\n @HostListener('contextmenu', ['$event'])\n public onContextMenu(e: MouseEvent | TouchEvent): void {\n let x;\n let y;\n if (e instanceof MouseEvent) {\n x = e.x;\n y = e.y;\n } else if (e instanceof TouchEvent) {\n x = e.touches[0].pageX;\n y = e.touches[0].pageY;\n }\n if (!x || !y) {\n return;\n }\n\n this.close();\n e.preventDefault();\n this.menuPosition.emit({ x, y });\n this.overlayRef = null;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo({ x, y })\n .withPositions([\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n }\n ]);\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.close()\n });\n this.overlayRef.attach(\n new TemplatePortal(this.menuContext, this.viewContainerRef, {\n $implicit: undefined\n })\n );\n\n this.sub = fromEvent<MouseEvent>(document, 'click')\n .pipe(\n filter((event) => {\n const clickTarget = event.target as HTMLElement;\n this.close();\n return (\n !!this.overlayRef &&\n !this.overlayRef.overlayElement.contains(clickTarget)\n );\n }),\n take(1)\n )\n .subscribe(() => this.close());\n\n this.sub = fromEvent<MouseEvent>(document, 'contextmenu')\n .pipe(\n filter((event) => {\n const clickTarget = event.target as HTMLElement;\n if (\n clickTarget &&\n !this.elementRef.nativeElement.contains(clickTarget) &&\n !this.overlayRef.overlayElement.contains(clickTarget)\n ) {\n return true;\n } else {\n event.preventDefault();\n }\n }),\n take(1)\n )\n .subscribe(() => this.close());\n }\n\n close() {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n if (this.sub) {\n this.sub.unsubscribe();\n }\n }\n}\n","import {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n Output\n} from '@angular/core';\n\n/**\n * IgoLongPress trigger longpress event after a define duration.\n * This directive exist to patch the unavailable contextmenu event on iOS.\n * @param touchDuration touch duration in ms, default value is 400ms\n * @param iOSOnly define if longpress is triggered only for iOS, default value = true\n */\n@Directive({\n selector: '[igoLongPress]',\n standalone: true\n})\nexport class LongPressDirective {\n private touchTimeout: any;\n @Input() touchDuration = 400;\n @Input() onlyIOS = true;\n @Output() longpress = new EventEmitter();\n\n @HostListener('touchstart', ['$event'])\n public touchstart(e: TouchEvent) {\n if (e.touches.length > 1) {\n this.touchEnd();\n return;\n }\n this.touchTimeout = setTimeout(() => {\n this.longpress.emit(e);\n }, this.touchDuration);\n }\n @HostListener('touchmove')\n @HostListener('touchcancel')\n @HostListener('touchend')\n public touchend() {\n this.touchEnd();\n }\n\n private touchEnd() {\n clearTimeout(this.touchTimeout);\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { ContextMenuDirective } from './context-menu.directive';\nimport { LongPressDirective } from './long-press.directive';\n\n/**\n * @deprecated import the components/directives directly or CONTEXT_MENU_DIRECTIVES for the set\n */\n@NgModule({\n imports: [ContextMenuDirective, LongPressDirective],\n exports: [ContextMenuDirective, LongPressDirective]\n})\nexport class IgoContextMenuModule {\n static forRoot(): ModuleWithProviders<IgoContextMenuModule> {\n return {\n ngModule: IgoContextMenuModule,\n providers: []\n };\n }\n}\n","import { ContextMenuDirective } from './context-menu.directive';\nimport { LongPressDirective } from './long-press.directive';\n\nexport * from './context-menu.module';\nexport * from './context-menu.directive';\nexport * from './long-press.directive';\n\nexport const CONTEXT_MENU_DIRECTIVES = [\n ContextMenuDirective,\n LongPressDirective\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"igo2-common-context-menu.mjs","sources":["../../../packages/common/context-menu/src/context-menu.directive.ts","../../../packages/common/context-menu/src/long-press.directive.ts","../../../packages/common/context-menu/src/context-menu.module.ts","../../../packages/common/context-menu/src/public_api.ts","../../../packages/common/context-menu/src/igo2-common-context-menu.ts"],"sourcesContent":["import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Directive,\n ElementRef,\n HostListener,\n ViewContainerRef,\n inject,\n input,\n output\n} from '@angular/core';\nimport type { TemplateRef } from '@angular/core';\n\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\n\n@Directive({\n selector: '[igoContextMenu]',\n standalone: true\n})\nexport class ContextMenuDirective {\n overlay = inject(Overlay);\n viewContainerRef = inject(ViewContainerRef);\n private elementRef = inject(ElementRef);\n\n private overlayRef: OverlayRef | null;\n private sub: Subscription;\n\n readonly menuContext = input<TemplateRef<any>>(undefined, {\n alias: 'igoContextMenu'\n });\n readonly menuPosition = output<{\n x: number;\n y: number;\n }>();\n\n @HostListener('longpress', ['$event'])\n @HostListener('contextmenu', ['$event'])\n public onContextMenu(e: MouseEvent | TouchEvent): void {\n let x;\n let y;\n if (e instanceof MouseEvent) {\n x = e.x;\n y = e.y;\n } else if (e instanceof TouchEvent) {\n x = e.touches[0].pageX;\n y = e.touches[0].pageY;\n }\n if (!x || !y) {\n return;\n }\n\n this.close();\n e.preventDefault();\n this.menuPosition.emit({ x, y });\n this.overlayRef = null;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo({ x, y })\n .withPositions([\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top'\n }\n ]);\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.close()\n });\n this.overlayRef.attach(\n new TemplatePortal(this.menuContext(), this.viewContainerRef, {\n $implicit: undefined\n })\n );\n\n this.sub = fromEvent<MouseEvent>(document, 'click')\n .pipe(\n filter((event) => {\n const clickTarget = event.target as HTMLElement;\n this.close();\n return (\n !!this.overlayRef &&\n !this.overlayRef.overlayElement.contains(clickTarget)\n );\n }),\n take(1)\n )\n .subscribe(() => this.close());\n\n this.sub = fromEvent<MouseEvent>(document, 'contextmenu')\n .pipe(\n filter((event) => {\n const clickTarget = event.target as HTMLElement;\n if (\n clickTarget &&\n !this.elementRef.nativeElement.contains(clickTarget) &&\n !this.overlayRef.overlayElement.contains(clickTarget)\n ) {\n return true;\n } else {\n event.preventDefault();\n }\n }),\n take(1)\n )\n .subscribe(() => this.close());\n }\n\n close() {\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n if (this.sub) {\n this.sub.unsubscribe();\n }\n }\n}\n","import { Directive, HostListener, input, output } from '@angular/core';\n\n/**\n * IgoLongPress trigger longpress event after a define duration.\n * This directive exist to patch the unavailable contextmenu event on iOS.\n * @param touchDuration touch duration in ms, default value is 400ms\n * @param iOSOnly define if longpress is triggered only for iOS, default value = true\n */\n@Directive({\n selector: '[igoLongPress]',\n standalone: true\n})\nexport class LongPressDirective {\n private touchTimeout: any;\n readonly touchDuration = input(400);\n readonly onlyIOS = input(true);\n readonly longpress = output<TouchEvent>();\n\n @HostListener('touchstart', ['$event'])\n public touchstart(e: TouchEvent) {\n if (e.touches.length > 1) {\n this.touchEnd();\n return;\n }\n this.touchTimeout = setTimeout(() => {\n this.longpress.emit(e);\n }, this.touchDuration());\n }\n @HostListener('touchmove')\n @HostListener('touchcancel')\n @HostListener('touchend')\n public touchend() {\n this.touchEnd();\n }\n\n private touchEnd() {\n clearTimeout(this.touchTimeout);\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { ContextMenuDirective } from './context-menu.directive';\nimport { LongPressDirective } from './long-press.directive';\n\n/**\n * @deprecated import the components/directives directly or CONTEXT_MENU_DIRECTIVES for the set\n */\n@NgModule({\n imports: [ContextMenuDirective, LongPressDirective],\n exports: [ContextMenuDirective, LongPressDirective]\n})\nexport class IgoContextMenuModule {\n static forRoot(): ModuleWithProviders<IgoContextMenuModule> {\n return {\n ngModule: IgoContextMenuModule,\n providers: []\n };\n }\n}\n","import { ContextMenuDirective } from './context-menu.directive';\nimport { LongPressDirective } from './long-press.directive';\n\nexport * from './context-menu.module';\nexport * from './context-menu.directive';\nexport * from './long-press.directive';\n\nexport const CONTEXT_MENU_DIRECTIVES = [\n ContextMenuDirective,\n LongPressDirective\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -7,10 +7,10 @@ class SanitizeHtmlPipe {
7
7
  transform(v) {
8
8
  return this._sanitizer.bypassSecurityTrustHtml(v);
9
9
  }
10
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SanitizeHtmlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
11
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: SanitizeHtmlPipe, isStandalone: true, name: "sanitizeHtml" });
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SanitizeHtmlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
11
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: SanitizeHtmlPipe, isStandalone: true, name: "sanitizeHtml" });
12
12
  }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SanitizeHtmlPipe, decorators: [{
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SanitizeHtmlPipe, decorators: [{
14
14
  type: Pipe,
15
15
  args: [{
16
16
  name: 'sanitizeHtml',
@@ -26,10 +26,10 @@ class CustomHtmlComponent {
26
26
  this._html = value;
27
27
  }
28
28
  _html = '';
29
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomHtmlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: CustomHtmlComponent, isStandalone: true, selector: "igo-custom-html", inputs: { html: "html" }, ngImport: i0, template: "<div class=\"custom-html\" [innerHTML]=\"html | sanitizeHtml\"></div>\n", styles: [":host .custom-html{padding:16px}\n"], dependencies: [{ kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }] });
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CustomHtmlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: CustomHtmlComponent, isStandalone: true, selector: "igo-custom-html", inputs: { html: "html" }, ngImport: i0, template: "<div class=\"custom-html\" [innerHTML]=\"html | sanitizeHtml\"></div>\n", styles: [":host .custom-html{padding:16px}\n"], dependencies: [{ kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }] });
31
31
  }
32
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: CustomHtmlComponent, decorators: [{
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CustomHtmlComponent, decorators: [{
33
33
  type: Component,
34
34
  args: [{ selector: 'igo-custom-html', imports: [SanitizeHtmlPipe], template: "<div class=\"custom-html\" [innerHTML]=\"html | sanitizeHtml\"></div>\n", styles: [":host .custom-html{padding:16px}\n"] }]
35
35
  }], propDecorators: { html: [{
@@ -45,11 +45,11 @@ class IgoCustomHtmlModule {
45
45
  ngModule: IgoCustomHtmlModule
46
46
  };
47
47
  }
48
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoCustomHtmlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
49
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: IgoCustomHtmlModule, imports: [SanitizeHtmlPipe, CustomHtmlComponent], exports: [SanitizeHtmlPipe, CustomHtmlComponent] });
50
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoCustomHtmlModule });
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoCustomHtmlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
49
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: IgoCustomHtmlModule, imports: [SanitizeHtmlPipe, CustomHtmlComponent], exports: [SanitizeHtmlPipe, CustomHtmlComponent] });
50
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoCustomHtmlModule });
51
51
  }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: IgoCustomHtmlModule, decorators: [{
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: IgoCustomHtmlModule, decorators: [{
53
53
  type: NgModule,
54
54
  args: [{
55
55
  imports: [SanitizeHtmlPipe, CustomHtmlComponent],
@@ -0,0 +1,316 @@
1
+ import { DatePipe } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, LOCALE_ID, viewChild, input, model, output, Input, Component } from '@angular/core';
4
+ import * as i4 from '@angular/forms';
5
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
6
+ import * as i1 from '@angular/material/button';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { provideNativeDateAdapter } from '@angular/material/core';
9
+ import * as i5 from '@angular/material/datepicker';
10
+ import { MatDatepickerModule } from '@angular/material/datepicker';
11
+ import * as i2 from '@angular/material/form-field';
12
+ import { MatFormFieldModule } from '@angular/material/form-field';
13
+ import { MatIconModule } from '@angular/material/icon';
14
+ import * as i3 from '@angular/material/input';
15
+ import { MatInputModule } from '@angular/material/input';
16
+ import { resolveDate, isTimeFrame, TimeFrame } from '@igo2/utils';
17
+ import { Subject } from 'rxjs';
18
+ import { takeUntil } from 'rxjs/operators';
19
+
20
+ class DatepickerComponent {
21
+ datePipe = inject(DatePipe);
22
+ _locale = inject(LOCALE_ID);
23
+ picker = viewChild.required('picker');
24
+ set disabled(value) {
25
+ this._disabled = value;
26
+ this.setDisabledState();
27
+ }
28
+ get disabled() {
29
+ return this._disabled;
30
+ }
31
+ _disabled = false;
32
+ placeholder = input(undefined, ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
33
+ minDate = input(undefined, ...(ngDevMode ? [{ debugName: "minDate" }] : []));
34
+ maxDate = input(undefined, ...(ngDevMode ? [{ debugName: "maxDate" }] : []));
35
+ calendarType = input('date', ...(ngDevMode ? [{ debugName: "calendarType" }] : []));
36
+ startView = model(undefined, ...(ngDevMode ? [{ debugName: "startView" }] : []));
37
+ startAt = input(undefined, ...(ngDevMode ? [{ debugName: "startAt" }] : []));
38
+ datepickerFilter = input(undefined, ...(ngDevMode ? [{ debugName: "datepickerFilter" }] : []));
39
+ value = input(undefined, ...(ngDevMode ? [{ debugName: "value" }] : []));
40
+ todayButtonLabel = input('Today', ...(ngDevMode ? [{ debugName: "todayButtonLabel" }] : []));
41
+ clearButtonLabel = input('Clear', ...(ngDevMode ? [{ debugName: "clearButtonLabel" }] : []));
42
+ valueChange = output();
43
+ get panelClassName() {
44
+ return ['year', 'month'].includes(this.calendarType())
45
+ ? 'igo-datepicker-month-year-picker'
46
+ : '';
47
+ }
48
+ resolveDate = resolveDate;
49
+ dateFormControl;
50
+ dateLabelFormControl;
51
+ showActions = false;
52
+ todaySelected = false;
53
+ previousTodaySelected;
54
+ previousValue;
55
+ destroy$ = new Subject();
56
+ ngOnInit() {
57
+ this.initStartView();
58
+ this.initFormControls();
59
+ this.todaySelected = isTimeFrame(this.value());
60
+ this.dateFormControl.valueChanges.subscribe((value) => {
61
+ this.picker().startAt = value;
62
+ if (!this.todaySelected) {
63
+ this.dateLabelFormControl.setValue(this.getFormattedLabel(value));
64
+ }
65
+ const emittedValue = this.todaySelected
66
+ ? this.calendarType() === 'datetime'
67
+ ? TimeFrame[0]
68
+ : TimeFrame[1]
69
+ : value;
70
+ this.valueChange.emit(emittedValue);
71
+ });
72
+ }
73
+ ngAfterViewInit() {
74
+ this.attachCalendarTypeListeners();
75
+ this.picker()
76
+ .openedStream.pipe(takeUntil(this.destroy$))
77
+ .subscribe(() => {
78
+ this.previousValue = this.dateFormControl.value;
79
+ this.previousTodaySelected = this.todaySelected;
80
+ this.todaySelected = false;
81
+ this.registerAutoCloseEvents();
82
+ });
83
+ this.picker()
84
+ .closedStream.pipe(takeUntil(this.destroy$))
85
+ .subscribe(() => {
86
+ if (this.previousValue === this.dateFormControl.value) {
87
+ this.todaySelected = this.previousTodaySelected;
88
+ }
89
+ else if (isTimeFrame(this.value())) {
90
+ this.todaySelected = true;
91
+ }
92
+ });
93
+ }
94
+ ngOnDestroy() {
95
+ this.destroy$.next();
96
+ this.destroy$.complete();
97
+ }
98
+ setToday() {
99
+ const keyword = this.calendarType() === 'datetime' ? TimeFrame[0] : TimeFrame[1];
100
+ const picker = this.picker();
101
+ const date = (picker.startAt = resolveDate(keyword));
102
+ this.dateLabelFormControl.setValue(this.getFormattedLabel(keyword));
103
+ this.todaySelected = true;
104
+ this.updateDateControl(date);
105
+ picker.close();
106
+ }
107
+ clearDate() {
108
+ this.dateFormControl.reset();
109
+ this.dateLabelFormControl.reset();
110
+ this.picker().close();
111
+ }
112
+ registerAutoCloseEvents() {
113
+ const resolvedMaxDate = resolveDate(this.maxDate());
114
+ this.showActions =
115
+ (!resolvedMaxDate || resolvedMaxDate >= new Date()) &&
116
+ ['date', 'datetime'].includes(this.calendarType());
117
+ if (this.showActions) {
118
+ // Workaround, we need the next event queue to get the calendar
119
+ setTimeout(() => {
120
+ const calendar = this.picker()['_componentRef'].instance._calendar;
121
+ calendar?._userSelection.subscribe((event) => {
122
+ this.dateFormControl.setValue(event.value);
123
+ this.picker().close();
124
+ });
125
+ }, 0);
126
+ }
127
+ }
128
+ /** Public API methods */
129
+ reset(date) {
130
+ this.todaySelected = isTimeFrame(date);
131
+ this.dateLabelFormControl.setValue(this.getFormattedLabel(date));
132
+ this.dateFormControl.setValue(resolveDate(date));
133
+ }
134
+ handleDateLabelBlur() {
135
+ const value = this.dateLabelFormControl.value;
136
+ const parsedDate = this.parseInput(value);
137
+ if (!parsedDate)
138
+ return;
139
+ this.dateFormControl.setValue(parsedDate);
140
+ }
141
+ parseInput(value) {
142
+ if (!value)
143
+ return undefined;
144
+ switch (this.calendarType()) {
145
+ case 'year':
146
+ return this.parseYearInput(value);
147
+ case 'month':
148
+ return this.parseMonthInput(value);
149
+ default:
150
+ return this.parseDateInput(value);
151
+ }
152
+ }
153
+ parseYearInput(value) {
154
+ // Accept "yyyy"
155
+ const match = value.match(/^\s*(\d{4})\s*$/);
156
+ if (!match)
157
+ return undefined;
158
+ const year = +match[1];
159
+ const date = new Date(year, 0, 1);
160
+ return date.getFullYear() === year ? date : undefined;
161
+ }
162
+ parseMonthInput(value) {
163
+ return this.parseFromLocalizedInput(value, {
164
+ year: 'numeric',
165
+ month: '2-digit'
166
+ });
167
+ }
168
+ parseDateInput(value) {
169
+ return this.parseFromLocalizedInput(value, {
170
+ year: 'numeric',
171
+ month: '2-digit',
172
+ day: '2-digit'
173
+ });
174
+ }
175
+ initStartView() {
176
+ if (this.startView())
177
+ return;
178
+ switch (this.calendarType()) {
179
+ case 'year':
180
+ this.startView.set('multi-year');
181
+ break;
182
+ case 'month':
183
+ this.startView.set('year');
184
+ break;
185
+ case 'date':
186
+ case 'datetime':
187
+ default:
188
+ this.startView.set('month');
189
+ break;
190
+ }
191
+ }
192
+ initFormControls() {
193
+ const date = this.value() ?? new Date();
194
+ this.dateFormControl = new FormControl({
195
+ value: resolveDate(date),
196
+ disabled: this.disabled
197
+ });
198
+ this.dateLabelFormControl = new FormControl({
199
+ value: this.getFormattedLabel(date),
200
+ disabled: this.disabled
201
+ });
202
+ }
203
+ setDisabledState() {
204
+ const method = this.disabled ? 'disable' : 'enable';
205
+ this.dateFormControl?.[method]({ emitEvent: false });
206
+ this.dateLabelFormControl?.[method]({ emitEvent: false });
207
+ }
208
+ attachCalendarTypeListeners() {
209
+ const calendarType = this.calendarType();
210
+ if (calendarType === 'year') {
211
+ this.picker().yearSelected.subscribe((date) => {
212
+ this.updateDateControl(date);
213
+ this.picker().close();
214
+ });
215
+ }
216
+ else if (calendarType === 'month') {
217
+ this.picker().monthSelected.subscribe((date) => {
218
+ this.updateDateControl(date);
219
+ this.picker().close();
220
+ });
221
+ }
222
+ }
223
+ updateDateControl(date) {
224
+ this.dateFormControl.setValue(date);
225
+ }
226
+ getFormattedLabel(date) {
227
+ if (isTimeFrame(date))
228
+ return this.todayButtonLabel();
229
+ const calendarType = this.calendarType();
230
+ if (calendarType === 'year') {
231
+ return this.format(date, 'yyyy');
232
+ }
233
+ else if (calendarType === 'month') {
234
+ return this.formatYearMonth(date);
235
+ }
236
+ return this.format(date, 'shortDate');
237
+ }
238
+ format(date, formatStr) {
239
+ return (this.datePipe.transform(date, formatStr, undefined, this._locale) ?? '');
240
+ }
241
+ formatYearMonth(date) {
242
+ return new Intl.DateTimeFormat(this._locale, {
243
+ year: 'numeric',
244
+ month: '2-digit'
245
+ }).format(date);
246
+ }
247
+ parseFromLocalizedInput(value, formatOptions) {
248
+ const expectedOrder = this.getExpectedDateOrder(formatOptions);
249
+ const inputParts = value.trim().match(/\d+/g);
250
+ if (!inputParts || inputParts.length !== expectedOrder.length)
251
+ return undefined;
252
+ let year;
253
+ let month;
254
+ let day;
255
+ expectedOrder.forEach((type, i) => {
256
+ const num = Number(inputParts[i]);
257
+ if (type === 'year')
258
+ year = num;
259
+ else if (type === 'month')
260
+ month = num;
261
+ else if (type === 'day')
262
+ day = num;
263
+ });
264
+ // Basic range checks
265
+ if (!year || !month || month < 1 || month > 12)
266
+ return undefined;
267
+ const date = new Date(year, month - 1, day !== undefined ? day : 1);
268
+ const isValid = date.getFullYear() === year &&
269
+ date.getMonth() === month - 1 &&
270
+ day !== undefined
271
+ ? date.getDate() === day
272
+ : true;
273
+ return isValid ? date : undefined;
274
+ }
275
+ /**
276
+ * Returns the expected order of date parts (year, month, day) as used by
277
+ * Intl.DateTimeFormat.formatToParts for the provided options and current locale.
278
+ */
279
+ getExpectedDateOrder(formatOptions) {
280
+ const sampleDate = new Date(2001, 1, 3);
281
+ const formatter = new Intl.DateTimeFormat(this._locale, formatOptions);
282
+ const formatParts = formatter.formatToParts(sampleDate);
283
+ // Extract expected order from locale formatting
284
+ const expectedOrder = [];
285
+ formatParts.forEach((part) => {
286
+ if (part.type === 'year' ||
287
+ part.type === 'month' ||
288
+ part.type === 'day') {
289
+ expectedOrder.push(part.type);
290
+ }
291
+ });
292
+ return expectedOrder;
293
+ }
294
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
295
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DatepickerComponent, isStandalone: true, selector: "igo-datepicker", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, calendarType: { classPropertyName: "calendarType", publicName: "calendarType", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, datepickerFilter: { classPropertyName: "datepickerFilter", publicName: "datepickerFilter", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, todayButtonLabel: { classPropertyName: "todayButtonLabel", publicName: "todayButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, clearButtonLabel: { classPropertyName: "clearButtonLabel", publicName: "clearButtonLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startView: "startViewChange", valueChange: "valueChange" }, providers: [DatePipe, provideNativeDateAdapter()], viewQueries: [{ propertyName: "picker", first: true, predicate: ["picker"], descendants: true, isSignal: true }], ngImport: i0, template: "<mat-form-field subscriptSizing=\"dynamic\">\n @if (startView() === 'multi-year' && calendarType() === 'year') {\n <mat-label>\n {{ placeholder() }}\n </mat-label>\n }\n\n <!-- Text input for displaying the selected date -->\n <input\n matInput\n type=\"text\"\n name=\"dateLabel\"\n [formControl]=\"dateLabelFormControl\"\n [placeholder]=\"placeholder()\"\n (blur)=\"handleDateLabelBlur()\"\n [readonly]=\"todaySelected\"\n />\n <!-- Hidden input for the actual datepicker -->\n <input\n [matDatepicker]=\"picker\"\n hidden=\"true\"\n name=\"date\"\n [formControl]=\"dateFormControl\"\n [min]=\"resolveDate(minDate())\"\n [max]=\"resolveDate(maxDate())\"\n [matDatepickerFilter]=\"datepickerFilter()\"\n />\n\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"disabled\" />\n <mat-datepicker\n #picker\n [startView]=\"startView()\"\n [startAt]=\"resolveDate(startAt())\"\n [panelClass]=\"panelClassName\"\n >\n @if (showActions) {\n <mat-datepicker-actions>\n <button mat-button (click)=\"clearDate()\">\n {{ clearButtonLabel() }}\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"setToday()\">\n {{ todayButtonLabel() }}\n </button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n</mat-form-field>\n", styles: [":host mat-form-field{width:150px}::ng-deep .igo-datepicker-month-year-picker .mat-calendar-period-button{pointer-events:none;cursor:default;color:#00000061}.igo-datepicker-custom-footer{display:flex;justify-content:flex-end;align-items:center;padding:0 8px 8px;gap:5px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i5.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }] });
296
+ }
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DatepickerComponent, decorators: [{
298
+ type: Component,
299
+ args: [{ selector: 'igo-datepicker', imports: [
300
+ MatButtonModule,
301
+ MatIconModule,
302
+ MatFormFieldModule,
303
+ MatInputModule,
304
+ ReactiveFormsModule,
305
+ MatDatepickerModule
306
+ ], providers: [DatePipe, provideNativeDateAdapter()], template: "<mat-form-field subscriptSizing=\"dynamic\">\n @if (startView() === 'multi-year' && calendarType() === 'year') {\n <mat-label>\n {{ placeholder() }}\n </mat-label>\n }\n\n <!-- Text input for displaying the selected date -->\n <input\n matInput\n type=\"text\"\n name=\"dateLabel\"\n [formControl]=\"dateLabelFormControl\"\n [placeholder]=\"placeholder()\"\n (blur)=\"handleDateLabelBlur()\"\n [readonly]=\"todaySelected\"\n />\n <!-- Hidden input for the actual datepicker -->\n <input\n [matDatepicker]=\"picker\"\n hidden=\"true\"\n name=\"date\"\n [formControl]=\"dateFormControl\"\n [min]=\"resolveDate(minDate())\"\n [max]=\"resolveDate(maxDate())\"\n [matDatepickerFilter]=\"datepickerFilter()\"\n />\n\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"disabled\" />\n <mat-datepicker\n #picker\n [startView]=\"startView()\"\n [startAt]=\"resolveDate(startAt())\"\n [panelClass]=\"panelClassName\"\n >\n @if (showActions) {\n <mat-datepicker-actions>\n <button mat-button (click)=\"clearDate()\">\n {{ clearButtonLabel() }}\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"setToday()\">\n {{ todayButtonLabel() }}\n </button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n</mat-form-field>\n", styles: [":host mat-form-field{width:150px}::ng-deep .igo-datepicker-month-year-picker .mat-calendar-period-button{pointer-events:none;cursor:default;color:#00000061}.igo-datepicker-custom-footer{display:flex;justify-content:flex-end;align-items:center;padding:0 8px 8px;gap:5px}\n"] }]
307
+ }], propDecorators: { picker: [{ type: i0.ViewChild, args: ['picker', { isSignal: true }] }], disabled: [{
308
+ type: Input
309
+ }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], calendarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "calendarType", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }, { type: i0.Output, args: ["startViewChange"] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], datepickerFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "datepickerFilter", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], todayButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayButtonLabel", required: false }] }], clearButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearButtonLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
310
+
311
+ /**
312
+ * Generated bundle index. Do not edit.
313
+ */
314
+
315
+ export { DatepickerComponent };
316
+ //# sourceMappingURL=igo2-common-datepicker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"igo2-common-datepicker.mjs","sources":["../../../packages/common/datepicker/src/datepicker.component.ts","../../../packages/common/datepicker/src/datepicker.component.html","../../../packages/common/datepicker/src/igo2-common-datepicker.ts"],"sourcesContent":["import { DatePipe } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n Input,\n LOCALE_ID,\n OnDestroy,\n OnInit,\n inject,\n input,\n model,\n output,\n viewChild\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { provideNativeDateAdapter } from '@angular/material/core';\nimport {\n MatCalendar,\n MatDatepicker,\n MatDatepickerModule\n} from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\n\nimport { TimeFrame, isTimeFrame, resolveDate } from '@igo2/utils';\n\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\n@Component({\n selector: 'igo-datepicker',\n templateUrl: './datepicker.component.html',\n styleUrls: ['./datepicker.component.scss'],\n imports: [\n MatButtonModule,\n MatIconModule,\n MatFormFieldModule,\n MatInputModule,\n ReactiveFormsModule,\n MatDatepickerModule\n ],\n providers: [DatePipe, provideNativeDateAdapter()]\n})\nexport class DatepickerComponent implements OnInit, AfterViewInit, OnDestroy {\n private datePipe = inject(DatePipe);\n private _locale = inject(LOCALE_ID);\n\n readonly picker = viewChild.required<MatDatepicker<Date>>('picker');\n\n @Input()\n set disabled(value: boolean) {\n this._disabled = value;\n this.setDisabledState();\n }\n get disabled(): boolean {\n return this._disabled;\n }\n private _disabled = false;\n\n readonly placeholder = input<string>(undefined);\n readonly minDate = input<Date | TimeFrame>(undefined);\n readonly maxDate = input<Date | TimeFrame>(undefined);\n readonly calendarType = input<'year' | 'month' | 'date' | 'datetime'>('date');\n readonly startView = model<'multi-year' | 'year' | 'month'>(undefined);\n readonly startAt = input<Date | TimeFrame>(undefined);\n readonly datepickerFilter = input<(date: Date | null) => boolean>(undefined);\n readonly value = input<Date | TimeFrame>(undefined);\n readonly todayButtonLabel = input<string>('Today');\n readonly clearButtonLabel = input<string>('Clear');\n\n readonly valueChange = output<Date | TimeFrame>();\n\n get panelClassName(): string {\n return ['year', 'month'].includes(this.calendarType())\n ? 'igo-datepicker-month-year-picker'\n : '';\n }\n\n resolveDate = resolveDate;\n dateFormControl!: FormControl<Date>;\n dateLabelFormControl!: FormControl<string>;\n showActions = false;\n todaySelected = false;\n previousTodaySelected: boolean;\n previousValue: Date | TimeFrame;\n\n private destroy$ = new Subject<void>();\n\n ngOnInit(): void {\n this.initStartView();\n this.initFormControls();\n\n this.todaySelected = isTimeFrame(this.value());\n\n this.dateFormControl.valueChanges.subscribe((value) => {\n this.picker().startAt = value;\n if (!this.todaySelected) {\n this.dateLabelFormControl.setValue(this.getFormattedLabel(value));\n }\n\n const emittedValue = this.todaySelected\n ? this.calendarType() === 'datetime'\n ? TimeFrame[0]\n : TimeFrame[1]\n : value;\n this.valueChange.emit(emittedValue);\n });\n }\n\n ngAfterViewInit(): void {\n this.attachCalendarTypeListeners();\n this.picker()\n .openedStream.pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.previousValue = this.dateFormControl.value;\n this.previousTodaySelected = this.todaySelected;\n this.todaySelected = false;\n this.registerAutoCloseEvents();\n });\n\n this.picker()\n .closedStream.pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.previousValue === this.dateFormControl.value) {\n this.todaySelected = this.previousTodaySelected;\n } else if (isTimeFrame(this.value())) {\n this.todaySelected = true;\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n setToday(): void {\n const keyword =\n this.calendarType() === 'datetime' ? TimeFrame[0] : TimeFrame[1];\n const picker = this.picker();\n const date = (picker.startAt = resolveDate(keyword));\n this.dateLabelFormControl.setValue(this.getFormattedLabel(keyword));\n this.todaySelected = true;\n this.updateDateControl(date);\n\n picker.close();\n }\n\n clearDate(): void {\n this.dateFormControl.reset();\n this.dateLabelFormControl.reset();\n this.picker().close();\n }\n\n private registerAutoCloseEvents(): void {\n const resolvedMaxDate = resolveDate(this.maxDate());\n\n this.showActions =\n (!resolvedMaxDate || resolvedMaxDate >= new Date()) &&\n ['date', 'datetime'].includes(this.calendarType());\n\n if (this.showActions) {\n // Workaround, we need the next event queue to get the calendar\n setTimeout(() => {\n const calendar: MatCalendar<Date> =\n this.picker()['_componentRef'].instance._calendar;\n calendar?._userSelection.subscribe((event) => {\n this.dateFormControl.setValue(event.value);\n this.picker().close();\n });\n }, 0);\n }\n }\n\n /** Public API methods */\n reset(date: Date | TimeFrame) {\n this.todaySelected = isTimeFrame(date);\n this.dateLabelFormControl.setValue(this.getFormattedLabel(date));\n this.dateFormControl.setValue(resolveDate(date));\n }\n\n handleDateLabelBlur(): void {\n const value = this.dateLabelFormControl.value;\n const parsedDate = this.parseInput(value);\n if (!parsedDate) return;\n this.dateFormControl.setValue(parsedDate);\n }\n\n private parseInput(value: string): Date | undefined {\n if (!value) return undefined;\n switch (this.calendarType()) {\n case 'year':\n return this.parseYearInput(value);\n case 'month':\n return this.parseMonthInput(value);\n default:\n return this.parseDateInput(value);\n }\n }\n\n private parseYearInput(value: string): Date | undefined {\n // Accept \"yyyy\"\n const match = value.match(/^\\s*(\\d{4})\\s*$/);\n if (!match) return undefined;\n const year = +match[1];\n const date = new Date(year, 0, 1);\n return date.getFullYear() === year ? date : undefined;\n }\n\n private parseMonthInput(value: string): Date | undefined {\n return this.parseFromLocalizedInput(value, {\n year: 'numeric',\n month: '2-digit'\n });\n }\n\n private parseDateInput(value: string): Date | undefined {\n return this.parseFromLocalizedInput(value, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n }\n\n private initStartView(): void {\n if (this.startView()) return;\n switch (this.calendarType()) {\n case 'year':\n this.startView.set('multi-year');\n break;\n case 'month':\n this.startView.set('year');\n break;\n case 'date':\n case 'datetime':\n default:\n this.startView.set('month');\n break;\n }\n }\n\n private initFormControls() {\n const date = this.value() ?? new Date();\n this.dateFormControl = new FormControl({\n value: resolveDate(date),\n disabled: this.disabled\n });\n\n this.dateLabelFormControl = new FormControl({\n value: this.getFormattedLabel(date),\n disabled: this.disabled\n });\n }\n\n private setDisabledState(): void {\n const method = this.disabled ? 'disable' : 'enable';\n this.dateFormControl?.[method]({ emitEvent: false });\n this.dateLabelFormControl?.[method]({ emitEvent: false });\n }\n\n private attachCalendarTypeListeners(): void {\n const calendarType = this.calendarType();\n if (calendarType === 'year') {\n this.picker().yearSelected.subscribe((date) => {\n this.updateDateControl(date);\n this.picker().close();\n });\n } else if (calendarType === 'month') {\n this.picker().monthSelected.subscribe((date) => {\n this.updateDateControl(date);\n this.picker().close();\n });\n }\n }\n\n private updateDateControl(date: Date) {\n this.dateFormControl.setValue(date);\n }\n\n private getFormattedLabel(date: Date | TimeFrame): string {\n if (isTimeFrame(date)) return this.todayButtonLabel();\n const calendarType = this.calendarType();\n if (calendarType === 'year') {\n return this.format(date as Date, 'yyyy');\n } else if (calendarType === 'month') {\n return this.formatYearMonth(date as Date);\n }\n return this.format(date as Date, 'shortDate');\n }\n\n private format(date: Date, formatStr: string): string {\n return (\n this.datePipe.transform(date, formatStr, undefined, this._locale) ?? ''\n );\n }\n\n private formatYearMonth(date: Date): string {\n return new Intl.DateTimeFormat(this._locale, {\n year: 'numeric',\n month: '2-digit'\n }).format(date);\n }\n\n private parseFromLocalizedInput(\n value: string,\n formatOptions: Intl.DateTimeFormatOptions\n ): Date | undefined {\n const expectedOrder = this.getExpectedDateOrder(formatOptions);\n const inputParts = value.trim().match(/\\d+/g);\n if (!inputParts || inputParts.length !== expectedOrder.length)\n return undefined;\n\n let year: number | undefined;\n let month: number | undefined;\n let day: number | undefined;\n\n expectedOrder.forEach((type, i) => {\n const num = Number(inputParts[i]);\n if (type === 'year') year = num;\n else if (type === 'month') month = num;\n else if (type === 'day') day = num;\n });\n\n // Basic range checks\n if (!year || !month || month < 1 || month > 12) return undefined;\n const date = new Date(year, month - 1, day !== undefined ? day : 1);\n const isValid =\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n day !== undefined\n ? date.getDate() === day\n : true;\n return isValid ? date : undefined;\n }\n\n /**\n * Returns the expected order of date parts (year, month, day) as used by\n * Intl.DateTimeFormat.formatToParts for the provided options and current locale.\n */\n private getExpectedDateOrder(\n formatOptions: Intl.DateTimeFormatOptions\n ): ('year' | 'month' | 'day')[] {\n const sampleDate = new Date(2001, 1, 3);\n const formatter = new Intl.DateTimeFormat(this._locale, formatOptions);\n const formatParts = formatter.formatToParts(sampleDate);\n // Extract expected order from locale formatting\n const expectedOrder: ('year' | 'month' | 'day')[] = [];\n formatParts.forEach((part) => {\n if (\n part.type === 'year' ||\n part.type === 'month' ||\n part.type === 'day'\n ) {\n expectedOrder.push(part.type);\n }\n });\n return expectedOrder;\n }\n}\n","<mat-form-field subscriptSizing=\"dynamic\">\n @if (startView() === 'multi-year' && calendarType() === 'year') {\n <mat-label>\n {{ placeholder() }}\n </mat-label>\n }\n\n <!-- Text input for displaying the selected date -->\n <input\n matInput\n type=\"text\"\n name=\"dateLabel\"\n [formControl]=\"dateLabelFormControl\"\n [placeholder]=\"placeholder()\"\n (blur)=\"handleDateLabelBlur()\"\n [readonly]=\"todaySelected\"\n />\n <!-- Hidden input for the actual datepicker -->\n <input\n [matDatepicker]=\"picker\"\n hidden=\"true\"\n name=\"date\"\n [formControl]=\"dateFormControl\"\n [min]=\"resolveDate(minDate())\"\n [max]=\"resolveDate(maxDate())\"\n [matDatepickerFilter]=\"datepickerFilter()\"\n />\n\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\" [disabled]=\"disabled\" />\n <mat-datepicker\n #picker\n [startView]=\"startView()\"\n [startAt]=\"resolveDate(startAt())\"\n [panelClass]=\"panelClassName\"\n >\n @if (showActions) {\n <mat-datepicker-actions>\n <button mat-button (click)=\"clearDate()\">\n {{ clearButtonLabel() }}\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"setToday()\">\n {{ todayButtonLabel() }}\n </button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n</mat-form-field>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}