@siemens/element-ng 48.2.0-rc.1 → 48.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/accordion/index.d.ts +5 -1
- package/application-header/index.d.ts +15 -2
- package/chat-messages/index.d.ts +654 -0
- package/chat-messages/package.json +3 -0
- package/dashboard/index.d.ts +1 -0
- package/fesm2022/siemens-element-ng-accordion.mjs +5 -1
- package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-application-header.mjs +62 -1
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-card.mjs +4 -4
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-chat-messages.mjs +863 -0
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-dashboard.mjs +8 -4
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +277 -118
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +3 -4
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs +13 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs +3 -1
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +116 -117
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs +253 -0
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-phone-number.mjs +5 -4
- package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover.mjs +3 -4
- package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-resize-observer.mjs +13 -0
- package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +41 -2
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
- package/file-uploader/index.d.ts +119 -15
- package/header-dropdown/index.d.ts +7 -0
- package/icon/index.d.ts +3 -1
- package/ip-input/index.d.ts +13 -1
- package/markdown-renderer/index.d.ts +36 -0
- package/markdown-renderer/package.json +3 -0
- package/package.json +11 -3
- package/resize-observer/index.d.ts +13 -0
- package/schematics/collection.json +6 -0
- package/schematics/migrations/action-modal-migration/action-modal-migration.js +121 -0
- package/schematics/migrations/action-modal-migration/action-modal.mappings.js +98 -0
- package/schematics/migrations/action-modal-migration/index.js +5 -0
- package/schematics/migrations/data/attribute-selectors.js +6 -0
- package/schematics/migrations/data/component-names.js +78 -0
- package/schematics/migrations/data/element-selectors.js +10 -0
- package/schematics/migrations/data/index.js +17 -0
- package/schematics/migrations/data/output-names.js +8 -0
- package/schematics/migrations/data/symbol-removals.js +58 -0
- package/schematics/migrations/element-migration/element-migration.js +101 -0
- package/schematics/migrations/element-migration/index.js +5 -0
- package/schematics/migrations/index.js +18 -0
- package/schematics/migrations/schema.json +16 -0
- package/schematics/migrations/wizard-migration/index.js +88 -0
- package/schematics/scss-import-to-siemens-migration/index.js +3 -3
- package/schematics/simpl-siemens-migration/index.js +2 -1
- package/schematics/ts-import-to-siemens-migration/index.js +2 -2
- package/schematics/utils/html-utils.js +72 -0
- package/schematics/utils/index.js +4 -2
- package/schematics/utils/project-utils.js +24 -35
- package/schematics/utils/template-utils.js +190 -0
- package/schematics/utils/ts-utils.js +96 -0
- package/template-i18n.json +9 -0
- package/translate/index.d.ts +9 -0
- package/tree-view/index.d.ts +40 -1
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { SecurityContext, inject, ElementRef, input, effect, Component } from '@angular/core';
|
|
4
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Copyright (c) Siemens 2016 - 2025
|
|
8
|
+
* SPDX-License-Identifier: MIT
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Returns a markdown renderer function which_
|
|
12
|
+
* - Transforms markdown text into formatted HTML.
|
|
13
|
+
* - Returns a DOM node containing the formatted content.
|
|
14
|
+
*
|
|
15
|
+
* **Warning:** The returned Node is inserted without additional sanitization.
|
|
16
|
+
* Input content is sanitized before processing.
|
|
17
|
+
*
|
|
18
|
+
* @experimental
|
|
19
|
+
* @param sanitizer - Angular DomSanitizer instance
|
|
20
|
+
* @returns A function taking the markdown text to transform and returning a DOM div element containing the formatted HTML
|
|
21
|
+
*/
|
|
22
|
+
const getMarkdownRenderer = (sanitizer) => {
|
|
23
|
+
return (text) => {
|
|
24
|
+
const div = document.createElement('div');
|
|
25
|
+
div.className = 'markdown-content text-break';
|
|
26
|
+
if (!text) {
|
|
27
|
+
return div;
|
|
28
|
+
}
|
|
29
|
+
// Generate a random placeholder for newlines to preserve them during HTML sanitization
|
|
30
|
+
const newlinePlaceholder = `--NEWLINE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
31
|
+
// Replace newlines with placeholder before sanitization
|
|
32
|
+
const valueWithPlaceholders = text.replace(/\n/g, newlinePlaceholder);
|
|
33
|
+
// Sanitize the input using Angular's HTML sanitizer
|
|
34
|
+
const sanitizedInput = sanitizer.sanitize(SecurityContext.HTML, valueWithPlaceholders) ?? '';
|
|
35
|
+
// Restore newlines from placeholder for markdown processing.
|
|
36
|
+
let html = sanitizedInput.replace(new RegExp(newlinePlaceholder, 'g'), '\n');
|
|
37
|
+
// Process tables first
|
|
38
|
+
html = html
|
|
39
|
+
// Remove table separator lines first
|
|
40
|
+
.replace(/^\|\s*[-:]+.*\|\s*$/gm, '')
|
|
41
|
+
// Process table rows
|
|
42
|
+
.replace(/^\|(.+)\|\s*$/gm, (_match, htmlContent) => {
|
|
43
|
+
// Handle escaped pipes by temporarily replacing them
|
|
44
|
+
const escapedPipePlaceholder = `--ESCAPED-PIPE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
45
|
+
const contentWithPlaceholders = htmlContent.replace(/\\\|/g, escapedPipePlaceholder);
|
|
46
|
+
const cells = contentWithPlaceholders.split('|').map((cell) => {
|
|
47
|
+
const trimmedCell = cell.trim();
|
|
48
|
+
// Restore escaped pipes
|
|
49
|
+
const cellWithPipes = trimmedCell.replace(new RegExp(escapedPipePlaceholder, 'g'), '|');
|
|
50
|
+
return cellWithPipes;
|
|
51
|
+
});
|
|
52
|
+
// Make cell ready for markdown processing by replacing code blocks with inline code and <br> with newlines
|
|
53
|
+
const cellsWithNewlines = cells.map((cell) => {
|
|
54
|
+
// Replace multiline code blocks with single line code blocks
|
|
55
|
+
const cellWithoutMultilineCode = cell.replace(/```([\s\S]*?)```/g, (_innerMatch, inlineCodeContent) => {
|
|
56
|
+
return '`' + inlineCodeContent.replace(/`/g, '') + '`';
|
|
57
|
+
});
|
|
58
|
+
// Temporarily replace single line code blocks to avoid replacing <br> inside them
|
|
59
|
+
const tableInlineCodeBrPlaceholder = `--INLINE-CODE-BR--${Math.random().toString(36).substring(2, 15)}--`;
|
|
60
|
+
const cellWithPlaceholders = cellWithoutMultilineCode.replace(/(`[^`]*`)/g, inlineCodeMatch => {
|
|
61
|
+
return inlineCodeMatch.replace(/<br>/g, tableInlineCodeBrPlaceholder);
|
|
62
|
+
});
|
|
63
|
+
// Replace <br> with newlines
|
|
64
|
+
const cellWithNewlines = cellWithPlaceholders.replace(/<br\s*\/?>/gi, '\n');
|
|
65
|
+
// Restore <br> in inline code placeholders
|
|
66
|
+
const preProcessedCell = cellWithNewlines.replace(new RegExp(tableInlineCodeBrPlaceholder, 'g'), '<br>');
|
|
67
|
+
return preProcessedCell;
|
|
68
|
+
});
|
|
69
|
+
// Recursively process cell content for markdown formatting
|
|
70
|
+
const processedCells = cellsWithNewlines.map((cell) => {
|
|
71
|
+
return transformMarkdownText(cell, false, sanitizer);
|
|
72
|
+
});
|
|
73
|
+
return `<tr>${processedCells.map((cell) => `<td>${cell}</td>`).join('')}</tr>`;
|
|
74
|
+
})
|
|
75
|
+
// Wrap table rows in table elements
|
|
76
|
+
.replace(/(<tr>.*?<\/tr>)/gs, '<table class="table table-hover">$1</table>')
|
|
77
|
+
// Remove duplicate table tags
|
|
78
|
+
.replace(/<\/table>\s*<table class="table table-hover">/g, '');
|
|
79
|
+
html = transformMarkdownText(html, true, sanitizer);
|
|
80
|
+
div.innerHTML = html;
|
|
81
|
+
return div;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
const transformMarkdownText = (html, keepAdditionalNewlines = true, sanitizer) => {
|
|
85
|
+
// Generate a random placeholder for inner code blocks to prevent markdown processing inside them
|
|
86
|
+
const innerCodeQuotePlaceholder = `--INNER-CODE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
87
|
+
const codeSectionPlaceholderMap = new Map();
|
|
88
|
+
const escapedAsteriskPlaceholder = `--ASTERISK-${Math.random().toString(36).substring(2, 15)}--`;
|
|
89
|
+
const escapedUnderscorePlaceholder = `--UNDERSCORE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
90
|
+
// Apply markdown transformations to the sanitized content
|
|
91
|
+
html = html
|
|
92
|
+
// Multiline code blocks ```code``` with placeholder
|
|
93
|
+
.replace(/```[^\n]*\n?([\s\S]*?)\n?```/g, (match, content) => {
|
|
94
|
+
// Escape HTML special characters in code blocks (not for security, but for correct display) and preserve inner backticks
|
|
95
|
+
const code = `<pre><code>${content.replace(/</g, '<').replace(/>/g, '>').replace(/`/g, innerCodeQuotePlaceholder)}</code></pre>`;
|
|
96
|
+
const codePlaceholder = `--CODE-BLOCK-${Math.random().toString(36).substring(2, 15)}--`;
|
|
97
|
+
codeSectionPlaceholderMap.set(codePlaceholder, code);
|
|
98
|
+
return codePlaceholder;
|
|
99
|
+
})
|
|
100
|
+
// Inline code `text`
|
|
101
|
+
.replace(/`(.*?)`/g, (match, content) => {
|
|
102
|
+
// Escape HTML special characters in inline code (not for security, but for correct display)
|
|
103
|
+
const code = `<code>${content.replace(/</g, '<').replace(/>/g, '>')}</code>`;
|
|
104
|
+
const codePlaceholder = `--INLINE-CODE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
105
|
+
codeSectionPlaceholderMap.set(codePlaceholder, code);
|
|
106
|
+
return codePlaceholder;
|
|
107
|
+
})
|
|
108
|
+
// Links [text](url)
|
|
109
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, text, url) => {
|
|
110
|
+
const sanitizedUrl = sanitizeUrl(url, sanitizer);
|
|
111
|
+
return `<a href="${sanitizedUrl}" target="_blank" rel="noopener noreferrer">${text}</a>`;
|
|
112
|
+
})
|
|
113
|
+
// Auto-detect URLs and convert to links
|
|
114
|
+
.replace(/(?<!["'=(])\b(https?:\/\/[^\s<]+[^\s<.,;!?"')\]])/g, match => {
|
|
115
|
+
const sanitizedUrl = sanitizeUrl(match, sanitizer);
|
|
116
|
+
return `<a href="${sanitizedUrl}" target="_blank" rel="noopener noreferrer">${match}</a>`;
|
|
117
|
+
})
|
|
118
|
+
.replace(/(?<!\\)\\\*/g, escapedAsteriskPlaceholder)
|
|
119
|
+
.replace(/(?<!\\)\\_/g, escapedUnderscorePlaceholder)
|
|
120
|
+
// Bold **text** or __text__
|
|
121
|
+
.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
|
|
122
|
+
.replace(/__(.*?)__/g, '<strong>$1</strong>')
|
|
123
|
+
// Italic *text* or _text_
|
|
124
|
+
.replace(/\*(.*?)\*/g, '<em>$1</em>')
|
|
125
|
+
.replace(/_(.*?)_/g, '<em>$1</em>')
|
|
126
|
+
.replace(new RegExp(escapedAsteriskPlaceholder, 'g'), '*')
|
|
127
|
+
.replace(new RegExp(escapedUnderscorePlaceholder, 'g'), '*')
|
|
128
|
+
// Headings #, ##, ###, etc.
|
|
129
|
+
.replace(/^###### (.*$)/gm, '<strong>$1</strong>')
|
|
130
|
+
.replace(/^##### (.*$)/gm, '<h5>$1</h5>')
|
|
131
|
+
.replace(/^#### (.*$)/gm, '<h4>$1</h4>')
|
|
132
|
+
.replace(/^### (.*$)/gm, '<h3>$1</h3>')
|
|
133
|
+
.replace(/^## (.*$)/gm, '<h2>$1</h2>')
|
|
134
|
+
.replace(/^# (.*$)/gm, '<h2><strong>$1</strong></h2>');
|
|
135
|
+
html = html
|
|
136
|
+
// Bullet points - handle each type separately (• gets converted to • by sanitizer)
|
|
137
|
+
.replace(/^• (.*$)/gm, '<li class="unordered">$1</li>')
|
|
138
|
+
.replace(/^- (.*$)/gm, '<li class="unordered">$1</li>')
|
|
139
|
+
// Ordered list items (1., 2., 3., etc.)
|
|
140
|
+
.replace(/^\d+\. (.*$)/gm, '<li class="ordered">$1</li>');
|
|
141
|
+
html = html.replace(/^\s*(?:>|>)\s*(.*)$/gm, '<blockquote>$1</blockquote>');
|
|
142
|
+
// Generate a random placeholder for newlines to differentiate them from those used for paragraphs
|
|
143
|
+
const finalNewlinePlaceholder = `--NEWLINE-${Math.random().toString(36).substring(2, 15)}--`;
|
|
144
|
+
html = html
|
|
145
|
+
// Wrap ordered lists
|
|
146
|
+
.replace(/(<li class="ordered">.*?<\/li>)/gs, '<ol>$1</ol>')
|
|
147
|
+
// Wrap unordered lists
|
|
148
|
+
.replace(/(<li class="unordered">.*?<\/li>)/gs, '<ul>$1</ul>')
|
|
149
|
+
// Remove duplicate ol/ul tags
|
|
150
|
+
.replace(/<\/ol>\s*<ol>/g, '')
|
|
151
|
+
.replace(/<\/ul>\s*<ul>/g, '')
|
|
152
|
+
// Clean up class attributes
|
|
153
|
+
.replace(/ class="ordered"/g, '')
|
|
154
|
+
.replace(/ class="unordered"/g, '');
|
|
155
|
+
html = html
|
|
156
|
+
// Convert double newlines to paragraphs (before single line breaks)
|
|
157
|
+
.split(/\n{2}/g)
|
|
158
|
+
// Wrap non-block elements in <p> tags
|
|
159
|
+
.map(segment => {
|
|
160
|
+
// If the segment starts with a block element, return as is
|
|
161
|
+
if (!segment.trim() || /^\s*<(h[1-6]|pre|blockquote|ul|ol)/.test(segment.trim())) {
|
|
162
|
+
// Replace newlines inside blocks with the placeholder
|
|
163
|
+
return segment.replace(/\n/g, finalNewlinePlaceholder);
|
|
164
|
+
}
|
|
165
|
+
// Otherwise, wrap in <p> tags
|
|
166
|
+
return `<p>${segment}</p>`;
|
|
167
|
+
})
|
|
168
|
+
// Use newline placeholder again so as not to replace newlines between blocks
|
|
169
|
+
.join(finalNewlinePlaceholder)
|
|
170
|
+
// Convert remaining newlines to line breaks (do this LAST)
|
|
171
|
+
.replace(/\n/g, '<br>')
|
|
172
|
+
// Restore newline placeholders
|
|
173
|
+
.replace(new RegExp(finalNewlinePlaceholder, 'g'), keepAdditionalNewlines ? '\n' : ' ');
|
|
174
|
+
// Restore code placeholders
|
|
175
|
+
codeSectionPlaceholderMap.forEach((code, placeholder) => {
|
|
176
|
+
html = html.replace(new RegExp(placeholder, 'g'), code);
|
|
177
|
+
});
|
|
178
|
+
// Restore inner code block placeholders
|
|
179
|
+
html = html.replace(new RegExp(innerCodeQuotePlaceholder, 'g'), '`');
|
|
180
|
+
return html;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Sanitizes a URL to prevent XSS attacks
|
|
184
|
+
* @param url - The URL to sanitize
|
|
185
|
+
* @param sanitizer - Angular DomSanitizer instance
|
|
186
|
+
* @returns The sanitized URL or '#' if invalid
|
|
187
|
+
*/
|
|
188
|
+
const sanitizeUrl = (url, sanitizer) => {
|
|
189
|
+
// Remove any whitespace
|
|
190
|
+
url = url.trim();
|
|
191
|
+
// Allow only http, https, and mailto protocols
|
|
192
|
+
const allowed = /^(https?:\/\/|mailto:|\/(?!\/)|\.{1,2}\/|#)/i;
|
|
193
|
+
// Sanitize the URL using Angular's sanitizer
|
|
194
|
+
if (!allowed.test(url)) {
|
|
195
|
+
return '#';
|
|
196
|
+
}
|
|
197
|
+
// Sanitize the URL using Angular's sanitizer
|
|
198
|
+
const sanitized = sanitizer.sanitize(SecurityContext.URL, url);
|
|
199
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
200
|
+
return sanitized || '#';
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Copyright (c) Siemens 2016 - 2025
|
|
205
|
+
* SPDX-License-Identifier: MIT
|
|
206
|
+
*/
|
|
207
|
+
/**
|
|
208
|
+
* Component to display markdown text, uses the {@link getMarkdownRenderer} function internally, relies on `markdown-content` theme class.
|
|
209
|
+
* @experimental
|
|
210
|
+
*/
|
|
211
|
+
class SiMarkdownRendererComponent {
|
|
212
|
+
sanitizer = inject(DomSanitizer);
|
|
213
|
+
hostElement = inject((ElementRef));
|
|
214
|
+
markdownRenderer = getMarkdownRenderer(this.sanitizer);
|
|
215
|
+
/**
|
|
216
|
+
* The markdown text to transform and display
|
|
217
|
+
* @defaultValue ''
|
|
218
|
+
*/
|
|
219
|
+
text = input('');
|
|
220
|
+
constructor() {
|
|
221
|
+
effect(() => {
|
|
222
|
+
const contentValue = this.text();
|
|
223
|
+
const containerEl = this.hostElement.nativeElement;
|
|
224
|
+
if (containerEl) {
|
|
225
|
+
const formattedNode = this.markdownRenderer(contentValue);
|
|
226
|
+
containerEl.innerHTML = '';
|
|
227
|
+
containerEl.appendChild(formattedNode);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiMarkdownRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
232
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.0.6", type: SiMarkdownRendererComponent, isStandalone: true, selector: "si-markdown-renderer", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: ``, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
233
|
+
}
|
|
234
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiMarkdownRendererComponent, decorators: [{
|
|
235
|
+
type: Component,
|
|
236
|
+
args: [{
|
|
237
|
+
selector: 'si-markdown-renderer',
|
|
238
|
+
imports: [CommonModule],
|
|
239
|
+
template: ``
|
|
240
|
+
}]
|
|
241
|
+
}], ctorParameters: () => [] });
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Copyright (c) Siemens 2016 - 2025
|
|
245
|
+
* SPDX-License-Identifier: MIT
|
|
246
|
+
*/
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Generated bundle index. Do not edit.
|
|
250
|
+
*/
|
|
251
|
+
|
|
252
|
+
export { SiMarkdownRendererComponent, getMarkdownRenderer };
|
|
253
|
+
//# sourceMappingURL=siemens-element-ng-markdown-renderer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-markdown-renderer.mjs","sources":["../../../../projects/element-ng/markdown-renderer/markdown-renderer.ts","../../../../projects/element-ng/markdown-renderer/si-markdown-renderer.component.ts","../../../../projects/element-ng/markdown-renderer/index.ts","../../../../projects/element-ng/markdown-renderer/siemens-element-ng-markdown-renderer.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n/**\n * Returns a markdown renderer function which_\n * - Transforms markdown text into formatted HTML.\n * - Returns a DOM node containing the formatted content.\n *\n * **Warning:** The returned Node is inserted without additional sanitization.\n * Input content is sanitized before processing.\n *\n * @experimental\n * @param sanitizer - Angular DomSanitizer instance\n * @returns A function taking the markdown text to transform and returning a DOM div element containing the formatted HTML\n */\nexport const getMarkdownRenderer = (sanitizer: DomSanitizer): ((text: string) => Node) => {\n return (text: string): Node => {\n const div = document.createElement('div');\n div.className = 'markdown-content text-break';\n\n if (!text) {\n return div;\n }\n\n // Generate a random placeholder for newlines to preserve them during HTML sanitization\n const newlinePlaceholder = `--NEWLINE-${Math.random().toString(36).substring(2, 15)}--`;\n\n // Replace newlines with placeholder before sanitization\n const valueWithPlaceholders = text.replace(/\\n/g, newlinePlaceholder);\n\n // Sanitize the input using Angular's HTML sanitizer\n const sanitizedInput = sanitizer.sanitize(SecurityContext.HTML, valueWithPlaceholders) ?? '';\n\n // Restore newlines from placeholder for markdown processing.\n let html = sanitizedInput.replace(new RegExp(newlinePlaceholder, 'g'), '\\n');\n\n // Process tables first\n html = html\n // Remove table separator lines first\n .replace(/^\\|\\s*[-:]+.*\\|\\s*$/gm, '')\n // Process table rows\n .replace(/^\\|(.+)\\|\\s*$/gm, (_match, htmlContent) => {\n // Handle escaped pipes by temporarily replacing them\n const escapedPipePlaceholder = `--ESCAPED-PIPE-${Math.random().toString(36).substring(2, 15)}--`;\n const contentWithPlaceholders = htmlContent.replace(/\\\\\\|/g, escapedPipePlaceholder);\n const cells = contentWithPlaceholders.split('|').map((cell: string) => {\n const trimmedCell = cell.trim();\n // Restore escaped pipes\n const cellWithPipes = trimmedCell.replace(new RegExp(escapedPipePlaceholder, 'g'), '|');\n\n return cellWithPipes;\n });\n // Make cell ready for markdown processing by replacing code blocks with inline code and <br> with newlines\n const cellsWithNewlines = cells.map((cell: string) => {\n // Replace multiline code blocks with single line code blocks\n const cellWithoutMultilineCode = cell.replace(\n /```([\\s\\S]*?)```/g,\n (_innerMatch, inlineCodeContent) => {\n return '`' + inlineCodeContent.replace(/`/g, '') + '`';\n }\n );\n // Temporarily replace single line code blocks to avoid replacing <br> inside them\n const tableInlineCodeBrPlaceholder = `--INLINE-CODE-BR--${Math.random().toString(36).substring(2, 15)}--`;\n const cellWithPlaceholders = cellWithoutMultilineCode.replace(\n /(`[^`]*`)/g,\n inlineCodeMatch => {\n return inlineCodeMatch.replace(/<br>/g, tableInlineCodeBrPlaceholder);\n }\n );\n // Replace <br> with newlines\n const cellWithNewlines = cellWithPlaceholders.replace(/<br\\s*\\/?>/gi, '\\n');\n // Restore <br> in inline code placeholders\n const preProcessedCell = cellWithNewlines.replace(\n new RegExp(tableInlineCodeBrPlaceholder, 'g'),\n '<br>'\n );\n return preProcessedCell;\n });\n\n // Recursively process cell content for markdown formatting\n const processedCells = cellsWithNewlines.map((cell: string) => {\n return transformMarkdownText(cell, false, sanitizer);\n });\n\n return `<tr>${processedCells.map((cell: string) => `<td>${cell}</td>`).join('')}</tr>`;\n })\n // Wrap table rows in table elements\n .replace(/(<tr>.*?<\\/tr>)/gs, '<table class=\"table table-hover\">$1</table>')\n // Remove duplicate table tags\n .replace(/<\\/table>\\s*<table class=\"table table-hover\">/g, '');\n\n html = transformMarkdownText(html, true, sanitizer);\n\n div.innerHTML = html;\n return div;\n };\n};\n\nconst transformMarkdownText = (\n html: string,\n keepAdditionalNewlines = true,\n sanitizer: DomSanitizer\n): string => {\n // Generate a random placeholder for inner code blocks to prevent markdown processing inside them\n const innerCodeQuotePlaceholder = `--INNER-CODE-${Math.random().toString(36).substring(2, 15)}--`;\n const codeSectionPlaceholderMap = new Map<string, string>();\n\n const escapedAsteriskPlaceholder = `--ASTERISK-${Math.random().toString(36).substring(2, 15)}--`;\n const escapedUnderscorePlaceholder = `--UNDERSCORE-${Math.random().toString(36).substring(2, 15)}--`;\n\n // Apply markdown transformations to the sanitized content\n html = html\n // Multiline code blocks ```code``` with placeholder\n .replace(/```[^\\n]*\\n?([\\s\\S]*?)\\n?```/g, (match, content) => {\n // Escape HTML special characters in code blocks (not for security, but for correct display) and preserve inner backticks\n const code = `<pre><code>${content.replace(/</g, '<').replace(/>/g, '>').replace(/`/g, innerCodeQuotePlaceholder)}</code></pre>`;\n const codePlaceholder = `--CODE-BLOCK-${Math.random().toString(36).substring(2, 15)}--`;\n codeSectionPlaceholderMap.set(codePlaceholder, code);\n return codePlaceholder;\n })\n\n // Inline code `text`\n .replace(/`(.*?)`/g, (match, content) => {\n // Escape HTML special characters in inline code (not for security, but for correct display)\n const code = `<code>${content.replace(/</g, '<').replace(/>/g, '>')}</code>`;\n const codePlaceholder = `--INLINE-CODE-${Math.random().toString(36).substring(2, 15)}--`;\n codeSectionPlaceholderMap.set(codePlaceholder, code);\n return codePlaceholder;\n })\n\n // Links [text](url)\n .replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, text, url) => {\n const sanitizedUrl = sanitizeUrl(url, sanitizer);\n return `<a href=\"${sanitizedUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n })\n\n // Auto-detect URLs and convert to links\n .replace(/(?<![\"'=(])\\b(https?:\\/\\/[^\\s<]+[^\\s<.,;!?\"')\\]])/g, match => {\n const sanitizedUrl = sanitizeUrl(match, sanitizer);\n return `<a href=\"${sanitizedUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">${match}</a>`;\n })\n\n .replace(/(?<!\\\\)\\\\\\*/g, escapedAsteriskPlaceholder)\n .replace(/(?<!\\\\)\\\\_/g, escapedUnderscorePlaceholder)\n\n // Bold **text** or __text__\n .replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/__(.*?)__/g, '<strong>$1</strong>')\n\n // Italic *text* or _text_\n .replace(/\\*(.*?)\\*/g, '<em>$1</em>')\n .replace(/_(.*?)_/g, '<em>$1</em>')\n\n .replace(new RegExp(escapedAsteriskPlaceholder, 'g'), '*')\n .replace(new RegExp(escapedUnderscorePlaceholder, 'g'), '*')\n\n // Headings #, ##, ###, etc.\n .replace(/^###### (.*$)/gm, '<strong>$1</strong>')\n .replace(/^##### (.*$)/gm, '<h5>$1</h5>')\n .replace(/^#### (.*$)/gm, '<h4>$1</h4>')\n .replace(/^### (.*$)/gm, '<h3>$1</h3>')\n .replace(/^## (.*$)/gm, '<h2>$1</h2>')\n .replace(/^# (.*$)/gm, '<h2><strong>$1</strong></h2>');\n\n html = html\n // Bullet points - handle each type separately (• gets converted to • by sanitizer)\n .replace(/^• (.*$)/gm, '<li class=\"unordered\">$1</li>')\n .replace(/^- (.*$)/gm, '<li class=\"unordered\">$1</li>')\n\n // Ordered list items (1., 2., 3., etc.)\n .replace(/^\\d+\\. (.*$)/gm, '<li class=\"ordered\">$1</li>');\n\n html = html.replace(/^\\s*(?:>|>)\\s*(.*)$/gm, '<blockquote>$1</blockquote>');\n\n // Generate a random placeholder for newlines to differentiate them from those used for paragraphs\n const finalNewlinePlaceholder = `--NEWLINE-${Math.random().toString(36).substring(2, 15)}--`;\n\n html = html\n // Wrap ordered lists\n .replace(/(<li class=\"ordered\">.*?<\\/li>)/gs, '<ol>$1</ol>')\n\n // Wrap unordered lists\n .replace(/(<li class=\"unordered\">.*?<\\/li>)/gs, '<ul>$1</ul>')\n\n // Remove duplicate ol/ul tags\n .replace(/<\\/ol>\\s*<ol>/g, '')\n .replace(/<\\/ul>\\s*<ul>/g, '')\n\n // Clean up class attributes\n .replace(/ class=\"ordered\"/g, '')\n .replace(/ class=\"unordered\"/g, '');\n\n html = html\n // Convert double newlines to paragraphs (before single line breaks)\n .split(/\\n{2}/g)\n // Wrap non-block elements in <p> tags\n .map(segment => {\n // If the segment starts with a block element, return as is\n if (!segment.trim() || /^\\s*<(h[1-6]|pre|blockquote|ul|ol)/.test(segment.trim())) {\n // Replace newlines inside blocks with the placeholder\n return segment.replace(/\\n/g, finalNewlinePlaceholder);\n }\n // Otherwise, wrap in <p> tags\n return `<p>${segment}</p>`;\n })\n // Use newline placeholder again so as not to replace newlines between blocks\n .join(finalNewlinePlaceholder)\n // Convert remaining newlines to line breaks (do this LAST)\n .replace(/\\n/g, '<br>')\n // Restore newline placeholders\n .replace(new RegExp(finalNewlinePlaceholder, 'g'), keepAdditionalNewlines ? '\\n' : ' ');\n\n // Restore code placeholders\n codeSectionPlaceholderMap.forEach((code, placeholder) => {\n html = html.replace(new RegExp(placeholder, 'g'), code);\n });\n\n // Restore inner code block placeholders\n html = html.replace(new RegExp(innerCodeQuotePlaceholder, 'g'), '`');\n\n return html;\n};\n\n/**\n * Sanitizes a URL to prevent XSS attacks\n * @param url - The URL to sanitize\n * @param sanitizer - Angular DomSanitizer instance\n * @returns The sanitized URL or '#' if invalid\n */\nconst sanitizeUrl = (url: string, sanitizer: DomSanitizer): string => {\n // Remove any whitespace\n url = url.trim();\n\n // Allow only http, https, and mailto protocols\n const allowed = /^(https?:\\/\\/|mailto:|\\/(?!\\/)|\\.{1,2}\\/|#)/i;\n\n // Sanitize the URL using Angular's sanitizer\n if (!allowed.test(url)) {\n return '#';\n }\n\n // Sanitize the URL using Angular's sanitizer\n const sanitized = sanitizer.sanitize(SecurityContext.URL, url);\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n return sanitized || '#';\n};\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, ElementRef } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { getMarkdownRenderer } from './markdown-renderer';\n\n/**\n * Component to display markdown text, uses the {@link getMarkdownRenderer} function internally, relies on `markdown-content` theme class.\n * @experimental\n */\n@Component({\n selector: 'si-markdown-renderer',\n imports: [CommonModule],\n template: ``\n})\nexport class SiMarkdownRendererComponent {\n private sanitizer = inject(DomSanitizer);\n private hostElement = inject(ElementRef<HTMLElement>);\n private markdownRenderer = getMarkdownRenderer(this.sanitizer);\n\n /**\n * The markdown text to transform and display\n * @defaultValue ''\n */\n readonly text = input<string>('');\n\n constructor() {\n effect(() => {\n const contentValue = this.text();\n const containerEl = this.hostElement.nativeElement;\n\n if (containerEl) {\n const formattedNode = this.markdownRenderer(contentValue);\n containerEl.innerHTML = '';\n containerEl.appendChild(formattedNode);\n }\n });\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-markdown-renderer.component';\nexport * from './markdown-renderer';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Directive, inject, ChangeDetectorRef, ElementRef, input, model, booleanAttribute, output, viewChild, signal, computed, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
|
|
3
3
|
import { CdkOverlayOrigin, CdkConnectedOverlay } from '@angular/cdk/overlay';
|
|
4
|
-
import { NgClass } from '@angular/common';
|
|
4
|
+
import { NgClass, LowerCasePipe } from '@angular/common';
|
|
5
5
|
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
6
6
|
import { SI_FORM_ITEM_CONTROL } from '@siemens/element-ng/form';
|
|
7
7
|
import { addIcons, elementDown2, SiIconComponent } from '@siemens/element-ng/icon';
|
|
@@ -367,7 +367,7 @@ class SiPhoneNumberInputComponent {
|
|
|
367
367
|
provide: SI_FORM_ITEM_CONTROL,
|
|
368
368
|
useExisting: SiPhoneNumberInputComponent
|
|
369
369
|
}
|
|
370
|
-
], viewQueries: [{ propertyName: "phoneInput", first: true, predicate: ["phoneInput"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + option.value.isoCode
|
|
370
|
+
], viewQueries: [{ propertyName: "phoneInput", first: true, predicate: ["phoneInput"], descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + (option.value.isoCode | lowercase)\"></span>\n {{ option.value.name }} +{{ option.value.countryCode }}\n </ng-template>\n </button>\n <input\n #phoneInput\n type=\"tel\"\n class=\"ms-4 border-0 p-0 focus-none shadow-none flex-grow-1 phone-number\"\n [attr.aria-label]=\"phoneNumberAriaLabel() | translate\"\n [attr.aria-describedby]=\"errormessageId()\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (input)=\"input()\"\n (blur)=\"blur()\"\n />\n</div>\n", styles: [":host:focus-within:not(.country-focus){outline:var(--element-button-focus-width) solid var(--element-focus-default);outline-offset:var(--element-button-focus-overlay-width)}.search-country{display:inline-block;margin-block-start:8px;margin-block-end:8px;margin-inline:8px;inline-size:calc(100% - 16px)}.disabled{pointer-events:none}.disabled,.disabled:hover,.disabled:focus{--border-color: var(--element-ui-3);color:var(--element-text-disabled)}.dropdown-toggle{border-radius:var(--element-input-radius);min-inline-size:auto!important;background:transparent}.dropdown-toggle .fi.fi-xx{background-image:none;background-color:var(--element-text-disabled)}.dropdown-toggle:disabled{opacity:var(--element-action-disabled-opacity)}.dropdown-toggle.readonly{cursor:default}.phone-number{background-color:transparent;inline-size:inherit}.phone-number:disabled,.phone-number[readonly]{opacity:1}.phone-number:disabled{color:var(--element-text-disabled)}.phone-number:disabled::placeholder{color:transparent}.phone-number::placeholder{color:var(--element-text-secondary)}\n"], dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "directive", type: SiPhoneNumberInputSelectDirective, selector: "[siPhoneNumberInputSelect]" }, { kind: "component", type: SiSelectListHasFilterComponent, selector: "si-select-list-has-filter", inputs: ["filterPlaceholder", "noResultsFoundLabel"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
371
371
|
}
|
|
372
372
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SiPhoneNumberInputComponent, decorators: [{
|
|
373
373
|
type: Component,
|
|
@@ -378,7 +378,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
378
378
|
SiIconComponent,
|
|
379
379
|
SiPhoneNumberInputSelectDirective,
|
|
380
380
|
SiSelectListHasFilterComponent,
|
|
381
|
-
SiTranslatePipe
|
|
381
|
+
SiTranslatePipe,
|
|
382
|
+
LowerCasePipe
|
|
382
383
|
], providers: [
|
|
383
384
|
{
|
|
384
385
|
provide: NG_VALIDATORS,
|
|
@@ -401,7 +402,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
401
402
|
'[class.disabled]': 'disabled()',
|
|
402
403
|
'[class.readonly]': 'readonly()',
|
|
403
404
|
'[class.country-focus]': 'countryFocused()'
|
|
404
|
-
}, template: "<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + option.value.isoCode
|
|
405
|
+
}, template: "<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + (option.value.isoCode | lowercase)\"></span>\n {{ option.value.name }} +{{ option.value.countryCode }}\n </ng-template>\n </button>\n <input\n #phoneInput\n type=\"tel\"\n class=\"ms-4 border-0 p-0 focus-none shadow-none flex-grow-1 phone-number\"\n [attr.aria-label]=\"phoneNumberAriaLabel() | translate\"\n [attr.aria-describedby]=\"errormessageId()\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (input)=\"input()\"\n (blur)=\"blur()\"\n />\n</div>\n", styles: [":host:focus-within:not(.country-focus){outline:var(--element-button-focus-width) solid var(--element-focus-default);outline-offset:var(--element-button-focus-overlay-width)}.search-country{display:inline-block;margin-block-start:8px;margin-block-end:8px;margin-inline:8px;inline-size:calc(100% - 16px)}.disabled{pointer-events:none}.disabled,.disabled:hover,.disabled:focus{--border-color: var(--element-ui-3);color:var(--element-text-disabled)}.dropdown-toggle{border-radius:var(--element-input-radius);min-inline-size:auto!important;background:transparent}.dropdown-toggle .fi.fi-xx{background-image:none;background-color:var(--element-text-disabled)}.dropdown-toggle:disabled{opacity:var(--element-action-disabled-opacity)}.dropdown-toggle.readonly{cursor:default}.phone-number{background-color:transparent;inline-size:inherit}.phone-number:disabled,.phone-number[readonly]{opacity:1}.phone-number:disabled{color:var(--element-text-disabled)}.phone-number:disabled::placeholder{color:transparent}.phone-number::placeholder{color:var(--element-text-secondary)}\n"] }]
|
|
405
406
|
}] });
|
|
406
407
|
|
|
407
408
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-phone-number.mjs","sources":["../../../../projects/element-ng/phone-number/si-phone-number-input-select.directive.ts","../../../../projects/element-ng/phone-number/si-phone-number-input.component.ts","../../../../projects/element-ng/phone-number/si-phone-number-input.component.html","../../../../projects/element-ng/phone-number/si-phone-number-input.module.ts","../../../../projects/element-ng/phone-number/index.ts","../../../../projects/element-ng/phone-number/siemens-element-ng-phone-number.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\nimport {\n SiSelectComplexOptionsDirective,\n SiSelectSingleValueDirective\n} from '@siemens/element-ng/select';\n\n/**\n * This directive provides the si-select options and value strategy for the phone number input.\n * As we don't use si-select directly, we need to provide these strategies manually.\n */\n@Directive({\n selector: '[siPhoneNumberInputSelect]',\n hostDirectives: [\n {\n directive: SiSelectComplexOptionsDirective,\n inputs: ['complexOptions', 'valueProvider']\n },\n { directive: SiSelectSingleValueDirective, inputs: ['value'], outputs: ['valueChange'] }\n ]\n})\nexport class SiPhoneNumberInputSelectDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { NgClass } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n OnChanges,\n output,\n signal,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\nimport { SI_FORM_ITEM_CONTROL, SiFormItemControl } from '@siemens/element-ng/form';\nimport { addIcons, elementDown2, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiSelectListHasFilterComponent } from '@siemens/element-ng/select';\nimport {\n injectSiTranslateService,\n SiTranslatePipe,\n t\n} from '@siemens/element-translate-ng/translate';\nimport { PhoneNumber, PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';\n\nimport { SiPhoneNumberInputSelectDirective } from './si-phone-number-input-select.directive';\nimport { CountryInfo, PhoneDetails } from './si-phone-number-input.models';\n\n@Component({\n selector: 'si-phone-number-input',\n imports: [\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n NgClass,\n SiIconComponent,\n SiPhoneNumberInputSelectDirective,\n SiSelectListHasFilterComponent,\n SiTranslatePipe\n ],\n templateUrl: './si-phone-number-input.component.html',\n styleUrl: './si-phone-number-input.component.scss',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: SiPhoneNumberInputComponent,\n multi: true\n },\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: SiPhoneNumberInputComponent,\n multi: true\n },\n {\n provide: SI_FORM_ITEM_CONTROL,\n useExisting: SiPhoneNumberInputComponent\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'group',\n '[attr.aria-labelledby]': 'labelledby()',\n '[attr.id]': 'id()',\n '[class.disabled]': 'disabled()',\n '[class.readonly]': 'readonly()',\n '[class.country-focus]': 'countryFocused()'\n }\n})\nexport class SiPhoneNumberInputComponent\n implements ControlValueAccessor, Validator, OnChanges, SiFormItemControl\n{\n private static idCounter = 0;\n\n private phoneUtil = PhoneNumberUtil.getInstance();\n private translate = injectSiTranslateService();\n private changeDetectorRef = inject(ChangeDetectorRef);\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Unique identifier.\n *\n * @defaultValue\n * ```\n * `__si-phone-number-input-${SiPhoneNumberInputComponent.idCounter++}`\n * ```\n */\n readonly id = input(`__si-phone-number-input-${SiPhoneNumberInputComponent.idCounter++}`);\n\n /**\n * ISO_3166-2 Code of the selected country.\n */\n readonly country = model<string>();\n\n /**\n * ISO_3166-2 Code of the country which shall be used on form-control reset.\n */\n readonly defaultCountry = input<string>();\n\n /**\n * Placeholder text for country search input.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_PLACEHOLDER:Search`)\n * ```\n */\n readonly placeholderForSearch = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_PLACEHOLDER:Search`)\n );\n /**\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_NO-RESULTS_FOUND:No results found`)\n * ```\n */\n readonly searchNoResultsFoundLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_NO-RESULTS_FOUND:No results found`)\n );\n /**\n * Text for the country dropdown aria-label attribute.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SELECT_COUNTRY:Select country`)\n * ```\n */\n readonly selectCountryAriaLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SELECT_COUNTRY:Select country`)\n );\n /**\n * Text for the phone number input aria-label attribute.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.PHONE_NUMBER_INPUT_LABEL:Enter phone number`)\n * ```\n */\n readonly phoneNumberAriaLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.PHONE_NUMBER_INPUT_LABEL:Enter phone number`)\n );\n /**\n * List of countries in ISO2 format, from which the user is allowed to select one.\n * If no values are provided, the dropdown will show all known countries.\n */\n readonly supportedCountries = input<readonly string[] | null>();\n\n /**\n * @defaultValue\n * ```\n * `${this.id()}-label`\n * ```\n */\n readonly labelledby = input(`${this.id()}-label`);\n\n /** @defaultValue false */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\n\n /** @defaultValue false */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly valueChange = output<PhoneDetails>();\n\n /**\n * This ID will be bound to the `aria-describedby` attribute of the phone-number-input.\n * Use this to reference the element containing the error message(s) for the phone-number-input.\n * It will be picked by the {@link SiFormItemComponent} if the phone-number-input is used inside a form item.\n *\n * @defaultValue\n * ```\n * `${this.id()}-errormessage`\n * ```\n */\n readonly errormessageId = input(`${this.id()}-errormessage`);\n\n protected readonly phoneInput = viewChild.required<ElementRef<HTMLInputElement>>('phoneInput');\n protected selectedCountry?: CountryInfo;\n protected placeholder = '';\n protected readonly countryFocused = signal(false);\n protected open = false;\n protected overlayWidth = 0;\n protected readonly disabled = computed(() => this.disabledInput() || this.disabledNgControl());\n protected readonly countryList = computed(() => {\n const countries = this.allowedCountries() ?? this.phoneUtil.getSupportedRegions();\n return countries\n .map((country: string) => ({\n name: this.getCountryName(country),\n countryCode: this.phoneUtil.getCountryCodeForRegion(country),\n isoCode: country\n }))\n .sort((a: CountryInfo, b: CountryInfo) => a.name.localeCompare(b.name));\n });\n protected readonly icons = addIcons({ elementDown2 });\n private readonly allowedCountries = computed(\n () => this.supportedCountries() ?? this.phoneUtil.getSupportedRegions()\n );\n private readonly disabledNgControl = signal(false);\n private isValidNumber = true;\n private phoneNumber?: PhoneNumber;\n private onChange: (val: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.country) {\n this.writeCountry();\n }\n }\n\n /** @internal */\n writeValue(value: string | undefined): void {\n this.phoneNumber = this.parseNumber(value);\n if (this.phoneNumber) {\n this.writeValueToInput();\n this.country.set(this.getRegionCode());\n } else {\n // Number could not be parsed, write raw value instead to handle cases like undefined\n this.writeTextToInput(value);\n this.country.set(this.defaultCountry() ?? this.country());\n }\n this.writeCountry();\n this.changeDetectorRef.markForCheck();\n }\n\n /** @internal */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabledNgControl.set(isDisabled);\n }\n\n /** @internal */\n validate(control: AbstractControl): ValidationErrors | null {\n if (!this.phoneInput().nativeElement.value) {\n return null;\n }\n\n this.isValidNumber = false;\n if (!this.phoneNumber || !this.phoneUtil.isValidNumber(this.phoneNumber)) {\n return {\n invalidPhoneNumberFormat: true\n };\n }\n\n if (!this.countryList().some(c => c.isoCode === this.selectedCountry!.isoCode)) {\n return {\n notSupportedPhoneNumberCountry: true\n };\n }\n\n this.isValidNumber = true;\n return null;\n }\n\n protected input(): void {\n const rawNumber = this.phoneInput().nativeElement.value;\n this.phoneNumber = this.parseNumber(rawNumber);\n\n if (this.phoneNumber) {\n const regionCode = this.getRegionCode();\n let countryInfo = this.countryList().find(country => regionCode === country.isoCode);\n if (!countryInfo && regionCode) {\n countryInfo = {\n name: this.getCountryName(regionCode),\n countryCode: this.phoneNumber.getCountryCode()!,\n isoCode: regionCode\n };\n }\n if (countryInfo && this.selectedCountry?.isoCode !== countryInfo.isoCode) {\n this.selectedCountry = countryInfo;\n }\n } else if (rawNumber.trim().startsWith('+')) {\n this.selectedCountry = undefined;\n }\n\n this.handleChange();\n }\n\n protected blur(): void {\n this.countryFocused.set(false);\n this.onTouched();\n this.writeValueToInput();\n this.valueChange.emit({\n country: this.selectedCountry,\n phoneNumber: this.formatPhoneNumber(PhoneNumberFormat.INTERNATIONAL),\n isValid: this.isValidNumber\n });\n }\n\n protected countryInput(num: CountryInfo): void {\n this.selectedCountry = num;\n this.updatePlaceholder();\n this.refreshValueAfterCountryChange();\n this.handleChange();\n }\n\n protected openOverlay(): void {\n if (!this.readonly()) {\n this.open = true;\n this.overlayWidth = this.elementRef.nativeElement.getBoundingClientRect().width + 2; // 2px border\n }\n }\n\n protected overlayDetach(): void {\n this.open = false;\n this.phoneInput().nativeElement.focus();\n }\n\n protected valueProvider(country: CountryInfo): string {\n return `${country.name} +${country.countryCode}`;\n }\n\n private writeCountry(): void {\n const currentCountry = this.country()!;\n this.selectedCountry = this.countryList().find(country => country.isoCode === currentCountry);\n if (!this.selectedCountry) {\n const countryCode = this.phoneUtil.getCountryCodeForRegion(\n currentCountry ?? this.defaultCountry() ?? 'XX'\n );\n if (countryCode) {\n this.selectedCountry = {\n isoCode: currentCountry,\n countryCode,\n name: this.getCountryName(currentCountry)\n };\n }\n }\n this.updatePlaceholder();\n this.refreshValueAfterCountryChange();\n }\n\n private getCountryName(countryCode: string): string {\n // This auto translates the given country name to the selected locale language\n return (\n new Intl.DisplayNames([this.translate.currentLanguage], { type: 'region' }).of(\n countryCode.toUpperCase()\n ) ?? ''\n );\n }\n\n private updatePlaceholder(): void {\n if (this.selectedCountry) {\n this.placeholder = this.phoneUtil\n .format(\n this.phoneUtil.getExampleNumber(this.selectedCountry.isoCode),\n PhoneNumberFormat.NATIONAL\n )\n .replace(/^0/, '');\n }\n }\n\n private parseNumber(rawNumber: string | undefined): PhoneNumber | undefined {\n try {\n let regionCodeForParsing: string | undefined;\n if (!rawNumber?.trim().startsWith('+')) {\n regionCodeForParsing = this.selectedCountry?.isoCode;\n }\n return this.phoneUtil.parse(rawNumber, regionCodeForParsing);\n } catch (e) {\n // The Number is too short, we cannot parse it yet. Error can be ignored. Hopefully, the user enters more digits.\n return;\n }\n }\n\n /**\n * PhoneUtil does not resolve country code early enough when the national prefix is shared among other countries (+1 and +44).\n * This Method fakes a complete number to force PhoneUtil returning a proper region code.\n */\n private getRegionCode(): string | undefined {\n if (this.phoneNumber) {\n const regionCode = this.phoneUtil.getRegionCodeForNumber(this.phoneNumber);\n if (regionCode) {\n return regionCode;\n }\n\n const nationalNumber = this.phoneNumber.getNationalNumber() + '';\n if (\n // USA, CANADA, ...\n (this.phoneNumber.getCountryCode() === 1 && nationalNumber.length >= 3) ||\n // UK, ...\n (this.phoneNumber.getCountryCode() === 44 && nationalNumber.length >= 4)\n ) {\n return this.phoneUtil.getRegionCodeForNumber(\n this.phoneUtil.parse(\n '+' +\n this.phoneNumber.getCountryCode() +\n nationalNumber +\n new Array(10 - nationalNumber.length).fill(5).join('')\n )\n );\n }\n\n return this.phoneUtil.getRegionCodeForCountryCode(this.phoneNumber.getCountryCode()!);\n }\n\n return undefined;\n }\n\n private formatPhoneNumber(format: PhoneNumberFormat): string | undefined {\n if (this.phoneNumber) {\n return this.phoneUtil.format(this.phoneNumber, format);\n }\n\n return undefined;\n }\n\n private handleChange(): void {\n if (this.selectedCountry && this.country() !== this.selectedCountry?.isoCode) {\n this.country.set(this.selectedCountry?.isoCode);\n }\n\n if (this.phoneNumber) {\n this.onChange(this.formatPhoneNumber(PhoneNumberFormat.INTERNATIONAL)!);\n } else {\n this.onChange('');\n }\n }\n\n private writeTextToInput(value?: string): void {\n this.phoneInput().nativeElement.value = value ?? '';\n }\n /**\n * Format and update input text or clear input text if the input value is undefined.\n */\n private writeValueToInput(): void {\n if (this.phoneNumber) {\n this.writeTextToInput(this.formatPhoneNumber(PhoneNumberFormat.NATIONAL)!.replace(/^0/, ''));\n }\n }\n\n private refreshValueAfterCountryChange(): void {\n if (this.selectedCountry) {\n this.phoneNumber?.setCountryCode(this.selectedCountry?.countryCode);\n this.writeValueToInput();\n }\n }\n}\n","<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + option.value.isoCode.toLowerCase()\"></span>\n {{ option.value.name }} +{{ option.value.countryCode }}\n </ng-template>\n </button>\n <input\n #phoneInput\n type=\"tel\"\n class=\"ms-4 border-0 p-0 focus-none shadow-none flex-grow-1 phone-number\"\n [attr.aria-label]=\"phoneNumberAriaLabel() | translate\"\n [attr.aria-describedby]=\"errormessageId()\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (input)=\"input()\"\n (blur)=\"blur()\"\n />\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiPhoneNumberInputComponent } from './si-phone-number-input.component';\n\n@NgModule({\n imports: [SiPhoneNumberInputComponent],\n exports: [SiPhoneNumberInputComponent]\n})\nexport class SiPhoneNumberInputModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-phone-number-input.module';\nexport * from './si-phone-number-input.component';\nexport * from './si-phone-number-input.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-phone-number.mjs","sources":["../../../../projects/element-ng/phone-number/si-phone-number-input-select.directive.ts","../../../../projects/element-ng/phone-number/si-phone-number-input.component.ts","../../../../projects/element-ng/phone-number/si-phone-number-input.component.html","../../../../projects/element-ng/phone-number/si-phone-number-input.module.ts","../../../../projects/element-ng/phone-number/index.ts","../../../../projects/element-ng/phone-number/siemens-element-ng-phone-number.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { Directive } from '@angular/core';\nimport {\n SiSelectComplexOptionsDirective,\n SiSelectSingleValueDirective\n} from '@siemens/element-ng/select';\n\n/**\n * This directive provides the si-select options and value strategy for the phone number input.\n * As we don't use si-select directly, we need to provide these strategies manually.\n */\n@Directive({\n selector: '[siPhoneNumberInputSelect]',\n hostDirectives: [\n {\n directive: SiSelectComplexOptionsDirective,\n inputs: ['complexOptions', 'valueProvider']\n },\n { directive: SiSelectSingleValueDirective, inputs: ['value'], outputs: ['valueChange'] }\n ]\n})\nexport class SiPhoneNumberInputSelectDirective {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { LowerCasePipe, NgClass } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n OnChanges,\n output,\n signal,\n SimpleChanges,\n viewChild\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator\n} from '@angular/forms';\nimport { SI_FORM_ITEM_CONTROL, SiFormItemControl } from '@siemens/element-ng/form';\nimport { addIcons, elementDown2, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiSelectListHasFilterComponent } from '@siemens/element-ng/select';\nimport {\n injectSiTranslateService,\n SiTranslatePipe,\n t\n} from '@siemens/element-translate-ng/translate';\nimport { PhoneNumber, PhoneNumberFormat, PhoneNumberUtil } from 'google-libphonenumber';\n\nimport { SiPhoneNumberInputSelectDirective } from './si-phone-number-input-select.directive';\nimport { CountryInfo, PhoneDetails } from './si-phone-number-input.models';\n\n@Component({\n selector: 'si-phone-number-input',\n imports: [\n CdkOverlayOrigin,\n CdkConnectedOverlay,\n NgClass,\n SiIconComponent,\n SiPhoneNumberInputSelectDirective,\n SiSelectListHasFilterComponent,\n SiTranslatePipe,\n LowerCasePipe\n ],\n templateUrl: './si-phone-number-input.component.html',\n styleUrl: './si-phone-number-input.component.scss',\n providers: [\n {\n provide: NG_VALIDATORS,\n useExisting: SiPhoneNumberInputComponent,\n multi: true\n },\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: SiPhoneNumberInputComponent,\n multi: true\n },\n {\n provide: SI_FORM_ITEM_CONTROL,\n useExisting: SiPhoneNumberInputComponent\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'group',\n '[attr.aria-labelledby]': 'labelledby()',\n '[attr.id]': 'id()',\n '[class.disabled]': 'disabled()',\n '[class.readonly]': 'readonly()',\n '[class.country-focus]': 'countryFocused()'\n }\n})\nexport class SiPhoneNumberInputComponent\n implements ControlValueAccessor, Validator, OnChanges, SiFormItemControl\n{\n private static idCounter = 0;\n\n private phoneUtil = PhoneNumberUtil.getInstance();\n private translate = injectSiTranslateService();\n private changeDetectorRef = inject(ChangeDetectorRef);\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Unique identifier.\n *\n * @defaultValue\n * ```\n * `__si-phone-number-input-${SiPhoneNumberInputComponent.idCounter++}`\n * ```\n */\n readonly id = input(`__si-phone-number-input-${SiPhoneNumberInputComponent.idCounter++}`);\n\n /**\n * ISO_3166-2 Code of the selected country.\n */\n readonly country = model<string>();\n\n /**\n * ISO_3166-2 Code of the country which shall be used on form-control reset.\n */\n readonly defaultCountry = input<string>();\n\n /**\n * Placeholder text for country search input.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_PLACEHOLDER:Search`)\n * ```\n */\n readonly placeholderForSearch = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_PLACEHOLDER:Search`)\n );\n /**\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_NO-RESULTS_FOUND:No results found`)\n * ```\n */\n readonly searchNoResultsFoundLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SEARCH_NO-RESULTS_FOUND:No results found`)\n );\n /**\n * Text for the country dropdown aria-label attribute.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SELECT_COUNTRY:Select country`)\n * ```\n */\n readonly selectCountryAriaLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.SELECT_COUNTRY:Select country`)\n );\n /**\n * Text for the phone number input aria-label attribute.\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.PHONE_NUMBER_INPUT_LABEL:Enter phone number`)\n * ```\n */\n readonly phoneNumberAriaLabel = input(\n t(() => $localize`:@@SI_PHONE_NUMBER_INPUT.PHONE_NUMBER_INPUT_LABEL:Enter phone number`)\n );\n /**\n * List of countries in ISO2 format, from which the user is allowed to select one.\n * If no values are provided, the dropdown will show all known countries.\n */\n readonly supportedCountries = input<readonly string[] | null>();\n\n /**\n * @defaultValue\n * ```\n * `${this.id()}-label`\n * ```\n */\n readonly labelledby = input(`${this.id()}-label`);\n\n /** @defaultValue false */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\n\n /** @defaultValue false */\n readonly readonly = input(false, { transform: booleanAttribute });\n\n readonly valueChange = output<PhoneDetails>();\n\n /**\n * This ID will be bound to the `aria-describedby` attribute of the phone-number-input.\n * Use this to reference the element containing the error message(s) for the phone-number-input.\n * It will be picked by the {@link SiFormItemComponent} if the phone-number-input is used inside a form item.\n *\n * @defaultValue\n * ```\n * `${this.id()}-errormessage`\n * ```\n */\n readonly errormessageId = input(`${this.id()}-errormessage`);\n\n protected readonly phoneInput = viewChild.required<ElementRef<HTMLInputElement>>('phoneInput');\n protected selectedCountry?: CountryInfo;\n protected placeholder = '';\n protected readonly countryFocused = signal(false);\n protected open = false;\n protected overlayWidth = 0;\n protected readonly disabled = computed(() => this.disabledInput() || this.disabledNgControl());\n protected readonly countryList = computed(() => {\n const countries = this.allowedCountries() ?? this.phoneUtil.getSupportedRegions();\n return countries\n .map((country: string) => ({\n name: this.getCountryName(country),\n countryCode: this.phoneUtil.getCountryCodeForRegion(country),\n isoCode: country\n }))\n .sort((a: CountryInfo, b: CountryInfo) => a.name.localeCompare(b.name));\n });\n protected readonly icons = addIcons({ elementDown2 });\n private readonly allowedCountries = computed(\n () => this.supportedCountries() ?? this.phoneUtil.getSupportedRegions()\n );\n private readonly disabledNgControl = signal(false);\n private isValidNumber = true;\n private phoneNumber?: PhoneNumber;\n private onChange: (val: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.country) {\n this.writeCountry();\n }\n }\n\n /** @internal */\n writeValue(value: string | undefined): void {\n this.phoneNumber = this.parseNumber(value);\n if (this.phoneNumber) {\n this.writeValueToInput();\n this.country.set(this.getRegionCode());\n } else {\n // Number could not be parsed, write raw value instead to handle cases like undefined\n this.writeTextToInput(value);\n this.country.set(this.defaultCountry() ?? this.country());\n }\n this.writeCountry();\n this.changeDetectorRef.markForCheck();\n }\n\n /** @internal */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /** @internal */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /** @internal */\n setDisabledState(isDisabled: boolean): void {\n this.disabledNgControl.set(isDisabled);\n }\n\n /** @internal */\n validate(control: AbstractControl): ValidationErrors | null {\n if (!this.phoneInput().nativeElement.value) {\n return null;\n }\n\n this.isValidNumber = false;\n if (!this.phoneNumber || !this.phoneUtil.isValidNumber(this.phoneNumber)) {\n return {\n invalidPhoneNumberFormat: true\n };\n }\n\n if (!this.countryList().some(c => c.isoCode === this.selectedCountry!.isoCode)) {\n return {\n notSupportedPhoneNumberCountry: true\n };\n }\n\n this.isValidNumber = true;\n return null;\n }\n\n protected input(): void {\n const rawNumber = this.phoneInput().nativeElement.value;\n this.phoneNumber = this.parseNumber(rawNumber);\n\n if (this.phoneNumber) {\n const regionCode = this.getRegionCode();\n let countryInfo = this.countryList().find(country => regionCode === country.isoCode);\n if (!countryInfo && regionCode) {\n countryInfo = {\n name: this.getCountryName(regionCode),\n countryCode: this.phoneNumber.getCountryCode()!,\n isoCode: regionCode\n };\n }\n if (countryInfo && this.selectedCountry?.isoCode !== countryInfo.isoCode) {\n this.selectedCountry = countryInfo;\n }\n } else if (rawNumber.trim().startsWith('+')) {\n this.selectedCountry = undefined;\n }\n\n this.handleChange();\n }\n\n protected blur(): void {\n this.countryFocused.set(false);\n this.onTouched();\n this.writeValueToInput();\n this.valueChange.emit({\n country: this.selectedCountry,\n phoneNumber: this.formatPhoneNumber(PhoneNumberFormat.INTERNATIONAL),\n isValid: this.isValidNumber\n });\n }\n\n protected countryInput(num: CountryInfo): void {\n this.selectedCountry = num;\n this.updatePlaceholder();\n this.refreshValueAfterCountryChange();\n this.handleChange();\n }\n\n protected openOverlay(): void {\n if (!this.readonly()) {\n this.open = true;\n this.overlayWidth = this.elementRef.nativeElement.getBoundingClientRect().width + 2; // 2px border\n }\n }\n\n protected overlayDetach(): void {\n this.open = false;\n this.phoneInput().nativeElement.focus();\n }\n\n protected valueProvider(country: CountryInfo): string {\n return `${country.name} +${country.countryCode}`;\n }\n\n private writeCountry(): void {\n const currentCountry = this.country()!;\n this.selectedCountry = this.countryList().find(country => country.isoCode === currentCountry);\n if (!this.selectedCountry) {\n const countryCode = this.phoneUtil.getCountryCodeForRegion(\n currentCountry ?? this.defaultCountry() ?? 'XX'\n );\n if (countryCode) {\n this.selectedCountry = {\n isoCode: currentCountry,\n countryCode,\n name: this.getCountryName(currentCountry)\n };\n }\n }\n this.updatePlaceholder();\n this.refreshValueAfterCountryChange();\n }\n\n private getCountryName(countryCode: string): string {\n // This auto translates the given country name to the selected locale language\n return (\n new Intl.DisplayNames([this.translate.currentLanguage], { type: 'region' }).of(\n countryCode.toUpperCase()\n ) ?? ''\n );\n }\n\n private updatePlaceholder(): void {\n if (this.selectedCountry) {\n this.placeholder = this.phoneUtil\n .format(\n this.phoneUtil.getExampleNumber(this.selectedCountry.isoCode),\n PhoneNumberFormat.NATIONAL\n )\n .replace(/^0/, '');\n }\n }\n\n private parseNumber(rawNumber: string | undefined): PhoneNumber | undefined {\n try {\n let regionCodeForParsing: string | undefined;\n if (!rawNumber?.trim().startsWith('+')) {\n regionCodeForParsing = this.selectedCountry?.isoCode;\n }\n return this.phoneUtil.parse(rawNumber, regionCodeForParsing);\n } catch (e) {\n // The Number is too short, we cannot parse it yet. Error can be ignored. Hopefully, the user enters more digits.\n return;\n }\n }\n\n /**\n * PhoneUtil does not resolve country code early enough when the national prefix is shared among other countries (+1 and +44).\n * This Method fakes a complete number to force PhoneUtil returning a proper region code.\n */\n private getRegionCode(): string | undefined {\n if (this.phoneNumber) {\n const regionCode = this.phoneUtil.getRegionCodeForNumber(this.phoneNumber);\n if (regionCode) {\n return regionCode;\n }\n\n const nationalNumber = this.phoneNumber.getNationalNumber() + '';\n if (\n // USA, CANADA, ...\n (this.phoneNumber.getCountryCode() === 1 && nationalNumber.length >= 3) ||\n // UK, ...\n (this.phoneNumber.getCountryCode() === 44 && nationalNumber.length >= 4)\n ) {\n return this.phoneUtil.getRegionCodeForNumber(\n this.phoneUtil.parse(\n '+' +\n this.phoneNumber.getCountryCode() +\n nationalNumber +\n new Array(10 - nationalNumber.length).fill(5).join('')\n )\n );\n }\n\n return this.phoneUtil.getRegionCodeForCountryCode(this.phoneNumber.getCountryCode()!);\n }\n\n return undefined;\n }\n\n private formatPhoneNumber(format: PhoneNumberFormat): string | undefined {\n if (this.phoneNumber) {\n return this.phoneUtil.format(this.phoneNumber, format);\n }\n\n return undefined;\n }\n\n private handleChange(): void {\n if (this.selectedCountry && this.country() !== this.selectedCountry?.isoCode) {\n this.country.set(this.selectedCountry?.isoCode);\n }\n\n if (this.phoneNumber) {\n this.onChange(this.formatPhoneNumber(PhoneNumberFormat.INTERNATIONAL)!);\n } else {\n this.onChange('');\n }\n }\n\n private writeTextToInput(value?: string): void {\n this.phoneInput().nativeElement.value = value ?? '';\n }\n /**\n * Format and update input text or clear input text if the input value is undefined.\n */\n private writeValueToInput(): void {\n if (this.phoneNumber) {\n this.writeTextToInput(this.formatPhoneNumber(PhoneNumberFormat.NATIONAL)!.replace(/^0/, ''));\n }\n }\n\n private refreshValueAfterCountryChange(): void {\n if (this.selectedCountry) {\n this.phoneNumber?.setCountryCode(this.selectedCountry?.countryCode);\n this.writeValueToInput();\n }\n }\n}\n","<div\n class=\"btn-group w-100 d-flex shadow-none border-0\"\n [class.disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-disabled]=\"disabled()\"\n>\n <button\n #trigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n siPhoneNumberInputSelect\n class=\"dropdown-toggle d-flex align-items-center ms-n4 my-n4 py-2 px-4 border-0\"\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [disabled]=\"disabled()\"\n [class.readonly]=\"readonly()\"\n [attr.aria-labelledby]=\"id() + '-aria-label ' + id() + '-value'\"\n [attr.aria-expanded]=\"open\"\n [complexOptions]=\"countryList()\"\n [value]=\"selectedCountry\"\n [valueProvider]=\"valueProvider\"\n [tabindex]=\"disabled() ? '-1' : '0'\"\n [attr.aria-controls]=\"id() + '-listbox'\"\n (valueChange)=\"countryInput($event)\"\n (click)=\"openOverlay()\"\n (focus)=\"countryFocused.set(true)\"\n (blur)=\"countryFocused.set(false)\"\n >\n <span class=\"visually-hidden\" [id]=\"id() + '-aria-label'\">{{\n selectCountryAriaLabel() | translate\n }}</span>\n <span\n class=\"fi\"\n aria-hidden=\"true\"\n [ngClass]=\"'fi-' + (selectedCountry?.isoCode?.toLowerCase() ?? 'xx')\"\n ></span>\n @if (selectedCountry) {\n <span class=\"si-body ms-4\" [id]=\"id() + '-value'\">\n <span class=\"visually-hidden\">{{ selectedCountry.name }}</span>\n +{{ selectedCountry.countryCode }}\n </span>\n }\n <si-icon class=\"icon dropdown-caret\" [icon]=\"icons.elementDown2\" />\n\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-1\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n (backdropClick)=\"overlayDetach()\"\n (detach)=\"overlayDetach()\"\n >\n <si-select-list-has-filter\n [baseId]=\"id()\"\n [filterPlaceholder]=\"placeholderForSearch()\"\n [noResultsFoundLabel]=\"searchNoResultsFoundLabel()\"\n [optionTemplate]=\"optionTemplate\"\n (closeOverlay)=\"overlayDetach()\"\n />\n </ng-template>\n <ng-template #optionTemplate let-option>\n <span class=\"fi me-5\" [ngClass]=\"'fi-' + (option.value.isoCode | lowercase)\"></span>\n {{ option.value.name }} +{{ option.value.countryCode }}\n </ng-template>\n </button>\n <input\n #phoneInput\n type=\"tel\"\n class=\"ms-4 border-0 p-0 focus-none shadow-none flex-grow-1 phone-number\"\n [attr.aria-label]=\"phoneNumberAriaLabel() | translate\"\n [attr.aria-describedby]=\"errormessageId()\"\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n (input)=\"input()\"\n (blur)=\"blur()\"\n />\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiPhoneNumberInputComponent } from './si-phone-number-input.component';\n\n@NgModule({\n imports: [SiPhoneNumberInputComponent],\n exports: [SiPhoneNumberInputComponent]\n})\nexport class SiPhoneNumberInputModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2025\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-phone-number-input.module';\nexport * from './si-phone-number-input.component';\nexport * from './si-phone-number-input.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,7 @@ import { Subject, takeUntil } from 'rxjs';
|
|
|
7
7
|
import { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
|
|
8
8
|
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
9
9
|
import { SiIconComponent } from '@siemens/element-ng/icon';
|
|
10
|
-
import
|
|
11
|
-
import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
|
|
10
|
+
import { SiTranslatePipe } from '@siemens/element-translate-ng/translate';
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* Copyright (c) Siemens 2016 - 2025
|
|
@@ -75,11 +74,11 @@ class PopoverComponent {
|
|
|
75
74
|
});
|
|
76
75
|
}
|
|
77
76
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
78
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PopoverComponent, isStandalone: true, selector: "si-popover", inputs: { popoverDirective: { classPropertyName: "popoverDirective", publicName: "popoverDirective", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "id": "this.popoverDirective().popoverId" } }, viewQueries: [{ propertyName: "popoverWrapper", first: true, predicate: ["popoverWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "@let popover = popoverDirective();\n<div\n #popoverWrapper\n class=\"popover position-relative focus-inside\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"labelledBy\"\n [attr.aria-describedby]=\"describedBy\"\n [ngClass]=\"[positionClass(), popover.containerClass()]\"\n (keydown.escape)=\"hide()\"\n>\n <div\n class=\"popover-arrow\"\n [style.left.px]=\"arrowPos()?.left\"\n [style.right.px]=\"arrowPos()?.right\"\n ></div>\n @if (popover.title()) {\n <div class=\"popover-header\">\n @let iconValue = popover.icon();\n @if (iconValue) {\n <si-icon class=\"icon me-1\" [icon]=\"iconValue\" />\n }\n <span class=\"si-h5\" [id]=\"labelledBy\">{{ popover.title() | translate }}</span>\n </div>\n }\n @if (!popoverTemplate) {\n <div class=\"popover-body\">\n <div class=\"si-body\" [id]=\"describedBy\">{{ description() | translate }}</div>\n </div>\n } @else {\n <!-- If title is already provided, we wrap the template with the `popover-body` class\n since the template may not be in the popover body directive. Also used by SiHelpButtonComponent -->\n @if (popover.title()) {\n <div class=\"popover-body\">\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n }\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "
|
|
77
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PopoverComponent, isStandalone: true, selector: "si-popover", inputs: { popoverDirective: { classPropertyName: "popoverDirective", publicName: "popoverDirective", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "id": "this.popoverDirective().popoverId" } }, viewQueries: [{ propertyName: "popoverWrapper", first: true, predicate: ["popoverWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "@let popover = popoverDirective();\n<div\n #popoverWrapper\n class=\"popover position-relative focus-inside\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"labelledBy\"\n [attr.aria-describedby]=\"describedBy\"\n [ngClass]=\"[positionClass(), popover.containerClass()]\"\n (keydown.escape)=\"hide()\"\n>\n <div\n class=\"popover-arrow\"\n [style.left.px]=\"arrowPos()?.left\"\n [style.right.px]=\"arrowPos()?.right\"\n ></div>\n @if (popover.title()) {\n <div class=\"popover-header\">\n @let iconValue = popover.icon();\n @if (iconValue) {\n <si-icon class=\"icon me-1\" [icon]=\"iconValue\" />\n }\n <span class=\"si-h5\" [id]=\"labelledBy\">{{ popover.title() | translate }}</span>\n </div>\n }\n @if (!popoverTemplate) {\n <div class=\"popover-body\">\n <div class=\"si-body\" [id]=\"describedBy\">{{ description() | translate }}</div>\n </div>\n } @else {\n <!-- If title is already provided, we wrap the template with the `popover-body` class\n since the template may not be in the popover body directive. Also used by SiHelpButtonComponent -->\n @if (popover.title()) {\n <div class=\"popover-body\">\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n }\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
79
78
|
}
|
|
80
79
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PopoverComponent, decorators: [{
|
|
81
80
|
type: Component,
|
|
82
|
-
args: [{ selector: 'si-popover', imports: [NgClass, NgTemplateOutlet, SiIconComponent,
|
|
81
|
+
args: [{ selector: 'si-popover', imports: [NgClass, NgTemplateOutlet, SiIconComponent, SiTranslatePipe], host: {
|
|
83
82
|
'[id]': 'this.popoverDirective().popoverId'
|
|
84
83
|
}, template: "@let popover = popoverDirective();\n<div\n #popoverWrapper\n class=\"popover position-relative focus-inside\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"labelledBy\"\n [attr.aria-describedby]=\"describedBy\"\n [ngClass]=\"[positionClass(), popover.containerClass()]\"\n (keydown.escape)=\"hide()\"\n>\n <div\n class=\"popover-arrow\"\n [style.left.px]=\"arrowPos()?.left\"\n [style.right.px]=\"arrowPos()?.right\"\n ></div>\n @if (popover.title()) {\n <div class=\"popover-header\">\n @let iconValue = popover.icon();\n @if (iconValue) {\n <si-icon class=\"icon me-1\" [icon]=\"iconValue\" />\n }\n <span class=\"si-h5\" [id]=\"labelledBy\">{{ popover.title() | translate }}</span>\n </div>\n }\n @if (!popoverTemplate) {\n <div class=\"popover-body\">\n <div class=\"si-body\" [id]=\"describedBy\">{{ description() | translate }}</div>\n </div>\n } @else {\n <!-- If title is already provided, we wrap the template with the `popover-body` class\n since the template may not be in the popover body directive. Also used by SiHelpButtonComponent -->\n @if (popover.title()) {\n <div class=\"popover-body\">\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n } @else {\n <ng-template\n [ngTemplateOutlet]=\"popoverTemplate\"\n [ngTemplateOutletContext]=\"popover.context()\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n }\n }\n</div>\n" }]
|
|
85
84
|
}] });
|