diff --git a/src/notion/publish/v2/createMultiValueStatListItemBlock.ts b/src/notion/publish/v2/createMultiValueStatListItemBlock.ts index 32eacb7..66a8c2b 100644 --- a/src/notion/publish/v2/createMultiValueStatListItemBlock.ts +++ b/src/notion/publish/v2/createMultiValueStatListItemBlock.ts @@ -1,7 +1,9 @@ import { BlockObjectRequest } from "@notionhq/client/build/src/api-endpoints"; import { ValueFormatOptions } from "../../../format/ValueFormatOptions"; -import { MultiValueStatDesc } from "../../../statistiques/v2/desc/StatsDesc"; -import { BulletedListItemBlockObjectRequest } from "../blocks/BulletedListItemBlockObjectRequest"; +import { + MultiValueStatDesc, + StatsData, +} from "../../../statistiques/v2/desc/StatsDesc"; import { BulletedListItemChildren } from "../blocks/BulletedListItemChildren"; import { createSingleValueStatListItemBlock } from "./createSingleValueStatListItemBlock"; @@ -12,7 +14,7 @@ export type ToggleBlockObjectRequest = Extract< export function createMultiValueStatListItemBlock( descriptor: MultiValueStatDesc, - statValue: Record + statData: Record ): ToggleBlockObjectRequest { return { toggle: { @@ -25,7 +27,7 @@ export function createMultiValueStatListItemBlock( ], children: createMultiValueStatListItemBlockChildren( descriptor, - statValue + statData ) as BulletedListItemChildren, }, }; @@ -33,14 +35,10 @@ export function createMultiValueStatListItemBlock( function createMultiValueStatListItemBlockChildren( formatOptions: ValueFormatOptions, - statsValues: Record -): BulletedListItemBlockObjectRequest[] { + statsValues: Record +): BlockObjectRequest[] { return Object.keys(statsValues).map((keyName) => { - const statValue = statsValues[keyName]; - return createSingleValueStatListItemBlock( - keyName, - formatOptions, - statValue - ); + const statData = statsValues[keyName]; + return createSingleValueStatListItemBlock(keyName, formatOptions, statData); }); } diff --git a/src/notion/publish/v2/createSingleValueStatListItemBlock.ts b/src/notion/publish/v2/createSingleValueStatListItemBlock.ts index 81401e7..2d3dba6 100644 --- a/src/notion/publish/v2/createSingleValueStatListItemBlock.ts +++ b/src/notion/publish/v2/createSingleValueStatListItemBlock.ts @@ -1,21 +1,65 @@ import { formatValue } from "../../../format/formatValue"; -import { BulletedListItemBlockObjectRequest } from "../blocks/BulletedListItemBlockObjectRequest"; import { ValueFormatOptions } from "../../../format/ValueFormatOptions"; +import { StatsData } from "../../../statistiques/v2/desc/StatsDesc"; +import { isNumber } from "lodash"; +import { BlockObjectRequest } from "@notionhq/client/build/src/api-endpoints"; export function createSingleValueStatListItemBlock( label: string, formatOptions: ValueFormatOptions, - value: number -): BulletedListItemBlockObjectRequest { - return { - bulleted_list_item: { - rich_text: [ - { - text: { - content: label + ": " + formatValue(value, formatOptions), + data: StatsData +): BlockObjectRequest { + if (isNumber(data)) { + return { + bulleted_list_item: { + rich_text: [ + { + text: { + content: label + ": " + formatValue(data, formatOptions), + }, }, - }, - ], + ], + }, + }; + } else { + return { + toggle: { + rich_text: [ + { + text: { + content: label + ": " + formatValue(data.value, formatOptions), + }, + }, + ], + children: [ + { + paragraph: { + rich_text: [ + { + text: { + content: "Page concernées:", + }, + }, + ...data.relatedPageIds.map((pageId) => + createPageMentionRichTextElement(pageId) + ), + ], + }, + }, + ], + }, + }; + } +} + +function createPageMentionRichTextElement(pageId: string): { + mention: { page: { id: string } }; +} { + return { + mention: { + page: { + id: pageId, + }, }, }; } diff --git a/src/notion/publish/v2/createStatGroupListItemBlock.ts b/src/notion/publish/v2/createStatGroupListItemBlock.ts index 89a6322..82e64c6 100644 --- a/src/notion/publish/v2/createStatGroupListItemBlock.ts +++ b/src/notion/publish/v2/createStatGroupListItemBlock.ts @@ -3,6 +3,7 @@ import { isSingleValueStatDesc, isStatGroupDesc, StatGroupDesc, + StatsData, StatsType, } from "../../../statistiques/v2/desc/StatsDesc"; import { createSingleValueStatListItemBlock } from "./createSingleValueStatListItemBlock"; @@ -39,26 +40,26 @@ export function createStatGroupChildrenListItemBlock( ): BlockObjectRequest[] { return Object.keys(descriptor.stats).map((statName) => { const childStatDesc = descriptor.stats[statName]; - const childStatValue = stats[statName]; + const childStatData = stats[statName]; if (isStatGroupDesc(childStatDesc)) { return createStatGroupListItemBlock( childStatDesc, - childStatValue as StatsType + childStatData as StatsType ); } if (isSingleValueStatDesc(childStatDesc)) { return createSingleValueStatListItemBlock( childStatDesc.label, childStatDesc as ValueFormatOptions, - childStatValue as number + childStatData as StatsData ); } if (isMultiValueStatDesc(childStatDesc)) { return createMultiValueStatListItemBlock( childStatDesc, - childStatValue as Record + childStatData as Record ); } throw "Mussing case"; diff --git a/src/statistiques/v2/desc/StatsDesc.ts b/src/statistiques/v2/desc/StatsDesc.ts index 7026daa..6fb0833 100644 --- a/src/statistiques/v2/desc/StatsDesc.ts +++ b/src/statistiques/v2/desc/StatsDesc.ts @@ -42,10 +42,12 @@ export function isMultiValueStatDesc(x: StatDesc): x is MultiValueStatDesc { return "type" in x && x.type === "multi"; } +export type StatsData = number | { value: number; relatedPageIds: string[] }; + export type StatsType = { [Property in keyof T["stats"]]: T["stats"][Property] extends StatGroupDesc ? StatsType : T["stats"][Property] extends MultiValueStatDesc - ? Record - : number; + ? Record + : StatsData; };