@libs-ui/services-grid-layout 0.2.357-19 → 0.2.357-21

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.
@@ -24,6 +24,7 @@ export declare class LibsUiGridLayoutService {
24
24
  private readonly editMode;
25
25
  /** tăng mỗi lần cây đổi — component con đọc để biết phải tính lại */
26
26
  private readonly version;
27
+ private readonly zoomLevel;
27
28
  /**
28
29
  * Signal chỉ đọc để nơi dùng theo dõi.
29
30
  *
@@ -35,6 +36,7 @@ export declare class LibsUiGridLayoutService {
35
36
  readonly IsEditMode: import("@angular/core").Signal<boolean>;
36
37
  /** tăng mỗi lần cây hoặc cấu hình đổi */
37
38
  readonly Version: import("@angular/core").Signal<number>;
39
+ readonly Zoom: import("@angular/core").Signal<number>;
38
40
  /**
39
41
  * trần số cấp container lồng nhau — canvas đọc để biết có cho chuyển thành container không */
40
42
  private maxContainerDepth;
@@ -116,8 +118,20 @@ export declare class LibsUiGridLayoutService {
116
118
  * @returns khối vừa tạo (kèm `id` vừa sinh), hoặc `undefined` khi không tìm thấy container.
117
119
  */
118
120
  addBlock(item: T_gridLayout_newNode, parentId?: string): T_gridLayout_node | undefined;
121
+ /**
122
+ * Thêm một khối tại toạ độ (col, row) cụ thể và tự động đẩy các khối va chạm xuống dưới.
123
+ */
124
+ insertBlockWithCollision(item: T_gridLayout_newNode, targetCol?: number, targetRow?: number, parentId?: string): T_gridLayout_node | undefined;
125
+ private readonly activeDragPayload;
126
+ /** Đặt payload khi bắt đầu kéo từ bên ngoài vào (ví dụ: palette, drawer) */
127
+ setDragPayload(payload: unknown): void;
128
+ /** Lấy payload đang kéo */
129
+ getDragPayload(): unknown;
130
+ /** Xoá payload khi kết thúc kéo */
131
+ clearDragPayload(): void;
119
132
  /** Xoá một khối. Xoá container là xoá cả ruột. Trả `false` khi không xoá được (vd khối gốc). */
120
133
  removeBlock(id: string): boolean;
134
+ get totalColumns(): number;
121
135
  /** Biến khối đơn thành CONTAINER — nội dung cũ thành khối con đầu tiên, không mất dữ liệu. */
122
136
  toContainer(id: string): boolean;
123
137
  /** Đưa CONTAINER về khối đơn — khối con được nâng lên cấp trên, không bị xoá. */
@@ -137,6 +151,31 @@ export declare class LibsUiGridLayoutService {
137
151
  findBlock(id: string): T_gridLayout_node | undefined;
138
152
  /** Tìm khối cha trực tiếp của một khối. */
139
153
  findParentBlock(id: string): T_gridLayout_node | undefined;
154
+ /**
155
+ * Đặt tỷ lệ thu phóng của canvas (kẹp giữa min và max).
156
+ *
157
+ * @param value Tỷ lệ (0.4 = 40%, 1.0 = 100%, 1.5 = 150%)
158
+ * @param persistKey Khóa localStorage để lưu lại (bỏ trống thì lấy từ config)
159
+ */
160
+ setZoom(value: number, persistKey?: string): void;
161
+ /** Phóng to thêm một bước (mặc định 0.05 tức 5%) */
162
+ zoomIn(step?: number, persistKey?: string): void;
163
+ /** Thu nhỏ bớt một bước (mặc định 0.05 tức 5%) */
164
+ zoomOut(step?: number, persistKey?: string): void;
165
+ /** Đặt lại tỷ lệ thu phóng gốc 100% (1.0) */
166
+ resetZoom(persistKey?: string): void;
167
+ /**
168
+ * Tự động tính toán và đặt tỷ lệ thu phóng để canvas vừa vặn với chiều rộng container.
169
+ *
170
+ * @param containerWidth Chiều rộng container đo được (px)
171
+ * @param stageWidth Chiều rộng chuẩn của canvas (mặc định 1668px)
172
+ * @param padding Khoảng cách lề hai bên (mặc định 48px)
173
+ * @param persistKey Khóa localStorage
174
+ * @returns Tỷ lệ thu phóng vừa tính
175
+ */
176
+ fitToScreen(containerWidth: number, stageWidth?: number, padding?: number, persistKey?: string): number;
177
+ /** Kiểm tra tính năng thu phóng có được cấu hình bật không */
178
+ isZoomConfigured(): boolean;
140
179
  /**
141
180
  * Cổng DUY NHẤT cho canvas của thư viện. Nơi dùng KHÔNG gọi tới đây.
142
181
  *
@@ -147,6 +186,13 @@ export declare class LibsUiGridLayoutService {
147
186
  get FunctionsControl(): {
148
187
  maxContainerDepth: () => number;
149
188
  containerPadding: () => number;
189
+ isZoomEnabled: () => boolean;
190
+ zoom: () => number;
191
+ setZoom: (v: number, key?: string) => void;
192
+ zoomIn: (step?: number, key?: string) => void;
193
+ zoomOut: (step?: number, key?: string) => void;
194
+ resetZoom: (key?: string) => void;
195
+ fitToScreen: (cW: number, sW?: number, pad?: number, key?: string) => number;
150
196
  gridsterOptions: (depth: number, cb?: () => void) => GridsterConfig;
151
197
  attachNode: (node: T_gridLayout_node, depth: number, host: ViewContainerRef) => void;
152
198
  detachNode: (nodeId: string) => void;
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './grid-layout.service';
2
2
  export * from './canvas/grid-layout-canvas.component';
3
3
  export * from './interfaces/grid-layout.interface';
4
+ export * from './defines/collision.define';
@@ -162,6 +162,30 @@ export type T_gridLayout_config = {
162
162
  allowOverlap?: boolean;
163
163
  /** trần số cấp container lồng nhau. Mặc định 1 (container không chứa container) */
164
164
  maxContainerDepth?: number;
165
+ /** Bật tính năng thu phóng (zoom) canvas. Mặc định false */
166
+ enableZoom?: boolean;
167
+ /** Tỷ lệ thu phóng ban đầu. Mặc định 1 (100%) */
168
+ initialZoom?: number;
169
+ /** Giới hạn thu phóng tối thiểu. Mặc định 0.4 (40%) */
170
+ zoomMin?: number;
171
+ /** Giới hạn thu phóng tối đa. Mặc định 1.5 (150%) */
172
+ zoomMax?: number;
173
+ /** Bước nhảy mỗi lần tăng/giảm thu phóng. Mặc định 0.05 (5%) */
174
+ zoomStep?: number;
175
+ /** Chiều rộng chuẩn của canvas stage, px. Mặc định 1668 */
176
+ stageWidth?: number;
177
+ /** Chiều cao tối thiểu của canvas stage, px. Mặc định 937 */
178
+ stageMinHeight?: number;
179
+ /** Khóa lưu tỷ lệ thu phóng vào localStorage (vd 'ocb_bi_canvas_zoom') */
180
+ storageKey?: string;
181
+ /** Tự động vừa màn hình khi tải trang lần đầu nếu khung nhìn nhỏ hơn stage. Mặc định true */
182
+ autoFitOnLoad?: boolean;
183
+ };
184
+ /** Lựa chọn tỷ lệ thu phóng trên menu dropdown */
185
+ export type T_gridLayout_zoomPreset = {
186
+ /** Khoá i18n, KHÔNG phải chữ hiển thị — template dịch qua `translate` pipe. */
187
+ label: string;
188
+ value: number;
165
189
  };
166
190
  /** Sự kiện thư viện bắn ra khi bố cục đổi */
167
191
  export type T_gridLayout_changeEvent = {
@@ -169,3 +193,71 @@ export type T_gridLayout_changeEvent = {
169
193
  /** khối vừa bị tác động; bỏ trống khi đổi diện rộng (sắp gọn, nạp lại) */
170
194
  nodeId?: string;
171
195
  };
196
+ /**
197
+ * Bối cảnh truyền vào `templateToolbar` — template tự vẽ thanh công cụ thay bộ nút mặc định.
198
+ *
199
+ * ```html
200
+ * <ng-template #toolbar let-node let-ctx="ctx">
201
+ * <libs_ui-components-buttons-button
202
+ * [classIconLeft]="'libs-ui-icon-remove'"
203
+ * (outClick)="ctx.remove()" />
204
+ * </ng-template>
205
+ * ```
206
+ */
207
+ export type T_gridLayout_toolbarContext = {
208
+ /** khối đang vẽ — dùng `let-node` trong template */
209
+ $implicit: T_gridLayout_node;
210
+ /** khối này là container (có ruột) hay khối đơn */
211
+ isContainer: boolean;
212
+ /** còn thêm được khối vào trong không (chưa chạm trần lồng cấp) */
213
+ canAddInside: boolean;
214
+ /** đổi được giữa khối đơn ↔ khối ghép không */
215
+ canToggleType: boolean;
216
+ /** gọi để thư viện phát `outRemoveNode` như khi bấm nút xoá mặc định */
217
+ remove: () => void;
218
+ /** gọi để thư viện phát `outAddBlockInside` */
219
+ addInside: () => void;
220
+ /** gọi để thư viện phát `outToggleType` */
221
+ toggleType: () => void;
222
+ };
223
+ /** Khung xem trước (ghost preview) khi kéo thẻ từ bên ngoài vào canvas */
224
+ export type T_gridLayout_dropGhost = {
225
+ col: number;
226
+ row: number;
227
+ cols: number;
228
+ rows: number;
229
+ pixelLeft: number;
230
+ pixelTop: number;
231
+ pixelWidth: number;
232
+ pixelHeight: number;
233
+ isInsideGroup: boolean;
234
+ targetParentId?: string;
235
+ groupTitle?: string;
236
+ cardTitle: string;
237
+ cardIconText?: string;
238
+ cardIconClass?: string;
239
+ hoveredGridster?: HTMLElement;
240
+ };
241
+ /** Sự kiện phát ra khi thả một thẻ mới từ bên ngoài vào canvas */
242
+ export type T_gridLayout_dropEvent = {
243
+ node: T_gridLayout_node;
244
+ parentId?: string;
245
+ col: number;
246
+ row: number;
247
+ cols: number;
248
+ rows: number;
249
+ rawEvent: DragEvent;
250
+ payload?: unknown;
251
+ };
252
+ /** Dữ liệu của thẻ kéo từ bên ngoài vào canvas */
253
+ export type T_gridLayout_externalDragPayload = {
254
+ kind?: string;
255
+ type?: string;
256
+ title?: string;
257
+ cols?: number;
258
+ rows?: number;
259
+ iconText?: string;
260
+ iconClass?: string;
261
+ data?: Record<string, unknown>;
262
+ [key: string]: unknown;
263
+ };
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@libs-ui/services-grid-layout",
3
- "version": "0.2.357-19",
3
+ "version": "0.2.357-21",
4
4
  "peerDependencies": {
5
5
  "@angular/core": "^18.2.0",
6
6
  "@angular/common": "^18.2.0",
7
7
  "gridster18": "npm:angular-gridster2@18.0.1",
8
8
  "rxjs": "~7.8.0",
9
- "@libs-ui/components-buttons-button": "0.2.357-19",
10
- "@libs-ui/utils": "0.2.357-19"
9
+ "@libs-ui/components-buttons-button": "0.2.357-21",
10
+ "@libs-ui/utils": "0.2.357-21"
11
11
  },
12
12
  "sideEffects": false,
13
13
  "module": "fesm2022/libs-ui-services-grid-layout.mjs",
package/tree.service.d.ts CHANGED
@@ -17,6 +17,10 @@ export declare class LibsUiGridLayoutTreeService {
17
17
  * @returns khối vừa tạo (kèm `id` vừa sinh), hoặc `undefined` khi không tìm thấy container.
18
18
  */
19
19
  addChild(root: T_gridLayout_node, parentId: string, item: T_gridLayout_newNode): T_gridLayout_node | undefined;
20
+ /**
21
+ * Thêm khối vào vị trí (x, y) cụ thể và tự động đẩy các khối va chạm xuống dưới.
22
+ */
23
+ insertWithCollision(root: T_gridLayout_node, parentId: string | undefined, item: T_gridLayout_newNode, targetCol?: number, targetRow?: number): T_gridLayout_node | undefined;
20
24
  /** Xoá một khối khỏi cây. Không cho xoá gốc. */
21
25
  removeById(root: T_gridLayout_node, id: string): boolean;
22
26
  /**