@libs-ui/components-spreadsheet 0.2.356-43
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 +3 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/libs-ui-components-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet.component.mjs +869 -0
- package/esm2022/spreadsheet.indicator.mjs +204 -0
- package/esm2022/spreadsheet.locale.mjs +67 -0
- package/esm2022/spreadsheet.numfmt.mjs +209 -0
- package/esm2022/spreadsheet.type.mjs +2 -0
- package/fesm2022/libs-ui-components-spreadsheet.mjs +1350 -0
- package/fesm2022/libs-ui-components-spreadsheet.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/package.json +38 -0
- package/spreadsheet.component.d.ts +178 -0
- package/spreadsheet.indicator.d.ts +123 -0
- package/spreadsheet.locale.d.ts +2 -0
- package/spreadsheet.numfmt.d.ts +24 -0
- package/spreadsheet.type.d.ts +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libs-ui-components-spreadsheet.mjs","sources":["../../../../../libs-ui/components/spreadsheet/src/spreadsheet.locale.ts","../../../../../libs-ui/components/spreadsheet/src/spreadsheet.numfmt.ts","../../../../../libs-ui/components/spreadsheet/src/spreadsheet.indicator.ts","../../../../../libs-ui/components/spreadsheet/src/spreadsheet.component.ts","../../../../../libs-ui/components/spreadsheet/src/spreadsheet.component.html","../../../../../libs-ui/components/spreadsheet/src/libs-ui-components-spreadsheet.ts"],"sourcesContent":["import { Tools } from '@univerjs/core';\nimport DesignEnUS from '@univerjs/design/lib/locale/en-US.json';\nimport DesignViVN from '@univerjs/design/lib/locale/vi-VN.json';\nimport DocsUIEnUS from '@univerjs/docs-ui/lib/locale/en-US.json';\nimport DocsUIViVN from '@univerjs/docs-ui/lib/locale/vi-VN.json';\nimport SheetsEnUS from '@univerjs/sheets/lib/locale/en-US.json';\nimport SheetsViVN from '@univerjs/sheets/lib/locale/vi-VN.json';\nimport SheetsFormulaUIEnUS from '@univerjs/sheets-formula-ui/lib/locale/en-US.json';\nimport SheetsFormulaUIViVN from '@univerjs/sheets-formula-ui/lib/locale/vi-VN.json';\nimport SheetsUIEnUS from '@univerjs/sheets-ui/lib/locale/en-US.json';\nimport SheetsUIViVN from '@univerjs/sheets-ui/lib/locale/vi-VN.json';\nimport UIEnUS from '@univerjs/ui/lib/locale/en-US.json';\nimport UIViVN from '@univerjs/ui/lib/locale/vi-VN.json';\n\n// Numfmt locale embedded directly — avoids TS module resolution issues with JSON in package exports\nconst sheetsNumfmtLocaleEn = {\n sheet: {\n numfmt: {\n percent: 'Percentage', title: 'Number format', numfmtType: 'Format types',\n cancel: 'Cancel', confirm: 'Confirm', general: 'General',\n accounting: 'Accounting', text: 'Text', number: 'Number',\n currency: 'Currency', date: 'Date', time: 'Time',\n thousandthPercentile: 'Thousands separator', preview: 'Preview',\n dateTime: 'Date and time', decimalLength: 'Decimal places',\n currencyType: 'Currency Symbol', moreFmt: 'Formats',\n financialValue: 'Financial value', roundingCurrency: 'Rounding up the currency',\n timeDuration: 'Duration Time', addDecimal: 'Increase decimal places',\n subtractDecimal: 'Decreasing decimal places', customFormat: 'Custom Format',\n // Additional keys from en-US.json\n negType: 'A negative number type',\n currencyDes: 'The currency format is used to represent general currency values. The accounting format aligns a column of values with decimal points.',\n accountingDes: 'The accounting number format aligns a column of values with currency symbols and decimal points.',\n dateType: 'Date Type',\n dateDes: 'The date format presents date and time series values as date values.',\n generalDes: 'The regular format does not contain any specific number format.',\n thousandthPercentileDes: 'The percentile format is used for the representation of ordinary numbers.',\n customFormatDes: 'Generate custom number formats based on existing formats.',\n },\n },\n};\n\n// Numfmt locale tiếng Việt — nhúng trực tiếp cùng lý do như bản en ở trên\nconst sheetsNumfmtLocaleVi = {\n sheet: {\n numfmt: {\n percent: 'Phần trăm', title: 'Định dạng số', numfmtType: 'Loại định dạng',\n cancel: 'Hủy bỏ', confirm: 'Xác nhận', general: 'Chung',\n accounting: 'Kế toán', text: 'Văn bản', number: 'Số',\n currency: 'Tiền tệ', date: 'Ngày', time: 'Thời gian',\n thousandthPercentile: 'Phân vị phần nghìn', preview: 'Xem trước',\n dateTime: 'Ngày giờ', decimalLength: 'Số chữ số thập phân',\n currencyType: 'Loại tiền tệ', moreFmt: 'Nhiều định dạng hơn',\n financialValue: 'Giá trị tài chính', roundingCurrency: 'Tiền tệ làm tròn',\n timeDuration: 'Thời lượng', addDecimal: 'Thêm chữ số thập phân',\n subtractDecimal: 'Giảm chữ số thập phân', customFormat: 'Định dạng tùy chỉnh',\n negType: 'Loại số âm',\n currencyDes: 'Định dạng tiền tệ được sử dụng để biểu thị các giá trị tiền tệ thông thường. Định dạng kế toán có thể căn chỉnh các giá trị trong một cột với dấu thập phân.',\n accountingDes: 'Định dạng số kế toán có thể căn chỉnh các ký hiệu tiền tệ và dấu thập phân trong một cột các giá trị.',\n dateType: 'Loại ngày',\n dateDes: 'Định dạng ngày biểu thị các giá trị chuỗi ngày và thời gian dưới dạng giá trị ngày.',\n generalDes: 'Định dạng chung không chứa bất kỳ định dạng số cụ thể nào.',\n thousandthPercentileDes: 'Định dạng phân vị phần nghìn được sử dụng để biểu thị các số thông thường.',\n customFormatDes: 'Tạo định dạng số tùy chỉnh dựa trên các định dạng hiện có.',\n },\n },\n};\n\nexport const univerLocaleEn = Tools.deepMerge(\n SheetsEnUS,\n DocsUIEnUS,\n SheetsUIEnUS,\n SheetsFormulaUIEnUS,\n sheetsNumfmtLocaleEn,\n UIEnUS,\n DesignEnUS,\n);\n\nexport const univerLocaleVi = Tools.deepMerge(\n SheetsViVN,\n DocsUIViVN,\n SheetsUIViVN,\n SheetsFormulaUIViVN,\n sheetsNumfmtLocaleVi,\n UIViVN,\n DesignViVN,\n);","import { getPatternPreview } from '@univerjs/sheets-numfmt';\nimport { Subscription, fromEvent } from 'rxjs';\n\nimport type { T_rangeSnapshot } from './spreadsheet.type';\n\n/**\n * Giá trị mẫu MẶC ĐỊNH để sinh preview = 2021-03-14 13:45:30 (Excel serial).\n * Chọn ngày 14 (>12) để phân biệt dd↔mm, giờ 13 để phân biệt 24h↔AM/PM, có cả giây.\n * CHỈ dùng khi ô đang chọn không có giá trị ngày hợp lệ — nếu có, ưu tiên giá trị THỰC của ô\n * để label option khớp đúng dữ liệu hiển thị trong cột (giống Excel).\n */\nconst SAMPLE_SERIAL = 44269 + 49530 / 86400;\n\n/**\n * Danh sách định dạng ngày/giờ kiểu Excel (ordered: Ngày → Ngày+Giờ → Giờ).\n * Label hiển thị cho người dùng là PREVIEW của SAMPLE (vd 'dd/mm/yyyy' → \"14/03/2021\"),\n * trực quan giống hộp \"Type\" của Excel; pattern thực được lưu ở data-pattern để áp.\n */\nconst CUSTOM_DATE_PATTERNS: string[] = [\n // ── Ngày ──\n 'dd/mm/yyyy',\n 'd/m/yyyy',\n 'dd/mm/yy',\n 'mm/dd/yyyy',\n 'yyyy-mm-dd',\n 'dd-mmm-yyyy',\n 'dd-mmm-yy',\n 'd mmmm yyyy',\n 'mmm yyyy',\n 'mmmm yyyy',\n 'dddd, d mmmm yyyy',\n // ── Ngày + giờ ──\n 'dd/mm/yyyy hh:mm',\n 'dd/mm/yyyy h:mm AM/PM',\n 'dd/mm/yyyy hh:mm:ss',\n 'yyyy-mm-dd hh:mm:ss',\n // ── Giờ ──\n 'hh:mm',\n 'hh:mm:ss',\n 'h:mm AM/PM',\n 'h:mm:ss AM/PM',\n 'mm:ss',\n '[h]:mm:ss',\n];\n\n/** Sinh chuỗi preview (giá trị mẫu đã format) cho 1 pattern; fallback về pattern nếu lỗi. */\nconst previewOf = (pattern: string, sample: number): string => {\n try {\n return getPatternPreview(pattern, sample).result || pattern;\n } catch {\n return pattern;\n }\n};\n\n/**\n * Re-assert highlight cho option đang chọn sau khi Univer re-render panel (React có thể xoá class).\n * Dựa trên cờ data-numfmt-selected (do setActive đặt) — không suy diễn từ DOM label.\n */\nexport const syncActiveNumfmtHighlight = () => {\n const panel = document.querySelector('.numfmt-panel');\n if (!panel) return;\n panel.querySelectorAll<HTMLElement>('.univer-numfmt-custom-item').forEach((item) => {\n item.classList.toggle('univer-numfmt-active', item.hasAttribute('data-numfmt-selected'));\n });\n};\n\n/**\n * Thay danh sách định dạng ngày mặc định của Univer bằng các option custom (CUSTOM_DATE_PATTERNS),\n * hiển thị dưới dạng PREVIEW trực quan. Univer render panel numfmt bằng React và không expose API\n * nên phải thao tác DOM trực tiếp.\n *\n * @param getSnapshot Lấy vùng chọn hiện tại (để áp numfmt).\n * @param executeCmd Chạy Univer command.\n * @param onPatternSelected Báo component pattern vừa chọn (Confirm) hoặc null (Cancel) để đồng bộ.\n * @param getActiveCellFormat Đọc pattern hiện tại của cell — dùng highlight option khớp khi mở.\n * @param clearPreview Xoá live-preview overlay của Univer để canvas vẽ đúng model ngay.\n * @param getSampleValue Lấy giá trị THỰC (serial) của ô đại diện để label preview khớp dữ liệu cột;\n * null → dùng SAMPLE_SERIAL mặc định.\n * @returns hàm cleanup (gỡ mọi listener) — gọi khi teardown hoặc trước lần inject mới.\n */\nexport const injectCustomDateFormats = (\n getSnapshot: () => T_rangeSnapshot | null,\n executeCmd: (cmdId: string, params: unknown) => void,\n onPatternSelected?: (pattern: string | null) => void,\n getActiveCellFormat?: () => string,\n clearPreview?: () => void,\n getSampleValue?: () => number | null,\n onConfirm?: () => void\n) => {\n const panel = document.querySelector<HTMLElement>('.numfmt-panel');\n if (!panel) return;\n\n // Guard: chỉ inject 1 lần / phiên (component xoá data-custom-dates khi đóng panel để reopen re-inject).\n const listContainer = panel.querySelector<HTMLElement>('ul.univer-select-list');\n if (!listContainer || listContainer.hasAttribute('data-custom-dates')) return;\n // Nhận diện panel Date theo 2 trường hợp:\n // 1. Univer vừa render list ngày GỐC (li dạng yyyy-mm-dd) — lần đầu chọn Type=Date.\n // 2. Univer TÁI DÙNG DOM panel cũ (reopen) → list đang chứa sẵn custom item của ta từ phiên trước.\n const hasUniverDateItems = Array.from(listContainer.querySelectorAll<HTMLElement>('li')).some((el) => /^\\d{4}[-/]\\d{2}[-/]\\d{2}$/.test(el.textContent?.trim() ?? ''));\n const hasOurItems = !!listContainer.querySelector('.univer-numfmt-custom-item');\n if (!hasUniverDateItems && !hasOurItems) return;\n\n listContainer.setAttribute('data-custom-dates', 'true');\n const itemTemplate = listContainer.querySelector<HTMLElement>('li');\n const defaultItems = Array.from(listContainer.children);\n\n const applyFormat = (pattern: string) => {\n const snap = getSnapshot();\n if (!snap) return;\n const values: { pattern: string; row: number; col: number }[] = [];\n const maxRow = Math.min(snap.endRow, snap.startRow + 499);\n for (let r = snap.startRow; r <= maxRow; r++) {\n for (let c = snap.startColumn; c <= snap.endColumn; c++) {\n values.push({ pattern, row: r, col: c });\n }\n }\n if (!values.length) return;\n executeCmd('sheet.command.numfmt.set.numfmt', { unitId: snap.unitId, subUnitId: snap.subUnitId, values });\n // Univer giữ live-preview overlay (NumfmtController._previewPattern) che hiển thị model của\n // vùng chọn khi panel mở. Ta đã ghi model trực tiếp nên phải xoá preview để canvas vẽ đúng ngay.\n clearPreview?.();\n };\n\n let pendingPattern: string | null = null;\n let activeItem: HTMLElement | null = null;\n\n const setActive = (item: HTMLElement) => {\n if (activeItem) {\n activeItem.classList.remove('univer-numfmt-active');\n activeItem.removeAttribute('data-numfmt-selected');\n }\n item.classList.add('univer-numfmt-active');\n item.setAttribute('data-numfmt-selected', 'true');\n activeItem = item;\n };\n\n const subs: Subscription[] = [];\n const cleanup = () => {\n subs.forEach((s) => s.unsubscribe());\n subs.length = 0;\n };\n\n // Nhận diện nút theo CLASS (không phụ thuộc ngôn ngữ): Univer render Confirm = button-primary,\n // Cancel = button-default. KHÔNG match theo text ('Confirm'/'Cancel') vì sẽ vỡ khi locale là tiếng Việt.\n const panelButtons = Array.from(panel.querySelectorAll<HTMLElement>('button'));\n const confirmBtn = panelButtons.find((b) => b.classList.contains('univer-button-primary'));\n const cancelBtn = panelButtons.find((b) => b.classList.contains('univer-button-default'));\n\n // Capture phase: chạy trước Univer handler. KHÔNG cleanup() trong handler vì Univer tái dùng DOM panel —\n // gỡ listener sẽ làm option không click được khi mở lại. cleanup chỉ chạy khi teardown thật.\n if (confirmBtn) {\n subs.push(\n fromEvent<MouseEvent>(confirmBtn, 'click', { capture: true }).subscribe(() => {\n // Đánh dấu Confirm → component GIỮ format. Cancel/X/click-ngoài KHÔNG gọi → mặc định revert.\n onConfirm?.();\n if (!pendingPattern) return;\n applyFormat(pendingPattern);\n onPatternSelected?.(pendingPattern);\n })\n );\n }\n\n if (cancelBtn) {\n subs.push(\n fromEvent<MouseEvent>(cancelBtn, 'click', { capture: true }).subscribe(() => {\n if (activeItem) {\n activeItem.classList.remove('univer-numfmt-active');\n activeItem.removeAttribute('data-numfmt-selected');\n activeItem = null;\n }\n // pendingPattern = null → component khôi phục numfmt gốc từng ô (xem close.numfmt.panel handler).\n pendingPattern = null;\n onPatternSelected?.(null);\n })\n );\n }\n\n for (const pattern of CUSTOM_DATE_PATTERNS) {\n const item = (itemTemplate ?? document.createElement('div')).cloneNode(false) as HTMLElement;\n // Khi reopen, itemTemplate là custom item cũ → xoá cờ highlight/selected sao chép theo để tránh stale.\n item.removeAttribute('data-numfmt-selected');\n item.classList.remove('univer-numfmt-active');\n item.textContent = previewOf(pattern, getSampleValue?.() ?? SAMPLE_SERIAL);\n item.dataset['pattern'] = pattern;\n item.style.cursor = 'pointer';\n item.classList.add('univer-numfmt-custom-item');\n\n subs.push(fromEvent<MouseEvent>(item, 'mousedown').subscribe((e) => e.preventDefault()));\n subs.push(\n fromEvent<MouseEvent>(item, 'click').subscribe((e) => {\n e.stopPropagation();\n setActive(item);\n pendingPattern = pattern;\n applyFormat(pattern);\n onPatternSelected?.(pattern);\n })\n );\n\n listContainer.appendChild(item);\n }\n\n defaultItems.forEach((el) => el.remove());\n\n /**\n * Đồng bộ panel theo vùng chọn HIỆN TẠI (getSnapshot/getActiveCellFormat/getSampleValue đọc fresh):\n * 1. Sinh lại label preview theo giá trị THỰC của ô đại diện cột mới (khớp dữ liệu, giống Excel).\n * 2. Highlight option khớp format hiện có; nếu cột chưa có format → chọn option ĐẦU TIÊN.\n * 3. ÁP LUÔN pattern đó lên cả vùng → dữ liệu đổi hiển thị ngay; set pending để Confirm giữ.\n * Gọi khi mở panel VÀ mỗi khi user đổi cột/cell trên grid lúc panel đang mở.\n * Cancel / X → component khôi phục giá trị gốc (originalCellFormats đã chụp/tích luỹ khi mở/đổi vùng).\n */\n const resync = () => {\n const sample = getSampleValue?.() ?? SAMPLE_SERIAL;\n const items = Array.from(listContainer.querySelectorAll<HTMLElement>('.univer-numfmt-custom-item'));\n items.forEach((el) => { el.textContent = previewOf(el.dataset['pattern'] ?? '', sample); });\n\n const activeFmt = (getActiveCellFormat?.() ?? '').toLowerCase();\n const matched = activeFmt && activeFmt !== 'general'\n ? items.find((el) => (el.dataset['pattern'] ?? '').toLowerCase() === activeFmt)\n : undefined;\n const initial = matched ?? items[0];\n if (!initial) return;\n setActive(initial);\n pendingPattern = initial.dataset['pattern'] ?? null;\n if (!pendingPattern) return;\n applyFormat(pendingPattern);\n onPatternSelected?.(pendingPattern);\n };\n\n resync();\n\n // Net chống race: nếu Univer set lại preview overlay NGAY SAU khi panel render (sau applyFormat ở trên),\n // xoá lần nữa sau 1 nhịp để canvas hiển thị numfmt THẬT của model. (applyFormat đã clearPreview đồng bộ.)\n setTimeout(() => clearPreview?.(), 60);\n\n return { cleanup, resync };\n};\n","import { BooleanNumber } from '@univerjs/core';\n\n/**\n * Mapping Indicators — đánh dấu (highlight) header của các cột đã được \"map\" theo\n * một nghiệp vụ bất kỳ, để người dùng nhìn thấy ngay cột nào đang gắn với field nào.\n *\n * Toàn bộ logic chạy trên workbook snapshot (plain JSON của Univer) — KHÔNG phụ thuộc\n * vào instance Univer đang chạy. Vì vậy có thể gọi trước khi load, hoặc trên data đã save.\n *\n * Cách dùng: tự định nghĩa 1 `T_mappingIndicatorConfig` (style, prefix, scope…) rồi\n * truyền vào cả `applyMappingIndicators` (để hiện) và `stripMappingIndicators` (để dọn\n * trước khi gửi server). Không cần viết lại logic highlight cho từng nghiệp vụ.\n */\n\n/** Một cột cần đánh dấu — chỉ cần biết sheet và vị trí cột (0-indexed). */\nexport type T_indicatorTarget = {\n sheetId: string;\n colIndex: number;\n};\n\n/** Định nghĩa style highlight (đúng shape style object của Univer). */\nexport type T_indicatorStyle = {\n /** Màu nền — vd `{ rgb: '#389E0D' }` */\n bg?: { rgb: string };\n /** Màu chữ — vd `{ rgb: '#FFFFFF' }` */\n cl?: { rgb: string };\n /** Bold */\n bl?: BooleanNumber;\n /** Horizontal align (0 left, 1 right, 2 center) */\n ht?: number;\n /** Vertical align (0 top, 1 bottom, 2 middle) */\n vt?: number;\n /** Font size */\n fs?: number;\n};\n\n/**\n * Cấu hình cách highlight cột đã map. MỌI field đều optional — lib có default sẵn\n * (xem `defaultMappingIndicatorConfig`), consumer chỉ override phần cần. Dùng chung cho\n * cả apply & strip để đảm bảo đối xứng (đánh dấu rồi gỡ đúng style/prefix đã thêm).\n */\nexport type T_mappingIndicatorConfig = {\n /** Key style đánh dấu cột đã map. Tự inject vào `styles` nếu chưa có. @default 'm' */\n mappedStyleId?: string;\n /** Định nghĩa style cho `mappedStyleId` — chỉ dùng khi cần inject lần đầu. @default xanh #389E0D, chữ trắng, bold */\n mappedStyle?: T_indicatorStyle;\n /** Key style header mặc định để revert về khi gỡ đánh dấu. @default 'h' */\n defaultHeaderStyleId?: string;\n /**\n * Phạm vi sheet xử lý (reset trước khi đánh dấu / dọn). Bỏ trống = đọc từ dữ liệu:\n * xử lý TẤT CẢ sheet có trong snapshot. Chỉ truyền khi muốn giới hạn để tối ưu.\n * @default mọi sheet trong snapshot\n */\n scopeSheetIds?: string[];\n /** Prefix icon thêm vào đầu header của cột đã map. @default '● ' */\n prefix?: string;\n /** Row index của header. @default 0 */\n headerRowIndex?: number;\n /** Tự co giãn width cột theo độ dài text (gồm prefix). @default true */\n autoResize?: boolean;\n /** Px trung bình mỗi ký tự khi auto-resize. @default 7.5 */\n charWidth?: number;\n /** Padding 2 bên (px) khi auto-resize. @default 16 */\n padding?: number;\n};\n\n/** Style mặc định cho cột đã map: nền xanh, chữ trắng, bold, canh giữa. */\nconst DEFAULT_MAPPED_STYLE: T_indicatorStyle = {\n bg: { rgb: '#389E0D' },\n cl: { rgb: '#FFFFFF' },\n bl: BooleanNumber.TRUE,\n ht: 2,\n vt: 2,\n fs: 11,\n};\n\n/**\n * Config mặc định của lib — consumer có thể dùng trực tiếp hoặc spread-override:\n * `{ ...defaultMappingIndicatorConfig(), prefix: '★ ' }`.\n */\nexport const defaultMappingIndicatorConfig = (): T_mappingIndicatorConfig => ({\n mappedStyleId: 'm',\n mappedStyle: { ...DEFAULT_MAPPED_STYLE },\n defaultHeaderStyleId: 'h',\n prefix: '● ',\n headerRowIndex: 0,\n autoResize: true,\n charWidth: 7.5,\n padding: 16,\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal types & helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype T_cell = { v?: unknown; s?: string };\ntype T_colData = Record<string, { w?: number }>;\ntype T_sheet = { cellData?: Record<string, Record<string, T_cell>>; columnData?: T_colData };\ntype T_sheetMap = Record<string, T_sheet>;\n\ntype T_resolvedOpts = {\n mappedStyleId: string;\n mappedStyle: T_indicatorStyle;\n defaultHeaderStyleId: string;\n prefix: string;\n headerRowKey: string;\n autoResize: boolean;\n charWidth: number;\n padding: number;\n};\n\nconst DEFAULT_PREFIX = '● ';\nconst DEFAULT_CHAR_W = 7.5;\nconst DEFAULT_PADDING = 16;\nconst DEFAULT_COL_W = 80;\nconst DEFAULT_MAPPED_STYLE_ID = 'm';\nconst DEFAULT_HEADER_STYLE_ID = 'h';\n\n/** Workbook snapshot là plain JSON — clone an toàn nhất bằng JSON. */\nconst cloneSnapshot = (snapshot: Record<string, unknown>): Record<string, unknown> =>\n JSON.parse(JSON.stringify(snapshot)) as Record<string, unknown>;\n\nconst resolveOpts = (config: T_mappingIndicatorConfig): T_resolvedOpts => ({\n mappedStyleId: config.mappedStyleId ?? DEFAULT_MAPPED_STYLE_ID,\n mappedStyle: config.mappedStyle ?? DEFAULT_MAPPED_STYLE,\n defaultHeaderStyleId: config.defaultHeaderStyleId ?? DEFAULT_HEADER_STYLE_ID,\n prefix: config.prefix ?? DEFAULT_PREFIX,\n headerRowKey: String(config.headerRowIndex ?? 0),\n autoResize: config.autoResize ?? true,\n charWidth: config.charWidth ?? DEFAULT_CHAR_W,\n padding: config.padding ?? DEFAULT_PADDING,\n});\n\nconst estimateWidth = (text: string, opts: T_resolvedOpts): number =>\n Math.ceil(text.length * opts.charWidth + opts.padding);\n\n/** Mở rộng width cột cho vừa text (không thu nhỏ hơn width hiện tại). */\nconst expandColWidth = (sheet: T_sheet, colKey: string, text: string, opts: T_resolvedOpts): void => {\n const colData = sheet.columnData;\n if (!colData) return;\n const current = colData[colKey]?.w ?? DEFAULT_COL_W;\n colData[colKey] = { ...(colData[colKey] ?? {}), w: Math.max(current, estimateWidth(text, opts)) };\n};\n\n/**\n * Dọn header row của 1 sheet: revert style về mặc định, xóa prefix, khôi phục width.\n * @param onlyMapped true → chỉ revert ô đang là `mappedStyleId`; false → revert mọi ô có style.\n */\nconst resetHeaderRow = (sheet: T_sheet | undefined, opts: T_resolvedOpts, onlyMapped: boolean): void => {\n const headerRow = sheet?.cellData?.[opts.headerRowKey];\n if (!headerRow || !sheet) return;\n for (const colKey of Object.keys(headerRow)) {\n const cell = headerRow[colKey];\n if (!cell) continue;\n if (onlyMapped) {\n if (cell.s === opts.mappedStyleId) cell.s = opts.defaultHeaderStyleId;\n } else if (cell.s) {\n cell.s = opts.defaultHeaderStyleId;\n }\n if (typeof cell.v === 'string' && cell.v.startsWith(opts.prefix)) {\n const original = cell.v.slice(opts.prefix.length);\n cell.v = original;\n if (opts.autoResize && sheet.columnData?.[colKey]) {\n sheet.columnData[colKey].w = estimateWidth(original, opts);\n }\n }\n }\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Đánh dấu header các cột đã map: gắn style `mappedStyleId`, thêm prefix icon và\n * (tùy chọn) tự nới width. Tự reset các sheet trong scope trước để mapping cũ không sót lại.\n *\n * @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.\n * @param targets Danh sách cột cần đánh dấu (`{ sheetId, colIndex }`).\n * @param config Cấu hình style / prefix / scope. Bỏ trống = dùng default của lib.\n */\nexport const applyMappingIndicators = (\n snapshot: Record<string, unknown>,\n targets: T_indicatorTarget[],\n config: T_mappingIndicatorConfig = {},\n): Record<string, unknown> => {\n const data = cloneSnapshot(snapshot);\n const opts = resolveOpts(config);\n\n const styles = data['styles'] as Record<string, unknown> | undefined;\n if (styles && !styles[opts.mappedStyleId]) {\n styles[opts.mappedStyleId] = { ...opts.mappedStyle };\n }\n\n const sheets = data['sheets'] as T_sheetMap | undefined;\n if (!sheets) return data;\n\n const scope = config.scopeSheetIds ?? Object.keys(sheets);\n for (const sheetId of scope) {\n resetHeaderRow(sheets[sheetId], opts, false);\n }\n\n for (const target of targets) {\n const sheet = sheets[target.sheetId];\n const cell = sheet?.cellData?.[opts.headerRowKey]?.[String(target.colIndex)];\n if (!cell || !sheet) continue;\n cell.s = opts.mappedStyleId;\n if (typeof cell.v === 'string' && !cell.v.startsWith(opts.prefix)) {\n const withIcon = `${opts.prefix}${cell.v}`;\n cell.v = withIcon;\n if (opts.autoResize) expandColWidth(sheet, String(target.colIndex), withIcon, opts);\n }\n }\n\n return data;\n};\n\n/**\n * Gỡ toàn bộ indicator ('m' → default style, xóa prefix, khôi phục width) khỏi snapshot\n * — dùng trước khi gửi workbook lên server để data sạch, không chứa style UI nội bộ.\n *\n * @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.\n * @param config Dùng chung config với `applyMappingIndicators` để gỡ đúng style/prefix.\n * Bỏ trống = dùng default của lib.\n */\nexport const stripMappingIndicators = (\n snapshot: Record<string, unknown>,\n config: T_mappingIndicatorConfig = {},\n): Record<string, unknown> => {\n const data = cloneSnapshot(snapshot);\n const opts = resolveOpts(config);\n\n const sheets = data['sheets'] as T_sheetMap | undefined;\n if (!sheets) return data;\n\n const scope = config.scopeSheetIds ?? Object.keys(sheets);\n for (const sheetId of scope) {\n resetHeaderRow(sheets[sheetId], opts, true);\n }\n\n return data;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Column structure change — remap mapping khi user insert / remove / move cột\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Mô tả 1 thao tác cấu trúc cột (do component phát qua `outColumnStructureChange`).\n * `count` đã gộp trường hợp chọn NHIỀU cột cùng lúc (range span).\n */\nexport type T_columnStructureChange = {\n /** Sheet xảy ra thao tác. */\n sheetId: string;\n /** Loại thao tác. */\n type: 'insert' | 'remove' | 'move';\n /** Cột bắt đầu bị tác động (0-indexed). Với `move` = cạnh trái khối nguồn. */\n startColumn: number;\n /** Số cột bị tác động (≥ 1; >1 khi chọn nhiều cột). */\n count: number;\n /** Cột đích (cạnh trái, toạ độ GỐC trước khi dời) — CHỈ có với `move`. */\n toColumn?: number;\n};\n\n/** Chuyển colIndex (0-based) → chữ cái cột kiểu Excel: 0→'A', 25→'Z', 26→'AA'… */\nexport const toColumnLetter = (index: number): string => {\n let letter = '';\n let n = index;\n do {\n letter = String.fromCharCode(65 + (n % 26)) + letter;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return letter;\n};\n\n/** Tính index mới của 1 cột sau thao tác; trả null nếu cột đó bị xóa. */\nconst shiftColumnIndex = (col: number, change: T_columnStructureChange): number | null => {\n const { type, startColumn: start, count } = change;\n if (type === 'insert') return col >= start ? col + count : col;\n if (type === 'remove') {\n if (col >= start && col < start + count) return null; // cột nằm trong vùng bị xóa\n return col >= start + count ? col - count : col;\n }\n // move: khối [start, start+count) chèn TRƯỚC toColumn (toạ độ gốc) = rút khối rồi chèn lại.\n const end = start + count;\n const dest = change.toColumn ?? start;\n const newStart = dest <= start ? dest : dest - count;\n if (col >= start && col < end) return newStart + (col - start); // cột thuộc khối di chuyển\n let shifted = col >= end ? col - count : col; // bước rút khối\n if (shifted >= newStart) shifted += count; // bước chèn lại\n return shifted;\n};\n\n/**\n * Remap colIndex của danh sách mapping theo 1 `T_columnStructureChange`.\n * - Item khác `sheetId` giữ nguyên.\n * - Item nằm trong vùng cột bị XÓA → loại khỏi kết quả.\n * - Các item còn lại được dịch index cho khớp vị trí mới.\n *\n * Tự cập nhật cả `colLetter` (nếu item có field này) cho khớp `colIndex` mới — consumer\n * không cần map lại thủ công.\n *\n * @example\n * this.mappings.update((list) => remapColumnIndexes(list, change));\n */\nexport const remapColumnIndexes = <T extends { sheetId: string; colIndex: number; colLetter?: string }>(\n items: T[],\n change: T_columnStructureChange,\n): T[] => {\n const result: T[] = [];\n for (const item of items) {\n if (item.sheetId !== change.sheetId) {\n result.push(item);\n continue;\n }\n const next = shiftColumnIndex(item.colIndex, change);\n if (next === null) continue;\n if (next === item.colIndex) {\n result.push(item);\n continue;\n }\n const updated: T = { ...item, colIndex: next };\n if (typeof item.colLetter === 'string') updated.colLetter = toColumnLetter(next);\n result.push(updated);\n }\n return result;\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, NgZone, OnDestroy, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\nimport { LocaleType, Univer, UniverInstanceType } from '@univerjs/core';\nimport type { CellValue, ICellData, IStyleData } from '@univerjs/core';\nimport { defaultTheme } from '@univerjs/design';\nimport { UniverDocsPlugin } from '@univerjs/docs';\nimport { UniverDocsUIPlugin } from '@univerjs/docs-ui';\nimport { UniverFormulaEnginePlugin } from '@univerjs/engine-formula';\nimport { UniverRenderEnginePlugin } from '@univerjs/engine-render';\nimport { FUniver } from '@univerjs/facade';\nimport { InsertColMutation, MoveColsMutation, RemoveColMutation, UniverSheetsPlugin } from '@univerjs/sheets';\nimport { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula';\nimport { UniverSheetsFormulaUIPlugin } from '@univerjs/sheets-formula-ui';\nimport { UniverSheetsNumfmtPlugin } from '@univerjs/sheets-numfmt';\nimport { UniverSheetsUIPlugin } from '@univerjs/sheets-ui';\nimport { UniverUIPlugin } from '@univerjs/ui';\nimport { univerLocaleEn, univerLocaleVi } from './spreadsheet.locale';\nimport { injectCustomDateFormats, syncActiveNumfmtHighlight } from './spreadsheet.numfmt';\nimport { applyMappingIndicators, stripMappingIndicators } from './spreadsheet.indicator';\nimport type { T_columnStructureChange, T_indicatorTarget, T_mappingIndicatorConfig } from './spreadsheet.indicator';\nimport type { T_cellFormatResult, T_rangeSnapshot, T_spreadsheet_locale, T_toolbar_menu_config } from './spreadsheet.type';\n\n// Bộ đếm tạo class scope duy nhất cho mỗi instance spreadsheet (dùng cho <style> chỉnh width toolbar).\nlet spreadsheetInstanceCount = 0;\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-spreadsheet',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './spreadsheet.component.html',\n styleUrl: './spreadsheet.component.scss',\n})\nexport class LibsUiComponentsSpreadsheetComponent implements AfterViewInit, OnDestroy {\n private univer: Univer | null = null;\n private univerAPI: FUniver | null = null;\n private columnClickDisposable: { dispose: () => void } | null = null;\n private formatDisposable: { dispose: () => void } | null = null;\n private columnOpDisposable: { dispose: () => void } | null = null;\n private numfmtObserver: MutationObserver | null = null;\n private toolbarResizeObserver: ResizeObserver | null = null;\n // <style> riêng cho instance: pin width container đo qua CSS rule (React re-render KHÔNG strip được →\n // tránh vòng lặp oscillation giữa set-inline-width và React strip gây kẹt ⋮). Xem registerToolbarWidthSync.\n private toolbarStyleEl: HTMLStyleElement | null = null;\n private readonly toolbarScopeClass = `libs-ui-spreadsheet-tb-${(spreadsheetInstanceCount += 1)}`;\n private numfmtClickDisposable: { dispose: () => void } | null = null;\n private lastRangeSnapshot: T_rangeSnapshot | null = null;\n private pendingNumfmtPattern: string | null = null;\n // true CHỈ khi user bấm nút Confirm trong panel numfmt → giữ format; Cancel/X/click-ngoài = false → revert.\n private numfmtConfirmed = false;\n // Snapshot numfmt từng ô của vùng chọn tại thời điểm mở panel — dùng khôi phục chính xác khi Cancel.\n private originalCellFormats: { pattern: string; row: number; col: number }[] | null = null;\n private numfmtPanelOpen = false;\n // true khi luồng Date custom đang hoạt động (đã inject option ngày). CHỈ khi đó component mới\n // can thiệp confirm/revert; các Type khác (Số, Tiền tệ, %, Text…) do Univer tự xử lý → không đụng vào.\n private numfmtDateActive = false;\n // Đồng bộ lại panel Date (label + highlight + auto-apply) theo vùng chọn mới khi user đổi cột lúc panel mở.\n private numfmtResync: (() => void) | null = null;\n private listenEnabled = false;\n private listenEnableTimer: ReturnType<typeof setTimeout> | null = null;\n // Defer initial empty-workbook init to allow parent's ngAfterViewInit to call loadData\n // first (cancelling the empty init), avoiding a race with Univer's async React renders.\n private pendingInitTimer: ReturnType<typeof setTimeout> | null = null;\n private numfmtCleanup: (() => void) | null = null;\n private pendingReadyCb: (() => void) | null = null;\n // Snapshot đã-decorate gần nhất — làm baseline để diff (style id ổn định 'h'/'m', không bị\n // ảnh hưởng bởi style id tự sinh sau mỗi facade setValue). Dùng cho re-apply incremental.\n private lastDecorated: Record<string, unknown> | null = null;\n private readyObserver: MutationObserver | null = null;\n // Cache controller numfmt nội bộ của Univer (giữ _previewPattern). Tìm 1 lần qua injector.\n // CONVENTION-EXCEPT: any — NumfmtController không export khỏi @univerjs/sheets-numfmt\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private numfmtController: any = null;\n\n private readonly activeCellFormat = signal('General');\n private readonly activeCellRef = signal('');\n private readonly showToolbar = signal(true);\n private readonly showSheetTabs = signal(true);\n // Ngôn ngữ đang hiển thị thực tế. Khởi tạo từ input `locale` trong ngAfterViewInit,\n // sau đó đổi runtime qua setLocale() (kéo theo reinit để Univer render lại UI).\n private readonly activeLocale = signal<T_spreadsheet_locale>('vi');\n\n /** Ngôn ngữ khởi tạo của spreadsheet. Đổi runtime dùng FunctionControl.setLocale(). */\n readonly locale = input<T_spreadsheet_locale>('vi');\n\n /** Cấu hình ẩn / vô hiệu hoá toolbar items. Thay đổi sẽ reinit toàn bộ Univer. */\n readonly toolbarMenuConfig = input<T_toolbar_menu_config>({\n // 'sheet.command.numfmt.set.currency': { hidden: true },\n // 'sheet.command.numfmt.add.decimal.command': { hidden: true },\n // 'sheet.command.numfmt.subtract.decimal.command': { hidden: true },\n // 'sheet.command.numfmt.set.percent': { hidden: true },\n 'sheet.command.set-once-format-painter': { hidden: true },\n 'sheet.command.set-text-rotation': { hidden: true },\n 'sheet.command.set-range-font-family': { hidden: true },\n 'sheet.command.set-border-basic': { hidden: true },\n 'sheet.command.add-worksheet-merge': { hidden: true },\n 'sheet.command.add-worksheet-merge-all': { hidden: true },\n 'sheet.command.add-worksheet-merge-vertical': { hidden: true },\n 'sheet.command.add-worksheet-merge-horizontal': { hidden: true },\n 'sheet.command.remove-worksheet-merge': { hidden: true },\n });\n\n /**\n * Cấu hình highlight cột đã map (style / prefix / scope sheet).\n * Truyền config này = \"bật\" luồng auto: component sẽ TỰ áp indicator khi load/reset,\n * TỰ gỡ khi save, và TỰ vẽ lại mỗi khi `mappingTargets` đổi. Bỏ trống = spreadsheet thường.\n */\n readonly mappingIndicatorConfig = input<T_mappingIndicatorConfig>();\n\n /** Danh sách cột cần highlight (`{ sheetId, colIndex }`). Đổi runtime → tự vẽ lại header. */\n readonly mappingTargets = input<T_indicatorTarget[]>([]);\n\n readonly outColumnDblClick = output<number>();\n\n /**\n * Phát khi user insert / remove / move cột (kể cả chọn nhiều cột, và cả undo/redo).\n * Consumer dùng `remapColumnIndexes(mappings, $event)` để dịch lại mảng mapping bên ngoài\n * cho khớp vị trí mới — tránh lệch khi chèn/xóa cột ở giữa.\n */\n readonly outColumnStructureChange = output<T_columnStructureChange>();\n\n private readonly containerRef = viewChild<ElementRef>('containerRef');\n private readonly ngZone = inject(NgZone);\n\n constructor() {\n // Auto re-apply: chỉ chạy khi đã bật config + Univer đã khởi tạo. Lần đầu (chưa init) tự bỏ qua.\n effect(() => {\n this.mappingTargets();\n this.mappingIndicatorConfig();\n untracked(() => this.reapplyIndicators());\n });\n }\n\n ngAfterViewInit() {\n this.activeLocale.set(this.locale());\n this.pendingInitTimer = setTimeout(() => {\n this.pendingInitTimer = null;\n this.initUniver(this.buildEmptyWorkbook());\n });\n }\n\n get FunctionControl() {\n return {\n loadData: (data: Record<string, unknown>) => this.loadData(data),\n saveData: () => this.saveData(),\n getActiveSheetInfo: () => this.getActiveSheetInfo(),\n getColumnNumfmt: (sheetId: string, colIndex: number) => this.getColumnNumfmt(sheetId, colIndex),\n extractAllColumnFormats: (snapshot: Record<string, unknown>) => this.extractAllColumnFormats(snapshot),\n toggleToolbar: () => this.toggleToolbar(),\n toggleSheetTabs: () => this.toggleSheetTabs(),\n reset: (data?: Record<string, unknown>) => this.reset(data),\n executeCommand: (commandId: string, params: unknown) => this.executeCommand(commandId, params),\n applyNumfmt: (row: number, col: number, numRows: number, numCols: number, pattern: string) => this.applyNumfmt(row, col, numRows, numCols, pattern),\n scheduleOnReady: (cb: () => void) => {\n this.pendingReadyCb = cb;\n },\n setLocale: (locale: T_spreadsheet_locale) => this.setLocale(locale),\n activeCellRef: this.activeCellRef,\n activeCellFormat: this.activeCellFormat,\n showToolbar: this.showToolbar,\n showSheetTabs: this.showSheetTabs,\n locale: this.activeLocale.asReadonly(),\n };\n }\n\n private setLocale(locale: T_spreadsheet_locale) {\n if (locale === this.activeLocale()) return;\n this.activeLocale.set(locale);\n this.reinitUniver();\n }\n\n private loadData(data: Record<string, unknown>) {\n const decorated = this.decorateSnapshot(data);\n if (this.pendingInitTimer !== null) {\n clearTimeout(this.pendingInitTimer);\n this.pendingInitTimer = null;\n this.initUniver(decorated);\n return;\n }\n this.destroyUniver();\n setTimeout(() => this.initUniver(decorated));\n }\n\n /** Snapshot thô từ Univer (CÓ thể còn indicator). Dùng nội bộ cho re-apply. */\n private saveRaw(): Record<string, unknown> {\n return (this.univerAPI?.getActiveWorkbook()?.save() ?? {}) as Record<string, unknown>;\n }\n\n /** Snapshot trả cho consumer — tự gỡ indicator nếu luồng auto đang bật. */\n private saveData(): Record<string, unknown> {\n const config = this.mappingIndicatorConfig();\n if (!config) return this.saveRaw();\n return stripMappingIndicators(this.saveRaw(), config);\n }\n\n /** Áp indicator vào snapshot trước khi load — chỉ khi luồng auto đang bật. Lưu baseline để diff. */\n private decorateSnapshot(data: Record<string, unknown>): Record<string, unknown> {\n const config = this.mappingIndicatorConfig();\n if (!config) return data;\n const decorated = applyMappingIndicators(data, this.mappingTargets(), config);\n this.lastDecorated = decorated;\n return decorated;\n }\n\n /**\n * Vẽ lại indicator KHÔNG reinit Univer: tính snapshot đích rồi CHỈ ghi đè đúng các ô header\n * khác so với baseline trước đó (style + prefix + width) lên instance live qua facade.\n * Diff theo baseline (style id ổn định 'h'/'m') → chỉ các cột vừa map/bỏ map mới được vẽ lại.\n */\n private reapplyIndicators() {\n const config = this.mappingIndicatorConfig();\n const wb = this.univerAPI?.getActiveWorkbook();\n const prev = this.lastDecorated;\n if (!config || !wb || !prev) return;\n\n const next = applyMappingIndicators(this.saveRaw(), this.mappingTargets(), config);\n this.lastDecorated = next;\n\n type T_cell = { v?: unknown; s?: unknown };\n type T_sheet = { cellData?: Record<string, Record<string, T_cell>>; columnData?: Record<string, { w?: number }> };\n const headerKey = String(config.headerRowIndex ?? 0);\n const headerRow = Number(headerKey);\n const stylesNext = (next['styles'] ?? {}) as Record<string, unknown>;\n const sheetsNext = (next['sheets'] ?? {}) as Record<string, T_sheet>;\n const sheetsPrev = (prev['sheets'] ?? {}) as Record<string, T_sheet>;\n\n for (const sheetId of Object.keys(sheetsNext)) {\n const ws = wb.getSheetBySheetId(sheetId);\n if (!ws) continue;\n const nextRow = sheetsNext[sheetId]?.cellData?.[headerKey] ?? {};\n const prevRow = sheetsPrev[sheetId]?.cellData?.[headerKey] ?? {};\n const colData = sheetsNext[sheetId]?.columnData ?? {};\n for (const colKey of Object.keys(nextRow)) {\n const cellNext = nextRow[colKey];\n const cellPrev = prevRow[colKey];\n // Ô không đổi cả value lẫn style → bỏ qua (mấu chốt: chỉ vẽ lại cột vừa map/bỏ map).\n if (!cellNext || (cellNext.v === cellPrev?.v && cellNext.s === cellPrev?.s)) continue;\n const style = (typeof cellNext.s === 'string' ? stylesNext[cellNext.s] : cellNext.s) as IStyleData;\n const cell: ICellData = { v: cellNext.v as CellValue, s: style };\n void ws.getRange(headerRow, Number(colKey)).setValue(cell);\n const width = colData[colKey]?.w;\n if (typeof width === 'number') void ws.setColumnWidth(Number(colKey), width);\n }\n }\n }\n\n private toggleToolbar() {\n this.showToolbar.update((v) => !v);\n this.reinitUniver();\n }\n\n private toggleSheetTabs() {\n this.showSheetTabs.update((v) => !v);\n this.reinitUniver();\n }\n\n private reset(data?: Record<string, unknown>) {\n this.destroyUniver();\n this.initUniver(this.decorateSnapshot(data ?? this.buildEmptyWorkbook()));\n }\n\n private executeCommand(commandId: string, params: unknown) {\n // CONVENTION-EXCEPT: any — FUniver.executeCommand không expose typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n void (this.univerAPI as any)?.executeCommand?.(commandId, params);\n }\n\n private applyNumfmt(row: number, col: number, numRows: number, numCols: number, pattern: string) {\n // CONVENTION-EXCEPT: any — FWorkbook.getId / FWorksheet.getSheetId not exposed in public types\n // Note: FRange.setNumberFormat() has a Univer facade bug — it builds `values` but never passes\n // them to executeCommand. We call the command directly with the correct params instead.\n // FWorkbook uses getId() (not getUnitId()) and FWorksheet uses getSheetId() for subUnitId.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wb = this.univerAPI?.getActiveWorkbook() as any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ws = wb?.getActiveSheet?.() as any;\n if (!wb || !ws) return;\n const unitId = (wb.getId?.() ?? '') as string;\n const subUnitId = (ws.getSheetId?.() ?? '') as string;\n const values: { pattern: string; row: number; col: number }[] = [];\n for (let r = row; r < row + numRows; r++) {\n for (let c = col; c < col + numCols; c++) {\n values.push({ pattern, row: r, col: c });\n }\n }\n this.executeCommand('sheet.command.numfmt.set.numfmt', { unitId, subUnitId, values });\n }\n\n private getActiveSheetInfo(): { sheetId: string; sheetName: string } | null {\n // CONVENTION-EXCEPT: any — FWorksheet public types chưa expose getSheetId/getName\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sheet = this.univerAPI?.getActiveWorkbook()?.getActiveSheet() as any;\n if (!sheet) return null;\n return {\n sheetId: (sheet.getSheetId?.() ?? '') as string,\n sheetName: (sheet.getSheetName?.() ?? sheet.getName?.() ?? '') as string,\n };\n }\n\n /** Đọc numfmt pattern của một cell từ workbook snapshot. */\n private readCellNumfmt(sheetId: string, row: number, col: number): string {\n try {\n // CONVENTION-EXCEPT: any — FWorkbook.save() không expose typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ss = this.univerAPI?.getActiveWorkbook()?.save() as any;\n type StyleEntry = { n?: { pattern?: string }; nf?: { pattern?: string } };\n const styles = ss?.styles as Record<string, StyleEntry> | undefined;\n const cells = (ss?.sheets as Record<string, { cellData?: Record<string, Record<string, { s?: string }>> }>)?.[sheetId]?.cellData;\n const styleId = cells?.[String(row)]?.[String(col)]?.s;\n if (!styleId || !styles) return 'General';\n return styles[styleId]?.n?.pattern ?? styles[styleId]?.nf?.pattern ?? 'General';\n } catch {\n return 'General';\n }\n }\n\n /** Đọc giá trị số (Excel serial) của một ô; null nếu ô rỗng/không phải số. */\n private readCellValue(sheetId: string, row: number, col: number): number | null {\n try {\n // CONVENTION-EXCEPT: any — FWorkbook.save() không expose typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ss = this.univerAPI?.getActiveWorkbook()?.save() as any;\n const cells = (ss?.sheets as Record<string, { cellData?: Record<string, Record<string, { v?: unknown }>> }>)?.[sheetId]?.cellData;\n const value = cells?.[String(row)]?.[String(col)]?.v;\n return typeof value === 'number' && isFinite(value) ? value : null;\n } catch {\n return null;\n }\n }\n\n private getColumnNumfmt(sheetId: string, colIndex: number): string {\n for (const row of [1, 2, 3]) {\n const pattern = this.readCellNumfmt(sheetId, row, colIndex);\n if (pattern !== 'General') return pattern;\n }\n return 'General';\n }\n\n /** Chụp numfmt gốc từng ô của vùng chọn (giới hạn 500 dòng như applyFormat) để Cancel khôi phục đúng. */\n private captureRangeNumfmt(snap: T_rangeSnapshot | null): { pattern: string; row: number; col: number }[] | null {\n if (!snap) return null;\n const values: { pattern: string; row: number; col: number }[] = [];\n const maxRow = Math.min(snap.endRow, snap.startRow + 499);\n for (let r = snap.startRow; r <= maxRow; r++) {\n for (let c = snap.startColumn; c <= snap.endColumn; c++) {\n values.push({ pattern: this.readCellNumfmt(snap.subUnitId, r, c), row: r, col: c });\n }\n }\n return values.length ? values : null;\n }\n\n private extractAllColumnFormats(snapshot: Record<string, unknown>): T_cellFormatResult[] {\n type StyleEntry = { n?: { pattern?: string }; nf?: { pattern?: string } };\n type StyleMap = Record<string, StyleEntry>;\n type SheetMap = Record<string, { name?: string; cellData?: Record<string, Record<string, { s?: string; v?: unknown }>> }>;\n\n const styles = snapshot['styles'] as StyleMap | undefined;\n const sheets = snapshot['sheets'] as SheetMap | undefined;\n const order = snapshot['sheetOrder'] as string[] | undefined;\n if (!styles || !sheets) return [];\n\n const results: T_cellFormatResult[] = [];\n const seen = new Set<string>();\n\n for (const sheetId of order ?? Object.keys(sheets)) {\n const sheetData = sheets[sheetId];\n if (!sheetData?.cellData) continue;\n\n const sheetName = sheetData.name ?? sheetId;\n const headerRow = sheetData.cellData['0'] ?? {};\n\n for (const rowKey of ['1', '2', '3']) {\n const row = sheetData.cellData[rowKey];\n if (!row) continue;\n\n for (const colKey of Object.keys(row)) {\n const key = `${sheetId}:${colKey}`;\n if (seen.has(key)) continue;\n\n const styleId = row[colKey]?.s;\n if (!styleId) continue;\n\n const pattern = styles[styleId]?.n?.pattern ?? styles[styleId]?.nf?.pattern;\n if (!pattern) continue;\n\n seen.add(key);\n const colIndex = parseInt(colKey, 10);\n const colLetter = this.toColLetter(colIndex);\n const headerV = headerRow[colKey]?.v;\n\n results.push({\n sheet: sheetName,\n col: colLetter,\n colIndex,\n header: headerV ? String(headerV) : colLetter,\n numfmt: pattern,\n });\n }\n }\n }\n return results;\n }\n\n private toColLetter(index: number): string {\n let result = '';\n let n = index;\n do {\n result = String.fromCharCode(65 + (n % 26)) + result;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return result;\n }\n\n private buildEmptyWorkbook(): Record<string, unknown> {\n return {\n id: 'workbook-default',\n locale: this.resolveLocaleType(),\n name: 'Sheet',\n sheetOrder: ['sheet1'],\n appVersion: '3.0.0-alpha',\n sheets: {\n sheet1: { id: 'sheet1', name: 'Sheet1', rowCount: 30, columnCount: 26, cellData: {} },\n },\n };\n }\n\n private resolveLocaleType(): LocaleType {\n return this.activeLocale() === 'vi' ? LocaleType.VI_VN : LocaleType.EN_US;\n }\n\n private registerColumnClickListener() {\n const wrapper = this.containerRef()?.nativeElement as HTMLElement | undefined;\n if (!wrapper) return;\n\n this.listenEnableTimer = setTimeout(() => {\n this.listenEnabled = true;\n }, 600);\n\n const handleDblClick = (event: MouseEvent) => {\n if (!this.listenEnabled) return;\n if ((event.target as HTMLElement).tagName !== 'CANVAS') return;\n\n setTimeout(() => {\n this.ngZone.run(() => {\n const range = this.univerAPI?.getActiveWorkbook()?.getActiveSheet()?.getActiveRange();\n if (!range) return;\n\n const { startRow, endRow, startColumn, rangeType } = range.getRange();\n const isColHeader = rangeType === 2 || (startRow === 0 && endRow >= 29);\n const isFirstRow = startRow === 0 && endRow === 0;\n\n if (!isColHeader && !isFirstRow) return;\n this.outColumnDblClick.emit(startColumn);\n });\n }, 50);\n };\n\n wrapper.addEventListener('dblclick', handleDblClick);\n this.columnClickDisposable = { dispose: () => wrapper.removeEventListener('dblclick', handleDblClick) };\n }\n\n /**\n * Lắng nghe MUTATION cột (insert/remove/move) — mức mutation để bắt cả undo/redo, một lần/thao tác.\n * Chuẩn hoá thành `T_columnStructureChange` rồi phát ra ngoài cho consumer remap mapping.\n */\n private registerColumnOpListener() {\n // CONVENTION-EXCEPT: any — FUniver.onCommandExecuted / commandInfo không expose trong public types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const api = this.univerAPI as any;\n if (typeof api?.onCommandExecuted !== 'function') return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.columnOpDisposable = api.onCommandExecuted((commandInfo: any) => {\n const change = this.toColumnStructureChange(commandInfo?.id, commandInfo?.params);\n if (change) this.ngZone.run(() => this.outColumnStructureChange.emit(change));\n });\n }\n\n private toColumnStructureChange(id: unknown, params: unknown): T_columnStructureChange | null {\n type T_range = { startColumn: number; endColumn: number };\n type T_colParams = { subUnitId?: string; range?: T_range; sourceRange?: T_range; targetRange?: T_range };\n const p = params as T_colParams | undefined;\n const sheetId = p?.subUnitId ?? '';\n\n if (id === InsertColMutation.id || id === RemoveColMutation.id) {\n if (!p?.range) return null;\n const type = id === InsertColMutation.id ? 'insert' : 'remove';\n return { sheetId, type, startColumn: p.range.startColumn, count: p.range.endColumn - p.range.startColumn + 1 };\n }\n if (id === MoveColsMutation.id) {\n if (!p?.sourceRange || !p?.targetRange) return null;\n return {\n sheetId,\n type: 'move',\n startColumn: p.sourceRange.startColumn,\n count: p.sourceRange.endColumn - p.sourceRange.startColumn + 1,\n toColumn: p.targetRange.startColumn,\n };\n }\n return null;\n }\n\n private registerFormatListener() {\n // CONVENTION-EXCEPT: any — FUniver.onCommandExecuted / commandInfo không expose trong public types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const api = this.univerAPI as any;\n if (typeof api?.onCommandExecuted !== 'function') return;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.formatDisposable = api.onCommandExecuted((commandInfo: any) => {\n this.ngZone.run(() => {\n if (commandInfo?.id === 'sheet.operation.open.numfmt.panel') {\n this.numfmtPanelOpen = true;\n this.numfmtConfirmed = false; // reset cờ — phiên mới mặc định chưa Confirm\n this.numfmtDateActive = false; // chưa chọn Type=Date → chưa kích hoạt luồng custom\n // Lưu numfmt gốc từng ô để Cancel khôi phục đúng (vùng chọn có thể nhiều format khác nhau)\n this.originalCellFormats = this.captureRangeNumfmt(this.lastRangeSnapshot);\n // Chỉ bật observer khi panel mở (tránh chạy liên tục theo mọi mutation toàn trang)\n this.numfmtObserver?.observe(document.body, { childList: true, subtree: true });\n // Reopen: Univer hiện lại panel cũ bằng CSS (không mutation) → observer không fire. Chủ động\n // thử inject sau 1 nhịp để bắt trường hợp list ngày đã sẵn trong DOM tái dùng.\n setTimeout(() => {\n if (this.numfmtPanelOpen) this.processNumfmtPanel();\n }, 60);\n return;\n }\n\n if (commandInfo?.id === 'sheet.operation.close.numfmt.panel') {\n this.numfmtPanelOpen = false;\n // Tắt observer khi đóng (perf). KHÔNG gỡ listener: Univer tái dùng DOM panel, gỡ sẽ làm\n // option chết khi mở lại. cleanup chạy trước lần inject mới (DOM mới) hoặc khi destroy.\n this.numfmtObserver?.disconnect();\n // Univer TÁI DÙNG DOM panel khi reopen (nhớ cả Type=Date) → guard data-custom-dates còn sót sẽ\n // chặn re-inject ở lần mở sau, khiến highlight stale + dateActive=false (mất revert). Xoá guard\n // để lần mở kế tiếp inject lại + resync highlight/auto-apply theo cột hiện tại.\n document.querySelector('.numfmt-panel ul.univer-select-list')?.removeAttribute('data-custom-dates');\n // Chỉ khi bấm CONFIRM (numfmtConfirmed=true) mới GIỮ pattern đã chọn cho cả vùng.\n // Cancel / X / click-ngoài đều KHÔNG set cờ → KHÔI PHỤC numfmt GỐC TỪNG Ô (đã chụp khi mở panel).\n const dateActive = this.numfmtDateActive;\n const confirmed = this.numfmtConfirmed;\n const pending = this.pendingNumfmtPattern;\n const originalCells = this.originalCellFormats;\n this.numfmtConfirmed = false;\n this.pendingNumfmtPattern = null;\n this.originalCellFormats = null;\n this.numfmtDateActive = false;\n\n // Type khác Date (Số/Tiền tệ/%/Text…) do Univer tự apply/cancel → KHÔNG can thiệp,\n // nếu không sẽ revert nhầm format mà user vừa áp qua luồng native của Univer.\n if (!dateActive) {\n this.clearNumfmtPreview();\n return;\n }\n\n const snap = this.lastRangeSnapshot;\n if (!snap) return;\n\n let values: { pattern: string; row: number; col: number }[];\n if (confirmed && pending) {\n values = [];\n for (let r = snap.startRow; r <= Math.min(snap.endRow, snap.startRow + 499); r++) {\n for (let c = snap.startColumn; c <= snap.endColumn; c++) {\n values.push({ pattern: pending, row: r, col: c });\n }\n }\n } else if (!confirmed && originalCells) {\n values = originalCells;\n } else {\n return;\n }\n if (!values.length) return;\n // CONVENTION-EXCEPT: any — FUniver.executeCommand không expose typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n void (this.univerAPI as any)?.executeCommand?.('sheet.command.numfmt.set.numfmt', {\n unitId: snap.unitId,\n subUnitId: snap.subUnitId,\n values,\n });\n this.clearNumfmtPreview();\n return;\n }\n\n // Khi panel đang mở: CHỈ user đổi vùng chọn trên grid (set-selections) mới được cập nhật snapshot\n // để re-target panel sang cột/cell mới. Command nội bộ panel (numfmt.set, mutation…) KHÔNG đụng snapshot.\n const isUserSelection = commandInfo?.id === 'sheet.operation.set-selections';\n if (this.numfmtPanelOpen && !isUserSelection) return;\n\n const wb = this.univerAPI?.getActiveWorkbook();\n const ws = wb?.getActiveSheet();\n const range = ws?.getActiveRange();\n if (!range || !wb || !ws) return;\n\n const rangeData = range.getRange();\n this.activeCellRef.set(`${this.toColLetter(rangeData.startColumn)}${rangeData.startRow + 1}`);\n\n // CONVENTION-EXCEPT: any — FWorkbook.getId / FWorksheet.getSheetId chưa expose trong types\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const wbAny = wb as any;\n const wsAny = ws as any;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n this.lastRangeSnapshot = {\n unitId: (wbAny.getId?.() ?? wbAny.getUnitId?.() ?? '') as string,\n subUnitId: (wsAny.getSheetId?.() ?? wsAny.getUnitId?.() ?? '') as string,\n startRow: rangeData.startRow,\n endRow: rangeData.endRow,\n startColumn: rangeData.startColumn,\n endColumn: rangeData.endColumn,\n };\n\n // CONVENTION-EXCEPT: any — FRange.getCellStyleData chưa expose trong types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rangeAny = range as any;\n const style = rangeAny.getCellStyleData?.();\n const numFmt = style?.n?.pattern ?? style?.nf?.pattern;\n this.activeCellFormat.set(numFmt && numFmt !== '0' ? numFmt : 'General');\n\n // User đổi vùng chọn LÚC panel Date đang mở → tích luỹ numfmt gốc của vùng mới (để Cancel\n // revert đúng mọi ô đã chạm) rồi đồng bộ lại panel (label + highlight + auto-apply) theo cột mới.\n if (this.numfmtPanelOpen && this.numfmtDateActive) {\n this.mergeOriginalCellFormats(this.captureRangeNumfmt(this.lastRangeSnapshot));\n this.numfmtResync?.();\n }\n });\n });\n }\n\n /** Gộp numfmt gốc của vùng vừa chọn vào snapshot revert, giữ giá trị GỐC ĐẦU TIÊN cho mỗi ô. */\n private mergeOriginalCellFormats(extra: { pattern: string; row: number; col: number }[] | null) {\n if (!extra) return;\n if (!this.originalCellFormats) {\n this.originalCellFormats = extra;\n return;\n }\n const seen = new Set(this.originalCellFormats.map((v) => `${v.row}:${v.col}`));\n for (const cell of extra) {\n if (seen.has(`${cell.row}:${cell.col}`)) continue;\n this.originalCellFormats.push(cell);\n }\n }\n\n /**\n * Xoá live-preview overlay của Univer numfmt panel.\n *\n * Khi panel numfmt mở, `NumfmtController._previewPattern` được Univer dùng để vẽ đè\n * (preview) lên hiển thị thật của vùng chọn. Vì các option date custom ghi numfmt\n * trực tiếp vào model (không đi qua panel gốc của Univer), preview này không bao giờ\n * khớp model → cột không đổi hiển thị ngay. Set `_previewPattern = null` + force re-render\n * (`_forceUpdate`) để canvas vẽ đúng giá trị model tức thì.\n *\n * NumfmtController không export khỏi `@univerjs/sheets-numfmt` nên phải tìm instance\n * qua injector của Univer (cache lại sau lần đầu).\n */\n private clearNumfmtPreview() {\n const controller = this.resolveNumfmtController();\n if (!controller) return;\n if (controller._previewPattern != null) controller._previewPattern = null;\n // LUÔN force re-render: numfmt vừa áp vào model cần vẽ lại canvas ngay (kể cả khi không có preview).\n controller._forceUpdate?.();\n }\n\n // CONVENTION-EXCEPT: any — truy cập injector + NumfmtController nội bộ của Univer (không có public API)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private resolveNumfmtController(): any {\n if (this.numfmtController) return this.numfmtController;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const injector = (this.univer as any)?.__getInjector?.();\n if (!injector) return null;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const scanMap = (map: unknown): any => {\n if (!(map instanceof Map)) return null;\n for (const value of map.values()) {\n const candidates = Array.isArray(value) ? value : [value];\n for (const candidate of candidates) {\n const instance = candidate?.instance !== undefined ? candidate.instance : candidate;\n if (instance && typeof instance === 'object' && '_previewPattern' in instance) return instance;\n }\n }\n return null;\n };\n\n // Các instance của redi nằm trong Map lồng 1 cấp (vd injector.resolvedDependencyCollection.resolvedDependencies)\n for (const key of Object.keys(injector)) {\n const value = injector[key];\n let found = scanMap(value);\n if (!found && value && typeof value === 'object') {\n for (const nestedKey of Object.keys(value)) {\n found = scanMap(value[nestedKey]);\n if (found) break;\n }\n }\n if (found) {\n this.numfmtController = found;\n return found;\n }\n }\n return null;\n }\n\n /**\n * Tạo observer để inject option ngày custom + highlight khi panel numfmt render.\n * Observer CHỈ được bật/tắt theo vòng đời panel (xem open/close.numfmt.panel handler) để\n * không chạy liên tục theo mọi mutation DOM toàn trang.\n */\n private registerNumfmtDropdownObserver() {\n this.numfmtObserver = new MutationObserver(() => this.processNumfmtPanel());\n }\n\n /**\n * Thử inject option ngày custom + highlight cho panel numfmt hiện tại.\n * Gọi từ 2 nguồn: (1) MutationObserver khi Univer render list ngày; (2) trực tiếp lúc mở panel —\n * vì Univer TÁI DÙNG DOM panel khi reopen (hiện lại bằng CSS, không phát sinh mutation) nên observer\n * không kích hoạt, phải chủ động gọi để re-inject + resync theo cột hiện tại.\n */\n private processNumfmtPanel() {\n syncActiveNumfmtHighlight();\n const result = injectCustomDateFormats(\n () => this.lastRangeSnapshot,\n // CONVENTION-EXCEPT: any — FUniver.executeCommand không expose typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (cmdId, params) => void (this.univerAPI as any).executeCommand?.(cmdId, params),\n (pattern) => {\n this.pendingNumfmtPattern = pattern;\n },\n () => {\n const snap = this.lastRangeSnapshot;\n if (!snap) return this.activeCellFormat();\n // Quét vài dòng đầu của vùng chọn, bỏ qua header/General để lấy format ĐẠI DIỆN của dữ liệu.\n // Khi chọn cả cột, startRow = 0 là header (thường General) → nếu chỉ đọc dòng đó sẽ highlight sai option.\n const maxScan = Math.min(snap.endRow, snap.startRow + 4);\n for (let r = snap.startRow; r <= maxScan; r++) {\n const fmt = this.readCellNumfmt(snap.subUnitId, r, snap.startColumn);\n if (fmt !== 'General') return fmt;\n }\n return this.activeCellFormat();\n },\n () => this.clearNumfmtPreview(),\n () => {\n // Giá trị thực của ô đại diện (dòng dữ liệu đầu có số) → label option khớp dữ liệu cột.\n const snap = this.lastRangeSnapshot;\n if (!snap) return null;\n const maxScan = Math.min(snap.endRow, snap.startRow + 4);\n for (let r = snap.startRow; r <= maxScan; r++) {\n const value = this.readCellValue(snap.subUnitId, r, snap.startColumn);\n if (value !== null) return value;\n }\n return null;\n },\n () => {\n this.numfmtConfirmed = true;\n }\n );\n // result chỉ truthy khi THỰC SỰ inject trên 1 listContainer Date mới (guard data-custom-dates chặn\n // các lần gọi thừa). Gỡ listener của lần inject trước trước khi giữ cleanup mới → tránh tích tụ.\n // Đồng thời lưu resync để re-target panel khi user đổi cột, và đánh dấu luồng Date đang hoạt động.\n if (result) {\n this.numfmtCleanup?.();\n this.numfmtCleanup = result.cleanup;\n this.numfmtResync = result.resync;\n this.numfmtDateActive = true;\n }\n }\n\n private initUniver(data: Record<string, unknown>) {\n const wrapper = this.containerRef()?.nativeElement as HTMLElement | undefined;\n if (!wrapper) return;\n\n wrapper.replaceChildren();\n const container = document.createElement('div');\n container.style.cssText = 'width:100%;height:100%';\n wrapper.appendChild(container);\n\n const univer = new Univer({\n locale: this.resolveLocaleType(),\n locales: {\n [LocaleType.EN_US]: univerLocaleEn,\n [LocaleType.VI_VN]: univerLocaleVi,\n },\n theme: defaultTheme,\n });\n this.univer = univer;\n\n univer.registerPlugin(UniverRenderEnginePlugin);\n univer.registerPlugin(UniverFormulaEnginePlugin);\n univer.registerPlugin(UniverUIPlugin, { container, header: this.showToolbar(), footer: this.showSheetTabs() });\n univer.registerPlugin(UniverDocsPlugin, { hasScroll: false });\n univer.registerPlugin(UniverDocsUIPlugin);\n univer.registerPlugin(UniverSheetsPlugin);\n univer.registerPlugin(UniverSheetsUIPlugin, { menu: this.toolbarMenuConfig() });\n univer.registerPlugin(UniverSheetsNumfmtPlugin);\n univer.registerPlugin(UniverSheetsFormulaPlugin);\n univer.registerPlugin(UniverSheetsFormulaUIPlugin);\n univer.createUnit(UniverInstanceType.UNIVER_SHEET, data);\n\n this.univerAPI = FUniver.newAPI(univer);\n if (this.pendingReadyCb) {\n // Wait for .more-numfmt-type to appear in DOM — this signals that UniverSheetsUIPlugin\n // has fully rendered the toolbar and UniverSheetsNumfmtPlugin's INumfmtModel is ready.\n const wrapper = this.containerRef()?.nativeElement as HTMLElement | undefined;\n if (wrapper) {\n this.readyObserver = new MutationObserver(() => {\n if (!wrapper.querySelector('.more-numfmt-type')) return;\n this.readyObserver?.disconnect();\n this.readyObserver = null;\n const cb = this.pendingReadyCb;\n this.pendingReadyCb = null;\n cb?.();\n });\n this.readyObserver.observe(wrapper, { childList: true, subtree: true });\n }\n }\n this.registerColumnClickListener();\n this.registerColumnOpListener();\n this.registerFormatListener();\n this.registerNumfmtDropdownObserver();\n this.registerToolbarWidthSync();\n this.registerNumfmtClickInterceptor();\n }\n\n /**\n * Khắc phục lỗi toolbar collapse sai (gom item vào menu ⋮ dù còn khoảng trắng).\n *\n * Univer (component Ribbon) quyết định overflow bằng 1 container ĐO off-screen (con trực tiếp của\n * header, position:absolute). Thuật toán: `total = 90; cho mỗi ITEM total += item.clientWidth + 8;\n * nếu total > measuringContainer.clientWidth → collapse item`. Công thức này OVER-COUNT 2 chỗ:\n * • +90px reserve cho nút ⋮ (cộng kể cả khi không cần collapse).\n * • +8px MỖI item, trong khi khoảng cách (gap) thực tế chỉ nằm giữa các GROUP.\n * Nếu set bề rộng container đo = đúng headerW thì `total` (vd 961) > headerW (vd 900) → Univer tưởng\n * tràn và gom item vào ⋮ dù content thật chỉ ~829px (còn ~70px trống).\n *\n * Fix (triệt để, không phụ thuộc timing): pin bề rộng container ĐO = HẰNG SỐ rất lớn qua CSS RULE trong\n * 1 <style> riêng. Khi đó `total` của Univer KHÔNG BAO GIỜ vượt → KHÔNG gom item vào ⋮ → luôn hiển thị\n * ĐỦ option (đúng yêu cầu). Vì sao chọn cách này thay vì khớp width = headerW:\n * • Thuật toán Univer over-count (90 reserve ⋮ + 8px/item) → khớp sát headerW vẫn collapse sai khi còn chỗ.\n * • ResizeObserver của Univer hay KẸT STALE: 1 transient lúc load (icon/font làm item rộng nhất thời) đặt\n * collapsedIds rồi KHÔNG re-fire → kẹt ⋮ vĩnh viễn dù sau đó còn chỗ (đúng triệu chứng reload luôn ⋮).\n * • Set inline lại bị React re-render strip → oscillation. CSS rule !important React không strip được.\n * Container đo vốn off-screen (position:absolute, opacity:0) nên width khổng lồ hoàn toàn vô hình. Khi\n * vùng chứa quá hẹp (hiếm với spreadsheet) toolbar cuộn ngang — xem SCSS `.univer-toolbar` overflow-x.\n */\n private registerToolbarWidthSync() {\n const wrapper = this.containerRef()?.nativeElement as HTMLElement | undefined;\n if (!wrapper) return;\n wrapper.classList.add(this.toolbarScopeClass);\n const styleEl = document.createElement('style');\n this.toolbarStyleEl = styleEl;\n styleEl.textContent = `.${this.toolbarScopeClass} .univer-workbench-container-header > .univer-toolbar-container{width:100000px !important;max-width:none !important;}`;\n document.head.appendChild(styleEl);\n }\n\n private registerNumfmtClickInterceptor() {\n const clickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest('.numfmt-panel') ?? target.closest('.more-numfmt-type-options')) return;\n\n const numfmtText = target.closest('.more-numfmt-type') as HTMLElement | null;\n const numfmtSelect = target.closest('.univer-toolbar-item-select') as HTMLElement | null;\n const isNumfmtBtn = numfmtText ?? (numfmtSelect?.querySelector('.more-numfmt-type') ? numfmtSelect : null);\n\n if (!isNumfmtBtn) return;\n e.preventDefault();\n e.stopPropagation();\n this.executeCommand('sheet.operation.open.numfmt.panel', undefined);\n };\n\n document.body.addEventListener('click', clickHandler, true);\n this.numfmtClickDisposable = { dispose: () => document.body.removeEventListener('click', clickHandler, true) };\n }\n\n private destroyUniver() {\n if (this.pendingInitTimer !== null) {\n clearTimeout(this.pendingInitTimer);\n this.pendingInitTimer = null;\n }\n this.columnClickDisposable?.dispose();\n this.columnClickDisposable = null;\n this.columnOpDisposable?.dispose();\n this.columnOpDisposable = null;\n this.formatDisposable?.dispose();\n this.formatDisposable = null;\n this.numfmtObserver?.disconnect();\n this.numfmtObserver = null;\n this.toolbarResizeObserver?.disconnect();\n this.toolbarResizeObserver = null;\n this.toolbarStyleEl?.remove();\n this.toolbarStyleEl = null;\n this.numfmtClickDisposable?.dispose();\n this.numfmtClickDisposable = null;\n this.numfmtCleanup?.();\n this.numfmtCleanup = null;\n this.numfmtResync = null;\n this.numfmtDateActive = false;\n this.readyObserver?.disconnect();\n this.readyObserver = null;\n this.activeCellFormat.set('General');\n this.activeCellRef.set('');\n this.lastRangeSnapshot = null;\n this.pendingNumfmtPattern = null;\n this.numfmtConfirmed = false;\n this.originalCellFormats = null;\n this.numfmtPanelOpen = false;\n this.listenEnabled = false;\n if (this.listenEnableTimer !== null) {\n clearTimeout(this.listenEnableTimer);\n this.listenEnableTimer = null;\n }\n this.numfmtController = null;\n this.univer?.dispose();\n this.univer = null;\n this.univerAPI = null;\n }\n\n private reinitUniver() {\n const currentData = this.univerAPI?.getActiveWorkbook()?.save() as unknown as Record<string, unknown> | undefined;\n this.destroyUniver();\n setTimeout(() => this.initUniver(currentData ?? this.buildEmptyWorkbook()));\n }\n\n ngOnDestroy() {\n this.destroyUniver();\n }\n}\n","<div #containerRef class=\"libs-ui-components-spreadsheet-container\"></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './spreadsheet.component';
|
|
2
|
+
export { applyMappingIndicators, stripMappingIndicators, defaultMappingIndicatorConfig, remapColumnIndexes, toColumnLetter } from './spreadsheet.indicator';
|
|
3
|
+
export type { T_indicatorTarget, T_indicatorStyle, T_mappingIndicatorConfig, T_columnStructureChange, } from './spreadsheet.indicator';
|
|
4
|
+
export type { T_cellFormatResult, T_toolbar_menu_config, T_toolbar_item_id, } from './spreadsheet.type';
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@libs-ui/components-spreadsheet",
|
|
3
|
+
"version": "0.2.356-43",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/core": "^18.2.0",
|
|
6
|
+
"@univerjs/core": "0.4.2",
|
|
7
|
+
"@univerjs/design": "0.4.2",
|
|
8
|
+
"@univerjs/docs": "0.4.2",
|
|
9
|
+
"@univerjs/docs-ui": "0.4.2",
|
|
10
|
+
"@univerjs/engine-formula": "0.4.2",
|
|
11
|
+
"@univerjs/engine-render": "0.4.2",
|
|
12
|
+
"@univerjs/facade": "0.4.2",
|
|
13
|
+
"@univerjs/sheets": "0.4.2",
|
|
14
|
+
"@univerjs/sheets-formula": "0.4.2",
|
|
15
|
+
"@univerjs/sheets-formula-ui": "0.4.2",
|
|
16
|
+
"@univerjs/sheets-numfmt": "0.4.2",
|
|
17
|
+
"@univerjs/sheets-ui": "0.4.2",
|
|
18
|
+
"@univerjs/ui": "0.4.2",
|
|
19
|
+
"rxjs": "~7.8.0"
|
|
20
|
+
},
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"module": "fesm2022/libs-ui-components-spreadsheet.mjs",
|
|
23
|
+
"typings": "index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
"./package.json": {
|
|
26
|
+
"default": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./index.d.ts",
|
|
30
|
+
"esm2022": "./esm2022/libs-ui-components-spreadsheet.mjs",
|
|
31
|
+
"esm": "./esm2022/libs-ui-components-spreadsheet.mjs",
|
|
32
|
+
"default": "./fesm2022/libs-ui-components-spreadsheet.mjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"tslib": "^2.3.0"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { AfterViewInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import type { T_columnStructureChange, T_indicatorTarget, T_mappingIndicatorConfig } from './spreadsheet.indicator';
|
|
3
|
+
import type { T_cellFormatResult, T_spreadsheet_locale, T_toolbar_menu_config } from './spreadsheet.type';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class LibsUiComponentsSpreadsheetComponent implements AfterViewInit, OnDestroy {
|
|
6
|
+
private univer;
|
|
7
|
+
private univerAPI;
|
|
8
|
+
private columnClickDisposable;
|
|
9
|
+
private formatDisposable;
|
|
10
|
+
private columnOpDisposable;
|
|
11
|
+
private numfmtObserver;
|
|
12
|
+
private toolbarResizeObserver;
|
|
13
|
+
private toolbarStyleEl;
|
|
14
|
+
private readonly toolbarScopeClass;
|
|
15
|
+
private numfmtClickDisposable;
|
|
16
|
+
private lastRangeSnapshot;
|
|
17
|
+
private pendingNumfmtPattern;
|
|
18
|
+
private numfmtConfirmed;
|
|
19
|
+
private originalCellFormats;
|
|
20
|
+
private numfmtPanelOpen;
|
|
21
|
+
private numfmtDateActive;
|
|
22
|
+
private numfmtResync;
|
|
23
|
+
private listenEnabled;
|
|
24
|
+
private listenEnableTimer;
|
|
25
|
+
private pendingInitTimer;
|
|
26
|
+
private numfmtCleanup;
|
|
27
|
+
private pendingReadyCb;
|
|
28
|
+
private lastDecorated;
|
|
29
|
+
private readyObserver;
|
|
30
|
+
private numfmtController;
|
|
31
|
+
private readonly activeCellFormat;
|
|
32
|
+
private readonly activeCellRef;
|
|
33
|
+
private readonly showToolbar;
|
|
34
|
+
private readonly showSheetTabs;
|
|
35
|
+
private readonly activeLocale;
|
|
36
|
+
/** Ngôn ngữ khởi tạo của spreadsheet. Đổi runtime dùng FunctionControl.setLocale(). */
|
|
37
|
+
readonly locale: import("@angular/core").InputSignal<T_spreadsheet_locale>;
|
|
38
|
+
/** Cấu hình ẩn / vô hiệu hoá toolbar items. Thay đổi sẽ reinit toàn bộ Univer. */
|
|
39
|
+
readonly toolbarMenuConfig: import("@angular/core").InputSignal<T_toolbar_menu_config>;
|
|
40
|
+
/**
|
|
41
|
+
* Cấu hình highlight cột đã map (style / prefix / scope sheet).
|
|
42
|
+
* Truyền config này = "bật" luồng auto: component sẽ TỰ áp indicator khi load/reset,
|
|
43
|
+
* TỰ gỡ khi save, và TỰ vẽ lại mỗi khi `mappingTargets` đổi. Bỏ trống = spreadsheet thường.
|
|
44
|
+
*/
|
|
45
|
+
readonly mappingIndicatorConfig: import("@angular/core").InputSignal<T_mappingIndicatorConfig | undefined>;
|
|
46
|
+
/** Danh sách cột cần highlight (`{ sheetId, colIndex }`). Đổi runtime → tự vẽ lại header. */
|
|
47
|
+
readonly mappingTargets: import("@angular/core").InputSignal<T_indicatorTarget[]>;
|
|
48
|
+
readonly outColumnDblClick: import("@angular/core").OutputEmitterRef<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Phát khi user insert / remove / move cột (kể cả chọn nhiều cột, và cả undo/redo).
|
|
51
|
+
* Consumer dùng `remapColumnIndexes(mappings, $event)` để dịch lại mảng mapping bên ngoài
|
|
52
|
+
* cho khớp vị trí mới — tránh lệch khi chèn/xóa cột ở giữa.
|
|
53
|
+
*/
|
|
54
|
+
readonly outColumnStructureChange: import("@angular/core").OutputEmitterRef<T_columnStructureChange>;
|
|
55
|
+
private readonly containerRef;
|
|
56
|
+
private readonly ngZone;
|
|
57
|
+
constructor();
|
|
58
|
+
ngAfterViewInit(): void;
|
|
59
|
+
get FunctionControl(): {
|
|
60
|
+
loadData: (data: Record<string, unknown>) => void;
|
|
61
|
+
saveData: () => Record<string, unknown>;
|
|
62
|
+
getActiveSheetInfo: () => {
|
|
63
|
+
sheetId: string;
|
|
64
|
+
sheetName: string;
|
|
65
|
+
} | null;
|
|
66
|
+
getColumnNumfmt: (sheetId: string, colIndex: number) => string;
|
|
67
|
+
extractAllColumnFormats: (snapshot: Record<string, unknown>) => T_cellFormatResult[];
|
|
68
|
+
toggleToolbar: () => void;
|
|
69
|
+
toggleSheetTabs: () => void;
|
|
70
|
+
reset: (data?: Record<string, unknown>) => void;
|
|
71
|
+
executeCommand: (commandId: string, params: unknown) => void;
|
|
72
|
+
applyNumfmt: (row: number, col: number, numRows: number, numCols: number, pattern: string) => void;
|
|
73
|
+
scheduleOnReady: (cb: () => void) => void;
|
|
74
|
+
setLocale: (locale: T_spreadsheet_locale) => void;
|
|
75
|
+
activeCellRef: import("@angular/core").WritableSignal<string>;
|
|
76
|
+
activeCellFormat: import("@angular/core").WritableSignal<string>;
|
|
77
|
+
showToolbar: import("@angular/core").WritableSignal<boolean>;
|
|
78
|
+
showSheetTabs: import("@angular/core").WritableSignal<boolean>;
|
|
79
|
+
locale: import("@angular/core").Signal<T_spreadsheet_locale>;
|
|
80
|
+
};
|
|
81
|
+
private setLocale;
|
|
82
|
+
private loadData;
|
|
83
|
+
/** Snapshot thô từ Univer (CÓ thể còn indicator). Dùng nội bộ cho re-apply. */
|
|
84
|
+
private saveRaw;
|
|
85
|
+
/** Snapshot trả cho consumer — tự gỡ indicator nếu luồng auto đang bật. */
|
|
86
|
+
private saveData;
|
|
87
|
+
/** Áp indicator vào snapshot trước khi load — chỉ khi luồng auto đang bật. Lưu baseline để diff. */
|
|
88
|
+
private decorateSnapshot;
|
|
89
|
+
/**
|
|
90
|
+
* Vẽ lại indicator KHÔNG reinit Univer: tính snapshot đích rồi CHỈ ghi đè đúng các ô header
|
|
91
|
+
* khác so với baseline trước đó (style + prefix + width) lên instance live qua facade.
|
|
92
|
+
* Diff theo baseline (style id ổn định 'h'/'m') → chỉ các cột vừa map/bỏ map mới được vẽ lại.
|
|
93
|
+
*/
|
|
94
|
+
private reapplyIndicators;
|
|
95
|
+
private toggleToolbar;
|
|
96
|
+
private toggleSheetTabs;
|
|
97
|
+
private reset;
|
|
98
|
+
private executeCommand;
|
|
99
|
+
private applyNumfmt;
|
|
100
|
+
private getActiveSheetInfo;
|
|
101
|
+
/** Đọc numfmt pattern của một cell từ workbook snapshot. */
|
|
102
|
+
private readCellNumfmt;
|
|
103
|
+
/** Đọc giá trị số (Excel serial) của một ô; null nếu ô rỗng/không phải số. */
|
|
104
|
+
private readCellValue;
|
|
105
|
+
private getColumnNumfmt;
|
|
106
|
+
/** Chụp numfmt gốc từng ô của vùng chọn (giới hạn 500 dòng như applyFormat) để Cancel khôi phục đúng. */
|
|
107
|
+
private captureRangeNumfmt;
|
|
108
|
+
private extractAllColumnFormats;
|
|
109
|
+
private toColLetter;
|
|
110
|
+
private buildEmptyWorkbook;
|
|
111
|
+
private resolveLocaleType;
|
|
112
|
+
private registerColumnClickListener;
|
|
113
|
+
/**
|
|
114
|
+
* Lắng nghe MUTATION cột (insert/remove/move) — mức mutation để bắt cả undo/redo, một lần/thao tác.
|
|
115
|
+
* Chuẩn hoá thành `T_columnStructureChange` rồi phát ra ngoài cho consumer remap mapping.
|
|
116
|
+
*/
|
|
117
|
+
private registerColumnOpListener;
|
|
118
|
+
private toColumnStructureChange;
|
|
119
|
+
private registerFormatListener;
|
|
120
|
+
/** Gộp numfmt gốc của vùng vừa chọn vào snapshot revert, giữ giá trị GỐC ĐẦU TIÊN cho mỗi ô. */
|
|
121
|
+
private mergeOriginalCellFormats;
|
|
122
|
+
/**
|
|
123
|
+
* Xoá live-preview overlay của Univer numfmt panel.
|
|
124
|
+
*
|
|
125
|
+
* Khi panel numfmt mở, `NumfmtController._previewPattern` được Univer dùng để vẽ đè
|
|
126
|
+
* (preview) lên hiển thị thật của vùng chọn. Vì các option date custom ghi numfmt
|
|
127
|
+
* trực tiếp vào model (không đi qua panel gốc của Univer), preview này không bao giờ
|
|
128
|
+
* khớp model → cột không đổi hiển thị ngay. Set `_previewPattern = null` + force re-render
|
|
129
|
+
* (`_forceUpdate`) để canvas vẽ đúng giá trị model tức thì.
|
|
130
|
+
*
|
|
131
|
+
* NumfmtController không export khỏi `@univerjs/sheets-numfmt` nên phải tìm instance
|
|
132
|
+
* qua injector của Univer (cache lại sau lần đầu).
|
|
133
|
+
*/
|
|
134
|
+
private clearNumfmtPreview;
|
|
135
|
+
private resolveNumfmtController;
|
|
136
|
+
/**
|
|
137
|
+
* Tạo observer để inject option ngày custom + highlight khi panel numfmt render.
|
|
138
|
+
* Observer CHỈ được bật/tắt theo vòng đời panel (xem open/close.numfmt.panel handler) để
|
|
139
|
+
* không chạy liên tục theo mọi mutation DOM toàn trang.
|
|
140
|
+
*/
|
|
141
|
+
private registerNumfmtDropdownObserver;
|
|
142
|
+
/**
|
|
143
|
+
* Thử inject option ngày custom + highlight cho panel numfmt hiện tại.
|
|
144
|
+
* Gọi từ 2 nguồn: (1) MutationObserver khi Univer render list ngày; (2) trực tiếp lúc mở panel —
|
|
145
|
+
* vì Univer TÁI DÙNG DOM panel khi reopen (hiện lại bằng CSS, không phát sinh mutation) nên observer
|
|
146
|
+
* không kích hoạt, phải chủ động gọi để re-inject + resync theo cột hiện tại.
|
|
147
|
+
*/
|
|
148
|
+
private processNumfmtPanel;
|
|
149
|
+
private initUniver;
|
|
150
|
+
/**
|
|
151
|
+
* Khắc phục lỗi toolbar collapse sai (gom item vào menu ⋮ dù còn khoảng trắng).
|
|
152
|
+
*
|
|
153
|
+
* Univer (component Ribbon) quyết định overflow bằng 1 container ĐO off-screen (con trực tiếp của
|
|
154
|
+
* header, position:absolute). Thuật toán: `total = 90; cho mỗi ITEM total += item.clientWidth + 8;
|
|
155
|
+
* nếu total > measuringContainer.clientWidth → collapse item`. Công thức này OVER-COUNT 2 chỗ:
|
|
156
|
+
* • +90px reserve cho nút ⋮ (cộng kể cả khi không cần collapse).
|
|
157
|
+
* • +8px MỖI item, trong khi khoảng cách (gap) thực tế chỉ nằm giữa các GROUP.
|
|
158
|
+
* Nếu set bề rộng container đo = đúng headerW thì `total` (vd 961) > headerW (vd 900) → Univer tưởng
|
|
159
|
+
* tràn và gom item vào ⋮ dù content thật chỉ ~829px (còn ~70px trống).
|
|
160
|
+
*
|
|
161
|
+
* Fix (triệt để, không phụ thuộc timing): pin bề rộng container ĐO = HẰNG SỐ rất lớn qua CSS RULE trong
|
|
162
|
+
* 1 <style> riêng. Khi đó `total` của Univer KHÔNG BAO GIỜ vượt → KHÔNG gom item vào ⋮ → luôn hiển thị
|
|
163
|
+
* ĐỦ option (đúng yêu cầu). Vì sao chọn cách này thay vì khớp width = headerW:
|
|
164
|
+
* • Thuật toán Univer over-count (90 reserve ⋮ + 8px/item) → khớp sát headerW vẫn collapse sai khi còn chỗ.
|
|
165
|
+
* • ResizeObserver của Univer hay KẸT STALE: 1 transient lúc load (icon/font làm item rộng nhất thời) đặt
|
|
166
|
+
* collapsedIds rồi KHÔNG re-fire → kẹt ⋮ vĩnh viễn dù sau đó còn chỗ (đúng triệu chứng reload luôn ⋮).
|
|
167
|
+
* • Set inline lại bị React re-render strip → oscillation. CSS rule !important React không strip được.
|
|
168
|
+
* Container đo vốn off-screen (position:absolute, opacity:0) nên width khổng lồ hoàn toàn vô hình. Khi
|
|
169
|
+
* vùng chứa quá hẹp (hiếm với spreadsheet) toolbar cuộn ngang — xem SCSS `.univer-toolbar` overflow-x.
|
|
170
|
+
*/
|
|
171
|
+
private registerToolbarWidthSync;
|
|
172
|
+
private registerNumfmtClickInterceptor;
|
|
173
|
+
private destroyUniver;
|
|
174
|
+
private reinitUniver;
|
|
175
|
+
ngOnDestroy(): void;
|
|
176
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsSpreadsheetComponent, never>;
|
|
177
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsSpreadsheetComponent, "libs_ui-components-spreadsheet", never, { "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "toolbarMenuConfig": { "alias": "toolbarMenuConfig"; "required": false; "isSignal": true; }; "mappingIndicatorConfig": { "alias": "mappingIndicatorConfig"; "required": false; "isSignal": true; }; "mappingTargets": { "alias": "mappingTargets"; "required": false; "isSignal": true; }; }, { "outColumnDblClick": "outColumnDblClick"; "outColumnStructureChange": "outColumnStructureChange"; }, never, never, true, never>;
|
|
178
|
+
}
|