@platforma-sdk/model 1.76.5 → 1.77.4
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/dist/columns/column_collection_builder.cjs +6 -3
- package/dist/columns/column_collection_builder.cjs.map +1 -1
- package/dist/columns/column_collection_builder.js +6 -3
- package/dist/columns/column_collection_builder.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPTableDefV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV2.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTable/index.js.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.cjs.map +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.d.ts +1 -1
- package/dist/components/PlDataTable/createPlDataTableSheet.js.map +1 -1
- package/dist/components/PlDataTable/index.d.ts +1 -1
- package/dist/components/PlDataTable/state-migration.cjs +32 -1
- package/dist/components/PlDataTable/state-migration.cjs.map +1 -1
- package/dist/components/PlDataTable/state-migration.d.ts +4 -3
- package/dist/components/PlDataTable/state-migration.d.ts.map +1 -1
- package/dist/components/PlDataTable/state-migration.js +33 -2
- package/dist/components/PlDataTable/state-migration.js.map +1 -1
- package/dist/components/PlDataTable/typesV6.d.ts +26 -84
- package/dist/components/PlDataTable/typesV6.d.ts.map +1 -1
- package/dist/components/PlDataTable/typesV7.d.ts +98 -0
- package/dist/components/PlDataTable/typesV7.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/package.json +8 -8
- package/src/columns/column_collection_builder.ts +12 -3
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV2.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPTableDefV3.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV2.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/createPlDataTableV3.ts +1 -1
- package/src/components/PlDataTable/createPlDataTable/index.ts +1 -1
- package/src/components/PlDataTable/createPlDataTableSheet.ts +1 -1
- package/src/components/PlDataTable/index.ts +1 -1
- package/src/components/PlDataTable/state-migration.ts +71 -13
- package/src/components/PlDataTable/typesV6.ts +16 -138
- package/src/components/PlDataTable/typesV7.ts +151 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-migration.js","names":[],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n PTableSorting,\n} from \"@milaboratories/pl-model-common\";\nimport { canonicalizeJson, parseJsonSafely } from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./typesV4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PTableParamsV2,\n} from \"./typesV6\";\nimport type {\n PlDataTableGridStateV5,\n PlDataTableV5ColIdJson,\n PlDataTableV5ColIdWrapper,\n} from \"./typesV5\";\nimport { isNil } from \"es-toolkit\";\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n | {\n version: 4;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateCore;\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n /** Old format; only fields used in migration are typed */\n pTableParams: {\n sourceId: string | null;\n hiddenColIds: PObjectId[] | null;\n sorting: PTableSorting[];\n };\n }\n // v5 stored colIds as `{source, labeled}` wrappers; only the gridState shape differs.\n | {\n version: 5;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV5;\n sheetsState: PlDataTableSheetState[];\n filtersState: null | PlDataTableFiltersWithMeta;\n defaultFiltersState: null | PlDataTableFiltersWithMeta;\n searchString?: string;\n }[];\n pTableParams: PTableParamsV2;\n }\n // Normalized state\n | PlDataTableStateV2Normalized;\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(\n state: PlDataTableStateV2 | undefined,\n): PlDataTableStateV2Normalized {\n // Block just added, had no state, model started earlier than the UI\n if (!state) {\n return createPlDataTableStateV2();\n }\n // v1 -> v2\n if (!(\"version\" in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: createDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v4 -> v6: migrate per-column filters to tree-based format (skips v5).\n // v4 gridState already used bare PTableColumnSpec colIds, so we jump\n // straight to v6 without going through the v5 wrapper format.\n if (state.version === 4) {\n state = migrateV4toV6(state);\n }\n // v5 -> v6: unwrap `{source, labeled}` colIds in gridState back to bare PTableColumnSpec.\n if (state.version === 5) {\n state = migrateV5toV6(state);\n }\n return state;\n}\n\n/** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */\nfunction migrateV5toV6(\n state: Extract<PlDataTableStateV2, { version: 5 }>,\n): PlDataTableStateV2Normalized {\n // pTableParams reset: v5 stored DiscoveredPColumnId-based hiddenColIds with\n // empty-array fields (e.g. `{column, path: [], columnQualifications: [], ...}`).\n // v6 distills empty fields, so the same logical column serialises differently\n // and lookups would silently miss every previously-hidden discovered column.\n // gridState colIds are derived from PTableColumnSpec and unaffected.\n return {\n version: 6,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n gridState: unwrapV5GridState(entry.gridState),\n })),\n pTableParams: createDefaultPTableParams(),\n };\n}\n\n/** Convert v5 wrapped colId JSON to bare PTableColumnSpec JSON, taking `.source`.\n * gridState colIds may include the row-number sentinel (a JSON-stringified\n * literal, not a wrapped spec) — those pass through unchanged. */\nfunction unwrapV5ColId(json: string): string {\n const parsed: unknown = parseJsonSafely(json as CanonicalizedJson<unknown>);\n return !isNil(parsed) && typeof parsed === \"object\" && \"source\" in parsed\n ? canonicalizeJson((parsed as PlDataTableV5ColIdWrapper).source)\n : json;\n}\n\nfunction unwrapV5GridState(gridState: PlDataTableGridStateV5): PlDataTableGridStateCore {\n const unwrapAs = (json: PlDataTableV5ColIdJson) =>\n unwrapV5ColId(json) as CanonicalizedJson<PTableColumnSpec>;\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(unwrapAs) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: unwrapAs(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) }\n : undefined,\n };\n}\n\n/** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */\nfunction migrateV4toV6(\n state: Extract<PlDataTableStateV2, { version: 4 }>,\n): PlDataTableStateV2Normalized {\n let idCounter = 0;\n const nextId = () => ++idCounter;\n\n const migratedCache: PlDataTableStateV2CacheEntry[] = state.stateCache.map((entry) => {\n const leaves: PlDataTableFiltersWithMeta[\"filters\"] = [];\n for (const f of entry.filtersState) {\n if (f.filter !== null && !f.filter.disabled) {\n const column = canonicalizeJson(f.id);\n leaves.push(migrateTableFilter(column, f.filter.value, nextId));\n }\n }\n const filtersState: PlDataTableFiltersWithMeta | null =\n leaves.length > 0 ? { id: nextId(), type: \"and\", filters: leaves } : null;\n\n return {\n sourceId: entry.sourceId,\n gridState: entry.gridState,\n sheetsState: entry.sheetsState,\n filtersState,\n defaultFiltersState: null,\n };\n });\n\n const oldSourceId = state.pTableParams.sourceId;\n const currentCache = oldSourceId\n ? migratedCache.find((e) => e.sourceId === oldSourceId)\n : undefined;\n\n return {\n version: 6,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds:\n state.pTableParams.hiddenColIds?.map((id) => ({ type: \"column\" as const, id })) ??\n null,\n filters: distillFilterSpec(currentCache.filtersState),\n defaultFilters: null,\n sorting: state.pTableParams.sorting,\n }\n : createDefaultPTableParams(),\n };\n}\n\n/** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */\nfunction migrateTableFilter(\n column: CanonicalizedJson<PTableColumnId>,\n filter: PlTableFilter,\n nextId: () => number,\n): PlDataTableFiltersWithMeta[\"filters\"][number] {\n const id = nextId();\n switch (filter.type) {\n case \"isNA\":\n return { id, type: \"isNA\", column };\n case \"isNotNA\":\n return { id, type: \"isNotNA\", column };\n case \"number_equals\":\n return { id, type: \"equal\", column, x: filter.reference };\n case \"number_notEquals\":\n return { id, type: \"notEqual\", column, x: filter.reference };\n case \"number_greaterThan\":\n return { id, type: \"greaterThan\", column, x: filter.reference };\n case \"number_greaterThanOrEqualTo\":\n return { id, type: \"greaterThanOrEqual\", column, x: filter.reference };\n case \"number_lessThan\":\n return { id, type: \"lessThan\", column, x: filter.reference };\n case \"number_lessThanOrEqualTo\":\n return { id, type: \"lessThanOrEqual\", column, x: filter.reference };\n case \"number_between\":\n return {\n id,\n type: \"and\",\n filters: [\n filter.includeLowerBound\n ? { id: nextId(), type: \"greaterThanOrEqual\" as const, column, x: filter.lowerBound }\n : { id: nextId(), type: \"greaterThan\" as const, column, x: filter.lowerBound },\n filter.includeUpperBound\n ? { id: nextId(), type: \"lessThanOrEqual\" as const, column, x: filter.upperBound }\n : { id: nextId(), type: \"lessThan\" as const, column, x: filter.upperBound },\n ],\n };\n case \"string_equals\":\n return { id, type: \"patternEquals\", column, value: filter.reference };\n case \"string_notEquals\":\n return { id, type: \"patternNotEquals\", column, value: filter.reference };\n case \"string_contains\":\n return { id, type: \"patternContainSubsequence\", column, value: filter.reference };\n case \"string_doesNotContain\":\n return { id, type: \"patternNotContainSubsequence\", column, value: filter.reference };\n case \"string_matches\":\n return { id, type: \"patternMatchesRegularExpression\", column, value: filter.reference };\n case \"string_doesNotMatch\":\n return {\n id,\n type: \"not\",\n filter: {\n id: nextId(),\n type: \"patternMatchesRegularExpression\",\n column,\n value: filter.reference,\n },\n };\n case \"string_containsFuzzyMatch\":\n return {\n id,\n type: \"patternFuzzyContainSubsequence\",\n column,\n value: filter.reference,\n maxEdits: filter.maxEdits,\n substitutionsOnly: filter.substitutionsOnly,\n ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),\n };\n }\n}\n\nexport function createDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n filters: null,\n defaultFilters: null,\n sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 6,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"state-migration.js","names":[],"sources":["../../../src/components/PlDataTable/state-migration.ts"],"sourcesContent":["import type {\n AxisId,\n CanonicalizedJson,\n PObjectId,\n PTableColumnId,\n PTableColumnSpec,\n PTableRecordFilter,\n PTableSorting,\n} from \"@milaboratories/pl-model-common\";\nimport {\n canonicalizeJson,\n getPTableColumnId,\n parseJsonSafely,\n} from \"@milaboratories/pl-model-common\";\nimport { distillFilterSpec } from \"../../filters\";\nimport type { PlDataTableFilterState, PlTableFilter } from \"./typesV4\";\nimport type {\n PlDataTableFiltersWithMeta,\n PlDataTableGridStateCore,\n PlDataTableSheetState,\n PlDataTableStateV2CacheEntry,\n PlDataTableStateV2Normalized,\n PlTableColumnIdJson,\n PTableParamsV2,\n} from \"./typesV7\";\nimport type {\n PlDataTableGridStateV6,\n PlDataTableStateV2V6,\n PlDataTableStateV2V6CacheEntry,\n PlDataTableV6ColIdJson,\n} from \"./typesV6\";\nimport type {\n PlDataTableGridStateV5,\n PlDataTableV5ColIdJson,\n PlDataTableV5ColIdWrapper,\n} from \"./typesV5\";\nimport { isNil } from \"es-toolkit\";\n\n/**\n * PlDataTableV2 persisted state\n */\nexport type PlDataTableStateV2 =\n // Old versions of the state\n | {\n // no version\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sourceId?: string;\n sheets?: Record<CanonicalizedJson<AxisId>, string | number>;\n };\n pTableParams?: {\n sorting?: PTableSorting[];\n filters?: PTableRecordFilter[];\n };\n }\n | {\n version: 2;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n }[];\n pTableParams: {\n hiddenColIds: PObjectId[] | null;\n filters: PTableRecordFilter[];\n sorting: PTableSorting[];\n };\n }\n | {\n version: 3;\n stateCache: {\n sourceId: string;\n gridState: {\n columnOrder?: {\n orderedColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n sort?: {\n sortModel: {\n colId: CanonicalizedJson<PTableColumnSpec>;\n sort: \"asc\" | \"desc\";\n }[];\n };\n columnVisibility?: {\n hiddenColIds: CanonicalizedJson<PTableColumnSpec>[];\n };\n };\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n pTableParams: PTableParamsV2;\n }\n | {\n version: 4;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV6;\n sheetsState: PlDataTableSheetState[];\n filtersState: PlDataTableFilterState[];\n }[];\n /** Old format; only fields used in migration are typed */\n pTableParams: {\n sourceId: string | null;\n hiddenColIds: PObjectId[] | null;\n sorting: PTableSorting[];\n };\n }\n // v5 stored colIds as `{source, labeled}` wrappers; only the gridState shape differs.\n | {\n version: 5;\n stateCache: {\n sourceId: string;\n gridState: PlDataTableGridStateV5;\n sheetsState: PlDataTableSheetState[];\n filtersState: null | PlDataTableFiltersWithMeta;\n defaultFiltersState: null | PlDataTableFiltersWithMeta;\n searchString?: string;\n }[];\n pTableParams: PTableParamsV2;\n }\n // v6 stored colIds as canonicalized full `PTableColumnSpec` (including\n // annotations + `pl7.app/trace`). v7 strips down to `PTableColumnId`.\n | PlDataTableStateV2V6\n // Normalized state\n | PlDataTableStateV2Normalized;\n\n/** Upgrade PlDataTableStateV2 to the latest version */\nexport function upgradePlDataTableStateV2(\n state: PlDataTableStateV2 | undefined,\n): PlDataTableStateV2Normalized {\n // Block just added, had no state, model started earlier than the UI\n if (!state) {\n return createPlDataTableStateV2();\n }\n // v1 -> v2\n if (!(\"version\" in state)) {\n // Non upgradeable as sourceId calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v2 -> v3\n if (state.version === 2) {\n state = {\n version: 3,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n filtersState: [],\n })),\n pTableParams: createDefaultPTableParams(),\n };\n }\n // v3 -> v4\n if (state.version === 3) {\n // Non upgradeable as column ids calculation algorithm has changed, resetting state to default\n state = createPlDataTableStateV2();\n }\n // v4 -> v6: migrate per-column filters to tree-based format (skips v5).\n // v4 gridState already used bare PTableColumnSpec colIds, so we jump\n // straight to v6 without going through the v5 wrapper format.\n if (state.version === 4) {\n state = migrateV4toV6(state);\n }\n // v5 -> v6: unwrap `{source, labeled}` colIds in gridState back to bare PTableColumnSpec.\n if (state.version === 5) {\n state = migrateV5toV6(state);\n }\n // v6 -> v7: shrink colIds from full PTableColumnSpec to PTableColumnId.\n if (state.version === 6) {\n state = migrateV6toV7(state);\n }\n return state;\n}\n\n/** Migrate v5 to v6: unwrap `{source, labeled}` colIds in gridState. */\nfunction migrateV5toV6(state: Extract<PlDataTableStateV2, { version: 5 }>): PlDataTableStateV2V6 {\n // pTableParams reset: v5 stored DiscoveredPColumnId-based hiddenColIds with\n // empty-array fields (e.g. `{column, path: [], columnQualifications: [], ...}`).\n // v6 distills empty fields, so the same logical column serialises differently\n // and lookups would silently miss every previously-hidden discovered column.\n // gridState colIds are derived from PTableColumnSpec and unaffected.\n return {\n version: 6,\n stateCache: state.stateCache.map((entry) => ({\n ...entry,\n gridState: unwrapV5GridState(entry.gridState),\n })),\n pTableParams: createDefaultPTableParams(),\n };\n}\n\n/** Convert v5 wrapped colId JSON to bare PTableColumnSpec JSON, taking `.source`.\n * gridState colIds may include the row-number sentinel (a JSON-stringified\n * literal, not a wrapped spec) — those pass through unchanged. */\nfunction unwrapV5ColId(json: string): string {\n const parsed: unknown = parseJsonSafely(json as CanonicalizedJson<unknown>);\n return !isNil(parsed) && typeof parsed === \"object\" && \"source\" in parsed\n ? canonicalizeJson((parsed as PlDataTableV5ColIdWrapper).source)\n : json;\n}\n\nfunction unwrapV5GridState(gridState: PlDataTableGridStateV5): PlDataTableGridStateV6 {\n const unwrapAs = (json: PlDataTableV5ColIdJson) => unwrapV5ColId(json) as PlDataTableV6ColIdJson;\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(unwrapAs) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: unwrapAs(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(unwrapAs) }\n : undefined,\n };\n}\n\n/** Migrate v6 to v7: rewrite each colId from a full PTableColumnSpec to its\n * compact PTableColumnId (drops annotations/spec body, ~16× smaller per column). */\nfunction migrateV6toV7(state: PlDataTableStateV2V6): PlDataTableStateV2Normalized {\n return {\n version: 7,\n stateCache: state.stateCache.map(\n (entry): PlDataTableStateV2CacheEntry => ({\n ...entry,\n gridState: shrinkV6GridState(entry.gridState),\n }),\n ),\n pTableParams: state.pTableParams,\n };\n}\n\n/** Convert a v6 fat colId (canonicalized PTableColumnSpec) to a v7 compact colId\n * (canonicalized PTableColumnId). The row-number sentinel is a string literal,\n * not a spec — pass it through unchanged. */\nfunction shrinkV6ColId(json: PlDataTableV6ColIdJson): PlTableColumnIdJson {\n const parsed: unknown = parseJsonSafely(json);\n if (!isNil(parsed) && typeof parsed === \"object\" && \"type\" in parsed && \"id\" in parsed) {\n return canonicalizeJson(getPTableColumnId(parsed as PTableColumnSpec));\n }\n return json as unknown as PlTableColumnIdJson;\n}\n\nfunction shrinkV6GridState(gridState: PlDataTableGridStateV6): PlDataTableGridStateCore {\n return {\n columnOrder: gridState.columnOrder\n ? { orderedColIds: gridState.columnOrder.orderedColIds.map(shrinkV6ColId) }\n : undefined,\n sort: gridState.sort\n ? {\n sortModel: gridState.sort.sortModel.map((s) => ({\n colId: shrinkV6ColId(s.colId),\n sort: s.sort,\n })),\n }\n : undefined,\n columnVisibility: gridState.columnVisibility\n ? { hiddenColIds: gridState.columnVisibility.hiddenColIds.map(shrinkV6ColId) }\n : undefined,\n };\n}\n\n/** Migrate v4 state to v6: convert per-column filters to tree-based format (skips v5). */\nfunction migrateV4toV6(state: Extract<PlDataTableStateV2, { version: 4 }>): PlDataTableStateV2V6 {\n let idCounter = 0;\n const nextId = () => ++idCounter;\n\n const migratedCache: PlDataTableStateV2V6CacheEntry[] = state.stateCache.map((entry) => {\n const leaves: PlDataTableFiltersWithMeta[\"filters\"] = [];\n for (const f of entry.filtersState) {\n if (f.filter !== null && !f.filter.disabled) {\n const column = canonicalizeJson(f.id);\n leaves.push(migrateTableFilter(column, f.filter.value, nextId));\n }\n }\n const filtersState: PlDataTableFiltersWithMeta | null =\n leaves.length > 0 ? { id: nextId(), type: \"and\", filters: leaves } : null;\n\n return {\n sourceId: entry.sourceId,\n gridState: entry.gridState,\n sheetsState: entry.sheetsState,\n filtersState,\n defaultFiltersState: null,\n };\n });\n\n const oldSourceId = state.pTableParams.sourceId;\n const currentCache = oldSourceId\n ? migratedCache.find((e) => e.sourceId === oldSourceId)\n : undefined;\n\n return {\n version: 6,\n stateCache: migratedCache,\n pTableParams:\n currentCache && oldSourceId\n ? {\n sourceId: oldSourceId,\n hiddenColIds:\n state.pTableParams.hiddenColIds?.map((id) => ({ type: \"column\" as const, id })) ??\n null,\n filters: distillFilterSpec(currentCache.filtersState),\n defaultFilters: null,\n sorting: state.pTableParams.sorting,\n }\n : createDefaultPTableParams(),\n };\n}\n\n/** Migrate a single per-column PlTableFilter to a tree-based FilterSpec node */\nfunction migrateTableFilter(\n column: CanonicalizedJson<PTableColumnId>,\n filter: PlTableFilter,\n nextId: () => number,\n): PlDataTableFiltersWithMeta[\"filters\"][number] {\n const id = nextId();\n switch (filter.type) {\n case \"isNA\":\n return { id, type: \"isNA\", column };\n case \"isNotNA\":\n return { id, type: \"isNotNA\", column };\n case \"number_equals\":\n return { id, type: \"equal\", column, x: filter.reference };\n case \"number_notEquals\":\n return { id, type: \"notEqual\", column, x: filter.reference };\n case \"number_greaterThan\":\n return { id, type: \"greaterThan\", column, x: filter.reference };\n case \"number_greaterThanOrEqualTo\":\n return { id, type: \"greaterThanOrEqual\", column, x: filter.reference };\n case \"number_lessThan\":\n return { id, type: \"lessThan\", column, x: filter.reference };\n case \"number_lessThanOrEqualTo\":\n return { id, type: \"lessThanOrEqual\", column, x: filter.reference };\n case \"number_between\":\n return {\n id,\n type: \"and\",\n filters: [\n filter.includeLowerBound\n ? { id: nextId(), type: \"greaterThanOrEqual\" as const, column, x: filter.lowerBound }\n : { id: nextId(), type: \"greaterThan\" as const, column, x: filter.lowerBound },\n filter.includeUpperBound\n ? { id: nextId(), type: \"lessThanOrEqual\" as const, column, x: filter.upperBound }\n : { id: nextId(), type: \"lessThan\" as const, column, x: filter.upperBound },\n ],\n };\n case \"string_equals\":\n return { id, type: \"patternEquals\", column, value: filter.reference };\n case \"string_notEquals\":\n return { id, type: \"patternNotEquals\", column, value: filter.reference };\n case \"string_contains\":\n return { id, type: \"patternContainSubsequence\", column, value: filter.reference };\n case \"string_doesNotContain\":\n return { id, type: \"patternNotContainSubsequence\", column, value: filter.reference };\n case \"string_matches\":\n return { id, type: \"patternMatchesRegularExpression\", column, value: filter.reference };\n case \"string_doesNotMatch\":\n return {\n id,\n type: \"not\",\n filter: {\n id: nextId(),\n type: \"patternMatchesRegularExpression\",\n column,\n value: filter.reference,\n },\n };\n case \"string_containsFuzzyMatch\":\n return {\n id,\n type: \"patternFuzzyContainSubsequence\",\n column,\n value: filter.reference,\n maxEdits: filter.maxEdits,\n substitutionsOnly: filter.substitutionsOnly,\n ...(filter.wildcard !== undefined ? { wildcard: filter.wildcard } : {}),\n };\n }\n}\n\nexport function createDefaultPTableParams(): PTableParamsV2 {\n return {\n sourceId: null,\n hiddenColIds: null,\n filters: null,\n defaultFilters: null,\n sorting: [],\n };\n}\n\nexport function createPlDataTableStateV2(): PlDataTableStateV2Normalized {\n return {\n version: 7,\n stateCache: [],\n pTableParams: createDefaultPTableParams(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,98 +1,40 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Nil } from "@milaboratories/helpers";
|
|
1
|
+
import { PTableParamsV2, PlDataTableFiltersWithMeta, PlDataTableSheetState } from "./typesV7.js";
|
|
2
|
+
import { CanonicalizedJson, PTableColumnSpec } from "@milaboratories/pl-model-common";
|
|
4
3
|
|
|
5
4
|
//#region src/components/PlDataTable/typesV6.d.ts
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
/**
|
|
6
|
+
* v6 colId scheme: bare canonicalized `PTableColumnSpec` (full spec including
|
|
7
|
+
* all annotations and `pl7.app/trace`). v7 dropped the spec body and now uses
|
|
8
|
+
* `CanonicalizedJson<PTableColumnId>` — orders of magnitude smaller.
|
|
9
|
+
*/
|
|
10
|
+
type PlDataTableV6ColIdJson = CanonicalizedJson<PTableColumnSpec>;
|
|
11
|
+
type PlDataTableGridStateV6 = {
|
|
12
|
+
columnOrder?: {
|
|
13
|
+
orderedColIds: PlDataTableV6ColIdJson[];
|
|
14
|
+
};
|
|
11
15
|
sort?: {
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
sortModel: {
|
|
17
|
+
colId: PlDataTableV6ColIdJson;
|
|
14
18
|
sort: "asc" | "desc";
|
|
15
19
|
}[];
|
|
16
|
-
};
|
|
20
|
+
};
|
|
17
21
|
columnVisibility?: {
|
|
18
|
-
|
|
22
|
+
hiddenColIds: PlDataTableV6ColIdJson[];
|
|
19
23
|
};
|
|
20
24
|
};
|
|
21
|
-
type
|
|
22
|
-
/** spec of the axis to use */axis: AxisSpec; /** options to show in the filter dropdown */
|
|
23
|
-
options: ListOptionBase<string | number>[]; /** default (selected) value */
|
|
24
|
-
defaultValue?: string | number;
|
|
25
|
-
};
|
|
26
|
-
type PlDataTableSheetState = {
|
|
27
|
-
/** id of the axis */axisId: AxisId; /** selected value */
|
|
28
|
-
value: string | number;
|
|
29
|
-
};
|
|
30
|
-
/** Tree-based filter state compatible with PlAdvancedFilter's RootFilter */
|
|
31
|
-
type PlDataTableFilterMeta = {
|
|
32
|
-
id: number;
|
|
33
|
-
source?: "table-filter" | "table-search";
|
|
34
|
-
isExpanded?: boolean;
|
|
35
|
-
isSuppressed?: boolean;
|
|
36
|
-
};
|
|
37
|
-
type PlDataTableFilterSpecLeaf = FilterSpecLeaf$1<CanonicalizedJson<PTableColumnId>>;
|
|
38
|
-
type PlDataTableFilters = RootFilterSpec<PlDataTableFilterSpecLeaf>;
|
|
39
|
-
type PlDataTableFiltersWithMeta = RootFilterSpec<PlDataTableFilterSpecLeaf, PlDataTableFilterMeta>;
|
|
40
|
-
type PlDataTableStateV2CacheEntry = {
|
|
41
|
-
/** DataSource identifier for state management */sourceId: string; /** Internal ag-grid state */
|
|
42
|
-
gridState: PlDataTableGridStateCore; /** Sheets state */
|
|
43
|
-
sheetsState: PlDataTableSheetState[]; /** User filters state (tree-based, compatible with PlAdvancedFilter) */
|
|
44
|
-
filtersState: null | PlDataTableFiltersWithMeta; /** Default filters state from model (snapshot of defaults) */
|
|
45
|
-
defaultFiltersState: null | PlDataTableFiltersWithMeta; /** Fast search string */
|
|
46
|
-
searchString?: string;
|
|
47
|
-
};
|
|
48
|
-
type PTableParamsV2 = {
|
|
49
|
-
sourceId: null;
|
|
50
|
-
hiddenColIds: null;
|
|
51
|
-
sorting: [];
|
|
52
|
-
filters: null;
|
|
53
|
-
defaultFilters: null;
|
|
54
|
-
} | {
|
|
25
|
+
type PlDataTableStateV2V6CacheEntry = {
|
|
55
26
|
sourceId: string;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
27
|
+
gridState: PlDataTableGridStateV6;
|
|
28
|
+
sheetsState: PlDataTableSheetState[];
|
|
29
|
+
filtersState: null | PlDataTableFiltersWithMeta;
|
|
30
|
+
defaultFiltersState: null | PlDataTableFiltersWithMeta;
|
|
31
|
+
searchString?: string;
|
|
60
32
|
};
|
|
61
|
-
type
|
|
62
|
-
|
|
63
|
-
stateCache:
|
|
33
|
+
type PlDataTableStateV2V6 = {
|
|
34
|
+
version: 6;
|
|
35
|
+
stateCache: PlDataTableStateV2V6CacheEntry[];
|
|
64
36
|
pTableParams: PTableParamsV2;
|
|
65
37
|
};
|
|
66
|
-
/** PlAgDataTable model */
|
|
67
|
-
type PlDataTableModel = {
|
|
68
|
-
/** DataSource identifier for state management */sourceId: null | string; /** p-table including all columns, used to show the full specification of the table */
|
|
69
|
-
fullTableHandle?: PTableHandle; /** p-frame handle */
|
|
70
|
-
fullPframeHandle?: PFrameHandle; /** p-table including only visible columns, used to get the data */
|
|
71
|
-
visibleTableHandle?: PTableHandle; /** Default filters from model options, surfaced for UI display */
|
|
72
|
-
defaultFilters?: Nil | PlDataTableFilters;
|
|
73
|
-
};
|
|
74
|
-
type CreatePlDataTableOps = {
|
|
75
|
-
/** Filters for columns and non-partitioned axes */filters?: PlDataTableFilters; /** Sorting to columns hidden from user */
|
|
76
|
-
sorting?: PTableSorting[];
|
|
77
|
-
/**
|
|
78
|
-
* Selects columns for which will be inner-joined to the table.
|
|
79
|
-
*
|
|
80
|
-
* Default behaviour: all columns are considered to be core
|
|
81
|
-
*/
|
|
82
|
-
coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;
|
|
83
|
-
/**
|
|
84
|
-
* Determines how core columns should be joined together:
|
|
85
|
-
* inner - so user will only see records present in all core columns
|
|
86
|
-
* full - so user will only see records present in any of the core columns
|
|
87
|
-
*
|
|
88
|
-
* All non-core columns will be left joined to the table produced by the core
|
|
89
|
-
* columns, in other words records form the pool of non-core columns will only
|
|
90
|
-
* make their way into the final table if core table contains corresponding key.
|
|
91
|
-
*
|
|
92
|
-
* Default: 'full'
|
|
93
|
-
*/
|
|
94
|
-
coreJoinType?: "inner" | "full";
|
|
95
|
-
};
|
|
96
38
|
//#endregion
|
|
97
|
-
export {
|
|
39
|
+
export { PlDataTableGridStateV6, PlDataTableStateV2V6 };
|
|
98
40
|
//# sourceMappingURL=typesV6.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typesV6.d.ts","names":[],"sources":["../../../src/components/PlDataTable/typesV6.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"typesV6.d.ts","names":[],"sources":["../../../src/components/PlDataTable/typesV6.ts"],"mappings":";;;;;;AAQA;;;KAAY,sBAAA,GAAyB,iBAAA,CAAkB,gBAAA;AAAA,KAE3C,sBAAA;EACV,WAAA;IAAgB,aAAA,EAAe,sBAAA;EAAA;EAC/B,IAAA;IAAS,SAAA;MAAa,KAAA,EAAO,sBAAA;MAAwB,IAAA;IAAA;EAAA;EACrD,gBAAA;IAAqB,YAAA,EAAc,sBAAA;EAAA;AAAA;AAAA,KAGzB,8BAAA;EACV,QAAA;EACA,SAAA,EAAW,sBAAA;EACX,WAAA,EAAa,qBAAA;EACb,YAAA,SAAqB,0BAAA;EACrB,mBAAA,SAA4B,0BAAA;EAC5B,YAAA;AAAA;AAAA,KAGU,oBAAA;EACV,OAAA;EACA,UAAA,EAAY,8BAAA;EACZ,YAAA,EAAc,cAAA;AAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { FilterSpecLeaf as FilterSpecLeaf$1 } from "../../filters/types.js";
|
|
2
|
+
import { AxisId, AxisSpec, CanonicalizedJson, ListOptionBase, PColumnIdAndSpec, PFrameHandle, PTableColumnId, PTableHandle, PTableSorting, RootFilterSpec } from "@milaboratories/pl-model-common";
|
|
3
|
+
import { Nil } from "@milaboratories/helpers";
|
|
4
|
+
|
|
5
|
+
//#region src/components/PlDataTable/typesV7.d.ts
|
|
6
|
+
type PlTableColumnIdJson = CanonicalizedJson<PTableColumnId>;
|
|
7
|
+
type PlDataTableGridStateCore = {
|
|
8
|
+
/** Includes column ordering */columnOrder?: {
|
|
9
|
+
/** All colIds in order */orderedColIds: PlTableColumnIdJson[];
|
|
10
|
+
}; /** Includes current sort columns and direction */
|
|
11
|
+
sort?: {
|
|
12
|
+
/** Sorted columns and directions in order */sortModel: {
|
|
13
|
+
/** Column Id to apply the sort to. */colId: PlTableColumnIdJson; /** Sort direction */
|
|
14
|
+
sort: "asc" | "desc";
|
|
15
|
+
}[];
|
|
16
|
+
}; /** Includes column visibility */
|
|
17
|
+
columnVisibility?: {
|
|
18
|
+
/** All colIds which were hidden */hiddenColIds: PlTableColumnIdJson[];
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
type PlDataTableSheet = {
|
|
22
|
+
/** spec of the axis to use */axis: AxisSpec; /** options to show in the filter dropdown */
|
|
23
|
+
options: ListOptionBase<string | number>[]; /** default (selected) value */
|
|
24
|
+
defaultValue?: string | number;
|
|
25
|
+
};
|
|
26
|
+
type PlDataTableSheetState = {
|
|
27
|
+
/** id of the axis */axisId: AxisId; /** selected value */
|
|
28
|
+
value: string | number;
|
|
29
|
+
};
|
|
30
|
+
/** Tree-based filter state compatible with PlAdvancedFilter's RootFilter */
|
|
31
|
+
type PlDataTableFilterMeta = {
|
|
32
|
+
id: number;
|
|
33
|
+
source?: "table-filter" | "table-search";
|
|
34
|
+
isExpanded?: boolean;
|
|
35
|
+
isSuppressed?: boolean;
|
|
36
|
+
};
|
|
37
|
+
type PlDataTableFilterSpecLeaf = FilterSpecLeaf$1<CanonicalizedJson<PTableColumnId>>;
|
|
38
|
+
type PlDataTableFilters = RootFilterSpec<PlDataTableFilterSpecLeaf>;
|
|
39
|
+
type PlDataTableFiltersWithMeta = RootFilterSpec<PlDataTableFilterSpecLeaf, PlDataTableFilterMeta>;
|
|
40
|
+
type PlDataTableStateV2CacheEntry = {
|
|
41
|
+
/** DataSource identifier for state management */sourceId: string; /** Internal ag-grid state */
|
|
42
|
+
gridState: PlDataTableGridStateCore; /** Sheets state */
|
|
43
|
+
sheetsState: PlDataTableSheetState[]; /** User filters state (tree-based, compatible with PlAdvancedFilter) */
|
|
44
|
+
filtersState: null | PlDataTableFiltersWithMeta; /** Default filters state from model (snapshot of defaults) */
|
|
45
|
+
defaultFiltersState: null | PlDataTableFiltersWithMeta; /** Fast search string */
|
|
46
|
+
searchString?: string;
|
|
47
|
+
};
|
|
48
|
+
type PTableParamsV2 = {
|
|
49
|
+
sourceId: null;
|
|
50
|
+
hiddenColIds: null;
|
|
51
|
+
sorting: [];
|
|
52
|
+
filters: null;
|
|
53
|
+
defaultFilters: null;
|
|
54
|
+
} | {
|
|
55
|
+
sourceId: string;
|
|
56
|
+
hiddenColIds: null | PTableColumnId[];
|
|
57
|
+
sorting: PTableSorting[];
|
|
58
|
+
filters: null | PlDataTableFilters;
|
|
59
|
+
defaultFilters: null | PlDataTableFilters;
|
|
60
|
+
};
|
|
61
|
+
type PlDataTableStateV2Normalized = {
|
|
62
|
+
/** Version for upgrades */version: 7; /** Internal states, LRU cache for 5 sourceId-s */
|
|
63
|
+
stateCache: PlDataTableStateV2CacheEntry[]; /** PTable params derived from the cache state for the current sourceId */
|
|
64
|
+
pTableParams: PTableParamsV2;
|
|
65
|
+
};
|
|
66
|
+
/** PlAgDataTable model */
|
|
67
|
+
type PlDataTableModel = {
|
|
68
|
+
/** DataSource identifier for state management */sourceId: null | string; /** p-table including all columns, used to show the full specification of the table */
|
|
69
|
+
fullTableHandle?: PTableHandle; /** p-frame handle */
|
|
70
|
+
fullPframeHandle?: PFrameHandle; /** p-table including only visible columns, used to get the data */
|
|
71
|
+
visibleTableHandle?: PTableHandle; /** Default filters from model options, surfaced for UI display */
|
|
72
|
+
defaultFilters?: Nil | PlDataTableFilters;
|
|
73
|
+
};
|
|
74
|
+
type CreatePlDataTableOps = {
|
|
75
|
+
/** Filters for columns and non-partitioned axes */filters?: PlDataTableFilters; /** Sorting to columns hidden from user */
|
|
76
|
+
sorting?: PTableSorting[];
|
|
77
|
+
/**
|
|
78
|
+
* Selects columns for which will be inner-joined to the table.
|
|
79
|
+
*
|
|
80
|
+
* Default behaviour: all columns are considered to be core
|
|
81
|
+
*/
|
|
82
|
+
coreColumnPredicate?: (spec: PColumnIdAndSpec) => boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Determines how core columns should be joined together:
|
|
85
|
+
* inner - so user will only see records present in all core columns
|
|
86
|
+
* full - so user will only see records present in any of the core columns
|
|
87
|
+
*
|
|
88
|
+
* All non-core columns will be left joined to the table produced by the core
|
|
89
|
+
* columns, in other words records form the pool of non-core columns will only
|
|
90
|
+
* make their way into the final table if core table contains corresponding key.
|
|
91
|
+
*
|
|
92
|
+
* Default: 'full'
|
|
93
|
+
*/
|
|
94
|
+
coreJoinType?: "inner" | "full";
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
export { CreatePlDataTableOps, PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson };
|
|
98
|
+
//# sourceMappingURL=typesV7.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typesV7.d.ts","names":[],"sources":["../../../src/components/PlDataTable/typesV7.ts"],"mappings":";;;;;KAeY,mBAAA,GAAsB,iBAAA,CAAkB,cAAA;AAAA,KAExC,wBAAA;iCAEV,WAAA;IAJ6B,0BAM3B,aAAA,EAAe,mBAAA;EAAA,GAN+C;EAShE,IAAA;IAPkC,6CAShC,SAAA;MALe,sCAOb,KAAA,EAAO,mBAAA,EAQK;MANZ,IAAA;IAAA;EAAA,GATF;EAaF,gBAAA;IAVA,mCAYE,YAAA,EAAc,mBAAA;EAAA;AAAA;AAAA,KAIN,gBAAA;EANV,8BAQA,IAAA,EAAM,QAAA,EANU;EAQhB,OAAA,EAAS,cAAA,qBAR0B;EAUnC,YAAA;AAAA;AAAA,KAGU,qBAAA;EALa,qBAOvB,MAAA,EAAQ,MAAA,EATF;EAWN,KAAA;AAAA;;KAIU,qBAAA;EACV,EAAA;EACA,MAAA;EACA,UAAA;EACA,YAAA;AAAA;AAAA,KAEU,yBAAA,GAA4B,gBAAA,CAAe,iBAAA,CAAkB,cAAA;AAAA,KAC7D,kBAAA,GAAqB,cAAA,CAAe,yBAAA;AAAA,KACpC,0BAAA,GAA6B,cAAA,CACvC,yBAAA,EACA,qBAAA;AAAA,KAGU,4BAAA;EAjBL,iDAmBL,QAAA,UAf+B;EAiB/B,SAAA,EAAW,wBAAA,EAjBoB;EAmB/B,WAAA,EAAa,qBAAA,IAjBb;EAmBA,YAAA,SAAqB,0BAAA,EAjBrB;EAmBA,mBAAA,SAA4B,0BAAA,EAnBhB;EAqBZ,YAAA;AAAA;AAAA,KAGU,cAAA;EAEN,QAAA;EACA,YAAA;EACA,OAAA;EACA,OAAA;EACA,cAAA;AAAA;EAGA,QAAA;EACA,YAAA,SAAqB,cAAA;EACrB,OAAA,EAAS,aAAA;EACT,OAAA,SAAgB,kBAAA;EAChB,cAAA,SAAuB,kBAAA;AAAA;AAAA,KAGjB,4BAAA;EArCqB,2BAuC/B,OAAA,KAtCU;EAwCV,UAAA,EAAY,4BAAA;EAEZ,YAAA,EAAc,cAAA;AAAA;;KAIJ,gBAAA;EA9C2C,iDAgDrD,QAAA,iBA/CA;EAiDA,eAAA,GAAkB,YAAA,EAhDG;EAkDrB,gBAAA,GAAmB,YAAA,EA/CT;EAiDV,kBAAA,GAAqB,YAAA;EAErB,cAAA,GAAiB,GAAA,GAAM,kBAAA;AAAA;AAAA,KAGb,oBAAA;EA5CkB,mDA8C5B,OAAA,GAAU,kBAAA,EA9C4C;EAiDtD,OAAA,GAAU,aAAA;EAvDV;;;;;EA8DA,mBAAA,IAAuB,IAAA,EAAM,gBAAA;EAxD7B;;;;;AAKF;;;;;;EAgEE,YAAA;AAAA"}
|
|
@@ -5,7 +5,7 @@ import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType
|
|
|
5
5
|
import { DatasetOption, DatasetSelection, createDatasetSelection, isDatasetSelection } from "./PlDatasetSelector/dataset_selection.js";
|
|
6
6
|
import { FilterMatchOptions, buildRefMap, filterMatchesToOptions, findFilterColumns } from "./PlDatasetSelector/filter_discovery.js";
|
|
7
7
|
import { BuildDatasetOptions, buildDatasetOptions } from "./PlDatasetSelector/build_dataset_options.js";
|
|
8
|
-
import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./PlDataTable/
|
|
8
|
+
import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./PlDataTable/typesV7.js";
|
|
9
9
|
import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./PlDataTable/state-migration.js";
|
|
10
10
|
import { createPlDataTableSheet } from "./PlDataTable/createPlDataTableSheet.js";
|
|
11
11
|
import { createPlDataTableV2 } from "./PlDataTable/createPlDataTable/createPlDataTableV2.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType
|
|
|
51
51
|
import { DatasetOption, DatasetSelection, createDatasetSelection, isDatasetSelection } from "./components/PlDatasetSelector/dataset_selection.js";
|
|
52
52
|
import { FilterMatchOptions, buildRefMap, filterMatchesToOptions, findFilterColumns } from "./components/PlDatasetSelector/filter_discovery.js";
|
|
53
53
|
import { BuildDatasetOptions, buildDatasetOptions } from "./components/PlDatasetSelector/build_dataset_options.js";
|
|
54
|
-
import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./components/PlDataTable/
|
|
54
|
+
import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnIdJson } from "./components/PlDataTable/typesV7.js";
|
|
55
55
|
import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./components/PlDataTable/state-migration.js";
|
|
56
56
|
import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTableSheet.js";
|
|
57
57
|
import { createPlDataTableV2 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV2.js";
|
package/dist/package.cjs
CHANGED
package/dist/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/model",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.77.4",
|
|
4
4
|
"description": "Platforma.bio SDK / Block Model",
|
|
5
5
|
"files": [
|
|
6
6
|
"./dist/**/*",
|
|
@@ -32,20 +32,20 @@
|
|
|
32
32
|
"zod": "~3.25.76",
|
|
33
33
|
"@milaboratories/helpers": "1.14.2",
|
|
34
34
|
"@milaboratories/pl-error-like": "1.12.10",
|
|
35
|
-
"@milaboratories/pl-model-
|
|
36
|
-
"@milaboratories/
|
|
37
|
-
"@milaboratories/
|
|
35
|
+
"@milaboratories/pl-model-middle-layer": "1.20.0",
|
|
36
|
+
"@milaboratories/ptabler-expression-js": "1.2.25",
|
|
37
|
+
"@milaboratories/pl-model-common": "1.42.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@vitest/coverage-istanbul": "^4.1.3",
|
|
41
41
|
"fast-json-patch": "^3.1.1",
|
|
42
42
|
"typescript": "~5.9.3",
|
|
43
43
|
"vitest": "^4.1.3",
|
|
44
|
+
"@milaboratories/pf-spec-driver": "1.3.17",
|
|
45
|
+
"@milaboratories/pf-driver": "1.4.12",
|
|
46
|
+
"@milaboratories/ts-builder": "1.5.0",
|
|
44
47
|
"@milaboratories/ts-configs": "1.2.3",
|
|
45
|
-
"@milaboratories/build-configs": "2.0.0"
|
|
46
|
-
"@milaboratories/pf-driver": "1.4.11",
|
|
47
|
-
"@milaboratories/pf-spec-driver": "1.3.16",
|
|
48
|
-
"@milaboratories/ts-builder": "1.4.0"
|
|
48
|
+
"@milaboratories/build-configs": "2.0.0"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "ts-builder build --target node",
|
|
@@ -374,10 +374,17 @@ function resolveAnchorMap(
|
|
|
374
374
|
const getDuplicateError = (key: string) =>
|
|
375
375
|
`Anchor "${key}": selector matched a column that was already matched by another anchor; please refine the selector to match a different column`;
|
|
376
376
|
|
|
377
|
+
// O(1) lookup maps built lazily — only when an anchor of the matching kind is
|
|
378
|
+
// encountered. Avoids O(anchors × columns) `deriveNativeId` calls, which were
|
|
379
|
+
// tripping the QuickJS interrupt deadline on tables with many anchors.
|
|
380
|
+
let byId: Map<PObjectId, ColumnSnapshot<PObjectId>> | undefined;
|
|
381
|
+
let byNativeId: Map<NativePObjectId, ColumnSnapshot<PObjectId>> | undefined;
|
|
382
|
+
|
|
377
383
|
for (const [name, anchor] of Object.entries(anchors)) {
|
|
378
384
|
if (typeof anchor === "string") {
|
|
385
|
+
if (byId === undefined) byId = new Map(columns.map((col) => [col.id, col]));
|
|
379
386
|
const found =
|
|
380
|
-
|
|
387
|
+
byId.get(anchor) ??
|
|
381
388
|
throwError(`Anchor "${name}": column with id "${anchor}" not found in sources`);
|
|
382
389
|
if (resovedIds.has(found.id)) {
|
|
383
390
|
throwError(getDuplicateError(name));
|
|
@@ -386,9 +393,11 @@ function resolveAnchorMap(
|
|
|
386
393
|
resovedIds.add(found.id);
|
|
387
394
|
} else if ("kind" in anchor) {
|
|
388
395
|
if (!isPColumnSpec(anchor)) throwError(`Anchor "${name}": invalid PColumnSpec`);
|
|
389
|
-
|
|
396
|
+
if (byNativeId === undefined) {
|
|
397
|
+
byNativeId = new Map(columns.map((col) => [deriveNativeId(col.spec), col]));
|
|
398
|
+
}
|
|
390
399
|
const found =
|
|
391
|
-
|
|
400
|
+
byNativeId.get(deriveNativeId(anchor)) ??
|
|
392
401
|
throwError(`Anchor "${name}": no column matching spec found in sources`);
|
|
393
402
|
if (resovedIds.has(found.id)) {
|
|
394
403
|
throwError(getDuplicateError(name));
|
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
import { getColumnIdAndSpec } from "@milaboratories/pl-model-common";
|
|
10
10
|
import type { PColumnDataUniversal, TreeNodeAccessor } from "../../../render";
|
|
11
11
|
import { isFunction } from "es-toolkit";
|
|
12
|
-
import type { PlDataTableFilters } from "../
|
|
12
|
+
import type { PlDataTableFilters } from "../typesV7";
|
|
13
13
|
import { createPTableDefV3 } from "./createPTableDefV3";
|
|
14
14
|
|
|
15
15
|
export function createPTableDefV2(params: {
|
|
@@ -13,7 +13,7 @@ import type {
|
|
|
13
13
|
import { isBooleanExpression } from "@milaboratories/pl-model-common";
|
|
14
14
|
import type { PColumnDataUniversal } from "../../../render";
|
|
15
15
|
import { isNil } from "es-toolkit";
|
|
16
|
-
import type { PlDataTableFilters } from "../
|
|
16
|
+
import type { PlDataTableFilters } from "../typesV7";
|
|
17
17
|
import { distillFilterSpec, filterSpecToSpecQueryExpr } from "../../../filters";
|
|
18
18
|
import type { Nil } from "@milaboratories/helpers";
|
|
19
19
|
|
|
@@ -25,7 +25,7 @@ import type {
|
|
|
25
25
|
} from "../../../render";
|
|
26
26
|
import { allPColumnsReady, deriveLabels, PColumnCollection } from "../../../render";
|
|
27
27
|
import { identity } from "es-toolkit";
|
|
28
|
-
import type { CreatePlDataTableOps, PlDataTableModel } from "../
|
|
28
|
+
import type { CreatePlDataTableOps, PlDataTableModel } from "../typesV7";
|
|
29
29
|
import { upgradePlDataTableStateV2 } from "../state-migration";
|
|
30
30
|
import type { PlDataTableStateV2 } from "../state-migration";
|
|
31
31
|
import { getMatchingLabelColumns } from "../labels";
|
|
@@ -17,7 +17,7 @@ import { canonicalizeJson, getAxisId, parseJson, uniqueBy } from "@milaboratorie
|
|
|
17
17
|
import { collectFilterSpecColumns, traverseFilterSpec } from "../../../filters/traverse";
|
|
18
18
|
import type { RenderCtxBase, PColumnDataUniversal } from "../../../render";
|
|
19
19
|
import { isEmpty } from "es-toolkit/compat";
|
|
20
|
-
import type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from "../
|
|
20
|
+
import type { PlDataTableFilters, PlDataTableFilterSpecLeaf, PlDataTableModel } from "../typesV7";
|
|
21
21
|
import { upgradePlDataTableStateV2 } from "../state-migration";
|
|
22
22
|
import type { PlDataTableStateV2 } from "../state-migration";
|
|
23
23
|
import type { ColumnSelector, ColumnSnapshot, ColumnVariant, MatchingMode } from "../../../columns";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RenderCtxBase } from "../../../render";
|
|
2
|
-
import type { PlDataTableModel } from "../
|
|
2
|
+
import type { PlDataTableModel } from "../typesV7";
|
|
3
3
|
import { createPlDataTableOptionsV2, createPlDataTableV2 } from "./createPlDataTableV2";
|
|
4
4
|
import { createPlDataTableV3 } from "./createPlDataTableV3";
|
|
5
5
|
import type { createPlDataTableOptionsV3 } from "./createPlDataTableV3";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AxisSpec } from "@milaboratories/pl-model-common";
|
|
2
2
|
import type { RenderCtxBase } from "../../render";
|
|
3
|
-
import type { PlDataTableSheet } from "./
|
|
3
|
+
import type { PlDataTableSheet } from "./typesV7";
|
|
4
4
|
|
|
5
5
|
/** Create sheet entries for PlDataTable */
|
|
6
6
|
export function createPlDataTableSheet<A, U>(
|