@burdenoff/microfe-planmagnet 2026.930.25 → 2026.1001.2

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 (314) hide show
  1. package/dist/_virtual/__vite-browser-external.js +9 -0
  2. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  3. package/dist/_virtual/_rolldown/runtime.js +5 -2
  4. package/dist/index.js +3 -1
  5. package/dist/node_modules/fflate/esm/browser.js +554 -0
  6. package/dist/node_modules/fflate/esm/browser.js.map +1 -0
  7. package/dist/node_modules/jszip/dist/jszip.min.js +3038 -0
  8. package/dist/node_modules/jszip/dist/jszip.min.js.map +1 -0
  9. package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js +2151 -0
  10. package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js.map +1 -0
  11. package/dist/node_modules/write-excel-file/browser/index.js +3 -0
  12. package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js +13 -0
  13. package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js.map +1 -0
  14. package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js +21 -0
  15. package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js.map +1 -0
  16. package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js +11 -0
  17. package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js.map +1 -0
  18. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js +23 -0
  19. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js.map +1 -0
  20. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js +22 -0
  21. package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js.map +1 -0
  22. package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js +18 -0
  23. package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js.map +1 -0
  24. package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js +131 -0
  25. package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js.map +1 -0
  26. package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js +188 -0
  27. package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js.map +1 -0
  28. package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js +52 -0
  29. package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js.map +1 -0
  30. package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js +18 -0
  31. package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js.map +1 -0
  32. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js +18 -0
  33. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js.map +1 -0
  34. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js +17 -0
  35. package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js.map +1 -0
  36. package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js +11 -0
  37. package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js.map +1 -0
  38. package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js +42 -0
  39. package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js.map +1 -0
  40. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js +102 -0
  41. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js.map +1 -0
  42. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js +17 -0
  43. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js.map +1 -0
  44. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js +15 -0
  45. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js.map +1 -0
  46. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js +8 -0
  47. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js.map +1 -0
  48. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js +71 -0
  49. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js.map +1 -0
  50. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js +56 -0
  51. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js.map +1 -0
  52. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js +15 -0
  53. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js.map +1 -0
  54. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js +13 -0
  55. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js.map +1 -0
  56. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js +44 -0
  57. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js.map +1 -0
  58. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js +123 -0
  59. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js.map +1 -0
  60. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js +41 -0
  61. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js.map +1 -0
  62. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js +11 -0
  63. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js.map +1 -0
  64. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js +17 -0
  65. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js.map +1 -0
  66. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js +20 -0
  67. package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js.map +1 -0
  68. package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js +77 -0
  69. package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js.map +1 -0
  70. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js +22 -0
  71. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js.map +1 -0
  72. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js +13 -0
  73. package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js.map +1 -0
  74. package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js +242 -0
  75. package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js.map +1 -0
  76. package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js +29 -0
  77. package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js.map +1 -0
  78. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js +9 -0
  79. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js.map +1 -0
  80. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js +42 -0
  81. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js.map +1 -0
  82. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js +43 -0
  83. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js.map +1 -0
  84. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js +93 -0
  85. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js.map +1 -0
  86. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js +39 -0
  87. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js.map +1 -0
  88. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js +17 -0
  89. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js.map +1 -0
  90. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js +29 -0
  91. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js.map +1 -0
  92. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js +14 -0
  93. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js.map +1 -0
  94. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js +11 -0
  95. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js.map +1 -0
  96. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js +14 -0
  97. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js.map +1 -0
  98. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js +12 -0
  99. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js.map +1 -0
  100. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js +24 -0
  101. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js.map +1 -0
  102. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js +9 -0
  103. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js.map +1 -0
  104. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js +9 -0
  105. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js.map +1 -0
  106. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js +9 -0
  107. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js.map +1 -0
  108. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js +9 -0
  109. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js.map +1 -0
  110. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js +9 -0
  111. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js.map +1 -0
  112. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js +9 -0
  113. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js.map +1 -0
  114. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js +9 -0
  115. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js.map +1 -0
  116. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js +27 -0
  117. package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js.map +1 -0
  118. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js +17 -0
  119. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js.map +1 -0
  120. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js +74 -0
  121. package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js.map +1 -0
  122. package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js +138 -0
  123. package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js.map +1 -0
  124. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js +40 -0
  125. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js.map +1 -0
  126. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js +11 -0
  127. package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js.map +1 -0
  128. package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js +9 -0
  129. package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js.map +1 -0
  130. package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js +9 -0
  131. package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js.map +1 -0
  132. package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js +12 -0
  133. package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js.map +1 -0
  134. package/dist/node_modules/write-excel-file/modules/xml/findElement.js +12 -0
  135. package/dist/node_modules/write-excel-file/modules/xml/findElement.js.map +1 -0
  136. package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js +12 -0
  137. package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js.map +1 -0
  138. package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js +41 -0
  139. package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js.map +1 -0
  140. package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js +14 -0
  141. package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js.map +1 -0
  142. package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js +42 -0
  143. package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js.map +1 -0
  144. package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js +8 -0
  145. package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js.map +1 -0
  146. package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js +8 -0
  147. package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js.map +1 -0
  148. package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js +9 -0
  149. package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js.map +1 -0
  150. package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js +9 -0
  151. package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js.map +1 -0
  152. package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js +64 -0
  153. package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js.map +1 -0
  154. package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js +9 -0
  155. package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js.map +1 -0
  156. package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js +9 -0
  157. package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js.map +1 -0
  158. package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js +8 -0
  159. package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js.map +1 -0
  160. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js +10 -0
  161. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js.map +1 -0
  162. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js +11 -0
  163. package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js.map +1 -0
  164. package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js +11 -0
  165. package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js.map +1 -0
  166. package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js +8 -0
  167. package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js.map +1 -0
  168. package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js +18 -0
  169. package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js.map +1 -0
  170. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  171. package/dist/planmagnet/PlanMagnetRoot.js +160 -147
  172. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  173. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  174. package/dist/planmagnet/PlanMagnetRoutes.js +126 -106
  175. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  176. package/dist/planmagnet/comments/CommentThread.js +36 -36
  177. package/dist/planmagnet/comments/RoadmapComments.js +21 -21
  178. package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
  179. package/dist/planmagnet/controls/FeatureControls.js +60 -60
  180. package/dist/planmagnet/controls/Pickers.d.ts +10 -0
  181. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  182. package/dist/planmagnet/controls/Pickers.js +75 -27
  183. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  184. package/dist/planmagnet/controls/SyncControls.js +59 -59
  185. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
  186. package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
  187. package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
  188. package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
  189. package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
  190. package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
  191. package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
  192. package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
  193. package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
  194. package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
  195. package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
  196. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
  197. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
  198. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
  199. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
  200. package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
  201. package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
  202. package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
  203. package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
  204. package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
  205. package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
  206. package/dist/planmagnet/forecast/riskFlags.js +37 -0
  207. package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
  208. package/dist/planmagnet/index.d.ts +2 -0
  209. package/dist/planmagnet/index.d.ts.map +1 -1
  210. package/dist/planmagnet/index.js +2 -0
  211. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  212. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
  213. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  214. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
  215. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
  216. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
  217. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  218. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
  219. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
  220. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
  221. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
  222. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
  223. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
  224. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  225. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +206 -182
  226. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  227. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +6 -0
  228. package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -1
  229. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +5 -177
  230. package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -1
  231. package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts +3 -0
  232. package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts.map +1 -0
  233. package/dist/planmagnet/pages/ReportsEditReportPagePage.js +15 -0
  234. package/dist/planmagnet/pages/ReportsEditReportPagePage.js.map +1 -0
  235. package/dist/planmagnet/pages/ReportsReportPagePage.d.ts +7 -0
  236. package/dist/planmagnet/pages/ReportsReportPagePage.d.ts.map +1 -0
  237. package/dist/planmagnet/pages/ReportsReportPagePage.js +226 -0
  238. package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -0
  239. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  240. package/dist/planmagnet/pages/ReportsReportsPagePage.js +224 -496
  241. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  242. package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
  243. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
  244. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
  245. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
  246. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
  247. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
  248. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
  249. package/dist/planmagnet/product/ProductControls.js +91 -91
  250. package/dist/planmagnet/reports/ExportMenu.d.ts +9 -0
  251. package/dist/planmagnet/reports/ExportMenu.d.ts.map +1 -0
  252. package/dist/planmagnet/reports/ExportMenu.js +116 -0
  253. package/dist/planmagnet/reports/ExportMenu.js.map +1 -0
  254. package/dist/planmagnet/reports/PrintReportView.d.ts +24 -0
  255. package/dist/planmagnet/reports/PrintReportView.d.ts.map +1 -0
  256. package/dist/planmagnet/reports/PrintReportView.js +75 -0
  257. package/dist/planmagnet/reports/PrintReportView.js.map +1 -0
  258. package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts +8 -0
  259. package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts.map +1 -0
  260. package/dist/planmagnet/reports/ReportBuilderCanvas.js +261 -0
  261. package/dist/planmagnet/reports/ReportBuilderCanvas.js.map +1 -0
  262. package/dist/planmagnet/reports/ReportBuilderPage.d.ts +5 -0
  263. package/dist/planmagnet/reports/ReportBuilderPage.d.ts.map +1 -0
  264. package/dist/planmagnet/reports/ReportBuilderPage.js +198 -0
  265. package/dist/planmagnet/reports/ReportBuilderPage.js.map +1 -0
  266. package/dist/planmagnet/reports/ReportRunHistory.d.ts +8 -0
  267. package/dist/planmagnet/reports/ReportRunHistory.d.ts.map +1 -0
  268. package/dist/planmagnet/reports/ReportRunHistory.js +63 -0
  269. package/dist/planmagnet/reports/ReportRunHistory.js.map +1 -0
  270. package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts +7 -0
  271. package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts.map +1 -0
  272. package/dist/planmagnet/reports/ReportWidgetRenderer.js +251 -0
  273. package/dist/planmagnet/reports/ReportWidgetRenderer.js.map +1 -0
  274. package/dist/planmagnet/reports/SchedulesPanel.d.ts +4 -0
  275. package/dist/planmagnet/reports/SchedulesPanel.d.ts.map +1 -0
  276. package/dist/planmagnet/reports/SchedulesPanel.js +457 -0
  277. package/dist/planmagnet/reports/SchedulesPanel.js.map +1 -0
  278. package/dist/planmagnet/reports/ShareDialog.d.ts +5 -0
  279. package/dist/planmagnet/reports/ShareDialog.d.ts.map +1 -0
  280. package/dist/planmagnet/reports/ShareDialog.js +234 -0
  281. package/dist/planmagnet/reports/ShareDialog.js.map +1 -0
  282. package/dist/planmagnet/reports/SharedReportPage.d.ts +4 -0
  283. package/dist/planmagnet/reports/SharedReportPage.d.ts.map +1 -0
  284. package/dist/planmagnet/reports/SharedReportPage.js +180 -0
  285. package/dist/planmagnet/reports/SharedReportPage.js.map +1 -0
  286. package/dist/planmagnet/reports/WidgetEditorDialog.d.ts +10 -0
  287. package/dist/planmagnet/reports/WidgetEditorDialog.d.ts.map +1 -0
  288. package/dist/planmagnet/reports/WidgetEditorDialog.js +220 -0
  289. package/dist/planmagnet/reports/WidgetEditorDialog.js.map +1 -0
  290. package/dist/planmagnet/reports/reportExportPptx.d.ts +4 -0
  291. package/dist/planmagnet/reports/reportExportPptx.d.ts.map +1 -0
  292. package/dist/planmagnet/reports/reportExportPptx.js +118 -0
  293. package/dist/planmagnet/reports/reportExportPptx.js.map +1 -0
  294. package/dist/planmagnet/reports/reportExportXlsx.d.ts +4 -0
  295. package/dist/planmagnet/reports/reportExportXlsx.d.ts.map +1 -0
  296. package/dist/planmagnet/reports/reportExportXlsx.js +42 -0
  297. package/dist/planmagnet/reports/reportExportXlsx.js.map +1 -0
  298. package/dist/planmagnet/reports/reportGraphql.d.ts +28 -0
  299. package/dist/planmagnet/reports/reportGraphql.d.ts.map +1 -0
  300. package/dist/planmagnet/reports/reportGraphql.js +360 -0
  301. package/dist/planmagnet/reports/reportGraphql.js.map +1 -0
  302. package/dist/planmagnet/reports/reportModel.d.ts +198 -0
  303. package/dist/planmagnet/reports/reportModel.d.ts.map +1 -0
  304. package/dist/planmagnet/reports/reportModel.js +328 -0
  305. package/dist/planmagnet/reports/reportModel.js.map +1 -0
  306. package/dist/planmagnet/reports/sharedReportRoute.d.ts +15 -0
  307. package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -0
  308. package/dist/planmagnet/reports/sharedReportRoute.js +9 -0
  309. package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -0
  310. package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
  311. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
  312. package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
  313. package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
  314. package/package.json +6 -4
