From 109053e3af0f8239c2353b512686e614fae9cc86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Fri, 28 Aug 2026 16:21:34 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=B4=D0=B8=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20CT,=20KPS,=20OID=20=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=B0=D1=88=D0=B1=D0=BE=D1=80=D0=B4=D0=B0=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перенос, декомпозиция и перекраска форм CT/KPS/OID на @tnsu/ui-kit, config-driven дашборд-реестр по трём типам документов. Из отслеживания исключены артефакты сборки (lib-commonjs/jest-output/release) — забыты в .gitignore ранее. --- .gitignore | 3 + docs/CT-PORT.md | 174 + docs/OID-PORT.md | 164 + docs/REPAINT-MAP.md | 126 + jest-output/JUnit.xml | 3 - jest-output/coverage/base.css | 224 - jest-output/coverage/block-navigation.js | 87 - .../coverage/cobertura/cobertura-coverage.xml | 9 - jest-output/coverage/coverage-summary.json | 2 - jest-output/coverage/favicon.png | Bin 445 -> 0 bytes jest-output/coverage/index.html | 101 - jest-output/coverage/prettify.css | 1 - jest-output/coverage/prettify.js | 2 - jest-output/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes jest-output/coverage/sorter.js | 210 - .../ctFormsPortal/CtFormsPortalWebPart.js | 107 - .../ctFormsPortal/CtFormsPortalWebPart.js.map | 1 - .../CtFormsPortalWebPart.manifest.json | 29 - .../ctFormsPortal/assets/welcome-dark.png | Bin 12545 -> 0 bytes .../ctFormsPortal/assets/welcome-light.png | Bin 12816 -> 0 bytes .../ctFormsPortal/components/CtFormsPortal.js | 15 - .../components/CtFormsPortal.js.map | 1 - .../components/CtFormsPortal.module.scss.css | 11 - .../ctFormsPortal/components/Dashboard.js | 106 - .../ctFormsPortal/components/Dashboard.js.map | 1 - .../components/Dashboard.module.scss.css | 54 - .../components/ICtFormsPortalProps.js | 3 - .../components/ICtFormsPortalProps.js.map | 1 - .../components/config/ctDocumentConfig.js | 79 - .../components/config/ctDocumentConfig.js.map | 1 - .../ctFormsPortal/components/config/index.js | 13 - .../components/config/index.js.map | 1 - .../components/config/kpsDocumentConfig.js | 80 - .../config/kpsDocumentConfig.js.map | 1 - .../ctFormsPortal/components/config/mock.js | 21 - .../components/config/mock.js.map | 1 - .../components/config/oidDocumentConfig.js | 85 - .../config/oidDocumentConfig.js.map | 1 - .../ctFormsPortal/components/config/types.js | 3 - .../components/config/types.js.map | 1 - .../components/registry/documentRegistry.js | 3 - .../registry/documentRegistry.js.map | 1 - .../components/registry/documentsService.js | 175 - .../registry/documentsService.js.map | 1 - .../registry/useDocumentDashboard.js | 39 - .../registry/useDocumentDashboard.js.map | 1 - .../webparts/ctFormsPortal/loc/en-us.js | 16 - package-lock.json | 8 +- package.json | 2 +- release/analysis-logs/lint.sarif | 742 -- .../CtFormsPortalWebPartStrings_en-us.js | 16 - ..._en-us_3bd812ceda191f7235a1db0c41d7c3a7.js | 16 - ...eb-part.8bc87a793f5dc3d11d32.hot-update.js | 102 - ...art.8bc87a793f5dc3d11d32.hot-update.js.map | 1 - ...-part.8bc87a793f5dc3d11d32.hot-update.json | 1 - ...eb-part.c0c82c263a05c3417a10.hot-update.js | 108 - ...art.c0c82c263a05c3417a10.hot-update.js.map | 1 - ...-part.c0c82c263a05c3417a10.hot-update.json | 1 - release/assets/ct-forms-portal-web-part.js | 8855 ----------------- .../assets/ct-forms-portal-web-part.js.map | 1 - ...ms-portal-web-part_2f6a9483dc5b6d2f18a1.js | 5 - ...b-part_2f6a9483dc5b6d2f18a1.js.LICENSE.txt | 27 - .../ct-forms-portal.json | 237 - ...-954c-469e-b707-ca75d808603f.manifest.json | 80 - src/styles/_design-tokens.scss | 162 + .../components/CtFormsPortal.module.scss | 5 + .../components/CtFormsPortal.tsx | 100 +- .../ctFormsPortal/components/Dashboard.tsx | 16 +- .../components/config/ctDocumentConfig.ts | 10 +- .../components/config/kpsDocumentConfig.ts | 26 +- .../components/config/oidDocumentConfig.ts | 10 +- .../components/registry/documentRegistry.ts | 6 +- .../Breadcrumbs/Breadcrumbs.module.scss | 27 + .../ct/components/Breadcrumbs/Breadcrumbs.tsx | 72 + .../ct/components/CtCreateForm.module.scss | 44 + .../forms/ct/components/CtCreateForm.tsx | 267 + .../forms/ct/components/ICtCreateFormProps.ts | 9 + .../RequestsTable.module.scss | 166 + .../Step1PositionSelection/RequestsTable.tsx | 179 + .../Step1PositionSelection.module.scss | 76 + .../Step1PositionSelection.tsx | 287 + .../CurrencyRatesForm.module.scss | 102 + .../CurrencyRatesForm.tsx | 175 + .../FileUploadArea.module.scss | 186 + .../Step2CommercialOffers/FileUploadArea.tsx | 143 + .../Step2CommercialOffers.module.scss | 184 + .../Step2CommercialOffers.tsx | 131 + .../SuppliersWithoutKp.tsx | 72 + .../Step2CommercialOffers/UploadedKpList.tsx | 40 + .../Step2CommercialOffers/kpTypes.ts | 33 + .../Step2CommercialOffers/step2Persist.ts | 148 + .../Step2CommercialOffers/useKpProcessing.ts | 252 + .../Step3ComparisonTable/AddExtraRow.tsx | 78 + .../Step3ComparisonTable/AiCommentBlock.tsx | 43 + .../Step3ComparisonTable/ComparisonMatrix.tsx | 230 + .../Step3ComparisonTable/CriteriaTable.tsx | 141 + .../Step3ComparisonTable/ExtraPositionRow.tsx | 218 + .../InlineApprovalChain.tsx | 169 + .../Step3ComparisonTable/MatrixRowView.tsx | 240 + .../Step3ComparisonTable.module.scss | 1109 +++ .../Step3ComparisonTable.tsx | 207 + .../Step3ComparisonTable/matrixHelpers.ts | 75 + .../Step3ComparisonTable/matrixTypes.ts | 41 + .../Step3ComparisonTable/useAiComment.ts | 110 + .../Step3ComparisonTable/useStep3Approval.ts | 221 + .../Step3ComparisonTable/useStep3Matrix.ts | 860 ++ .../Step4Approval/Step4Approval.module.scss | 267 + .../Step4Approval/Step4Approval.tsx | 384 + .../Step4Approval/useStep4Approval.ts | 423 + .../forms/ct/components/common/_theme.scss | 35 + .../forms/ct/components/hooks/useCtForm.ts | 176 + .../forms/ct/components/hooks/useRequests.ts | 55 + .../forms/ct/components/types/domain.ts | 147 + .../ct/components/utils/unitConversion.ts | 75 + .../forms/ct/services/CtService.ts | 1535 +++ .../Breadcrumbs/Breadcrumbs.module.scss | 12 + .../components/Breadcrumbs/Breadcrumbs.tsx | 30 + .../forms/kps/components/IKpsCtFormProps.ts | 11 + .../kps/components/KpsCtForm.module.scss | 39 + .../forms/kps/components/KpsCtForm.tsx | 210 + .../Step1SelectPositions/RequestLines.tsx | 46 + .../Step1SelectPositions/RequestRow.tsx | 87 + .../Step1ReadOnlyView.tsx | 146 + .../Step1SelectPositions.module.scss | 148 + .../Step1SelectPositions.tsx | 175 + .../Step1SelectPositions/useStep1Selection.ts | 135 + .../Step2LoadKp/CurrencyRatesForm.module.scss | 93 + .../Step2LoadKp/CurrencyRatesForm.tsx | 171 + .../Step2LoadKp/KpFileList.module.scss | 94 + .../kps/components/Step2LoadKp/KpFileList.tsx | 87 + .../Step2LoadKp/Step2LoadKp.module.scss | 221 + .../components/Step2LoadKp/Step2LoadKp.tsx | 178 + .../Step2LoadKp/SuppliersWithoutKp.tsx | 71 + .../Step2LoadKp/UploadedKpList.module.scss | 52 + .../components/Step2LoadKp/UploadedKpList.tsx | 39 + .../kps/components/Step2LoadKp/kpOffers.ts | 132 + .../kps/components/Step2LoadKp/kpPipeline.ts | 119 + .../kps/components/Step2LoadKp/kpTypes.ts | 30 + .../components/Step2LoadKp/step2Persist.ts | 69 + .../components/Step2LoadKp/useKpProcessing.ts | 109 + .../components/Step3BuildCt/AddExtraRow.tsx | 83 + .../Step3BuildCt/AiCommentBlock.tsx | 79 + .../Step3BuildCt/ComparisonMatrix.tsx | 140 + .../Step3BuildCt/CriteriaTable.module.scss | 118 + .../components/Step3BuildCt/CriteriaTable.tsx | 101 + .../components/Step3BuildCt/MatrixRowView.tsx | 68 + .../components/Step3BuildCt/OfferCells.tsx | 135 + .../Step3BuildCt/Step3BuildCt.module.scss | 599 ++ .../components/Step3BuildCt/Step3BuildCt.tsx | 169 + .../components/Step3BuildCt/step3Persist.ts | 153 + .../components/Step3BuildCt/useAiComment.ts | 127 + .../components/Step3BuildCt/useStep3Matrix.ts | 294 + .../Step4Approval/InlineApprovalChain.tsx | 94 + .../Step4Approval/Step4Approval.module.scss | 151 + .../Step4Approval/Step4Approval.tsx | 191 + .../Step4Approval/useStep4Approval.ts | 396 + .../common/ApprovalChain.module.scss | 71 + .../kps/components/common/ApprovalChain.tsx | 39 + .../kps/components/common/FormHeader.tsx | 16 + .../forms/kps/components/common/Pill.tsx | 23 + .../components/common/StepShell.module.scss | 29 + .../forms/kps/components/common/StepShell.tsx | 33 + .../forms/kps/components/common/_theme.scss | 34 + .../kps/components/hooks/useKpsCtForm.ts | 113 + .../hooks/usePurchaseRequestDetails.ts | 54 + .../forms/kps/components/hooks/useRequests.ts | 43 + .../forms/kps/components/types/domain.ts | 313 + .../forms/kps/components/utils/format.ts | 49 + .../forms/kps/components/utils/session.ts | 59 + .../forms/kps/services/KpsCtFormService.ts | 1337 +++ .../Breadcrumbs/Breadcrumbs.module.scss | 27 + .../components/Breadcrumbs/Breadcrumbs.tsx | 68 + .../oid/components/IOidCreateFormProps.ts | 8 + .../oid/components/OidCreateForm.module.scss | 56 + .../forms/oid/components/OidCreateForm.tsx | 125 + .../components/Step1WorksInput/ComboField.tsx | 100 + .../Step1WorksInput.module.scss | 208 + .../Step1WorksInput/Step1WorksInput.tsx | 185 + .../Step1WorksInput/useStep1WorksInput.ts | 449 + .../AddNoOfferDialog.tsx | 43 + .../FileUploadArea.module.scss | 186 + .../Step2CommercialOffers/FileUploadArea.tsx | 167 + .../Step2CommercialOffers.module.scss | 159 + .../Step2CommercialOffers.tsx | 146 + .../Step2CommercialOffers/SupplierList.tsx | 42 + .../Step2CommercialOffers/UploadedKpList.tsx | 44 + .../Step2CommercialOffers/step2Persist.ts | 54 + .../Step2CommercialOffers/useKpProcessing.ts | 248 + .../Step3ComparisonTable/AddExtraRow.tsx | 73 + .../Step3ComparisonTable/AiCommentBlock.tsx | 24 + .../Step3ComparisonTable/ComparisonMatrix.tsx | 228 + .../Step3ComparisonTable/CriteriaTable.tsx | 125 + .../Step3ComparisonTable/ExtraPositionRow.tsx | 123 + .../InlineApprovalChain.tsx | 201 + .../Step3ComparisonTable/MatrixRowView.tsx | 258 + .../Step3ComparisonTable.module.scss | 1056 ++ .../Step3ComparisonTable.tsx | 138 + .../Step3ComparisonTable/matrixHelpers.ts | 35 + .../Step3ComparisonTable/matrixTypes.ts | 44 + .../Step3ComparisonTable/useAiComment.ts | 75 + .../Step3ComparisonTable/useStep3Approval.ts | 251 + .../Step3ComparisonTable/useStep3Matrix.ts | 1186 +++ .../Step4Approval/Step4Approval.module.scss | 253 + .../Step4Approval/Step4Approval.tsx | 375 + .../Step4Approval/useStep4Approval.ts | 478 + .../forms/oid/components/common/_theme.scss | 35 + .../forms/oid/components/hooks/useOidForm.ts | 299 + .../forms/oid/components/types/domain.ts | 156 + .../forms/oid/services/OidService.ts | 1470 +++ tsconfig.json | 5 +- 210 files changed, 27016 insertions(+), 11730 deletions(-) create mode 100644 docs/CT-PORT.md create mode 100644 docs/OID-PORT.md create mode 100644 docs/REPAINT-MAP.md delete mode 100644 jest-output/JUnit.xml delete mode 100644 jest-output/coverage/base.css delete mode 100644 jest-output/coverage/block-navigation.js delete mode 100644 jest-output/coverage/cobertura/cobertura-coverage.xml delete mode 100644 jest-output/coverage/coverage-summary.json delete mode 100644 jest-output/coverage/favicon.png delete mode 100644 jest-output/coverage/index.html delete mode 100644 jest-output/coverage/prettify.css delete mode 100644 jest-output/coverage/prettify.js delete mode 100644 jest-output/coverage/sort-arrow-sprite.png delete mode 100644 jest-output/coverage/sorter.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.manifest.json delete mode 100644 lib-commonjs/webparts/ctFormsPortal/assets/welcome-dark.png delete mode 100644 lib-commonjs/webparts/ctFormsPortal/assets/welcome-light.png delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.module.scss.css delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/Dashboard.module.scss.css delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/ICtFormsPortalProps.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/ICtFormsPortalProps.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/ctDocumentConfig.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/ctDocumentConfig.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/index.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/index.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/kpsDocumentConfig.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/kpsDocumentConfig.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/mock.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/mock.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/oidDocumentConfig.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/oidDocumentConfig.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/types.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/config/types.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/documentRegistry.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/documentRegistry.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/documentsService.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/documentsService.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/useDocumentDashboard.js delete mode 100644 lib-commonjs/webparts/ctFormsPortal/components/registry/useDocumentDashboard.js.map delete mode 100644 lib-commonjs/webparts/ctFormsPortal/loc/en-us.js delete mode 100644 release/analysis-logs/lint.sarif delete mode 100644 release/assets/CtFormsPortalWebPartStrings_en-us.js delete mode 100644 release/assets/CtFormsPortalWebPartStrings_en-us_3bd812ceda191f7235a1db0c41d7c3a7.js delete mode 100644 release/assets/ct-forms-portal-web-part.8bc87a793f5dc3d11d32.hot-update.js delete mode 100644 release/assets/ct-forms-portal-web-part.8bc87a793f5dc3d11d32.hot-update.js.map delete mode 100644 release/assets/ct-forms-portal-web-part.8bc87a793f5dc3d11d32.hot-update.json delete mode 100644 release/assets/ct-forms-portal-web-part.c0c82c263a05c3417a10.hot-update.js delete mode 100644 release/assets/ct-forms-portal-web-part.c0c82c263a05c3417a10.hot-update.js.map delete mode 100644 release/assets/ct-forms-portal-web-part.c0c82c263a05c3417a10.hot-update.json delete mode 100644 release/assets/ct-forms-portal-web-part.js delete mode 100644 release/assets/ct-forms-portal-web-part.js.map delete mode 100644 release/assets/ct-forms-portal-web-part_2f6a9483dc5b6d2f18a1.js delete mode 100644 release/assets/ct-forms-portal-web-part_2f6a9483dc5b6d2f18a1.js.LICENSE.txt delete mode 100644 release/component-dependency-audit/ct-forms-portal.json delete mode 100644 release/manifests/459579c7-954c-469e-b707-ca75d808603f.manifest.json create mode 100644 src/styles/_design-tokens.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Breadcrumbs/Breadcrumbs.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Breadcrumbs/Breadcrumbs.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/CtCreateForm.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/ICtCreateFormProps.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step1PositionSelection/RequestsTable.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step1PositionSelection/RequestsTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step1PositionSelection/Step1PositionSelection.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step1PositionSelection/Step1PositionSelection.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/CurrencyRatesForm.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/CurrencyRatesForm.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/FileUploadArea.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/FileUploadArea.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/Step2CommercialOffers.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/Step2CommercialOffers.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/SuppliersWithoutKp.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/UploadedKpList.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/kpTypes.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/step2Persist.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step2CommercialOffers/useKpProcessing.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/AddExtraRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/AiCommentBlock.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/ComparisonMatrix.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/CriteriaTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/ExtraPositionRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/InlineApprovalChain.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/MatrixRowView.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/Step3ComparisonTable.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/Step3ComparisonTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/matrixHelpers.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/matrixTypes.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useAiComment.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Approval.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step3ComparisonTable/useStep3Matrix.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/Step4Approval.tsx create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/Step4Approval/useStep4Approval.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/common/_theme.scss create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/hooks/useCtForm.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/hooks/useRequests.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/types/domain.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/components/utils/unitConversion.ts create mode 100644 src/webparts/ctFormsPortal/forms/ct/services/CtService.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Breadcrumbs/Breadcrumbs.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Breadcrumbs/Breadcrumbs.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/IKpsCtFormProps.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/KpsCtForm.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/KpsCtForm.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/RequestLines.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/RequestRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/Step1ReadOnlyView.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/Step1SelectPositions.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/Step1SelectPositions.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step1SelectPositions/useStep1Selection.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/CurrencyRatesForm.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/CurrencyRatesForm.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/KpFileList.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/KpFileList.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/Step2LoadKp.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/Step2LoadKp.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/SuppliersWithoutKp.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/UploadedKpList.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/UploadedKpList.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/kpOffers.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/kpPipeline.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/kpTypes.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/step2Persist.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step2LoadKp/useKpProcessing.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/AddExtraRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/AiCommentBlock.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/ComparisonMatrix.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/CriteriaTable.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/CriteriaTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/MatrixRowView.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/OfferCells.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/Step3BuildCt.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/Step3BuildCt.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/step3Persist.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/useAiComment.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step3BuildCt/useStep3Matrix.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step4Approval/InlineApprovalChain.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step4Approval/Step4Approval.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step4Approval/Step4Approval.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/Step4Approval/useStep4Approval.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/ApprovalChain.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/ApprovalChain.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/FormHeader.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/Pill.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/StepShell.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/StepShell.tsx create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/common/_theme.scss create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/hooks/useKpsCtForm.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/hooks/usePurchaseRequestDetails.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/hooks/useRequests.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/types/domain.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/utils/format.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/components/utils/session.ts create mode 100644 src/webparts/ctFormsPortal/forms/kps/services/KpsCtFormService.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Breadcrumbs/Breadcrumbs.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Breadcrumbs/Breadcrumbs.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/IOidCreateFormProps.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/OidCreateForm.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/OidCreateForm.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step1WorksInput/ComboField.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step1WorksInput/Step1WorksInput.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step1WorksInput/Step1WorksInput.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step1WorksInput/useStep1WorksInput.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/AddNoOfferDialog.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/FileUploadArea.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/FileUploadArea.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/Step2CommercialOffers.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/Step2CommercialOffers.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/SupplierList.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/UploadedKpList.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/step2Persist.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step2CommercialOffers/useKpProcessing.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/AddExtraRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/AiCommentBlock.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/ComparisonMatrix.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/CriteriaTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/ExtraPositionRow.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/InlineApprovalChain.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/MatrixRowView.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/Step3ComparisonTable.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/Step3ComparisonTable.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/matrixHelpers.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/matrixTypes.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/useAiComment.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/useStep3Approval.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step3ComparisonTable/useStep3Matrix.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step4Approval/Step4Approval.module.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step4Approval/Step4Approval.tsx create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/Step4Approval/useStep4Approval.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/common/_theme.scss create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/hooks/useOidForm.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/components/types/domain.ts create mode 100644 src/webparts/ctFormsPortal/forms/oid/services/OidService.ts diff --git a/.gitignore b/.gitignore index ab5ea70..25120aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ node_modules/ lib/ +lib-commonjs/ dist/ +release/ +jest-output/ temp/ *.sppkg .heft/ diff --git a/docs/CT-PORT.md b/docs/CT-PORT.md new file mode 100644 index 0000000..927354a --- /dev/null +++ b/docs/CT-PORT.md @@ -0,0 +1,174 @@ +# CT — перенос в ct-forms-portal (Фаза 3) + +Порядок (утверждён): **Этап 1 перенос 1:1 → Этап 2 декомпозиция под структуру KPS → Этап 3 перекраска на ui-kit.** +Правило: сохранить 100% поведения; build после каждого этапа. Эталон структуры — `forms/kps/`. +Связано: `docs/REPAINT-MAP.md` (перекраска), `docs/BEHAVIORS.md`. + +Источник: `ct-create-form/src/webparts/ctCreateForm/`. CT = 6953 стр, god-компоненты. + +## Этап 1 — перенос 1:1 — ✅ ЗАВЕРШЁН (heft build зелёный) +1. ✅ Скопированы `components/` и `services/` → `forms/ct/{components,services}/` (17 файлов, 1:1). +2. ✅ Правки для сборки в портале (минимум, поведение не менялось): + - `CtService`: конструктор `(context, siteUrl?)`, `baseUrl = siteUrl ?? absoluteUrl` (как KPS). + `kpFolder` тоже параметризован через `siteUrl` (было жёстко на `context.pageContext.web.serverRelativeUrl`). + - `ICtCreateFormProps` + `siteUrl?`; `CtCreateForm` → `new CtService(context, siteUrl)`. + - Web-part-специфичных зависимостей (loc strings) в components/services не было — ничего убирать не пришлось. +3. ✅ Обвязка портала: + - `ctDocumentConfig.ts`: `inPortal: true` + `buildInPortalParams: (row) => ({ [row.status==='Черновик'?'ctId':'ctid']: row.id })` + (сверено с `useCtForm.ts` — читает именно `ctId`/`ctid`, совпало 1:1). siteUrl уже `/sites/sed`. + - `CtFormsPortal.tsx`: ветка `form==='ct'` → `` + «← К реестру» (по образцу KPS-ветки). +4. ✅ `heft build` зелёный. + +**Открытие при переносе:** CT уже частично зависел от `@tnsu/ui-kit@^0.4.0` — 3 файла +(`Step1PositionSelection.tsx`, `Step2CommercialOffers.tsx`, `CurrencyRatesForm.tsx`) уже используют +`Button`/`Alert` из кита. API совпадает 1:1 с текущим `0.11.0` (variant="secondary"/"accent", Alert +variant="err") — конфликтов не было, работает как есть. Ускорит Этап 3. + +## Этап 2 — декомпозиция (карта резки god-компонентов) + +**Статус:** [x] Step2CommercialOffers ✅ | [x] Step4Approval ✅ | [~] Step3ComparisonTable (в работе) + +### [~] Step3ComparisonTable (2217) — В РАБОТЕ, по чекпоинтам +- ✅ **CP1 согласование** (build ок): `useStep3Approval.ts` (голосование/делегат, 1:1) + `InlineApprovalChain.tsx` + (вью цепочки + диалоги решение/делегат + баннер notifyWarning; хелперы APPROVAL_STATUS_*). Контейнер 2217→1918. +- ✅ **CP2 AI/PDF** (build ок): `useAiComment.ts` (aiComment/isAiLoading/aiError/isPdfLoading/showAiPromptDialog + + handleAiComment/handleGeneratePdfReport/handleDeleteAiComment + loadCtComment-effect + decodeHtmlEntities, + buildPayload передаётся аргументом из контейнера — матричные данные не копируются в хук) + `AiCommentBlock.tsx` + (только блок отображения, диалог-промпт остался в контейнере — как у KPS). PDF-ошибка идёт через колбэк + `onPdfError` в общий `saveError` (сохранили родной баннер). +- ✅ **CP3 хелперы/типы** (build ок): типы (ExtraSupplier/ExtraPosition/PositionRow/CellEdit/EditableOffers) → + `matrixTypes.ts`; константы (SUPPLIER_STATUS_OPTIONS/DELIVERY_TYPE_OPTIONS) + чистые ф-ции + (formatKzt/Num/Qty/round2Str/getSubCols/computeOffer/buildOfferKey) → `matrixHelpers.ts`. + `extraIdCounter` (мутабельный) оставлен в контейнере — уедет вместе с CP4. +- **Контейнер после CP1-3: 2217 → 1735 строк (−22%).** +- ✅ **CP4 ядро матрицы** (build ок): весь стейт/рефы(~15)/эффекты(loadCriteria/loadOffers/refs-sync/beforeunload/ + unmount-persist)/мемо(suppliersWithOffer/allPositions/supplierCurrencies/computedOffers/minTotalByPosition/ + recommendedSupplierId)/все update*/add*/delete*-хендлеры/handleSave → `useStep3Matrix.ts` (856, перенос + ВЕРБАТИМ). В контейнере — **деструктуризация** результата, поэтому render (984) НЕ менялся. `CriteriaEntry` + переехал в matrixTypes (общий). approval+ai хуки остались в контейнере (берут значения из деструктуризации). +- **Контейнер: 2217 → 984 строки (−56%). Логика матрицы вся в хуке. Этап 2 для CT ЗАВЕРШЁН.** +- ✅ **CP4 happy-path проверен в workbench**: полный проход по всем 4 шагам (создание СТ → загрузка КП → матрица → + согласование) прошёл без ошибок. Основной риск (грубый регресс/краш) снят. + ⚠️ Не проверены детально: bundle-строки (комплект), перевод ед. изм. (тумблер), доп.расходы/логистика, + F5 (beforeunload-persist), критерии/AI-комментарий, делегат/замена в согласовании. Смотреть при случае, + не блокирует дальнейшую работу. +- ⏭️ **CP4 матрица-ядро** (САМЫЙ РИСК): ~15 рефов + эффекты (loadCriteria/loadOffers/beforeunload/unmount-persist) + + мемо (suppliersWithOffer/allPositions/supplierCurrencies/computedOffers/minTotalByPosition/recommendedSupplierId) + + все update*/add*/delete*-хендлеры + handleSave → `useStep3Matrix.ts` (перенос ВЕРБАТИМ, не переписывать!). + ⚠️ Клубок рефов; компилятор не ловит регресс поведения. ЖЕЛАТЕЛЬНО делать при возможности workbench-теста + (после провижининга списков). Рендер таблицы (thead/tbody/итоги/критерии) дробить на ComparisonMatrix/ + MatrixRowView/OfferCells/CriteriaTable/AddExtraRow — на Этапе 3 вместе с перекраской. +Метод: чисто механический перенос блоков (логику не трогать), Fluent оставляем (перекраска — Этап 3), +build после каждого god-компонента. +**Уточнённая граница Этап2/Этап3:** Этап 2 = вынос ЛОГИКИ (хуки/persist), «раз-god-ивание». Финальное +дробление оставшейся ВЬЮХИ на под-компоненты (диалоги/списки) + размеры <200 — на Этапе 3 вместе с +перекраской (диалоги всё равно → ui-kit Dialog), чтобы не трогать файлы дважды. + +### ✅ Step4Approval (886) — СДЕЛАНО (build ок) +886 → `useStep4Approval.ts` (вся логика: chain-ops, add/delete/replace, handleActionConfirm, send/incore/restart, +производные флаги + удобные методы selectAddSuggestion/cancelAddRow/openReplace/…) + view `Step4Approval.tsx` +(~370, только разметка + helpers STATUS_LABELS/getStatusClass/formatDate; Fluent). Вьюху добьём на Этапе 3. + +### ✅ Step2CommercialOffers (597) — СДЕЛАНО (build ок, 2 чекпоинта) +597 → контейнер `Step2CommercialOffers.tsx` (~155) + `kpTypes.ts` + `useKpProcessing.ts` (конвейер Syntex/Flow) ++ `step2Persist.ts` (handleSave→функция, возвращает patch) + вьюхи `SuppliersWithoutKp.tsx` (владеет add-стейтом) +/ `UploadedKpList.tsx`. Одно семантич. уточнение: в persist `formDataRef.current`→`formData` (в момент save совпадают). + + +### Step3ComparisonTable.tsx (2217) → по образцу `Step3BuildCt/*` + отдать approval в Step4 +| Секции CT (строки) | Куда (аналог KPS) | +|---|---| +| 25–179 типы/хелперы/формат | `types/domain.ts`, `utils/format.ts`, `useStep3Matrix.ts` | +| 196–435 стейт матрицы | `useStep3Matrix.ts` | +| 285–394 approval-хендлеры | → Step4 `useStep4Approval.ts` | +| 396–405, 947–1017 AI/PDF | `useAiComment.ts` + `AiCommentBlock.tsx` | +| 439–604 useEffect загрузка/persist | `step3Persist.ts` + `useStep3Matrix.ts` | +| 606–706 useMemo производные | `useStep3Matrix.ts` | +| 708–789 редактируемые ячейки | `OfferCells.tsx` | +| 791–945 хендлеры строк | `AddExtraRow.tsx` + `useStep3Matrix.ts` | +| 1019–1193 handleSave | `step3Persist.ts` | +| 1197–1239 тулбар + тумблер ед.изм. | `Step3BuildCt.tsx` (+ доменное `unitConversion`) | +| 1241–1337 thead | `ComparisonMatrix.tsx` | +| 1339–1806 tbody + итоги | `MatrixRowView.tsx` + `OfferCells.tsx` + `ComparisonMatrix.tsx` | +| 1807–1864 инлайн-добавление | `AddExtraRow.tsx` | +| 1865–2029 критерии + AI + PDF | `CriteriaTable.tsx` + `AiCommentBlock.tsx` | +| 2030–2114 инлайн-цепочка (Teams) | → Step4 `InlineApprovalChain.tsx` | +| 2115–2211 диалоги (делегирование/решение) | ui-kit `Dialog` в `Step4Approval.tsx` | + +### Step4Approval.tsx (886) → `useStep4Approval.ts` + `Step4Approval.tsx` + `InlineApprovalChain.tsx` +(стейт+манипуляции цепочкой 94–352, handleActionConfirm/Send/Incore/Restart 239–474 → хук; render 476–763; диалоги 764–885 → ui-kit Dialog) + +### Step2CommercialOffers.tsx (597) → `useKpProcessing.ts`/`kpPipeline.ts`/`kpOffers.ts`/`step2Persist.ts` + view (`Step2LoadKp`,`KpFileList`,`CurrencyRatesForm`,`SuppliersWithoutKp`,`UploadedKpList`) + +### CtService.ts (1532) — ввести `siteUrl?` (крит.) + при желании обобщённые CRUD-примитивы как в KPS. Создать `common/*` (StepShell/FormHeader/Pill) + единый `StepProps`. + +## Доменные отличия CT (НЕ терять при декомпозиции!) +- Шаг 1 — из **SP-списка** (`fetchRequests(days)`), не из TNSU API (KPS). +- Колонки позиций: **disciplineCode (марка), smrType (SMR), agskCode**, uniqueCode, organization. +- `CT.number` — строковый, `generateCtNumber(projectName)` (per-project). +- `utils/unitConversion.ts` — пересчёт в ед. изм. заявки (тумблер) — нет в KPS. +- `SUPPLIER_STATUS_OPTIONS` (Завод/Дистрибьютор…) — нет в KPS. +- CurrencyRate/SupplierOffer — иные поля (rateToKzt; deliveryCostKzt/additionalCostsKzt/totalWithExtraKzt/pricePerUnitKzt). +- `getCurrentUserCompany()==='astel-k'` → `isRestrictedView` (скрытие цен). + +## Этап 3 — перекраска (карта A/B/C из REPAINT-MAP) +Fluent в CT: PrimaryButton/DefaultButton→Button, TextField→TextInput/TextArea, MessageBar→Alert, +IconButton/Icon, Spinner→Spinner, Dialog→ui-kit Dialog, Checkbox→Checkbox, статусы→Pill/Badge. +Особые: **Toggle** (пересчёт ед.изм.) и **NormalPeoplePicker** (делегирование) — прямых аналогов в ките нет: +Toggle → ui-kit Toggle (есть!); people picker → TextInput + searchUsers()+suggestions (как KPS Step4). + +**✅✅ Этап 3 ЗАВЕРШЁН (механическая перекраска) — Fluent полностью удалён из CT (0 импортов @fluentui +во всей `forms/ct/`), heft build ожидается пользователем.** +- Все 12 файлов с Fluent переведены на `@tnsu/ui-kit`: RequestsTable/FileUploadArea/UploadedKpList + (Checkbox/IconButton), SuppliersWithoutKp/CurrencyRatesForm/Step1PositionSelection/ + Step2CommercialOffers/AiCommentBlock (TextInput/Spinner/Alert/IconButton/FormField), + useStep3Approval/InlineApprovalChain/Step4Approval (делегат/замена — NormalPeoplePicker заменён + на паттерн KPS: query+debounce(300ms)+suggestions+select, `useStep4Approval`/`useStep3Approval` + получили `handleAddQueryChange(val)`/`setDelegateQuery(val)` вместо Fluent-сигнатуры (event, val)), + и главный контейнер `Step3ComparisonTable.tsx` (984 строки, вся матрица/критерии/футер/AI-диалог). +- Правило замен применено: `TextField`→`TextInput`/`TextArea` (multiline→TextArea rows=1, автовысоты + нет — принято как в KPS `CriteriaTable`); без `className`→обёрнуто в `
`; `Toggle` без `label`→ + обёрнут в `
-
- - - - - - - - - \ No newline at end of file diff --git a/jest-output/coverage/prettify.css b/jest-output/coverage/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/jest-output/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/jest-output/coverage/prettify.js b/jest-output/coverage/prettify.js deleted file mode 100644 index b322523..0000000 --- a/jest-output/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/jest-output/coverage/sort-arrow-sprite.png b/jest-output/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed68316eb3f65dec9063332d2f69bf3093bbfab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc diff --git a/jest-output/coverage/sorter.js b/jest-output/coverage/sorter.js deleted file mode 100644 index 4ed70ae..0000000 --- a/jest-output/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js b/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js deleted file mode 100644 index 0b1c45c..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js +++ /dev/null @@ -1,107 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var tslib_1 = require("tslib"); -var React = tslib_1.__importStar(require("react")); -var ReactDom = tslib_1.__importStar(require("react-dom")); -var sp_core_library_1 = require("@microsoft/sp-core-library"); -var sp_property_pane_1 = require("@microsoft/sp-property-pane"); -var sp_webpart_base_1 = require("@microsoft/sp-webpart-base"); -var strings = tslib_1.__importStar(require("CtFormsPortalWebPartStrings")); -var CtFormsPortal_1 = tslib_1.__importDefault(require("./components/CtFormsPortal")); -var CtFormsPortalWebPart = /** @class */ (function (_super) { - tslib_1.__extends(CtFormsPortalWebPart, _super); - function CtFormsPortalWebPart() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this._isDarkTheme = false; - _this._environmentMessage = ''; - return _this; - } - CtFormsPortalWebPart.prototype.render = function () { - var element = React.createElement(CtFormsPortal_1.default, { - description: this.properties.description, - isDarkTheme: this._isDarkTheme, - environmentMessage: this._environmentMessage, - hasTeamsContext: !!this.context.sdks.microsoftTeams, - userDisplayName: this.context.pageContext.user.displayName, - context: this.context - }); - ReactDom.render(element, this.domElement); - }; - CtFormsPortalWebPart.prototype.onInit = function () { - var _this = this; - return this._getEnvironmentMessage().then(function (message) { - _this._environmentMessage = message; - }); - }; - CtFormsPortalWebPart.prototype._getEnvironmentMessage = function () { - var _this = this; - if (!!this.context.sdks.microsoftTeams) { // running in Teams, office.com or Outlook - return this.context.sdks.microsoftTeams.teamsJs.app.getContext() - .then(function (context) { - var environmentMessage = ''; - switch (context.app.host.name) { - case 'Office': // running in Office - environmentMessage = _this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOffice : strings.AppOfficeEnvironment; - break; - case 'Outlook': // running in Outlook - environmentMessage = _this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOutlook : strings.AppOutlookEnvironment; - break; - case 'Teams': // running in Teams - case 'TeamsModern': - environmentMessage = _this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentTeams : strings.AppTeamsTabEnvironment; - break; - default: - environmentMessage = strings.UnknownEnvironment; - } - return environmentMessage; - }); - } - return Promise.resolve(this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentSharePoint : strings.AppSharePointEnvironment); - }; - CtFormsPortalWebPart.prototype.onThemeChanged = function (currentTheme) { - if (!currentTheme) { - return; - } - this._isDarkTheme = !!currentTheme.isInverted; - var semanticColors = currentTheme.semanticColors; - if (semanticColors) { - this.domElement.style.setProperty('--bodyText', semanticColors.bodyText || null); - this.domElement.style.setProperty('--link', semanticColors.link || null); - this.domElement.style.setProperty('--linkHovered', semanticColors.linkHovered || null); - } - }; - CtFormsPortalWebPart.prototype.onDispose = function () { - ReactDom.unmountComponentAtNode(this.domElement); - }; - Object.defineProperty(CtFormsPortalWebPart.prototype, "dataVersion", { - get: function () { - return sp_core_library_1.Version.parse('1.0'); - }, - enumerable: false, - configurable: true - }); - CtFormsPortalWebPart.prototype.getPropertyPaneConfiguration = function () { - return { - pages: [ - { - header: { - description: strings.PropertyPaneDescription - }, - groups: [ - { - groupName: strings.BasicGroupName, - groupFields: [ - (0, sp_property_pane_1.PropertyPaneTextField)('description', { - label: strings.DescriptionFieldLabel - }) - ] - } - ] - } - ] - }; - }; - return CtFormsPortalWebPart; -}(sp_webpart_base_1.BaseClientSideWebPart)); -exports.default = CtFormsPortalWebPart; -//# sourceMappingURL=CtFormsPortalWebPart.js.map \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js.map b/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js.map deleted file mode 100644 index ef6426a..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"CtFormsPortalWebPart.js","sourceRoot":"","sources":["../../../src/webparts/ctFormsPortal/CtFormsPortalWebPart.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport * as ReactDom from 'react-dom';\nimport { Version } from '@microsoft/sp-core-library';\nimport {\n type IPropertyPaneConfiguration,\n PropertyPaneTextField\n} from '@microsoft/sp-property-pane';\nimport { BaseClientSideWebPart } from '@microsoft/sp-webpart-base';\nimport { IReadonlyTheme } from '@microsoft/sp-component-base';\n\nimport * as strings from 'CtFormsPortalWebPartStrings';\nimport CtFormsPortal from './components/CtFormsPortal';\nimport { ICtFormsPortalProps } from './components/ICtFormsPortalProps';\n\nexport interface ICtFormsPortalWebPartProps {\n description: string;\n}\n\nexport default class CtFormsPortalWebPart extends BaseClientSideWebPart {\n\n private _isDarkTheme: boolean = false;\n private _environmentMessage: string = '';\n\n public render(): void {\n const element: React.ReactElement = React.createElement(\n CtFormsPortal,\n {\n description: this.properties.description,\n isDarkTheme: this._isDarkTheme,\n environmentMessage: this._environmentMessage,\n hasTeamsContext: !!this.context.sdks.microsoftTeams,\n userDisplayName: this.context.pageContext.user.displayName,\n context: this.context\n }\n );\n\n ReactDom.render(element, this.domElement);\n }\n\n protected onInit(): Promise {\n return this._getEnvironmentMessage().then(message => {\n this._environmentMessage = message;\n });\n }\n\n\n\n private _getEnvironmentMessage(): Promise {\n if (!!this.context.sdks.microsoftTeams) { // running in Teams, office.com or Outlook\n return this.context.sdks.microsoftTeams.teamsJs.app.getContext()\n .then(context => {\n let environmentMessage: string = '';\n switch (context.app.host.name) {\n case 'Office': // running in Office\n environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOffice : strings.AppOfficeEnvironment;\n break;\n case 'Outlook': // running in Outlook\n environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentOutlook : strings.AppOutlookEnvironment;\n break;\n case 'Teams': // running in Teams\n case 'TeamsModern':\n environmentMessage = this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentTeams : strings.AppTeamsTabEnvironment;\n break;\n default:\n environmentMessage = strings.UnknownEnvironment;\n }\n\n return environmentMessage;\n });\n }\n\n return Promise.resolve(this.context.isServedFromLocalhost ? strings.AppLocalEnvironmentSharePoint : strings.AppSharePointEnvironment);\n }\n\n protected onThemeChanged(currentTheme: IReadonlyTheme | undefined): void {\n if (!currentTheme) {\n return;\n }\n\n this._isDarkTheme = !!currentTheme.isInverted;\n const {\n semanticColors\n } = currentTheme;\n\n if (semanticColors) {\n this.domElement.style.setProperty('--bodyText', semanticColors.bodyText || null);\n this.domElement.style.setProperty('--link', semanticColors.link || null);\n this.domElement.style.setProperty('--linkHovered', semanticColors.linkHovered || null);\n }\n\n }\n\n protected onDispose(): void {\n ReactDom.unmountComponentAtNode(this.domElement);\n }\n\n protected get dataVersion(): Version {\n return Version.parse('1.0');\n }\n\n protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {\n return {\n pages: [\n {\n header: {\n description: strings.PropertyPaneDescription\n },\n groups: [\n {\n groupName: strings.BasicGroupName,\n groupFields: [\n PropertyPaneTextField('description', {\n label: strings.DescriptionFieldLabel\n })\n ]\n }\n ]\n }\n ]\n };\n }\n}\n"]} \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.manifest.json b/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.manifest.json deleted file mode 100644 index 0953b2a..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/CtFormsPortalWebPart.manifest.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", - "id": "459579c7-954c-469e-b707-ca75d808603f", - "alias": "CtFormsPortalWebPart", - "componentType": "WebPart", - - // The "*" signifies that the version should be taken from the package.json - "version": "*", - "manifestVersion": 2, - - // If true, the component can only be installed on sites where Custom Script is allowed. - // Components that allow authors to embed arbitrary script code should set this to true. - // https://support.office.com/en-us/article/Turn-scripting-capabilities-on-or-off-1f2c515f-5d7e-448a-9fd7-835da935584f - "requiresCustomScript": false, - "supportedHosts": ["SharePointWebPart", "TeamsPersonalApp", "TeamsTab", "SharePointFullPage"], - "supportsThemeVariants": true, - "supportsFullBleed": true, - - "preconfiguredEntries": [{ - "groupId": "5c03119e-3074-46fd-976b-c60198311f70", // Advanced - "group": { "default": "Advanced" }, - "title": { "default": "ct-forms-portal" }, - "description": { "default": "ct-forms-portal description" }, - "officeFabricIconFontName": "Page", - "properties": { - "description": "ct-forms-portal" - } - }] -} diff --git a/lib-commonjs/webparts/ctFormsPortal/assets/welcome-dark.png b/lib-commonjs/webparts/ctFormsPortal/assets/welcome-dark.png deleted file mode 100644 index 42f0b8d24a9aa964a2be4885fe5700c1c54191a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12545 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�Gp~kbx)oU28ew4C2+WtKA z?ii5OmkiU`=%DSZvRn_T6N8n7gMpPiuw|6cx+?2QoiiV*HPSBURRb((2HlrP$nR1s zE!ixA3%lrPad}1)Ev0nH@FIc9zz{>ERl9N6scn~9yO(pwlPFAF3t>lYw5|VV|64D6>pIGI3Rm+c zKbkssWHyfURs`J^lLRc1d4J~Ah>WmH{s63$6_HH-NM=y z>;@rMW?hUwN)7?6`tE#kp-XQFh3y(8I&q6Z-Yu=~01lRW0<^gnfcn$IJ&TZ9FF7&o zV4t%GQz0SrTZ^PJ_1)7K#6^!$)g-G`)=?MWVN5O}tQm!p12t6A+Of`2+&o!Nekuid=bR0fGTXpW~)oGkX%aRNDiMeoFHRq+T)jo8H})cIhJ zPTRyN&TWN^lH$?(u!;?ZzQ$=9yZLkS#1ScsM)=G7XRkRSFfy=2Mg&)sJD2lVdMbJWMSd+=nUsu%&;wbB1^A^ z?rQSHzQ$fY;&TLz`)?BFfO5e(3XhWu$=rfVj34YGnnzCU=wXsoPLTh+90ynqCsqhk zYy=A){iJzTYWrDR&`A+IfqXa{nAX~`qEB)DjcgrF+>*APef@_U`Oq0aT;t@CY(>c4h}{&c-RjvoQ8DMpY=)g9o+>NU{QgUOqSKgmyrqyKU1Dg(uS(kR4uD0% z)U_-?+)|X)&hbK3FYW94IO>-dP8@a^HOzlTZxVD^;%aq|B}a=!ijidAmNIaZP<&@R zP+1#=-8X$$Gx-DbgM`w6Bgea*c-jXh)lK9mNM1+!u4x)x5ble>gE6?skgv5zbtS6p zguFN;VLQyFgEXQ)>neCi-{CPNvNCBI3nh08A+4R;x#uw5uT9NT0hz)@|zA?uCJFfS2#`L zL~RKmYQTb!J)*cb+AqSKKm4Ndxs<3F->WzvZA*~YaJKs-{Tg-zBn6Uooxn2i)v3It zLRX7&gl2f65*7pL32*8YNfdS|1TN-eMM*>=kN%dVfQox{)a3t2!43=!x|LDC|8n}1MB!pUtK42c{r<}m<^X8K zKT$|4E3Ham!jf4X7V*9;Km5QI8mo=S_#Z~1l@I6@Ek_k9qj+A(SzI`n`0}U7o0@?G zi{9?5!$-|oX9@0&IN66)ZXB97ooK6_S2`EpGxpvRB-RWc4v(t18isepQgMMeTm@l< zMhlxU!<7JL)&EAR9EXL;6ZH?Zk0E?kH0fV7^hZO-_Q& zpC}S8S;)2Eh3Et3tB)H1J2?y6F9X^=oy1pThwL9$A9fQeEG!reEz}%zCTv$XBs>+W zATfsO&fLEBp412N<)&0yh<@*%oR)IT^{9SR;rf;BOrB8C0(ySBitd7##@bZcWZ zz9Uq+Vy739f!9D|t|1>ODDUPEm462)aWV2=vmkKsNIm*y`f>Yza2Ywc|0~*PQ$M-n zi^#>~GS#qeW~6tzLngVh;~6GBfm7|c51O+KmsH8-pRpA$NFO^1O!E&A71Cc>p?7)N zAN<9jvM4_iaVV?&XSwGaMh;uewlb$(be4lMNQ4qx=-+U0;RY>HV0x?*P;36>Ebvwa zD6jcnMR;cepwtx}U*%9y>s~3vou$=p{@Mw8BWpDhpk%%{d^ov?g&HCC%pW*piE$L4 z9=!9m@gQ#B%=P-y=Dob>T8vPVqDcyGuB2KB4|`CGSFYZJ~hG;6dp{lH@~RvJk42^-$H>7?0W^P-_SDVUbY?LK)NLi~qblRiT{fES-fpdgw;tX||%2yyhA~`?!4pACHi`xh)x$&r;6U4!gPc9=NkxxtoHE zknMrdfVo&XBsm#U8d_QM77NZ`m_<-a9EMVaZ$CP8f>C>ytUBGKL`r1Nz?&G`!w}Yj zC4S&|^NEAnDqGm9!3R&oJ! z#axCX32OI8 z0Ya>4RsNOxTP?F;Fd>EkP(FZ}GQ=`sVI+o3ijQ16??*1g+J}ij>{*oV^xN5j+i%IJ z+oM!w5qM5bB2TZ6M6{CeqO?t(Mdy-fY~^#CEw0E9A!ZIRZQvu3NZ#_j64p&ZlIKi zDxtXK4xWq3W3{8OrMNPgH&bzVA6bx_4`Z=ldabh|mBI#nU~#C5KN8s7@W>0b8xOytF{wcIZ{KA!`6{j8DD{1$nM z8s6qm2TJCY<70W-C4p+Pbt0do1>m47NRr40&|M>kE-QH)47|C2xc?-ha8tB&fk1PIONh3xsUz7f7vN02Sc9tVLV1! zvNH#D6T}LRg|ItqZR>GR^m*+i6M}S?de#tn>Cvmje>y%H&MR8~oR2AQV7pe2M zznj)Cj3eRmw~kc*?(BT<5u$LjNWLwT(%;klDB*q^Zo4iiPM+_0M{@(3wIRm)833t= zfslP$WBd`q0*gPo#o~Nk|H|eAM|t``0r$g8SjCK&9|+j2}|C7I^AWF_IAd&PMqF1RuEq zcx!|bRh8uox_z3x_hWedYHDhF3uAeQXQ4%BJ|n%e2axKOv?gHz0iVjAoJeQJAqffz|3m~)}2AClI;2pJnk2gyQ;uFlTfbA){f<D0>VCw-mkdAdDXt8)K@_44!;Y4pu~Ea!8+Hm{#aOKN6R)+^!6Ryf&$_s3RL|B)lkGfgG4BG zq&~Nx4q+D_xW2f*_q31` zQJy7f-L`UE{A{P)#=6@>44d*Xqm7;_cUx}ac8Eyl20)bC_7wzGp5T|8CE6c~gS90Q zL*(MP4IYaR;;a4F@Wo4FM3ogtuji{DOgYTcN%sD}XNe}rq*Jz~hW%p!PEJZ$vR2$Q G`2PSf1J4)$ diff --git a/lib-commonjs/webparts/ctFormsPortal/assets/welcome-light.png b/lib-commonjs/webparts/ctFormsPortal/assets/welcome-light.png deleted file mode 100644 index 69eb3b48cd83031f106df4b4df127c749657e319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12816 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 diff --git a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js b/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js deleted file mode 100644 index 1d9a69a..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var tslib_1 = require("tslib"); -var React = tslib_1.__importStar(require("react")); -require("@tnsu/ui-kit/styles.css"); -var ui_kit_1 = require("@tnsu/ui-kit"); -var CtFormsPortal_module_scss_1 = tslib_1.__importDefault(require("./CtFormsPortal.module.scss")); -var Dashboard_1 = require("./Dashboard"); -// Корень веб-парта: спрайт иконок (один раз) + дашборд-реестр. -// Импорт CtFormsPortal.module.scss обязателен — в нём :global full-width правила канвы. -var CtFormsPortal = function (props) { return (React.createElement("div", { className: CtFormsPortal_module_scss_1.default.root }, - React.createElement(ui_kit_1.IconSprite, null), - React.createElement(Dashboard_1.Dashboard, { context: props.context }))); }; -exports.default = CtFormsPortal; -//# sourceMappingURL=CtFormsPortal.js.map \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js.map b/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js.map deleted file mode 100644 index 6084961..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"CtFormsPortal.js","sourceRoot":"","sources":["../../../../src/webparts/ctFormsPortal/components/CtFormsPortal.tsx"],"names":[],"mappings":";;;AAAA,mDAA+B;AAC/B,mCAAiC;AACjC,uCAA0C;AAC1C,kGAAiD;AAEjD,yCAAwC;AAExC,+DAA+D;AAC/D,wFAAwF;AACxF,IAAM,aAAa,GAAkC,UAAC,KAAK,IAAK,OAAA,CAC9D,6BAAK,SAAS,EAAE,mCAAM,CAAC,IAAI;IACzB,oBAAC,mBAAU,OAAG;IACd,oBAAC,qBAAS,IAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,CACjC,CACP,EAL+D,CAK/D,CAAC;AAEF,kBAAe,aAAa,CAAC","sourcesContent":["import * as React from 'react';\nimport '@tnsu/ui-kit/styles.css';\nimport { IconSprite } from '@tnsu/ui-kit';\nimport styles from './CtFormsPortal.module.scss';\nimport type { ICtFormsPortalProps } from './ICtFormsPortalProps';\nimport { Dashboard } from './Dashboard';\n\n// Корень веб-парта: спрайт иконок (один раз) + дашборд-реестр.\n// Импорт CtFormsPortal.module.scss обязателен — в нём :global full-width правила канвы.\nconst CtFormsPortal: React.FC = (props) => (\n
\n \n \n
\n);\n\nexport default CtFormsPortal;\n"]} \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.module.scss.css b/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.module.scss.css deleted file mode 100644 index 40019a9..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/components/CtFormsPortal.module.scss.css +++ /dev/null @@ -1,11 +0,0 @@ -:global #workbenchPageContent, -:global #spPageCanvasContent, -:global .SPCanvas-canvas, -:global .CanvasComponent.LCS .CanvasZone, -:global .CanvasZone { - max-width: 100% !important; -} - -.root { - width: 100%; -} \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js b/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js deleted file mode 100644 index bc5506a..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js +++ /dev/null @@ -1,106 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Dashboard = void 0; -var tslib_1 = require("tslib"); -var React = tslib_1.__importStar(require("react")); -var react_1 = require("react"); -var Dashboard_module_scss_1 = tslib_1.__importDefault(require("./Dashboard.module.scss")); -var ui_kit_1 = require("@tnsu/ui-kit"); -var config_1 = require("./config"); -var useDocumentDashboard_1 = require("./registry/useDocumentDashboard"); -// Иконка сайдбара по типу (kit-иконки; Fluent-иконки из конфигов тут не используем). -var TYPE_ICON = { ct: 'clipboard', oid: 'chart', kps: 'building' }; -// Цвет статуса DashboardRow → вариант нашего Badge (error → danger). -var VARIANT_MAP = { - neutral: 'neutral', - info: 'info', - success: 'success', - error: 'danger' -}; -function formatDate(iso) { - if (!iso) - return ''; - var d = new Date(iso); - var dd = d.getDate() < 10 ? "0".concat(d.getDate()) : "".concat(d.getDate()); - var mm = d.getMonth() + 1 < 10 ? "0".concat(d.getMonth() + 1) : "".concat(d.getMonth() + 1); - return "".concat(dd, ".").concat(mm, ".").concat(d.getFullYear()); -} -// Дашборд-реестр (config-driven, данные из SharePoint). Оболочка и элементы — из @tnsu/ui-kit. -var Dashboard = function (_a) { - var _b; - var context = _a.context; - var _c = (0, useDocumentDashboard_1.useDocumentDashboard)(context, config_1.DOCUMENT_TYPES), myDocs = _c.myDocs, approvedDocs = _c.approvedDocs, pendingDocs = _c.pendingDocs, isLoading = _c.isLoading, error = _c.error; - var _d = (0, react_1.useState)(config_1.DOCUMENT_TYPES[0].typeKey), activeType = _d[0], setActiveType = _d[1]; - var _e = (0, react_1.useState)('pending'), queue = _e[0], setQueue = _e[1]; - var _f = (0, react_1.useState)(false), collapsed = _f[0], setCollapsed = _f[1]; - var _g = (0, react_1.useState)(false), mobileOpen = _g[0], setMobileOpen = _g[1]; - var _h = (0, react_1.useState)(''), search = _h[0], setSearch = _h[1]; - var _j = (0, react_1.useState)(''), status = _j[0], setStatus = _j[1]; - var cfg = config_1.DOCUMENT_TYPES.filter(function (t) { return t.typeKey === activeType; })[0]; - var byType = function (arr) { return arr.filter(function (r) { return r.typeKey === activeType; }); }; - var pendingForType = byType(pendingDocs); - var mineForType = byType(myDocs); - var approvedForType = byType(approvedDocs); - var sidebarItems = config_1.DOCUMENT_TYPES.map(function (t) { - var _a; - return ({ - id: t.typeKey, - title: t.typeLabel, - icon: (_a = TYPE_ICON[t.typeKey]) !== null && _a !== void 0 ? _a : 'document', - count: pendingDocs.filter(function (r) { return r.typeKey === t.typeKey; }).length - }); - }); - var tabs = [ - { id: 'pending', label: 'На согласовании у меня', count: pendingForType.length }, - { id: 'mine', label: 'Инициализированные мной', count: mineForType.length }, - { id: 'approved', label: 'Согласованные мной', count: approvedForType.length } - ]; - var activeRows = queue === 'pending' ? pendingForType : queue === 'mine' ? mineForType : approvedForType; - var statusOptions = Array.from(new Set(activeRows.map(function (r) { return r.statusLabel; }))).map(function (s) { return ({ - value: s, - label: s - }); }); - var rows = activeRows - .filter(function (r) { var _a; return !search || "".concat(r.title, " ").concat((_a = r.subtitle) !== null && _a !== void 0 ? _a : '').toLowerCase().indexOf(search.toLowerCase()) !== -1; }) - .filter(function (r) { return !status || r.statusLabel === status; }); - var renderCell = function (row, key) { - var _a; - if (key === 'status') { - return (React.createElement(ui_kit_1.Badge, { variant: VARIANT_MAP[row.statusVariant], size: "sm" }, row.statusLabel)); - } - if (key === 'created') - return formatDate(row.createdDate); - return String((_a = row[key]) !== null && _a !== void 0 ? _a : ''); - }; - var columns = cfg.columns.map(function (c) { return ({ - key: c.key, - title: c.label, - width: c.minWidth ? "".concat(c.minWidth, "px") : undefined, - render: function (row) { return renderCell(row, c.key); } - }); }); - var selectType = function (id) { - setActiveType(String(id)); - setQueue('pending'); - setSearch(''); - setStatus(''); - }; - return (React.createElement(ui_kit_1.AppLayout, { sidebar: React.createElement(ui_kit_1.Sidebar, { items: sidebarItems, activeId: activeType, onChange: selectType, brand: "\u0414\u043E\u0433\u043E\u0432\u043E\u0440\u0430", collapsed: collapsed, onToggleCollapsed: function () { return setCollapsed(function (c) { return !c; }); }, mobileOpen: mobileOpen, onMobileClose: function () { return setMobileOpen(false); } }), mobileToggle: React.createElement(ui_kit_1.SidebarToggle, { onClick: function () { return setMobileOpen(true); } }) }, - React.createElement("div", { className: Dashboard_module_scss_1.default.head }, - React.createElement("h2", { className: Dashboard_module_scss_1.default.title }, cfg.typeLabel), - cfg.createNewUrl && (React.createElement(ui_kit_1.Button, { variant: "accent", onClick: function () { return window.open(cfg.createNewUrl, '_blank'); } }, (_b = cfg.createNewLabel) !== null && _b !== void 0 ? _b : 'Создать'))), - React.createElement("div", { className: Dashboard_module_scss_1.default.toolbar }, - React.createElement("div", { className: Dashboard_module_scss_1.default.search }, - React.createElement(ui_kit_1.TextInput, { value: search, onChange: setSearch, placeholder: "\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u043D\u043E\u043C\u0435\u0440\u0443 \u0438\u043B\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0443" })), - React.createElement("div", { className: Dashboard_module_scss_1.default.filter }, - React.createElement(ui_kit_1.Select, { value: status, onChange: setStatus, options: statusOptions, placeholder: "\u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u044B" }))), - React.createElement(ui_kit_1.Tabs, { tabs: tabs, activeId: queue, onChange: function (id) { return setQueue(id); } }), - error && (React.createElement("div", { className: Dashboard_module_scss_1.default.state }, - React.createElement(ui_kit_1.Alert, { variant: "err" }, - "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0434\u0430\u043D\u043D\u044B\u0435: ", - error))), - !error && isLoading && React.createElement("div", { className: Dashboard_module_scss_1.default.state }, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026"), - !error && !isLoading && (React.createElement("div", { className: Dashboard_module_scss_1.default.tableWrap }, - React.createElement(ui_kit_1.DataTable, { columns: columns, rows: rows, rowKey: function (r) { return "".concat(r.typeKey, "-").concat(r.id); }, onRowClick: function (r) { return window.open(cfg.buildLinkUrl(r), '_blank'); }, emptyText: "\u041D\u0435\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432" }))))); -}; -exports.Dashboard = Dashboard; -//# sourceMappingURL=Dashboard.js.map \ No newline at end of file diff --git a/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js.map b/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js.map deleted file mode 100644 index cce6efb..0000000 --- a/lib-commonjs/webparts/ctFormsPortal/components/Dashboard.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../../src/webparts/ctFormsPortal/components/Dashboard.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react';\nimport { useState } from 'react';\nimport { WebPartContext } from '@microsoft/sp-webpart-base';\nimport styles from './Dashboard.module.scss';\nimport {\n AppLayout,\n Sidebar,\n SidebarToggle,\n ISidebarItem,\n Tabs,\n ITab,\n DataTable,\n IDataTableColumn,\n Badge,\n BadgeVariant,\n Button,\n TextInput,\n Select,\n ISelectOption,\n Alert,\n IconName\n} from '@tnsu/ui-kit';\nimport { DOCUMENT_TYPES } from './config';\nimport { useDocumentDashboard } from './registry/useDocumentDashboard';\nimport { DashboardRow } from './registry/documentRegistry';\n\ntype QueueKey = 'pending' | 'mine' | 'approved';\n\n// Иконка сайдбара по типу (kit-иконки; Fluent-иконки из конфигов тут не используем).\nconst TYPE_ICON: Record = { ct: 'clipboard', oid: 'chart', kps: 'building' };\n\n// Цвет статуса DashboardRow → вариант нашего Badge (error → danger).\nconst VARIANT_MAP: Record = {\n neutral: 'neutral',\n info: 'info',\n success: 'success',\n error: 'danger'\n};\n\nfunction formatDate(iso?: string): string {\n if (!iso) return '';\n const d = new Date(iso);\n const dd = d.getDate() < 10 ? `0${d.getDate()}` : `${d.getDate()}`;\n const mm = d.getMonth() + 1 < 10 ? `0${d.getMonth() + 1}` : `${d.getMonth() + 1}`;\n return `${dd}.${mm}.${d.getFullYear()}`;\n}\n\n// Дашборд-реестр (config-driven, данные из SharePoint). Оболочка и элементы — из @tnsu/ui-kit.\nexport const Dashboard: React.FC<{ context: WebPartContext }> = ({ context }) => {\n const { myDocs, approvedDocs, pendingDocs, isLoading, error } = useDocumentDashboard(context, DOCUMENT_TYPES);\n\n const [activeType, setActiveType] = useState(DOCUMENT_TYPES[0].typeKey);\n const [queue, setQueue] = useState('pending');\n const [collapsed, setCollapsed] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [status, setStatus] = useState('');\n\n const cfg = DOCUMENT_TYPES.filter((t) => t.typeKey === activeType)[0];\n\n const byType = (arr: DashboardRow[]): DashboardRow[] => arr.filter((r) => r.typeKey === activeType);\n const pendingForType = byType(pendingDocs);\n const mineForType = byType(myDocs);\n const approvedForType = byType(approvedDocs);\n\n const sidebarItems: ISidebarItem[] = DOCUMENT_TYPES.map((t) => ({\n id: t.typeKey,\n title: t.typeLabel,\n icon: TYPE_ICON[t.typeKey] ?? 'document',\n count: pendingDocs.filter((r) => r.typeKey === t.typeKey).length\n }));\n\n const tabs: ITab[] = [\n { id: 'pending', label: 'На согласовании у меня', count: pendingForType.length },\n { id: 'mine', label: 'Инициализированные мной', count: mineForType.length },\n { id: 'approved', label: 'Согласованные мной', count: approvedForType.length }\n ];\n\n const activeRows = queue === 'pending' ? pendingForType : queue === 'mine' ? mineForType : approvedForType;\n\n const statusOptions: ISelectOption[] = Array.from(new Set(activeRows.map((r) => r.statusLabel))).map((s) => ({\n value: s,\n label: s\n }));\n\n const rows = activeRows\n .filter((r) => !search || `${r.title} ${r.subtitle ?? ''}`.toLowerCase().indexOf(search.toLowerCase()) !== -1)\n .filter((r) => !status || r.statusLabel === status);\n\n const renderCell = (row: DashboardRow, key: string): React.ReactNode => {\n if (key === 'status') {\n return (\n \n {row.statusLabel}\n \n );\n }\n if (key === 'created') return formatDate(row.createdDate);\n return String((row as unknown as Record)[key] ?? '');\n };\n\n const columns: IDataTableColumn[] = cfg.columns.map((c) => ({\n key: c.key,\n title: c.label,\n width: c.minWidth ? `${c.minWidth}px` : undefined,\n render: (row) => renderCell(row, c.key)\n }));\n\n const selectType = (id: string | number): void => {\n setActiveType(String(id));\n setQueue('pending');\n setSearch('');\n setStatus('');\n };\n\n return (\n setCollapsed((c) => !c)}\n mobileOpen={mobileOpen}\n onMobileClose={() => setMobileOpen(false)}\n />\n }\n mobileToggle={ setMobileOpen(true)} />}\n >\n
\n

{cfg.typeLabel}

\n {cfg.createNewUrl && (\n \n )}\n
\n\n
\n
\n \n
\n
\n