@koobiq/components 18.33.0 → 18.34.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/actions-panel/actions-panel-config.d.ts +4 -3
- package/actions-panel/actions-panel-container.scss +0 -6
- package/actions-panel/actions-panel-ref.d.ts +13 -0
- package/actions-panel/actions-panel.d.ts +1 -7
- package/clamped-text/clamped-text.d.ts +61 -0
- package/clamped-text/clamped-text.scss +17 -0
- package/clamped-text/constants.d.ts +14 -0
- package/clamped-text/index.d.ts +3 -0
- package/clamped-text/module.d.ts +7 -0
- package/content-panel/content-panel-aside.scss +9 -0
- package/content-panel/content-panel-body.scss +9 -0
- package/content-panel/content-panel-container.scss +32 -0
- package/content-panel/content-panel-footer.scss +5 -0
- package/content-panel/content-panel-header.scss +30 -0
- package/content-panel/content-panel-tokens.scss +9 -0
- package/content-panel/content-panel.d.ts +149 -0
- package/content-panel/content-panel.scss +25 -0
- package/content-panel/index.d.ts +3 -0
- package/content-panel/module.d.ts +7 -0
- package/content-panel/resizable.d.ts +70 -0
- package/core/locales/en-US.d.ts +4 -0
- package/core/locales/es-LA.d.ts +4 -0
- package/core/locales/fa-IR.d.ts +4 -0
- package/core/locales/locale-service.d.ts +28 -0
- package/core/locales/pt-BR.d.ts +4 -0
- package/core/locales/ru-RU.d.ts +4 -0
- package/core/locales/tk-TM.d.ts +4 -0
- package/core/locales/types.d.ts +5 -0
- package/core/locales/zh-CN.d.ts +4 -0
- package/core/styles/common/_select.scss +6 -3
- package/datepicker/calendar.component.d.ts +1 -1
- package/datepicker/datepicker-input.directive.d.ts +1 -1
- package/datepicker/datepicker-toggle.component.d.ts +1 -1
- package/datepicker/datepicker.component.d.ts +2 -2
- package/dynamic-translation/dynamic-translation.d.ts +72 -0
- package/dynamic-translation/index.d.ts +2 -0
- package/dynamic-translation/module.d.ts +7 -0
- package/esm2022/actions-panel/actions-panel-config.mjs +1 -1
- package/esm2022/actions-panel/actions-panel-container.mjs +7 -7
- package/esm2022/actions-panel/actions-panel-ref.mjs +17 -1
- package/esm2022/actions-panel/actions-panel.mjs +34 -24
- package/esm2022/button-toggle/button-toggle.component.mjs +9 -9
- package/esm2022/clamped-text/clamped-text.mjs +202 -0
- package/esm2022/clamped-text/constants.mjs +20 -0
- package/esm2022/clamped-text/index.mjs +4 -0
- package/esm2022/clamped-text/koobiq-components-clamped-text.mjs +5 -0
- package/esm2022/clamped-text/module.mjs +19 -0
- package/esm2022/content-panel/content-panel.mjs +432 -0
- package/esm2022/content-panel/index.mjs +4 -0
- package/esm2022/content-panel/koobiq-components-content-panel.mjs +5 -0
- package/esm2022/content-panel/module.mjs +42 -0
- package/esm2022/content-panel/resizable.mjs +138 -0
- package/esm2022/core/locales/en-US.mjs +5 -1
- package/esm2022/core/locales/es-LA.mjs +5 -1
- package/esm2022/core/locales/fa-IR.mjs +5 -1
- package/esm2022/core/locales/pt-BR.mjs +5 -1
- package/esm2022/core/locales/ru-RU.mjs +5 -1
- package/esm2022/core/locales/tk-TM.mjs +5 -1
- package/esm2022/core/locales/types.mjs +1 -1
- package/esm2022/core/locales/zh-CN.mjs +5 -1
- package/esm2022/core/version.mjs +2 -2
- package/esm2022/datepicker/calendar-header.component.mjs +5 -2
- package/esm2022/datepicker/calendar.component.mjs +9 -9
- package/esm2022/datepicker/datepicker-input.directive.mjs +1 -1
- package/esm2022/datepicker/datepicker-toggle.component.mjs +8 -8
- package/esm2022/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/dropdown/dropdown.component.mjs +3 -3
- package/esm2022/dynamic-translation/dynamic-translation.mjs +175 -0
- package/esm2022/dynamic-translation/index.mjs +3 -0
- package/esm2022/dynamic-translation/koobiq-components-dynamic-translation.mjs +5 -0
- package/esm2022/dynamic-translation/module.mjs +25 -0
- package/esm2022/file-upload/file-drop.mjs +1 -1
- package/esm2022/file-upload/multiple-file-upload.component.mjs +11 -11
- package/esm2022/file-upload/single-file-upload.component.mjs +11 -11
- package/esm2022/filter-bar/filter-refresher.mjs +5 -5
- package/esm2022/filter-bar/filter-reset.mjs +3 -3
- package/esm2022/filter-bar/filter-search.mjs +11 -11
- package/esm2022/filter-bar/filters.mjs +3 -3
- package/esm2022/filter-bar/pipe-add.mjs +5 -5
- package/esm2022/filter-bar/pipes/base-pipe.mjs +2 -2
- package/esm2022/filter-bar/pipes/pipe-button.mjs +7 -7
- package/esm2022/filter-bar/pipes/pipe-date.mjs +9 -1
- package/esm2022/filter-bar/pipes/pipe-datetime.mjs +9 -1
- package/esm2022/filter-bar/pipes/pipe-multi-select.mjs +4 -10
- package/esm2022/filter-bar/pipes/pipe-multi-tree-select.mjs +10 -9
- package/esm2022/filter-bar/pipes/pipe-readonly.mjs +7 -7
- package/esm2022/filter-bar/pipes/pipe-select.mjs +3 -4
- package/esm2022/filter-bar/pipes/pipe-text.mjs +8 -2
- package/esm2022/filter-bar/pipes/pipe-tree-select.mjs +9 -3
- package/esm2022/form-field/cleaner.mjs +16 -11
- package/esm2022/form-field/fieldset.mjs +2 -2
- package/esm2022/form-field/form-field.mjs +5 -5
- package/esm2022/form-field/password-hint.mjs +14 -3
- package/esm2022/form-field/password-toggle.mjs +45 -10
- package/esm2022/form-field/reactive-password-hint.mjs +18 -17
- package/esm2022/form-field/stepper.mjs +9 -9
- package/esm2022/icon/icon-button.component.mjs +2 -2
- package/esm2022/input/input-number.mjs +15 -10
- package/esm2022/markdown/markdown.component.mjs +3 -3
- package/esm2022/modal/modal.component.mjs +14 -14
- package/esm2022/modal/modal.directive.mjs +7 -5
- package/esm2022/navbar/navbar-item.component.mjs +3 -3
- package/esm2022/popover/popover-confirm.component.mjs +3 -3
- package/esm2022/popover/popover.component.mjs +3 -3
- package/esm2022/scrollbar/scrollbar.component.mjs +5 -5
- package/esm2022/select/select.component.mjs +24 -11
- package/esm2022/sidebar/sidebar.component.mjs +46 -27
- package/esm2022/sidepanel/sidepanel-container.component.mjs +15 -4
- package/esm2022/sidepanel/sidepanel-directives.mjs +5 -5
- package/esm2022/sidepanel/sidepanel-ref.mjs +8 -6
- package/esm2022/splitter/splitter.component.mjs +1 -1
- package/esm2022/tabs/tab-body.component.mjs +3 -3
- package/esm2022/tabs/tab-group.component.mjs +27 -27
- package/esm2022/tabs/tab.component.mjs +4 -4
- package/esm2022/tags/tag-input.mjs +2 -2
- package/esm2022/tags/tag-list.component.mjs +13 -13
- package/esm2022/textarea/textarea.component.mjs +6 -4
- package/esm2022/timepicker/timepicker.directive.mjs +1 -1
- package/esm2022/timezone/timezone-select.component.mjs +3 -3
- package/esm2022/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/tree/tree-selection.component.mjs +4 -4
- package/esm2022/tree-select/tree-select.component.mjs +11 -9
- package/esm2022/username/constants.mjs +25 -0
- package/esm2022/username/index.mjs +6 -0
- package/esm2022/username/koobiq-components-username.mjs +5 -0
- package/esm2022/username/module.mjs +35 -0
- package/esm2022/username/types.mjs +32 -0
- package/esm2022/username/username.mjs +129 -0
- package/esm2022/username/username.pipe.mjs +92 -0
- package/fesm2022/koobiq-components-actions-panel.mjs +56 -31
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +8 -8
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +242 -0
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -0
- package/fesm2022/koobiq-components-content-panel.mjs +612 -0
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -0
- package/fesm2022/koobiq-components-core.mjs +29 -1
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +21 -18
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +2 -2
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-dynamic-translation.mjs +204 -0
- package/fesm2022/koobiq-components-dynamic-translation.mjs.map +1 -0
- package/fesm2022/koobiq-components-file-upload.mjs +20 -20
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +75 -58
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +100 -49
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +2 -2
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-input.mjs +14 -9
- package/fesm2022/koobiq-components-input.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +2 -2
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +19 -17
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +2 -2
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +4 -4
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-scrollbar.mjs +4 -4
- package/fesm2022/koobiq-components-scrollbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +23 -10
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +45 -26
- package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +24 -12
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +31 -31
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +13 -13
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +5 -3
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +2 -2
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +2 -2
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +10 -8
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +3 -3
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +308 -0
- package/fesm2022/koobiq-components-username.mjs.map +1 -0
- package/file-upload/_file-upload-theme.scss +1 -1
- package/file-upload/file-drop.d.ts +1 -1
- package/file-upload/multiple-file-upload.component.d.ts +1 -1
- package/file-upload/single-file-upload.component.d.ts +2 -2
- package/filter-bar/pipes/pipe-date.d.ts +3 -1
- package/filter-bar/pipes/pipe-datetime.d.ts +3 -1
- package/filter-bar/pipes/pipe-multi-select.d.ts +0 -1
- package/filter-bar/pipes/pipe-multi-tree-select.d.ts +3 -2
- package/filter-bar/pipes/pipe-select.d.ts +0 -1
- package/filter-bar/pipes/pipe-tree-select.d.ts +3 -2
- package/form-field/_form-field-theme.scss +27 -18
- package/form-field/cleaner.d.ts +4 -2
- package/form-field/cleaner.scss +6 -2
- package/form-field/form-field.scss +5 -1
- package/form-field/password-hint.d.ts +7 -0
- package/form-field/password-toggle.d.ts +23 -3
- package/form-field/password-toggle.scss +4 -8
- package/form-field/reactive-password-hint.d.ts +1 -0
- package/icon/_icon-button-theme.scss +8 -2
- package/modal/modal.component.d.ts +6 -6
- package/package.json +28 -4
- package/popover/popover-confirm.component.d.ts +1 -1
- package/popover/popover.component.d.ts +2 -2
- package/schematics/ng-add/index.js +3 -3
- package/scrollbar/scrollbar.component.d.ts +4 -4
- package/select/select.component.d.ts +14 -2
- package/sidebar/sidebar.component.d.ts +31 -5
- package/sidepanel/sidepanel-container.component.d.ts +9 -0
- package/sidepanel/sidepanel-ref.d.ts +3 -3
- package/splitter/splitter.component.d.ts +2 -2
- package/tabs/tab-group.component.d.ts +1 -1
- package/tabs/tab.component.d.ts +1 -1
- package/tags/tag-input.d.ts +1 -1
- package/tags/tag-list.component.d.ts +1 -1
- package/timepicker/timepicker.directive.d.ts +1 -1
- package/tooltip/tooltip.component.d.ts +2 -2
- package/tree/tree-selection.component.d.ts +1 -1
- package/tree-select/tree-select.component.d.ts +1 -1
- package/username/constants.d.ts +15 -0
- package/username/index.d.ts +5 -0
- package/username/module.d.ts +8 -0
- package/username/types.d.ts +62 -0
- package/username/username-tokens.scss +6 -0
- package/username/username.d.ts +68 -0
- package/username/username.pipe.d.ts +23 -0
- package/username/username.scss +107 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, inject, TemplateRef, Directive, contentChildren, computed, Component, ChangeDetectionStrategy, Renderer2, viewChildren, effect, afterNextRender, NgModule } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Directive for defining a dynamic translation slot.
|
|
7
|
+
*/
|
|
8
|
+
class KbqDynamicTranslationSlot {
|
|
9
|
+
constructor() {
|
|
10
|
+
/**
|
|
11
|
+
* The name of the dynamic translation slot.
|
|
12
|
+
*/
|
|
13
|
+
this.name = input.required({ alias: 'kbqDynamicTranslationSlot' });
|
|
14
|
+
/**
|
|
15
|
+
* @docs-private
|
|
16
|
+
*/
|
|
17
|
+
this.templateRef = inject(TemplateRef);
|
|
18
|
+
}
|
|
19
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationSlot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: KbqDynamicTranslationSlot, isStandalone: true, selector: "[kbqDynamicTranslationSlot]", inputs: { name: { classPropertyName: "name", publicName: "kbqDynamicTranslationSlot", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationSlot, decorators: [{
|
|
23
|
+
type: Directive,
|
|
24
|
+
args: [{
|
|
25
|
+
standalone: true,
|
|
26
|
+
selector: '[kbqDynamicTranslationSlot]'
|
|
27
|
+
}]
|
|
28
|
+
}] });
|
|
29
|
+
/**
|
|
30
|
+
* Component for dynamic translation.
|
|
31
|
+
*/
|
|
32
|
+
class KbqDynamicTranslation {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.slots = contentChildren(KbqDynamicTranslationSlot);
|
|
35
|
+
/**
|
|
36
|
+
* The text which will be translated.
|
|
37
|
+
*/
|
|
38
|
+
this.text = input.required();
|
|
39
|
+
/**
|
|
40
|
+
* @docs-private
|
|
41
|
+
*/
|
|
42
|
+
this.parsedSlots = computed(() => this.parseSlots(this.text(), this.slots()));
|
|
43
|
+
}
|
|
44
|
+
parseSlots(text, slots) {
|
|
45
|
+
const slotTemplatesByName = slots.reduce((map, { name, templateRef }) => {
|
|
46
|
+
const slotName = name();
|
|
47
|
+
if (slotName)
|
|
48
|
+
map[slotName] = templateRef;
|
|
49
|
+
return map;
|
|
50
|
+
}, {});
|
|
51
|
+
const parsedSlots = [];
|
|
52
|
+
const slotSelector = new RegExp(`\\[\\[(${Object.keys(slotTemplatesByName).join('|')})(?::(.+?))?\\]\\]`, 'g');
|
|
53
|
+
let match;
|
|
54
|
+
let lastIndex = 0;
|
|
55
|
+
while ((match = slotSelector.exec(text)) !== null) {
|
|
56
|
+
const [slotMatch, slotName, slotText] = match;
|
|
57
|
+
const [listMatch, listString] = new RegExp('^\\((.*?)\\)$', 'g').exec(slotText) ?? [];
|
|
58
|
+
const textBeforeSlot = text.substring(lastIndex, +match.index);
|
|
59
|
+
if (textBeforeSlot) {
|
|
60
|
+
parsedSlots.push({ type: 'text', text: textBeforeSlot, template: null });
|
|
61
|
+
}
|
|
62
|
+
parsedSlots.push({
|
|
63
|
+
type: 'slot',
|
|
64
|
+
template: slotTemplatesByName[slotName] || null,
|
|
65
|
+
context: { $implicit: listMatch && listString ? listString.split(',') : slotText }
|
|
66
|
+
});
|
|
67
|
+
lastIndex = match.index + slotMatch.length;
|
|
68
|
+
}
|
|
69
|
+
const textAfterLastSlot = text.substring(lastIndex);
|
|
70
|
+
if (textAfterLastSlot) {
|
|
71
|
+
parsedSlots.push({ type: 'text', text: textAfterLastSlot, template: null });
|
|
72
|
+
}
|
|
73
|
+
return parsedSlots;
|
|
74
|
+
}
|
|
75
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslation, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
76
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: KbqDynamicTranslation, isStandalone: true, selector: "kbq-dynamic-translation", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null } }, queries: [{ propertyName: "slots", predicate: KbqDynamicTranslationSlot, isSignal: true }], ngImport: i0, template: `
|
|
77
|
+
@for (slot of parsedSlots(); track $index) {
|
|
78
|
+
@switch (slot.type) {
|
|
79
|
+
@case ('slot') {
|
|
80
|
+
<ng-container *ngTemplateOutlet="slot.template; context: slot.context" />
|
|
81
|
+
}
|
|
82
|
+
@default {
|
|
83
|
+
<ng-container>{{ slot.text }}</ng-container>
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
88
|
+
}
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslation, decorators: [{
|
|
90
|
+
type: Component,
|
|
91
|
+
args: [{
|
|
92
|
+
standalone: true,
|
|
93
|
+
imports: [NgTemplateOutlet],
|
|
94
|
+
selector: 'kbq-dynamic-translation',
|
|
95
|
+
template: `
|
|
96
|
+
@for (slot of parsedSlots(); track $index) {
|
|
97
|
+
@switch (slot.type) {
|
|
98
|
+
@case ('slot') {
|
|
99
|
+
<ng-container *ngTemplateOutlet="slot.template; context: slot.context" />
|
|
100
|
+
}
|
|
101
|
+
@default {
|
|
102
|
+
<ng-container>{{ slot.text }}</ng-container>
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
`,
|
|
107
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
108
|
+
}]
|
|
109
|
+
}] });
|
|
110
|
+
/**
|
|
111
|
+
* @docs-private
|
|
112
|
+
*/
|
|
113
|
+
class KbqDynamicTranslationHelper {
|
|
114
|
+
constructor() {
|
|
115
|
+
this.renderer = inject(Renderer2);
|
|
116
|
+
this.replaceableSlotContainers = viewChildren('replaceableSlotContainer');
|
|
117
|
+
this.slotsByName = new Map();
|
|
118
|
+
this.text = input.required();
|
|
119
|
+
this.slots = input.required();
|
|
120
|
+
effect(() => {
|
|
121
|
+
this.slotsByName.clear();
|
|
122
|
+
this.slots().forEach((slot) => this.slotsByName.set(slot.name, slot));
|
|
123
|
+
});
|
|
124
|
+
afterNextRender(() => {
|
|
125
|
+
this.replaceSlots();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
replaceSlots() {
|
|
129
|
+
this.replaceableSlotContainers().forEach(({ nativeElement }) => {
|
|
130
|
+
const slotName = nativeElement.getAttribute('data-slot-name');
|
|
131
|
+
const slotContent = nativeElement.getAttribute('data-slot-content');
|
|
132
|
+
const { tag, attributes } = this.slotsByName.get(slotName);
|
|
133
|
+
const elementToRender = this.renderer.createElement(tag);
|
|
134
|
+
this.renderer.appendChild(elementToRender, this.renderer.createText(slotContent));
|
|
135
|
+
attributes?.forEach(({ key, value }) => this.renderer.setAttribute(elementToRender, key, value));
|
|
136
|
+
nativeElement.replaceWith(elementToRender);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationHelper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
140
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: KbqDynamicTranslationHelper, isStandalone: true, selector: "kbq-dynamic-translation-with-dynamic-component-creation", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: true, transformFunction: null }, slots: { classPropertyName: "slots", publicName: "slots", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "replaceableSlotContainers", predicate: ["replaceableSlotContainer"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
141
|
+
<kbq-dynamic-translation [text]="text()">
|
|
142
|
+
@for (slot of slots(); track $index) {
|
|
143
|
+
<ng-container *kbqDynamicTranslationSlot="slot.name; let content">
|
|
144
|
+
<span
|
|
145
|
+
#replaceableSlotContainer
|
|
146
|
+
[attr.data-slot-name]="slot.name"
|
|
147
|
+
[attr.data-slot-content]="slot.content || content"
|
|
148
|
+
></span>
|
|
149
|
+
</ng-container>
|
|
150
|
+
}
|
|
151
|
+
</kbq-dynamic-translation>
|
|
152
|
+
`, isInline: true, dependencies: [{ kind: "component", type: KbqDynamicTranslation, selector: "kbq-dynamic-translation", inputs: ["text"] }, { kind: "directive", type: KbqDynamicTranslationSlot, selector: "[kbqDynamicTranslationSlot]", inputs: ["kbqDynamicTranslationSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
153
|
+
}
|
|
154
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationHelper, decorators: [{
|
|
155
|
+
type: Component,
|
|
156
|
+
args: [{
|
|
157
|
+
standalone: true,
|
|
158
|
+
imports: [KbqDynamicTranslation, KbqDynamicTranslationSlot],
|
|
159
|
+
selector: 'kbq-dynamic-translation-with-dynamic-component-creation',
|
|
160
|
+
template: `
|
|
161
|
+
<kbq-dynamic-translation [text]="text()">
|
|
162
|
+
@for (slot of slots(); track $index) {
|
|
163
|
+
<ng-container *kbqDynamicTranslationSlot="slot.name; let content">
|
|
164
|
+
<span
|
|
165
|
+
#replaceableSlotContainer
|
|
166
|
+
[attr.data-slot-name]="slot.name"
|
|
167
|
+
[attr.data-slot-content]="slot.content || content"
|
|
168
|
+
></span>
|
|
169
|
+
</ng-container>
|
|
170
|
+
}
|
|
171
|
+
</kbq-dynamic-translation>
|
|
172
|
+
`,
|
|
173
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
174
|
+
}]
|
|
175
|
+
}], ctorParameters: () => [] });
|
|
176
|
+
|
|
177
|
+
const COMPONENTS = [
|
|
178
|
+
KbqDynamicTranslationSlot,
|
|
179
|
+
KbqDynamicTranslationHelper,
|
|
180
|
+
KbqDynamicTranslation
|
|
181
|
+
];
|
|
182
|
+
class KbqDynamicTranslationModule {
|
|
183
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
184
|
+
/** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, imports: [KbqDynamicTranslationSlot,
|
|
185
|
+
KbqDynamicTranslationHelper,
|
|
186
|
+
KbqDynamicTranslation], exports: [KbqDynamicTranslationSlot,
|
|
187
|
+
KbqDynamicTranslationHelper,
|
|
188
|
+
KbqDynamicTranslation] }); }
|
|
189
|
+
/** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule }); }
|
|
190
|
+
}
|
|
191
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KbqDynamicTranslationModule, decorators: [{
|
|
192
|
+
type: NgModule,
|
|
193
|
+
args: [{
|
|
194
|
+
imports: COMPONENTS,
|
|
195
|
+
exports: COMPONENTS
|
|
196
|
+
}]
|
|
197
|
+
}] });
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Generated bundle index. Do not edit.
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
export { KbqDynamicTranslation, KbqDynamicTranslationHelper, KbqDynamicTranslationModule, KbqDynamicTranslationSlot };
|
|
204
|
+
//# sourceMappingURL=koobiq-components-dynamic-translation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koobiq-components-dynamic-translation.mjs","sources":["../../../packages/components/dynamic-translation/dynamic-translation.ts","../../../packages/components/dynamic-translation/module.ts","../../../packages/components/dynamic-translation/koobiq-components-dynamic-translation.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2,\n Signal,\n TemplateRef,\n viewChildren\n} from '@angular/core';\n\n/**\n * @docs-private\n */\ntype KbqDynamicTranslationParsedSlot = {\n type: 'text' | 'slot';\n template: TemplateRef<unknown> | null;\n context?: { $implicit: unknown };\n text?: string;\n};\n\n/**\n * @docs-private\n */\nexport interface KbqDynamicTranslationHelperSlot {\n name: string;\n tag: string;\n attributes?: { key: string; value: string }[];\n content?: string;\n}\n\n/**\n * Directive for defining a dynamic translation slot.\n */\n@Directive({\n standalone: true,\n selector: '[kbqDynamicTranslationSlot]'\n})\nexport class KbqDynamicTranslationSlot {\n /**\n * The name of the dynamic translation slot.\n */\n readonly name = input.required<string>({ alias: 'kbqDynamicTranslationSlot' });\n\n /**\n * @docs-private\n */\n readonly templateRef = inject(TemplateRef);\n}\n\n/**\n * Component for dynamic translation.\n */\n@Component({\n standalone: true,\n imports: [NgTemplateOutlet],\n selector: 'kbq-dynamic-translation',\n template: `\n @for (slot of parsedSlots(); track $index) {\n @switch (slot.type) {\n @case ('slot') {\n <ng-container *ngTemplateOutlet=\"slot.template; context: slot.context\" />\n }\n @default {\n <ng-container>{{ slot.text }}</ng-container>\n }\n }\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KbqDynamicTranslation {\n private readonly slots = contentChildren(KbqDynamicTranslationSlot);\n\n /**\n * The text which will be translated.\n */\n readonly text = input.required<string>();\n\n /**\n * @docs-private\n */\n protected readonly parsedSlots: Signal<KbqDynamicTranslationParsedSlot[]> = computed(() =>\n this.parseSlots(this.text(), this.slots())\n );\n\n private parseSlots(\n text: string,\n slots: ReadonlyArray<KbqDynamicTranslationSlot>\n ): KbqDynamicTranslationParsedSlot[] {\n const slotTemplatesByName = slots.reduce<Record<string, TemplateRef<unknown>>>((map, { name, templateRef }) => {\n const slotName = name();\n\n if (slotName) map[slotName] = templateRef;\n\n return map;\n }, {});\n const parsedSlots: KbqDynamicTranslationParsedSlot[] = [];\n const slotSelector = new RegExp(`\\\\[\\\\[(${Object.keys(slotTemplatesByName).join('|')})(?::(.+?))?\\\\]\\\\]`, 'g');\n let match: RegExpExecArray | null;\n let lastIndex = 0;\n\n while ((match = slotSelector.exec(text)) !== null) {\n const [slotMatch, slotName, slotText] = match;\n const [listMatch, listString] = new RegExp('^\\\\((.*?)\\\\)$', 'g').exec(slotText) ?? [];\n const textBeforeSlot = text.substring(lastIndex, +match.index);\n\n if (textBeforeSlot) {\n parsedSlots.push({ type: 'text', text: textBeforeSlot, template: null });\n }\n\n parsedSlots.push({\n type: 'slot',\n template: slotTemplatesByName[slotName] || null,\n context: { $implicit: listMatch && listString ? listString.split(',') : slotText }\n });\n\n lastIndex = match.index + slotMatch.length;\n }\n\n const textAfterLastSlot = text.substring(lastIndex);\n\n if (textAfterLastSlot) {\n parsedSlots.push({ type: 'text', text: textAfterLastSlot, template: null });\n }\n\n return parsedSlots;\n }\n}\n\n/**\n * @docs-private\n */\n@Component({\n standalone: true,\n imports: [KbqDynamicTranslation, KbqDynamicTranslationSlot],\n selector: 'kbq-dynamic-translation-with-dynamic-component-creation',\n template: `\n <kbq-dynamic-translation [text]=\"text()\">\n @for (slot of slots(); track $index) {\n <ng-container *kbqDynamicTranslationSlot=\"slot.name; let content\">\n <span\n #replaceableSlotContainer\n [attr.data-slot-name]=\"slot.name\"\n [attr.data-slot-content]=\"slot.content || content\"\n ></span>\n </ng-container>\n }\n </kbq-dynamic-translation>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KbqDynamicTranslationHelper {\n private readonly renderer = inject(Renderer2);\n private readonly replaceableSlotContainers = viewChildren<ElementRef<HTMLElement>>('replaceableSlotContainer');\n private readonly slotsByName = new Map<string, KbqDynamicTranslationHelperSlot>();\n\n readonly text = input.required<string>();\n\n readonly slots = input.required<KbqDynamicTranslationHelperSlot[]>();\n\n constructor() {\n effect(() => {\n this.slotsByName.clear();\n this.slots().forEach((slot) => this.slotsByName.set(slot.name, slot));\n });\n\n afterNextRender(() => {\n this.replaceSlots();\n });\n }\n\n private replaceSlots(): void {\n this.replaceableSlotContainers().forEach(({ nativeElement }: ElementRef<HTMLElement>) => {\n const slotName = nativeElement.getAttribute('data-slot-name')!;\n const slotContent = nativeElement.getAttribute('data-slot-content')!;\n const { tag, attributes } = this.slotsByName.get(slotName)!;\n const elementToRender = this.renderer.createElement(tag);\n\n this.renderer.appendChild(elementToRender, this.renderer.createText(slotContent));\n\n attributes?.forEach(({ key, value }) => this.renderer.setAttribute(elementToRender, key, value));\n\n nativeElement.replaceWith(elementToRender);\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqDynamicTranslation, KbqDynamicTranslationHelper, KbqDynamicTranslationSlot } from './dynamic-translation';\n\nconst COMPONENTS = [\n KbqDynamicTranslationSlot,\n KbqDynamicTranslationHelper,\n KbqDynamicTranslation\n];\n\n@NgModule({\n imports: COMPONENTS,\n exports: COMPONENTS\n})\nexport class KbqDynamicTranslationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|