@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.
- package/dist/_virtual/__vite-browser-external.js +9 -0
- package/dist/_virtual/__vite-browser-external.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.js +5 -2
- package/dist/index.js +3 -1
- package/dist/node_modules/fflate/esm/browser.js +554 -0
- package/dist/node_modules/fflate/esm/browser.js.map +1 -0
- package/dist/node_modules/jszip/dist/jszip.min.js +3038 -0
- package/dist/node_modules/jszip/dist/jszip.min.js.map +1 -0
- package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js +2151 -0
- package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js.map +1 -0
- package/dist/node_modules/write-excel-file/browser/index.js +3 -0
- package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js +13 -0
- package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js +21 -0
- package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js +11 -0
- package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js +23 -0
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js +22 -0
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js +18 -0
- package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js +131 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js +188 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js +52 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js +18 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js +18 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js +17 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js +42 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js +102 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js +17 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js +15 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js +8 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js +71 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js +56 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js +15 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js +13 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js +44 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js +123 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js +41 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js +17 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js +20 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js +77 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js +22 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js +13 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js +242 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js +29 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js +42 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js +43 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js +93 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js +39 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js +17 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js +29 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js +14 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js +14 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js +12 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js +24 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js +27 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js +17 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js +74 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js +138 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js +40 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js +12 -0
- package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElement.js +12 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js +12 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js +41 -0
- package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js +14 -0
- package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js +42 -0
- package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js +8 -0
- package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js +8 -0
- package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js +64 -0
- package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js +9 -0
- package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js +8 -0
- package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js +10 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js +11 -0
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js +8 -0
- package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js.map +1 -0
- package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js +18 -0
- package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js.map +1 -0
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +160 -147
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +126 -106
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/comments/CommentThread.js +36 -36
- package/dist/planmagnet/comments/RoadmapComments.js +21 -21
- package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
- package/dist/planmagnet/controls/FeatureControls.js +60 -60
- package/dist/planmagnet/controls/Pickers.d.ts +10 -0
- package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
- package/dist/planmagnet/controls/Pickers.js +75 -27
- package/dist/planmagnet/controls/Pickers.js.map +1 -1
- package/dist/planmagnet/controls/SyncControls.js +59 -59
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
- package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
- package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.js +37 -0
- package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
- package/dist/planmagnet/index.d.ts +2 -0
- package/dist/planmagnet/index.d.ts.map +1 -1
- package/dist/planmagnet/index.js +2 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +206 -182
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +6 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +5 -177
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts +3 -0
- package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsEditReportPagePage.js +15 -0
- package/dist/planmagnet/pages/ReportsEditReportPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsReportPagePage.d.ts +7 -0
- package/dist/planmagnet/pages/ReportsReportPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsReportPagePage.js +226 -0
- package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +224 -496
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
- package/dist/planmagnet/product/ProductControls.js +91 -91
- package/dist/planmagnet/reports/ExportMenu.d.ts +9 -0
- package/dist/planmagnet/reports/ExportMenu.d.ts.map +1 -0
- package/dist/planmagnet/reports/ExportMenu.js +116 -0
- package/dist/planmagnet/reports/ExportMenu.js.map +1 -0
- package/dist/planmagnet/reports/PrintReportView.d.ts +24 -0
- package/dist/planmagnet/reports/PrintReportView.d.ts.map +1 -0
- package/dist/planmagnet/reports/PrintReportView.js +75 -0
- package/dist/planmagnet/reports/PrintReportView.js.map +1 -0
- package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts +8 -0
- package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts.map +1 -0
- package/dist/planmagnet/reports/ReportBuilderCanvas.js +261 -0
- package/dist/planmagnet/reports/ReportBuilderCanvas.js.map +1 -0
- package/dist/planmagnet/reports/ReportBuilderPage.d.ts +5 -0
- package/dist/planmagnet/reports/ReportBuilderPage.d.ts.map +1 -0
- package/dist/planmagnet/reports/ReportBuilderPage.js +198 -0
- package/dist/planmagnet/reports/ReportBuilderPage.js.map +1 -0
- package/dist/planmagnet/reports/ReportRunHistory.d.ts +8 -0
- package/dist/planmagnet/reports/ReportRunHistory.d.ts.map +1 -0
- package/dist/planmagnet/reports/ReportRunHistory.js +63 -0
- package/dist/planmagnet/reports/ReportRunHistory.js.map +1 -0
- package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts +7 -0
- package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts.map +1 -0
- package/dist/planmagnet/reports/ReportWidgetRenderer.js +251 -0
- package/dist/planmagnet/reports/ReportWidgetRenderer.js.map +1 -0
- package/dist/planmagnet/reports/SchedulesPanel.d.ts +4 -0
- package/dist/planmagnet/reports/SchedulesPanel.d.ts.map +1 -0
- package/dist/planmagnet/reports/SchedulesPanel.js +457 -0
- package/dist/planmagnet/reports/SchedulesPanel.js.map +1 -0
- package/dist/planmagnet/reports/ShareDialog.d.ts +5 -0
- package/dist/planmagnet/reports/ShareDialog.d.ts.map +1 -0
- package/dist/planmagnet/reports/ShareDialog.js +234 -0
- package/dist/planmagnet/reports/ShareDialog.js.map +1 -0
- package/dist/planmagnet/reports/SharedReportPage.d.ts +4 -0
- package/dist/planmagnet/reports/SharedReportPage.d.ts.map +1 -0
- package/dist/planmagnet/reports/SharedReportPage.js +180 -0
- package/dist/planmagnet/reports/SharedReportPage.js.map +1 -0
- package/dist/planmagnet/reports/WidgetEditorDialog.d.ts +10 -0
- package/dist/planmagnet/reports/WidgetEditorDialog.d.ts.map +1 -0
- package/dist/planmagnet/reports/WidgetEditorDialog.js +220 -0
- package/dist/planmagnet/reports/WidgetEditorDialog.js.map +1 -0
- package/dist/planmagnet/reports/reportExportPptx.d.ts +4 -0
- package/dist/planmagnet/reports/reportExportPptx.d.ts.map +1 -0
- package/dist/planmagnet/reports/reportExportPptx.js +118 -0
- package/dist/planmagnet/reports/reportExportPptx.js.map +1 -0
- package/dist/planmagnet/reports/reportExportXlsx.d.ts +4 -0
- package/dist/planmagnet/reports/reportExportXlsx.d.ts.map +1 -0
- package/dist/planmagnet/reports/reportExportXlsx.js +42 -0
- package/dist/planmagnet/reports/reportExportXlsx.js.map +1 -0
- package/dist/planmagnet/reports/reportGraphql.d.ts +28 -0
- package/dist/planmagnet/reports/reportGraphql.d.ts.map +1 -0
- package/dist/planmagnet/reports/reportGraphql.js +360 -0
- package/dist/planmagnet/reports/reportGraphql.js.map +1 -0
- package/dist/planmagnet/reports/reportModel.d.ts +198 -0
- package/dist/planmagnet/reports/reportModel.d.ts.map +1 -0
- package/dist/planmagnet/reports/reportModel.js +328 -0
- package/dist/planmagnet/reports/reportModel.js.map +1 -0
- package/dist/planmagnet/reports/sharedReportRoute.d.ts +15 -0
- package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -0
- package/dist/planmagnet/reports/sharedReportRoute.js +9 -0
- package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -0
- package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
- package/package.json +6 -4
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
var e = [
|
|
2
|
+
"KPI",
|
|
3
|
+
"CHART",
|
|
4
|
+
"TABLE",
|
|
5
|
+
"TEXT"
|
|
6
|
+
], t = [
|
|
7
|
+
"PROJECT_STATUS",
|
|
8
|
+
"VELOCITY",
|
|
9
|
+
"BURNDOWN",
|
|
10
|
+
"CUMULATIVE_FLOW",
|
|
11
|
+
"CYCLE_TIME",
|
|
12
|
+
"THROUGHPUT",
|
|
13
|
+
"QUALITY_METRICS",
|
|
14
|
+
"DELIVERY_KPIS",
|
|
15
|
+
"BUDGET_VARIANCE",
|
|
16
|
+
"TIME_BY_PERSON",
|
|
17
|
+
"STATUS_FLOW",
|
|
18
|
+
"WORK_BREAKDOWN",
|
|
19
|
+
"TEAM_WORKLOAD",
|
|
20
|
+
"RISKS",
|
|
21
|
+
"WORK_ITEMS"
|
|
22
|
+
], n = [
|
|
23
|
+
"projectId",
|
|
24
|
+
"sprintId",
|
|
25
|
+
"teamId",
|
|
26
|
+
"from",
|
|
27
|
+
"to",
|
|
28
|
+
"limit"
|
|
29
|
+
], r = {
|
|
30
|
+
PROJECT_STATUS: {
|
|
31
|
+
label: "Project status",
|
|
32
|
+
description: "A project's key, name, status and methodology.",
|
|
33
|
+
group: "Projects & work",
|
|
34
|
+
allowedParams: ["projectId"]
|
|
35
|
+
},
|
|
36
|
+
WORK_ITEMS: {
|
|
37
|
+
label: "Work items",
|
|
38
|
+
description: "A list of work items, optionally scoped to a project or sprint.",
|
|
39
|
+
group: "Projects & work",
|
|
40
|
+
allowedParams: [
|
|
41
|
+
"projectId",
|
|
42
|
+
"sprintId",
|
|
43
|
+
"limit"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
WORK_BREAKDOWN: {
|
|
47
|
+
label: "Work breakdown",
|
|
48
|
+
description: "Open vs. done items and points, by epic, for one or every project.",
|
|
49
|
+
group: "Projects & work",
|
|
50
|
+
allowedParams: ["projectId"]
|
|
51
|
+
},
|
|
52
|
+
VELOCITY: {
|
|
53
|
+
label: "Sprint velocity",
|
|
54
|
+
description: "A project's completed points per sprint, trailing sprints, with a next-sprint forecast.",
|
|
55
|
+
group: "Delivery & flow",
|
|
56
|
+
allowedParams: ["projectId", "limit"]
|
|
57
|
+
},
|
|
58
|
+
BURNDOWN: {
|
|
59
|
+
label: "Sprint burndown",
|
|
60
|
+
description: "Daily remaining-work readings for a single sprint.",
|
|
61
|
+
group: "Delivery & flow",
|
|
62
|
+
allowedParams: ["sprintId"]
|
|
63
|
+
},
|
|
64
|
+
CUMULATIVE_FLOW: {
|
|
65
|
+
label: "Cumulative flow",
|
|
66
|
+
description: "Work-item counts by status, by day, over a date range.",
|
|
67
|
+
group: "Delivery & flow",
|
|
68
|
+
allowedParams: [
|
|
69
|
+
"projectId",
|
|
70
|
+
"from",
|
|
71
|
+
"to"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
THROUGHPUT: {
|
|
75
|
+
label: "Throughput",
|
|
76
|
+
description: "Items and points completed per week, over a date range.",
|
|
77
|
+
group: "Delivery & flow",
|
|
78
|
+
allowedParams: [
|
|
79
|
+
"projectId",
|
|
80
|
+
"from",
|
|
81
|
+
"to"
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
CYCLE_TIME: {
|
|
85
|
+
label: "Cycle time",
|
|
86
|
+
description: "Average and median hours from in-progress to done, over a date range.",
|
|
87
|
+
group: "Delivery & flow",
|
|
88
|
+
allowedParams: [
|
|
89
|
+
"projectId",
|
|
90
|
+
"from",
|
|
91
|
+
"to"
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
STATUS_FLOW: {
|
|
95
|
+
label: "Status flow",
|
|
96
|
+
description: "Status-to-status transition counts over a date range.",
|
|
97
|
+
group: "Delivery & flow",
|
|
98
|
+
allowedParams: [
|
|
99
|
+
"projectId",
|
|
100
|
+
"from",
|
|
101
|
+
"to"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
DELIVERY_KPIS: {
|
|
105
|
+
label: "Delivery KPIs",
|
|
106
|
+
description: "On-time release and milestone rates over a date range.",
|
|
107
|
+
group: "Delivery & flow",
|
|
108
|
+
allowedParams: [
|
|
109
|
+
"projectId",
|
|
110
|
+
"from",
|
|
111
|
+
"to"
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
QUALITY_METRICS: {
|
|
115
|
+
label: "Quality metrics",
|
|
116
|
+
description: "Bugs opened/resolved, defect ratio and gate pass rate over a date range.",
|
|
117
|
+
group: "Quality",
|
|
118
|
+
allowedParams: [
|
|
119
|
+
"projectId",
|
|
120
|
+
"from",
|
|
121
|
+
"to"
|
|
122
|
+
]
|
|
123
|
+
},
|
|
124
|
+
RISKS: {
|
|
125
|
+
label: "Risks",
|
|
126
|
+
description: "A project's risk register.",
|
|
127
|
+
group: "Quality",
|
|
128
|
+
allowedParams: ["projectId", "limit"]
|
|
129
|
+
},
|
|
130
|
+
BUDGET_VARIANCE: {
|
|
131
|
+
label: "Budget variance",
|
|
132
|
+
description: "A project's budgets, spend vs. total and variance.",
|
|
133
|
+
group: "Budget & time",
|
|
134
|
+
allowedParams: ["projectId", "limit"]
|
|
135
|
+
},
|
|
136
|
+
TIME_BY_PERSON: {
|
|
137
|
+
label: "Time by person",
|
|
138
|
+
description: "Logged hours by person, over a date range.",
|
|
139
|
+
group: "Budget & time",
|
|
140
|
+
allowedParams: [
|
|
141
|
+
"projectId",
|
|
142
|
+
"from",
|
|
143
|
+
"to",
|
|
144
|
+
"limit"
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
TEAM_WORKLOAD: {
|
|
148
|
+
label: "Team workload",
|
|
149
|
+
description: "A team's members and their open item/point counts.",
|
|
150
|
+
group: "Budget & time",
|
|
151
|
+
allowedParams: ["teamId", "limit"]
|
|
152
|
+
}
|
|
153
|
+
}, i = (() => {
|
|
154
|
+
let e = [
|
|
155
|
+
"Projects & work",
|
|
156
|
+
"Delivery & flow",
|
|
157
|
+
"Quality",
|
|
158
|
+
"Budget & time"
|
|
159
|
+
], n = new Map(e.map((e) => [e, []]));
|
|
160
|
+
for (let e of t) {
|
|
161
|
+
let t = r[e].group;
|
|
162
|
+
n.get(t)?.push(e);
|
|
163
|
+
}
|
|
164
|
+
return e.map((e) => ({
|
|
165
|
+
group: e,
|
|
166
|
+
sources: n.get(e) ?? []
|
|
167
|
+
}));
|
|
168
|
+
})();
|
|
169
|
+
function a(e) {
|
|
170
|
+
return t.includes(e);
|
|
171
|
+
}
|
|
172
|
+
var o = {
|
|
173
|
+
projectId: "Project",
|
|
174
|
+
sprintId: "Sprint",
|
|
175
|
+
teamId: "Team",
|
|
176
|
+
from: "From",
|
|
177
|
+
to: "To",
|
|
178
|
+
limit: "Limit"
|
|
179
|
+
};
|
|
180
|
+
function s(e) {
|
|
181
|
+
let t = /* @__PURE__ */ new Map(), n = 0, r = 0, i = 0;
|
|
182
|
+
for (let a of e) {
|
|
183
|
+
let e = Math.min(Math.max(1, Math.round(a.w)), 12), o = Math.max(1, Math.round(a.h));
|
|
184
|
+
n + e > 12 && (n = 0, r += i, i = 0), t.set(a.id, {
|
|
185
|
+
x: n,
|
|
186
|
+
y: r,
|
|
187
|
+
w: e,
|
|
188
|
+
h: o
|
|
189
|
+
}), n += e, i = Math.max(i, o);
|
|
190
|
+
}
|
|
191
|
+
return t;
|
|
192
|
+
}
|
|
193
|
+
function c(e) {
|
|
194
|
+
let t = s(e.map((e) => ({
|
|
195
|
+
id: e.id,
|
|
196
|
+
w: e.layout.w,
|
|
197
|
+
h: e.layout.h
|
|
198
|
+
})));
|
|
199
|
+
return e.map((e) => ({
|
|
200
|
+
...e,
|
|
201
|
+
layout: t.get(e.id) ?? e.layout
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
function l(e) {
|
|
205
|
+
let t = e?.match(/^definition\.widgets\[(\d+)\]/);
|
|
206
|
+
return t ? Number(t[1]) : null;
|
|
207
|
+
}
|
|
208
|
+
function u(t) {
|
|
209
|
+
let i = [];
|
|
210
|
+
if (t.length === 0) return i.push({
|
|
211
|
+
field: "definition.widgets",
|
|
212
|
+
message: "Add at least one widget."
|
|
213
|
+
}), i;
|
|
214
|
+
t.length > 24 && i.push({
|
|
215
|
+
field: "definition.widgets",
|
|
216
|
+
message: `At most 24 widgets are allowed (this report has ${t.length}).`
|
|
217
|
+
});
|
|
218
|
+
let s = /* @__PURE__ */ new Set();
|
|
219
|
+
return t.forEach((t, c) => {
|
|
220
|
+
let l = `definition.widgets[${c}]`;
|
|
221
|
+
if (t.id.trim() ? s.has(t.id) ? i.push({
|
|
222
|
+
field: `${l}.id`,
|
|
223
|
+
message: "Widget ids must be unique."
|
|
224
|
+
}) : s.add(t.id) : i.push({
|
|
225
|
+
field: `${l}.id`,
|
|
226
|
+
message: "Widget is missing an id."
|
|
227
|
+
}), e.includes(t.type) || i.push({
|
|
228
|
+
field: `${l}.type`,
|
|
229
|
+
message: "Choose a widget type."
|
|
230
|
+
}), t.title.trim() || i.push({
|
|
231
|
+
field: `${l}.title`,
|
|
232
|
+
message: "Give this widget a title."
|
|
233
|
+
}), !a(t.source)) i.push({
|
|
234
|
+
field: `${l}.source`,
|
|
235
|
+
message: "Choose a data source."
|
|
236
|
+
});
|
|
237
|
+
else {
|
|
238
|
+
let e = new Set(r[t.source].allowedParams);
|
|
239
|
+
for (let a of n) {
|
|
240
|
+
let n = t.params[a];
|
|
241
|
+
n == null || n === "" || e.has(a) || i.push({
|
|
242
|
+
field: `${l}.params.${a}`,
|
|
243
|
+
message: `${o[a]} isn't used by ${r[t.source].label}.`
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
t.params.limit !== void 0 && t.params.limit !== null && (!Number.isInteger(t.params.limit) || t.params.limit < 1) && i.push({
|
|
247
|
+
field: `${l}.params.limit`,
|
|
248
|
+
message: "Limit must be a whole number of 1 or more."
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
(!Number.isInteger(t.layout.w) || t.layout.w < 1 || t.layout.w > 12) && i.push({
|
|
252
|
+
field: `${l}.layout.w`,
|
|
253
|
+
message: "Width must be between 1 and 12."
|
|
254
|
+
}), (!Number.isInteger(t.layout.h) || t.layout.h < 1) && i.push({
|
|
255
|
+
field: `${l}.layout.h`,
|
|
256
|
+
message: "Height must be 1 or more."
|
|
257
|
+
});
|
|
258
|
+
}), i;
|
|
259
|
+
}
|
|
260
|
+
var d = 0;
|
|
261
|
+
function f() {
|
|
262
|
+
return d += 1, `w${Date.now().toString(36)}${d}${Math.random().toString(36).slice(2, 6)}`;
|
|
263
|
+
}
|
|
264
|
+
function p(e = "WORK_ITEMS") {
|
|
265
|
+
return {
|
|
266
|
+
id: f(),
|
|
267
|
+
type: "TABLE",
|
|
268
|
+
title: r[e].label,
|
|
269
|
+
source: e,
|
|
270
|
+
params: {},
|
|
271
|
+
layout: {
|
|
272
|
+
x: 0,
|
|
273
|
+
y: 0,
|
|
274
|
+
w: 6,
|
|
275
|
+
h: 4
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function m(e) {
|
|
280
|
+
return typeof e == "object" && !!e && !Array.isArray(e);
|
|
281
|
+
}
|
|
282
|
+
function h(e) {
|
|
283
|
+
return typeof e == "string" || typeof e == "number" || typeof e == "boolean";
|
|
284
|
+
}
|
|
285
|
+
function g(e) {
|
|
286
|
+
return Object.entries(e).filter((e) => h(e[1]));
|
|
287
|
+
}
|
|
288
|
+
function _(e) {
|
|
289
|
+
if (Array.isArray(e)) return e.filter(m);
|
|
290
|
+
if (!m(e)) return [];
|
|
291
|
+
for (let t of Object.values(e)) if (Array.isArray(t) && t.every(m)) return t;
|
|
292
|
+
return [e];
|
|
293
|
+
}
|
|
294
|
+
function v(e) {
|
|
295
|
+
let t = e.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/_/g, " ").toLowerCase();
|
|
296
|
+
return t.charAt(0).toUpperCase() + t.slice(1);
|
|
297
|
+
}
|
|
298
|
+
var y = [
|
|
299
|
+
"name",
|
|
300
|
+
"title",
|
|
301
|
+
"label",
|
|
302
|
+
"key",
|
|
303
|
+
"projectName",
|
|
304
|
+
"sprintName",
|
|
305
|
+
"userId",
|
|
306
|
+
"actorId",
|
|
307
|
+
"periodStart",
|
|
308
|
+
"date",
|
|
309
|
+
"fromStatus",
|
|
310
|
+
"status",
|
|
311
|
+
"id"
|
|
312
|
+
];
|
|
313
|
+
function b(e) {
|
|
314
|
+
if (e.length === 0) return null;
|
|
315
|
+
let t = new Set(e.flatMap((e) => g(e).map(([e]) => e)));
|
|
316
|
+
for (let e of y) if (t.has(e)) return e;
|
|
317
|
+
return [...t].find((t) => typeof e[0]?.[t] == "string") ?? null;
|
|
318
|
+
}
|
|
319
|
+
function x(e, t) {
|
|
320
|
+
let n = /* @__PURE__ */ new Map(), r = [];
|
|
321
|
+
for (let i of e) for (let [e, a] of g(i)) e === t || typeof a != "number" || (n.has(e) || r.push(e), n.set(e, (n.get(e) ?? 0) + 1));
|
|
322
|
+
let i = Math.max(1, Math.ceil(e.length / 2));
|
|
323
|
+
return r.filter((e) => (n.get(e) ?? 0) >= i);
|
|
324
|
+
}
|
|
325
|
+
//#endregion
|
|
326
|
+
export { o as PARAM_LABELS, r as REPORT_SOURCE_SPECS, i as SOURCE_GROUPS, e as WIDGET_TYPES, p as blankWidget, _ as extractRows, v as humanizeKey, f as newWidgetId, b as pickLabelField, x as pickNumericFields, c as repackWidgets, g as scalarFields, u as validateReportDraft, l as widgetIndexFromField };
|
|
327
|
+
|
|
328
|
+
//# sourceMappingURL=reportModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportModel.js","names":[],"sources":["../../../src/planmagnet/reports/reportModel.ts"],"sourcesContent":["/**\n * Reports (ANR-13/14/15/16, BOFF-8048 follow-on): shared types, source metadata and pure helpers for the report\n * builder + viewer. Mirrors the server's own source-of-truth so the UI never drifts from what actually runs:\n *\n * - `REPORT_SOURCE_SPECS` mirrors wspace-planmagnet-svc's `report-sources.ts` (`REPORT_SOURCE_SPECS`) — the\n * per-source allowed param keys. A param a source doesn't use is rejected at save time by the server with a\n * field-scoped BAD_USER_INPUT; this file's `allowedParams` lets the builder never offer that param in the\n * first place, and `validateWidgetDraft` catches it before the round trip.\n * - `packLayout` decides where each widget sits on the 12-column grid from its position in the widgets array\n * (the builder's reorder controls) and its own `w`/`h` — a left-to-right, wrap-on-overflow shelf pack, the\n * same algorithm CSS flex-wrap performs visually (see `ReportGridCanvas.tsx`), so the preview and the\n * persisted `layout` never disagree. There is no free-form drag-to-position: only reorder (where) and\n * resize (how big) are exposed, so every layout this UI can produce is representable and always passes the\n * server's bounds check (`x >= 0`, `y >= 0`, `w >= 1`, `h >= 1`, `x + w <= 12`).\n * - `validateReportDraft` mirrors wspace-planmagnet-svc's `report-definition.ts` (`assertReportDefinition`)\n * closely enough that a draft which passes it also passes the server — widget count (1..24), unique ids,\n * required type/title/source, and params restricted to the ones the widget's source actually reads. Field\n * paths match the server's own (`definition.widgets[i].…`) so a BAD_USER_INPUT that slips past client\n * validation (e.g. a rule this file doesn't yet know) still maps back to the right widget via\n * `widgetIndexFromField`.\n */\n\nexport const GRID_COLUMNS = 12;\nexport const MAX_WIDGETS = 24;\n\nexport const WIDGET_TYPES = ['KPI', 'CHART', 'TABLE', 'TEXT'] as const;\nexport type WidgetType = (typeof WIDGET_TYPES)[number];\n\nexport const REPORT_SOURCES = [\n 'PROJECT_STATUS',\n 'VELOCITY',\n 'BURNDOWN',\n 'CUMULATIVE_FLOW',\n 'CYCLE_TIME',\n 'THROUGHPUT',\n 'QUALITY_METRICS',\n 'DELIVERY_KPIS',\n 'BUDGET_VARIANCE',\n 'TIME_BY_PERSON',\n 'STATUS_FLOW',\n 'WORK_BREAKDOWN',\n 'TEAM_WORKLOAD',\n 'RISKS',\n 'WORK_ITEMS',\n] as const;\nexport type ReportSource = (typeof REPORT_SOURCES)[number];\n\nexport type WidgetParamKey = 'projectId' | 'sprintId' | 'teamId' | 'from' | 'to' | 'limit';\nconst ALL_PARAM_KEYS: readonly WidgetParamKey[] = [\n 'projectId',\n 'sprintId',\n 'teamId',\n 'from',\n 'to',\n 'limit',\n];\n\nexport interface SourceSpec {\n label: string;\n description: string;\n group: string;\n allowedParams: readonly WidgetParamKey[];\n}\n\n/** 1:1 with wspace-planmagnet-svc's REPORT_SOURCE_SPECS — see this file's header. */\nexport const REPORT_SOURCE_SPECS: Record<ReportSource, SourceSpec> = {\n PROJECT_STATUS: {\n label: 'Project status',\n description: \"A project's key, name, status and methodology.\",\n group: 'Projects & work',\n allowedParams: ['projectId'],\n },\n WORK_ITEMS: {\n label: 'Work items',\n description: 'A list of work items, optionally scoped to a project or sprint.',\n group: 'Projects & work',\n allowedParams: ['projectId', 'sprintId', 'limit'],\n },\n WORK_BREAKDOWN: {\n label: 'Work breakdown',\n description: 'Open vs. done items and points, by epic, for one or every project.',\n group: 'Projects & work',\n allowedParams: ['projectId'],\n },\n VELOCITY: {\n label: 'Sprint velocity',\n description:\n \"A project's completed points per sprint, trailing sprints, with a next-sprint forecast.\",\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'limit'],\n },\n BURNDOWN: {\n label: 'Sprint burndown',\n description: 'Daily remaining-work readings for a single sprint.',\n group: 'Delivery & flow',\n allowedParams: ['sprintId'],\n },\n CUMULATIVE_FLOW: {\n label: 'Cumulative flow',\n description: 'Work-item counts by status, by day, over a date range.',\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'from', 'to'],\n },\n THROUGHPUT: {\n label: 'Throughput',\n description: 'Items and points completed per week, over a date range.',\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'from', 'to'],\n },\n CYCLE_TIME: {\n label: 'Cycle time',\n description: 'Average and median hours from in-progress to done, over a date range.',\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'from', 'to'],\n },\n STATUS_FLOW: {\n label: 'Status flow',\n description: 'Status-to-status transition counts over a date range.',\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'from', 'to'],\n },\n DELIVERY_KPIS: {\n label: 'Delivery KPIs',\n description: 'On-time release and milestone rates over a date range.',\n group: 'Delivery & flow',\n allowedParams: ['projectId', 'from', 'to'],\n },\n QUALITY_METRICS: {\n label: 'Quality metrics',\n description: 'Bugs opened/resolved, defect ratio and gate pass rate over a date range.',\n group: 'Quality',\n allowedParams: ['projectId', 'from', 'to'],\n },\n RISKS: {\n label: 'Risks',\n description: \"A project's risk register.\",\n group: 'Quality',\n allowedParams: ['projectId', 'limit'],\n },\n BUDGET_VARIANCE: {\n label: 'Budget variance',\n description: \"A project's budgets, spend vs. total and variance.\",\n group: 'Budget & time',\n allowedParams: ['projectId', 'limit'],\n },\n TIME_BY_PERSON: {\n label: 'Time by person',\n description: 'Logged hours by person, over a date range.',\n group: 'Budget & time',\n allowedParams: ['projectId', 'from', 'to', 'limit'],\n },\n TEAM_WORKLOAD: {\n label: 'Team workload',\n description: \"A team's members and their open item/point counts.\",\n group: 'Budget & time',\n allowedParams: ['teamId', 'limit'],\n },\n};\n\n/** Sources grouped for the \"Add widget\" dialog, in a fixed, reviewed order (not alphabetical / enum order). */\nexport const SOURCE_GROUPS: { group: string; sources: ReportSource[] }[] = (() => {\n const order = ['Projects & work', 'Delivery & flow', 'Quality', 'Budget & time'];\n const groups = new Map<string, ReportSource[]>(order.map((g) => [g, []]));\n for (const source of REPORT_SOURCES) {\n const group = REPORT_SOURCE_SPECS[source].group;\n groups.get(group)?.push(source);\n }\n return order.map((group) => ({ group, sources: groups.get(group) ?? [] }));\n})();\n\nexport function isReportSource(value: string): value is ReportSource {\n return (REPORT_SOURCES as readonly string[]).includes(value);\n}\n\nexport const PARAM_LABELS: Record<WidgetParamKey, string> = {\n projectId: 'Project',\n sprintId: 'Sprint',\n teamId: 'Team',\n from: 'From',\n to: 'To',\n limit: 'Limit',\n};\n\n// ─── Wire types (match graphql/wspace.graphql's Planmagnet* Report types exactly) ────────────────────────────\n\nexport interface WidgetLayout {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface WidgetParams {\n projectId?: string | null;\n sprintId?: string | null;\n teamId?: string | null;\n from?: string | null;\n to?: string | null;\n limit?: number | null;\n}\n\nexport interface ReportWidget {\n id: string;\n type: WidgetType;\n title: string;\n source: ReportSource;\n params: WidgetParams;\n layout: WidgetLayout;\n}\n\nexport interface ReportDefinition {\n widgets: ReportWidget[];\n}\n\nexport type ReportVisibility = 'PRIVATE' | 'WORKSPACE';\n\nexport interface ReportSummary {\n id: string;\n name: string;\n description: string | null;\n ownerId: string;\n visibility: ReportVisibility;\n templateKey: string | null;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ReportRecord extends ReportSummary {\n definition: ReportDefinition;\n}\n\nexport interface ReportTemplate {\n key: string;\n name: string;\n description: string;\n definition: ReportDefinition;\n}\n\nexport type WidgetRunStatus = 'OK' | 'FORBIDDEN' | 'ERROR';\n\nexport interface WidgetRunResult {\n widgetId: string;\n source: ReportSource;\n status: WidgetRunStatus;\n message: string | null;\n result: unknown;\n}\n\nexport type ReportRunTrigger = 'MANUAL' | 'SCHEDULE';\nexport type ReportDeliveryStatus = 'PENDING_NOTIFICATIONS';\n\nexport interface ReportRun {\n id: string;\n reportId: string;\n workspaceId: string;\n trigger: ReportRunTrigger;\n generatedAt: string;\n generatedBy: string;\n deliveryStatus: ReportDeliveryStatus | null;\n widgets: WidgetRunResult[];\n}\n\nexport type ReportScheduleCadence = 'DAILY' | 'WEEKLY' | 'MONTHLY';\nexport type ReportExportFormat = 'CSV' | 'JSON' | 'XML';\n\nexport interface ReportSchedule {\n id: string;\n reportId: string;\n workspaceId: string;\n active: boolean;\n cadence: ReportScheduleCadence;\n hourUtc: number;\n dayOfWeek: number | null;\n dayOfMonth: number | null;\n format: ReportExportFormat;\n recipientIds: string[];\n nextRunAt: string;\n lastRunAt: string | null;\n lastRunId: string | null;\n lastError: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ReportShare {\n id: string;\n reportId: string;\n workspaceId: string;\n createdBy: string;\n createdAt: string;\n expiresAt: string;\n revokedAt: string | null;\n hasPassword: boolean;\n watermark: string;\n accessCount: number;\n lastAccessedAt: string | null;\n runId: string;\n /** Only set on the response of the create mutation — never stored, never returned again. */\n token?: string | null;\n}\n\nexport interface SharedReport {\n reportName: string;\n generatedAt: string;\n watermark: string;\n widgets: WidgetRunResult[];\n}\n\n// ─── Layout packing ───────────────────────────────────────────────────────────────────────────────────────\n\n/**\n * Left-to-right, wrap-on-overflow shelf pack over the 12-column grid, in array order. The same rule CSS\n * flex-wrap renders visually (`ReportGridCanvas.tsx` uses `width: w/12 * 100%` on flex-wrap children), so the\n * on-screen order always matches the persisted `layout`. Every widget's `w` is clamped to at most\n * `GRID_COLUMNS` first, so a corrupt/legacy value can never produce an unsatisfiable layout.\n */\nexport function packLayout<T extends { id: string; w: number; h: number }>(\n widgets: readonly T[]\n): Map<string, WidgetLayout> {\n const layouts = new Map<string, WidgetLayout>();\n let x = 0;\n let y = 0;\n let rowHeight = 0;\n for (const widget of widgets) {\n const w = Math.min(Math.max(1, Math.round(widget.w)), GRID_COLUMNS);\n const h = Math.max(1, Math.round(widget.h));\n if (x + w > GRID_COLUMNS) {\n x = 0;\n y += rowHeight;\n rowHeight = 0;\n }\n layouts.set(widget.id, { x, y, w, h });\n x += w;\n rowHeight = Math.max(rowHeight, h);\n }\n return layouts;\n}\n\n/** Re-derives every widget's `layout` from its position in `widgets` (order = reading/visual order) and its\n * own `w`/`h`, discarding whatever `x`/`y` it already carried — those are a rendering consequence, not\n * independent state, once only reorder+resize (not free placement) are exposed. */\nexport function repackWidgets(widgets: ReportWidget[]): ReportWidget[] {\n const layouts = packLayout(widgets.map((w) => ({ id: w.id, w: w.layout.w, h: w.layout.h })));\n return widgets.map((w) => ({ ...w, layout: layouts.get(w.id) ?? w.layout }));\n}\n\n// ─── Validation (mirrors report-definition.ts's assertReportDefinition) ──────────────────────────────────────\n\nexport interface FieldError {\n /** e.g. \"definition.widgets[2].params.projectId\" — matches the server's own `extensions.field`. */\n field: string;\n message: string;\n}\n\n/** The widget index a server or client field-scoped error refers to, or null for a report-level field\n * (name/description/visibility) or one this pattern doesn't recognize. */\nexport function widgetIndexFromField(field: string | undefined | null): number | null {\n const match = field?.match(/^definition\\.widgets\\[(\\d+)\\]/);\n return match ? Number(match[1]) : null;\n}\n\nexport function validateReportDraft(widgets: ReportWidget[]): FieldError[] {\n const errors: FieldError[] = [];\n if (widgets.length === 0) {\n errors.push({ field: 'definition.widgets', message: 'Add at least one widget.' });\n return errors;\n }\n if (widgets.length > MAX_WIDGETS) {\n errors.push({\n field: 'definition.widgets',\n message: `At most ${MAX_WIDGETS} widgets are allowed (this report has ${widgets.length}).`,\n });\n }\n const seenIds = new Set<string>();\n widgets.forEach((widget, index) => {\n const field = `definition.widgets[${index}]`;\n if (!widget.id.trim()) {\n errors.push({ field: `${field}.id`, message: 'Widget is missing an id.' });\n } else if (seenIds.has(widget.id)) {\n errors.push({ field: `${field}.id`, message: 'Widget ids must be unique.' });\n } else {\n seenIds.add(widget.id);\n }\n if (!WIDGET_TYPES.includes(widget.type)) {\n errors.push({ field: `${field}.type`, message: 'Choose a widget type.' });\n }\n if (!widget.title.trim()) {\n errors.push({ field: `${field}.title`, message: 'Give this widget a title.' });\n }\n if (!isReportSource(widget.source)) {\n errors.push({ field: `${field}.source`, message: 'Choose a data source.' });\n } else {\n const allowed = new Set<string>(REPORT_SOURCE_SPECS[widget.source].allowedParams);\n for (const key of ALL_PARAM_KEYS) {\n const value = widget.params[key];\n if (value === undefined || value === null || value === '') continue;\n if (!allowed.has(key)) {\n errors.push({\n field: `${field}.params.${key}`,\n message: `${PARAM_LABELS[key]} isn't used by ${REPORT_SOURCE_SPECS[widget.source].label}.`,\n });\n }\n }\n if (widget.params.limit !== undefined && widget.params.limit !== null) {\n if (!Number.isInteger(widget.params.limit) || widget.params.limit < 1) {\n errors.push({\n field: `${field}.params.limit`,\n message: 'Limit must be a whole number of 1 or more.',\n });\n }\n }\n }\n if (\n !Number.isInteger(widget.layout.w) ||\n widget.layout.w < 1 ||\n widget.layout.w > GRID_COLUMNS\n ) {\n errors.push({\n field: `${field}.layout.w`,\n message: `Width must be between 1 and ${GRID_COLUMNS}.`,\n });\n }\n if (!Number.isInteger(widget.layout.h) || widget.layout.h < 1) {\n errors.push({ field: `${field}.layout.h`, message: 'Height must be 1 or more.' });\n }\n });\n return errors;\n}\n\nlet idCounter = 0;\n/** A widget id unique within this browser session — the server only requires uniqueness within one report, but\n * a monotonic counter plus a random suffix means two widgets added in the same millisecond never collide. */\nexport function newWidgetId(): string {\n idCounter += 1;\n return `w${Date.now().toString(36)}${idCounter}${Math.random().toString(36).slice(2, 6)}`;\n}\n\nexport function blankWidget(source: ReportSource = 'WORK_ITEMS'): ReportWidget {\n return {\n id: newWidgetId(),\n type: 'TABLE',\n title: REPORT_SOURCE_SPECS[source].label,\n source,\n params: {},\n layout: { x: 0, y: 0, w: 6, h: 4 },\n };\n}\n\n// ─── Generic result shaping (for the widget renderer) ─────────────────────────────────────────────────────────\n\nexport type Row = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is Row {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\n/** Only this widget's own primitive fields — never a nested array/object, so a table/KPI never tries to render\n * `children`/`context`/etc. as a cell value. */\nexport function scalarFields(row: Row): [string, string | number | boolean][] {\n return Object.entries(row).filter((entry): entry is [string, string | number | boolean] =>\n isScalar(entry[1])\n );\n}\n\n/**\n * Finds the rows a CHART/TABLE widget should render from an arbitrary result: the result itself when it is\n * already an array of objects, otherwise the first array-valued property of an object result (covers every\n * executor in report-run.service.ts: `sprints`, `points`, `items`, `projects`, or a bare array), otherwise a\n * single-row table of the object's own scalar fields (PROJECT_STATUS, DELIVERY_KPIS, QUALITY_METRICS,\n * CYCLE_TIME's own summary fields).\n */\nexport function extractRows(result: unknown): Row[] {\n if (Array.isArray(result)) return result.filter(isPlainObject);\n if (!isPlainObject(result)) return [];\n for (const value of Object.values(result)) {\n if (Array.isArray(value) && value.every(isPlainObject)) return value as Row[];\n }\n return [result];\n}\n\n/** camelCase/SCREAMING_SNAKE -> \"Camel Case\" / \"Screaming Snake\", for a generic field-name label. */\nexport function humanizeKey(key: string): string {\n const spaced = key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .toLowerCase();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nconst LABEL_KEY_PRIORITY = [\n 'name',\n 'title',\n 'label',\n 'key',\n 'projectName',\n 'sprintName',\n 'userId',\n 'actorId',\n 'periodStart',\n 'date',\n 'fromStatus',\n 'status',\n 'id',\n];\n\n/** The best field to use as a chart's category axis / a row's display label, preferring identity-ish fields. */\nexport function pickLabelField(rows: Row[]): string | null {\n if (rows.length === 0) return null;\n const keys = new Set(rows.flatMap((row) => scalarFields(row).map(([k]) => k)));\n for (const candidate of LABEL_KEY_PRIORITY) {\n if (keys.has(candidate)) return candidate;\n }\n const firstString = [...keys].find((k) => typeof rows[0]?.[k] === 'string');\n return firstString ?? null;\n}\n\n/** Numeric fields present on (almost) every row, in first-seen order, excluding the label field. */\nexport function pickNumericFields(rows: Row[], excludeKey: string | null): string[] {\n const counts = new Map<string, number>();\n const order: string[] = [];\n for (const row of rows) {\n for (const [key, value] of scalarFields(row)) {\n if (key === excludeKey || typeof value !== 'number') continue;\n if (!counts.has(key)) order.push(key);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n const threshold = Math.max(1, Math.ceil(rows.length / 2));\n return order.filter((key) => (counts.get(key) ?? 0) >= threshold);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public shared-report route (ANR-17). Unlike every other route constant in this package
|
|
3
|
+
* (`product/routes.ts`, `integrations/routes.ts`), this one is NOT relative to this MFE's `basePath` — the host
|
|
4
|
+
* shell mounts `SharedReportPage` on its own top-level router, OUTSIDE the authenticated app shell/basePath
|
|
5
|
+
* tree entirely (no nav chrome, no auth guard), so the path is absolute and fixed. It lives under `/public/`
|
|
6
|
+
* because fe-libs' shell-route table gives every `/public/*` path the public layout — the product header and
|
|
7
|
+
* footer, but no sidebar or breadcrumb — so an anonymous reader never sees the signed-in navigation and no host
|
|
8
|
+
* needs its own exception.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SHARED_REPORT_BASE_PATH = "/public/report";
|
|
11
|
+
/** For the host's own `<Route path={SHARED_REPORT_ROUTE_PATH} element={<SharedReportPage />} />`. */
|
|
12
|
+
export declare const SHARED_REPORT_ROUTE_PATH = "/public/report/:token";
|
|
13
|
+
/** The full, copyable link for a share token, from the current origin. */
|
|
14
|
+
export declare function sharedReportLink(token: string): string;
|
|
15
|
+
//# sourceMappingURL=sharedReportRoute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedReportRoute.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/reports/sharedReportRoute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,mBAAmB,CAAC;AACxD,qGAAqG;AACrG,eAAO,MAAM,wBAAwB,0BAAsC,CAAC;AAE5E,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/planmagnet/reports/sharedReportRoute.ts
|
|
2
|
+
var e = "/public/report", t = `${e}/:token`;
|
|
3
|
+
function n(t) {
|
|
4
|
+
return `${typeof window < "u" ? window.location.origin : ""}${e}/${encodeURIComponent(t)}`;
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { e as SHARED_REPORT_BASE_PATH, t as SHARED_REPORT_ROUTE_PATH, n as sharedReportLink };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=sharedReportRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedReportRoute.js","names":[],"sources":["../../../src/planmagnet/reports/sharedReportRoute.ts"],"sourcesContent":["/**\n * The public shared-report route (ANR-17). Unlike every other route constant in this package\n * (`product/routes.ts`, `integrations/routes.ts`), this one is NOT relative to this MFE's `basePath` — the host\n * shell mounts `SharedReportPage` on its own top-level router, OUTSIDE the authenticated app shell/basePath\n * tree entirely (no nav chrome, no auth guard), so the path is absolute and fixed. It lives under `/public/`\n * because fe-libs' shell-route table gives every `/public/*` path the public layout — the product header and\n * footer, but no sidebar or breadcrumb — so an anonymous reader never sees the signed-in navigation and no host\n * needs its own exception.\n */\nexport const SHARED_REPORT_BASE_PATH = '/public/report';\n/** For the host's own `<Route path={SHARED_REPORT_ROUTE_PATH} element={<SharedReportPage />} />`. */\nexport const SHARED_REPORT_ROUTE_PATH = `${SHARED_REPORT_BASE_PATH}/:token`;\n\n/** The full, copyable link for a share token, from the current origin. */\nexport function sharedReportLink(token: string): string {\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n return `${origin}${SHARED_REPORT_BASE_PATH}/${encodeURIComponent(token)}`;\n}\n"],"mappings":";AASA,IAAa,IAA0B,kBAE1B,IAA2B,GAAG,EAAwB;AAGnE,SAAgB,EAAiB,GAAuB;AAEtD,QAAO,GADQ,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS,KACrD,EAAwB,GAAG,mBAAmB,EAAM"}
|