@sd-angular/core 19.0.9 → 19.0.11
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 +21 -21
- package/assets/STYLE-GUIDE.md +19 -19
- package/assets/fonts/fonts.scss +115 -115
- package/assets/scss/core/scrollbar.scss +30 -30
- package/assets/scss/core/utilities/_grid.scss +25 -19
- package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +2 -4
- package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +2 -4
- package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +5 -6
- package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
- package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +1 -1
- package/components/form-generic/src/components/form-render/form-render.component.d.ts +4 -6
- package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
- package/components/form-generic/src/services/form-generic.service.d.ts +1 -3
- package/components/modal/src/modal.component.d.ts +1 -1
- package/components/tab-router/src/models/tab-router.model.d.ts +2 -1
- package/components/tab-router/src/services/tab-router.service.d.ts +0 -1
- package/components/table/src/components/command/desktop-command.component.d.ts +7 -7
- package/components/table/src/components/command/pipes/command.pipe.d.ts +1 -12
- package/components/table/src/components/command/pipes/filter.pipe.d.ts +1 -8
- package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +2 -1
- package/components/table/src/models/table-column.model.d.ts +3 -2
- package/components/table/src/pipes/selection-disabled.pipe.d.ts +1 -1
- package/components/table/src/services/config.service.d.ts +4 -5
- package/fesm2022/sd-angular-core-components-anchor.mjs +14 -14
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-avatar.mjs +2 -2
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-chart.mjs +40 -40
- package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-ckeditor-styles.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs +0 -1
- package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-editor.mjs +2 -2
- package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-form-generic.mjs +39 -68
- package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-inform.mjs +2 -2
- package/fesm2022/sd-angular-core-components-inform.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal-resizable.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-modal.mjs +2 -2
- package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-org-chart.mjs +2 -2
- package/fesm2022/sd-angular-core-components-org-chart.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-preview.mjs +4 -4
- package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-query-bar.mjs +10 -10
- package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-query-builder.mjs +2 -2
- package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-quick-action.mjs +2 -2
- package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-section.mjs +2 -2
- package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-side-drawer.mjs +2 -2
- package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-splitter.mjs +6 -6
- package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-stepper.mjs +2 -2
- package/fesm2022/sd-angular-core-components-stepper.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs +31 -26
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab.mjs +2 -2
- package/fesm2022/sd-angular-core-components-tab.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +53 -64
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tree.mjs +2 -2
- package/fesm2022/sd-angular-core-components-tree.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-view.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +0 -1
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date-range.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-datetime.mjs +4 -4
- package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-inline-text.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-color.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input-number.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-label.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-label.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +47 -14
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
- package/fesm2022/sd-angular-core-i18n.mjs.map +1 -1
- package/fesm2022/sd-angular-core-interceptors.mjs +0 -2
- package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-auth.mjs +14 -38
- package/fesm2022/sd-angular-core-modules-auth.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs +7 -14
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-permission.mjs +5 -12
- package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs +4 -12
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs +16 -21
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-docx.mjs +1 -8
- package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-excel.mjs +26 -19
- package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-license.mjs +5 -12
- package/fesm2022/sd-angular-core-services-license.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-notify.mjs +70 -87
- package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-storage.mjs +4 -12
- package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs +43 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core.mjs.map +1 -1
- package/forms/select/src/select-footer-action.directive.d.ts +5 -1
- package/forms/select/src/select.component.d.ts +4 -0
- package/modules/auth/guards/auth.guard.d.ts +2 -4
- package/modules/auth/guards/portal.guard.d.ts +2 -4
- package/modules/auth/services/auth.service.d.ts +3 -4
- package/modules/keycloak/htmls/auth-keycloak-error.html +54 -54
- package/modules/keycloak/htmls/silent-renew.html +7 -7
- package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +3 -5
- package/modules/permission/src/guards/permission.guard.d.ts +2 -5
- package/package.json +80 -80
- package/pipes/src/format-number.pipe.d.ts +1 -3
- package/sd-angular-core-19.0.11.tgz +0 -0
- package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +3 -3
- package/services/excel/src/lib/excel.service.d.ts +0 -1
- package/services/excel/src/lib/spreadsheet-formula-injection.util.d.ts +5 -0
- package/services/license/src/license.service.d.ts +2 -3
- package/services/notify/src/components/toast/toast.component.d.ts +9 -13
- package/services/notify/src/notify.service.d.ts +4 -5
- package/services/storage/src/storage.service.d.ts +3 -4
- package/utilities/extensions/index.d.ts +1 -0
- package/utilities/extensions/src/object.extension.d.ts +8 -0
- package/sd-angular-core-19.0.9.tgz +0 -0
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import { AfterViewInit,
|
|
1
|
+
import { AfterViewInit, OnDestroy, QueryList } from '@angular/core';
|
|
2
2
|
import { FormGroup } from '@angular/forms';
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
|
-
import { ISdFormGenericConfiguration } from '../../configurations';
|
|
5
4
|
import { SdFormRenderConfiguration } from '../../models';
|
|
6
5
|
import { SdFormGenericValidation } from '../../models/form-generic-validation.model';
|
|
7
6
|
import { LibItemComponent } from './components';
|
|
8
7
|
import * as i0 from "@angular/core";
|
|
9
8
|
export declare class SdFormRender implements OnDestroy, AfterViewInit {
|
|
10
9
|
#private;
|
|
11
|
-
private ref;
|
|
12
|
-
private formGenericConfiguration;
|
|
13
10
|
formRenderItems: QueryList<LibItemComponent>;
|
|
14
11
|
form: FormGroup;
|
|
15
12
|
configuration: SdFormRenderConfiguration;
|
|
@@ -28,11 +25,12 @@ export declare class SdFormRender implements OnDestroy, AfterViewInit {
|
|
|
28
25
|
key: string;
|
|
29
26
|
value: any;
|
|
30
27
|
}>;
|
|
31
|
-
|
|
28
|
+
private readonly ref;
|
|
29
|
+
private readonly formGenericConfiguration;
|
|
32
30
|
ngAfterViewInit(): void;
|
|
33
31
|
ngOnDestroy(): void;
|
|
34
32
|
upload: () => Promise<void>;
|
|
35
33
|
getValidationMessages: (alert: SdFormGenericValidation["alert"]) => Promise<string[] | undefined>;
|
|
36
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SdFormRender,
|
|
34
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SdFormRender, never>;
|
|
37
35
|
static ɵcmp: i0.ɵɵComponentDeclaration<SdFormRender, "sd-form-render", never, { "form": { "alias": "form"; "required": false; }; "_configuration": { "alias": "configuration"; "required": true; }; "_default": { "alias": "defaultEntity"; "required": false; }; "_entity": { "alias": "entity"; "required": false; }; "_properties": { "alias": "properties"; "required": false; }; "_viewed": { "alias": "viewed"; "required": false; }; }, {}, never, never, true, never>;
|
|
38
36
|
}
|
package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class SdFeelExpression {
|
|
|
12
12
|
private formGenericService;
|
|
13
13
|
modal?: SdModal;
|
|
14
14
|
form: FormGroup<{}>;
|
|
15
|
-
attributeOperators: Record<"string" | "number" | "boolean" | "
|
|
15
|
+
attributeOperators: Record<"string" | "number" | "boolean" | "values" | "datetime", {
|
|
16
16
|
value: import("@sd-angular/core/components/form-generic").Operator;
|
|
17
17
|
symbol?: string;
|
|
18
18
|
display: string;
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { SdSearch } from '@sd-angular/core/forms';
|
|
2
|
-
import { ISdFormGenericConfiguration } from '../configurations';
|
|
3
2
|
import { SdFormGenericArgs, SdFormGenericDefinitionHtml, SdFormGenericDefinitionSelection, SdFormGenericSelectionItem } from '../models';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
export declare class FormGenericService {
|
|
6
5
|
#private;
|
|
7
6
|
private readonly configuration;
|
|
8
|
-
constructor(configuration: ISdFormGenericConfiguration);
|
|
9
7
|
get selections(): (() => Promise<SdFormGenericDefinitionSelection[]>) | SdFormGenericDefinitionSelection<any, any>[] | (() => SdFormGenericDefinitionSelection<any, any>[]);
|
|
10
8
|
get tables(): import("@sd-angular/core/components/form-generic").SdFormGenericDefinitionTable<any>[];
|
|
11
9
|
getSelection: (valuesKey: string | undefined | null) => Promise<SdFormGenericDefinitionSelection | undefined>;
|
|
@@ -21,6 +19,6 @@ export declare class FormGenericService {
|
|
|
21
19
|
definitions: () => Promise<SdFormGenericDefinitionHtml[]>;
|
|
22
20
|
getContent: (template: string, query?: Record<string, any>) => Promise<string>;
|
|
23
21
|
};
|
|
24
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<FormGenericService,
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FormGenericService, never>;
|
|
25
23
|
static ɵprov: i0.ɵɵInjectableDeclaration<FormGenericService>;
|
|
26
24
|
}
|
|
@@ -15,7 +15,7 @@ export declare class SdModal {
|
|
|
15
15
|
width: import("@angular/core").InputSignalWithTransform<string, string | null | undefined>;
|
|
16
16
|
height: import("@angular/core").InputSignalWithTransform<string, string | null | undefined>;
|
|
17
17
|
view: import("@angular/core").InputSignalWithTransform<"dialog" | "bottom-sheet" | undefined, "dialog" | "bottom-sheet" | null | undefined>;
|
|
18
|
-
modalClass: import("@angular/core").InputSignalWithTransform<string |
|
|
18
|
+
modalClass: import("@angular/core").InputSignalWithTransform<string | Record<string, boolean> | string[], string | Record<string, boolean> | string[] | null | undefined>;
|
|
19
19
|
lazyLoadContent: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
20
20
|
hideClose: import("@angular/core").InputSignalWithTransform<boolean, boolean | "">;
|
|
21
21
|
disableBackdropClose: import("@angular/core").InputSignalWithTransform<boolean, boolean | "">;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Type } from '@angular/core';
|
|
1
|
+
import { InjectionToken, Type } from '@angular/core';
|
|
2
2
|
import { Color } from '@sdcorejs/utils/models';
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
4
|
export interface SdTabInfo {
|
|
@@ -19,3 +19,4 @@ export interface SdTab {
|
|
|
19
19
|
tabInfoChanges: Subject<SdTabInfo>;
|
|
20
20
|
beforeClose?: () => boolean | Promise<boolean>;
|
|
21
21
|
}
|
|
22
|
+
export declare const SD_TAB: InjectionToken<SdTab>;
|
|
@@ -13,7 +13,6 @@ export declare class SdTabRouterService {
|
|
|
13
13
|
currentTabChanges: BehaviorSubject<SdTab | undefined>;
|
|
14
14
|
newTabs: BehaviorSubject<SdTab | undefined>;
|
|
15
15
|
updateTabs: BehaviorSubject<SdTab | undefined>;
|
|
16
|
-
constructor();
|
|
17
16
|
addBuilder: (builder: SdTabComponentBuilder) => void;
|
|
18
17
|
get currentTab(): SdTab | undefined;
|
|
19
18
|
get currentKey(): string | null;
|
|
@@ -2,13 +2,13 @@ import { SdTableCommand } from '../../models/table-command.model';
|
|
|
2
2
|
import { SdTableItem } from '../../models/table-item.model';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class DesktopCommand {
|
|
5
|
-
autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
6
|
-
item: import("@angular/core").InputSignal<SdTableItem<any>>;
|
|
7
|
-
itemIndex: import("@angular/core").InputSignal<number>;
|
|
8
|
-
commands: import("@angular/core").InputSignal<SdTableCommand[] | null | undefined>;
|
|
9
|
-
itemKey: import("@angular/core").Signal<string>;
|
|
10
|
-
autoId: import("@angular/core").Signal<string>;
|
|
11
|
-
_commands: import("@angular/core").Signal<SdTableCommand[]>;
|
|
5
|
+
readonly autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
6
|
+
readonly item: import("@angular/core").InputSignal<SdTableItem<any>>;
|
|
7
|
+
readonly itemIndex: import("@angular/core").InputSignal<number>;
|
|
8
|
+
readonly commands: import("@angular/core").InputSignal<SdTableCommand[] | null | undefined>;
|
|
9
|
+
readonly itemKey: import("@angular/core").Signal<string>;
|
|
10
|
+
readonly autoId: import("@angular/core").Signal<string>;
|
|
11
|
+
readonly _commands: import("@angular/core").Signal<SdTableCommand[]>;
|
|
12
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<DesktopCommand, never>;
|
|
13
13
|
static ɵcmp: i0.ɵɵComponentDeclaration<DesktopCommand, "desktop-command", never, { "autoIdInput": { "alias": "autoId"; "required": false; "isSignal": true; }; "item": { "alias": "item"; "required": true; "isSignal": true; }; "itemIndex": { "alias": "itemIndex"; "required": true; "isSignal": true; }; "commands": { "alias": "commands"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
14
14
|
}
|
|
@@ -3,18 +3,7 @@ import { SdTableCommand } from '../../../models/table-command.model';
|
|
|
3
3
|
import { SdTableItem } from '../../../models/table-item.model';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* chứa `disabled`, `title`, `icon`, và `htmlTemplate` (khi command là child có
|
|
8
|
-
* htmlTemplate). Một lần gọi cho cả 4 truy vấn, template dùng `@let` để alias.
|
|
9
|
-
*
|
|
10
|
-
* Trước đây tách thành 3 pipe `commandDisable` / `commandTitle` / `commandIcon`.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* @let meta = item | command:cmd;
|
|
14
|
-
* <button [disabled]="meta.disabled" [matTooltip]="meta.title">
|
|
15
|
-
* <mat-icon>{{ meta.icon }}</mat-icon>
|
|
16
|
-
* <div [innerHTML]="meta.htmlTemplate"></div>
|
|
17
|
-
* </button>
|
|
6
|
+
* Resolves command metadata for the current row once, then lets the template reuse it with `@let`.
|
|
18
7
|
*/
|
|
19
8
|
export declare class CommandPipe implements PipeTransform {
|
|
20
9
|
#private;
|
|
@@ -3,14 +3,7 @@ import { SdTableCommand, SdTableCommandChildren, SdTableCommandNormal } from '..
|
|
|
3
3
|
import { SdTableItem } from '../../../models/table-item.model';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* cho từng row. Output dùng trực tiếp trong template không cần thêm pipe phụ.
|
|
8
|
-
*
|
|
9
|
-
* Đã rename từ `commandFilter` → `filter` sau khi gom toàn bộ pipe command vào
|
|
10
|
-
* `components/command/pipes/`.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* @let filteredCommands = item | filter:commands | async;
|
|
6
|
+
* Filters visible commands and pre-resolves icon, title, and stable key for the current row.
|
|
14
7
|
*/
|
|
15
8
|
export declare class CommandFilterPipe implements PipeTransform {
|
|
16
9
|
#private;
|
|
@@ -4,6 +4,7 @@ import { Operator } from '@sdcorejs/utils/models';
|
|
|
4
4
|
import { SdTableColumn } from '../../../models/table-column.model';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class ColumnFilterComponent {
|
|
7
|
+
#private;
|
|
7
8
|
autoIdInput: import("@angular/core").InputSignal<string | null | undefined>;
|
|
8
9
|
column: import("@angular/core").InputSignal<SdTableColumn>;
|
|
9
10
|
columnFilter: import("@angular/core").InputSignal<Record<string, any>>;
|
|
@@ -22,7 +23,7 @@ export declare class ColumnFilterComponent {
|
|
|
22
23
|
display: string;
|
|
23
24
|
}[]>;
|
|
24
25
|
operatorValues: Signal<Operator[]>;
|
|
25
|
-
items: Signal<any[] |
|
|
26
|
+
items: Signal<any[] | Signal<any[]> | SdSearch>;
|
|
26
27
|
constructor();
|
|
27
28
|
onFilterChange: () => void;
|
|
28
29
|
onFilterCommit: () => void;
|
|
@@ -45,6 +45,7 @@ interface SdTableColumnBase<T = any> {
|
|
|
45
45
|
filter?: {
|
|
46
46
|
disabled?: boolean;
|
|
47
47
|
default?: any;
|
|
48
|
+
onChange?: (value: any, column?: SdTableColumn<T>, columnFilter?: Record<string, any>) => void;
|
|
48
49
|
operator?: {
|
|
49
50
|
default?: Operator;
|
|
50
51
|
enable?: boolean;
|
|
@@ -66,7 +67,7 @@ interface SdTableColumnNumber<T = any> extends SdTableColumnBase<T> {
|
|
|
66
67
|
field: NestedKeyOf<T>;
|
|
67
68
|
type: 'number';
|
|
68
69
|
useBadge?: UseBadgeFunc<T>;
|
|
69
|
-
filter?: SdTableColumnBase['filter'] & {
|
|
70
|
+
filter?: SdTableColumnBase<T>['filter'] & {
|
|
70
71
|
type?: 'split-number';
|
|
71
72
|
};
|
|
72
73
|
}
|
|
@@ -83,7 +84,7 @@ interface SdTableColumnDate<T = any> extends SdTableColumnBase<T> {
|
|
|
83
84
|
field: NestedKeyOf<T>;
|
|
84
85
|
type: 'date' | 'datetime' | 'time';
|
|
85
86
|
useBadge?: UseBadgeFunc<T>;
|
|
86
|
-
filter?: SdTableColumnBase['filter'] & {
|
|
87
|
+
filter?: SdTableColumnBase<T>['filter'] & {
|
|
87
88
|
type?: 'daterange' | 'date' | 'split-date';
|
|
88
89
|
};
|
|
89
90
|
}
|
|
@@ -3,7 +3,7 @@ import { SdTableOptionSelector } from '../models/table-option-selector.model';
|
|
|
3
3
|
import { SdTableItem } from '../models/table-item.model';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class SdSelectionDisabledPipe implements PipeTransform {
|
|
6
|
-
transform: (selectedItems: SdTableItem[], rowData: SdTableItem
|
|
6
|
+
transform: <T>(selectedItems: SdTableItem<T>[], rowData: SdTableItem<T>, selection: SdTableOptionSelector<T>) => boolean;
|
|
7
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdSelectionDisabledPipe, never>;
|
|
8
8
|
static ɵpipe: i0.ɵɵPipeDeclaration<SdSelectionDisabledPipe, "selectionDisabled", true>;
|
|
9
9
|
}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { SdStorage
|
|
1
|
+
import { SdStorage } from '@sd-angular/core/services';
|
|
2
2
|
import { ConfiguredTable, ConfiguredTableResult } from '../models/table-option-config.model';
|
|
3
3
|
import { SdTableOption } from '../models/table-option.model';
|
|
4
4
|
import { ISdTableConfiguration } from '../configurations';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class ConfigService {
|
|
7
7
|
#private;
|
|
8
|
-
private storageService;
|
|
9
|
-
tableConfiguration: ISdTableConfiguration;
|
|
10
8
|
widthChange$: import("rxjs").Observable<{
|
|
11
9
|
field: string;
|
|
12
10
|
width: string;
|
|
13
11
|
}>;
|
|
14
|
-
|
|
12
|
+
private readonly storageService;
|
|
13
|
+
readonly tableConfiguration: ISdTableConfiguration | null;
|
|
15
14
|
loadConfiguredTable: (option: SdTableOption) => ConfiguredTable;
|
|
16
15
|
loadConfigurationResult: (option: SdTableOption, configuration: ConfiguredTable) => ConfiguredTableResult;
|
|
17
16
|
init: (tableOption: SdTableOption) => SdStorage<ConfiguredTable>;
|
|
18
17
|
persistColumnWidth: (field: string, width: string) => void;
|
|
19
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ConfigService,
|
|
18
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ConfigService, never>;
|
|
20
19
|
static ɵprov: i0.ɵɵInjectableDeclaration<ConfigService>;
|
|
21
20
|
}
|
|
@@ -77,10 +77,10 @@ class SdAnchor {
|
|
|
77
77
|
sidebarWidth = input('200px');
|
|
78
78
|
ellipsis = input(false, { transform: booleanAttribute });
|
|
79
79
|
overScroll = input(false, { transform: booleanAttribute });
|
|
80
|
-
// Mobile: default
|
|
81
|
-
// Consumer
|
|
80
|
+
// Mobile: default ?n nav (sidebar TOC chi?m ch? tr�n m�n h�nh h?p).
|
|
81
|
+
// Consumer truy?n `[hideNav]="false"` d? force hi?n tr�n mobile.
|
|
82
82
|
hideNav = input(BrowserUtilities.isMobile(), { transform: booleanAttribute });
|
|
83
|
-
//
|
|
83
|
+
// M�u highlight active nav (text + icon + vertical bar). Default 'primary'.
|
|
84
84
|
color = input('primary');
|
|
85
85
|
activeSectionId = signal('');
|
|
86
86
|
#initialized = false;
|
|
@@ -97,7 +97,7 @@ class SdAnchor {
|
|
|
97
97
|
this.#registerIntersectionObserver();
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
|
-
//
|
|
100
|
+
// L?ng nghe thay d?i sections d? dang k� l?i observe section
|
|
101
101
|
effect(() => {
|
|
102
102
|
this.sections();
|
|
103
103
|
if (!this.hideNav() && this.#initialized) {
|
|
@@ -108,24 +108,24 @@ class SdAnchor {
|
|
|
108
108
|
#registerIntersectionObserver() {
|
|
109
109
|
this.#cleanIntersectionObserver();
|
|
110
110
|
const wrapperEl = this.wrapper().nativeElement;
|
|
111
|
-
// Brower API IntersectionObserver
|
|
111
|
+
// Brower API IntersectionObserver s? h? tr? khi n�o 1 section du?c hi?n ra trong wrapperEl
|
|
112
112
|
this.#intersectionObserver = new IntersectionObserver(entries => {
|
|
113
113
|
for (const entry of entries) {
|
|
114
114
|
if (entry.isIntersecting) {
|
|
115
|
-
//
|
|
115
|
+
// N?u section m?i di v�o v�ng nh�n th?y -> add v�o set
|
|
116
116
|
this.#visibleSections.add(entry.target);
|
|
117
117
|
}
|
|
118
118
|
else {
|
|
119
|
-
//
|
|
119
|
+
// N?u section d� di ra kh?i v�ng nh�n th?y -> x�a kh?i Set
|
|
120
120
|
this.#visibleSections.delete(entry.target);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
-
//
|
|
123
|
+
// N?u dang scroll b?i click section th� return lu�n, k ph?i qu�t qua t�m v�ng section du?c active
|
|
124
124
|
if (this.#isClickScrolling) {
|
|
125
125
|
return;
|
|
126
126
|
}
|
|
127
127
|
for (const section of this.sections()) {
|
|
128
|
-
//
|
|
128
|
+
// Ki?m tra xem DOM c?a section n�o dang n?m trong danh s�ch dang nh�n th?y d? active ch�nh x�c
|
|
129
129
|
if (this.#visibleSections.has(section.elementRef.nativeElement)) {
|
|
130
130
|
if (this.activeSectionId() !== section.id) {
|
|
131
131
|
this.activeSectionId.set(section.id);
|
|
@@ -134,7 +134,7 @@ class SdAnchor {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
}, { root: wrapperEl, threshold: 0 });
|
|
137
|
-
//
|
|
137
|
+
// �ang k� theo d�i t?ng section c� trong anchor
|
|
138
138
|
for (const section of this.sections()) {
|
|
139
139
|
this.#intersectionObserver.observe(section.elementRef.nativeElement);
|
|
140
140
|
}
|
|
@@ -149,15 +149,15 @@ class SdAnchor {
|
|
|
149
149
|
this.#isClickScrolling = true;
|
|
150
150
|
const wrapperEl = this.wrapper().nativeElement;
|
|
151
151
|
const targetElement = targetSection.nativeElement;
|
|
152
|
-
const prevScrollTop = wrapperEl.scrollTop; //
|
|
153
|
-
const scrollTop = prevScrollTop + targetElement.getBoundingClientRect().top - wrapperEl.getBoundingClientRect().top; //
|
|
154
|
-
//
|
|
152
|
+
const prevScrollTop = wrapperEl.scrollTop; // Luu l?i v? tr� cu?n hi?n t?i c?a container
|
|
153
|
+
const scrollTop = prevScrollTop + targetElement.getBoundingClientRect().top - wrapperEl.getBoundingClientRect().top; // V? tr� section c?n scroll t?i
|
|
154
|
+
// �ang k� s? ki?n n?u d� du?c scroll xong
|
|
155
155
|
this.#clickScrollSubscription = fromEvent(wrapperEl, 'scrollend')
|
|
156
156
|
.pipe(take(1))
|
|
157
157
|
.subscribe(() => {
|
|
158
158
|
this.#isClickScrolling = false;
|
|
159
159
|
});
|
|
160
|
-
//
|
|
160
|
+
// N?u sectionTarget d� ? d�ng v? tr� (click nhung kh�ng scroll) th� sau #timeoutScrollFallback k�ch ho?t l?i IntersectionObserver
|
|
161
161
|
this.#timeoutId = setTimeout(() => {
|
|
162
162
|
if (wrapperEl.scrollTop === prevScrollTop) {
|
|
163
163
|
this.#isClickScrolling = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-nav/anchor-nav.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-nav/anchor-nav.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { IAnchorItem } from '../../models';\r\nimport { Utilities } from '@sdcorejs/utils/fns';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrls: ['./anchor-item.component.scss'],\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n // Stable key dùng cho data-autoId. Nếu không truyền thì fallback về uuid (không stable giữa các lần render).\r\n key = input<string | undefined>(undefined);\r\n id: string = Utilities.generateUuid();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section>\r\n <ng-content></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, computed, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Color } from '@sdcorejs/utils/models';\nimport { Subject, Subscription, debounceTime } from 'rxjs';\n\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\n\n@Component({\n selector: 'anchor-nav',\n templateUrl: './anchor-nav.component.html',\n styleUrl: './anchor-nav.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, MatIconModule],\n standalone: true,\n})\n// eslint-disable-next-line @angular-eslint/component-class-suffix\nexport class AnchorNav implements OnDestroy {\n sections = input.required<readonly SdAnchorItem[]>();\n activeSectionId = input<string>('');\n ellipsis = input<boolean>(false);\n sidebarWidth = input<string>('');\n // autoId được forward từ <sd-anchor>. Derive per-item autoId theo `key` của item (nếu có).\n parentAutoId = input<string | undefined | null>(undefined);\n color = input<Color>('primary');\n\n // CSS var binding cho active state — map SdColor → global token `--sd-{color}`.\n // SCSS đọc qua `var(--anchor-active-color)` cho border + text + icon.\n cssActiveVar = computed(() => `var(--sd-${this.color()})`);\n\n itemAutoId(section: SdAnchorItem): string | undefined {\n const parent = this.parentAutoId();\n const key = section.key();\n return parent && key ? `${parent}-${key}` : undefined;\n }\n\n clickSection = output<string>();\n\n #delay = 200;\n #clickSectionSubject = new Subject<string>();\n #subscription = new Subscription();\n\n constructor() {\n this.#subscription.add(\n this.#clickSectionSubject\n .pipe(debounceTime(this.#delay))\n .subscribe((id: string) => this.clickSection.emit(id))\n );\n }\n\n onClickSection = (id: string): void => {\n this.#clickSectionSubject.next(id);\n };\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n}\n","<div\r\n class=\"c-anchor-list\"\r\n [style.width]=\"sidebarWidth()\"\r\n [style.--anchor-active-color]=\"cssActiveVar()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n [attr.data-autoId]=\"itemAutoId(section)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n contentChildren,\r\n effect,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\r\nimport { Color } from '@sdcorejs/utils/models';\r\nimport { Subscription, fromEvent, take } from 'rxjs';\r\nimport { AnchorNav } from '../anchor-nav/anchor-nav.component';\r\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor',\r\n templateUrl: './anchor.component.html',\r\n styleUrls: ['./anchor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, AnchorNav],\r\n standalone: true,\r\n})\r\nexport class SdAnchor implements OnDestroy {\r\n wrapper = viewChild.required<ElementRef>('wrapper');\r\n sections = contentChildren(SdAnchorItem);\r\n\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `components-anchor-${this.autoIdInput()}` : undefined));\r\n\r\n sidebarWidth = input<string>('200px');\r\n ellipsis = input(false, { transform: booleanAttribute });\r\n overScroll = input(false, { transform: booleanAttribute });\r\n // Mobile: default ẩn nav (sidebar TOC chiếm chỗ trên màn hình hẹp).\r\n // Consumer truyền `[hideNav]=\"false\"` để force hiện trên mobile.\r\n hideNav = input(BrowserUtilities.isMobile(), { transform: booleanAttribute });\r\n // Màu highlight active nav (text + icon + vertical bar). Default 'primary'.\r\n color = input<Color>('primary');\r\n\r\n activeSectionId = signal<string>('');\r\n\r\n #initialized = false;\r\n #isClickScrolling = false;\r\n #clickScrollSubscription: Subscription | null = null;\r\n #intersectionObserver: IntersectionObserver | null = null;\r\n #visibleSections = new Set<Element>();\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n #timeoutScrollFallback = 200;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n this.#initialized = true;\r\n if (!this.hideNav()) {\r\n this.#registerIntersectionObserver();\r\n }\r\n });\r\n\r\n // Lắng nghe thay đổi sections để đăng ký lại observe section\r\n effect(() => {\r\n this.sections();\r\n if (!this.hideNav() && this.#initialized) {\r\n untracked(() => this.#registerIntersectionObserver());\r\n }\r\n });\r\n }\r\n\r\n #registerIntersectionObserver(): void {\r\n this.#cleanIntersectionObserver();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n\r\n // Brower API IntersectionObserver sẽ hỗ trợ khi nào 1 section được hiện ra trong wrapperEl\r\n this.#intersectionObserver = new IntersectionObserver(\r\n entries => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n // Nếu section mới đi vào vùng nhìn thấy -> add vào set\r\n this.#visibleSections.add(entry.target);\r\n } else {\r\n // Nếu section đã đi ra khỏi vùng nhìn thấy -> xóa khỏi Set\r\n this.#visibleSections.delete(entry.target);\r\n }\r\n }\r\n\r\n // Nếu đang scroll bởi click section thì return luôn, k phải quét qua tìm vùng section được active\r\n if (this.#isClickScrolling) {\r\n return;\r\n }\r\n\r\n for (const section of this.sections()) {\r\n // Kiểm tra xem DOM của section nào đang nằm trong danh sách đang nhìn thấy để active chính xác\r\n if (this.#visibleSections.has(section.elementRef.nativeElement)) {\r\n if (this.activeSectionId() !== section.id) {\r\n this.activeSectionId.set(section.id);\r\n }\r\n break;\r\n }\r\n }\r\n },\r\n { root: wrapperEl, threshold: 0 }\r\n );\r\n\r\n // Đăng ký theo dõi từng section có trong anchor\r\n for (const section of this.sections()) {\r\n this.#intersectionObserver.observe(section.elementRef.nativeElement);\r\n }\r\n }\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n this.activeSectionId.set(idSectionTarget);\r\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\r\n if (!targetSection) {\r\n return;\r\n }\r\n this.#cleanScrollSectionByClickObserver();\r\n this.#isClickScrolling = true;\r\n\r\n const wrapperEl = this.wrapper().nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n\r\n const prevScrollTop = wrapperEl.scrollTop; // Lưu lại vị trí cuộn hiện tại của container\r\n const scrollTop = prevScrollTop + targetElement.getBoundingClientRect().top - wrapperEl.getBoundingClientRect().top; // Vị trí section cần scroll tới\r\n\r\n // Đăng ký sự kiện nếu đã được scroll xong\r\n this.#clickScrollSubscription = fromEvent(wrapperEl, 'scrollend')\r\n .pipe(take(1))\r\n .subscribe(() => {\r\n this.#isClickScrolling = false;\r\n });\r\n\r\n // Nếu sectionTarget đã ở đúng vị trí (click nhưng không scroll) thì sau #timeoutScrollFallback kích hoạt lại IntersectionObserver\r\n this.#timeoutId = setTimeout(() => {\r\n if (wrapperEl.scrollTop === prevScrollTop) {\r\n this.#isClickScrolling = false;\r\n this.#clickScrollSubscription?.unsubscribe();\r\n }\r\n }, this.#timeoutScrollFallback);\r\n\r\n wrapperEl.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n }\r\n\r\n #cleanScrollSectionByClickObserver = (): void => {\r\n if (this.#timeoutId) {\r\n clearTimeout(this.#timeoutId);\r\n }\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n #cleanIntersectionObserver = (): void => {\r\n this.#intersectionObserver?.disconnect();\r\n this.#visibleSections.clear();\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#cleanScrollSectionByClickObserver();\r\n this.#cleanIntersectionObserver();\r\n }\r\n}\r\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !overScroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!hideNav()) {\r\n <div class=\"c-anchor-list\" [style.flex-basis]=\"sidebarWidth()\">\r\n <anchor-nav\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n [parentAutoId]=\"autoId()\"\r\n [color]=\"color()\"\r\n (clickSection)=\"scrollSectionByClick($event)\">\r\n </anchor-nav>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-anchor.mjs","sources":["../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-item/anchor-item.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor-nav/anchor-nav.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor-nav/anchor-nav.component.html","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.ts","../../../projects/sd-angular/components/anchor/src/components/anchor/anchor.component.html","../../../projects/sd-angular/components/anchor/sd-angular-core-components-anchor.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, effect, inject, input } from '@angular/core';\r\nimport { IAnchorItem } from '../../models';\r\nimport { Utilities } from '@sdcorejs/utils/fns';\r\n\r\n@Component({\r\n selector: 'sd-anchor-item',\r\n templateUrl: './anchor-item.component.html',\r\n styleUrl: './anchor-item.component.scss',\r\n imports: [CommonModule],\r\n standalone: true,\r\n})\r\nexport class SdAnchorItem implements IAnchorItem {\r\n title = input.required<string>();\r\n icon = input<string | undefined>();\r\n // Stable key dùng cho data-autoId. Nếu không truyền thì fallback về uuid (không stable giữa các lần render).\r\n key = input<string | undefined>(undefined);\r\n id: string = Utilities.generateUuid();\r\n elementRef = inject(ElementRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.title()) {\r\n this.elementRef.nativeElement.removeAttribute('title');\r\n }\r\n });\r\n }\r\n}\r\n","<section>\r\n <ng-content></ng-content>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, computed, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { Color } from '@sdcorejs/utils/models';\r\nimport { Subject, Subscription, debounceTime } from 'rxjs';\r\n\r\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'anchor-nav',\r\n templateUrl: './anchor-nav.component.html',\r\n styleUrl: './anchor-nav.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, MatIconModule],\r\n standalone: true,\r\n})\r\n// eslint-disable-next-line @angular-eslint/component-class-suffix\r\nexport class AnchorNav implements OnDestroy {\r\n sections = input.required<readonly SdAnchorItem[]>();\r\n activeSectionId = input<string>('');\r\n ellipsis = input<boolean>(false);\r\n sidebarWidth = input<string>('');\r\n // autoId được forward từ <sd-anchor>. Derive per-item autoId theo `key` của item (nếu có).\r\n parentAutoId = input<string | undefined | null>(undefined);\r\n color = input<Color>('primary');\r\n\r\n // CSS var binding cho active state — map SdColor → global token `--sd-{color}`.\r\n // SCSS đọc qua `var(--anchor-active-color)` cho border + text + icon.\r\n cssActiveVar = computed(() => `var(--sd-${this.color()})`);\r\n\r\n itemAutoId(section: SdAnchorItem): string | undefined {\r\n const parent = this.parentAutoId();\r\n const key = section.key();\r\n return parent && key ? `${parent}-${key}` : undefined;\r\n }\r\n\r\n clickSection = output<string>();\r\n\r\n #delay = 200;\r\n #clickSectionSubject = new Subject<string>();\r\n #subscription = new Subscription();\r\n\r\n constructor() {\r\n this.#subscription.add(\r\n this.#clickSectionSubject\r\n .pipe(debounceTime(this.#delay))\r\n .subscribe((id: string) => this.clickSection.emit(id))\r\n );\r\n }\r\n\r\n onClickSection = (id: string): void => {\r\n this.#clickSectionSubject.next(id);\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#subscription.unsubscribe();\r\n }\r\n}\r\n","<div\r\n class=\"c-anchor-list\"\r\n [style.width]=\"sidebarWidth()\"\r\n [style.--anchor-active-color]=\"cssActiveVar()\">\r\n @for (section of sections(); track section.id) {\r\n <div\r\n class=\"c-anchor-list-item\"\r\n [class.active]=\"section.id === activeSectionId()\"\r\n (click)=\"onClickSection(section.id)\"\r\n (keydown.enter)=\"onClickSection(section.id)\"\r\n [attr.data-autoId]=\"itemAutoId(section)\"\r\n tabindex=\"0\">\r\n @if (section.icon()) {\r\n <mat-icon class=\"c-anchor-list-item-icon\">{{ section.icon() }}</mat-icon>\r\n }\r\n <div class=\"c-anchor-list-item-text\" [class.ellipsis]=\"ellipsis()\">\r\n {{ section.title() }}\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n OnDestroy,\r\n afterNextRender,\r\n booleanAttribute,\r\n computed,\r\n contentChildren,\r\n effect,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\r\nimport { Color } from '@sdcorejs/utils/models';\r\nimport { Subscription, fromEvent, take } from 'rxjs';\r\nimport { AnchorNav } from '../anchor-nav/anchor-nav.component';\r\nimport { SdAnchorItem } from '../anchor-item/anchor-item.component';\r\n\r\n@Component({\r\n selector: 'sd-anchor',\r\n templateUrl: './anchor.component.html',\r\n styleUrl: './anchor.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, AnchorNav],\r\n standalone: true,\r\n})\r\nexport class SdAnchor implements OnDestroy {\r\n wrapper = viewChild.required<ElementRef>('wrapper');\r\n sections = contentChildren(SdAnchorItem);\r\n\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `components-anchor-${this.autoIdInput()}` : undefined));\r\n\r\n sidebarWidth = input<string>('200px');\r\n ellipsis = input(false, { transform: booleanAttribute });\r\n overScroll = input(false, { transform: booleanAttribute });\r\n // Mobile: default ?n nav (sidebar TOC chi?m ch? tr�n m�n h�nh h?p).\r\n // Consumer truy?n `[hideNav]=\"false\"` d? force hi?n tr�n mobile.\r\n hideNav = input(BrowserUtilities.isMobile(), { transform: booleanAttribute });\r\n // M�u highlight active nav (text + icon + vertical bar). Default 'primary'.\r\n color = input<Color>('primary');\r\n\r\n activeSectionId = signal<string>('');\r\n\r\n #initialized = false;\r\n #isClickScrolling = false;\r\n #clickScrollSubscription: Subscription | null = null;\r\n #intersectionObserver: IntersectionObserver | null = null;\r\n #visibleSections = new Set<Element>();\r\n #timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n #timeoutScrollFallback = 200;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n this.#initialized = true;\r\n if (!this.hideNav()) {\r\n this.#registerIntersectionObserver();\r\n }\r\n });\r\n\r\n // L?ng nghe thay d?i sections d? dang k� l?i observe section\r\n effect(() => {\r\n this.sections();\r\n if (!this.hideNav() && this.#initialized) {\r\n untracked(() => this.#registerIntersectionObserver());\r\n }\r\n });\r\n }\r\n\r\n #registerIntersectionObserver(): void {\r\n this.#cleanIntersectionObserver();\r\n const wrapperEl = this.wrapper().nativeElement;\r\n\r\n // Brower API IntersectionObserver s? h? tr? khi n�o 1 section du?c hi?n ra trong wrapperEl\r\n this.#intersectionObserver = new IntersectionObserver(\r\n entries => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n // N?u section m?i di v�o v�ng nh�n th?y -> add v�o set\r\n this.#visibleSections.add(entry.target);\r\n } else {\r\n // N?u section d� di ra kh?i v�ng nh�n th?y -> x�a kh?i Set\r\n this.#visibleSections.delete(entry.target);\r\n }\r\n }\r\n\r\n // N?u dang scroll b?i click section th� return lu�n, k ph?i qu�t qua t�m v�ng section du?c active\r\n if (this.#isClickScrolling) {\r\n return;\r\n }\r\n\r\n for (const section of this.sections()) {\r\n // Ki?m tra xem DOM c?a section n�o dang n?m trong danh s�ch dang nh�n th?y d? active ch�nh x�c\r\n if (this.#visibleSections.has(section.elementRef.nativeElement)) {\r\n if (this.activeSectionId() !== section.id) {\r\n this.activeSectionId.set(section.id);\r\n }\r\n break;\r\n }\r\n }\r\n },\r\n { root: wrapperEl, threshold: 0 }\r\n );\r\n\r\n // �ang k� theo d�i t?ng section c� trong anchor\r\n for (const section of this.sections()) {\r\n this.#intersectionObserver.observe(section.elementRef.nativeElement);\r\n }\r\n }\r\n\r\n scrollSectionByClick(idSectionTarget: string): void {\r\n this.activeSectionId.set(idSectionTarget);\r\n const targetSection = this.sections().find(s => s.id === idSectionTarget)?.elementRef;\r\n if (!targetSection) {\r\n return;\r\n }\r\n this.#cleanScrollSectionByClickObserver();\r\n this.#isClickScrolling = true;\r\n\r\n const wrapperEl = this.wrapper().nativeElement;\r\n const targetElement = targetSection.nativeElement;\r\n\r\n const prevScrollTop = wrapperEl.scrollTop; // Luu l?i v? tr� cu?n hi?n t?i c?a container\r\n const scrollTop = prevScrollTop + targetElement.getBoundingClientRect().top - wrapperEl.getBoundingClientRect().top; // V? tr� section c?n scroll t?i\r\n\r\n // �ang k� s? ki?n n?u d� du?c scroll xong\r\n this.#clickScrollSubscription = fromEvent(wrapperEl, 'scrollend')\r\n .pipe(take(1))\r\n .subscribe(() => {\r\n this.#isClickScrolling = false;\r\n });\r\n\r\n // N?u sectionTarget d� ? d�ng v? tr� (click nhung kh�ng scroll) th� sau #timeoutScrollFallback k�ch ho?t l?i IntersectionObserver\r\n this.#timeoutId = setTimeout(() => {\r\n if (wrapperEl.scrollTop === prevScrollTop) {\r\n this.#isClickScrolling = false;\r\n this.#clickScrollSubscription?.unsubscribe();\r\n }\r\n }, this.#timeoutScrollFallback);\r\n\r\n wrapperEl.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n }\r\n\r\n #cleanScrollSectionByClickObserver = (): void => {\r\n if (this.#timeoutId) {\r\n clearTimeout(this.#timeoutId);\r\n }\r\n this.#clickScrollSubscription?.unsubscribe();\r\n };\r\n\r\n #cleanIntersectionObserver = (): void => {\r\n this.#intersectionObserver?.disconnect();\r\n this.#visibleSections.clear();\r\n };\r\n\r\n ngOnDestroy(): void {\r\n this.#cleanScrollSectionByClickObserver();\r\n this.#cleanIntersectionObserver();\r\n }\r\n}\r\n","<div class=\"c-anchor-vertical\" [ngClass]=\"{ 'c-stop-scroll-propagation': !overScroll() }\" #wrapper>\r\n <div class=\"c-anchor-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (!hideNav()) {\r\n <div class=\"c-anchor-list\" [style.flex-basis]=\"sidebarWidth()\">\r\n <anchor-nav\r\n [sections]=\"sections()\"\r\n [ellipsis]=\"ellipsis()\"\r\n [sidebarWidth]=\"sidebarWidth()\"\r\n [activeSectionId]=\"activeSectionId()\"\r\n [parentAutoId]=\"autoId()\"\r\n [color]=\"color()\"\r\n (clickSection)=\"scrollSectionByClick($event)\">\r\n </anchor-nav>\r\n </div>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|