@ngneers/controls 0.0.1-pre1 → 0.0.1-pre2

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/ngneers-controls-accordion.mjs +194 -0
  3. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
  4. package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
  5. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
  6. package/fesm2022/ngneers-controls-api.mjs +256 -227
  7. package/fesm2022/ngneers-controls-api.mjs.map +1 -1
  8. package/fesm2022/ngneers-controls-avatar.mjs +70 -0
  9. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
  10. package/fesm2022/ngneers-controls-base.mjs +397 -0
  11. package/fesm2022/ngneers-controls-base.mjs.map +1 -0
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
  13. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
  14. package/fesm2022/ngneers-controls-button-group.mjs +51 -0
  15. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
  16. package/fesm2022/ngneers-controls-button.mjs +62 -0
  17. package/fesm2022/ngneers-controls-button.mjs.map +1 -0
  18. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
  19. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
  20. package/fesm2022/ngneers-controls-calendar.mjs +468 -0
  21. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
  22. package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
  23. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
  24. package/fesm2022/ngneers-controls-chip.mjs +52 -0
  25. package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
  26. package/fesm2022/ngneers-controls-defer.mjs +43 -0
  27. package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
  28. package/fesm2022/ngneers-controls-dialog.mjs +329 -33
  29. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  30. package/fesm2022/ngneers-controls-directives.mjs +443 -0
  31. package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
  32. package/fesm2022/ngneers-controls-drawer.mjs +232 -0
  33. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
  35. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
  36. package/fesm2022/ngneers-controls-filter.mjs +516 -0
  37. package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
  38. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
  39. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
  40. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
  41. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
  42. package/fesm2022/ngneers-controls-i18n.mjs +57 -0
  43. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
  44. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
  45. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
  46. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
  47. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
  48. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
  49. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
  50. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
  51. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
  52. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
  53. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
  54. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
  55. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
  56. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
  57. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
  58. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
  59. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
  60. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
  61. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
  62. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
  63. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
  64. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
  65. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
  66. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
  67. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
  68. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
  69. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
  70. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
  71. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
  72. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
  73. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
  74. package/fesm2022/ngneers-controls-icon.mjs +60 -18
  75. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  76. package/fesm2022/ngneers-controls-inplace.mjs +107 -0
  77. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
  78. package/fesm2022/ngneers-controls-input-field.mjs +141 -0
  79. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
  80. package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
  81. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
  82. package/fesm2022/ngneers-controls-input.mjs +69 -0
  83. package/fesm2022/ngneers-controls-input.mjs.map +1 -0
  84. package/fesm2022/ngneers-controls-item-view.mjs +441 -0
  85. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
  86. package/fesm2022/ngneers-controls-list-box.mjs +157 -53
  87. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-menu.mjs +332 -0
  89. package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
  90. package/fesm2022/ngneers-controls-message.mjs +29 -0
  91. package/fesm2022/ngneers-controls-message.mjs.map +1 -0
  92. package/fesm2022/ngneers-controls-paginator.mjs +111 -0
  93. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
  94. package/fesm2022/ngneers-controls-popover.mjs +129 -40
  95. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  96. package/fesm2022/ngneers-controls-progress.mjs +82 -0
  97. package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
  98. package/fesm2022/ngneers-controls-scroller.mjs +155 -78
  99. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  100. package/fesm2022/ngneers-controls-select-button.mjs +55 -0
  101. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
  102. package/fesm2022/ngneers-controls-select.mjs +313 -103
  103. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  104. package/fesm2022/ngneers-controls-slider.mjs +155 -0
  105. package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
  106. package/fesm2022/ngneers-controls-spinner.mjs +169 -0
  107. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
  108. package/fesm2022/ngneers-controls-splitter.mjs +717 -0
  109. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
  110. package/fesm2022/ngneers-controls-switch.mjs +39 -0
  111. package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
  112. package/fesm2022/ngneers-controls-table.mjs +379 -0
  113. package/fesm2022/ngneers-controls-table.mjs.map +1 -0
  114. package/fesm2022/ngneers-controls-tabs.mjs +287 -0
  115. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
  116. package/fesm2022/ngneers-controls-tag.mjs +29 -0
  117. package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
  118. package/fesm2022/ngneers-controls-toast.mjs +184 -0
  119. package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
  120. package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
  121. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
  122. package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
  123. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
  124. package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
  125. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
  126. package/fesm2022/ngneers-controls-utils.mjs +217 -60
  127. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  128. package/fesm2022/ngneers-controls.mjs.map +1 -1
  129. package/package.json +167 -32
  130. package/types/ngneers-controls-accordion.d.ts +114 -0
  131. package/types/ngneers-controls-api-ng.d.ts +291 -0
  132. package/types/ngneers-controls-api.d.ts +99 -0
  133. package/types/ngneers-controls-avatar.d.ts +50 -0
  134. package/types/ngneers-controls-base.d.ts +166 -0
  135. package/types/ngneers-controls-breadcrumb.d.ts +86 -0
  136. package/types/ngneers-controls-button-group.d.ts +30 -0
  137. package/types/ngneers-controls-button.d.ts +34 -0
  138. package/types/ngneers-controls-calendar.d.ts +275 -0
  139. package/types/ngneers-controls-checkbox.d.ts +38 -0
  140. package/types/ngneers-controls-chip.d.ts +37 -0
  141. package/types/ngneers-controls-defer.d.ts +22 -0
  142. package/types/ngneers-controls-dialog.d.ts +218 -0
  143. package/types/ngneers-controls-directives.d.ts +146 -0
  144. package/types/ngneers-controls-drawer.d.ts +220 -0
  145. package/types/ngneers-controls-edit-inplace.d.ts +182 -0
  146. package/types/ngneers-controls-filter.d.ts +304 -0
  147. package/types/ngneers-controls-i18n.d.ts +108 -0
  148. package/types/ngneers-controls-icon.d.ts +74 -0
  149. package/types/ngneers-controls-inplace.d.ts +95 -0
  150. package/types/ngneers-controls-input-field.d.ts +159 -0
  151. package/types/ngneers-controls-input-mask.d.ts +83 -0
  152. package/types/ngneers-controls-input.d.ts +27 -0
  153. package/types/ngneers-controls-item-view.d.ts +211 -0
  154. package/types/ngneers-controls-list-box.d.ts +216 -0
  155. package/types/ngneers-controls-menu.d.ts +178 -0
  156. package/types/ngneers-controls-message.d.ts +19 -0
  157. package/types/ngneers-controls-paginator.d.ts +162 -0
  158. package/types/ngneers-controls-popover.d.ts +101 -0
  159. package/types/ngneers-controls-progress.d.ts +44 -0
  160. package/types/ngneers-controls-scroller.d.ts +137 -0
  161. package/types/ngneers-controls-select-button.d.ts +37 -0
  162. package/types/ngneers-controls-select.d.ts +314 -0
  163. package/types/ngneers-controls-slider.d.ts +53 -0
  164. package/types/ngneers-controls-spinner.d.ts +105 -0
  165. package/types/ngneers-controls-splitter.d.ts +391 -0
  166. package/types/ngneers-controls-switch.d.ts +18 -0
  167. package/types/ngneers-controls-table.d.ts +157 -0
  168. package/types/ngneers-controls-tabs.d.ts +106 -0
  169. package/types/ngneers-controls-tag.d.ts +19 -0
  170. package/types/ngneers-controls-toast.d.ts +70 -0
  171. package/types/ngneers-controls-toggle-button.d.ts +46 -0
  172. package/types/ngneers-controls-tooltip.d.ts +188 -0
  173. package/types/ngneers-controls-utils-ng.d.ts +57 -0
  174. package/types/ngneers-controls-utils.d.ts +130 -0
  175. package/api/index.d.ts +0 -134
  176. package/custom-types/index.d.ts +0 -7
  177. package/dialog/index.d.ts +0 -43
  178. package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
  179. package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
  180. package/fesm2022/ngneers-controls-form-field.mjs +0 -33
  181. package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
  182. package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
  183. package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
  184. package/fesm2022/ngneers-controls-text-field.mjs +0 -23
  185. package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
  186. package/form-field/index.d.ts +0 -19
  187. package/icon/index.d.ts +0 -30
  188. package/lazy-cacher/index.d.ts +0 -14
  189. package/list-box/index.d.ts +0 -58
  190. package/popover/index.d.ts +0 -41
  191. package/scroller/index.d.ts +0 -95
  192. package/select/index.d.ts +0 -86
  193. package/text-field/index.d.ts +0 -10
  194. package/utils/index.d.ts +0 -36
  195. /package/{index.d.ts → types/ngneers-controls.d.ts} +0 -0
