@sd-angular/core 19.0.0-beta.26 → 19.0.0-beta.27

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 (46) hide show
  1. package/assets/scss/ckeditor5.scss +1 -0
  2. package/components/document-builder/src/document-builder.model.d.ts +8 -1
  3. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
  4. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +1 -0
  5. package/components/document-builder/src/plugins/index.d.ts +4 -1
  6. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +2 -2
  7. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
  8. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
  9. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
  10. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
  11. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
  12. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
  13. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
  14. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
  15. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
  16. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
  17. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
  18. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
  19. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
  20. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
  21. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
  22. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
  23. package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
  24. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
  25. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
  26. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
  27. package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
  28. package/components/document-builder/src/plugins/{table-fit/table-fit.plugin.d.ts → table-custom/index.d.ts} +6 -1
  29. package/fesm2022/sd-angular-core-components-document-builder.mjs +2097 -174
  30. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-table.mjs +3 -3
  32. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  33. package/fesm2022/sd-angular-core-directives.mjs +29 -25
  34. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  35. package/fesm2022/sd-angular-core-services-docx.mjs +173 -0
  36. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -0
  37. package/fesm2022/sd-angular-core-services.mjs +1 -0
  38. package/fesm2022/sd-angular-core-services.mjs.map +1 -1
  39. package/package.json +44 -36
  40. package/sd-angular-core-19.0.0-beta.27.tgz +0 -0
  41. package/services/docx/index.d.ts +1 -0
  42. package/services/docx/src/lib/docx.model.d.ts +9 -0
  43. package/services/docx/src/lib/docx.service.d.ts +13 -0
  44. package/services/docx/src/public-api.d.ts +2 -0
  45. package/services/index.d.ts +1 -0
  46. package/sd-angular-core-19.0.0-beta.26.tgz +0 -0
