@taocompany/magic-grid 0.12.6 → 0.12.8
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 +4288 -4286
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/useMagicGrid.d.ts.map +1 -1
- package/dist/core/api/gridApi.d.ts +10 -0
- package/dist/core/api/gridApi.d.ts.map +1 -1
- package/dist/core/grid/grid.d.ts +4 -0
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/grid/gridBootstrap.d.ts +2 -1
- package/dist/core/grid/gridBootstrap.d.ts.map +1 -1
- package/dist/core/grid/gridHierarchyOps.d.ts +6 -2
- package/dist/core/grid/gridHierarchyOps.d.ts.map +1 -1
- package/dist/core/grid/gridViewport.d.ts +19 -0
- package/dist/core/grid/gridViewport.d.ts.map +1 -1
- package/dist/core/renderer/rowRenderer.d.ts +8 -0
- package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
- package/dist/core/row/rowComp.d.ts +4 -0
- package/dist/core/row/rowComp.d.ts.map +1 -1
- package/dist/core/row/rowHeightService.d.ts.map +1 -1
- package/dist/core/rowExpansion/loadDetailRowData.d.ts +6 -2
- package/dist/core/rowExpansion/loadDetailRowData.d.ts.map +1 -1
- package/dist/core/rowExpansion/rowExpansionService.d.ts +10 -0
- package/dist/core/rowExpansion/rowExpansionService.d.ts.map +1 -1
- package/dist/core/scroll/detailExpansionScroll.d.ts +10 -0
- package/dist/core/scroll/detailExpansionScroll.d.ts.map +1 -0
- package/dist/core/types/rowComp.d.ts +2 -0
- package/dist/core/types/rowComp.d.ts.map +1 -1
- package/dist/core/types/rowHeight.d.ts +2 -0
- package/dist/core/types/rowHeight.d.ts.map +1 -1
- package/dist/core/types/rowNode.d.ts +2 -0
- package/dist/core/types/rowNode.d.ts.map +1 -1
- package/dist/getRowDragCommitHierarchy-DoMf_SY8.cjs.map +1 -1
- package/dist/getRowDragCommitHierarchy-pWgukMAX.js.map +1 -1
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +2378 -2208
- package/dist/index.es.js.map +1 -1
- package/dist/token-catalog.json +2 -2
- package/dist/types/core.d.ts +14 -0
- package/dist/validation-BHqm5Flb.js.map +1 -1
- package/dist/validation-CD6lt5wS.cjs.map +1 -1
- package/package.json +105 -105
package/dist/token-catalog.json
CHANGED
package/dist/types/core.d.ts
CHANGED
|
@@ -2239,6 +2239,16 @@ export declare interface GridApi extends RowMutationGridApi {
|
|
|
2239
2239
|
collapseRow(rowId: RowId): boolean;
|
|
2240
2240
|
/** 主行是否已展开。 */
|
|
2241
2241
|
isRowExpanded(rowId: RowId): boolean;
|
|
2242
|
+
/**
|
|
2243
|
+
* 主动写入主行详情数据(等价于 `getDetailRowData` 的 `successCallback` 结果缓存)。
|
|
2244
|
+
* 已展开时刷新详情区;未展开时可预填,后续 `expandRow` 在有缓存时不再调用 `getDetailRowData`。
|
|
2245
|
+
*/
|
|
2246
|
+
setDetailRowData(rowId: RowId, detailRowData: unknown): boolean;
|
|
2247
|
+
/**
|
|
2248
|
+
* 清除主行详情 cache 并重新调用 `getDetailRowData`(已展开时保持展开并显示 loading)。
|
|
2249
|
+
* 未配置 `getDetailRowData` 时返回 `false`。
|
|
2250
|
+
*/
|
|
2251
|
+
reloadDetailRowData(rowId: RowId): boolean;
|
|
2242
2252
|
/** 展开当前 display 中全部可展开 master 行。 */
|
|
2243
2253
|
expandAll(): void;
|
|
2244
2254
|
/** 折叠全部已展开主行 / 分组(取决于启用的能力)。 */
|
|
@@ -3754,6 +3764,8 @@ export declare interface RowHeightChangedEvent {
|
|
|
3754
3764
|
export declare interface RowHeightChangeItem {
|
|
3755
3765
|
rowId: string;
|
|
3756
3766
|
rowHeight: number;
|
|
3767
|
+
/** setRowHeights 写入前的高度(detail autoHeight 补偿 scroll 用) */
|
|
3768
|
+
previousRowHeight?: number;
|
|
3757
3769
|
}
|
|
3758
3770
|
|
|
3759
3771
|
export declare type RowHeightChangeSource = 'api' | 'uiRowResized' | 'autoHeight' | 'dimensions';
|
|
@@ -4119,6 +4131,8 @@ export declare interface RowNode {
|
|
|
4119
4131
|
__detailLoading?: boolean;
|
|
4120
4132
|
/** Phase 17 · master 行:详情加载失败原因 */
|
|
4121
4133
|
__detailLoadError?: unknown;
|
|
4134
|
+
/** Phase 17 · master 行:详情加载代次(reload 时递增,忽略过期回调) */
|
|
4135
|
+
__detailLoadId?: number;
|
|
4122
4136
|
/** 用户/API 手动锁定行高后,autoHeight 不再覆盖(Phase 15) */
|
|
4123
4137
|
rowHeightPinned?: boolean;
|
|
4124
4138
|
/** autoHeight 各列实测高度缓存(Phase 15 · 内核字段) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-BHqm5Flb.js","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\n type Rule,\n type Rules,\n type ValidateError,\n type ValidateFieldsError,\n} from 'async-validator'\n\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\nimport type { ColumnDef } from '@types'\n\nexport { default as Schema } from 'async-validator'\n\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\n return errors.map((error) => error.message ?? String(error.field))\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return promise\n }\n\n if (signal.aborted) {\n return Promise.reject(signal.reason)\n }\n\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason)\n }\n\n signal.addEventListener('abort', onAbort)\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\n return fn.constructor.name === 'AsyncFunction'\n}\n\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\nfunction normalizeRule(rule: Rule): Rule {\n const record = rule as Record<string, unknown>\n const customValidator = record.validator\n\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\n const { validator, ...rest } = record\n return { ...rest, asyncValidator: validator } as Rule\n }\n }\n\n return rule\n}\n\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\n const list = Array.isArray(rules) ? rules : [rules]\n return list.map(normalizeRule)\n}\n\nfunction normalizeSchema(schema: Rules): Rules {\n const normalized: Record<string, Rule | Rule[]> = {}\n\n for (const [field, rules] of Object.entries(schema)) {\n normalized[field] = normalizeRules(rules as Rule | Rule[])\n }\n\n return normalized as Rules\n}\n\nexport async function validateWithSchema(\n schema: Rules,\n source: Record<string, unknown>,\n options?: { signal?: AbortSignal },\n): Promise<string[] | null> {\n const validator = new Schema(normalizeSchema(schema as Rules))\n\n try {\n await raceWithAbort(validator.validate(source), options?.signal)\n return null\n } catch (error) {\n if (isEditCommitAborted(error)) {\n throw error\n }\n\n if (error && typeof error === 'object' && 'errors' in error) {\n const fieldError = error as ValidateFieldsError\n return formatValidateErrors(fieldError.errors ?? [])\n }\n\n if (error instanceof Error) {\n return [error.message]\n }\n\n return ['Validation failed']\n }\n}\n\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\n const schema = { [field]: rules } as Rules\n\n return async (params) => {\n const source = {\n [field]: params.parsedValue,\n }\n return validateWithSchema(schema, source, { signal: params.signal })\n }\n}\n\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\n return async (params) => {\n const source: Record<string, unknown> = { ...params.data }\n for (const [colId, value] of params.draftValues) {\n source[colId] = value\n }\n\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\n }\n}\n\n/** 判断 validationRules 是否包含 required 规则 */\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\n if (!rules) {\n return false\n }\n\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((rule) => {\n const record = rule as Record<string, unknown>\n return record.required === true\n })\n}\n\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\n return columns.map((column) => {\n const validationRequired =\n column.validationRequired ?? isValidationRequired(column.validationRules)\n\n if (column.cellValidator || !column.validationRules || !column.prop) {\n return validationRequired === column.validationRequired\n ? column\n : { ...column, validationRequired }\n }\n\n const field = column.prop\n return {\n ...column,\n validationRequired,\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\n }\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation-BHqm5Flb.js","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\r\n type Rule,\r\n type Rules,\r\n type ValidateError,\r\n type ValidateFieldsError,\r\n} from 'async-validator'\r\n\r\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\r\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\r\nimport type { ColumnDef } from '@types'\r\n\r\nexport { default as Schema } from 'async-validator'\r\n\r\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\r\n return errors.map((error) => error.message ?? String(error.field))\r\n}\r\n\r\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\r\n if (!signal) {\r\n return promise\r\n }\r\n\r\n if (signal.aborted) {\r\n return Promise.reject(signal.reason)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onAbort = (): void => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(signal.reason)\r\n }\r\n\r\n signal.addEventListener('abort', onAbort)\r\n promise.then(\r\n (value) => {\r\n signal.removeEventListener('abort', onAbort)\r\n resolve(value)\r\n },\r\n (error) => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(error)\r\n },\r\n )\r\n })\r\n}\r\n\r\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\r\n return fn.constructor.name === 'AsyncFunction'\r\n}\r\n\r\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\r\nfunction normalizeRule(rule: Rule): Rule {\r\n const record = rule as Record<string, unknown>\r\n const customValidator = record.validator\r\n\r\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\r\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\r\n const { validator, ...rest } = record\r\n return { ...rest, asyncValidator: validator } as Rule\r\n }\r\n }\r\n\r\n return rule\r\n}\r\n\r\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.map(normalizeRule)\r\n}\r\n\r\nfunction normalizeSchema(schema: Rules): Rules {\r\n const normalized: Record<string, Rule | Rule[]> = {}\r\n\r\n for (const [field, rules] of Object.entries(schema)) {\r\n normalized[field] = normalizeRules(rules as Rule | Rule[])\r\n }\r\n\r\n return normalized as Rules\r\n}\r\n\r\nexport async function validateWithSchema(\r\n schema: Rules,\r\n source: Record<string, unknown>,\r\n options?: { signal?: AbortSignal },\r\n): Promise<string[] | null> {\r\n const validator = new Schema(normalizeSchema(schema as Rules))\r\n\r\n try {\r\n await raceWithAbort(validator.validate(source), options?.signal)\r\n return null\r\n } catch (error) {\r\n if (isEditCommitAborted(error)) {\r\n throw error\r\n }\r\n\r\n if (error && typeof error === 'object' && 'errors' in error) {\r\n const fieldError = error as ValidateFieldsError\r\n return formatValidateErrors(fieldError.errors ?? [])\r\n }\r\n\r\n if (error instanceof Error) {\r\n return [error.message]\r\n }\r\n\r\n return ['Validation failed']\r\n }\r\n}\r\n\r\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\r\n const schema = { [field]: rules } as Rules\r\n\r\n return async (params) => {\r\n const source = {\r\n [field]: params.parsedValue,\r\n }\r\n return validateWithSchema(schema, source, { signal: params.signal })\r\n }\r\n}\r\n\r\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\r\n return async (params) => {\r\n const source: Record<string, unknown> = { ...params.data }\r\n for (const [colId, value] of params.draftValues) {\r\n source[colId] = value\r\n }\r\n\r\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\r\n }\r\n}\r\n\r\n/** 判断 validationRules 是否包含 required 规则 */\r\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\r\n if (!rules) {\r\n return false\r\n }\r\n\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.some((rule) => {\r\n const record = rule as Record<string, unknown>\r\n return record.required === true\r\n })\r\n}\r\n\r\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\r\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\r\n return columns.map((column) => {\r\n const validationRequired =\r\n column.validationRequired ?? isValidationRequired(column.validationRules)\r\n\r\n if (column.cellValidator || !column.validationRules || !column.prop) {\r\n return validationRequired === column.validationRequired\r\n ? column\r\n : { ...column, validationRequired }\r\n }\r\n\r\n const field = column.prop\r\n return {\r\n ...column,\r\n validationRequired,\r\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\r\n }\r\n })\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-CD6lt5wS.cjs","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\n type Rule,\n type Rules,\n type ValidateError,\n type ValidateFieldsError,\n} from 'async-validator'\n\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\nimport type { ColumnDef } from '@types'\n\nexport { default as Schema } from 'async-validator'\n\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\n return errors.map((error) => error.message ?? String(error.field))\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return promise\n }\n\n if (signal.aborted) {\n return Promise.reject(signal.reason)\n }\n\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason)\n }\n\n signal.addEventListener('abort', onAbort)\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\n return fn.constructor.name === 'AsyncFunction'\n}\n\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\nfunction normalizeRule(rule: Rule): Rule {\n const record = rule as Record<string, unknown>\n const customValidator = record.validator\n\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\n const { validator, ...rest } = record\n return { ...rest, asyncValidator: validator } as Rule\n }\n }\n\n return rule\n}\n\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\n const list = Array.isArray(rules) ? rules : [rules]\n return list.map(normalizeRule)\n}\n\nfunction normalizeSchema(schema: Rules): Rules {\n const normalized: Record<string, Rule | Rule[]> = {}\n\n for (const [field, rules] of Object.entries(schema)) {\n normalized[field] = normalizeRules(rules as Rule | Rule[])\n }\n\n return normalized as Rules\n}\n\nexport async function validateWithSchema(\n schema: Rules,\n source: Record<string, unknown>,\n options?: { signal?: AbortSignal },\n): Promise<string[] | null> {\n const validator = new Schema(normalizeSchema(schema as Rules))\n\n try {\n await raceWithAbort(validator.validate(source), options?.signal)\n return null\n } catch (error) {\n if (isEditCommitAborted(error)) {\n throw error\n }\n\n if (error && typeof error === 'object' && 'errors' in error) {\n const fieldError = error as ValidateFieldsError\n return formatValidateErrors(fieldError.errors ?? [])\n }\n\n if (error instanceof Error) {\n return [error.message]\n }\n\n return ['Validation failed']\n }\n}\n\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\n const schema = { [field]: rules } as Rules\n\n return async (params) => {\n const source = {\n [field]: params.parsedValue,\n }\n return validateWithSchema(schema, source, { signal: params.signal })\n }\n}\n\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\n return async (params) => {\n const source: Record<string, unknown> = { ...params.data }\n for (const [colId, value] of params.draftValues) {\n source[colId] = value\n }\n\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\n }\n}\n\n/** 判断 validationRules 是否包含 required 规则 */\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\n if (!rules) {\n return false\n }\n\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((rule) => {\n const record = rule as Record<string, unknown>\n return record.required === true\n })\n}\n\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\n return columns.map((column) => {\n const validationRequired =\n column.validationRequired ?? isValidationRequired(column.validationRules)\n\n if (column.cellValidator || !column.validationRules || !column.prop) {\n return validationRequired === column.validationRequired\n ? column\n : { ...column, validationRequired }\n }\n\n const field = column.prop\n return {\n ...column,\n validationRequired,\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\n }\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation-CD6lt5wS.cjs","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\r\n type Rule,\r\n type Rules,\r\n type ValidateError,\r\n type ValidateFieldsError,\r\n} from 'async-validator'\r\n\r\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\r\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\r\nimport type { ColumnDef } from '@types'\r\n\r\nexport { default as Schema } from 'async-validator'\r\n\r\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\r\n return errors.map((error) => error.message ?? String(error.field))\r\n}\r\n\r\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\r\n if (!signal) {\r\n return promise\r\n }\r\n\r\n if (signal.aborted) {\r\n return Promise.reject(signal.reason)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onAbort = (): void => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(signal.reason)\r\n }\r\n\r\n signal.addEventListener('abort', onAbort)\r\n promise.then(\r\n (value) => {\r\n signal.removeEventListener('abort', onAbort)\r\n resolve(value)\r\n },\r\n (error) => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(error)\r\n },\r\n )\r\n })\r\n}\r\n\r\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\r\n return fn.constructor.name === 'AsyncFunction'\r\n}\r\n\r\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\r\nfunction normalizeRule(rule: Rule): Rule {\r\n const record = rule as Record<string, unknown>\r\n const customValidator = record.validator\r\n\r\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\r\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\r\n const { validator, ...rest } = record\r\n return { ...rest, asyncValidator: validator } as Rule\r\n }\r\n }\r\n\r\n return rule\r\n}\r\n\r\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.map(normalizeRule)\r\n}\r\n\r\nfunction normalizeSchema(schema: Rules): Rules {\r\n const normalized: Record<string, Rule | Rule[]> = {}\r\n\r\n for (const [field, rules] of Object.entries(schema)) {\r\n normalized[field] = normalizeRules(rules as Rule | Rule[])\r\n }\r\n\r\n return normalized as Rules\r\n}\r\n\r\nexport async function validateWithSchema(\r\n schema: Rules,\r\n source: Record<string, unknown>,\r\n options?: { signal?: AbortSignal },\r\n): Promise<string[] | null> {\r\n const validator = new Schema(normalizeSchema(schema as Rules))\r\n\r\n try {\r\n await raceWithAbort(validator.validate(source), options?.signal)\r\n return null\r\n } catch (error) {\r\n if (isEditCommitAborted(error)) {\r\n throw error\r\n }\r\n\r\n if (error && typeof error === 'object' && 'errors' in error) {\r\n const fieldError = error as ValidateFieldsError\r\n return formatValidateErrors(fieldError.errors ?? [])\r\n }\r\n\r\n if (error instanceof Error) {\r\n return [error.message]\r\n }\r\n\r\n return ['Validation failed']\r\n }\r\n}\r\n\r\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\r\n const schema = { [field]: rules } as Rules\r\n\r\n return async (params) => {\r\n const source = {\r\n [field]: params.parsedValue,\r\n }\r\n return validateWithSchema(schema, source, { signal: params.signal })\r\n }\r\n}\r\n\r\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\r\n return async (params) => {\r\n const source: Record<string, unknown> = { ...params.data }\r\n for (const [colId, value] of params.draftValues) {\r\n source[colId] = value\r\n }\r\n\r\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\r\n }\r\n}\r\n\r\n/** 判断 validationRules 是否包含 required 规则 */\r\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\r\n if (!rules) {\r\n return false\r\n }\r\n\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.some((rule) => {\r\n const record = rule as Record<string, unknown>\r\n return record.required === true\r\n })\r\n}\r\n\r\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\r\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\r\n return columns.map((column) => {\r\n const validationRequired =\r\n column.validationRequired ?? isValidationRequired(column.validationRules)\r\n\r\n if (column.cellValidator || !column.validationRules || !column.prop) {\r\n return validationRequired === column.validationRequired\r\n ? column\r\n : { ...column, validationRequired }\r\n }\r\n\r\n const field = column.prop\r\n return {\r\n ...column,\r\n validationRequired,\r\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\r\n }\r\n })\r\n}\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@taocompany/magic-grid",
|
|
3
|
-
"version": "0.12.
|
|
4
|
-
"description": "A high-performance virtual table component library for Vue 3",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"author": "songjiuzhang <jiuzhang.song@taoandcompany02.com>",
|
|
8
|
-
"keywords": [
|
|
9
|
-
"vue",
|
|
10
|
-
"vue3",
|
|
11
|
-
"virtual-table",
|
|
12
|
-
"virtual-grid",
|
|
13
|
-
"component-library",
|
|
14
|
-
"magic-grid"
|
|
15
|
-
],
|
|
16
|
-
"exports": {
|
|
17
|
-
".": {
|
|
18
|
-
"types": "./dist/index.d.ts",
|
|
19
|
-
"import": "./dist/index.es.js",
|
|
20
|
-
"require": "./dist/index.cjs.js"
|
|
21
|
-
},
|
|
22
|
-
"./types/core": {
|
|
23
|
-
"types": "./dist/types/core.d.ts",
|
|
24
|
-
"import": "./dist/types/core.es.js",
|
|
25
|
-
"require": "./dist/types/core.cjs.js"
|
|
26
|
-
},
|
|
27
|
-
"./types/validation": {
|
|
28
|
-
"types": "./dist/types/validation.d.ts",
|
|
29
|
-
"import": "./dist/types/validation.es.js",
|
|
30
|
-
"require": "./dist/types/validation.cjs.js"
|
|
31
|
-
},
|
|
32
|
-
"./validation": {
|
|
33
|
-
"types": "./dist/validation.d.ts",
|
|
34
|
-
"import": "./dist/validation.es.js",
|
|
35
|
-
"require": "./dist/validation.cjs.js"
|
|
36
|
-
},
|
|
37
|
-
"./style.css": "./dist/style.css",
|
|
38
|
-
"./tokens.css": "./dist/tokens.css",
|
|
39
|
-
"./token-catalog.json": "./dist/token-catalog.json"
|
|
40
|
-
},
|
|
41
|
-
"main": "./dist/index.cjs.js",
|
|
42
|
-
"module": "./dist/index.es.js",
|
|
43
|
-
"types": "./dist/index.d.ts",
|
|
44
|
-
"files": [
|
|
45
|
-
"dist"
|
|
46
|
-
],
|
|
47
|
-
"sideEffects": [
|
|
48
|
-
"dist/style.css",
|
|
49
|
-
"dist/tokens.css",
|
|
50
|
-
"**/*.css"
|
|
51
|
-
],
|
|
52
|
-
"publishConfig": {
|
|
53
|
-
"access": "public",
|
|
54
|
-
"registry": "https://registry.npmjs.org/"
|
|
55
|
-
},
|
|
56
|
-
"engines": {
|
|
57
|
-
"node": ">=20.19"
|
|
58
|
-
},
|
|
59
|
-
"packageManager": "pnpm@12.5.1",
|
|
60
|
-
"scripts": {
|
|
61
|
-
"dev": "vite --config vite.config.playground.ts",
|
|
62
|
-
"build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts && node --experimental-strip-types scripts/bundle-types.ts",
|
|
63
|
-
"theme-studio:catalog": "vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts",
|
|
64
|
-
"theme-studio:validate": "tsx scripts/validate-theme-overrides.ts",
|
|
65
|
-
"build:playground": "vite build --config vite.config.playground.ts",
|
|
66
|
-
"preview": "vite preview --config vite.config.playground.ts",
|
|
67
|
-
"typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
|
|
68
|
-
"test": "vitest",
|
|
69
|
-
"test:run": "vitest run",
|
|
70
|
-
"test:theme-studio": "vitest run theme-studio/__tests__",
|
|
71
|
-
"test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
|
|
72
|
-
"test:coverage": "vitest run --coverage",
|
|
73
|
-
"prepublishOnly": "pnpm run build",
|
|
74
|
-
"deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
|
|
75
|
-
"publish:dev": "node --experimental-strip-types scripts/publish-dev.ts",
|
|
76
|
-
"docs:api": "node --experimental-strip-types scripts/generate-docs-api-entries.ts"
|
|
77
|
-
},
|
|
78
|
-
"peerDependencies": {
|
|
79
|
-
"async-validator": "^4.2.0",
|
|
80
|
-
"vue": "^3.5.0"
|
|
81
|
-
},
|
|
82
|
-
"devDependencies": {
|
|
83
|
-
"@microsoft/api-extractor": "^7.55.0",
|
|
84
|
-
"@vitejs/plugin-vue": "^6.0.8",
|
|
85
|
-
"@vitest/coverage-v8": "^4.1.10",
|
|
86
|
-
"@vue/test-utils": "^2.4.11",
|
|
87
|
-
"@vue/tsconfig": "^0.8.1",
|
|
88
|
-
"async-validator": "^4.2.5",
|
|
89
|
-
"element-plus": "^2.14.3",
|
|
90
|
-
"happy-dom": "^20.11.1",
|
|
91
|
-
"less": "^4.8.1",
|
|
92
|
-
"shiki": "^4.4.3",
|
|
93
|
-
"tsx": "^4.23.15",
|
|
94
|
-
"typescript": "^5.9.3",
|
|
95
|
-
"vite": "^8.2.0",
|
|
96
|
-
"vite-plugin-dts": "^5.0.3",
|
|
97
|
-
"vitest": "^4.1.10",
|
|
98
|
-
"vue": "^3.5.40",
|
|
99
|
-
"vue-router": "^4.6.4",
|
|
100
|
-
"vue-tsc": "^3.2.0"
|
|
101
|
-
},
|
|
102
|
-
"dependencies": {
|
|
103
|
-
"@lucide/vue": "^1.28.0"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@taocompany/magic-grid",
|
|
3
|
+
"version": "0.12.8",
|
|
4
|
+
"description": "A high-performance virtual table component library for Vue 3",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "songjiuzhang <jiuzhang.song@taoandcompany02.com>",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"vue",
|
|
10
|
+
"vue3",
|
|
11
|
+
"virtual-table",
|
|
12
|
+
"virtual-grid",
|
|
13
|
+
"component-library",
|
|
14
|
+
"magic-grid"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.es.js",
|
|
20
|
+
"require": "./dist/index.cjs.js"
|
|
21
|
+
},
|
|
22
|
+
"./types/core": {
|
|
23
|
+
"types": "./dist/types/core.d.ts",
|
|
24
|
+
"import": "./dist/types/core.es.js",
|
|
25
|
+
"require": "./dist/types/core.cjs.js"
|
|
26
|
+
},
|
|
27
|
+
"./types/validation": {
|
|
28
|
+
"types": "./dist/types/validation.d.ts",
|
|
29
|
+
"import": "./dist/types/validation.es.js",
|
|
30
|
+
"require": "./dist/types/validation.cjs.js"
|
|
31
|
+
},
|
|
32
|
+
"./validation": {
|
|
33
|
+
"types": "./dist/validation.d.ts",
|
|
34
|
+
"import": "./dist/validation.es.js",
|
|
35
|
+
"require": "./dist/validation.cjs.js"
|
|
36
|
+
},
|
|
37
|
+
"./style.css": "./dist/style.css",
|
|
38
|
+
"./tokens.css": "./dist/tokens.css",
|
|
39
|
+
"./token-catalog.json": "./dist/token-catalog.json"
|
|
40
|
+
},
|
|
41
|
+
"main": "./dist/index.cjs.js",
|
|
42
|
+
"module": "./dist/index.es.js",
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"files": [
|
|
45
|
+
"dist"
|
|
46
|
+
],
|
|
47
|
+
"sideEffects": [
|
|
48
|
+
"dist/style.css",
|
|
49
|
+
"dist/tokens.css",
|
|
50
|
+
"**/*.css"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"registry": "https://registry.npmjs.org/"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=20.19"
|
|
58
|
+
},
|
|
59
|
+
"packageManager": "pnpm@12.5.1",
|
|
60
|
+
"scripts": {
|
|
61
|
+
"dev": "vite --config vite.config.playground.ts",
|
|
62
|
+
"build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts && node --experimental-strip-types scripts/bundle-types.ts",
|
|
63
|
+
"theme-studio:catalog": "vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts",
|
|
64
|
+
"theme-studio:validate": "tsx scripts/validate-theme-overrides.ts",
|
|
65
|
+
"build:playground": "vite build --config vite.config.playground.ts",
|
|
66
|
+
"preview": "vite preview --config vite.config.playground.ts",
|
|
67
|
+
"typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
|
|
68
|
+
"test": "vitest",
|
|
69
|
+
"test:run": "vitest run",
|
|
70
|
+
"test:theme-studio": "vitest run theme-studio/__tests__",
|
|
71
|
+
"test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
|
|
72
|
+
"test:coverage": "vitest run --coverage",
|
|
73
|
+
"prepublishOnly": "pnpm run build",
|
|
74
|
+
"deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
|
|
75
|
+
"publish:dev": "node --experimental-strip-types scripts/publish-dev.ts",
|
|
76
|
+
"docs:api": "node --experimental-strip-types scripts/generate-docs-api-entries.ts"
|
|
77
|
+
},
|
|
78
|
+
"peerDependencies": {
|
|
79
|
+
"async-validator": "^4.2.0",
|
|
80
|
+
"vue": "^3.5.0"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@microsoft/api-extractor": "^7.55.0",
|
|
84
|
+
"@vitejs/plugin-vue": "^6.0.8",
|
|
85
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
86
|
+
"@vue/test-utils": "^2.4.11",
|
|
87
|
+
"@vue/tsconfig": "^0.8.1",
|
|
88
|
+
"async-validator": "^4.2.5",
|
|
89
|
+
"element-plus": "^2.14.3",
|
|
90
|
+
"happy-dom": "^20.11.1",
|
|
91
|
+
"less": "^4.8.1",
|
|
92
|
+
"shiki": "^4.4.3",
|
|
93
|
+
"tsx": "^4.23.15",
|
|
94
|
+
"typescript": "^5.9.3",
|
|
95
|
+
"vite": "^8.2.0",
|
|
96
|
+
"vite-plugin-dts": "^5.0.3",
|
|
97
|
+
"vitest": "^4.1.10",
|
|
98
|
+
"vue": "^3.5.40",
|
|
99
|
+
"vue-router": "^4.6.4",
|
|
100
|
+
"vue-tsc": "^3.2.0"
|
|
101
|
+
},
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"@lucide/vue": "^1.28.0"
|
|
104
|
+
}
|
|
105
|
+
}
|