@@ -0,0 +1,232 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { viewChild, contentChild, input, computed, Directive, inject, output, model, booleanAttribute, signal, afterRenderEffect, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
4
+ import { templateTypesFn, Platform, toPopoverCloseBy, NgnTemplate } from '@ngneers/controls/api/ng';
5
+ import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
6
+ import { NgnButton } from '@ngneers/controls/button';
7
+ import { NgnDefer } from '@ngneers/controls/defer';
8
+ import { I18n } from '@ngneers/controls/i18n';
9
+ import { NgnIcon } from '@ngneers/controls/icon';
10
+ import { drawerControlTemplate } from '@ngneers/controls-themes/templates/drawer';
11
+
12
+ class DrawerTemplates extends NgnBase {
13
+ // Header template
14
+ _defaultHeaderTemplate = viewChild.required('defaultHeaderTemplate');
15
+ _userHeaderTemplate = contentChild('header', ...(ngDevMode ? [{ debugName: "_userHeaderTemplate" }] : []));
16
+ /**
17
+ * Set a custom template for the header.
18
+ * Can also be set using an `<ng-template>` element with `#header` template reference variable.
19
+ */
20
+ templateHeader = input(null, ...(ngDevMode ? [{ debugName: "templateHeader" }] : []));
21
+ headerTemplate = computed(() => this._userHeaderTemplate() ?? this.templateHeader() ?? this._defaultHeaderTemplate(), ...(ngDevMode ? [{ debugName: "headerTemplate" }] : []));
22
+ // Footer template
23
+ _userFooterTemplate = contentChild('footer', ...(ngDevMode ? [{ debugName: "_userFooterTemplate" }] : []));
24
+ /**
25
+ * Set a custom template for the footer.
26
+ * Can also be set using an `<ng-template>` element with `#footer` template reference variable.
27
+ */
28
+ templateFooter = input(null, ...(ngDevMode ? [{ debugName: "templateFooter" }] : []));
29
+ footerTemplate = computed(() => this._userFooterTemplate() ?? this.templateFooter(), ...(ngDevMode ? [{ debugName: "footerTemplate" }] : []));
30
+ // Content template
31
+ _userContentTemplate = contentChild('content', ...(ngDevMode ? [{ debugName: "_userContentTemplate" }] : []));
32
+ /**
33
+ * Set a custom template for the content.
34
+ * Can also be set using an `<ng-template>` element with `#content` template reference variable.
35
+ */
36
+ content = input(null, ...(ngDevMode ? [{ debugName: "content" }] : []));
37
+ contentTemplate = computed(() => this._userContentTemplate() ?? this.content(), ...(ngDevMode ? [{ debugName: "contentTemplate" }] : []));
38
+ /**
39
+ * Types for the drawer templates.
40
+ */
41
+ templateTypes = templateTypesFn();
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DrawerTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
43
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: DrawerTemplates, isStandalone: true, inputs: { templateHeader: { classPropertyName: "templateHeader", publicName: "templateHeader", isSignal: true, isRequired: false, transformFunction: null }, templateFooter: { classPropertyName: "templateFooter", publicName: "templateFooter", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userHeaderTemplate", first: true, predicate: ["header"], descendants: true, isSignal: true }, { propertyName: "_userFooterTemplate", first: true, predicate: ["footer"], descendants: true, isSignal: true }, { propertyName: "_userContentTemplate", first: true, predicate: ["content"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultHeaderTemplate", first: true, predicate: ["defaultHeaderTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: DrawerTemplates, decorators: [{
46
+ type: Directive
47
+ }], propDecorators: { _defaultHeaderTemplate: [{ type: i0.ViewChild, args: ['defaultHeaderTemplate', { isSignal: true }] }], _userHeaderTemplate: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }], templateHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateHeader", required: false }] }], _userFooterTemplate: [{ type: i0.ContentChild, args: ['footer', { isSignal: true }] }], templateFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateFooter", required: false }] }], _userContentTemplate: [{ type: i0.ContentChild, args: ['content', { isSignal: true }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }] } });
48
+
49
+ /**
50
+ * @category control
51
+ */
52
+ class NgnDrawer extends DrawerTemplates {
53
+ theme = this.injectThemeTemplate(drawerControlTemplate, {
54
+ root: true,
55
+ horizontal: () => this.horizontal(),
56
+ });
57
+ i18n = inject(I18n).translations;
58
+ /**
59
+ * Emits when the drawer has fully closed.
60
+ */
61
+ closed = output();
62
+ /**
63
+ * Shows or hides the drawer.
64
+ *
65
+ * You probably want to react to openChange events from outside to update your variable accordingly.
66
+ */
67
+ open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
68
+ /**
69
+ * How the drawer closes depending on user interaction.
70
+ * @default 'any'
71
+ */
72
+ closeBy = input('any', ...(ngDevMode ? [{ debugName: "closeBy" }] : []));
73
+ /**
74
+ * Whether the drawer is a modal or not.
75
+ * A modal drawer prevents interaction with the rest of the page while open.
76
+ * @default false
77
+ */
78
+ modal = input(false, { ...(ngDevMode ? { debugName: "modal" } : {}), transform: booleanAttribute });
79
+ /**
80
+ * Position of the drawer
81
+ * @default 'left'
82
+ */
83
+ position = input('left', ...(ngDevMode ? [{ debugName: "position" }] : []));
84
+ /**
85
+ * The width or height of the drawer depending on its position
86
+ * @default '300px'
87
+ */
88
+ size = input('300px', ...(ngDevMode ? [{ debugName: "size" }] : []));
89
+ /**
90
+ * Header text of the drawer
91
+ */
92
+ header = input(...(ngDevMode ? [undefined, { debugName: "header" }] : []));
93
+ /**
94
+ * The icon to use for the close button in the default header template
95
+ */
96
+ iconClose = input(...(ngDevMode ? [undefined, { debugName: "iconClose" }] : []));
97
+ /**
98
+ * Lazy load the drawer content
99
+ * @default false
100
+ */
101
+ lazy = input(false, { ...(ngDevMode ? { debugName: "lazy" } : {}), transform: booleanAttribute });
102
+ /**
103
+ * Whether to cache the lazy loaded content
104
+ * @default false
105
+ */
106
+ cache = input(false, { ...(ngDevMode ? { debugName: "cache" } : {}), transform: booleanAttribute });
107
+ appliedPosition = computed(() => {
108
+ const position = this.position();
109
+ if (this.platform.windowSize().height < 600 || this.platform.windowSize().width < 600) {
110
+ return 'fullscreen';
111
+ }
112
+ return position;
113
+ }, ...(ngDevMode ? [{ debugName: "appliedPosition" }] : []));
114
+ platform = inject(Platform);
115
+ _togglingTriggeredByInput = false;
116
+ isFullyClosed = signal(true, ...(ngDevMode ? [{ debugName: "isFullyClosed" }] : []));
117
+ closeByPopover = computed(() => toPopoverCloseBy(this.closeBy()), ...(ngDevMode ? [{ debugName: "closeByPopover" }] : []));
118
+ horizontal = computed(() => this.position() === 'top' || this.position() === 'bottom', ...(ngDevMode ? [{ debugName: "horizontal" }] : []));
119
+ doClose = this.hide.bind(this);
120
+ constructor() {
121
+ super();
122
+ afterRenderEffect(() => {
123
+ if (this.open()) {
124
+ this._togglingTriggeredByInput = true;
125
+ this.show();
126
+ }
127
+ else {
128
+ this._togglingTriggeredByInput = true;
129
+ this.hide();
130
+ }
131
+ });
132
+ effect(() => {
133
+ const position = this.appliedPosition();
134
+ if (position === 'fullscreen') {
135
+ this.element.nativeElement.style.top = '0';
136
+ this.element.nativeElement.style.bottom = '0';
137
+ this.element.nativeElement.style.left = '0';
138
+ this.element.nativeElement.style.right = '0';
139
+ this.element.nativeElement.style.width = '100%';
140
+ this.element.nativeElement.style.height = '100%';
141
+ return;
142
+ }
143
+ this.element.nativeElement.style.top = position !== 'bottom' ? '0' : 'unset';
144
+ this.element.nativeElement.style.bottom = position !== 'top' ? '0' : 'unset';
145
+ this.element.nativeElement.style.left = position !== 'right' ? '0' : 'unset';
146
+ this.element.nativeElement.style.right = position !== 'left' ? '0' : 'unset';
147
+ if (position === 'left' || position === 'right') {
148
+ this.element.nativeElement.style.width = this.size();
149
+ this.element.nativeElement.style.height = '100%';
150
+ }
151
+ else {
152
+ this.element.nativeElement.style.height = this.size();
153
+ this.element.nativeElement.style.width = '100%';
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * Opens the drawer. Alternatively, you can also set the `open` input to `true`.
159
+ */
160
+ show() {
161
+ untracked(() => {
162
+ if (this.open() && !this._togglingTriggeredByInput) {
163
+ return;
164
+ }
165
+ this._togglingTriggeredByInput = false;
166
+ this.element.nativeElement.togglePopover(true);
167
+ });
168
+ }
169
+ /**
170
+ * Closes the drawer. Alternatively, you can also set the `open` input to `false`.
171
+ */
172
+ hide() {
173
+ untracked(() => {
174
+ if (!this.open() && !this._togglingTriggeredByInput) {
175
+ return;
176
+ }
177
+ this._togglingTriggeredByInput = false;
178
+ this.element.nativeElement.togglePopover(false);
179
+ });
180
+ }
181
+ /**
182
+ * Toggles the drawer open or closed. Alternatively, you can also set the `open` input accordingly.
183
+ */
184
+ toggle() {
185
+ if (untracked(this.open)) {
186
+ this.hide();
187
+ }
188
+ else {
189
+ this.show();
190
+ }
191
+ }
192
+ onToggle(event) {
193
+ const evt = event;
194
+ if (evt.newState === 'closed') {
195
+ this.open.set(false);
196
+ requestAnimationFrame(() => {
197
+ const allAnimationsDone = Promise.all(this.element.nativeElement.getAnimations().map(x => x.finished));
198
+ allAnimationsDone
199
+ .then(() => {
200
+ this.isFullyClosed.set(true);
201
+ this.closed.emit();
202
+ })
203
+ .catch(() => {
204
+ // ignore cancelled animation
205
+ });
206
+ });
207
+ }
208
+ else {
209
+ this.open.set(true);
210
+ this.isFullyClosed.set(false);
211
+ }
212
+ }
213
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDrawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
214
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnDrawer, isStandalone: true, selector: "ngn-drawer", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, closeBy: { classPropertyName: "closeBy", publicName: "closeBy", isSignal: true, isRequired: false, transformFunction: null }, modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, iconClose: { classPropertyName: "iconClose", publicName: "iconClose", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", open: "openChange" }, host: { attributes: { "role": "complementary" }, listeners: { "toggle": "onToggle($event)" }, properties: { "attr.popover": "closeByPopover()", "ariaModal": "modal() ? \"true\" : undefined", "attr.data-position": "position()" } }, providers: [provideSelf(NgnDrawer)], usesInheritance: true, ngImport: i0, template: "<header [ptInt]=\"this\" [ptClass]=\"'header'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate();\r\n context: { $implicit: { close: doClose, text: this.header() } }\r\n \"\r\n />\r\n</header>\r\n<ngn-defer\r\n [lazyContent]=\"contentTemplate()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'content'\"\r\n>\r\n <ng-content />\r\n</ngn-defer>\r\n@if (footerTemplate(); as footerTemplate) {\r\n <footer [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\r\n </footer>\r\n}\r\n\r\n<ng-template #defaultHeaderTemplate [ngnTemplate]=\"templateTypes.header\" let-header>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-header'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-header-text'\">{{ header.text }}</span>\r\n <button\r\n ngnButton\r\n [kind]=\"'icon'\"\r\n [attr.aria-label]=\"i18n['drawer_close']()\"\r\n (click)=\"header.close()\"\r\n >\r\n <ngn-icon defaultIcon=\"xmark\" [icon]=\"iconClose()\" />\r\n </button>\r\n </div>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
215
+ }
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnDrawer, decorators: [{
217
+ type: Component,
218
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-drawer', imports: [NgnPt, NgTemplateOutlet, NgnDefer, NgnButton, NgnIcon, NgnTemplate], providers: [provideSelf(NgnDrawer)], host: {
219
+ '[attr.popover]': 'closeByPopover()',
220
+ '(toggle)': 'onToggle($event)',
221
+ '[ariaModal]': 'modal() ? "true" : undefined',
222
+ role: 'complementary',
223
+ '[attr.data-position]': 'position()',
224
+ }, template: "<header [ptInt]=\"this\" [ptClass]=\"'header'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate();\r\n context: { $implicit: { close: doClose, text: this.header() } }\r\n \"\r\n />\r\n</header>\r\n<ngn-defer\r\n [lazyContent]=\"contentTemplate()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'content'\"\r\n>\r\n <ng-content />\r\n</ngn-defer>\r\n@if (footerTemplate(); as footerTemplate) {\r\n <footer [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\r\n </footer>\r\n}\r\n\r\n<ng-template #defaultHeaderTemplate [ngnTemplate]=\"templateTypes.header\" let-header>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-header'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-header-text'\">{{ header.text }}</span>\r\n <button\r\n ngnButton\r\n [kind]=\"'icon'\"\r\n [attr.aria-label]=\"i18n['drawer_close']()\"\r\n (click)=\"header.close()\"\r\n >\r\n <ngn-icon defaultIcon=\"xmark\" [icon]=\"iconClose()\" />\r\n </button>\r\n </div>\r\n</ng-template>\r\n" }]
225
+ }], ctorParameters: () => [], propDecorators: { closed: [{ type: i0.Output, args: ["closed"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], closeBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeBy", required: false }] }], modal: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], iconClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconClose", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }] } });
226
+
227
+ /**
228
+ * Generated bundle index. Do not edit.
229
+ */
230
+
231
+ export { NgnDrawer };
232
+ //# sourceMappingURL=ngneers-controls-drawer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-drawer.mjs","sources":["../../src/drawer/drawer-templates.ts","../../src/drawer/drawer.ts","../../src/drawer/drawer.html","../../src/drawer/ngneers-controls-drawer.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { HeaderTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class DrawerTemplates extends NgnBase<'drawer'> {\r\n // Header template\r\n private readonly _defaultHeaderTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.header>>('defaultHeaderTemplate');\r\n private readonly _userHeaderTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.header>>('header');\r\n /**\r\n * Set a custom template for the header.\r\n * Can also be set using an `<ng-template>` element with `#header` template reference variable.\r\n */\r\n public readonly templateHeader = input<TemplateRef<typeof this.templateTypes.header> | null>(\r\n null\r\n );\r\n protected readonly headerTemplate = computed(\r\n () => this._userHeaderTemplate() ?? this.templateHeader() ?? this._defaultHeaderTemplate()\r\n );\r\n\r\n // Footer template\r\n private readonly _userFooterTemplate = contentChild<TemplateRef<unknown>>('footer');\r\n /**\r\n * Set a custom template for the footer.\r\n * Can also be set using an `<ng-template>` element with `#footer` template reference variable.\r\n */\r\n public readonly templateFooter = input<TemplateRef<unknown> | null>(null);\r\n protected readonly footerTemplate = computed(\r\n () => this._userFooterTemplate() ?? this.templateFooter()\r\n );\r\n\r\n // Content template\r\n private readonly _userContentTemplate = contentChild<TemplateRef<unknown>>('content');\r\n /**\r\n * Set a custom template for the content.\r\n * Can also be set using an `<ng-template>` element with `#content` template reference variable.\r\n */\r\n public readonly content = input<TemplateRef<unknown> | null>(null);\r\n protected readonly contentTemplate = computed(\r\n () => this._userContentTemplate() ?? this.content()\r\n );\r\n\r\n /**\r\n * Types for the drawer templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the header template.\r\n */\r\n header: HeaderTemplateType;\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n untracked,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n NgnTemplate,\r\n type Openable,\r\n Platform,\r\n type PopoverCloseBy,\r\n toPopoverCloseBy,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { drawerControlTemplate } from '@ngneers/controls-themes/templates/drawer';\r\n\r\nimport { DrawerTemplates } from './drawer-templates';\r\n\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-drawer',\r\n templateUrl: './drawer.html',\r\n imports: [NgnPt, NgTemplateOutlet, NgnDefer, NgnButton, NgnIcon, NgnTemplate],\r\n providers: [provideSelf(NgnDrawer)],\r\n host: {\r\n '[attr.popover]': 'closeByPopover()',\r\n '(toggle)': 'onToggle($event)',\r\n '[ariaModal]': 'modal() ? \"true\" : undefined',\r\n role: 'complementary',\r\n '[attr.data-position]': 'position()',\r\n },\r\n})\r\nexport class NgnDrawer extends DrawerTemplates implements Openable {\r\n protected readonly theme = this.injectThemeTemplate(drawerControlTemplate, {\r\n root: true,\r\n horizontal: () => this.horizontal(),\r\n });\r\n protected readonly i18n = inject(I18n).translations;\r\n\r\n /**\r\n * Emits when the drawer has fully closed.\r\n */\r\n public readonly closed = output();\r\n /**\r\n * Shows or hides the drawer.\r\n *\r\n * You probably want to react to openChange events from outside to update your variable accordingly.\r\n */\r\n public readonly open = model<boolean>(false);\r\n /**\r\n * How the drawer closes depending on user interaction.\r\n * @default 'any'\r\n */\r\n public readonly closeBy = input<PopoverCloseBy>('any');\r\n /**\r\n * Whether the drawer is a modal or not.\r\n * A modal drawer prevents interaction with the rest of the page while open.\r\n * @default false\r\n */\r\n public readonly modal = input(false, { transform: booleanAttribute });\r\n /**\r\n * Position of the drawer\r\n * @default 'left'\r\n */\r\n public readonly position = input<'top' | 'right' | 'bottom' | 'left' | 'fullscreen'>('left');\r\n /**\r\n * The width or height of the drawer depending on its position\r\n * @default '300px'\r\n */\r\n public readonly size = input<string>('300px');\r\n /**\r\n * Header text of the drawer\r\n */\r\n public readonly header = input<string>();\r\n /**\r\n * The icon to use for the close button in the default header template\r\n */\r\n public readonly iconClose = input<IconType>();\r\n /**\r\n * Lazy load the drawer content\r\n * @default false\r\n */\r\n public readonly lazy = input(false, { transform: booleanAttribute });\r\n /**\r\n * Whether to cache the lazy loaded content\r\n * @default false\r\n */\r\n public readonly cache = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly appliedPosition = computed(() => {\r\n const position = this.position();\r\n if (this.platform.windowSize().height < 600 || this.platform.windowSize().width < 600) {\r\n return 'fullscreen';\r\n }\r\n return position;\r\n });\r\n\r\n private readonly platform = inject(Platform);\r\n private _togglingTriggeredByInput = false;\r\n protected readonly isFullyClosed = signal(true);\r\n protected readonly closeByPopover = computed(() => toPopoverCloseBy(this.closeBy()));\r\n protected readonly horizontal = computed(\r\n () => this.position() === 'top' || this.position() === 'bottom'\r\n );\r\n protected readonly doClose = this.hide.bind(this);\r\n\r\n constructor() {\r\n super();\r\n afterRenderEffect(() => {\r\n if (this.open()) {\r\n this._togglingTriggeredByInput = true;\r\n this.show();\r\n } else {\r\n this._togglingTriggeredByInput = true;\r\n this.hide();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const position = this.appliedPosition();\r\n\r\n if (position === 'fullscreen') {\r\n this.element.nativeElement.style.top = '0';\r\n this.element.nativeElement.style.bottom = '0';\r\n this.element.nativeElement.style.left = '0';\r\n this.element.nativeElement.style.right = '0';\r\n this.element.nativeElement.style.width = '100%';\r\n this.element.nativeElement.style.height = '100%';\r\n return;\r\n }\r\n\r\n this.element.nativeElement.style.top = position !== 'bottom' ? '0' : 'unset';\r\n this.element.nativeElement.style.bottom = position !== 'top' ? '0' : 'unset';\r\n this.element.nativeElement.style.left = position !== 'right' ? '0' : 'unset';\r\n this.element.nativeElement.style.right = position !== 'left' ? '0' : 'unset';\r\n if (position === 'left' || position === 'right') {\r\n this.element.nativeElement.style.width = this.size();\r\n this.element.nativeElement.style.height = '100%';\r\n } else {\r\n this.element.nativeElement.style.height = this.size();\r\n this.element.nativeElement.style.width = '100%';\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Opens the drawer. Alternatively, you can also set the `open` input to `true`.\r\n */\r\n public show() {\r\n untracked(() => {\r\n if (this.open() && !this._togglingTriggeredByInput) {\r\n return;\r\n }\r\n this._togglingTriggeredByInput = false;\r\n this.element.nativeElement.togglePopover(true);\r\n });\r\n }\r\n\r\n /**\r\n * Closes the drawer. Alternatively, you can also set the `open` input to `false`.\r\n */\r\n public hide() {\r\n untracked(() => {\r\n if (!this.open() && !this._togglingTriggeredByInput) {\r\n return;\r\n }\r\n this._togglingTriggeredByInput = false;\r\n this.element.nativeElement.togglePopover(false);\r\n });\r\n }\r\n\r\n /**\r\n * Toggles the drawer open or closed. Alternatively, you can also set the `open` input accordingly.\r\n */\r\n public toggle() {\r\n if (untracked(this.open)) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onToggle(event: Event) {\r\n const evt = event as ToggleEvent;\r\n if (evt.newState === 'closed') {\r\n this.open.set(false);\r\n\r\n requestAnimationFrame(() => {\r\n const allAnimationsDone = Promise.all(\r\n this.element.nativeElement.getAnimations().map(x => x.finished)\r\n );\r\n allAnimationsDone\r\n .then(() => {\r\n this.isFullyClosed.set(true);\r\n this.closed.emit();\r\n })\r\n .catch(() => {\r\n // ignore cancelled animation\r\n });\r\n });\r\n } else {\r\n this.open.set(true);\r\n this.isFullyClosed.set(false);\r\n }\r\n }\r\n}\r\n","<header [ptInt]=\"this\" [ptClass]=\"'header'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate();\r\n context: { $implicit: { close: doClose, text: this.header() } }\r\n \"\r\n />\r\n</header>\r\n<ngn-defer\r\n [lazyContent]=\"contentTemplate()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'content'\"\r\n>\r\n <ng-content />\r\n</ngn-defer>\r\n@if (footerTemplate(); as footerTemplate) {\r\n <footer [ptInt]=\"this\" [ptClass]=\"'footer'\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\r\n </footer>\r\n}\r\n\r\n<ng-template #defaultHeaderTemplate [ngnTemplate]=\"templateTypes.header\" let-header>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-header'\">\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-header-text'\">{{ header.text }}</span>\r\n <button\r\n ngnButton\r\n [kind]=\"'icon'\"\r\n [attr.aria-label]=\"i18n['drawer_close']()\"\r\n (click)=\"header.close()\"\r\n >\r\n <ngn-icon defaultIcon=\"xmark\" [icon]=\"iconClose()\" />\r\n </button>\r\n </div>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;AAOM,MAAgB,eAAgB,SAAQ,OAAiB,CAAA;;AAE5C,IAAA,sBAAsB,GACrC,SAAS,CAAC,QAAQ,CAAgD,uBAAuB,CAAC;AAC3E,IAAA,mBAAmB,GAClC,YAAY,CAAgD,QAAQ,+DAAC;AACvE;;;AAGG;AACa,IAAA,cAAc,GAAG,KAAK,CACpC,IAAI,0DACL;IACkB,cAAc,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC3F;;AAGgB,IAAA,mBAAmB,GAAG,YAAY,CAAuB,QAAQ,+DAAC;AACnF;;;AAGG;AACa,IAAA,cAAc,GAAG,KAAK,CAA8B,IAAI,0DAAC;AACtD,IAAA,cAAc,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,0DAC1D;;AAGgB,IAAA,oBAAoB,GAAG,YAAY,CAAuB,SAAS,gEAAC;AACrF;;;AAGG;AACa,IAAA,OAAO,GAAG,KAAK,CAA8B,IAAI,mDAAC;AAC/C,IAAA,eAAe,GAAG,QAAQ,CAC3C,MAAM,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,2DACpD;AAED;;AAEG;IACa,aAAa,GAAG,eAAe,EAK3C;uGA/CgB,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBADpC;AAIqE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,uBAAuB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAE7B,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAaI,QAAQ,6LAWP,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACHtF;;AAEG;AAeG,MAAO,SAAU,SAAQ,eAAe,CAAA;AACzB,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;AACzE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,UAAU,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;AACpC,KAAA,CAAC;AACiB,IAAA,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;AAEnD;;AAEG;IACa,MAAM,GAAG,MAAM,EAAE;AACjC;;;;AAIG;AACa,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,gDAAC;AAC5C;;;AAGG;AACa,IAAA,OAAO,GAAG,KAAK,CAAiB,KAAK,mDAAC;AACtD;;;;AAIG;IACa,KAAK,GAAG,KAAK,CAAC,KAAK,kDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACrE;;;AAGG;AACa,IAAA,QAAQ,GAAG,KAAK,CAAqD,MAAM,oDAAC;AAC5F;;;AAGG;AACa,IAAA,IAAI,GAAG,KAAK,CAAS,OAAO,gDAAC;AAC7C;;AAEG;IACa,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACxC;;AAEG;IACa,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;AAC7C;;;AAGG;IACa,IAAI,GAAG,KAAK,CAAC,KAAK,iDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACpE;;;AAGG;IACa,KAAK,GAAG,KAAK,CAAC,KAAK,kDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAElD,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE;AACrF,YAAA,OAAO,YAAY;QACrB;AACA,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC,2DAAC;AAEe,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpC,yBAAyB,GAAG,KAAK;AACtB,IAAA,aAAa,GAAG,MAAM,CAAC,IAAI,yDAAC;AAC5B,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,0DAAC;IACjE,UAAU,GAAG,QAAQ,CACtC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,sDAChE;IACkB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAEjD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,iBAAiB,CAAC,MAAK;AACrB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,gBAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;gBACrC,IAAI,CAAC,IAAI,EAAE;YACb;iBAAO;AACL,gBAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;gBACrC,IAAI,CAAC,IAAI,EAAE;YACb;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AAEvC,YAAA,IAAI,QAAQ,KAAK,YAAY,EAAE;gBAC7B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;gBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;gBAC7C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;gBAC3C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;gBAC5C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;gBAC/C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;gBAChD;YACF;YAEA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,KAAK,QAAQ,GAAG,GAAG,GAAG,OAAO;YAC5E,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,KAAK,KAAK,GAAG,GAAG,GAAG,OAAO;YAC5E,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,KAAK,OAAO,GAAG,GAAG,GAAG,OAAO;YAC5E,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,KAAK,MAAM,GAAG,GAAG,GAAG,OAAO;YAC5E,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE;AAC/C,gBAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE;gBACpD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YAClD;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;gBACrD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;YACjD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,IAAI,GAAA;QACT,SAAS,CAAC,MAAK;YACb,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBAClD;YACF;AACA,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;YACtC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC;AAChD,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,IAAI,GAAA;QACT,SAAS,CAAC,MAAK;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;gBACnD;YACF;AACA,YAAA,IAAI,CAAC,yBAAyB,GAAG,KAAK;YACtC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC;AACjD,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,MAAM,GAAA;AACX,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,CAAC,IAAI,EAAE;QACb;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,MAAM,GAAG,GAAG,KAAoB;AAChC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAEpB,qBAAqB,CAAC,MAAK;gBACzB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CACnC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAChE;gBACD;qBACG,IAAI,CAAC,MAAK;AACT,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACpB,gBAAA,CAAC;qBACA,KAAK,CAAC,MAAK;;AAEZ,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;uGA5KW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,gCAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,SAAA,EATT,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,iDCzCrC,kpCAqCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,oJAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,SAAS,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,sFAAE,WAAW,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAUjE,SAAS,EAAA,UAAA,EAAA,CAAA;kBAdrB,SAAS;sCACS,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,YAAY,WAEb,CAAC,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,aAClE,CAAC,WAAW,CAAA,SAAA,CAAW,CAAC,EAAA,IAAA,EAC7B;AACJ,wBAAA,gBAAgB,EAAE,kBAAkB;AACpC,wBAAA,UAAU,EAAE,kBAAkB;AAC9B,wBAAA,aAAa,EAAE,8BAA8B;AAC7C,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,sBAAsB,EAAE,YAAY;AACrC,qBAAA,EAAA,QAAA,EAAA,kpCAAA,EAAA;;;AEhDH;;AAEG;;;;"}
@@ -0,0 +1,120 @@
1
+ import * as i0 from '@angular/core';
2
+ import { viewChild, contentChild, input, computed, Directive, inject, model, booleanAttribute, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { templateTypesFn, NgnTemplate } from '@ngneers/controls/api/ng';
4
+ import { ValueControlBase, NgnPt, provideSelf } from '@ngneers/controls/base';
5
+ import { NgnButton } from '@ngneers/controls/button';
6
+ import { NgnAutofocus } from '@ngneers/controls/directives';
7
+ import { I18n } from '@ngneers/controls/i18n';
8
+ import { NgnIcon } from '@ngneers/controls/icon';
9
+ import { NgnInplace } from '@ngneers/controls/inplace';
10
+ import { NgnInput } from '@ngneers/controls/input';
11
+ import { NgnInputField } from '@ngneers/controls/input-field';
12
+ import { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';
13
+
14
+ class EditInplaceTemplates extends ValueControlBase {
15
+ // Display template
16
+ _defaultDisplayTemplate = viewChild.required('defaultDisplayTemplate');
17
+ _userDisplayTemplate = contentChild('display', ...(ngDevMode ? [{ debugName: "_userDisplayTemplate" }] : []));
18
+ /**
19
+ * Set a custom template for the display.
20
+ * Can also be set using an `<ng-template>` element with `#display` template reference variable.
21
+ */
22
+ templateDisplay = input(null, ...(ngDevMode ? [{ debugName: "templateDisplay" }] : []));
23
+ displayTemplate = computed(() => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate(), ...(ngDevMode ? [{ debugName: "displayTemplate" }] : []));
24
+ // Edit template
25
+ _defaultEditTemplate = viewChild.required('defaultEditTemplate');
26
+ _userEditTemplate = contentChild('edit', ...(ngDevMode ? [{ debugName: "_userEditTemplate" }] : []));
27
+ /**
28
+ * Set a custom template for the edit view.
29
+ * Can also be set using an `<ng-template>` element with `#edit` template reference variable.
30
+ */
31
+ templateEdit = input(null, ...(ngDevMode ? [{ debugName: "templateEdit" }] : []));
32
+ editTemplate = computed(() => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate(), ...(ngDevMode ? [{ debugName: "editTemplate" }] : []));
33
+ /**
34
+ * Types for the drawer templates.
35
+ */
36
+ templateTypes = templateTypesFn();
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: EditInplaceTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
38
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: EditInplaceTemplates, isStandalone: true, inputs: { templateDisplay: { classPropertyName: "templateDisplay", publicName: "templateDisplay", isSignal: true, isRequired: false, transformFunction: null }, templateEdit: { classPropertyName: "templateEdit", publicName: "templateEdit", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userDisplayTemplate", first: true, predicate: ["display"], descendants: true, isSignal: true }, { propertyName: "_userEditTemplate", first: true, predicate: ["edit"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultDisplayTemplate", first: true, predicate: ["defaultDisplayTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultEditTemplate", first: true, predicate: ["defaultEditTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: EditInplaceTemplates, decorators: [{
41
+ type: Directive
42
+ }], propDecorators: { _defaultDisplayTemplate: [{ type: i0.ViewChild, args: ['defaultDisplayTemplate', { isSignal: true }] }], _userDisplayTemplate: [{ type: i0.ContentChild, args: ['display', { isSignal: true }] }], templateDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateDisplay", required: false }] }], _defaultEditTemplate: [{ type: i0.ViewChild, args: ['defaultEditTemplate', { isSignal: true }] }], _userEditTemplate: [{ type: i0.ContentChild, args: ['edit', { isSignal: true }] }], templateEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateEdit", required: false }] }] } });
43
+
44
+ /**
45
+ * @category control
46
+ */
47
+ class NgnEditInplace extends EditInplaceTemplates {
48
+ theme = this.injectThemeTemplate(editInplaceControlTemplate, {
49
+ root: true,
50
+ invalid: this.invalid(),
51
+ readonly: this.readonly(),
52
+ disabled: this.disabled(),
53
+ });
54
+ i18n = inject(I18n).translations;
55
+ closeContent = this.switchToDisplay.bind(this);
56
+ /**
57
+ * Controls the visibility of the content.
58
+ */
59
+ editVisible = model(false, ...(ngDevMode ? [{ debugName: "editVisible" }] : []));
60
+ /**
61
+ * Whether the content is loaded lazily.
62
+ * @default true
63
+ */
64
+ lazy = input(true, { ...(ngDevMode ? { debugName: "lazy" } : {}), transform: booleanAttribute });
65
+ /**
66
+ * Whether the content is cached when closed.
67
+ * @default false
68
+ */
69
+ cache = input(false, { ...(ngDevMode ? { debugName: "cache" } : {}), transform: booleanAttribute });
70
+ /**
71
+ * Switches to the edit view.
72
+ */
73
+ switchToEdit() {
74
+ this.editVisible.set(true);
75
+ }
76
+ /**
77
+ * Switches to the display view.
78
+ */
79
+ switchToDisplay() {
80
+ this.editVisible.set(false);
81
+ }
82
+ /**
83
+ * Toggles between the display and content views.
84
+ */
85
+ toggle() {
86
+ this.editVisible.update(v => !v);
87
+ }
88
+ focusOut(event) {
89
+ if (!this.editVisible()) {
90
+ return;
91
+ }
92
+ if (event.relatedTarget instanceof HTMLElement &&
93
+ this.element.nativeElement.contains(event.relatedTarget)) {
94
+ return;
95
+ }
96
+ this.switchToDisplay();
97
+ }
98
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnEditInplace, deps: null, target: i0.ɵɵFactoryTarget.Component });
99
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnEditInplace, isStandalone: true, selector: "ngn-edit-inplace", inputs: { editVisible: { classPropertyName: "editVisible", publicName: "editVisible", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editVisible: "editVisibleChange" }, providers: [provideSelf(NgnEditInplace)], usesInheritance: true, ngImport: i0, template: "<ngn-inplace\r\n [templateDisplay]=\"displayTemplate()\"\r\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\r\n [templateContent]=\"editTemplate()\"\r\n [templateContentContext]=\"{\r\n $implicit: {\r\n value: value(),\r\n update: value.set.bind(value),\r\n close: editVisible.set.bind(editVisible, false),\r\n },\r\n }\"\r\n [contentVisible]=\"editVisible()\"\r\n (contentVisibleChange)=\"editVisible.set($event)\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (contentVisibleChange)=\"!$event && touched.set(true)\"\r\n/>\r\n\r\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\r\n @if (!display.value) {\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\r\n i18n['editInplace_placeholder']()\r\n }}</span>\r\n } @else {\r\n <span>{{ display.value }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\r\n <ngn-input-field\r\n (focusout)=\"focusOut($event)\"\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [labelledBy]=\"labelledBy()\"\r\n >\r\n <input\r\n type=\"text\"\r\n ngnInput\r\n ngnAutofocus\r\n [value]=\"edit.value\"\r\n (valueChange)=\"edit.update($event ?? '')\"\r\n (keydown.enter)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-input'\"\r\n (blur)=\"touched.set(true)\"\r\n />\r\n <button\r\n ngnButton\r\n type=\"button\"\r\n kind=\"icon\"\r\n [inline]=\"true\"\r\n (click)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-close-button'\"\r\n >\r\n <ngn-icon defaultIcon=\"check\" />\r\n </button>\r\n </ngn-input-field>\r\n </div>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnInplace, selector: "ngn-inplace", inputs: ["contentVisible", "lazy", "cache", "disabled"], outputs: ["contentVisibleChange"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "directive", type: NgnInput, selector: "input[ngnInput], textarea[ngnInput]", inputs: ["invalid", "value"], outputs: ["valueChange"] }, { kind: "directive", type: NgnAutofocus, selector: "[ngnAutofocus]", inputs: ["ngnAutofocus"] }, { kind: "directive", type: NgnButton, selector: "button[ngnButton], a[ngnButton]", inputs: ["inline"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "component", type: NgnInputField, selector: "ngn-input-field", inputs: ["label", "labelledBy", "labelKind", "inputId", "showClearButton", "iconClearButton", "tabindex", "invalid", "readonly", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnEditInplace, decorators: [{
102
+ type: Component,
103
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-edit-inplace', imports: [
104
+ NgnPt,
105
+ NgnInplace,
106
+ NgnTemplate,
107
+ NgnInput,
108
+ NgnAutofocus,
109
+ NgnButton,
110
+ NgnIcon,
111
+ NgnInputField,
112
+ ], providers: [provideSelf(NgnEditInplace)], template: "<ngn-inplace\r\n [templateDisplay]=\"displayTemplate()\"\r\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\r\n [templateContent]=\"editTemplate()\"\r\n [templateContentContext]=\"{\r\n $implicit: {\r\n value: value(),\r\n update: value.set.bind(value),\r\n close: editVisible.set.bind(editVisible, false),\r\n },\r\n }\"\r\n [contentVisible]=\"editVisible()\"\r\n (contentVisibleChange)=\"editVisible.set($event)\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (contentVisibleChange)=\"!$event && touched.set(true)\"\r\n/>\r\n\r\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\r\n @if (!display.value) {\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\r\n i18n['editInplace_placeholder']()\r\n }}</span>\r\n } @else {\r\n <span>{{ display.value }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\r\n <ngn-input-field\r\n (focusout)=\"focusOut($event)\"\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [labelledBy]=\"labelledBy()\"\r\n >\r\n <input\r\n type=\"text\"\r\n ngnInput\r\n ngnAutofocus\r\n [value]=\"edit.value\"\r\n (valueChange)=\"edit.update($event ?? '')\"\r\n (keydown.enter)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-input'\"\r\n (blur)=\"touched.set(true)\"\r\n />\r\n <button\r\n ngnButton\r\n type=\"button\"\r\n kind=\"icon\"\r\n [inline]=\"true\"\r\n (click)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-close-button'\"\r\n >\r\n <ngn-icon defaultIcon=\"check\" />\r\n </button>\r\n </ngn-input-field>\r\n </div>\r\n</ng-template>\r\n" }]
113
+ }], propDecorators: { editVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "editVisible", required: false }] }, { type: i0.Output, args: ["editVisibleChange"] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }] } });
114
+
115
+ /**
116
+ * Generated bundle index. Do not edit.
117
+ */
118
+
119
+ export { NgnEditInplace };
120
+ //# sourceMappingURL=ngneers-controls-edit-inplace.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-edit-inplace.mjs","sources":["../../src/edit-inplace/edit-inplace-templates.ts","../../src/edit-inplace/edit-inplace.ts","../../src/edit-inplace/edit-inplace.html","../../src/edit-inplace/ngneers-controls-edit-inplace.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { DisplayTemplateType, EditTemplateType } from './types';\r\n\r\n@Directive()\r\nexport abstract class EditInplaceTemplates extends ValueControlBase<'editInplace', string> {\r\n // Display template\r\n private readonly _defaultDisplayTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.display>>('defaultDisplayTemplate');\r\n private readonly _userDisplayTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.display>>('display');\r\n /**\r\n * Set a custom template for the display.\r\n * Can also be set using an `<ng-template>` element with `#display` template reference variable.\r\n */\r\n public readonly templateDisplay = input<TemplateRef<typeof this.templateTypes.display> | null>(\r\n null\r\n );\r\n protected readonly displayTemplate = computed(\r\n () => this._userDisplayTemplate() ?? this.templateDisplay() ?? this._defaultDisplayTemplate()\r\n );\r\n\r\n // Edit template\r\n private readonly _defaultEditTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.edit>>('defaultEditTemplate');\r\n private readonly _userEditTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.edit>>('edit');\r\n /**\r\n * Set a custom template for the edit view.\r\n * Can also be set using an `<ng-template>` element with `#edit` template reference variable.\r\n */\r\n public readonly templateEdit = input<TemplateRef<typeof this.templateTypes.edit> | null>(null);\r\n protected readonly editTemplate = computed(\r\n () => this._userEditTemplate() ?? this.templateEdit() ?? this._defaultEditTemplate()\r\n );\r\n\r\n /**\r\n * Types for the drawer templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the display template.\r\n */\r\n display: DisplayTemplateType;\r\n /**\r\n * Type of the template variable for the edit template.\r\n */\r\n edit: EditTemplateType;\r\n }>();\r\n}\r\n","import {\r\n booleanAttribute,\r\n Component,\r\n input,\r\n model,\r\n ChangeDetectionStrategy,\r\n inject,\r\n} from '@angular/core';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnButton } from '@ngneers/controls/button';\r\nimport { NgnAutofocus } from '@ngneers/controls/directives';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnInplace } from '@ngneers/controls/inplace';\r\nimport { NgnInput } from '@ngneers/controls/input';\r\nimport { NgnInputField } from '@ngneers/controls/input-field';\r\nimport { editInplaceControlTemplate } from '@ngneers/controls-themes/templates/edit-inplace';\r\n\r\nimport { EditInplaceTemplates } from './edit-inplace-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-edit-inplace',\r\n templateUrl: './edit-inplace.html',\r\n imports: [\r\n NgnPt,\r\n NgnInplace,\r\n NgnTemplate,\r\n NgnInput,\r\n NgnAutofocus,\r\n NgnButton,\r\n NgnIcon,\r\n NgnInputField,\r\n ],\r\n providers: [provideSelf(NgnEditInplace)],\r\n})\r\nexport class NgnEditInplace extends EditInplaceTemplates {\r\n protected readonly theme = this.injectThemeTemplate(editInplaceControlTemplate, {\r\n root: true,\r\n invalid: this.invalid(),\r\n readonly: this.readonly(),\r\n disabled: this.disabled(),\r\n });\r\n protected readonly i18n = inject(I18n).translations;\r\n\r\n protected readonly closeContent = this.switchToDisplay.bind(this);\r\n\r\n /**\r\n * Controls the visibility of the content.\r\n */\r\n public readonly editVisible = model<boolean>(false);\r\n /**\r\n * Whether the content is loaded lazily.\r\n * @default true\r\n */\r\n public readonly lazy = input(true, { transform: booleanAttribute });\r\n /**\r\n * Whether the content is cached when closed.\r\n * @default false\r\n */\r\n public readonly cache = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Switches to the edit view.\r\n */\r\n public switchToEdit() {\r\n this.editVisible.set(true);\r\n }\r\n\r\n /**\r\n * Switches to the display view.\r\n */\r\n public switchToDisplay() {\r\n this.editVisible.set(false);\r\n }\r\n\r\n /**\r\n * Toggles between the display and content views.\r\n */\r\n public toggle() {\r\n this.editVisible.update(v => !v);\r\n }\r\n\r\n protected focusOut(event: FocusEvent) {\r\n if (!this.editVisible()) {\r\n return;\r\n }\r\n if (\r\n event.relatedTarget instanceof HTMLElement &&\r\n this.element.nativeElement.contains(event.relatedTarget as HTMLElement)\r\n ) {\r\n return;\r\n }\r\n this.switchToDisplay();\r\n }\r\n}\r\n","<ngn-inplace\r\n [templateDisplay]=\"displayTemplate()\"\r\n [templateDisplayContext]=\"{ $implicit: { value: value() } }\"\r\n [templateContent]=\"editTemplate()\"\r\n [templateContentContext]=\"{\r\n $implicit: {\r\n value: value(),\r\n update: value.set.bind(value),\r\n close: editVisible.set.bind(editVisible, false),\r\n },\r\n }\"\r\n [contentVisible]=\"editVisible()\"\r\n (contentVisibleChange)=\"editVisible.set($event)\"\r\n [lazy]=\"lazy()\"\r\n [cache]=\"cache()\"\r\n [disabled]=\"disabled() || readonly()\"\r\n (contentVisibleChange)=\"!$event && touched.set(true)\"\r\n/>\r\n\r\n<ng-template #defaultDisplayTemplate [ngnTemplate]=\"templateTypes.display\" let-display>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-display'\">\r\n @if (!display.value) {\r\n <span [ptInt]=\"this\" [ptClass]=\"'default-fallback-display'\">{{\r\n i18n['editInplace_placeholder']()\r\n }}</span>\r\n } @else {\r\n <span>{{ display.value }}</span>\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditTemplate [ngnTemplate]=\"templateTypes.edit\" let-edit>\r\n <div [ptInt]=\"this\" [ptClass]=\"'default-edit'\">\r\n <ngn-input-field\r\n (focusout)=\"focusOut($event)\"\r\n [label]=\"label()\"\r\n [inputId]=\"inputId()\"\r\n [invalid]=\"invalid()\"\r\n [labelledBy]=\"labelledBy()\"\r\n >\r\n <input\r\n type=\"text\"\r\n ngnInput\r\n ngnAutofocus\r\n [value]=\"edit.value\"\r\n (valueChange)=\"edit.update($event ?? '')\"\r\n (keydown.enter)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-input'\"\r\n (blur)=\"touched.set(true)\"\r\n />\r\n <button\r\n ngnButton\r\n type=\"button\"\r\n kind=\"icon\"\r\n [inline]=\"true\"\r\n (click)=\"edit.close()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'default-edit-close-button'\"\r\n >\r\n <ngn-icon defaultIcon=\"check\" />\r\n </button>\r\n </ngn-input-field>\r\n </div>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}