@@ -96,36 +96,45 @@ class SdHoverCopyDirective {
96
96
  renderer;
97
97
  copyText;
98
98
  sdHoverCopyDisabled = false;
99
- #copyButton;
99
+ #copyButton = null;
100
100
  #tooltip;
101
101
  #defaultTooltip = 'Sao chép';
102
102
  constructor(el, renderer) {
103
103
  this.el = el;
104
104
  this.renderer = renderer;
105
105
  }
106
+ // https://onemount.atlassian.net/browse/SM-2287
107
+ // Hiện tại khi sdHoverCopyDisabled = true, directive chỉ dùng opacity: 0 và pointerEvents: 'none' để ẩn nút, nhưng điều này không hoàn toàn ngăn chặn được việc click trong một số trường hợp.
108
+ // Giải pháp: Remove khỏi DOM nếu column không được enable
106
109
  ngOnInit() {
107
- this.#initCopyButton();
110
+ if (!this.sdHoverCopyDisabled) {
111
+ this.#createAndAppendCopyButton();
112
+ }
108
113
  }
109
114
  ngOnChanges(changes) {
110
- if (changes['sdHoverCopyDisabled'] && !changes['sdHoverCopyDisabled'].firstChange) {
115
+ if (changes['sdHoverCopyDisabled']) {
111
116
  if (!this.sdHoverCopyDisabled) {
112
- this.#showCopyButton();
117
+ // Enable - create and show button if not exists
118
+ if (!this.#copyButton) {
119
+ this.#createAndAppendCopyButton();
120
+ }
113
121
  }
114
122
  else {
115
- this.#hideCopyButton();
123
+ // Disable - remove button from DOM
124
+ this.#removeCopyButton();
116
125
  }
117
126
  }
118
127
  }
119
- #initCopyButton() {
128
+ #createAndAppendCopyButton() {
120
129
  const parent = this.el.nativeElement;
121
130
  this.renderer.setStyle(parent, 'position', 'relative');
122
131
  // Create button
123
132
  this.#copyButton = this.renderer.createElement('button');
124
133
  this.renderer.setStyle(this.#copyButton, 'position', 'absolute');
125
- this.renderer.setStyle(this.#copyButton, 'top', '0');
134
+ this.renderer.setStyle(this.#copyButton, 'top', '50%');
135
+ this.renderer.setStyle(this.#copyButton, 'transform', 'translateY(-50%)');
126
136
  this.renderer.setStyle(this.#copyButton, 'right', '4px');
127
- this.renderer.setStyle(this.#copyButton, 'opacity', '0');
128
- this.renderer.setStyle(this.#copyButton, 'transition', 'opacity 0.2s');
137
+ this.renderer.setStyle(this.#copyButton, 'display', 'none');
129
138
  this.renderer.setStyle(this.#copyButton, 'z-index', '10');
130
139
  this.renderer.setStyle(this.#copyButton, 'background', 'transparent');
131
140
  this.renderer.setStyle(this.#copyButton, 'border', 'none');
@@ -165,6 +174,7 @@ class SdHoverCopyDirective {
165
174
  this.renderer.setStyle(this.#tooltip, 'opacity', '0');
166
175
  this.renderer.setStyle(this.#tooltip, 'transition', 'opacity 0.2s');
167
176
  this.renderer.setStyle(this.#tooltip, 'pointerEvents', 'none');
177
+ this.renderer.setStyle(this.#tooltip, 'userSelect', 'none');
168
178
  this.renderer.appendChild(this.#copyButton, this.#tooltip);
169
179
  this.renderer.appendChild(parent, this.#copyButton);
170
180
  // Listen click
@@ -176,7 +186,12 @@ class SdHoverCopyDirective {
176
186
  setTimeout(() => this.#hideTooltip(), 1000);
177
187
  }
178
188
  });
179
- this.#hideCopyButton();
189
+ }
190
+ #removeCopyButton() {
191
+ if (this.#copyButton) {
192
+ this.renderer.removeChild(this.el.nativeElement, this.#copyButton);
193
+ this.#copyButton = null;
194
+ }
180
195
  }
181
196
  #showTooltip(message) {
182
197
  this.renderer.setProperty(this.#tooltip, 'innerText', message);
@@ -187,25 +202,14 @@ class SdHoverCopyDirective {
187
202
  this.renderer.setStyle(this.#tooltip, 'opacity', '0');
188
203
  }
189
204
  onMouseEnter() {
190
- if (!this.sdHoverCopyDisabled) {
191
- this.renderer.setStyle(this.#copyButton, 'opacity', '1');
192
- this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'auto');
205
+ if (!this.sdHoverCopyDisabled && this.#copyButton) {
206
+ this.renderer.setStyle(this.#copyButton, 'display', 'block');
193
207
  }
194
208
  }
195
209
  onMouseLeave() {
196
- this.renderer.setStyle(this.#copyButton, 'opacity', '0');
197
- this.#hideTooltip();
198
- }
199
- #hideCopyButton() {
200
- if (this.#copyButton) {
201
- this.renderer.setStyle(this.#copyButton, 'opacity', '0');
202
- this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'none');
203
- }
204
- }
205
- #showCopyButton() {
206
210
  if (this.#copyButton) {
207
- this.renderer.setStyle(this.#copyButton, 'opacity', '1');
208
- this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'auto');
211
+ this.renderer.setStyle(this.#copyButton, 'display', 'none');
212
+ this.#hideTooltip();
209
213
  }
210
214
  }
211
215
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdHoverCopyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-directives.mjs","sources":["../../../projects/sd-angular/directives/src/sd-scroll.directive.ts","../../../projects/sd-angular/directives/src/sd-desktop.directive.ts","../../../projects/sd-angular/directives/src/sd-mobile.directive.ts","../../../projects/sd-angular/directives/src/sd-hover-copy.directive.ts","../../../projects/sd-angular/directives/src/sd-href.directive.ts","../../../projects/sd-angular/directives/sd-angular-core-directives.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[sdScroll]',\r\n standalone: true,\r\n})\r\nexport class SdScrollDirective implements OnInit {\r\n #overflowX: 'hidden' | 'auto' | 'overlay' = 'hidden';\r\n #overflowY: 'hidden' | 'auto' | 'overlay' = 'auto';\r\n @HostListener('mouseover')\r\n onMouseOver() {\r\n this.#overflowX = 'auto';\r\n // this.#overflowY = 'auto';\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n // this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\r\n }\r\n\r\n @HostListener('mouseout')\r\n onMouseOut() {\r\n this.#overflowX = 'hidden';\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n }\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.renderer.setStyle(this.elementRef.nativeElement, '-webkit-transform', 'translate3d(0, 0, 0)');\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\r\n }\r\n\r\n scrollTop = () => {\r\n setTimeout(() => {\r\n if (this.elementRef?.nativeElement) {\r\n this.elementRef.nativeElement.scrollTop = 0;\r\n }\r\n }, 1);\r\n };\r\n}\r\n","import { Directive, ViewContainerRef, TemplateRef } from '@angular/core';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\n\n@Directive({\n selector: '[sdDesktop]',\n})\nexport class SdDesktopDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef\n ) {\n if (!SdUtilities.isMobile()) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\n\n@Directive({\n selector: '[sdMobile]',\n})\nexport class SdMobileDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef\n ) {\n if (SdUtilities.isMobile()) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, ElementRef, Input, Renderer2, HostListener, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\n@Directive({\r\n selector: '[sdHoverCopy]',\r\n})\r\nexport class SdHoverCopyDirective implements OnInit, OnChanges {\r\n @Input({ alias: 'sdHoverCopy', required: true }) copyText!: string;\r\n @Input() sdHoverCopyDisabled = false;\r\n\r\n #copyButton!: HTMLElement;\r\n #tooltip!: HTMLElement;\r\n #defaultTooltip = 'Sao chép';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.#initCopyButton();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sdHoverCopyDisabled'] && !changes['sdHoverCopyDisabled'].firstChange) {\r\n if (!this.sdHoverCopyDisabled) {\r\n this.#showCopyButton();\r\n } else {\r\n this.#hideCopyButton();\r\n }\r\n }\r\n }\r\n\r\n #initCopyButton(): void {\r\n const parent = this.el.nativeElement;\r\n this.renderer.setStyle(parent, 'position', 'relative');\r\n\r\n // Create button\r\n this.#copyButton = this.renderer.createElement('button');\r\n this.renderer.setStyle(this.#copyButton, 'position', 'absolute');\r\n this.renderer.setStyle(this.#copyButton, 'top', '0');\r\n this.renderer.setStyle(this.#copyButton, 'right', '4px');\r\n this.renderer.setStyle(this.#copyButton, 'opacity', '0');\r\n this.renderer.setStyle(this.#copyButton, 'transition', 'opacity 0.2s');\r\n this.renderer.setStyle(this.#copyButton, 'z-index', '10');\r\n this.renderer.setStyle(this.#copyButton, 'background', 'transparent');\r\n this.renderer.setStyle(this.#copyButton, 'border', 'none');\r\n this.renderer.setStyle(this.#copyButton, 'cursor', 'pointer');\r\n this.renderer.setStyle(this.#copyButton, 'padding', '1px');\r\n this.renderer.setStyle(this.#copyButton, 'border-radius', '3px');\r\n this.renderer.setStyle(this.#copyButton, 'padding', '5px');\r\n this.renderer.setStyle(this.#copyButton, 'line-height', '1');\r\n this.renderer.setStyle(this.#copyButton, 'background-color', 'var(--sd-black100)');\r\n \r\n\r\n // Add inline SVG icon\r\n const svg = this.renderer.createElement('svg', 'svg');\r\n this.renderer.addClass(svg, 'text-secondary');\r\n this.renderer.setAttribute(svg, 'width', '14');\r\n this.renderer.setAttribute(svg, 'height', '14');\r\n this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24');\r\n this.renderer.setAttribute(svg, 'fill', 'none');\r\n this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');\r\n \r\n\r\n const path = this.renderer.createElement('path', 'svg');\r\n this.renderer.setAttribute(\r\n path,\r\n 'd',\r\n 'M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM20 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H20C21.1 23 22 22.1 22 21V7C22 5.9 21.1 5 20 5ZM20 21H8V7H20V21Z'\r\n );\r\n this.renderer.setAttribute(path, 'fill', 'currentColor');\r\n this.renderer.appendChild(svg, path);\r\n this.renderer.appendChild(this.#copyButton, svg);\r\n\r\n // Tooltip\r\n this.#tooltip = this.renderer.createElement('span');\r\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\r\n this.renderer.setStyle(this.#tooltip, 'position', 'absolute');\r\n this.renderer.setStyle(this.#tooltip, 'bottom', '100%');\r\n this.renderer.setStyle(this.#tooltip, 'left', '50%');\r\n this.renderer.setStyle(this.#tooltip, 'transform', 'translateX(-50%)');\r\n this.renderer.setStyle(this.#tooltip, 'marginBottom', '4px');\r\n this.renderer.setStyle(this.#tooltip, 'background', '#333');\r\n this.renderer.setStyle(this.#tooltip, 'color', '#fff');\r\n this.renderer.setStyle(this.#tooltip, 'padding', '2px 6px');\r\n this.renderer.setStyle(this.#tooltip, 'borderRadius', '4px');\r\n this.renderer.setStyle(this.#tooltip, 'fontSize', '12px');\r\n this.renderer.setStyle(this.#tooltip, 'whiteSpace', 'nowrap');\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\r\n this.renderer.setStyle(this.#tooltip, 'transition', 'opacity 0.2s');\r\n this.renderer.setStyle(this.#tooltip, 'pointerEvents', 'none');\r\n\r\n this.renderer.appendChild(this.#copyButton, this.#tooltip);\r\n this.renderer.appendChild(parent, this.#copyButton);\r\n\r\n // Listen click\r\n this.renderer.listen(this.#copyButton, 'click', () => {\r\n console.log('click', this.copyText);\r\n if (this.copyText && !this.sdHoverCopyDisabled) {\r\n SdUtilities.copyToClipboard(String(this.copyText));\r\n this.#showTooltip('Copied');\r\n setTimeout(() => this.#hideTooltip(), 1000);\r\n }\r\n });\r\n\r\n this.#hideCopyButton();\r\n }\r\n\r\n #showTooltip(message: string) {\r\n this.renderer.setProperty(this.#tooltip, 'innerText', message);\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '1');\r\n }\r\n\r\n #hideTooltip() {\r\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n if (!this.sdHoverCopyDisabled) {\r\n this.renderer.setStyle(this.#copyButton, 'opacity', '1');\r\n this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'auto');\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n this.renderer.setStyle(this.#copyButton, 'opacity', '0');\r\n this.#hideTooltip();\r\n }\r\n\r\n #hideCopyButton(): void {\r\n if (this.#copyButton) {\r\n this.renderer.setStyle(this.#copyButton, 'opacity', '0');\r\n this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'none');\r\n }\r\n }\r\n\r\n #showCopyButton(): void {\r\n if (this.#copyButton) {\r\n this.renderer.setStyle(this.#copyButton, 'opacity', '1');\r\n this.renderer.setStyle(this.#copyButton, 'pointerEvents', 'auto');\r\n }\r\n }\r\n}\r\n","import { Directive, HostBinding, HostListener, inject, Input } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n@Directive({\r\n selector: 'a[sdHref]',\r\n standalone: true,\r\n})\r\nexport class SdHrefDirective {\r\n readonly #router = inject(Router);\r\n // Nhận vào url đã được xử lý (từ Pipe của bạn)\r\n @Input('sdHref') url!: string;\r\n // Tự động bind giá trị url vào thuộc tính href của thẻ <a>\r\n @HostBinding('attr.href') get href() {\r\n return this.url || 'javascript:;';\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event) {\r\n if (!this.url) return;\r\n if (this.url.startsWith('http')) {\r\n // Nếu là link ngoài -> Mở tab mới và ngăn chặn hành vi mặc định của thẻ a (để không chuyển trang hiện tại)\r\n window.open(this.url, '_blank');\r\n event.preventDefault();\r\n } else {\r\n // Nếu là link nội bộ -> Ngăn chặn full-page reload, dùng Angular Router để điều hướng\r\n event.preventDefault();\r\n const [path, queryString] = this.url.split('?');\r\n // Bạn có thể dùng hàm SdUtilities.parseQueryParams của bạn ở đây,\r\n // hoặc dùng cách native URLSearchParams như sau:\r\n const params = new URLSearchParams(queryString || '');\r\n const queryParams: Record<string, string> = {};\r\n params.forEach((value, key) => (queryParams[key] = value));\r\n this.#router.navigate([path], { queryParams });\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-directives.mjs","sources":["../../../projects/sd-angular/directives/src/sd-scroll.directive.ts","../../../projects/sd-angular/directives/src/sd-desktop.directive.ts","../../../projects/sd-angular/directives/src/sd-mobile.directive.ts","../../../projects/sd-angular/directives/src/sd-hover-copy.directive.ts","../../../projects/sd-angular/directives/src/sd-href.directive.ts","../../../projects/sd-angular/directives/sd-angular-core-directives.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[sdScroll]',\r\n standalone: true,\r\n})\r\nexport class SdScrollDirective implements OnInit {\r\n #overflowX: 'hidden' | 'auto' | 'overlay' = 'hidden';\r\n #overflowY: 'hidden' | 'auto' | 'overlay' = 'auto';\r\n @HostListener('mouseover')\r\n onMouseOver() {\r\n this.#overflowX = 'auto';\r\n // this.#overflowY = 'auto';\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n // this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\r\n }\r\n\r\n @HostListener('mouseout')\r\n onMouseOut() {\r\n this.#overflowX = 'hidden';\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n }\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.renderer.setStyle(this.elementRef.nativeElement, '-webkit-transform', 'translate3d(0, 0, 0)');\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\r\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\r\n }\r\n\r\n scrollTop = () => {\r\n setTimeout(() => {\r\n if (this.elementRef?.nativeElement) {\r\n this.elementRef.nativeElement.scrollTop = 0;\r\n }\r\n }, 1);\r\n };\r\n}\r\n","import { Directive, ViewContainerRef, TemplateRef } from '@angular/core';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\n\n@Directive({\n selector: '[sdDesktop]',\n})\nexport class SdDesktopDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef\n ) {\n if (!SdUtilities.isMobile()) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\n\n@Directive({\n selector: '[sdMobile]',\n})\nexport class SdMobileDirective {\n constructor(\n private templateRef: TemplateRef<any>,\n private viewContainerRef: ViewContainerRef\n ) {\n if (SdUtilities.isMobile()) {\n this.viewContainerRef.createEmbeddedView(this.templateRef);\n }\n }\n}\n","import { Directive, ElementRef, Input, Renderer2, HostListener, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities/extensions';\r\n\r\n@Directive({\r\n selector: '[sdHoverCopy]',\r\n})\r\nexport class SdHoverCopyDirective implements OnInit, OnChanges {\r\n @Input({ alias: 'sdHoverCopy', required: true }) copyText!: string;\r\n @Input() sdHoverCopyDisabled = false;\r\n\r\n #copyButton: HTMLElement | null = null;\r\n #tooltip!: HTMLElement;\r\n #defaultTooltip = 'Sao chép';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2\r\n ) {}\r\n\r\n // https://onemount.atlassian.net/browse/SM-2287\r\n // Hiện tại khi sdHoverCopyDisabled = true, directive chỉ dùng opacity: 0 và pointerEvents: 'none' để ẩn nút, nhưng điều này không hoàn toàn ngăn chặn được việc click trong một số trường hợp.\r\n // Giải pháp: Remove khỏi DOM nếu column không được enable\r\n ngOnInit(): void {\r\n if (!this.sdHoverCopyDisabled) {\r\n this.#createAndAppendCopyButton();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sdHoverCopyDisabled']) {\r\n if (!this.sdHoverCopyDisabled) {\r\n // Enable - create and show button if not exists\r\n if (!this.#copyButton) {\r\n this.#createAndAppendCopyButton();\r\n }\r\n } else {\r\n // Disable - remove button from DOM\r\n this.#removeCopyButton();\r\n }\r\n }\r\n }\r\n\r\n #createAndAppendCopyButton(): void {\r\n const parent = this.el.nativeElement;\r\n this.renderer.setStyle(parent, 'position', 'relative');\r\n\r\n // Create button\r\n this.#copyButton = this.renderer.createElement('button');\r\n this.renderer.setStyle(this.#copyButton, 'position', 'absolute');\r\n this.renderer.setStyle(this.#copyButton, 'top', '50%');\r\n this.renderer.setStyle(this.#copyButton, 'transform', 'translateY(-50%)');\r\n this.renderer.setStyle(this.#copyButton, 'right', '4px');\r\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\r\n this.renderer.setStyle(this.#copyButton, 'z-index', '10');\r\n this.renderer.setStyle(this.#copyButton, 'background', 'transparent');\r\n this.renderer.setStyle(this.#copyButton, 'border', 'none');\r\n this.renderer.setStyle(this.#copyButton, 'cursor', 'pointer');\r\n this.renderer.setStyle(this.#copyButton, 'padding', '1px');\r\n this.renderer.setStyle(this.#copyButton, 'border-radius', '3px');\r\n this.renderer.setStyle(this.#copyButton, 'padding', '5px');\r\n this.renderer.setStyle(this.#copyButton, 'line-height', '1');\r\n this.renderer.setStyle(this.#copyButton, 'background-color', 'var(--sd-black100)');\r\n\r\n // Add inline SVG icon\r\n const svg = this.renderer.createElement('svg', 'svg');\r\n this.renderer.addClass(svg, 'text-secondary');\r\n this.renderer.setAttribute(svg, 'width', '14');\r\n this.renderer.setAttribute(svg, 'height', '14');\r\n this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24');\r\n this.renderer.setAttribute(svg, 'fill', 'none');\r\n this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');\r\n\r\n const path = this.renderer.createElement('path', 'svg');\r\n this.renderer.setAttribute(\r\n path,\r\n 'd',\r\n 'M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM20 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H20C21.1 23 22 22.1 22 21V7C22 5.9 21.1 5 20 5ZM20 21H8V7H20V21Z'\r\n );\r\n this.renderer.setAttribute(path, 'fill', 'currentColor');\r\n this.renderer.appendChild(svg, path);\r\n this.renderer.appendChild(this.#copyButton, svg);\r\n\r\n // Tooltip\r\n this.#tooltip = this.renderer.createElement('span');\r\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\r\n this.renderer.setStyle(this.#tooltip, 'position', 'absolute');\r\n this.renderer.setStyle(this.#tooltip, 'bottom', '100%');\r\n this.renderer.setStyle(this.#tooltip, 'left', '50%');\r\n this.renderer.setStyle(this.#tooltip, 'transform', 'translateX(-50%)');\r\n this.renderer.setStyle(this.#tooltip, 'marginBottom', '4px');\r\n this.renderer.setStyle(this.#tooltip, 'background', '#333');\r\n this.renderer.setStyle(this.#tooltip, 'color', '#fff');\r\n this.renderer.setStyle(this.#tooltip, 'padding', '2px 6px');\r\n this.renderer.setStyle(this.#tooltip, 'borderRadius', '4px');\r\n this.renderer.setStyle(this.#tooltip, 'fontSize', '12px');\r\n this.renderer.setStyle(this.#tooltip, 'whiteSpace', 'nowrap');\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\r\n this.renderer.setStyle(this.#tooltip, 'transition', 'opacity 0.2s');\r\n this.renderer.setStyle(this.#tooltip, 'pointerEvents', 'none');\r\n this.renderer.setStyle(this.#tooltip, 'userSelect', 'none');\r\n\r\n this.renderer.appendChild(this.#copyButton, this.#tooltip);\r\n this.renderer.appendChild(parent, this.#copyButton);\r\n\r\n // Listen click\r\n this.renderer.listen(this.#copyButton, 'click', () => {\r\n console.log('click', this.copyText);\r\n if (this.copyText && !this.sdHoverCopyDisabled) {\r\n SdUtilities.copyToClipboard(String(this.copyText));\r\n this.#showTooltip('Copied');\r\n setTimeout(() => this.#hideTooltip(), 1000);\r\n }\r\n });\r\n }\r\n\r\n #removeCopyButton(): void {\r\n if (this.#copyButton) {\r\n this.renderer.removeChild(this.el.nativeElement, this.#copyButton);\r\n this.#copyButton = null;\r\n }\r\n }\r\n\r\n #showTooltip(message: string) {\r\n this.renderer.setProperty(this.#tooltip, 'innerText', message);\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '1');\r\n }\r\n\r\n #hideTooltip() {\r\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\r\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter() {\r\n if (!this.sdHoverCopyDisabled && this.#copyButton) {\r\n this.renderer.setStyle(this.#copyButton, 'display', 'block');\r\n }\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave() {\r\n if (this.#copyButton) {\r\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\r\n this.#hideTooltip();\r\n }\r\n }\r\n}\r\n","import { Directive, HostBinding, HostListener, inject, Input } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n@Directive({\r\n selector: 'a[sdHref]',\r\n standalone: true,\r\n})\r\nexport class SdHrefDirective {\r\n readonly #router = inject(Router);\r\n // Nhận vào url đã được xử lý (từ Pipe của bạn)\r\n @Input('sdHref') url!: string;\r\n // Tự động bind giá trị url vào thuộc tính href của thẻ <a>\r\n @HostBinding('attr.href') get href() {\r\n return this.url || 'javascript:;';\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event) {\r\n if (!this.url) return;\r\n if (this.url.startsWith('http')) {\r\n // Nếu là link ngoài -> Mở tab mới và ngăn chặn hành vi mặc định của thẻ a (để không chuyển trang hiện tại)\r\n window.open(this.url, '_blank');\r\n event.preventDefault();\r\n } else {\r\n // Nếu là link nội bộ -> Ngăn chặn full-page reload, dùng Angular Router để điều hướng\r\n event.preventDefault();\r\n const [path, queryString] = this.url.split('?');\r\n // Bạn có thể dùng hàm SdUtilities.parseQueryParams của bạn ở đây,\r\n // hoặc dùng cách native URLSearchParams như sau:\r\n const params = new URLSearchParams(queryString || '');\r\n const queryParams: Record<string, string> = {};\r\n params.forEach((value, key) => (queryParams[key] = value));\r\n this.#router.navigate([path], { queryParams });\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable } from '@angular/core';
3
+ import * as mammoth from 'mammoth';
4
+ import { docxToHtml } from '@omer-go/docx-parser-converter-ts';
5
+ import * as i1 from '@sd-angular/core/services/notify';
6
+
7
+ class SdDocxService {
8
+ notifyService;
9
+ #DEFAULT_MAX_SIZE_MB = 50;
10
+ #VALID_EXTENSIONS = ['.doc', '.docx'];
11
+ #ERROR_INVALID_FORMAT = 'Định dạng không hợp lệ. Vui lòng chọn Mẫu có định dạng DOC hoặc DOCX';
12
+ #ERROR_SIZE_EXCEEDED = 'Kích thước tệp mẫu vượt quá tiêu chuẩn hỗ trợ của hệ thống. Vui lòng thử lại';
13
+ #fileInput = null;
14
+ constructor(notifyService) {
15
+ this.notifyService = notifyService;
16
+ }
17
+ async open(options) {
18
+ return new Promise(resolve => {
19
+ this.#createFileInput();
20
+ if (!this.#fileInput) {
21
+ resolve(null);
22
+ return;
23
+ }
24
+ const handleChange = async (event) => {
25
+ const input = event.target;
26
+ const file = input.files?.[0];
27
+ if (!file) {
28
+ resolve(null);
29
+ return;
30
+ }
31
+ const result = await this.convertToHtml(file, options);
32
+ resolve(result);
33
+ // Cleanup
34
+ input.value = '';
35
+ input.removeEventListener('change', handleChange);
36
+ };
37
+ this.#fileInput.addEventListener('change', handleChange, { once: true });
38
+ this.#fileInput.click();
39
+ });
40
+ }
41
+ #createFileInput() {
42
+ if (this.#fileInput) {
43
+ return;
44
+ }
45
+ this.#fileInput = document.createElement('input');
46
+ this.#fileInput.type = 'file';
47
+ this.#fileInput.accept = '.doc,.docx';
48
+ this.#fileInput.style.display = 'none';
49
+ document.body.appendChild(this.#fileInput);
50
+ }
51
+ async convertToHtml(input, options) {
52
+ const opts = {
53
+ validateFormat: true,
54
+ validateSize: true,
55
+ maxSizeInMb: this.#DEFAULT_MAX_SIZE_MB,
56
+ ...options,
57
+ };
58
+ try {
59
+ let fileName;
60
+ let fileSize;
61
+ let arrayBuffer;
62
+ if (input instanceof File) {
63
+ fileName = input.name;
64
+ fileSize = input.size;
65
+ arrayBuffer = await this.#fileToArrayBuffer(input);
66
+ }
67
+ else if (input instanceof Blob) {
68
+ fileSize = input.size;
69
+ arrayBuffer = await this.#blobToArrayBuffer(input);
70
+ }
71
+ else {
72
+ arrayBuffer = input;
73
+ }
74
+ if (opts.validateFormat && fileName) {
75
+ if (!this.#isValidFormat(fileName)) {
76
+ this.notifyService.error(this.#ERROR_INVALID_FORMAT);
77
+ return null;
78
+ }
79
+ }
80
+ if (opts.validateSize && fileSize !== undefined) {
81
+ const maxSizeInBytes = opts.maxSizeInMb * 1024 * 1024;
82
+ if (fileSize > maxSizeInBytes) {
83
+ this.notifyService.error(this.#ERROR_SIZE_EXCEEDED);
84
+ return null;
85
+ }
86
+ }
87
+ const { validateFormat, validateSize, maxSizeInMb, ...conversionOptions } = opts;
88
+ // Try @omer-go first for better formatting, fallback to mammoth on BOM error
89
+ let html;
90
+ let messages = [];
91
+ try {
92
+ html = await docxToHtml(arrayBuffer, {
93
+ styleMode: 'inline',
94
+ useSemanticTags: true,
95
+ fragmentOnly: true,
96
+ ...conversionOptions,
97
+ });
98
+ }
99
+ catch (omerError) {
100
+ console.log(omerError);
101
+ // Fallback to mammoth if @omer-go fails (e.g., BOM issue)
102
+ console.warn('@omer-go/docx-parser-converter-ts failed, falling back to mammoth:', omerError?.message);
103
+ const result = await mammoth.convertToHtml({ arrayBuffer }, conversionOptions);
104
+ html = result.value;
105
+ messages = result.messages.map(m => m.toString());
106
+ }
107
+ return {
108
+ html,
109
+ messages,
110
+ };
111
+ }
112
+ catch (error) {
113
+ console.error('DocX conversion error:', error);
114
+ this.notifyService.error('Có lỗi xảy ra khi chuyển đổi file DOCX');
115
+ return null;
116
+ }
117
+ }
118
+ async convertToHtmlString(input, options) {
119
+ const result = await this.convertToHtml(input, options);
120
+ return result?.html ?? null;
121
+ }
122
+ #isValidFormat(fileName) {
123
+ const lowerCaseName = fileName.toLowerCase();
124
+ return this.#VALID_EXTENSIONS.some(ext => lowerCaseName.endsWith(ext));
125
+ }
126
+ #fileToArrayBuffer(file) {
127
+ return new Promise((resolve, reject) => {
128
+ const reader = new FileReader();
129
+ reader.onload = e => {
130
+ const result = e.target?.result;
131
+ if (result) {
132
+ resolve(result);
133
+ }
134
+ else {
135
+ reject(new Error('Failed to read file'));
136
+ }
137
+ };
138
+ reader.onerror = () => reject(reader.error);
139
+ reader.readAsArrayBuffer(file);
140
+ });
141
+ }
142
+ #blobToArrayBuffer(blob) {
143
+ return new Promise((resolve, reject) => {
144
+ const reader = new FileReader();
145
+ reader.onload = e => {
146
+ const result = e.target?.result;
147
+ if (result) {
148
+ resolve(result);
149
+ }
150
+ else {
151
+ reject(new Error('Failed to read blob'));
152
+ }
153
+ };
154
+ reader.onerror = () => reject(reader.error);
155
+ reader.readAsArrayBuffer(blob);
156
+ });
157
+ }
158
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdDocxService, deps: [{ token: i1.SdNotifyService }], target: i0.ɵɵFactoryTarget.Injectable });
159
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdDocxService, providedIn: 'root' });
160
+ }
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdDocxService, decorators: [{
162
+ type: Injectable,
163
+ args: [{
164
+ providedIn: 'root',
165
+ }]
166
+ }], ctorParameters: () => [{ type: i1.SdNotifyService }] });
167
+
168
+ /**
169
+ * Generated bundle index. Do not edit.
170
+ */
171
+
172
+ export { SdDocxService };
173
+ //# sourceMappingURL=sd-angular-core-services-docx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-angular-core-services-docx.mjs","sources":["../../../projects/sd-angular/services/docx/src/lib/docx.service.ts","../../../projects/sd-angular/services/docx/sd-angular-core-services-docx.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport * as mammoth from 'mammoth';\r\nimport { docxToHtml } from '@omer-go/docx-parser-converter-ts';\r\nimport { SdDocxConvertOptions, SdDocxConvertResult } from './docx.model';\r\nimport { SdNotifyService } from '@sd-angular/core/services/notify';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdDocxService {\r\n readonly #DEFAULT_MAX_SIZE_MB = 50;\r\n readonly #VALID_EXTENSIONS = ['.doc', '.docx'];\r\n\r\n readonly #ERROR_INVALID_FORMAT = 'Định dạng không hợp lệ. Vui lòng chọn Mẫu có định dạng DOC hoặc DOCX';\r\n readonly #ERROR_SIZE_EXCEEDED = 'Kích thước tệp mẫu vượt quá tiêu chuẩn hỗ trợ của hệ thống. Vui lòng thử lại';\r\n\r\n #fileInput: HTMLInputElement | null = null;\r\n\r\n constructor(private notifyService: SdNotifyService) {}\r\n\r\n async open(options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null> {\r\n return new Promise(resolve => {\r\n this.#createFileInput();\r\n if (!this.#fileInput) {\r\n resolve(null);\r\n return;\r\n }\r\n\r\n const handleChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files?.[0];\r\n\r\n if (!file) {\r\n resolve(null);\r\n return;\r\n }\r\n\r\n const result = await this.convertToHtml(file, options);\r\n resolve(result);\r\n\r\n // Cleanup\r\n input.value = '';\r\n input.removeEventListener('change', handleChange);\r\n };\r\n\r\n this.#fileInput.addEventListener('change', handleChange, { once: true });\r\n this.#fileInput.click();\r\n });\r\n }\r\n\r\n #createFileInput(): void {\r\n if (this.#fileInput) {\r\n return;\r\n }\r\n\r\n this.#fileInput = document.createElement('input');\r\n this.#fileInput.type = 'file';\r\n this.#fileInput.accept = '.doc,.docx';\r\n this.#fileInput.style.display = 'none';\r\n document.body.appendChild(this.#fileInput);\r\n }\r\n\r\n async convertToHtml(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null> {\r\n const opts = {\r\n validateFormat: true,\r\n validateSize: true,\r\n maxSizeInMb: this.#DEFAULT_MAX_SIZE_MB,\r\n ...options,\r\n };\r\n\r\n try {\r\n let fileName: string | undefined;\r\n let fileSize: number | undefined;\r\n let arrayBuffer: ArrayBuffer;\r\n\r\n if (input instanceof File) {\r\n fileName = input.name;\r\n fileSize = input.size;\r\n arrayBuffer = await this.#fileToArrayBuffer(input);\r\n } else if (input instanceof Blob) {\r\n fileSize = input.size;\r\n arrayBuffer = await this.#blobToArrayBuffer(input);\r\n } else {\r\n arrayBuffer = input;\r\n }\r\n\r\n if (opts.validateFormat && fileName) {\r\n if (!this.#isValidFormat(fileName)) {\r\n this.notifyService.error(this.#ERROR_INVALID_FORMAT);\r\n return null;\r\n }\r\n }\r\n\r\n if (opts.validateSize && fileSize !== undefined) {\r\n const maxSizeInBytes = opts.maxSizeInMb! * 1024 * 1024;\r\n if (fileSize > maxSizeInBytes) {\r\n this.notifyService.error(this.#ERROR_SIZE_EXCEEDED);\r\n return null;\r\n }\r\n }\r\n\r\n const { validateFormat, validateSize, maxSizeInMb, ...conversionOptions } = opts;\r\n\r\n // Try @omer-go first for better formatting, fallback to mammoth on BOM error\r\n let html: string;\r\n let messages: string[] = [];\r\n try {\r\n html = await docxToHtml(arrayBuffer, {\r\n styleMode: 'inline',\r\n useSemanticTags: true,\r\n fragmentOnly: true,\r\n ...conversionOptions,\r\n });\r\n } catch (omerError: any) {\r\n console.log(omerError);\r\n // Fallback to mammoth if @omer-go fails (e.g., BOM issue)\r\n console.warn('@omer-go/docx-parser-converter-ts failed, falling back to mammoth:', omerError?.message);\r\n const result = await mammoth.convertToHtml({ arrayBuffer }, conversionOptions as any);\r\n html = result.value;\r\n messages = result.messages.map(m => m.toString());\r\n }\r\n\r\n return {\r\n html,\r\n messages,\r\n };\r\n } catch (error) {\r\n console.error('DocX conversion error:', error);\r\n this.notifyService.error('Có lỗi xảy ra khi chuyển đổi file DOCX');\r\n return null;\r\n }\r\n }\r\n\r\n async convertToHtmlString(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<string | null> {\r\n const result = await this.convertToHtml(input, options);\r\n return result?.html ?? null;\r\n }\r\n\r\n #isValidFormat(fileName: string): boolean {\r\n const lowerCaseName = fileName.toLowerCase();\r\n return this.#VALID_EXTENSIONS.some(ext => lowerCaseName.endsWith(ext));\r\n }\r\n\r\n #fileToArrayBuffer(file: File): Promise<ArrayBuffer> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = e => {\r\n const result = e.target?.result as ArrayBuffer;\r\n if (result) {\r\n resolve(result);\r\n } else {\r\n reject(new Error('Failed to read file'));\r\n }\r\n };\r\n reader.onerror = () => reject(reader.error);\r\n reader.readAsArrayBuffer(file);\r\n });\r\n }\r\n\r\n #blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = e => {\r\n const result = e.target?.result as ArrayBuffer;\r\n if (result) {\r\n resolve(result);\r\n } else {\r\n reject(new Error('Failed to read blob'));\r\n }\r\n };\r\n reader.onerror = () => reject(reader.error);\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export * from '@sd-angular/core/services/confirm';
5
5
  export * from '@sd-angular/core/services/api';
6
6
  export * from '@sd-angular/core/services/loading';
7
7
  export * from '@sd-angular/core/services/excel';
8
+ export * from '@sd-angular/core/services/docx';
8
9
 
9
10
  /**
10
11
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-services.mjs","sources":["../../../projects/sd-angular/services/sd-angular-core-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sd-angular-core-services.mjs","sources":["../../../projects/sd-angular/services/sd-angular-core-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAAA;;AAEG"}
package/package.json CHANGED
@@ -1,20 +1,24 @@
1
1
  {
2
2
  "name": "@sd-angular/core",
3
- "version": "19.0.0-beta.26",
3
+ "version": "19.0.0-beta.27",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
6
6
  "@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
7
7
  "@angular/material": "^19.0.0 || ^20.0.0 || ^21.0.0",
8
8
  "@angular/material-moment-adapter": "^19.0.0 || ^20.0.0 || ^21.0.0",
9
- "angular-auth-oidc-client": "^19.0.0 || ^20.0.0 || ^21.0.0"
9
+ "@omer-go/docx-parser-converter-ts": "^1.0.0",
10
+ "angular-auth-oidc-client": "^19.0.0 || ^20.0.0 || ^21.0.0",
11
+ "mammoth": "^1.11.0"
10
12
  },
11
13
  "dependencies": {
12
- "tslib": "^2.8.0",
13
14
  "@ckeditor/ckeditor5-angular": "^11.0.0",
15
+ "@omer-go/docx-parser-converter-ts": "^1.0.0",
14
16
  "ckeditor5": "^47.3.0",
15
- "moment": "^2.30.1",
16
17
  "exceljs": "^4.4.0",
17
- "export-to-csv": "^1.4.0"
18
+ "export-to-csv": "^1.4.0",
19
+ "mammoth": "^1.11.0",
20
+ "moment": "^2.30.1",
21
+ "tslib": "^2.8.0"
18
22
  },
19
23
  "sideEffects": false,
20
24
  "module": "fesm2022/sd-angular-core.mjs",
@@ -39,6 +43,10 @@
39
43
  "types": "./directives/index.d.ts",
40
44
  "default": "./fesm2022/sd-angular-core-directives.mjs"
41
45
  },
46
+ "./forms": {
47
+ "types": "./forms/index.d.ts",
48
+ "default": "./fesm2022/sd-angular-core-forms.mjs"
49
+ },
42
50
  "./guards": {
43
51
  "types": "./guards/index.d.ts",
44
52
  "default": "./fesm2022/sd-angular-core-guards.mjs"
@@ -47,10 +55,6 @@
47
55
  "types": "./handlers/index.d.ts",
48
56
  "default": "./fesm2022/sd-angular-core-handlers.mjs"
49
57
  },
50
- "./forms": {
51
- "types": "./forms/index.d.ts",
52
- "default": "./fesm2022/sd-angular-core-forms.mjs"
53
- },
54
58
  "./interceptors": {
55
59
  "types": "./interceptors/index.d.ts",
56
60
  "default": "./fesm2022/sd-angular-core-interceptors.mjs"
@@ -111,10 +115,6 @@
111
115
  "types": "./components/mini-editor/index.d.ts",
112
116
  "default": "./fesm2022/sd-angular-core-components-mini-editor.mjs"
113
117
  },
114
- "./components/preview": {
115
- "types": "./components/preview/index.d.ts",
116
- "default": "./fesm2022/sd-angular-core-components-preview.mjs"
117
- },
118
118
  "./components/modal": {
119
119
  "types": "./components/modal/index.d.ts",
120
120
  "default": "./fesm2022/sd-angular-core-components-modal.mjs"
@@ -123,6 +123,10 @@
123
123
  "types": "./components/query-builder/index.d.ts",
124
124
  "default": "./fesm2022/sd-angular-core-components-query-builder.mjs"
125
125
  },
126
+ "./components/preview": {
127
+ "types": "./components/preview/index.d.ts",
128
+ "default": "./fesm2022/sd-angular-core-components-preview.mjs"
129
+ },
126
130
  "./components/quick-action": {
127
131
  "types": "./components/quick-action/index.d.ts",
128
132
  "default": "./fesm2022/sd-angular-core-components-quick-action.mjs"
@@ -159,10 +163,6 @@
159
163
  "types": "./forms/checkbox/index.d.ts",
160
164
  "default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
161
165
  },
162
- "./guards/permission": {
163
- "types": "./guards/permission/index.d.ts",
164
- "default": "./fesm2022/sd-angular-core-guards-permission.mjs"
165
- },
166
166
  "./forms/chip": {
167
167
  "types": "./forms/chip/index.d.ts",
168
168
  "default": "./fesm2022/sd-angular-core-forms-chip.mjs"
@@ -183,14 +183,14 @@
183
183
  "types": "./forms/datetime/index.d.ts",
184
184
  "default": "./fesm2022/sd-angular-core-forms-datetime.mjs"
185
185
  },
186
- "./forms/input": {
187
- "types": "./forms/input/index.d.ts",
188
- "default": "./fesm2022/sd-angular-core-forms-input.mjs"
189
- },
190
186
  "./forms/directives": {
191
187
  "types": "./forms/directives/index.d.ts",
192
188
  "default": "./fesm2022/sd-angular-core-forms-directives.mjs"
193
189
  },
190
+ "./forms/input": {
191
+ "types": "./forms/input/index.d.ts",
192
+ "default": "./fesm2022/sd-angular-core-forms-input.mjs"
193
+ },
194
194
  "./forms/input-number": {
195
195
  "types": "./forms/input-number/index.d.ts",
196
196
  "default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
@@ -219,18 +219,22 @@
219
219
  "types": "./forms/textarea/index.d.ts",
220
220
  "default": "./fesm2022/sd-angular-core-forms-textarea.mjs"
221
221
  },
222
+ "./guards/permission": {
223
+ "types": "./guards/permission/index.d.ts",
224
+ "default": "./fesm2022/sd-angular-core-guards-permission.mjs"
225
+ },
222
226
  "./modules/auth": {
223
227
  "types": "./modules/auth/index.d.ts",
224
228
  "default": "./fesm2022/sd-angular-core-modules-auth.mjs"
225
229
  },
226
- "./modules/oidc": {
227
- "types": "./modules/oidc/index.d.ts",
228
- "default": "./fesm2022/sd-angular-core-modules-oidc.mjs"
229
- },
230
230
  "./modules/layout": {
231
231
  "types": "./modules/layout/index.d.ts",
232
232
  "default": "./fesm2022/sd-angular-core-modules-layout.mjs"
233
233
  },
234
+ "./modules/oidc": {
235
+ "types": "./modules/oidc/index.d.ts",
236
+ "default": "./fesm2022/sd-angular-core-modules-oidc.mjs"
237
+ },
234
238
  "./modules/permission": {
235
239
  "types": "./modules/permission/index.d.ts",
236
240
  "default": "./fesm2022/sd-angular-core-modules-permission.mjs"
@@ -243,22 +247,26 @@
243
247
  "types": "./services/cache/index.d.ts",
244
248
  "default": "./fesm2022/sd-angular-core-services-cache.mjs"
245
249
  },
246
- "./services/excel": {
247
- "types": "./services/excel/index.d.ts",
248
- "default": "./fesm2022/sd-angular-core-services-excel.mjs"
249
- },
250
250
  "./services/confirm": {
251
251
  "types": "./services/confirm/index.d.ts",
252
252
  "default": "./fesm2022/sd-angular-core-services-confirm.mjs"
253
253
  },
254
- "./services/license": {
255
- "types": "./services/license/index.d.ts",
256
- "default": "./fesm2022/sd-angular-core-services-license.mjs"
254
+ "./services/docx": {
255
+ "types": "./services/docx/index.d.ts",
256
+ "default": "./fesm2022/sd-angular-core-services-docx.mjs"
257
+ },
258
+ "./services/excel": {
259
+ "types": "./services/excel/index.d.ts",
260
+ "default": "./fesm2022/sd-angular-core-services-excel.mjs"
257
261
  },
258
262
  "./services/firebase": {
259
263
  "types": "./services/firebase/index.d.ts",
260
264
  "default": "./fesm2022/sd-angular-core-services-firebase.mjs"
261
265
  },
266
+ "./services/license": {
267
+ "types": "./services/license/index.d.ts",
268
+ "default": "./fesm2022/sd-angular-core-services-license.mjs"
269
+ },
262
270
  "./services/loading": {
263
271
  "types": "./services/loading/index.d.ts",
264
272
  "default": "./fesm2022/sd-angular-core-services-loading.mjs"
@@ -271,14 +279,14 @@
271
279
  "types": "./services/storage/index.d.ts",
272
280
  "default": "./fesm2022/sd-angular-core-services-storage.mjs"
273
281
  },
274
- "./utilities/models": {
275
- "types": "./utilities/models/index.d.ts",
276
- "default": "./fesm2022/sd-angular-core-utilities-models.mjs"
277
- },
278
282
  "./utilities/extensions": {
279
283
  "types": "./utilities/extensions/index.d.ts",
280
284
  "default": "./fesm2022/sd-angular-core-utilities-extensions.mjs"
281
285
  },
286
+ "./utilities/models": {
287
+ "types": "./utilities/models/index.d.ts",
288
+ "default": "./fesm2022/sd-angular-core-utilities-models.mjs"
289
+ },
282
290
  "./components/workflow": {
283
291
  "types": "./components/workflow/index.d.ts",
284
292
  "default": "./fesm2022/sd-angular-core-components-workflow.mjs"
@@ -0,0 +1 @@
1
+ export * from './src/public-api';
@@ -0,0 +1,9 @@
1
+ export interface SdDocxConvertOptions {
2
+ validateFormat?: boolean;
3
+ validateSize?: boolean;
4
+ maxSizeInMb?: number;
5
+ }
6
+ export interface SdDocxConvertResult {
7
+ html: string;
8
+ messages: string[];
9
+ }
@@ -0,0 +1,13 @@
1
+ import { SdDocxConvertOptions, SdDocxConvertResult } from './docx.model';
2
+ import { SdNotifyService } from '@sd-angular/core/services/notify';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SdDocxService {
5
+ #private;
6
+ private notifyService;
7
+ constructor(notifyService: SdNotifyService);
8
+ open(options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null>;
9
+ convertToHtml(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<SdDocxConvertResult | null>;
10
+ convertToHtmlString(input: File | Blob | ArrayBuffer, options?: SdDocxConvertOptions): Promise<string | null>;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdDocxService, never>;
12
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdDocxService>;
13
+ }