@platforma-sdk/model 1.58.19 → 1.59.0

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.
Files changed (35) hide show
  1. package/dist/block_model.cjs +6 -5
  2. package/dist/block_model.cjs.map +1 -1
  3. package/dist/block_model.js +6 -5
  4. package/dist/block_model.js.map +1 -1
  5. package/dist/block_model_legacy.cjs +3 -1
  6. package/dist/block_model_legacy.cjs.map +1 -1
  7. package/dist/block_model_legacy.js +3 -1
  8. package/dist/block_model_legacy.js.map +1 -1
  9. package/dist/components/PlDataTable/labels.cjs +7 -3
  10. package/dist/components/PlDataTable/labels.cjs.map +1 -1
  11. package/dist/components/PlDataTable/labels.js +7 -3
  12. package/dist/components/PlDataTable/labels.js.map +1 -1
  13. package/dist/package.cjs +1 -1
  14. package/dist/package.js +1 -1
  15. package/dist/pframe_utils/axes.cjs +17 -2
  16. package/dist/pframe_utils/axes.cjs.map +1 -1
  17. package/dist/pframe_utils/axes.js +17 -2
  18. package/dist/pframe_utils/axes.js.map +1 -1
  19. package/dist/platforma.d.ts +2 -1
  20. package/dist/render/api.cjs +3 -1
  21. package/dist/render/api.cjs.map +1 -1
  22. package/dist/render/api.js +3 -1
  23. package/dist/render/api.js.map +1 -1
  24. package/dist/render/util/column_collection.cjs +4 -2
  25. package/dist/render/util/column_collection.cjs.map +1 -1
  26. package/dist/render/util/column_collection.js +4 -2
  27. package/dist/render/util/column_collection.js.map +1 -1
  28. package/package.json +5 -5
  29. package/src/block_model.ts +32 -30
  30. package/src/block_model_legacy.ts +6 -3
  31. package/src/components/PlDataTable/labels.ts +17 -4
  32. package/src/pframe_utils/axes.ts +23 -1
  33. package/src/platforma.ts +2 -0
  34. package/src/render/api.ts +9 -1
  35. package/src/render/util/column_collection.ts +13 -7