@@ -0,0 +1,198 @@
1
+ import { CombinedGraphQLErrors as e } from "../../node_modules/@apollo/client/errors/CombinedGraphQLErrors.js";
2
+ import { usePlanMagnet as t, usePlanMagnetNavigate as n } from "../providers/PlanMagnetProvider.js";
3
+ import { LEAVES_PAGE_CONTEXT as r, throwOnError as i } from "../utils/mutationResult.js";
4
+ import { ErrorLine as a } from "../controls/ConfirmButton.js";
5
+ import { detailPath as o } from "../utils/rowNavigation.js";
6
+ import { blankWidget as ee, repackWidgets as s, validateReportDraft as c } from "./reportModel.js";
7
+ import { ReportBuilderCanvas as l } from "./ReportBuilderCanvas.js";
8
+ import { CREATE_REPORT as u, GET_REPORT as d, UPDATE_REPORT as f } from "./reportGraphql.js";
9
+ import { useState as p } from "react";
10
+ import { Save as m, X as h } from "lucide-react";
11
+ import { useMutation as g, useQuery as _ } from "@apollo/client/react";
12
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
13
+ import { Button as b, Card as x, CardContent as S, CardHeader as C, CardTitle as w, Input as T, Select as E, SelectContent as D, SelectItem as O, SelectTrigger as te, SelectValue as ne, Textarea as k } from "@burdenoff/fe-libs/ui";
14
+ //#region src/planmagnet/reports/ReportBuilderPage.tsx
15
+ function A(t) {
16
+ if (!e.is(t)) return null;
17
+ let n = t.errors[0], r = n?.extensions?.field;
18
+ return !n || typeof r != "string" || !r ? null : {
19
+ field: r,
20
+ message: n.message
21
+ };
22
+ }
23
+ function j(e) {
24
+ let t = {};
25
+ return e.params.projectId && (t.projectId = e.params.projectId), e.params.sprintId && (t.sprintId = e.params.sprintId), e.params.teamId && (t.teamId = e.params.teamId), e.params.from && (t.from = e.params.from), e.params.to && (t.to = e.params.to), e.params.limit && (t.limit = e.params.limit), {
26
+ id: e.id,
27
+ type: e.type,
28
+ title: e.title,
29
+ source: e.source,
30
+ params: t,
31
+ layout: e.layout
32
+ };
33
+ }
34
+ function M({ mode: e, reportId: d, initial: _ }) {
35
+ let { workspaceId: M } = t(), N = n(), [P, F] = p(_?.name ?? ""), [I, L] = p(_?.description ?? ""), [R, z] = p(_?.visibility ?? "PRIVATE"), [B, V] = p(() => _?.definition.widgets ?? [ee()]), [H, U] = p(!1), [W, G] = p(null), [K, q] = p(null), [J, Y] = g(u), [X, re] = g(f), Z = Y.loading || re.loading, Q = c(B), $ = H && !P.trim() ? "Give this report a name." : null, ie = W ? [...Q, W] : Q, ae = async () => {
36
+ if (U(!0), q(null), G(null), !P.trim() || Q.length > 0) return;
37
+ let t = { widgets: s(B).map(j) };
38
+ try {
39
+ if (e === "create") {
40
+ if (!M) throw Error("No workspace selected.");
41
+ let e = (await i(J({
42
+ variables: {
43
+ workspaceId: M,
44
+ input: {
45
+ name: P.trim(),
46
+ description: I.trim() || null,
47
+ visibility: R,
48
+ definition: t
49
+ }
50
+ },
51
+ context: r
52
+ }))).data?.planmagnetCreateReport?.id;
53
+ e && N(o("/reports/report-page", e));
54
+ } else d && (await i(X({
55
+ variables: {
56
+ id: d,
57
+ input: {
58
+ name: P.trim(),
59
+ description: I.trim() || null,
60
+ visibility: R,
61
+ definition: t
62
+ }
63
+ },
64
+ context: r
65
+ })), N(o("/reports/report-page", d)));
66
+ } catch (e) {
67
+ let t = A(e);
68
+ t ? (G(t), q("Fix the highlighted field and try again.")) : q(e instanceof Error ? e.message : "The report could not be saved.");
69
+ }
70
+ };
71
+ return /* @__PURE__ */ y("div", {
72
+ className: "space-y-6 p-6",
73
+ "data-testid": "report-builder-page",
74
+ children: [
75
+ /* @__PURE__ */ y("div", {
76
+ className: "flex items-center justify-between",
77
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("h1", {
78
+ className: "text-2xl font-semibold",
79
+ children: e === "create" ? "New report" : "Edit report"
80
+ }), /* @__PURE__ */ v("p", {
81
+ className: "text-sm text-muted-foreground",
82
+ children: "Build a report from widgets over your live PlanMagnet data."
83
+ })] }), /* @__PURE__ */ y("div", {
84
+ className: "flex gap-2",
85
+ children: [/* @__PURE__ */ y(b, {
86
+ variant: "outline",
87
+ size: "sm",
88
+ onClick: () => N(e === "edit" && d ? o("/reports/report-page", d) : "/reports/reports-page"),
89
+ children: [/* @__PURE__ */ v(h, { className: "mr-1 h-4 w-4" }), "Cancel"]
90
+ }), /* @__PURE__ */ y(b, {
91
+ size: "sm",
92
+ onClick: () => void ae(),
93
+ disabled: Z,
94
+ "data-testid": "report-save",
95
+ children: [/* @__PURE__ */ v(m, { className: "mr-1 h-4 w-4" }), Z ? "Saving…" : "Save report"]
96
+ })]
97
+ })]
98
+ }),
99
+ /* @__PURE__ */ y(x, { children: [/* @__PURE__ */ v(C, { children: /* @__PURE__ */ v(w, { children: "Details" }) }), /* @__PURE__ */ y(S, {
100
+ className: "space-y-4",
101
+ children: [
102
+ /* @__PURE__ */ y("div", { children: [
103
+ /* @__PURE__ */ v("label", {
104
+ htmlFor: "report-name",
105
+ className: "text-sm font-medium",
106
+ children: "Name"
107
+ }),
108
+ /* @__PURE__ */ v(T, {
109
+ id: "report-name",
110
+ className: "mt-1",
111
+ value: P,
112
+ onChange: (e) => F(e.target.value),
113
+ "aria-invalid": !!$
114
+ }),
115
+ $ && /* @__PURE__ */ v("p", {
116
+ className: "mt-1 text-xs text-destructive",
117
+ children: $
118
+ })
119
+ ] }),
120
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
121
+ htmlFor: "report-description",
122
+ className: "text-sm font-medium",
123
+ children: "Description"
124
+ }), /* @__PURE__ */ v(k, {
125
+ id: "report-description",
126
+ className: "mt-1",
127
+ value: I,
128
+ onChange: (e) => L(e.target.value),
129
+ placeholder: "What does this report show, and who is it for?"
130
+ })] }),
131
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
132
+ htmlFor: "report-visibility",
133
+ className: "text-sm font-medium",
134
+ children: "Visibility"
135
+ }), /* @__PURE__ */ y(E, {
136
+ value: R,
137
+ onValueChange: (e) => z(e),
138
+ children: [/* @__PURE__ */ v(te, {
139
+ id: "report-visibility",
140
+ className: "mt-1 w-64",
141
+ children: /* @__PURE__ */ v(ne, {})
142
+ }), /* @__PURE__ */ y(D, { children: [/* @__PURE__ */ v(O, {
143
+ value: "PRIVATE",
144
+ children: "Private — only me"
145
+ }), /* @__PURE__ */ v(O, {
146
+ value: "WORKSPACE",
147
+ children: "Workspace — everyone can view"
148
+ })] })]
149
+ })] })
150
+ ]
151
+ })] }),
152
+ /* @__PURE__ */ v(x, { children: /* @__PURE__ */ v(S, {
153
+ className: "pt-6",
154
+ children: /* @__PURE__ */ v(l, {
155
+ widgets: B,
156
+ onChange: V,
157
+ errors: ie
158
+ })
159
+ }) }),
160
+ K && /* @__PURE__ */ v(a, { message: K })
161
+ ]
162
+ });
163
+ }
164
+ function N({ mode: e, reportId: t }) {
165
+ let r = n(), i = _(d, {
166
+ variables: { id: t ?? "" },
167
+ skip: e !== "edit" || !t
168
+ });
169
+ if (e === "create") return /* @__PURE__ */ v(M, {
170
+ mode: "create",
171
+ initial: null
172
+ });
173
+ if (i.loading && !i.data) return /* @__PURE__ */ v("div", {
174
+ className: "flex items-center justify-center p-12",
175
+ children: /* @__PURE__ */ v("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent" })
176
+ });
177
+ let a = i.data?.planmagnetReport;
178
+ return a ? /* @__PURE__ */ v(M, {
179
+ mode: "edit",
180
+ reportId: t,
181
+ initial: a
182
+ }, a.id) : /* @__PURE__ */ y("div", {
183
+ className: "space-y-3 p-6",
184
+ children: [/* @__PURE__ */ v("p", {
185
+ className: "text-sm text-muted-foreground",
186
+ children: "This report does not exist, or you do not have access to it."
187
+ }), /* @__PURE__ */ v(b, {
188
+ size: "sm",
189
+ variant: "outline",
190
+ onClick: () => r("/reports/reports-page"),
191
+ children: "Back to reports"
192
+ })]
193
+ });
194
+ }
195
+ //#endregion
196
+ export { N as ReportBuilderPage };
197
+
198
+ //# sourceMappingURL=ReportBuilderPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportBuilderPage.js","names":[],"sources":["../../../src/planmagnet/reports/ReportBuilderPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { Save, X } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { LEAVES_PAGE_CONTEXT, throwOnError } from '../utils/mutationResult';\nimport { ReportBuilderCanvas } from './ReportBuilderCanvas';\nimport { CREATE_REPORT, GET_REPORT, UPDATE_REPORT } from './reportGraphql';\nimport {\n blankWidget,\n repackWidgets,\n validateReportDraft,\n type FieldError,\n type ReportRecord,\n type ReportVisibility,\n type ReportWidget,\n} from './reportModel';\n\n/**\n * The report builder (ANR-13): name/description/visibility + the widget grid canvas, shared between create\n * (`ReportsCreateReportPagePage.tsx`, no report yet) and edit (`ReportsEditReportPagePage.tsx`, an existing\n * `id`). A server `BAD_USER_INPUT` this form's own `validateReportDraft` didn't already catch still lands on\n * the right field — `serverFieldError` reads its `extensions.field`, which matches\n * `definition.widgets[i].…` exactly as `report-definition.ts` sets it.\n *\n * `ReportBuilderPage` only loads data (and shows the first-load/not-found states); `ReportBuilderForm` is\n * mounted exactly once real initial data exists (`initial: ReportRecord | null` — always non-null before mount\n * in edit mode) and seeds every field from it via a lazy `useState` initializer, never an effect: there is\n * nothing to resynchronize afterwards; an in-cache `GET_REPORT` refetch while the user is mid-edit must not\n * stomp their unsaved changes, which an effect keyed on the query result would risk doing.\n */\n\nfunction serverFieldError(error: unknown): FieldError | null {\n if (!CombinedGraphQLErrors.is(error)) return null;\n const first = error.errors[0];\n const field = first?.extensions?.field;\n if (!first || typeof field !== 'string' || !field) return null;\n return { field, message: first.message };\n}\n\nfunction toWidgetInput(widget: ReportWidget) {\n const params: Record<string, string | number> = {};\n if (widget.params.projectId) params.projectId = widget.params.projectId;\n if (widget.params.sprintId) params.sprintId = widget.params.sprintId;\n if (widget.params.teamId) params.teamId = widget.params.teamId;\n if (widget.params.from) params.from = widget.params.from;\n if (widget.params.to) params.to = widget.params.to;\n if (widget.params.limit) params.limit = widget.params.limit;\n return {\n id: widget.id,\n type: widget.type,\n title: widget.title,\n source: widget.source,\n params,\n layout: widget.layout,\n };\n}\n\nfunction ReportBuilderForm({\n mode,\n reportId,\n initial,\n}: {\n mode: 'create' | 'edit';\n reportId?: string;\n initial: ReportRecord | null;\n}) {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const [name, setName] = useState(initial?.name ?? '');\n const [description, setDescription] = useState(initial?.description ?? '');\n const [visibility, setVisibility] = useState<ReportVisibility>(initial?.visibility ?? 'PRIVATE');\n const [widgets, setWidgets] = useState<ReportWidget[]>(\n () => initial?.definition.widgets ?? [blankWidget()]\n );\n const [touched, setTouched] = useState(false);\n const [serverError, setServerError] = useState<FieldError | null>(null);\n const [saveError, setSaveError] = useState<string | null>(null);\n\n const [createReport, createState] = useMutation(CREATE_REPORT);\n const [updateReport, updateState] = useMutation(UPDATE_REPORT);\n const saving = createState.loading || updateState.loading;\n\n const draftErrors = validateReportDraft(widgets);\n const nameError = touched && !name.trim() ? 'Give this report a name.' : null;\n const allErrors = serverError ? [...draftErrors, serverError] : draftErrors;\n\n const handleSave = async () => {\n setTouched(true);\n setSaveError(null);\n setServerError(null);\n if (!name.trim() || draftErrors.length > 0) return;\n const definition = { widgets: repackWidgets(widgets).map(toWidgetInput) };\n try {\n if (mode === 'create') {\n if (!workspaceId) throw new Error('No workspace selected.');\n const result = await throwOnError(\n createReport({\n variables: {\n workspaceId,\n input: {\n name: name.trim(),\n description: description.trim() || null,\n visibility,\n definition,\n },\n },\n context: LEAVES_PAGE_CONTEXT,\n })\n );\n const id = (result.data as { planmagnetCreateReport?: { id: string } } | undefined)\n ?.planmagnetCreateReport?.id;\n if (id) navigate(detailPath('/reports/report-page', id));\n } else if (reportId) {\n await throwOnError(\n updateReport({\n variables: {\n id: reportId,\n input: {\n name: name.trim(),\n description: description.trim() || null,\n visibility,\n definition,\n },\n },\n context: LEAVES_PAGE_CONTEXT,\n })\n );\n navigate(detailPath('/reports/report-page', reportId));\n }\n } catch (e) {\n const field = serverFieldError(e);\n if (field) {\n setServerError(field);\n setSaveError('Fix the highlighted field and try again.');\n } else {\n setSaveError(e instanceof Error ? e.message : 'The report could not be saved.');\n }\n }\n };\n\n const cancel = () =>\n navigate(\n mode === 'edit' && reportId\n ? detailPath('/reports/report-page', reportId)\n : '/reports/reports-page'\n );\n\n return (\n <div className=\"space-y-6 p-6\" data-testid=\"report-builder-page\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {mode === 'create' ? 'New report' : 'Edit report'}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n Build a report from widgets over your live PlanMagnet data.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={cancel}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void handleSave()}\n disabled={saving}\n data-testid=\"report-save\"\n >\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Saving…' : 'Save report'}\n </Button>\n </div>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label htmlFor=\"report-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"report-name\"\n className=\"mt-1\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n aria-invalid={!!nameError}\n />\n {nameError && <p className=\"mt-1 text-xs text-destructive\">{nameError}</p>}\n </div>\n <div>\n <label htmlFor=\"report-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <Textarea\n id=\"report-description\"\n className=\"mt-1\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"What does this report show, and who is it for?\"\n />\n </div>\n <div>\n <label htmlFor=\"report-visibility\" className=\"text-sm font-medium\">\n Visibility\n </label>\n <Select value={visibility} onValueChange={(v) => setVisibility(v as ReportVisibility)}>\n <SelectTrigger id=\"report-visibility\" className=\"mt-1 w-64\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"PRIVATE\">Private — only me</SelectItem>\n <SelectItem value=\"WORKSPACE\">Workspace — everyone can view</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardContent className=\"pt-6\">\n <ReportBuilderCanvas widgets={widgets} onChange={setWidgets} errors={allErrors} />\n </CardContent>\n </Card>\n\n {saveError && <ErrorLine message={saveError} />}\n </div>\n );\n}\n\nexport function ReportBuilderPage({\n mode,\n reportId,\n}: {\n mode: 'create' | 'edit';\n reportId?: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n\n const existing = useQuery<{ planmagnetReport: ReportRecord | null }>(GET_REPORT, {\n variables: { id: reportId ?? '' },\n skip: mode !== 'edit' || !reportId,\n });\n\n if (mode === 'create') {\n return <ReportBuilderForm mode=\"create\" initial={null} />;\n }\n\n // Only before the first load: a refetch must not blank the page.\n if (existing.loading && !existing.data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n );\n }\n const report = existing.data?.planmagnetReport;\n if (!report) {\n return (\n <div className=\"space-y-3 p-6\">\n <p className=\"text-sm text-muted-foreground\">\n This report does not exist, or you do not have access to it.\n </p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => navigate('/reports/reports-page')}>\n Back to reports\n </Button>\n </div>\n );\n }\n\n // Keyed by id: switching to a different report's edit page (a fresh navigation, not a refetch of this one)\n // mounts a new form with that report's own data, rather than reusing in-progress state from another report.\n return <ReportBuilderForm key={report.id} mode=\"edit\" reportId={reportId} initial={report} />;\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Past runs of a report (ANR-15) — a run is a snapshot, so re-opening an older one shows exactly what it
2
+ * showed when it ran, even if the underlying data has since changed. */
3
+ export declare function ReportRunHistory({ reportId, selectedRunId, onSelect, }: {
4
+ reportId: string;
5
+ selectedRunId: string | null;
6
+ onSelect: (runId: string) => void;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=ReportRunHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportRunHistory.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/reports/ReportRunHistory.tsx"],"names":[],"mappings":"AAeA;yEACyE;AACzE,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,aAAa,EACb,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,2CAsDA"}
@@ -0,0 +1,63 @@
1
+ import { PersonName as e } from "../people/People.js";
2
+ import { rowLinkProps as t } from "../utils/rowNavigation.js";
3
+ import { LIST_REPORT_RUNS as n } from "./reportGraphql.js";
4
+ import { History as r } from "lucide-react";
5
+ import { useQuery as i } from "@apollo/client/react";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ import { Badge as s } from "@burdenoff/fe-libs/ui";
8
+ //#region src/planmagnet/reports/ReportRunHistory.tsx
9
+ function c({ reportId: c, selectedRunId: l, onSelect: u }) {
10
+ let { data: d, loading: f, error: p } = i(n, { variables: {
11
+ reportId: c,
12
+ pagination: { first: 25 }
13
+ } }), m = d?.planmagnetReportRuns.items ?? [];
14
+ return /* @__PURE__ */ o("div", {
15
+ className: "space-y-2",
16
+ "data-testid": "report-run-history",
17
+ children: [/* @__PURE__ */ o("h2", {
18
+ className: "flex items-center gap-1.5 text-sm font-semibold",
19
+ children: [/* @__PURE__ */ a(r, {
20
+ className: "h-4 w-4",
21
+ "aria-hidden": !0
22
+ }), "Run history"]
23
+ }), f && !d ? /* @__PURE__ */ a("p", {
24
+ className: "text-sm text-muted-foreground",
25
+ children: "Loading…"
26
+ }) : p ? /* @__PURE__ */ a("p", {
27
+ className: "text-sm text-destructive",
28
+ children: "Run history could not be loaded."
29
+ }) : m.length === 0 ? /* @__PURE__ */ a("p", {
30
+ className: "text-sm text-muted-foreground",
31
+ children: "No runs yet."
32
+ }) : /* @__PURE__ */ a("ul", {
33
+ className: "space-y-1",
34
+ children: m.map((n) => {
35
+ let r = n.id === l;
36
+ return /* @__PURE__ */ a("li", { children: /* @__PURE__ */ o("div", {
37
+ ...t(() => u(n.id), `Open run from ${new Date(n.generatedAt).toLocaleString()}`),
38
+ className: `flex items-center justify-between gap-2 rounded-md border p-2 text-xs ${r ? "border-primary bg-primary/5" : "border-border"}`,
39
+ children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
40
+ className: "font-medium",
41
+ children: new Date(n.generatedAt).toLocaleString()
42
+ }), /* @__PURE__ */ o("p", {
43
+ className: "text-muted-foreground",
44
+ children: [
45
+ n.trigger === "SCHEDULE" ? "Scheduled" : "Manual",
46
+ " · by",
47
+ " ",
48
+ /* @__PURE__ */ a(e, { id: n.generatedBy })
49
+ ]
50
+ })] }), n.deliveryStatus === "PENDING_NOTIFICATIONS" && /* @__PURE__ */ a(s, {
51
+ variant: "outline",
52
+ className: "shrink-0 text-[10px]",
53
+ children: "No email yet"
54
+ })]
55
+ }) }, n.id);
56
+ })
57
+ })]
58
+ });
59
+ }
60
+ //#endregion
61
+ export { c as ReportRunHistory };
62
+
63
+ //# sourceMappingURL=ReportRunHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportRunHistory.js","names":[],"sources":["../../../src/planmagnet/reports/ReportRunHistory.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { History } from 'lucide-react';\nimport { PersonName } from '../people/People';\nimport { rowLinkProps } from '../utils/rowNavigation';\nimport { LIST_REPORT_RUNS } from './reportGraphql';\n\ninterface RunListItem {\n id: string;\n trigger: 'MANUAL' | 'SCHEDULE';\n generatedAt: string;\n generatedBy: string;\n deliveryStatus: 'PENDING_NOTIFICATIONS' | null;\n}\n\n/** Past runs of a report (ANR-15) — a run is a snapshot, so re-opening an older one shows exactly what it\n * showed when it ran, even if the underlying data has since changed. */\nexport function ReportRunHistory({\n reportId,\n selectedRunId,\n onSelect,\n}: {\n reportId: string;\n selectedRunId: string | null;\n onSelect: (runId: string) => void;\n}) {\n const { data, loading, error } = useQuery<{\n planmagnetReportRuns: { items: RunListItem[]; totalCount: number };\n }>(LIST_REPORT_RUNS, { variables: { reportId, pagination: { first: 25 } } });\n\n const runs = data?.planmagnetReportRuns.items ?? [];\n\n return (\n <div className=\"space-y-2\" data-testid=\"report-run-history\">\n <h2 className=\"flex items-center gap-1.5 text-sm font-semibold\">\n <History className=\"h-4 w-4\" aria-hidden={true} />\n Run history\n </h2>\n {loading && !data ? (\n <p className=\"text-sm text-muted-foreground\">Loading…</p>\n ) : error ? (\n <p className=\"text-sm text-destructive\">Run history could not be loaded.</p>\n ) : runs.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">No runs yet.</p>\n ) : (\n <ul className=\"space-y-1\">\n {runs.map((run) => {\n const selected = run.id === selectedRunId;\n return (\n <li key={run.id}>\n <div\n {...rowLinkProps(\n () => onSelect(run.id),\n `Open run from ${new Date(run.generatedAt).toLocaleString()}`\n )}\n className={`flex items-center justify-between gap-2 rounded-md border p-2 text-xs ${\n selected ? 'border-primary bg-primary/5' : 'border-border'\n }`}\n >\n <div>\n <p className=\"font-medium\">{new Date(run.generatedAt).toLocaleString()}</p>\n <p className=\"text-muted-foreground\">\n {run.trigger === 'SCHEDULE' ? 'Scheduled' : 'Manual'} · by{' '}\n <PersonName id={run.generatedBy} />\n </p>\n </div>\n {run.deliveryStatus === 'PENDING_NOTIFICATIONS' && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px]\">\n No email yet\n </Badge>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,EAAiB,EAC/B,aACA,kBACA,eAKC;CACD,IAAM,EAAE,SAAM,YAAS,aAAU,EAE9B,GAAkB,EAAE,WAAW;EAAE;EAAU,YAAY,EAAE,OAAO,IAAI;EAAE,EAAE,CAAC,EAEtE,IAAO,GAAM,qBAAqB,SAAS,EAAE;AAEnD,QACE,kBAAC,OAAD;EAAK,WAAU;EAAY,eAAY;YAAvC,CACE,kBAAC,MAAD;GAAI,WAAU;aAAd,CACE,kBAAC,GAAD;IAAS,WAAU;IAAU,eAAa;IAAQ,CAAA,EAAA,cAE/C;MACJ,KAAW,CAAC,IACX,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAAY,CAAA,GACvD,IACF,kBAAC,KAAD;GAAG,WAAU;aAA2B;GAAoC,CAAA,GAC1E,EAAK,WAAW,IAClB,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAAgB,CAAA,GAE7D,kBAAC,MAAD;GAAI,WAAU;aACX,EAAK,KAAK,MAAQ;IACjB,IAAM,IAAW,EAAI,OAAO;AAC5B,WACE,kBAAC,MAAD,EAAA,UACE,kBAAC,OAAD;KACE,GAAI,QACI,EAAS,EAAI,GAAG,EACtB,iBAAiB,IAAI,KAAK,EAAI,YAAY,CAAC,gBAAgB,GAC5D;KACD,WAAW,yEACT,IAAW,gCAAgC;eAN/C,CASE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAe,IAAI,KAAK,EAAI,YAAY,CAAC,gBAAgB;MAAK,CAAA,EAC3E,kBAAC,KAAD;MAAG,WAAU;gBAAb;OACG,EAAI,YAAY,aAAa,cAAc;OAAS;OAAM;OAC3D,kBAAC,GAAD,EAAY,IAAI,EAAI,aAAe,CAAA;OACjC;QACA,EAAA,CAAA,EACL,EAAI,mBAAmB,2BACtB,kBAAC,GAAD;MAAO,SAAQ;MAAU,WAAU;gBAAuB;MAElD,CAAA,CAEN;QACH,EAvBI,EAAI,GAuBR;KAEP;GACC,CAAA,CAEH"}
@@ -0,0 +1,7 @@
1
+ import { ReportWidget, WidgetRunResult } from './reportModel';
2
+
3
+ export declare function ReportWidgetRenderer({ widget, runResult, }: {
4
+ widget: ReportWidget;
5
+ runResult: WidgetRunResult | undefined;
6
+ }): import("react/jsx-runtime").JSX.Element | null;
7
+ //# sourceMappingURL=ReportWidgetRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportWidgetRenderer.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/reports/ReportWidgetRenderer.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAML,KAAK,YAAY,EAEjB,KAAK,eAAe,EACrB,MAAM,eAAe,CAAC;AAkRvB,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,eAAe,GAAG,SAAS,CAAC;CACxC,kDAkDA"}
@@ -0,0 +1,251 @@
1
+ import { Legend as e } from "../../node_modules/recharts/es6/component/Legend.js";
2
+ import { Tooltip as t } from "../../node_modules/recharts/es6/component/Tooltip.js";
3
+ import { ResponsiveContainer as n } from "../../node_modules/recharts/es6/component/ResponsiveContainer.js";
4
+ import { Bar as r } from "../../node_modules/recharts/es6/cartesian/Bar.js";
5
+ import { CartesianGrid as i } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
6
+ import { XAxis as a } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
7
+ import { YAxis as o } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
8
+ import { BarChart as s } from "../../node_modules/recharts/es6/chart/BarChart.js";
9
+ import { extractRows as c, humanizeKey as l, pickLabelField as u, pickNumericFields as d, scalarFields as f } from "./reportModel.js";
10
+ import { useId as p, useMemo as m, useState as h } from "react";
11
+ import { AlertTriangle as g, ChevronDown as _, ChevronRight as v, Lock as y } from "lucide-react";
12
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
13
+ import { Table as S, TableBody as C, TableCaption as w, TableCell as T, TableHead as E, TableHeader as D, TableRow as O } from "@burdenoff/fe-libs/ui";
14
+ //#region src/planmagnet/reports/ReportWidgetRenderer.tsx
15
+ var k = [
16
+ "var(--color-chart-1)",
17
+ "var(--color-chart-2)",
18
+ "var(--color-chart-3)",
19
+ "var(--color-chart-4)",
20
+ "var(--color-chart-5)",
21
+ "var(--color-chart-6)"
22
+ ], A = 4, j = 60, M = 8, N = 100;
23
+ function P(e) {
24
+ return typeof e == "string" && /^\d{4}-\d{2}-\d{2}([T ]|$)/.test(e);
25
+ }
26
+ function F(e) {
27
+ if (e == null) return "—";
28
+ if (typeof e == "boolean") return e ? "Yes" : "No";
29
+ if (P(e)) {
30
+ let t = new Date(e);
31
+ if (!Number.isNaN(t.getTime())) return `${t.getUTCFullYear()}-${String(t.getUTCMonth() + 1).padStart(2, "0")}-${String(t.getUTCDate()).padStart(2, "0")}`;
32
+ }
33
+ return typeof e == "number" ? Number.isInteger(e) ? String(e) : e.toFixed(2) : String(e);
34
+ }
35
+ function I(e) {
36
+ if (P(e)) {
37
+ let t = new Date(e);
38
+ if (!Number.isNaN(t.getTime())) return `${t.getUTCMonth() + 1}/${t.getUTCDate()}`;
39
+ }
40
+ return e == null ? "" : String(e);
41
+ }
42
+ function L(e, t) {
43
+ let n = /* @__PURE__ */ new Set(), r = [];
44
+ t && (n.add(t), r.push(t));
45
+ for (let t of e) for (let [e] of f(t)) if (!n.has(e) && (n.add(e), r.push(e), r.length >= M)) return r;
46
+ return r;
47
+ }
48
+ function R(e) {
49
+ return !e || typeof e != "object" || Array.isArray(e) ? [] : f(e);
50
+ }
51
+ function z(e) {
52
+ let t = [{
53
+ label: "Count",
54
+ value: String(e.length)
55
+ }], n = d(e, u(e)).slice(0, 4);
56
+ for (let r of n) {
57
+ let n = e.reduce((e, t) => {
58
+ let n = t[r];
59
+ return e + (typeof n == "number" ? n : 0);
60
+ }, 0);
61
+ t.push({
62
+ label: `Total ${l(r)}`,
63
+ value: F(n)
64
+ });
65
+ }
66
+ return t;
67
+ }
68
+ function B({ result: e }) {
69
+ let t = R(e), n = t.length > 0 ? t.map(([e, t]) => ({
70
+ label: l(e),
71
+ value: F(t)
72
+ })) : z(c(e));
73
+ return n.length === 0 ? /* @__PURE__ */ b("p", {
74
+ className: "text-sm text-muted-foreground",
75
+ children: "No figures in this result."
76
+ }) : /* @__PURE__ */ b("dl", {
77
+ className: "grid grid-cols-2 gap-3 sm:grid-cols-3",
78
+ children: n.map((e) => /* @__PURE__ */ x("div", {
79
+ className: "rounded-md border border-border bg-muted/40 p-2",
80
+ children: [/* @__PURE__ */ b("dt", {
81
+ className: "text-[11px] text-muted-foreground",
82
+ children: e.label
83
+ }), /* @__PURE__ */ b("dd", {
84
+ className: "text-lg font-semibold tabular-nums",
85
+ children: e.value
86
+ })]
87
+ }, e.label))
88
+ });
89
+ }
90
+ function V({ rows: e, labelField: t, title: n }) {
91
+ let [r, i] = h(!1), a = p(), o = L(e, t);
92
+ return /* @__PURE__ */ x("div", {
93
+ className: "mt-2",
94
+ children: [/* @__PURE__ */ x("button", {
95
+ type: "button",
96
+ className: "inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline",
97
+ "aria-expanded": r,
98
+ "aria-controls": a,
99
+ onClick: () => i((e) => !e),
100
+ children: [b(r ? _ : v, { className: "h-3 w-3" }), "View data as a table"]
101
+ }), r && /* @__PURE__ */ b("div", {
102
+ id: a,
103
+ className: "mt-2 max-h-64 overflow-auto rounded-md border border-border",
104
+ children: /* @__PURE__ */ b(H, {
105
+ rows: e,
106
+ columns: o,
107
+ caption: `${n} — data`
108
+ })
109
+ })]
110
+ });
111
+ }
112
+ function H({ rows: e, columns: t, caption: n }) {
113
+ let r = e.slice(0, N);
114
+ return /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ x(S, { children: [
115
+ /* @__PURE__ */ b(w, {
116
+ className: "sr-only",
117
+ children: n
118
+ }),
119
+ /* @__PURE__ */ b(D, { children: /* @__PURE__ */ b(O, { children: t.map((e) => /* @__PURE__ */ b(E, {
120
+ scope: "col",
121
+ children: l(e)
122
+ }, e)) }) }),
123
+ /* @__PURE__ */ b(C, { children: r.map((e, n) => /* @__PURE__ */ b(O, { children: t.map((t) => /* @__PURE__ */ b(T, { children: F(e[t]) }, t)) }, n)) })
124
+ ] }), e.length > r.length && /* @__PURE__ */ x("p", {
125
+ className: "p-2 text-left text-xs text-muted-foreground",
126
+ children: [
127
+ "Showing ",
128
+ r.length,
129
+ " of ",
130
+ e.length,
131
+ " rows."
132
+ ]
133
+ })] });
134
+ }
135
+ function U({ result: f, title: p }) {
136
+ let h = m(() => c(f), [f]), g = m(() => u(h), [h]), _ = m(() => d(h, g).slice(0, A), [h, g]);
137
+ return h.length < 2 || _.length === 0 ? /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", {
138
+ className: "mb-2 text-xs text-muted-foreground",
139
+ children: "Not enough rows to chart — showing the figures instead."
140
+ }), /* @__PURE__ */ b(B, { result: f })] }) : /* @__PURE__ */ x("div", { children: [
141
+ /* @__PURE__ */ b(n, {
142
+ width: "100%",
143
+ height: 220,
144
+ children: /* @__PURE__ */ x(s, {
145
+ data: h.slice(0, j).map((e, t) => {
146
+ let n = { __label: g ? I(e[g]) : String(t + 1) };
147
+ for (let t of _) {
148
+ let r = e[t];
149
+ n[t] = typeof r == "number" ? r : 0;
150
+ }
151
+ return n;
152
+ }),
153
+ children: [
154
+ /* @__PURE__ */ b(i, {
155
+ strokeDasharray: "3 3",
156
+ opacity: .2
157
+ }),
158
+ /* @__PURE__ */ b(a, {
159
+ dataKey: "__label",
160
+ tick: { fontSize: 11 }
161
+ }),
162
+ /* @__PURE__ */ b(o, {
163
+ tick: { fontSize: 11 },
164
+ allowDecimals: !1
165
+ }),
166
+ /* @__PURE__ */ b(t, {}),
167
+ _.length > 1 && /* @__PURE__ */ b(e, { wrapperStyle: { fontSize: 12 } }),
168
+ _.map((e, t) => /* @__PURE__ */ b(r, {
169
+ dataKey: e,
170
+ name: l(e),
171
+ fill: k[t % k.length]
172
+ }, e))
173
+ ]
174
+ })
175
+ }),
176
+ h.length > j && /* @__PURE__ */ x("p", {
177
+ className: "mt-1 text-[11px] text-muted-foreground",
178
+ children: [
179
+ "Showing the first ",
180
+ j,
181
+ " of ",
182
+ h.length,
183
+ " rows."
184
+ ]
185
+ }),
186
+ /* @__PURE__ */ b(V, {
187
+ rows: h,
188
+ labelField: g,
189
+ title: p
190
+ })
191
+ ] });
192
+ }
193
+ function W({ result: e }) {
194
+ let t = m(() => c(e), [e]), n = m(() => u(t), [t]);
195
+ return t.length === 0 ? /* @__PURE__ */ b("p", {
196
+ className: "text-sm text-muted-foreground",
197
+ children: "No rows in this result."
198
+ }) : /* @__PURE__ */ b("div", {
199
+ className: "max-h-80 overflow-auto rounded-md border border-border",
200
+ children: /* @__PURE__ */ b(H, {
201
+ rows: t,
202
+ columns: L(t, n),
203
+ caption: "Widget data"
204
+ })
205
+ });
206
+ }
207
+ function G({ widget: e, runResult: t }) {
208
+ if (e.type === "TEXT") return /* @__PURE__ */ b("div", {
209
+ className: "flex h-full items-center border-b border-border pb-1",
210
+ children: /* @__PURE__ */ b("h3", {
211
+ className: "text-sm font-semibold uppercase tracking-wide text-muted-foreground",
212
+ children: e.title
213
+ })
214
+ });
215
+ if (!t) return /* @__PURE__ */ b("p", {
216
+ className: "text-sm text-muted-foreground",
217
+ children: "Not run yet — choose “Run now” above."
218
+ });
219
+ if (t.status === "FORBIDDEN") return /* @__PURE__ */ x("div", {
220
+ className: "flex items-start gap-2 text-sm text-muted-foreground",
221
+ role: "status",
222
+ children: [/* @__PURE__ */ b(y, {
223
+ className: "mt-0.5 h-4 w-4 shrink-0",
224
+ "aria-hidden": !0
225
+ }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("p", { children: "You do not have access to this data." }), t.message && /* @__PURE__ */ b("p", {
226
+ className: "text-xs",
227
+ children: t.message
228
+ })] })]
229
+ });
230
+ if (t.status === "ERROR") return /* @__PURE__ */ x("div", {
231
+ className: "flex items-start gap-2 text-sm text-destructive",
232
+ role: "alert",
233
+ children: [/* @__PURE__ */ b(g, {
234
+ className: "mt-0.5 h-4 w-4 shrink-0",
235
+ "aria-hidden": !0
236
+ }), /* @__PURE__ */ b("p", { children: t.message ?? "This widget could not be generated." })]
237
+ });
238
+ switch (e.type) {
239
+ case "KPI": return /* @__PURE__ */ b(B, { result: t.result });
240
+ case "CHART": return /* @__PURE__ */ b(U, {
241
+ result: t.result,
242
+ title: e.title
243
+ });
244
+ case "TABLE": return /* @__PURE__ */ b(W, { result: t.result });
245
+ default: return null;
246
+ }
247
+ }
248
+ //#endregion
249
+ export { G as ReportWidgetRenderer };
250
+
251
+ //# sourceMappingURL=ReportWidgetRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportWidgetRenderer.js","names":[],"sources":["../../../src/planmagnet/reports/ReportWidgetRenderer.tsx"],"sourcesContent":["import { useId, useMemo, useState } from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { Lock, ChevronDown, ChevronRight, AlertTriangle } from 'lucide-react';\nimport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport {\n extractRows,\n humanizeKey,\n pickLabelField,\n pickNumericFields,\n scalarFields,\n type ReportWidget,\n type Row,\n type WidgetRunResult,\n} from './reportModel';\n\n/**\n * Renders one widget's run result (ANR-13/15). The widget's `type` (KPI/CHART/TABLE/TEXT) decides the shape;\n * within CHART/TABLE/KPI, the actual rows/fields are derived generically from the JSON `result` via\n * `reportModel`'s `extractRows`/`pickLabelField`/`pickNumericFields` — there is no per-source switch here, so\n * every one of the 15 `PlanmagnetReportSource`s (including ones added later) renders without a code change.\n *\n * FORBIDDEN and ERROR always show an explicit message (never an empty chart/table) — see the widget-status\n * branch below. Every CHART also carries a same-data `<table>` (a `<details>` disclosure, not visually hidden)\n * as its text alternative, per this package's accessibility bar.\n */\n\nconst CHART_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n 'var(--color-chart-6)',\n];\nconst MAX_CHART_SERIES = 4;\nconst MAX_CHART_POINTS = 60;\nconst MAX_TABLE_COLUMNS = 8;\nconst MAX_TABLE_ROWS = 100;\n\nfunction isIsoDateish(value: unknown): value is string {\n return typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}([T ]|$)/.test(value);\n}\n\n/** A scalar cell value as readable text — dates shortened to M/D, booleans spelled out, null/undefined blank. */\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) return '—';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (isIsoDateish(value)) {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(\n date.getUTCDate()\n ).padStart(2, '0')}`;\n }\n }\n if (typeof value === 'number') return Number.isInteger(value) ? String(value) : value.toFixed(2);\n return String(value);\n}\n\n/** The x-axis label for a chart point: a short date for date-ish values, the raw string/number otherwise. */\nfunction formatAxisLabel(value: unknown): string {\n if (isIsoDateish(value)) {\n const date = new Date(value as string);\n if (!Number.isNaN(date.getTime())) return `${date.getUTCMonth() + 1}/${date.getUTCDate()}`;\n }\n return value === null || value === undefined ? '' : String(value);\n}\n\nfunction tableColumns(rows: Row[], labelField: string | null): string[] {\n const seen = new Set<string>();\n const columns: string[] = [];\n if (labelField) {\n seen.add(labelField);\n columns.push(labelField);\n }\n for (const row of rows) {\n for (const [key] of scalarFields(row)) {\n if (seen.has(key)) continue;\n seen.add(key);\n columns.push(key);\n if (columns.length >= MAX_TABLE_COLUMNS) return columns;\n }\n }\n return columns;\n}\n\n/** The top-level result's own scalar fields, for a single-record source (PROJECT_STATUS, DELIVERY_KPIS, …). For\n * a bare array with no wrapper (WORK_ITEMS, RISKS, …) there is no top-level summary, so this returns `[]` and\n * the caller aggregates from rows instead. */\nfunction topLevelSummary(result: unknown): [string, string | number | boolean][] {\n if (!result || typeof result !== 'object' || Array.isArray(result)) return [];\n return scalarFields(result as Row);\n}\n\nfunction aggregateFromRows(rows: Row[]): { label: string; value: string }[] {\n const tiles: { label: string; value: string }[] = [\n { label: 'Count', value: String(rows.length) },\n ];\n const labelField = pickLabelField(rows);\n const numericFields = pickNumericFields(rows, labelField).slice(0, 4);\n for (const key of numericFields) {\n const total = rows.reduce((sum, row) => {\n const value = row[key];\n return sum + (typeof value === 'number' ? value : 0);\n }, 0);\n tiles.push({ label: `Total ${humanizeKey(key)}`, value: formatCell(total) });\n }\n return tiles;\n}\n\nfunction KpiTiles({ result }: { result: unknown }) {\n const summary = topLevelSummary(result);\n // extractRows/aggregateFromRows are cheap (object-key scans over an already in-memory JSON result), so this\n // is computed plainly rather than memoized — a `useMemo` here previously tripped\n // `react-hooks/preserve-manual-memoization` (the compiler could not reconcile it with its own inference).\n const tiles =\n summary.length > 0\n ? summary.map(([key, value]) => ({ label: humanizeKey(key), value: formatCell(value) }))\n : aggregateFromRows(extractRows(result));\n if (tiles.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">No figures in this result.</p>;\n }\n return (\n <dl className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n {tiles.map((tile) => (\n <div key={tile.label} className=\"rounded-md border border-border bg-muted/40 p-2\">\n <dt className=\"text-[11px] text-muted-foreground\">{tile.label}</dt>\n <dd className=\"text-lg font-semibold tabular-nums\">{tile.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\n/** The accessible text alternative every chart carries — a real `<table>` of the same rows, collapsed by\n * default (a sighted user who wants the chart isn't forced past it, but the data is one click away for\n * anyone who needs it: screen-reader users, anyone wanting exact values). */\nfunction DataTableDisclosure({\n rows,\n labelField,\n title,\n}: {\n rows: Row[];\n labelField: string | null;\n title: string;\n}) {\n const [open, setOpen] = useState(false);\n const panelId = useId();\n const columns = tableColumns(rows, labelField);\n return (\n <div className=\"mt-2\">\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 text-xs font-medium text-primary hover:underline\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => setOpen((v) => !v)}\n >\n {open ? <ChevronDown className=\"h-3 w-3\" /> : <ChevronRight className=\"h-3 w-3\" />}\n View data as a table\n </button>\n {open && (\n <div id={panelId} className=\"mt-2 max-h-64 overflow-auto rounded-md border border-border\">\n <DataTable rows={rows} columns={columns} caption={`${title} — data`} />\n </div>\n )}\n </div>\n );\n}\n\nfunction DataTable({\n rows,\n columns,\n caption,\n}: {\n rows: Row[];\n columns: string[];\n caption: string;\n}) {\n const shown = rows.slice(0, MAX_TABLE_ROWS);\n return (\n <div>\n <Table>\n <TableCaption className=\"sr-only\">{caption}</TableCaption>\n <TableHeader>\n <TableRow>\n {columns.map((col) => (\n <TableHead key={col} scope=\"col\">\n {humanizeKey(col)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {shown.map((row, index) => (\n // Rows carry no stable id across sources — the positional key is fine since this table is\n // read-only and re-rendered wholesale from a fresh run result each time, never reordered in place.\n <TableRow key={index}>\n {columns.map((col) => (\n <TableCell key={col}>{formatCell(row[col])}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {rows.length > shown.length && (\n <p className=\"p-2 text-left text-xs text-muted-foreground\">\n Showing {shown.length} of {rows.length} rows.\n </p>\n )}\n </div>\n );\n}\n\nfunction ChartBody({ result, title }: { result: unknown; title: string }) {\n const rows = useMemo(() => extractRows(result), [result]);\n const labelField = useMemo(() => pickLabelField(rows), [rows]);\n const numericFields = useMemo(\n () => pickNumericFields(rows, labelField).slice(0, MAX_CHART_SERIES),\n [rows, labelField]\n );\n\n if (rows.length < 2 || numericFields.length === 0) {\n return (\n <div>\n <p className=\"mb-2 text-xs text-muted-foreground\">\n Not enough rows to chart — showing the figures instead.\n </p>\n <KpiTiles result={result} />\n </div>\n );\n }\n\n const chartData = rows.slice(0, MAX_CHART_POINTS).map((row, index) => {\n const point: Record<string, string | number> = {\n __label: labelField ? formatAxisLabel(row[labelField]) : String(index + 1),\n };\n for (const key of numericFields) {\n const value = row[key];\n point[key] = typeof value === 'number' ? value : 0;\n }\n return point;\n });\n\n return (\n <div>\n <ResponsiveContainer width=\"100%\" height={220}>\n <BarChart data={chartData}>\n <CartesianGrid strokeDasharray=\"3 3\" opacity={0.2} />\n <XAxis dataKey=\"__label\" tick={{ fontSize: 11 }} />\n <YAxis tick={{ fontSize: 11 }} allowDecimals={false} />\n <Tooltip />\n {numericFields.length > 1 && <Legend wrapperStyle={{ fontSize: 12 }} />}\n {numericFields.map((key, index) => (\n <Bar\n key={key}\n dataKey={key}\n name={humanizeKey(key)}\n fill={CHART_COLORS[index % CHART_COLORS.length]}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n {rows.length > MAX_CHART_POINTS && (\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n Showing the first {MAX_CHART_POINTS} of {rows.length} rows.\n </p>\n )}\n <DataTableDisclosure rows={rows} labelField={labelField} title={title} />\n </div>\n );\n}\n\nfunction TableBodyContent({ result }: { result: unknown }) {\n const rows = useMemo(() => extractRows(result), [result]);\n const labelField = useMemo(() => pickLabelField(rows), [rows]);\n if (rows.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">No rows in this result.</p>;\n }\n const columns = tableColumns(rows, labelField);\n return (\n <div className=\"max-h-80 overflow-auto rounded-md border border-border\">\n <DataTable rows={rows} columns={columns} caption=\"Widget data\" />\n </div>\n );\n}\n\nexport function ReportWidgetRenderer({\n widget,\n runResult,\n}: {\n widget: ReportWidget;\n runResult: WidgetRunResult | undefined;\n}) {\n if (widget.type === 'TEXT') {\n return (\n <div className=\"flex h-full items-center border-b border-border pb-1\">\n <h3 className=\"text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n {widget.title}\n </h3>\n </div>\n );\n }\n\n if (!runResult) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n Not run yet — choose &ldquo;Run now&rdquo; above.\n </p>\n );\n }\n\n if (runResult.status === 'FORBIDDEN') {\n return (\n <div className=\"flex items-start gap-2 text-sm text-muted-foreground\" role=\"status\">\n <Lock className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden={true} />\n <div>\n <p>You do not have access to this data.</p>\n {runResult.message && <p className=\"text-xs\">{runResult.message}</p>}\n </div>\n </div>\n );\n }\n\n if (runResult.status === 'ERROR') {\n return (\n <div className=\"flex items-start gap-2 text-sm text-destructive\" role=\"alert\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden={true} />\n <p>{runResult.message ?? 'This widget could not be generated.'}</p>\n </div>\n );\n }\n\n switch (widget.type) {\n case 'KPI':\n return <KpiTiles result={runResult.result} />;\n case 'CHART':\n return <ChartBody result={runResult.result} title={widget.title} />;\n case 'TABLE':\n return <TableBodyContent result={runResult.result} />;\n default:\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AA2CA,IAAM,IAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACD,EACK,IAAmB,GACnB,IAAmB,IACnB,IAAoB,GACpB,IAAiB;AAEvB,SAAS,EAAa,GAAiC;AACrD,QAAO,OAAO,KAAU,YAAY,6BAA6B,KAAK,EAAM;;AAI9E,SAAS,EAAW,GAAwB;AAC1C,KAAI,KAAU,KAA6B,QAAO;AAClD,KAAI,OAAO,KAAU,UAAW,QAAO,IAAQ,QAAQ;AACvD,KAAI,EAAa,EAAM,EAAE;EACvB,IAAM,IAAO,IAAI,KAAK,EAAM;AAC5B,MAAI,CAAC,OAAO,MAAM,EAAK,SAAS,CAAC,CAC/B,QAAO,GAAG,EAAK,gBAAgB,CAAC,GAAG,OAAO,EAAK,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OACpF,EAAK,YAAY,CAClB,CAAC,SAAS,GAAG,IAAI;;AAItB,QADI,OAAO,KAAU,WAAiB,OAAO,UAAU,EAAM,GAAG,OAAO,EAAM,GAAG,EAAM,QAAQ,EAAE,GACzF,OAAO,EAAM;;AAItB,SAAS,EAAgB,GAAwB;AAC/C,KAAI,EAAa,EAAM,EAAE;EACvB,IAAM,IAAO,IAAI,KAAK,EAAgB;AACtC,MAAI,CAAC,OAAO,MAAM,EAAK,SAAS,CAAC,CAAE,QAAO,GAAG,EAAK,aAAa,GAAG,EAAE,GAAG,EAAK,YAAY;;AAE1F,QAAO,KAAU,OAA8B,KAAK,OAAO,EAAM;;AAGnE,SAAS,EAAa,GAAa,GAAqC;CACtE,IAAM,oBAAO,IAAI,KAAa,EACxB,IAAoB,EAAE;AAC5B,CAAI,MACF,EAAK,IAAI,EAAW,EACpB,EAAQ,KAAK,EAAW;AAE1B,MAAK,IAAM,KAAO,EAChB,MAAK,IAAM,CAAC,MAAQ,EAAa,EAAI,CAC/B,QAAK,IAAI,EAAI,KACjB,EAAK,IAAI,EAAI,EACb,EAAQ,KAAK,EAAI,EACb,EAAQ,UAAU,GAAmB,QAAO;AAGpD,QAAO;;AAMT,SAAS,EAAgB,GAAwD;AAE/E,QADI,CAAC,KAAU,OAAO,KAAW,YAAY,MAAM,QAAQ,EAAO,GAAS,EAAE,GACtE,EAAa,EAAc;;AAGpC,SAAS,EAAkB,GAAiD;CAC1E,IAAM,IAA4C,CAChD;EAAE,OAAO;EAAS,OAAO,OAAO,EAAK,OAAO;EAAE,CAC/C,EAEK,IAAgB,EAAkB,GADrB,EAAe,EAAK,CACkB,CAAC,MAAM,GAAG,EAAE;AACrE,MAAK,IAAM,KAAO,GAAe;EAC/B,IAAM,IAAQ,EAAK,QAAQ,GAAK,MAAQ;GACtC,IAAM,IAAQ,EAAI;AAClB,UAAO,KAAO,OAAO,KAAU,WAAW,IAAQ;KACjD,EAAE;AACL,IAAM,KAAK;GAAE,OAAO,SAAS,EAAY,EAAI;GAAI,OAAO,EAAW,EAAM;GAAE,CAAC;;AAE9E,QAAO;;AAGT,SAAS,EAAS,EAAE,aAA+B;CACjD,IAAM,IAAU,EAAgB,EAAO,EAIjC,IACJ,EAAQ,SAAS,IACb,EAAQ,KAAK,CAAC,GAAK,QAAY;EAAE,OAAO,EAAY,EAAI;EAAE,OAAO,EAAW,EAAM;EAAE,EAAE,GACtF,EAAkB,EAAY,EAAO,CAAC;AAI5C,QAHI,EAAM,WAAW,IACZ,kBAAC,KAAD;EAAG,WAAU;YAAgC;EAA8B,CAAA,GAGlF,kBAAC,MAAD;EAAI,WAAU;YACX,EAAM,KAAK,MACV,kBAAC,OAAD;GAAsB,WAAU;aAAhC,CACE,kBAAC,MAAD;IAAI,WAAU;cAAqC,EAAK;IAAW,CAAA,EACnE,kBAAC,MAAD;IAAI,WAAU;cAAsC,EAAK;IAAW,CAAA,CAChE;KAHI,EAAK,MAGT,CACN;EACC,CAAA;;AAOT,SAAS,EAAoB,EAC3B,SACA,eACA,YAKC;CACD,IAAM,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,IAAU,GAAO,EACjB,IAAU,EAAa,GAAM,EAAW;AAC9C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAU;GACV,iBAAe;GACf,iBAAe;GACf,eAAe,GAAS,MAAM,CAAC,EAAE;aALnC,CAOU,EAAP,IAAQ,IAAsC,GAAvC,EAAa,WAAU,WAAY,CAAuC,EAAC,uBAE5E;MACR,KACC,kBAAC,OAAD;GAAK,IAAI;GAAS,WAAU;aAC1B,kBAAC,GAAD;IAAiB;IAAe;IAAS,SAAS,GAAG,EAAM;IAAY,CAAA;GACnE,CAAA,CAEJ;;;AAIV,SAAS,EAAU,EACjB,SACA,YACA,cAKC;CACD,IAAM,IAAQ,EAAK,MAAM,GAAG,EAAe;AAC3C,QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GAAc,WAAU;aAAW;GAAuB,CAAA;EAC1D,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,GAAD;GAAqB,OAAM;aACxB,EAAY,EAAI;GACP,EAFI,EAEJ,CACZ,EACO,CAAA,EACC,CAAA;EACd,kBAAC,GAAD,EAAA,UACG,EAAM,KAAK,GAAK,MAGf,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,GAAD,EAAA,UAAsB,EAAW,EAAI,GAAK,EAAa,EAAvC,EAAuC,CACvD,EACO,EAJI,EAIJ,CACX,EACQ,CAAA;EACN,EAAA,CAAA,EACP,EAAK,SAAS,EAAM,UACnB,kBAAC,KAAD;EAAG,WAAU;YAAb;GAA2D;GAChD,EAAM;GAAO;GAAK,EAAK;GAAO;GACrC;IAEF,EAAA,CAAA;;AAIV,SAAS,EAAU,EAAE,WAAQ,YAA6C;CACxE,IAAM,IAAO,QAAc,EAAY,EAAO,EAAE,CAAC,EAAO,CAAC,EACnD,IAAa,QAAc,EAAe,EAAK,EAAE,CAAC,EAAK,CAAC,EACxD,IAAgB,QACd,EAAkB,GAAM,EAAW,CAAC,MAAM,GAAG,EAAiB,EACpE,CAAC,GAAM,EAAW,CACnB;AAwBD,QAtBI,EAAK,SAAS,KAAK,EAAc,WAAW,IAE5C,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;EAAG,WAAU;YAAqC;EAE9C,CAAA,EACJ,kBAAC,GAAD,EAAkB,WAAU,CAAA,CACxB,EAAA,CAAA,GAgBR,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,GAAD;GAAqB,OAAM;GAAO,QAAQ;aACxC,kBAAC,GAAD;IAAU,MAdE,EAAK,MAAM,GAAG,EAAiB,CAAC,KAAK,GAAK,MAAU;KACpE,IAAM,IAAyC,EAC7C,SAAS,IAAa,EAAgB,EAAI,GAAY,GAAG,OAAO,IAAQ,EAAE,EAC3E;AACD,UAAK,IAAM,KAAO,GAAe;MAC/B,IAAM,IAAQ,EAAI;AAClB,QAAM,KAAO,OAAO,KAAU,WAAW,IAAQ;;AAEnD,YAAO;MACP;cAKI;KACE,kBAAC,GAAD;MAAe,iBAAgB;MAAM,SAAS;MAAO,CAAA;KACrD,kBAAC,GAAD;MAAO,SAAQ;MAAU,MAAM,EAAE,UAAU,IAAI;MAAI,CAAA;KACnD,kBAAC,GAAD;MAAO,MAAM,EAAE,UAAU,IAAI;MAAE,eAAe;MAAS,CAAA;KACvD,kBAAC,GAAD,EAAW,CAAA;KACV,EAAc,SAAS,KAAK,kBAAC,GAAD,EAAQ,cAAc,EAAE,UAAU,IAAI,EAAI,CAAA;KACtE,EAAc,KAAK,GAAK,MACvB,kBAAC,GAAD;MAEE,SAAS;MACT,MAAM,EAAY,EAAI;MACtB,MAAM,EAAa,IAAQ,EAAa;MACxC,EAJK,EAIL,CACF;KACO;;GACS,CAAA;EACrB,EAAK,SAAS,KACb,kBAAC,KAAD;GAAG,WAAU;aAAb;IAAsD;IACjC;IAAiB;IAAK,EAAK;IAAO;IACnD;;EAEN,kBAAC,GAAD;GAA2B;GAAkB;GAAmB;GAAS,CAAA;EACrE,EAAA,CAAA;;AAIV,SAAS,EAAiB,EAAE,aAA+B;CACzD,IAAM,IAAO,QAAc,EAAY,EAAO,EAAE,CAAC,EAAO,CAAC,EACnD,IAAa,QAAc,EAAe,EAAK,EAAE,CAAC,EAAK,CAAC;AAK9D,QAJI,EAAK,WAAW,IACX,kBAAC,KAAD;EAAG,WAAU;YAAgC;EAA2B,CAAA,GAI/E,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAiB;GAAe,SAHpB,EAAa,GAAM,EAAW;GAGD,SAAQ;GAAgB,CAAA;EAC7D,CAAA;;AAIV,SAAgB,EAAqB,EACnC,WACA,gBAIC;AACD,KAAI,EAAO,SAAS,OAClB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,MAAD;GAAI,WAAU;aACX,EAAO;GACL,CAAA;EACD,CAAA;AAIV,KAAI,CAAC,EACH,QACE,kBAAC,KAAD;EAAG,WAAU;YAAgC;EAEzC,CAAA;AAIR,KAAI,EAAU,WAAW,YACvB,QACE,kBAAC,OAAD;EAAK,WAAU;EAAuD,MAAK;YAA3E,CACE,kBAAC,GAAD;GAAM,WAAU;GAA0B,eAAa;GAAQ,CAAA,EAC/D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD,EAAA,UAAG,wCAAwC,CAAA,EAC1C,EAAU,WAAW,kBAAC,KAAD;GAAG,WAAU;aAAW,EAAU;GAAY,CAAA,CAChE,EAAA,CAAA,CACF;;AAIV,KAAI,EAAU,WAAW,QACvB,QACE,kBAAC,OAAD;EAAK,WAAU;EAAkD,MAAK;YAAtE,CACE,kBAAC,GAAD;GAAe,WAAU;GAA0B,eAAa;GAAQ,CAAA,EACxE,kBAAC,KAAD,EAAA,UAAI,EAAU,WAAW,uCAA0C,CAAA,CAC/D;;AAIV,SAAQ,EAAO,MAAf;EACE,KAAK,MACH,QAAO,kBAAC,GAAD,EAAU,QAAQ,EAAU,QAAU,CAAA;EAC/C,KAAK,QACH,QAAO,kBAAC,GAAD;GAAW,QAAQ,EAAU;GAAQ,OAAO,EAAO;GAAS,CAAA;EACrE,KAAK,QACH,QAAO,kBAAC,GAAD,EAAkB,QAAQ,EAAU,QAAU,CAAA;EACvD,QACE,QAAO"}
@@ -0,0 +1,4 @@
1
+ export declare function SchedulesPanel({ reportId }: {
2
+ reportId: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=SchedulesPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchedulesPanel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/reports/SchedulesPanel.tsx"],"names":[],"mappings":"AAqZA,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,2CAwHhE"}