{"version":3,"file":"pagination.cjs","sources":["../../../../packages/components/src/subject/pagination.ts"],"sourcesContent":["import { uid } from '../base/uid'\nimport { SubjectType } from './types'\n\nexport interface SubjectLikeItem {\n  answerType: string\n  customId?: string\n  pageIndex?: number\n  [key: string]: any\n}\n\nexport interface PageBreakItem extends SubjectLikeItem {\n  answerType: 'page_end'\n  customId: string\n}\n\nexport interface PaginationMetaItem {\n  customId: string\n  currentPageIndex: number\n  totalPage: number\n  itemIndex: number\n}\n\nfunction createPageBreak(): PageBreakItem {\n  return {\n    customId: uid(),\n    answerType: SubjectType.PAGE_END,\n  }\n}\n\nexport function isPageBreakItem(item: SubjectLikeItem | null | undefined): item is PageBreakItem {\n  return !!item && item.answerType === SubjectType.PAGE_END\n}\n\nexport function normalizePageBreaks(items: SubjectLikeItem[]): SubjectLikeItem[] {\n  const normalized = items.map(item => ({ ...item }))\n  const compacted: SubjectLikeItem[] = []\n  let hasEncounteredQuestion = false\n\n  normalized.forEach((item) => {\n    if (!item) {\n      return\n    }\n    if (isPageBreakItem(item)) {\n      if (!hasEncounteredQuestion) {\n        return\n      }\n      if (isPageBreakItem(compacted[compacted.length - 1])) {\n        return\n      }\n      compacted.push({\n        ...item,\n        customId: item.customId || uid(),\n      })\n      return\n    }\n    hasEncounteredQuestion = true\n    compacted.push(item)\n  })\n\n  while (compacted.length > 0 && isPageBreakItem(compacted[compacted.length - 1])) {\n    compacted.pop()\n  }\n\n  return compacted\n}\n\nexport function rebuildPageBreaksFromPageIndex(items: SubjectLikeItem[]): SubjectLikeItem[] {\n  const normalizedItems = items\n    .filter(item => !isPageBreakItem(item))\n    .map(item => ({ ...item }))\n\n  if (!normalizedItems.length) {\n    return []\n  }\n\n  const rebuilt: SubjectLikeItem[] = []\n  let lastSourcePageIndex = 1\n\n  normalizedItems.forEach((item, index) => {\n    const nextPageIndex = Number(item.pageIndex) > 0 ? Number(item.pageIndex) : lastSourcePageIndex\n\n    if (index > 0 && nextPageIndex > lastSourcePageIndex) {\n      rebuilt.push(createPageBreak())\n    }\n\n    rebuilt.push(item)\n    lastSourcePageIndex = nextPageIndex\n  })\n\n  return normalizePageBreaks(rebuilt)\n}\n\nexport function serializeSubjectsWithPageIndex(items: SubjectLikeItem[]): SubjectLikeItem[] {\n  const serialized: SubjectLikeItem[] = []\n  let pageIndex = 1\n  let pendingBoundaryCount = 0\n\n  items.forEach((item) => {\n    if (!item) {\n      return\n    }\n    if (isPageBreakItem(item)) {\n      if (serialized.length > 0) {\n        pendingBoundaryCount += 1\n      }\n      return\n    }\n    if (pendingBoundaryCount > 0) {\n      pageIndex += pendingBoundaryCount\n      pendingBoundaryCount = 0\n    }\n    serialized.push({\n      ...item,\n      pageIndex,\n    })\n  })\n\n  return serialized\n}\n\nexport function insertPageBreak(items: SubjectLikeItem[], index?: number): SubjectLikeItem[] {\n  const normalized = normalizePageBreaks(items)\n  const next = [...normalized]\n\n  if (next.length === 0) {\n    return next\n  }\n\n  if (index === undefined || index < 0 || index >= next.length - 1) {\n    next.push(createPageBreak())\n    return normalizePageBreaks(next)\n  }\n\n  next.splice(index + 1, 0, createPageBreak())\n  return normalizePageBreaks(next)\n}\n\nexport function removePageBreak(items: SubjectLikeItem[], customId: string): SubjectLikeItem[] {\n  return normalizePageBreaks(items.filter(item => !(isPageBreakItem(item) && item.customId === customId)))\n}\n\nexport function getPaginationMeta(items: SubjectLikeItem[]): PaginationMetaItem[] {\n  const normalized = normalizePageBreaks(items)\n  const totalPage = normalized.filter(item => isPageBreakItem(item)).length + 1\n  let currentPageIndex = 1\n\n  return normalized.reduce<PaginationMetaItem[]>((result, item, itemIndex) => {\n    if (!isPageBreakItem(item)) {\n      return result\n    }\n    result.push({\n      customId: item.customId,\n      currentPageIndex,\n      totalPage,\n      itemIndex,\n    })\n    currentPageIndex += 1\n    return result\n  }, [])\n}\n"],"names":["createPageBreak","uid","SubjectType","isPageBreakItem","item","normalizePageBreaks","items","normalized","compacted","hasEncounteredQuestion","rebuildPageBreaksFromPageIndex","normalizedItems","rebuilt","lastSourcePageIndex","index","nextPageIndex","serializeSubjectsWithPageIndex","serialized","pageIndex","pendingBoundaryCount","insertPageBreak","next","removePageBreak","customId","getPaginationMeta","totalPage","currentPageIndex","result","itemIndex"],"mappings":"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"}