@@ -1 +1 @@
1
- {"version":3,"file":"block_model_legacy.js","names":["#done"],"sources":["../src/block_model_legacy.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n AnyFunction,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport type { Checked, ConfigResult, TypedConfig } from \"./config\";\nimport { getImmediate } from \"./config\";\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from \"./internal\";\nimport type { Platforma, PlatformaApiVersion, PlatformaV1, PlatformaV2 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunctionLegacy } from \"./render\";\nimport { RenderCtxLegacy } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport type {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromConfigs,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = \"/\",\n> {\n private constructor(\n private config: {\n readonly renderingMode: BlockRenderingMode;\n readonly initialArgs?: Args;\n readonly initialUiState: UiState;\n readonly outputs: OutputsCfg;\n readonly inputsValid: TypedConfigOrConfigLambda;\n readonly sections: TypedConfigOrConfigLambda;\n readonly title?: ConfigRenderLambda;\n readonly subtitle?: ConfigRenderLambda;\n readonly tags?: ConfigRenderLambda;\n readonly enrichmentTargets?: ConfigRenderLambda;\n readonly featureFlags: BlockCodeKnownFeatureFlags;\n },\n ) {}\n\n public static get INITIAL_BLOCK_FEATURE_FLAGS(): BlockCodeKnownFeatureFlags {\n return {\n supportsLazyState: true,\n requiresUIAPIVersion: 1,\n requiresModelAPIVersion: 1,\n requiresCreatePTable: 2,\n };\n }\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = \"Heavy\"): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>({\n renderingMode,\n initialUiState: {},\n outputs: {},\n inputsValid: getImmediate(true),\n sections: getImmediate([]),\n featureFlags: BlockModel.INITIAL_BLOCK_FEATURE_FLAGS,\n });\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg,\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunctionLegacy<Args, UiState>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModel<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & { withStatus: true };\n },\n UiState,\n Href\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunctionLegacy<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | AnyFunction,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === \"function\") {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtxLegacy()));\n return new BlockModel({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags,\n },\n },\n });\n } else {\n return new BlockModel({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: cfgOrRf,\n },\n });\n }\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /** Shortcut for {@link output} with retentive and withStatus flags set to true. */\n public retentiveOutputWithStatus<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { retentive: true, withStatus: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>,\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunctionLegacy<Args, UiState, boolean>>(\n rf: RF,\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === \"function\") {\n tryRegisterCallback(\"inputsValid\", () => cfgOrRf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n inputsValid: {\n __renderLambda: true,\n handle: \"inputsValid\",\n },\n });\n } else {\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n inputsValid: cfgOrRf,\n });\n }\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S,\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunctionLegacy<Args, UiState, Ret>,\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>,\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === \"function\") {\n tryRegisterCallback(\"sections\", () => arrOrCfgOrRf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n sections: {\n __renderLambda: true,\n handle: \"sections\",\n },\n });\n } else {\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n sections: arrOrCfgOrRf as TypedConfig,\n });\n }\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunctionLegacy<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"title\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n title: {\n __renderLambda: true,\n handle: \"title\",\n },\n });\n }\n\n public subtitle(\n rf: RenderFunctionLegacy<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"subtitle\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n subtitle: {\n __renderLambda: true,\n handle: \"subtitle\",\n },\n });\n }\n\n public tags(\n rf: RenderFunctionLegacy<Args, UiState, string[]>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"tags\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n tags: {\n __renderLambda: true,\n handle: \"tags\",\n },\n });\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return this.withArgs(value);\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialArgs: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n initialArgs,\n });\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(\n initialUiState: UiState,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n initialUiState,\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n featureFlags: {\n ...this.config.featureFlags,\n ...flags,\n },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(lambda: (args: Args) => PlRef[]): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"enrichmentTargets\", lambda);\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n enrichmentTargets: {\n __renderLambda: true,\n handle: \"enrichmentTargets\",\n },\n });\n }\n\n public done(\n apiVersion?: 1,\n ): PlatformaExtended<\n PlatformaV1<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n >;\n\n public done(\n apiVersion: 2,\n ): PlatformaExtended<\n PlatformaV2<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n >;\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(\n apiVersion: PlatformaApiVersion = 1,\n ): PlatformaExtended<\n Platforma<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n requiresUIAPIVersion: apiVersion,\n }).#done();\n }\n\n #done(): PlatformaExtended<\n Platforma<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n > {\n if (this.config.initialArgs === undefined) throw new Error(\"Initial arguments not set.\");\n\n const config: BlockConfigContainer = {\n v4: undefined,\n v3: {\n configVersion: 3,\n modelAPIVersion: 1,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n initialArgs: this.config.initialArgs,\n initialUiState: this.config.initialUiState,\n inputsValid: this.config.inputsValid,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n initialArgs: this.config.initialArgs,\n inputsValid: downgradeCfgOrLambda(this.config.inputsValid),\n sections: downgradeCfgOrLambda(this.config.sections),\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = this.config.featureFlags\n .requiresUIAPIVersion as PlatformaApiVersion;\n\n if (!isInUI())\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n // normal operation inside the UI\n else\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion: platformaApiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n pluginIds: [],\n },\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"block_model_legacy.js","names":["#done"],"sources":["../src/block_model_legacy.ts"],"sourcesContent":["import type {\n BlockRenderingMode,\n BlockSection,\n AnyFunction,\n PlRef,\n BlockCodeKnownFeatureFlags,\n BlockConfigContainer,\n} from \"@milaboratories/pl-model-common\";\nimport type { Checked, ConfigResult, TypedConfig } from \"./config\";\nimport { getImmediate } from \"./config\";\nimport { getPlatformaInstance, isInUI, tryRegisterCallback } from \"./internal\";\nimport type { Platforma, PlatformaApiVersion, PlatformaV1, PlatformaV2 } from \"./platforma\";\nimport type { InferRenderFunctionReturn, RenderFunctionLegacy } from \"./render\";\nimport { RenderCtxLegacy } from \"./render\";\nimport { PlatformaSDKVersion } from \"./version\";\nimport type {\n TypedConfigOrConfigLambda,\n ConfigRenderLambda,\n StdCtxArgsOnly,\n DeriveHref,\n ConfigRenderLambdaFlags,\n InferOutputsFromConfigs,\n} from \"./bconfig\";\nimport { downgradeCfgOrLambda, isConfigLambda } from \"./bconfig\";\nimport type { PlatformaExtended } from \"./platforma\";\n\ntype SectionsExpectedType = readonly BlockSection[];\n\ntype SectionsCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends SectionsExpectedType ? true : false\n>;\n\ntype InputsValidExpectedType = boolean;\n\ntype InputsValidCfgChecked<Cfg extends TypedConfig, Args, UiState> = Checked<\n Cfg,\n ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>> extends InputsValidExpectedType ? true : false\n>;\n\ntype NoOb = Record<string, never>;\n\n/** Main entry point that each block should use in it's \"config\" module. Don't forget\n * to call {@link done()} at the end of configuration. Value returned by this builder must be\n * exported as constant with name \"platforma\" from the \"config\" module. */\nexport class BlockModel<\n Args,\n OutputsCfg extends Record<string, TypedConfigOrConfigLambda>,\n UiState,\n Href extends `/${string}` = \"/\",\n> {\n private constructor(\n private config: {\n readonly renderingMode: BlockRenderingMode;\n readonly initialArgs?: Args;\n readonly initialUiState: UiState;\n readonly outputs: OutputsCfg;\n readonly inputsValid: TypedConfigOrConfigLambda;\n readonly sections: TypedConfigOrConfigLambda;\n readonly title?: ConfigRenderLambda;\n readonly subtitle?: ConfigRenderLambda;\n readonly tags?: ConfigRenderLambda;\n readonly enrichmentTargets?: ConfigRenderLambda;\n readonly featureFlags: BlockCodeKnownFeatureFlags;\n },\n ) {}\n\n public static get INITIAL_BLOCK_FEATURE_FLAGS(): BlockCodeKnownFeatureFlags {\n return {\n supportsLazyState: true,\n supportsPframeQueryRanking: true,\n requiresUIAPIVersion: 1,\n requiresModelAPIVersion: 1,\n requiresCreatePTable: 2,\n };\n }\n\n /** Initiates configuration builder */\n public static create(renderingMode: BlockRenderingMode): BlockModel<NoOb, {}, NoOb>;\n /** Initiates configuration builder */\n public static create(): BlockModel<NoOb, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(renderingMode: BlockRenderingMode): BlockModel<Args, {}, NoOb>;\n /**\n * Initiates configuration builder\n * @deprecated use create method without generic parameter\n */\n public static create<Args>(): BlockModel<Args, {}, NoOb>;\n public static create(renderingMode: BlockRenderingMode = \"Heavy\"): BlockModel<NoOb, {}, NoOb> {\n return new BlockModel<NoOb, {}, NoOb>({\n renderingMode,\n initialUiState: {},\n outputs: {},\n inputsValid: getImmediate(true),\n sections: getImmediate([]),\n featureFlags: BlockModel.INITIAL_BLOCK_FEATURE_FLAGS,\n });\n }\n\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param cfg configuration describing how to render cell value from the blocks\n * workflow outputs\n * @deprecated use lambda-based API\n * */\n public output<const Key extends string, const Cfg extends TypedConfig>(\n key: Key,\n cfg: Cfg,\n ): BlockModel<Args, OutputsCfg & { [K in Key]: Cfg }, UiState, Href>;\n /**\n * Add output cell wrapped with additional status information to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunctionLegacy<Args, UiState>>(\n key: Key,\n rf: RF,\n flags: ConfigRenderLambdaFlags & { withStatus: true },\n ): BlockModel<\n Args,\n OutputsCfg & {\n [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> & { withStatus: true };\n },\n UiState,\n Href\n >;\n /**\n * Add output cell to the configuration\n *\n * @param key output cell name, that can be later used to retrieve the rendered value\n * @param rf callback calculating output value using context, that allows to access\n * workflows outputs and interact with platforma drivers\n * @param flags additional flags that may alter lambda rendering procedure\n * */\n public output<const Key extends string, const RF extends RenderFunctionLegacy<Args, UiState>>(\n key: Key,\n rf: RF,\n flags?: ConfigRenderLambdaFlags,\n ): BlockModel<\n Args,\n OutputsCfg & { [K in Key]: ConfigRenderLambda<InferRenderFunctionReturn<RF>> },\n UiState,\n Href\n >;\n public output(\n key: string,\n cfgOrRf: TypedConfig | AnyFunction,\n flags: ConfigRenderLambdaFlags = {},\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n if (typeof cfgOrRf === \"function\") {\n const handle = `output#${key}`;\n tryRegisterCallback(handle, () => cfgOrRf(new RenderCtxLegacy()));\n return new BlockModel({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: {\n __renderLambda: true,\n handle,\n ...flags,\n },\n },\n });\n } else {\n return new BlockModel({\n ...this.config,\n outputs: {\n ...this.config.outputs,\n [key]: cfgOrRf,\n },\n });\n }\n }\n\n /** Shortcut for {@link output} with retentive flag set to true. */\n public retentiveOutput<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { retentive: true });\n }\n\n /** Shortcut for {@link output} with withStatus flag set to true. */\n public outputWithStatus<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { withStatus: true });\n }\n\n /** Shortcut for {@link output} with retentive and withStatus flags set to true. */\n public retentiveOutputWithStatus<\n const Key extends string,\n const RF extends RenderFunctionLegacy<Args, UiState>,\n >(key: Key, rf: RF) {\n return this.output(key, rf, { retentive: true, withStatus: true });\n }\n\n /** Sets custom configuration predicate on the block args at which block can be executed\n * @deprecated use lambda-based API */\n public argsValid<Cfg extends TypedConfig>(\n cfg: Cfg & InputsValidCfgChecked<Cfg, Args, UiState>,\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n /** Sets custom configuration predicate on the block args at which block can be executed */\n public argsValid<RF extends RenderFunctionLegacy<Args, UiState, boolean>>(\n rf: RF,\n ): BlockModel<Args, OutputsCfg, UiState, Href>;\n public argsValid(\n cfgOrRf: TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (typeof cfgOrRf === \"function\") {\n tryRegisterCallback(\"inputsValid\", () => cfgOrRf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n inputsValid: {\n __renderLambda: true,\n handle: \"inputsValid\",\n },\n });\n } else {\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n inputsValid: cfgOrRf,\n });\n }\n }\n\n /** Sets the config to generate list of section in the left block overviews panel\n * @deprecated use lambda-based API */\n public sections<const S extends SectionsExpectedType>(\n rf: S,\n ): BlockModel<Args, OutputsCfg, UiState, DeriveHref<S>>;\n /** Sets the config to generate list of section in the left block overviews panel */\n public sections<\n const Ret extends SectionsExpectedType,\n const RF extends RenderFunctionLegacy<Args, UiState, Ret>,\n >(rf: RF): BlockModel<Args, OutputsCfg, UiState, DeriveHref<ReturnType<RF>>>;\n public sections<const Cfg extends TypedConfig>(\n cfg: Cfg & SectionsCfgChecked<Cfg, Args, UiState>,\n ): BlockModel<\n Args,\n OutputsCfg,\n UiState,\n DeriveHref<ConfigResult<Cfg, StdCtxArgsOnly<Args, UiState>>>\n >;\n public sections(\n arrOrCfgOrRf: SectionsExpectedType | TypedConfig | AnyFunction,\n ): BlockModel<Args, OutputsCfg, UiState, `/${string}`> {\n if (Array.isArray(arrOrCfgOrRf)) {\n return this.sections(getImmediate(arrOrCfgOrRf));\n } else if (typeof arrOrCfgOrRf === \"function\") {\n tryRegisterCallback(\"sections\", () => arrOrCfgOrRf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n sections: {\n __renderLambda: true,\n handle: \"sections\",\n },\n });\n } else {\n return new BlockModel<Args, OutputsCfg, UiState>({\n ...this.config,\n sections: arrOrCfgOrRf as TypedConfig,\n });\n }\n }\n\n /** Sets a rendering function to derive block title, shown for the block in the left blocks-overview panel. */\n public title(\n rf: RenderFunctionLegacy<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"title\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n title: {\n __renderLambda: true,\n handle: \"title\",\n },\n });\n }\n\n public subtitle(\n rf: RenderFunctionLegacy<Args, UiState, string>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"subtitle\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n subtitle: {\n __renderLambda: true,\n handle: \"subtitle\",\n },\n });\n }\n\n public tags(\n rf: RenderFunctionLegacy<Args, UiState, string[]>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"tags\", () => rf(new RenderCtxLegacy()));\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n tags: {\n __renderLambda: true,\n handle: \"tags\",\n },\n });\n }\n\n /**\n * Sets initial args for the block, this value must be specified.\n * @deprecated use {@link withArgs}\n * */\n public initialArgs(value: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return this.withArgs(value);\n }\n\n /** Sets initial args for the block, this value must be specified. */\n public withArgs<Args>(initialArgs: Args): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n initialArgs,\n });\n }\n\n /** Defines type and sets initial value for block UiState. */\n public withUiState<UiState>(\n initialUiState: UiState,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n initialUiState,\n });\n }\n\n /** Sets or overrides feature flags for the block. */\n public withFeatureFlags(\n flags: Partial<BlockCodeKnownFeatureFlags>,\n ): BlockModel<Args, OutputsCfg, UiState, Href> {\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n featureFlags: {\n ...this.config.featureFlags,\n ...flags,\n },\n });\n }\n\n /**\n * Defines how to derive list of upstream references this block is meant to enrich with its exports from block args.\n * Influences dependency graph construction.\n */\n public enriches(lambda: (args: Args) => PlRef[]): BlockModel<Args, OutputsCfg, UiState, Href> {\n tryRegisterCallback(\"enrichmentTargets\", lambda);\n return new BlockModel<Args, OutputsCfg, UiState, Href>({\n ...this.config,\n enrichmentTargets: {\n __renderLambda: true,\n handle: \"enrichmentTargets\",\n },\n });\n }\n\n public done(\n apiVersion?: 1,\n ): PlatformaExtended<\n PlatformaV1<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n >;\n\n public done(\n apiVersion: 2,\n ): PlatformaExtended<\n PlatformaV2<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n >;\n\n /** Renders all provided block settings into a pre-configured platforma API\n * instance, that can be used in frontend to interact with block state, and\n * other features provided by the platforma to the block. */\n public done(\n apiVersion: PlatformaApiVersion = 1,\n ): PlatformaExtended<\n Platforma<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n > {\n return this.withFeatureFlags({\n ...this.config.featureFlags,\n requiresUIAPIVersion: apiVersion,\n }).#done();\n }\n\n #done(): PlatformaExtended<\n Platforma<Args, InferOutputsFromConfigs<Args, OutputsCfg, UiState>, UiState, Href>\n > {\n if (this.config.initialArgs === undefined) throw new Error(\"Initial arguments not set.\");\n\n const config: BlockConfigContainer = {\n v4: undefined,\n v3: {\n configVersion: 3,\n modelAPIVersion: 1,\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n initialArgs: this.config.initialArgs,\n initialUiState: this.config.initialUiState,\n inputsValid: this.config.inputsValid,\n sections: this.config.sections,\n title: this.config.title,\n subtitle: this.config.subtitle,\n tags: this.config.tags,\n outputs: this.config.outputs,\n enrichmentTargets: this.config.enrichmentTargets,\n featureFlags: this.config.featureFlags,\n },\n\n // fields below are added to allow previous desktop versions read generated configs\n sdkVersion: PlatformaSDKVersion,\n renderingMode: this.config.renderingMode,\n initialArgs: this.config.initialArgs,\n inputsValid: downgradeCfgOrLambda(this.config.inputsValid),\n sections: downgradeCfgOrLambda(this.config.sections),\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n downgradeCfgOrLambda(value),\n ]),\n ),\n };\n\n globalThis.platformaApiVersion = this.config.featureFlags\n .requiresUIAPIVersion as PlatformaApiVersion;\n\n if (!isInUI()) {\n // we are in the configuration rendering routine, not in actual UI\n return { config } as any;\n } else {\n // normal operation inside the UI\n return {\n ...getPlatformaInstance({\n sdkVersion: PlatformaSDKVersion,\n apiVersion: platformaApiVersion,\n }),\n blockModelInfo: {\n outputs: Object.fromEntries(\n Object.entries(this.config.outputs).map(([key, value]) => [\n key,\n {\n withStatus: Boolean(isConfigLambda(value) && value.withStatus),\n },\n ]),\n ),\n pluginIds: [],\n featureFlags: this.config.featureFlags,\n },\n };\n }\n }\n}\n"],"mappings":"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"}
@@ -30,12 +30,16 @@ function getMatchingLabelColumns(columns, allLabelColumns) {
30
30
  const labelMatch = unlabeledAxes.findIndex((axisId) => (0, _milaboratories_pl_model_common.matchAxisId)(axisId, labelAxisId));
31
31
  if (labelMatch !== -1) unlabeledAxes.splice(labelMatch, 1);
32
32
  }
33
- const colId = (id, domain) => {
33
+ const colId = (id, domain, contextDomain) => {
34
34
  let wid = id.toString();
35
35
  if (domain) for (const k in domain) {
36
36
  wid += k;
37
37
  wid += domain[k];
38
38
  }
39
+ if (contextDomain) for (const k in contextDomain) {
40
+ wid += k;
41
+ wid += contextDomain[k];
42
+ }
39
43
  return wid;
40
44
  };
41
45
  const labelColumns = [];
@@ -45,8 +49,8 @@ function getMatchingLabelColumns(columns, allLabelColumns) {
45
49
  const labelMatch = unlabeledAxes.findIndex((axisId) => (0, _milaboratories_pl_model_common.matchAxisId)(axisId, labelAxisId));
46
50
  if (labelMatch !== -1) {
47
51
  const axisId = unlabeledAxes[labelMatch];
48
- if (Object.keys(axisId.domain ?? {}).length > Object.keys(labelAxis.domain ?? {}).length) labelColumns.push({
49
- id: colId(labelColumn.id, axisId.domain),
52
+ if (Object.keys(axisId.domain ?? {}).length + Object.keys(axisId.contextDomain ?? {}).length > Object.keys(labelAxis.domain ?? {}).length + Object.keys(labelAxis.contextDomain ?? {}).length) labelColumns.push({
53
+ id: colId(labelColumn.id, axisId.domain, axisId.contextDomain),
50
54
  spec: {
51
55
  ...labelColumn.spec,
52
56
  axesSpec: [{
@@ -1 +1 @@
1
- {"version":3,"file":"labels.cjs","names":["PColumnCollection","PColumnName"],"sources":["../../../src/components/PlDataTable/labels.ts"],"sourcesContent":["import type { AxisId, PColumn, PColumnIdAndSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getAxisId,\n isLabelColumn,\n matchAxisId,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxisLabelProvider, ColumnProvider, PColumnDataUniversal } from \"../../render\";\nimport { PColumnCollection } from \"../../render\";\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (id: PObjectId, domain?: Record<string, string>): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxis.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,mBACd,YAC6C;AAC7C,QAAO,IAAIA,6CAAmB,CAC3B,qBAAqB,WAAW,CAChC,kBAAkB,WAAW,CAC7B,WACC;EACE,MAAMC,4CAAY;EAClB,MAAM,CAAC,EAAE,CAAC;EACX,EACD;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D;;;AAIL,SAAgB,wBACd,SACA,iBACiC;CAEjC,MAAM,oBAAoC,EAAE;CAC5C,MAAM,oBAAoC,EAAE;AAC5C,MAAK,MAAM,UAAU,QACnB,wDAAkB,OAAO,KAAK,CAC5B,mBAAkB,KAAK,OAAO;KAE9B,mBAAkB,KAAK,OAAO;CAKlC,MAAM,gBAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,kBACnB,MAAK,MAAM,QAAQ,OAAO,KAAK,UAAU;EACvC,MAAM,wDAAmB,KAAK;AAC9B,MAAI,CAAC,cAAc,MAAM,wDAAmB,IAAI,OAAO,CAAC,CACtD,eAAc,KAAK,OAAO;;AAMhC,MAAK,MAAM,eAAe,mBAAmB;EAC3C,MAAM,6DAAwB,YAAY,KAAK,SAAS,GAAG;EAC3D,MAAM,aAAa,cAAc,WAAW,4DAAuB,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,GACjB,eAAc,OAAO,YAAY,EAAE;;CAKvC,MAAM,SAAS,IAAe,WAA+C;EAC3E,IAAI,MAAM,GAAG,UAAU;AACvB,MAAI,OACF,MAAK,MAAM,KAAK,QAAQ;AACtB,UAAO;AACP,UAAO,OAAO;;AAGlB,SAAO;;CAIT,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,YAAY,YAAY,KAAK,SAAS;EAC5C,MAAM,6DAAwB,UAAU;EACxC,MAAM,aAAa,cAAc,WAAW,4DAAuB,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,IAAI;GACrB,MAAM,SAAS,cAAc;AAG7B,OAFsB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC,SAChC,OAAO,KAAK,UAAU,UAAU,EAAE,CAAC,CAAC,OAEzD,cAAa,KAAK;IAChB,IAAI,MAAM,YAAY,IAAI,OAAO,OAAO;IACxC,MAAM;KACJ,GAAG,YAAY;KACf,UAAU,CAAC;MAAE,GAAG;MAAQ,aAAa,UAAU;MAAa,CAAC;KAC9D;IACD,MAAM,YAAY;IACnB,CAAC;OAEF,cAAa,KAAK,YAAY;AAEhC,iBAAc,OAAO,YAAY,EAAE;;;AAGvC,QAAO"}
1
+ {"version":3,"file":"labels.cjs","names":["PColumnCollection","PColumnName"],"sources":["../../../src/components/PlDataTable/labels.ts"],"sourcesContent":["import type { AxisId, PColumn, PColumnIdAndSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getAxisId,\n isLabelColumn,\n matchAxisId,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxisLabelProvider, ColumnProvider, PColumnDataUniversal } from \"../../render\";\nimport { PColumnCollection } from \"../../render\";\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (\n id: PObjectId,\n domain?: Record<string, string>,\n contextDomain?: Record<string, string>,\n ): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n if (contextDomain) {\n for (const k in contextDomain) {\n wid += k;\n wid += contextDomain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen =\n Object.keys(axisId.domain ?? {}).length + Object.keys(axisId.contextDomain ?? {}).length;\n const labelDomainLen =\n Object.keys(labelAxis.domain ?? {}).length +\n Object.keys(labelAxis.contextDomain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain, axisId.contextDomain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n"],"mappings":";;;;;;;AAWA,SAAgB,mBACd,YAC6C;AAC7C,QAAO,IAAIA,6CAAmB,CAC3B,qBAAqB,WAAW,CAChC,kBAAkB,WAAW,CAC7B,WACC;EACE,MAAMC,4CAAY;EAClB,MAAM,CAAC,EAAE,CAAC;EACX,EACD;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D;;;AAIL,SAAgB,wBACd,SACA,iBACiC;CAEjC,MAAM,oBAAoC,EAAE;CAC5C,MAAM,oBAAoC,EAAE;AAC5C,MAAK,MAAM,UAAU,QACnB,wDAAkB,OAAO,KAAK,CAC5B,mBAAkB,KAAK,OAAO;KAE9B,mBAAkB,KAAK,OAAO;CAKlC,MAAM,gBAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,kBACnB,MAAK,MAAM,QAAQ,OAAO,KAAK,UAAU;EACvC,MAAM,wDAAmB,KAAK;AAC9B,MAAI,CAAC,cAAc,MAAM,wDAAmB,IAAI,OAAO,CAAC,CACtD,eAAc,KAAK,OAAO;;AAMhC,MAAK,MAAM,eAAe,mBAAmB;EAC3C,MAAM,6DAAwB,YAAY,KAAK,SAAS,GAAG;EAC3D,MAAM,aAAa,cAAc,WAAW,4DAAuB,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,GACjB,eAAc,OAAO,YAAY,EAAE;;CAKvC,MAAM,SACJ,IACA,QACA,kBACc;EACd,IAAI,MAAM,GAAG,UAAU;AACvB,MAAI,OACF,MAAK,MAAM,KAAK,QAAQ;AACtB,UAAO;AACP,UAAO,OAAO;;AAGlB,MAAI,cACF,MAAK,MAAM,KAAK,eAAe;AAC7B,UAAO;AACP,UAAO,cAAc;;AAGzB,SAAO;;CAIT,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,YAAY,YAAY,KAAK,SAAS;EAC5C,MAAM,6DAAwB,UAAU;EACxC,MAAM,aAAa,cAAc,WAAW,4DAAuB,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,IAAI;GACrB,MAAM,SAAS,cAAc;AAM7B,OAJE,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,KAAK,OAAO,iBAAiB,EAAE,CAAC,CAAC,SAElF,OAAO,KAAK,UAAU,UAAU,EAAE,CAAC,CAAC,SACpC,OAAO,KAAK,UAAU,iBAAiB,EAAE,CAAC,CAAC,OAE3C,cAAa,KAAK;IAChB,IAAI,MAAM,YAAY,IAAI,OAAO,QAAQ,OAAO,cAAc;IAC9D,MAAM;KACJ,GAAG,YAAY;KACf,UAAU,CAAC;MAAE,GAAG;MAAQ,aAAa,UAAU;MAAa,CAAC;KAC9D;IACD,MAAM,YAAY;IACnB,CAAC;OAEF,cAAa,KAAK,YAAY;AAEhC,iBAAc,OAAO,YAAY,EAAE;;;AAGvC,QAAO"}
@@ -29,12 +29,16 @@ function getMatchingLabelColumns(columns, allLabelColumns) {
29
29
  const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));
30
30
  if (labelMatch !== -1) unlabeledAxes.splice(labelMatch, 1);
31
31
  }
32
- const colId = (id, domain) => {
32
+ const colId = (id, domain, contextDomain) => {
33
33
  let wid = id.toString();
34
34
  if (domain) for (const k in domain) {
35
35
  wid += k;
36
36
  wid += domain[k];
37
37
  }
38
+ if (contextDomain) for (const k in contextDomain) {
39
+ wid += k;
40
+ wid += contextDomain[k];
41
+ }
38
42
  return wid;
39
43
  };
40
44
  const labelColumns = [];
@@ -44,8 +48,8 @@ function getMatchingLabelColumns(columns, allLabelColumns) {
44
48
  const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));
45
49
  if (labelMatch !== -1) {
46
50
  const axisId = unlabeledAxes[labelMatch];
47
- if (Object.keys(axisId.domain ?? {}).length > Object.keys(labelAxis.domain ?? {}).length) labelColumns.push({
48
- id: colId(labelColumn.id, axisId.domain),
51
+ if (Object.keys(axisId.domain ?? {}).length + Object.keys(axisId.contextDomain ?? {}).length > Object.keys(labelAxis.domain ?? {}).length + Object.keys(labelAxis.contextDomain ?? {}).length) labelColumns.push({
52
+ id: colId(labelColumn.id, axisId.domain, axisId.contextDomain),
49
53
  spec: {
50
54
  ...labelColumn.spec,
51
55
  axesSpec: [{
@@ -1 +1 @@
1
- {"version":3,"file":"labels.js","names":[],"sources":["../../../src/components/PlDataTable/labels.ts"],"sourcesContent":["import type { AxisId, PColumn, PColumnIdAndSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getAxisId,\n isLabelColumn,\n matchAxisId,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxisLabelProvider, ColumnProvider, PColumnDataUniversal } from \"../../render\";\nimport { PColumnCollection } from \"../../render\";\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (id: PObjectId, domain?: Record<string, string>): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen = Object.keys(axisId.domain ?? {}).length;\n const labelDomainLen = Object.keys(labelAxis.domain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n"],"mappings":";;;;;;AAWA,SAAgB,mBACd,YAC6C;AAC7C,QAAO,IAAI,mBAAmB,CAC3B,qBAAqB,WAAW,CAChC,kBAAkB,WAAW,CAC7B,WACC;EACE,MAAM,YAAY;EAClB,MAAM,CAAC,EAAE,CAAC;EACX,EACD;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D;;;AAIL,SAAgB,wBACd,SACA,iBACiC;CAEjC,MAAM,oBAAoC,EAAE;CAC5C,MAAM,oBAAoC,EAAE;AAC5C,MAAK,MAAM,UAAU,QACnB,KAAI,cAAc,OAAO,KAAK,CAC5B,mBAAkB,KAAK,OAAO;KAE9B,mBAAkB,KAAK,OAAO;CAKlC,MAAM,gBAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,kBACnB,MAAK,MAAM,QAAQ,OAAO,KAAK,UAAU;EACvC,MAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,CAAC,cAAc,MAAM,OAAO,YAAY,IAAI,OAAO,CAAC,CACtD,eAAc,KAAK,OAAO;;AAMhC,MAAK,MAAM,eAAe,mBAAmB;EAC3C,MAAM,cAAc,UAAU,YAAY,KAAK,SAAS,GAAG;EAC3D,MAAM,aAAa,cAAc,WAAW,WAAW,YAAY,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,GACjB,eAAc,OAAO,YAAY,EAAE;;CAKvC,MAAM,SAAS,IAAe,WAA+C;EAC3E,IAAI,MAAM,GAAG,UAAU;AACvB,MAAI,OACF,MAAK,MAAM,KAAK,QAAQ;AACtB,UAAO;AACP,UAAO,OAAO;;AAGlB,SAAO;;CAIT,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,YAAY,YAAY,KAAK,SAAS;EAC5C,MAAM,cAAc,UAAU,UAAU;EACxC,MAAM,aAAa,cAAc,WAAW,WAAW,YAAY,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,IAAI;GACrB,MAAM,SAAS,cAAc;AAG7B,OAFsB,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC,SAChC,OAAO,KAAK,UAAU,UAAU,EAAE,CAAC,CAAC,OAEzD,cAAa,KAAK;IAChB,IAAI,MAAM,YAAY,IAAI,OAAO,OAAO;IACxC,MAAM;KACJ,GAAG,YAAY;KACf,UAAU,CAAC;MAAE,GAAG;MAAQ,aAAa,UAAU;MAAa,CAAC;KAC9D;IACD,MAAM,YAAY;IACnB,CAAC;OAEF,cAAa,KAAK,YAAY;AAEhC,iBAAc,OAAO,YAAY,EAAE;;;AAGvC,QAAO"}
1
+ {"version":3,"file":"labels.js","names":[],"sources":["../../../src/components/PlDataTable/labels.ts"],"sourcesContent":["import type { AxisId, PColumn, PColumnIdAndSpec, PObjectId } from \"@milaboratories/pl-model-common\";\nimport {\n getAxisId,\n isLabelColumn,\n matchAxisId,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\nimport type { AxisLabelProvider, ColumnProvider, PColumnDataUniversal } from \"../../render\";\nimport { PColumnCollection } from \"../../render\";\n\n/** Get all label columns from the result pool */\nexport function getAllLabelColumns(\n resultPool: AxisLabelProvider & ColumnProvider,\n): PColumn<PColumnDataUniversal>[] | undefined {\n return new PColumnCollection()\n .addAxisLabelProvider(resultPool)\n .addColumnProvider(resultPool)\n .getColumns(\n {\n name: PColumnName.Label,\n axes: [{}], // exactly one axis\n },\n { dontWaitAllData: true, overrideLabelAnnotation: false },\n );\n}\n\n/** Get label columns matching the provided columns from the result pool */\nexport function getMatchingLabelColumns(\n columns: PColumnIdAndSpec[],\n allLabelColumns: PColumn<PColumnDataUniversal>[],\n): PColumn<PColumnDataUniversal>[] {\n // split input columns into label and value columns\n const inputLabelColumns: typeof columns = [];\n const inputValueColumns: typeof columns = [];\n for (const column of columns) {\n if (isLabelColumn(column.spec)) {\n inputLabelColumns.push(column);\n } else {\n inputValueColumns.push(column);\n }\n }\n\n // collect distinct axes of value columns\n const unlabeledAxes: AxisId[] = [];\n for (const column of inputValueColumns) {\n for (const axis of column.spec.axesSpec) {\n const axisId = getAxisId(axis);\n if (!unlabeledAxes.some((id) => matchAxisId(id, axisId))) {\n unlabeledAxes.push(axisId);\n }\n }\n }\n\n // remove axes matched by input label columns\n for (const labelColumn of inputLabelColumns) {\n const labelAxisId = getAxisId(labelColumn.spec.axesSpec[0]);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n\n // warning: changing this id will break backward compatibility\n const colId = (\n id: PObjectId,\n domain?: Record<string, string>,\n contextDomain?: Record<string, string>,\n ): PObjectId => {\n let wid = id.toString();\n if (domain) {\n for (const k in domain) {\n wid += k;\n wid += domain[k];\n }\n }\n if (contextDomain) {\n for (const k in contextDomain) {\n wid += k;\n wid += contextDomain[k];\n }\n }\n return wid as PObjectId;\n };\n\n // search label columns for unmatched axes\n const labelColumns: typeof allLabelColumns = [];\n for (const labelColumn of allLabelColumns) {\n const labelAxis = labelColumn.spec.axesSpec[0];\n const labelAxisId = getAxisId(labelAxis);\n const labelMatch = unlabeledAxes.findIndex((axisId) => matchAxisId(axisId, labelAxisId));\n if (labelMatch !== -1) {\n const axisId = unlabeledAxes[labelMatch];\n const dataDomainLen =\n Object.keys(axisId.domain ?? {}).length + Object.keys(axisId.contextDomain ?? {}).length;\n const labelDomainLen =\n Object.keys(labelAxis.domain ?? {}).length +\n Object.keys(labelAxis.contextDomain ?? {}).length;\n if (dataDomainLen > labelDomainLen) {\n labelColumns.push({\n id: colId(labelColumn.id, axisId.domain, axisId.contextDomain),\n spec: {\n ...labelColumn.spec,\n axesSpec: [{ ...axisId, annotations: labelAxis.annotations }],\n },\n data: labelColumn.data,\n });\n } else {\n labelColumns.push(labelColumn);\n }\n unlabeledAxes.splice(labelMatch, 1);\n }\n }\n return labelColumns;\n}\n"],"mappings":";;;;;;AAWA,SAAgB,mBACd,YAC6C;AAC7C,QAAO,IAAI,mBAAmB,CAC3B,qBAAqB,WAAW,CAChC,kBAAkB,WAAW,CAC7B,WACC;EACE,MAAM,YAAY;EAClB,MAAM,CAAC,EAAE,CAAC;EACX,EACD;EAAE,iBAAiB;EAAM,yBAAyB;EAAO,CAC1D;;;AAIL,SAAgB,wBACd,SACA,iBACiC;CAEjC,MAAM,oBAAoC,EAAE;CAC5C,MAAM,oBAAoC,EAAE;AAC5C,MAAK,MAAM,UAAU,QACnB,KAAI,cAAc,OAAO,KAAK,CAC5B,mBAAkB,KAAK,OAAO;KAE9B,mBAAkB,KAAK,OAAO;CAKlC,MAAM,gBAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,kBACnB,MAAK,MAAM,QAAQ,OAAO,KAAK,UAAU;EACvC,MAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,CAAC,cAAc,MAAM,OAAO,YAAY,IAAI,OAAO,CAAC,CACtD,eAAc,KAAK,OAAO;;AAMhC,MAAK,MAAM,eAAe,mBAAmB;EAC3C,MAAM,cAAc,UAAU,YAAY,KAAK,SAAS,GAAG;EAC3D,MAAM,aAAa,cAAc,WAAW,WAAW,YAAY,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,GACjB,eAAc,OAAO,YAAY,EAAE;;CAKvC,MAAM,SACJ,IACA,QACA,kBACc;EACd,IAAI,MAAM,GAAG,UAAU;AACvB,MAAI,OACF,MAAK,MAAM,KAAK,QAAQ;AACtB,UAAO;AACP,UAAO,OAAO;;AAGlB,MAAI,cACF,MAAK,MAAM,KAAK,eAAe;AAC7B,UAAO;AACP,UAAO,cAAc;;AAGzB,SAAO;;CAIT,MAAM,eAAuC,EAAE;AAC/C,MAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,YAAY,YAAY,KAAK,SAAS;EAC5C,MAAM,cAAc,UAAU,UAAU;EACxC,MAAM,aAAa,cAAc,WAAW,WAAW,YAAY,QAAQ,YAAY,CAAC;AACxF,MAAI,eAAe,IAAI;GACrB,MAAM,SAAS,cAAc;AAM7B,OAJE,OAAO,KAAK,OAAO,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,KAAK,OAAO,iBAAiB,EAAE,CAAC,CAAC,SAElF,OAAO,KAAK,UAAU,UAAU,EAAE,CAAC,CAAC,SACpC,OAAO,KAAK,UAAU,iBAAiB,EAAE,CAAC,CAAC,OAE3C,cAAa,KAAK;IAChB,IAAI,MAAM,YAAY,IAAI,OAAO,QAAQ,OAAO,cAAc;IAC9D,MAAM;KACJ,GAAG,YAAY;KACf,UAAU,CAAC;MAAE,GAAG;MAAQ,aAAa,UAAU;MAAa,CAAC;KAC9D;IACD,MAAM,YAAY;IACnB,CAAC;OAEF,cAAa,KAAK,YAAY;AAEhC,iBAAc,OAAO,YAAY,EAAE;;;AAGvC,QAAO"}
package/dist/package.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "1.58.19";
3
+ var version = "1.59.0";
4
4
 
5
5
  //#endregion
6
6
  Object.defineProperty(exports, 'version', {
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.58.19";
2
+ var version = "1.59.0";
3
3
 
4
4
  //#endregion
5
5
  export { version };
@@ -3,7 +3,7 @@ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common")
3
3
 
4
4
  //#region src/pframe_utils/axes.ts
5
5
  /** Create id for column copy with added keys in axes domains */
6
- const colId = (id, domains) => {
6
+ const colId = (id, domains, contextDomains) => {
7
7
  let wid = id.toString();
8
8
  domains?.forEach((domain) => {
9
9
  if (domain) for (const [k, v] of Object.entries(domain)) {
@@ -11,6 +11,12 @@ const colId = (id, domains) => {
11
11
  wid += v;
12
12
  }
13
13
  });
14
+ contextDomains?.forEach((contextDomain) => {
15
+ if (contextDomain) for (const [k, v] of Object.entries(contextDomain)) {
16
+ wid += k;
17
+ wid += v;
18
+ }
19
+ });
14
20
  return wid;
15
21
  };
16
22
  /** All combinations with 1 key from each list */
@@ -58,6 +64,15 @@ function getAdditionalColumnsForColumn(blockAxes, column) {
58
64
  allAddedDomainValues.add(item);
59
65
  }
60
66
  });
67
+ const cd1 = column.spec.axesSpec[idx].contextDomain;
68
+ const cd2 = axisId.contextDomain;
69
+ Object.entries(cd2 ?? {}).forEach(([key, value]) => {
70
+ if (cd1?.[key] === void 0) {
71
+ const item = JSON.stringify(["ctx:" + key, value]);
72
+ addedSet.add(item);
73
+ allAddedDomainValues.add(item);
74
+ }
75
+ });
61
76
  return {
62
77
  ...axisId,
63
78
  annotations: column.spec.axesSpec[idx].annotations
@@ -69,7 +84,7 @@ function getAdditionalColumnsForColumn(blockAxes, column) {
69
84
  if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) addedNotToAllVariantsDomainValues.add(addedPart);
70
85
  });
71
86
  return [column, ...secondaryIdsVariants.map((idsList, idx) => {
72
- const id = colId(column.id, idsList.map((id) => id.domain));
87
+ const id = colId(column.id, idsList.map((id) => id.domain), idsList.map((id) => id.contextDomain));
73
88
  const label = (0, _milaboratories_pl_model_common.readAnnotation)(column.spec, _milaboratories_pl_model_common.Annotation.Label) ?? "";
74
89
  const labelDomainPart = [...addedByVariantsDomainValues[idx]].filter((str) => addedNotToAllVariantsDomainValues.has(str)).sort().map((v) => JSON.parse(v)?.[1]).join(" / ");
75
90
  const annotations = {
@@ -1 +1 @@
1
- {"version":3,"file":"axes.cjs","names":["LinkerMap","getColumnIdAndSpec","getAxisId","Annotation"],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"axes.cjs","names":["LinkerMap","getColumnIdAndSpec","getAxisId","Annotation"],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Annotation, LinkerMap, canonicalizeJson, getAxisId, getColumnIdAndSpec,
2
2
 
3
3
  //#region src/pframe_utils/axes.ts
4
4
  /** Create id for column copy with added keys in axes domains */
5
- const colId = (id, domains) => {
5
+ const colId = (id, domains, contextDomains) => {
6
6
  let wid = id.toString();
7
7
  domains?.forEach((domain) => {
8
8
  if (domain) for (const [k, v] of Object.entries(domain)) {
@@ -10,6 +10,12 @@ const colId = (id, domains) => {
10
10
  wid += v;
11
11
  }
12
12
  });
13
+ contextDomains?.forEach((contextDomain) => {
14
+ if (contextDomain) for (const [k, v] of Object.entries(contextDomain)) {
15
+ wid += k;
16
+ wid += v;
17
+ }
18
+ });
13
19
  return wid;
14
20
  };
15
21
  /** All combinations with 1 key from each list */
@@ -57,6 +63,15 @@ function getAdditionalColumnsForColumn(blockAxes, column) {
57
63
  allAddedDomainValues.add(item);
58
64
  }
59
65
  });
66
+ const cd1 = column.spec.axesSpec[idx].contextDomain;
67
+ const cd2 = axisId.contextDomain;
68
+ Object.entries(cd2 ?? {}).forEach(([key, value]) => {
69
+ if (cd1?.[key] === void 0) {
70
+ const item = JSON.stringify(["ctx:" + key, value]);
71
+ addedSet.add(item);
72
+ allAddedDomainValues.add(item);
73
+ }
74
+ });
60
75
  return {
61
76
  ...axisId,
62
77
  annotations: column.spec.axesSpec[idx].annotations
@@ -68,7 +83,7 @@ function getAdditionalColumnsForColumn(blockAxes, column) {
68
83
  if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) addedNotToAllVariantsDomainValues.add(addedPart);
69
84
  });
70
85
  return [column, ...secondaryIdsVariants.map((idsList, idx) => {
71
- const id = colId(column.id, idsList.map((id) => id.domain));
86
+ const id = colId(column.id, idsList.map((id) => id.domain), idsList.map((id) => id.contextDomain));
72
87
  const label = readAnnotation(column.spec, Annotation.Label) ?? "";
73
88
  const labelDomainPart = [...addedByVariantsDomainValues[idx]].filter((str) => addedNotToAllVariantsDomainValues.has(str)).sort().map((v) => JSON.parse(v)?.[1]).join(" / ");
74
89
  const annotations = {
@@ -1 +1 @@
1
- {"version":3,"file":"axes.js","names":[],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (id: PObjectId, domains: (Record<string, string> | undefined)[]) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"axes.js","names":[],"sources":["../../src/pframe_utils/axes.ts"],"sourcesContent":["/**\n * Axes utilities for PFrame graph operations.\n *\n * Extracted from PFrameForGraphs to break circular dependency\n * between PFrameForGraphs and columns modules.\n *\n * @module pframe_utils/axes\n */\n\nimport type {\n AxisId,\n AxisSpecNormalized,\n CanonicalizedJson,\n PColumn,\n PObjectId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n canonicalizeJson,\n getAxisId,\n getColumnIdAndSpec,\n LinkerMap,\n matchAxisId,\n readAnnotation,\n stringifyJson,\n} from \"@milaboratories/pl-model-common\";\nimport type { PColumnDataUniversal } from \"../render\";\n\nexport type AxesVault = Map<CanonicalizedJson<AxisId>, AxisSpecNormalized>;\n\n/** Create id for column copy with added keys in axes domains */\nconst colId = (\n id: PObjectId,\n domains: (Record<string, string> | undefined)[],\n contextDomains: (Record<string, string> | undefined)[],\n) => {\n let wid = id.toString();\n domains?.forEach((domain) => {\n if (domain) {\n for (const [k, v] of Object.entries(domain)) {\n wid += k;\n wid += v;\n }\n }\n });\n contextDomains?.forEach((contextDomain) => {\n if (contextDomain) {\n for (const [k, v] of Object.entries(contextDomain)) {\n wid += k;\n wid += v;\n }\n }\n });\n return wid;\n};\n\n/** All combinations with 1 key from each list */\nfunction getKeysCombinations(idsLists: AxisId[][]) {\n if (!idsLists.length) {\n return [];\n }\n let result: AxisId[][] = [[]];\n idsLists.forEach((list) => {\n const nextResult: AxisId[][] = [];\n list.forEach((key) => {\n nextResult.push(...result.map((resultItem) => [...resultItem, key]));\n });\n result = nextResult;\n });\n return result;\n}\n\nexport function getAvailableWithLinkersAxes(\n linkerColumns: PColumn<PColumnDataUniversal>[],\n blockAxes: AxesVault,\n): AxesVault {\n const linkerMap = LinkerMap.fromColumns(linkerColumns.map(getColumnIdAndSpec));\n const availableAxes = linkerMap.getReachableByLinkersAxesFromAxesNormalized(\n [...blockAxes.values()],\n (linkerKeyId, sourceAxisId) => matchAxisId(sourceAxisId, linkerKeyId),\n );\n\n return new Map(\n availableAxes.map((axisSpec) => {\n const id = getAxisId(axisSpec);\n return [canonicalizeJson(id), axisSpec];\n }),\n );\n}\n\n/** Add columns with fully compatible axes created from partial compatible ones */\nexport function enrichCompatible<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n columns: T[],\n): T[] {\n return columns.flatMap((column) => getAdditionalColumnsForColumn(blockAxes, column));\n}\n\nfunction getAdditionalColumnsForColumn<T extends Omit<PColumn<PColumnDataUniversal>, \"data\">>(\n blockAxes: AxesVault,\n column: T,\n): T[] {\n const columnAxesIds = column.spec.axesSpec.map(getAxisId);\n\n if (columnAxesIds.every((id) => blockAxes.has(canonicalizeJson(id)))) {\n return [column]; // the column is compatible with its own domains without modifications\n }\n\n // options with different possible domains for every axis of secondary column\n const secondaryIdsOptions = columnAxesIds.map((id) => {\n const result = [];\n for (const [_, mainId] of blockAxes) {\n if (matchAxisId(mainId, id) && !matchAxisId(id, mainId)) {\n result.push(mainId);\n }\n }\n return result;\n });\n // all possible combinations of axes with added domains\n const secondaryIdsVariants = getKeysCombinations(secondaryIdsOptions);\n\n // sets of added to column domain fields\n const allAddedDomainValues = new Set<string>();\n const addedNotToAllVariantsDomainValues = new Set<string>();\n const addedByVariantsDomainValues = secondaryIdsVariants.map((idsList) => {\n const addedSet = new Set<string>();\n idsList.map((axisId, idx) => {\n const d1 = column.spec.axesSpec[idx].domain;\n const d2 = axisId.domain;\n Object.entries(d2 ?? {}).forEach(([key, value]) => {\n if (d1?.[key] === undefined) {\n const item = JSON.stringify([key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n const cd1 = column.spec.axesSpec[idx].contextDomain;\n const cd2 = axisId.contextDomain;\n Object.entries(cd2 ?? {}).forEach(([key, value]) => {\n if (cd1?.[key] === undefined) {\n const item = JSON.stringify([\"ctx:\" + key, value]);\n addedSet.add(item);\n allAddedDomainValues.add(item);\n }\n });\n return {\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n };\n });\n return addedSet;\n });\n [...allAddedDomainValues].forEach((addedPart) => {\n if (addedByVariantsDomainValues.some((s) => !s.has(addedPart))) {\n addedNotToAllVariantsDomainValues.add(addedPart);\n }\n });\n\n const additionalColumns = secondaryIdsVariants.map((idsList, idx) => {\n const id = colId(\n column.id,\n idsList.map((id) => id.domain),\n idsList.map((id) => id.contextDomain),\n );\n\n const label = readAnnotation(column.spec, Annotation.Label) ?? \"\";\n const labelDomainPart = [...addedByVariantsDomainValues[idx]]\n .filter((str) => addedNotToAllVariantsDomainValues.has(str))\n .sort()\n .map((v) => JSON.parse(v)?.[1]) // use in labels only domain values, but sort them by key to save the same order in all column variants\n .join(\" / \");\n\n const annotations: Annotation = {\n ...column.spec.annotations,\n [Annotation.Graph.IsVirtual]: stringifyJson(true),\n };\n if (label || labelDomainPart) {\n annotations[Annotation.Label] =\n label && labelDomainPart ? label + \" / \" + labelDomainPart : label + labelDomainPart;\n }\n\n return {\n ...column,\n id: id as PObjectId,\n spec: {\n ...column.spec,\n axesSpec: idsList.map((axisId, idx) => ({\n ...axisId,\n annotations: column.spec.axesSpec[idx].annotations,\n })),\n annotations,\n },\n };\n });\n\n return [column, ...additionalColumns];\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { BlockApiV2 } from "./block_api_v2.js";
5
5
  import { BlockApiV3 } from "./block_api_v3.js";
6
6
  import { SdkInfo } from "./version.js";
7
7
  import { PluginRecord } from "./block_model.js";
8
- import { BlockOutputsBase, BlockStateV3, DriverKit, OutputWithStatus } from "@milaboratories/pl-model-common";
8
+ import { BlockCodeKnownFeatureFlags, BlockOutputsBase, BlockStateV3, DriverKit, OutputWithStatus } from "@milaboratories/pl-model-common";
9
9
 
10
10
  //#region src/platforma.d.ts
11
11
  /** Defines all methods to interact with the platform environment from within a block UI. @deprecated */
@@ -36,6 +36,7 @@ type BlockModelInfo = {
36
36
  withStatus: boolean;
37
37
  }>;
38
38
  pluginIds: PluginHandle[];
39
+ featureFlags: BlockCodeKnownFeatureFlags;
39
40
  };
40
41
  type PlatformaApiVersion = Platforma["apiVersion"];
41
42
  type InferArgsType<Pl extends Platforma> = Pl extends Platforma<infer Args> ? Args : never;
@@ -234,12 +234,14 @@ var ResultPool = class {
234
234
  if (spec.valueType !== oth.valueType) continue;
235
235
  if (spec.axesSpec.length !== oth.axesSpec.length) continue;
236
236
  if (!matchDomain(spec.domain, oth.domain)) continue;
237
+ if (!matchDomain(spec.contextDomain, oth.contextDomain)) continue;
237
238
  for (let i = 0; i < spec.axesSpec.length; ++i) {
238
239
  const qAx = spec.axesSpec[i];
239
240
  const tAx = oth.axesSpec[i];
240
241
  if (qAx.name !== tAx.name) continue out;
241
242
  if (qAx.type !== tAx.type) continue out;
242
243
  if (!matchDomain(qAx.domain, tAx.domain)) continue out;
244
+ if (!matchDomain(qAx.contextDomain, tAx.contextDomain)) continue out;
243
245
  }
244
246
  result.push(data.obj);
245
247
  }
@@ -254,7 +256,7 @@ var ResultPool = class {
254
256
  for (const column of dataPool.entries) {
255
257
  if (!(0, _milaboratories_pl_model_common.isPColumn)(column.obj)) continue;
256
258
  const spec = column.obj.spec;
257
- if (spec.name === _milaboratories_pl_model_common.PColumnName.Label && spec.axesSpec.length === 1 && spec.axesSpec[0].name === axis.name && spec.axesSpec[0].type === axis.type && matchDomain(axis.domain, spec.axesSpec[0].domain)) {
259
+ if (spec.name === _milaboratories_pl_model_common.PColumnName.Label && spec.axesSpec.length === 1 && spec.axesSpec[0].name === axis.name && spec.axesSpec[0].type === axis.type && matchDomain(axis.domain, spec.axesSpec[0].domain) && matchDomain(axis.contextDomain, spec.axesSpec[0].contextDomain)) {
258
260
  if (column.obj.data.resourceType.name !== "PColumnData/Json") throw Error(`Expected JSON column for labels, got: ${column.obj.data.resourceType.name}`);
259
261
  return Object.fromEntries(Object.entries(column.obj.data.getDataAsJson().data).map((e) => [JSON.parse(e[0])[0], e[1]]));
260
262
  }