{"version":3,"file":"pagination.cjs","sources":["../../../../packages/components-wc/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","customId","uid","answerType","SubjectType","PAGE_END","isPageBreakItem","item","normalizePageBreaks","items","normalized","map","compacted","hasEncounteredQuestion","forEach","length","push","pop","totalPage","filter","currentPageIndex","reduce","result","itemIndex","index","next","splice","normalizedItems","rebuilt","lastSourcePageIndex","nextPageIndex","Number","pageIndex","serialized","pendingBoundaryCount"],"mappings":"uEAsBA,SAASA,IACP,MAAO,CACLC,SAAUC,EAAAA,MACVC,WAAYC,EAAAA,YAAYC,SAE5B,CAEO,SAASC,EAAgBC,GAC9B,QAASA,GAAQA,EAAKJ,aAAeC,EAAAA,YAAYC,QACnD,CAEO,SAASG,EAAoBC,GAClC,MAAMC,EAAaD,EAAME,YAAkBJ,KACrCK,EAA+B,GACrC,IAAIC,GAAyB,EAuB7B,IArBAH,EAAWI,QAASP,IAClB,GAAKA,EAGL,GAAID,EAAgBC,GAApB,CACE,IAAKM,EACH,OAEF,GAAIP,EAAgBM,EAAUA,EAAUG,OAAS,IAC/C,OAEFH,EAAUI,KAAK,IACVT,EACHN,SAAUM,EAAKN,UAAYC,EAAAA,OAG/B,MACAW,GAAyB,EACzBD,EAAUI,KAAKT,KAGVK,EAAUG,OAAS,GAAKT,EAAgBM,EAAUA,EAAUG,OAAS,KAC1EH,EAAUK,MAGZ,OAAOL,CACT,2BA6EO,SAA2BH,GAChC,MAAMC,EAAaF,EAAoBC,GACjCS,EAAYR,EAAWS,OAAOZ,GAAQD,EAAgBC,IAAOQ,OAAS,EAC5E,IAAIK,EAAmB,EAEvB,OAAOV,EAAWW,OAA6B,CAACC,EAAQf,EAAMgB,IACvDjB,EAAgBC,IAGrBe,EAAON,KAAK,CACVf,SAAUM,EAAKN,SACfmB,mBACAF,YACAK,cAEFH,GAAoB,EACbE,GATEA,EAUR,GACL,0BAvCO,SAAyBb,EAA0Be,GACxD,MACMC,EAAO,IADMjB,EAAoBC,IAGvC,OAAoB,IAAhBgB,EAAKV,OACAU,OAGK,IAAVD,GAAuBA,EAAQ,GAAKA,GAASC,EAAKV,OAAS,GAC7DU,EAAKT,KAAKhB,KACHQ,EAAoBiB,KAG7BA,EAAKC,OAAOF,EAAQ,EAAG,EAAGxB,KACnBQ,EAAoBiB,GAC7B,iGArEO,SAAwChB,GAC7C,MAAMkB,EAAkBlB,EACrBU,OAAOZ,IAASD,EAAgBC,IAChCI,IAAIJ,IAAA,IAAcA,KAErB,IAAKoB,EAAgBZ,OACnB,MAAO,GAGT,MAAMa,EAA6B,GACnC,IAAIC,EAAsB,EAa1B,OAXAF,EAAgBb,QAAQ,CAACP,EAAMiB,KAC7B,MAAMM,EAAgBC,OAAOxB,EAAKyB,WAAa,EAAID,OAAOxB,EAAKyB,WAAaH,EAExEL,EAAQ,GAAKM,EAAgBD,GAC/BD,EAAQZ,KAAKhB,KAGf4B,EAAQZ,KAAKT,GACbsB,EAAsBC,IAGjBtB,EAAoBoB,EAC7B,0BA+CO,SAAyBnB,EAA0BR,GACxD,OAAOO,EAAoBC,EAAMU,OAAOZ,KAAUD,EAAgBC,IAASA,EAAKN,WAAaA,IAC/F,yCA/CO,SAAwCQ,GAC7C,MAAMwB,EAAgC,GACtC,IAAID,EAAY,EACZE,EAAuB,EAsB3B,OApBAzB,EAAMK,QAASP,IACRA,IAGDD,EAAgBC,GACd0B,EAAWlB,OAAS,IACtBmB,GAAwB,IAIxBA,EAAuB,IACzBF,GAAaE,EACbA,EAAuB,GAEzBD,EAAWjB,KAAK,IACXT,EACHyB,kBAIGC,CACT"}