@ixo/editor 6.32.1 → 6.34.0
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/BidConfig-YLGSEIOS.js +154 -0
- package/dist/BidConfig-YLGSEIOS.js.map +1 -0
- package/dist/BidFlowDetail-TJCJBJZZ.js +365 -0
- package/dist/BidFlowDetail-TJCJBJZZ.js.map +1 -0
- package/dist/CalendarEventCreateConfig-J2LU6LJO.js +155 -0
- package/dist/CalendarEventCreateConfig-J2LU6LJO.js.map +1 -0
- package/dist/CalendarEventCreateFlowDetail-ZWHZWDOK.js +174 -0
- package/dist/CalendarEventCreateFlowDetail-ZWHZWDOK.js.map +1 -0
- package/dist/CalendarEventListConfig-GQNNF4ZB.js +116 -0
- package/dist/CalendarEventListConfig-GQNNF4ZB.js.map +1 -0
- package/dist/CalendarEventListFlowDetail-SSRTOXIX.js +58 -0
- package/dist/CalendarEventListFlowDetail-SSRTOXIX.js.map +1 -0
- package/dist/CalendarEventUpdateConfig-KACZA6GH.js +133 -0
- package/dist/CalendarEventUpdateConfig-KACZA6GH.js.map +1 -0
- package/dist/CalendarEventUpdateFlowDetail-CD6NHHOU.js +155 -0
- package/dist/CalendarEventUpdateFlowDetail-CD6NHHOU.js.map +1 -0
- package/dist/ClaimConfig-3HKPGK55.js +200 -0
- package/dist/ClaimConfig-3HKPGK55.js.map +1 -0
- package/dist/ClaimFlowDetail-UVEQMEI5.js +641 -0
- package/dist/ClaimFlowDetail-UVEQMEI5.js.map +1 -0
- package/dist/CollectionLifecycleConfig-LCCGZ3CJ.js +149 -0
- package/dist/CollectionLifecycleConfig-LCCGZ3CJ.js.map +1 -0
- package/dist/CollectionLifecycleFlowDetail-WFCSVIIG.js +647 -0
- package/dist/CollectionLifecycleFlowDetail-WFCSVIIG.js.map +1 -0
- package/dist/CollectionUsersConfig-RI2X3YY2.js +271 -0
- package/dist/CollectionUsersConfig-RI2X3YY2.js.map +1 -0
- package/dist/CollectionUsersFlowDetail-ZLCJBWHG.js +1276 -0
- package/dist/CollectionUsersFlowDetail-ZLCJBWHG.js.map +1 -0
- package/dist/CredentialStoreConfig-G66AQDGZ.js +75 -0
- package/dist/CredentialStoreConfig-G66AQDGZ.js.map +1 -0
- package/dist/CredentialStoreFlowDetail-FL7QAM3S.js +99 -0
- package/dist/CredentialStoreFlowDetail-FL7QAM3S.js.map +1 -0
- package/dist/DesignPodConfig-LJ7H2CZ6.js +8 -0
- package/dist/DesignPodConfig-LJ7H2CZ6.js.map +1 -0
- package/dist/DesignPodFlowDetail-JHJWGNVY.js +309 -0
- package/dist/DesignPodFlowDetail-JHJWGNVY.js.map +1 -0
- package/dist/DomainCardPreviewConfig-Q3X5M4WF.js +37 -0
- package/dist/DomainCardPreviewConfig-Q3X5M4WF.js.map +1 -0
- package/dist/DomainCardPreviewFlowDetail-Y2FE7O5Z.js +131 -0
- package/dist/DomainCardPreviewFlowDetail-Y2FE7O5Z.js.map +1 -0
- package/dist/DomainIndexerLookupConfig-N4VONQUY.js +41 -0
- package/dist/DomainIndexerLookupConfig-N4VONQUY.js.map +1 -0
- package/dist/DomainIndexerLookupFlowDetail-GJ7WWK7I.js +70 -0
- package/dist/DomainIndexerLookupFlowDetail-GJ7WWK7I.js.map +1 -0
- package/dist/DomainSignConfig-XFIXROVK.js +47 -0
- package/dist/DomainSignConfig-XFIXROVK.js.map +1 -0
- package/dist/DomainSignFlowDetail-BXZ6JBPR.js +206 -0
- package/dist/DomainSignFlowDetail-BXZ6JBPR.js.map +1 -0
- package/dist/DomainSingleSelectionConfig-ZNKIXB4P.js +101 -0
- package/dist/DomainSingleSelectionConfig-ZNKIXB4P.js.map +1 -0
- package/dist/DomainSingleSelectionFlowDetail-HWTQXSLA.js +147 -0
- package/dist/DomainSingleSelectionFlowDetail-HWTQXSLA.js.map +1 -0
- package/dist/EmailSendConfig-YEGZ5Q77.js +215 -0
- package/dist/EmailSendConfig-YEGZ5Q77.js.map +1 -0
- package/dist/EntityCreateOracleConfig-UZ6ZIMP5.js +150 -0
- package/dist/EntityCreateOracleConfig-UZ6ZIMP5.js.map +1 -0
- package/dist/EntityCreateOracleFlowDetail-H2X7CPYU.js +120 -0
- package/dist/EntityCreateOracleFlowDetail-H2X7CPYU.js.map +1 -0
- package/dist/EntitySingleSelectionConfig-DL57KNKM.js +30 -0
- package/dist/EntitySingleSelectionConfig-DL57KNKM.js.map +1 -0
- package/dist/EntitySingleSelectionFlowDetail-GFQGX3GA.js +118 -0
- package/dist/EntitySingleSelectionFlowDetail-GFQGX3GA.js.map +1 -0
- package/dist/EntityTransferConfig-JVZ3H35B.js +62 -0
- package/dist/EntityTransferConfig-JVZ3H35B.js.map +1 -0
- package/dist/EntityTransferFlowDetail-XEXM34XB.js +132 -0
- package/dist/EntityTransferFlowDetail-XEXM34XB.js.map +1 -0
- package/dist/EvalEngineConfig-CHC4IRN3.js +464 -0
- package/dist/EvalEngineConfig-CHC4IRN3.js.map +1 -0
- package/dist/EvalEngineFlowDetail-PUFRNO4U.js +4291 -0
- package/dist/EvalEngineFlowDetail-PUFRNO4U.js.map +1 -0
- package/dist/EvaluateBidConfig-OE4CM43G.js +151 -0
- package/dist/EvaluateBidConfig-OE4CM43G.js.map +1 -0
- package/dist/EvaluateBidFlowDetail-2S2N4YTW.js +564 -0
- package/dist/EvaluateBidFlowDetail-2S2N4YTW.js.map +1 -0
- package/dist/EvaluateClaimConfig-3D4F5LHU.js +297 -0
- package/dist/EvaluateClaimConfig-3D4F5LHU.js.map +1 -0
- package/dist/EvaluateClaimFlowDetail-QYR7PJRD.js +2237 -0
- package/dist/EvaluateClaimFlowDetail-QYR7PJRD.js.map +1 -0
- package/dist/FormSubmitConfig-UFZYMLUN.js +59 -0
- package/dist/FormSubmitConfig-UFZYMLUN.js.map +1 -0
- package/dist/FormSubmitFlowDetail-IAHDJS6P.js +169 -0
- package/dist/FormSubmitFlowDetail-IAHDJS6P.js.map +1 -0
- package/dist/GovernanceAuthzExecFlowDetail-SQBGU5BX.js +166 -0
- package/dist/GovernanceAuthzExecFlowDetail-SQBGU5BX.js.map +1 -0
- package/dist/GovernanceAuthzGrantFlowDetail-DZPNLANT.js +88 -0
- package/dist/GovernanceAuthzGrantFlowDetail-DZPNLANT.js.map +1 -0
- package/dist/GovernanceAuthzRevokeFlowDetail-3JZ4IUJG.js +88 -0
- package/dist/GovernanceAuthzRevokeFlowDetail-3JZ4IUJG.js.map +1 -0
- package/dist/GovernanceChainVoteFlowDetail-475UDNG6.js +83 -0
- package/dist/GovernanceChainVoteFlowDetail-475UDNG6.js.map +1 -0
- package/dist/GovernanceConfigConfig-V3WM4WBP.js +30 -0
- package/dist/GovernanceConfigConfig-V3WM4WBP.js.map +1 -0
- package/dist/GovernanceConfigFlowDetail-SQ5PPDRX.js +267 -0
- package/dist/GovernanceConfigFlowDetail-SQ5PPDRX.js.map +1 -0
- package/dist/GovernanceContractExecuteFlowDetail-H2ZV6W2E.js +113 -0
- package/dist/GovernanceContractExecuteFlowDetail-H2ZV6W2E.js.map +1 -0
- package/dist/GovernanceContractInstantiateFlowDetail-YJJMGM54.js +144 -0
- package/dist/GovernanceContractInstantiateFlowDetail-YJJMGM54.js.map +1 -0
- package/dist/GovernanceContractManageCw20FlowDetail-OCBMW3YJ.js +72 -0
- package/dist/GovernanceContractManageCw20FlowDetail-OCBMW3YJ.js.map +1 -0
- package/dist/GovernanceContractMigrateFlowDetail-JDNIKTT3.js +104 -0
- package/dist/GovernanceContractMigrateFlowDetail-JDNIKTT3.js.map +1 -0
- package/dist/GovernanceContractUpdateAdminFlowDetail-SZBOAOCC.js +68 -0
- package/dist/GovernanceContractUpdateAdminFlowDetail-SZBOAOCC.js.map +1 -0
- package/dist/GovernanceCustomMessageFlowDetail-CXD4ZATO.js +78 -0
- package/dist/GovernanceCustomMessageFlowDetail-CXD4ZATO.js.map +1 -0
- package/dist/GovernanceDaoAcceptToMarketplaceFlowDetail-Q6ZBNY7Z.js +98 -0
- package/dist/GovernanceDaoAcceptToMarketplaceFlowDetail-Q6ZBNY7Z.js.map +1 -0
- package/dist/GovernanceDaoAdminExecFlowDetail-JAEAY2US.js +94 -0
- package/dist/GovernanceDaoAdminExecFlowDetail-JAEAY2US.js.map +1 -0
- package/dist/GovernanceDaoCreateEntityFlowDetail-7RVNTVAB.js +96 -0
- package/dist/GovernanceDaoCreateEntityFlowDetail-7RVNTVAB.js.map +1 -0
- package/dist/GovernanceDaoJoinFlowDetail-XYCTCNHO.js +68 -0
- package/dist/GovernanceDaoJoinFlowDetail-XYCTCNHO.js.map +1 -0
- package/dist/GovernanceDaoManageStorageFlowDetail-LMLYLYYC.js +93 -0
- package/dist/GovernanceDaoManageStorageFlowDetail-LMLYLYYC.js.map +1 -0
- package/dist/GovernanceDaoManageSubDaosFlowDetail-YUFQ67JN.js +84 -0
- package/dist/GovernanceDaoManageSubDaosFlowDetail-YUFQ67JN.js.map +1 -0
- package/dist/GovernanceDaoUpdateInfoFlowDetail-G5FIBY4L.js +104 -0
- package/dist/GovernanceDaoUpdateInfoFlowDetail-G5FIBY4L.js.map +1 -0
- package/dist/GovernanceMemberProposalConfig-IGPXEFDB.js +42 -0
- package/dist/GovernanceMemberProposalConfig-IGPXEFDB.js.map +1 -0
- package/dist/GovernanceMemberProposalFlowDetail-T3VURONF.js +240 -0
- package/dist/GovernanceMemberProposalFlowDetail-T3VURONF.js.map +1 -0
- package/dist/GovernanceNftBurnFlowDetail-AG4I2O7H.js +69 -0
- package/dist/GovernanceNftBurnFlowDetail-AG4I2O7H.js.map +1 -0
- package/dist/GovernanceNftManageCollectionsFlowDetail-UAAGO3Q6.js +71 -0
- package/dist/GovernanceNftManageCollectionsFlowDetail-UAAGO3Q6.js.map +1 -0
- package/dist/GovernanceNftTransferFlowDetail-KXM7DTOV.js +130 -0
- package/dist/GovernanceNftTransferFlowDetail-KXM7DTOV.js.map +1 -0
- package/dist/GovernanceSettingsProposalConfig-4SLJTBLW.js +42 -0
- package/dist/GovernanceSettingsProposalConfig-4SLJTBLW.js.map +1 -0
- package/dist/GovernanceSettingsProposalFlowDetail-VFZPSCLR.js +165 -0
- package/dist/GovernanceSettingsProposalFlowDetail-VFZPSCLR.js.map +1 -0
- package/dist/GovernanceStakingStakeFlowDetail-ULLJ7FLM.js +123 -0
- package/dist/GovernanceStakingStakeFlowDetail-ULLJ7FLM.js.map +1 -0
- package/dist/GovernanceStakingStakeToGroupFlowDetail-CSPKJA3H.js +84 -0
- package/dist/GovernanceStakingStakeToGroupFlowDetail-CSPKJA3H.js.map +1 -0
- package/dist/GovernanceSubmissionConfigProposalFlowDetail-MZCPSZF2.js +111 -0
- package/dist/GovernanceSubmissionConfigProposalFlowDetail-MZCPSZF2.js.map +1 -0
- package/dist/GovernanceTransactionMintFlowDetail-Y2WRAODH.js +66 -0
- package/dist/GovernanceTransactionMintFlowDetail-Y2WRAODH.js.map +1 -0
- package/dist/GovernanceTransactionPerformTokenSwapFlowDetail-GEK6PMMI.js +133 -0
- package/dist/GovernanceTransactionPerformTokenSwapFlowDetail-GEK6PMMI.js.map +1 -0
- package/dist/GovernanceTransactionSendFundsConfig-VBKMLSF3.js +42 -0
- package/dist/GovernanceTransactionSendFundsConfig-VBKMLSF3.js.map +1 -0
- package/dist/GovernanceTransactionSendFundsFlowDetail-5TZB64VL.js +182 -0
- package/dist/GovernanceTransactionSendFundsFlowDetail-5TZB64VL.js.map +1 -0
- package/dist/GovernanceTransactionSendGroupTokenFlowDetail-EGOWVZM2.js +155 -0
- package/dist/GovernanceTransactionSendGroupTokenFlowDetail-EGOWVZM2.js.map +1 -0
- package/dist/GovernanceTransactionWithdrawTokenSwapFlowDetail-6XWVO5O6.js +56 -0
- package/dist/GovernanceTransactionWithdrawTokenSwapFlowDetail-6XWVO5O6.js.map +1 -0
- package/dist/GovernanceValidatorActionsFlowDetail-ZMLPAFUB.js +117 -0
- package/dist/GovernanceValidatorActionsFlowDetail-ZMLPAFUB.js.map +1 -0
- package/dist/HarvestConfig-AIGOGBFR.js +56 -0
- package/dist/HarvestConfig-AIGOGBFR.js.map +1 -0
- package/dist/HarvestFlowDetail-X3RUH3X3.js +131 -0
- package/dist/HarvestFlowDetail-X3RUH3X3.js.map +1 -0
- package/dist/HttpRequestConfig-OQEJIIJY.js +194 -0
- package/dist/HttpRequestConfig-OQEJIIJY.js.map +1 -0
- package/dist/HttpRequestFlowDetail-JVLV533Z.js +116 -0
- package/dist/HttpRequestFlowDetail-JVLV533Z.js.map +1 -0
- package/dist/IdentityCreateConfig-ZBUOJ6AL.js +94 -0
- package/dist/IdentityCreateConfig-ZBUOJ6AL.js.map +1 -0
- package/dist/IdentityCreateFlowDetail-WGKO43IH.js +83 -0
- package/dist/IdentityCreateFlowDetail-WGKO43IH.js.map +1 -0
- package/dist/IidCreateConfig-RRV2DYXI.js +75 -0
- package/dist/IidCreateConfig-RRV2DYXI.js.map +1 -0
- package/dist/IidCreateFlowDetail-6M32S6XS.js +57 -0
- package/dist/IidCreateFlowDetail-6M32S6XS.js.map +1 -0
- package/dist/KycVerifyConfig-VCG65K5K.js +65 -0
- package/dist/KycVerifyConfig-VCG65K5K.js.map +1 -0
- package/dist/KycVerifyFlowDetail-EWOMXSD3.js +421 -0
- package/dist/KycVerifyFlowDetail-EWOMXSD3.js.map +1 -0
- package/dist/ListDomainFlowsConfig-3JZEPTOJ.js +37 -0
- package/dist/ListDomainFlowsConfig-3JZEPTOJ.js.map +1 -0
- package/dist/ListDomainFlowsFlowDetail-XX5AXDZZ.js +257 -0
- package/dist/ListDomainFlowsFlowDetail-XX5AXDZZ.js.map +1 -0
- package/dist/LoadBatchesConfig-IMODIWRT.js +38 -0
- package/dist/LoadBatchesConfig-IMODIWRT.js.map +1 -0
- package/dist/LoadBatchesFlowDetail-GB24T76O.js +101 -0
- package/dist/LoadBatchesFlowDetail-GB24T76O.js.map +1 -0
- package/dist/MatrixDmConfig-NBII27CS.js +120 -0
- package/dist/MatrixDmConfig-NBII27CS.js.map +1 -0
- package/dist/MatrixRegisterConfig-N2U4FBYF.js +62 -0
- package/dist/MatrixRegisterConfig-N2U4FBYF.js.map +1 -0
- package/dist/MatrixRegisterFlowDetail-D5YNL5QX.js +86 -0
- package/dist/MatrixRegisterFlowDetail-D5YNL5QX.js.map +1 -0
- package/dist/MemberMultiSelectConfig-E7WUB2WD.js +30 -0
- package/dist/MemberMultiSelectConfig-E7WUB2WD.js.map +1 -0
- package/dist/MemberMultiSelectFlowDetail-6C4ZMSDR.js +392 -0
- package/dist/MemberMultiSelectFlowDetail-6C4ZMSDR.js.map +1 -0
- package/dist/OracleConfig-R7TDTTKN.js +56 -0
- package/dist/OracleConfig-R7TDTTKN.js.map +1 -0
- package/dist/OracleConfigureOracleConfig-QFF74X3N.js +198 -0
- package/dist/OracleConfigureOracleConfig-QFF74X3N.js.map +1 -0
- package/dist/OracleConfigureOracleFlowDetail-73BHAN76.js +255 -0
- package/dist/OracleConfigureOracleFlowDetail-73BHAN76.js.map +1 -0
- package/dist/OracleContractConfig-PHY5L7W2.js +38 -0
- package/dist/OracleContractConfig-PHY5L7W2.js.map +1 -0
- package/dist/OracleContractFlowDetail-M3PM4AU4.js +78 -0
- package/dist/OracleContractFlowDetail-M3PM4AU4.js.map +1 -0
- package/dist/OracleDeployConfig-QBG76ATZ.js +10 -0
- package/dist/OracleDeployConfig-QBG76ATZ.js.map +1 -0
- package/dist/OracleDeployFlowDetail-WKTMD2AD.js +231 -0
- package/dist/OracleDeployFlowDetail-WKTMD2AD.js.map +1 -0
- package/dist/OracleDeploySetupConfig-75XPGFJQ.js +10 -0
- package/dist/OracleDeploySetupConfig-75XPGFJQ.js.map +1 -0
- package/dist/OracleDeploySetupFlowDetail-R3BQ7EAU.js +165 -0
- package/dist/OracleDeploySetupFlowDetail-R3BQ7EAU.js.map +1 -0
- package/dist/OracleDeployStartConfig-NA6GZ4VQ.js +10 -0
- package/dist/OracleDeployStartConfig-NA6GZ4VQ.js.map +1 -0
- package/dist/OracleDeployStartFlowDetail-EL3CMDMG.js +89 -0
- package/dist/OracleDeployStartFlowDetail-EL3CMDMG.js.map +1 -0
- package/dist/OracleFlowDetail-5JCJK3GH.js +76 -0
- package/dist/OracleFlowDetail-5JCJK3GH.js.map +1 -0
- package/dist/OraclePromptConfig-YBRESISH.js +39 -0
- package/dist/OraclePromptConfig-YBRESISH.js.map +1 -0
- package/dist/OraclePromptFlowDetail-O3XNK7HY.js +112 -0
- package/dist/OraclePromptFlowDetail-O3XNK7HY.js.map +1 -0
- package/dist/OracleStoreConfigConfig-TUZWTJMA.js +134 -0
- package/dist/OracleStoreConfigConfig-TUZWTJMA.js.map +1 -0
- package/dist/OracleStoreConfigFlowDetail-Q6AUUSUL.js +99 -0
- package/dist/OracleStoreConfigFlowDetail-Q6AUUSUL.js.map +1 -0
- package/dist/OracleStoreSecretsAndConfigConfig-SZPYEK7U.js +198 -0
- package/dist/OracleStoreSecretsAndConfigConfig-SZPYEK7U.js.map +1 -0
- package/dist/OracleStoreSecretsAndConfigFlowDetail-BFV2EHLT.js +220 -0
- package/dist/OracleStoreSecretsAndConfigFlowDetail-BFV2EHLT.js.map +1 -0
- package/dist/OracleStoreSecretsConfig-PQMF7LFT.js +191 -0
- package/dist/OracleStoreSecretsConfig-PQMF7LFT.js.map +1 -0
- package/dist/OracleStoreSecretsFlowDetail-DNNOPHVA.js +197 -0
- package/dist/OracleStoreSecretsFlowDetail-DNNOPHVA.js.map +1 -0
- package/dist/ProposalCreateConfig-U5IHZNT7.js +161 -0
- package/dist/ProposalCreateConfig-U5IHZNT7.js.map +1 -0
- package/dist/ProposalCreateFlowDetail-4VZZPAWH.js +235 -0
- package/dist/ProposalCreateFlowDetail-4VZZPAWH.js.map +1 -0
- package/dist/ProposalVoteConfig-MH4MU7SL.js +150 -0
- package/dist/ProposalVoteConfig-MH4MU7SL.js.map +1 -0
- package/dist/ProposalVoteFlowDetail-IJJ3OHAB.js +280 -0
- package/dist/ProposalVoteFlowDetail-IJJ3OHAB.js.map +1 -0
- package/dist/ProtocolSelectConfig-S5U3P6K7.js +48 -0
- package/dist/ProtocolSelectConfig-S5U3P6K7.js.map +1 -0
- package/dist/ProtocolSelectFlowDetail-XBSJIEIH.js +116 -0
- package/dist/ProtocolSelectFlowDetail-XBSJIEIH.js.map +1 -0
- package/dist/RetireConfig-MV37WWZ6.js +59 -0
- package/dist/RetireConfig-MV37WWZ6.js.map +1 -0
- package/dist/RetireFlowDetail-VZ5O4SXI.js +147 -0
- package/dist/RetireFlowDetail-VZ5O4SXI.js.map +1 -0
- package/dist/SandboxProvisionConfig-ZGG4IRHM.js +46 -0
- package/dist/SandboxProvisionConfig-ZGG4IRHM.js.map +1 -0
- package/dist/SandboxProvisionFlowDetail-RUY64INV.js +79 -0
- package/dist/SandboxProvisionFlowDetail-RUY64INV.js.map +1 -0
- package/dist/WalletFundConfig-CMM3EP3B.js +117 -0
- package/dist/WalletFundConfig-CMM3EP3B.js.map +1 -0
- package/dist/WalletFundFlowDetail-TXWCZA4K.js +279 -0
- package/dist/WalletFundFlowDetail-TXWCZA4K.js.map +1 -0
- package/dist/WalletGenerateAndFundConfig-364RSEND.js +10 -0
- package/dist/WalletGenerateAndFundConfig-364RSEND.js.map +1 -0
- package/dist/WalletGenerateAndFundFlowDetail-C2LZW3NO.js +54 -0
- package/dist/WalletGenerateAndFundFlowDetail-C2LZW3NO.js.map +1 -0
- package/dist/WalletGenerateConfig-YYLCS65G.js +10 -0
- package/dist/WalletGenerateConfig-YYLCS65G.js.map +1 -0
- package/dist/WalletGenerateFlowDetail-CQCNDGJA.js +53 -0
- package/dist/WalletGenerateFlowDetail-CQCNDGJA.js.map +1 -0
- package/dist/XeroContactCreateConfig-OWG5PA3B.js +102 -0
- package/dist/XeroContactCreateConfig-OWG5PA3B.js.map +1 -0
- package/dist/XeroContactCreateFlowDetail-6MAINCF6.js +127 -0
- package/dist/XeroContactCreateFlowDetail-6MAINCF6.js.map +1 -0
- package/dist/XeroInvoiceCreateConfig-O74RUSZM.js +403 -0
- package/dist/XeroInvoiceCreateConfig-O74RUSZM.js.map +1 -0
- package/dist/XeroInvoiceCreateFlowDetail-UL7KS6CZ.js +631 -0
- package/dist/XeroInvoiceCreateFlowDetail-UL7KS6CZ.js.map +1 -0
- package/dist/XeroInvoiceListConfig-UR3GONBJ.js +113 -0
- package/dist/XeroInvoiceListConfig-UR3GONBJ.js.map +1 -0
- package/dist/XeroInvoiceListFlowDetail-LYHODWH6.js +58 -0
- package/dist/XeroInvoiceListFlowDetail-LYHODWH6.js.map +1 -0
- package/dist/XeroPaymentCreateConfig-RPMAIK6E.js +116 -0
- package/dist/XeroPaymentCreateConfig-RPMAIK6E.js.map +1 -0
- package/dist/XeroPaymentCreateFlowDetail-CF35MVIM.js +573 -0
- package/dist/XeroPaymentCreateFlowDetail-CF35MVIM.js.map +1 -0
- package/dist/action-manifest.json +2091 -393
- package/dist/chunk-2GAYKKTL.js +9 -0
- package/dist/chunk-2GAYKKTL.js.map +1 -0
- package/dist/chunk-2WPEATI7.js +315 -0
- package/dist/chunk-2WPEATI7.js.map +1 -0
- package/dist/chunk-3O42FYT3.js +3333 -0
- package/dist/chunk-3O42FYT3.js.map +1 -0
- package/dist/chunk-3TUYY4HK.js +20 -0
- package/dist/chunk-3TUYY4HK.js.map +1 -0
- package/dist/chunk-3XSLBJYI.js +554 -0
- package/dist/chunk-3XSLBJYI.js.map +1 -0
- package/dist/chunk-4DGCCXD6.js +710 -0
- package/dist/chunk-4DGCCXD6.js.map +1 -0
- package/dist/chunk-4NAFQF6V.js +11 -0
- package/dist/chunk-4NAFQF6V.js.map +1 -0
- package/dist/chunk-4PONO4US.js +799 -0
- package/dist/chunk-4PONO4US.js.map +1 -0
- package/dist/chunk-4TMOIK5M.js +21 -0
- package/dist/chunk-4TMOIK5M.js.map +1 -0
- package/dist/chunk-5IH3VC5I.js +102 -0
- package/dist/chunk-5IH3VC5I.js.map +1 -0
- package/dist/chunk-5NTKDOP6.js +89 -0
- package/dist/chunk-5NTKDOP6.js.map +1 -0
- package/dist/chunk-5O2SFRGU.js +18 -0
- package/dist/chunk-5O2SFRGU.js.map +1 -0
- package/dist/chunk-632JLECF.js +55 -0
- package/dist/chunk-632JLECF.js.map +1 -0
- package/dist/chunk-676HDB7K.js +95 -0
- package/dist/chunk-676HDB7K.js.map +1 -0
- package/dist/chunk-6ESTNTSH.js +223 -0
- package/dist/chunk-6ESTNTSH.js.map +1 -0
- package/dist/chunk-6GKJR52N.js +15 -0
- package/dist/chunk-6GKJR52N.js.map +1 -0
- package/dist/chunk-6L4ZIKYU.js +23 -0
- package/dist/chunk-6L4ZIKYU.js.map +1 -0
- package/dist/chunk-76YX5R4L.js +11 -0
- package/dist/chunk-76YX5R4L.js.map +1 -0
- package/dist/chunk-7J3GFMN3.js +32 -0
- package/dist/chunk-7J3GFMN3.js.map +1 -0
- package/dist/chunk-7LSARC2G.js +102 -0
- package/dist/chunk-7LSARC2G.js.map +1 -0
- package/dist/chunk-7W7UUUIE.js +609 -0
- package/dist/chunk-7W7UUUIE.js.map +1 -0
- package/dist/chunk-7ZLW7H37.js +21 -0
- package/dist/chunk-7ZLW7H37.js.map +1 -0
- package/dist/chunk-AAZHI22G.js +18 -0
- package/dist/chunk-AAZHI22G.js.map +1 -0
- package/dist/chunk-ACNE455I.js +76 -0
- package/dist/chunk-ACNE455I.js.map +1 -0
- package/dist/chunk-BKLSSLPZ.js +27 -0
- package/dist/chunk-BKLSSLPZ.js.map +1 -0
- package/dist/chunk-BZ7UPUTY.js +417 -0
- package/dist/chunk-BZ7UPUTY.js.map +1 -0
- package/dist/chunk-CGFAICUE.js +28 -0
- package/dist/chunk-CGFAICUE.js.map +1 -0
- package/dist/chunk-CMCEWQ3C.js +19 -0
- package/dist/chunk-CMCEWQ3C.js.map +1 -0
- package/dist/chunk-CP4UV436.js +41 -0
- package/dist/chunk-CP4UV436.js.map +1 -0
- package/dist/chunk-D2CQPNQG.js +27508 -0
- package/dist/chunk-D2CQPNQG.js.map +1 -0
- package/dist/chunk-DIQRZP7Z.js +51 -0
- package/dist/chunk-DIQRZP7Z.js.map +1 -0
- package/dist/chunk-EBFFDDAS.js +13 -0
- package/dist/chunk-EBFFDDAS.js.map +1 -0
- package/dist/chunk-EGVS23DR.js +85 -0
- package/dist/chunk-EGVS23DR.js.map +1 -0
- package/dist/chunk-EKBQ7K4N.js +15 -0
- package/dist/chunk-EKBQ7K4N.js.map +1 -0
- package/dist/chunk-EKQCZRAN.js +24 -0
- package/dist/chunk-EKQCZRAN.js.map +1 -0
- package/dist/chunk-EYKZIZ5J.js +48 -0
- package/dist/chunk-EYKZIZ5J.js.map +1 -0
- package/dist/{chunk-NEOPTPDF.js → chunk-F4PTFXZH.js} +11554 -22046
- package/dist/chunk-F4PTFXZH.js.map +1 -0
- package/dist/chunk-FFYZXA75.js +58 -0
- package/dist/chunk-FFYZXA75.js.map +1 -0
- package/dist/chunk-GFGDHPZ2.js +22 -0
- package/dist/chunk-GFGDHPZ2.js.map +1 -0
- package/dist/chunk-GR3CDFID.js +18 -0
- package/dist/chunk-GR3CDFID.js.map +1 -0
- package/dist/chunk-GR4SIU32.js +104 -0
- package/dist/chunk-GR4SIU32.js.map +1 -0
- package/dist/chunk-H5E46IIS.js +18 -0
- package/dist/chunk-H5E46IIS.js.map +1 -0
- package/dist/chunk-HFHVAMZL.js +22 -0
- package/dist/chunk-HFHVAMZL.js.map +1 -0
- package/dist/chunk-HRRI4BLF.js +4456 -0
- package/dist/chunk-HRRI4BLF.js.map +1 -0
- package/dist/chunk-HT6L7A5M.js +12 -0
- package/dist/chunk-HT6L7A5M.js.map +1 -0
- package/dist/chunk-I2FPFISM.js +301 -0
- package/dist/chunk-I2FPFISM.js.map +1 -0
- package/dist/chunk-IADAQJDH.js +28 -0
- package/dist/chunk-IADAQJDH.js.map +1 -0
- package/dist/chunk-IBOBCMQQ.js +99 -0
- package/dist/chunk-IBOBCMQQ.js.map +1 -0
- package/dist/chunk-IFWKRCFF.js +56 -0
- package/dist/chunk-IFWKRCFF.js.map +1 -0
- package/dist/chunk-IH4T7V4C.js +40 -0
- package/dist/chunk-IH4T7V4C.js.map +1 -0
- package/dist/chunk-IIIZZ4E4.js +1679 -0
- package/dist/chunk-IIIZZ4E4.js.map +1 -0
- package/dist/chunk-ILSFU3WD.js +83 -0
- package/dist/chunk-ILSFU3WD.js.map +1 -0
- package/dist/chunk-IX3VBV3L.js +43 -0
- package/dist/chunk-IX3VBV3L.js.map +1 -0
- package/dist/chunk-JBBFSORW.js +846 -0
- package/dist/chunk-JBBFSORW.js.map +1 -0
- package/dist/chunk-JIDTNKKL.js +1183 -0
- package/dist/chunk-JIDTNKKL.js.map +1 -0
- package/dist/chunk-JSPE6NGZ.js +22 -0
- package/dist/chunk-JSPE6NGZ.js.map +1 -0
- package/dist/chunk-JVROGQ7Q.js +150 -0
- package/dist/chunk-JVROGQ7Q.js.map +1 -0
- package/dist/chunk-K4WUMWNJ.js +32 -0
- package/dist/chunk-K4WUMWNJ.js.map +1 -0
- package/dist/chunk-K74XQ4Q5.js +11 -0
- package/dist/chunk-K74XQ4Q5.js.map +1 -0
- package/dist/chunk-KLLMJ4U3.js +22 -0
- package/dist/chunk-KLLMJ4U3.js.map +1 -0
- package/dist/chunk-LTKVCJ2E.js +27 -0
- package/dist/chunk-LTKVCJ2E.js.map +1 -0
- package/dist/chunk-M36DJTFZ.js +34 -0
- package/dist/chunk-M36DJTFZ.js.map +1 -0
- package/dist/chunk-MHM52LCJ.js +154 -0
- package/dist/chunk-MHM52LCJ.js.map +1 -0
- package/dist/chunk-MQCDMHRZ.js +59 -0
- package/dist/chunk-MQCDMHRZ.js.map +1 -0
- package/dist/chunk-N3ORMGAI.js +348 -0
- package/dist/chunk-N3ORMGAI.js.map +1 -0
- package/dist/chunk-NCSGIRRQ.js +28 -0
- package/dist/chunk-NCSGIRRQ.js.map +1 -0
- package/dist/chunk-NIXT2SBH.js +1423 -0
- package/dist/chunk-NIXT2SBH.js.map +1 -0
- package/dist/chunk-NJAII6CO.js +148 -0
- package/dist/chunk-NJAII6CO.js.map +1 -0
- package/dist/chunk-NKE4TL43.js +92 -0
- package/dist/chunk-NKE4TL43.js.map +1 -0
- package/dist/chunk-NZ7AXA7B.js +1 -0
- package/dist/chunk-NZ7AXA7B.js.map +1 -0
- package/dist/chunk-OCAYEGI2.js +26 -0
- package/dist/chunk-OCAYEGI2.js.map +1 -0
- package/dist/chunk-OMLI45ER.js +90 -0
- package/dist/chunk-OMLI45ER.js.map +1 -0
- package/dist/chunk-P7OBLJAG.js +88 -0
- package/dist/chunk-P7OBLJAG.js.map +1 -0
- package/dist/chunk-PAY3CBWL.js +2321 -0
- package/dist/chunk-PAY3CBWL.js.map +1 -0
- package/dist/chunk-PFF6VY35.js +257 -0
- package/dist/chunk-PFF6VY35.js.map +1 -0
- package/dist/chunk-PYNDJDWZ.js +1758 -0
- package/dist/chunk-PYNDJDWZ.js.map +1 -0
- package/dist/chunk-QDQ6UMMN.js +53 -0
- package/dist/chunk-QDQ6UMMN.js.map +1 -0
- package/dist/chunk-QGT3G2XG.js +24 -0
- package/dist/chunk-QGT3G2XG.js.map +1 -0
- package/dist/chunk-QZYCJ2GZ.js +55 -0
- package/dist/chunk-QZYCJ2GZ.js.map +1 -0
- package/dist/chunk-REZ7RFSA.js +124 -0
- package/dist/chunk-REZ7RFSA.js.map +1 -0
- package/dist/chunk-RRYBAE6E.js +2449 -0
- package/dist/chunk-RRYBAE6E.js.map +1 -0
- package/dist/chunk-RWUZOB62.js +34 -0
- package/dist/chunk-RWUZOB62.js.map +1 -0
- package/dist/chunk-SB5UCPZH.js +116 -0
- package/dist/chunk-SB5UCPZH.js.map +1 -0
- package/dist/chunk-SEJJ7CRI.js +99 -0
- package/dist/chunk-SEJJ7CRI.js.map +1 -0
- package/dist/chunk-SHBFGRPV.js +45 -0
- package/dist/chunk-SHBFGRPV.js.map +1 -0
- package/dist/chunk-SOFJ4GC5.js +45 -0
- package/dist/chunk-SOFJ4GC5.js.map +1 -0
- package/dist/chunk-STH2HPZK.js +44 -0
- package/dist/chunk-STH2HPZK.js.map +1 -0
- package/dist/chunk-TK3JNKME.js +28 -0
- package/dist/chunk-TK3JNKME.js.map +1 -0
- package/dist/chunk-TMONHFE3.js +46 -0
- package/dist/chunk-TMONHFE3.js.map +1 -0
- package/dist/chunk-TR4KO3AG.js +44 -0
- package/dist/chunk-TR4KO3AG.js.map +1 -0
- package/dist/chunk-TS2LNBF2.js +68 -0
- package/dist/chunk-TS2LNBF2.js.map +1 -0
- package/dist/chunk-UZUMBFPP.js +26 -0
- package/dist/chunk-UZUMBFPP.js.map +1 -0
- package/dist/chunk-VRZ5LMOW.js +176 -0
- package/dist/chunk-VRZ5LMOW.js.map +1 -0
- package/dist/chunk-WLGGY6Z6.js +75 -0
- package/dist/chunk-WLGGY6Z6.js.map +1 -0
- package/dist/chunk-WO7V6ZNC.js +11 -0
- package/dist/chunk-WO7V6ZNC.js.map +1 -0
- package/dist/chunk-WXSENSRP.js +64 -0
- package/dist/chunk-WXSENSRP.js.map +1 -0
- package/dist/chunk-XEKBZ2SA.js +19 -0
- package/dist/chunk-XEKBZ2SA.js.map +1 -0
- package/dist/chunk-XPBKU3JX.js +61 -0
- package/dist/chunk-XPBKU3JX.js.map +1 -0
- package/dist/chunk-XRYXBXWH.js +24 -0
- package/dist/chunk-XRYXBXWH.js.map +1 -0
- package/dist/chunk-XVA7QRVH.js +22 -0
- package/dist/chunk-XVA7QRVH.js.map +1 -0
- package/dist/chunk-YCTHHBSS.js +37 -0
- package/dist/chunk-YCTHHBSS.js.map +1 -0
- package/dist/chunk-YHPWD5NE.js +70 -0
- package/dist/chunk-YHPWD5NE.js.map +1 -0
- package/dist/chunk-YLNEKJQ5.js +126 -0
- package/dist/chunk-YLNEKJQ5.js.map +1 -0
- package/dist/chunk-YN4CEKCF.js +73 -0
- package/dist/chunk-YN4CEKCF.js.map +1 -0
- package/dist/chunk-YYNMESIF.js +17 -0
- package/dist/chunk-YYNMESIF.js.map +1 -0
- package/dist/chunk-Z6PRMCV6.js +1 -0
- package/dist/chunk-Z6PRMCV6.js.map +1 -0
- package/dist/chunk-ZDNW6VQG.js +11 -0
- package/dist/chunk-ZDNW6VQG.js.map +1 -0
- package/dist/chunk-ZP4D73DO.js +36 -0
- package/dist/chunk-ZP4D73DO.js.map +1 -0
- package/dist/chunk-ZUATADUV.js +26 -0
- package/dist/chunk-ZUATADUV.js.map +1 -0
- package/dist/{connections-1NtNQrsY.d.ts → connections-CEcurtWI.d.ts} +74 -9
- package/dist/core/index.cjs +14041 -6973
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +422 -138
- package/dist/core/index.js +425 -183
- package/dist/core/index.js.map +1 -1
- package/dist/flow-vnext/index.cjs +2842 -0
- package/dist/flow-vnext/index.cjs.map +1 -0
- package/dist/flow-vnext/index.d.ts +3 -0
- package/dist/flow-vnext/index.js +119 -0
- package/dist/flow-vnext/index.js.map +1 -0
- package/dist/{graphql-client-Bn0tN049.d.ts → graphql-client-B2tREsx6.d.ts} +3 -1
- package/dist/index-b9xxXGFs.d.ts +1230 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +202 -37
- package/dist/index.js.map +1 -1
- package/dist/legacy-BpgIqaQ5.d.ts +14 -0
- package/dist/mantine/index.d.ts +7 -4
- package/dist/mantine/index.js +84 -30
- package/dist/mantine/index.js.map +1 -1
- package/dist/{runtime-BFwvCQDF.d.ts → types-Dqk5MTfW.d.ts} +6096 -5386
- package/package.json +12 -2
- package/dist/chunk-5JF23UP3.js +0 -59687
- package/dist/chunk-5JF23UP3.js.map +0 -1
- package/dist/chunk-A4CWC4AG.js +0 -374
- package/dist/chunk-A4CWC4AG.js.map +0 -1
- package/dist/chunk-NEOPTPDF.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mantine/blocks/action/actionTypes/_shared/dataExport/DownloadCsvButton.tsx","../src/mantine/utils/bidStatus.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/buildBidRows.ts","../src/core/utils/zip.ts","../src/mantine/blocks/action/actionTypes/_shared/media/collectAttachments.ts","../src/mantine/blocks/action/actionTypes/_shared/media/mediaNaming.ts","../src/mantine/blocks/action/actionTypes/_shared/media/collectMedia.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/buildExportBundle.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/baseClaimSubmitters.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/buildClaimRows.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/buildGranteeRows.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/buildCollectionMembersSections.ts","../src/mantine/blocks/action/actionTypes/_shared/dataExport/exportFileNames.ts","../src/mantine/components/MediaPreviewModal.tsx","../src/mantine/components/mediaPreviewKind.ts"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { ActionIcon } from '@mantine/core';\nimport { IconDownload, IconFileZip, type Icon as TablerIcon } from '@tabler/icons-react';\n\n// IXO-4066 — shared \"download data\" affordances for flow-detail panels. Both\n// own the transient busy state so callers can pass an async assembly step\n// (fetching per-claim contents, downloading media) without wiring their own\n// loading flag.\n\nconst DownloadIconButton: React.FC<{\n onDownload: () => Promise<void> | void;\n disabled?: boolean;\n label: string;\n Icon: TablerIcon;\n onError?: (message: string) => void;\n}> = ({ onDownload, disabled, label, Icon, onError }) => {\n const [busy, setBusy] = useState(false);\n\n // An export can fail for reasons the user needs to hear: the archive exceeds\n // the ZIP limits, a claim's contents could not be fetched, the media gateway\n // is down. Without this catch the rejection escapes as an unhandled promise —\n // the spinner stops and nothing else happens, which reads as \"the button is\n // broken\" rather than \"here is what went wrong\".\n const handleClick = useCallback(async () => {\n setBusy(true);\n try {\n await onDownload();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'The download failed.';\n console.error(`[dataExport] ${label} failed`, err);\n onError?.(message);\n } finally {\n setBusy(false);\n }\n }, [onDownload, onError, label]);\n\n return (\n <ActionIcon variant=\"subtle\" color=\"gray\" size=\"sm\" aria-label={label} title={label} loading={busy} disabled={disabled} onClick={handleClick}>\n <Icon size={16} />\n </ActionIcon>\n );\n};\n\nexport const DownloadCsvButton: React.FC<{\n onDownload: () => Promise<void> | void;\n disabled?: boolean;\n label?: string;\n /** Surfaces a failed export. Wire it to the panel's error alert. */\n onError?: (message: string) => void;\n}> = ({ onDownload, disabled, label = 'Download CSV', onError }) => (\n <DownloadIconButton onDownload={onDownload} disabled={disabled} label={label} Icon={IconDownload} onError={onError} />\n);\n\n/** CSV + submitted media, as a single ZIP. */\nexport const DownloadZipButton: React.FC<{\n onDownload: () => Promise<void> | void;\n disabled?: boolean;\n label?: string;\n /** Surfaces a failed export. Wire it to the panel's error alert. */\n onError?: (message: string) => void;\n}> = ({ onDownload, disabled, label = 'Download CSV + media (ZIP)', onError }) => (\n <DownloadIconButton onDownload={onDownload} disabled={disabled} label={label} Icon={IconFileZip} onError={onError} />\n);\n\nexport default DownloadCsvButton;\n","import type { Bid } from '@/mantine/context/BlocknoteContext';\nimport type { CollectionGrantee } from '@/core/lib/actionRegistry/actions/collectionUsers/types';\n\n// Single source of truth for \"what happened to this bid\", mirroring\n// `claimStatus.ts` for claims. Both the list/detail UI and the CSV exports read\n// it, so a row can never disagree with the badge above it.\n//\n// Unlike a claim, a bid carries no evaluation record of its own: approving one\n// issues an authz grant, rejecting one leaves no on-chain trace. Status is\n// therefore reconstructed, most authoritative signal first:\n//\n// 1. a decision taken in this session (the caller's `evaluatedByBidId` record)\n// 2. an explicit status on the bid payload, when the host surfaces one\n// 3. a live grant for the bidder's address in the bid's role → approved\n// 4. otherwise pending\n//\n// Step 3 is role-aware: a `submit` grant must not mark an evaluator bid\n// approved. It also cannot distinguish \"rejected\" from \"not yet decided\" — with\n// no grant and no record, `pending` is the honest answer, and `evaluatedByBidId`\n// is what upgrades it.\n\nexport type BidStatusKey = 'approved' | 'rejected' | 'pending';\n\nexport type BidStatusInfo = {\n key: BidStatusKey;\n label: string;\n color: string;\n isTerminal: boolean;\n /** Which of the rules above decided it — exported so a CSV can be audited. */\n source: 'session' | 'payload' | 'grant' | 'default';\n};\n\ntype BidWithStatus = Bid & { status?: string | null };\n\nconst STATUS_META: Record<BidStatusKey, Omit<BidStatusInfo, 'key' | 'source'>> = {\n approved: { label: 'Approved', color: 'green', isTerminal: true },\n rejected: { label: 'Rejected', color: 'red', isTerminal: true },\n pending: { label: 'Pending', color: 'yellow', isTerminal: false },\n};\n\nfunction parseStatusKey(value: unknown): BidStatusKey | null {\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase();\n if (normalized === 'approved' || normalized === 'approve') return 'approved';\n if (normalized === 'rejected' || normalized === 'reject') return 'rejected';\n if (normalized === 'pending') return 'pending';\n return null;\n}\n\n/** `evaluation_agent` / `ea` bids are satisfied by an `evaluate` grant; everything else by `submit`. */\nexport function granteeRoleForBid(bid: Pick<Bid, 'role'>): 'evaluate' | 'submit' {\n const role = String(bid?.role || '').toLowerCase();\n return role === 'evaluation_agent' || role === 'ea' ? 'evaluate' : 'submit';\n}\n\nexport interface BidStatusContext {\n /** Live authz grants on the collection, used to detect an earlier approval. */\n grantees?: CollectionGrantee[];\n /** Decisions taken in this session, keyed by bid id. */\n evaluatedByBidId?: Record<string, 'approved' | 'rejected'>;\n}\n\nexport function getBidStatusInfo(bid: BidWithStatus, context: BidStatusContext = {}): BidStatusInfo {\n const asInfo = (key: BidStatusKey, source: BidStatusInfo['source']): BidStatusInfo => ({ key, ...STATUS_META[key], source });\n\n const session = context.evaluatedByBidId?.[bid?.id ?? ''];\n if (session) return asInfo(session, 'session');\n\n const direct = parseStatusKey(bid?.status);\n if (direct) return asInfo(direct, 'payload');\n\n try {\n const data = typeof bid?.data === 'string' ? JSON.parse(bid.data) : bid?.data;\n const embedded = parseStatusKey((data as { status?: unknown } | null)?.status);\n if (embedded) return asInfo(embedded, 'payload');\n } catch {\n // A bid whose data isn't JSON simply carries no embedded status.\n }\n\n const grantees = context.grantees;\n if (grantees?.length) {\n const wanted = granteeRoleForBid(bid);\n if (grantees.some((grantee) => grantee.address === bid?.address && grantee.role === wanted)) {\n return asInfo('approved', 'grant');\n }\n }\n\n return asInfo('pending', 'default');\n}\n\n/** Grants held by `address`, rendered as `role (quota N)` — the CSV's grant-state cell. */\nexport function describeGrantState(address: string, grantees: CollectionGrantee[]): string {\n const grants = grantees.filter((grantee) => grantee.address === address);\n if (grants.length === 0) return 'none';\n return grants.map((grant) => `${grant.role} (quota ${grant.agentQuota ?? '—'})`).join('; ');\n}\n\n// A bidder's position in the collection's lifecycle. Verified against BeGreen\n// collection 229 on mainnet (2026-08-07): 33 open, 17 decided, and of those 17\n// — 11 granted, 2 granted in another role, 4 lapsed. Those 4 are the reason\n// this exists: they submitted, were approved, and hold no grant today, so they\n// appear in neither the bids list (the service drops decided bids) nor the\n// grantee list. Nothing in the product surfaced them before.\nexport type BidGrantState =\n /** Awaiting a decision. */\n | 'open'\n /** Decided, and a live grant matches the bid's role. */\n | 'granted'\n /** Decided, and a grant exists on this collection but in a different role. */\n | 'granted_other_role'\n /** Decided, and no grant on this collection — revoked, expired, or rejected. */\n | 'lapsed';\n\nexport const BID_GRANT_STATE_LABELS: Record<BidGrantState, string> = {\n open: 'Open — awaiting decision',\n granted: 'Granted — active',\n granted_other_role: 'Granted — different role',\n lapsed: 'No active grant',\n};\n\nexport function classifyBidGrantState(bid: BidWithStatus, grantees: CollectionGrantee[], context: BidStatusContext = {}): BidGrantState {\n // \"Decided\" is a property of the record, not of the grant: a bid the service\n // still returns is by definition undecided, whatever grants the account holds.\n const decided = getBidStatusInfo(bid, { ...context, grantees: undefined }).key !== 'pending' || !!(bid as { decided?: boolean }).decided;\n if (!decided) return 'open';\n\n const wanted = granteeRoleForBid(bid);\n const onCollection = grantees.filter((grantee) => grantee.address === bid.address);\n if (onCollection.some((grantee) => grantee.role === wanted)) return 'granted';\n if (onCollection.length > 0) return 'granted_other_role';\n return 'lapsed';\n}\n","import type { Bid } from '@/mantine/context/BlocknoteContext';\nimport type { CollectionGrantee } from '@/core/lib/actionRegistry/actions/collectionUsers/types';\nimport { describeGrantState, getBidStatusInfo, classifyBidGrantState, BID_GRANT_STATE_LABELS, type BidStatusContext } from '@/mantine/utils/bidStatus';\n\n// IXO-4066 — rows for the \"all submitted bids + current grant state\" CSV\n// (Collection Users and Evaluate Bid blocks). Fixed chain/bid columns first;\n// the bid's submitted survey answers are spread after so downloadArrayAsCsv\n// unions them into per-question columns.\n//\n// `status` comes from the shared `getBidStatusInfo`, so an exported row agrees\n// with the badge in the list. `statusSource` records which signal decided it —\n// a bid marked approved because a matching grant exists is a weaker statement\n// than one decided in-session, and the reader should be able to tell.\n\nexport interface BuildBidRowsOptions extends BidStatusContext {\n /** Display name per bidder DID, when Matrix profiles have been resolved. */\n namesByDid?: Record<string, string>;\n /**\n * Per-bid replacement for the spread answers, e.g. with file values rewritten\n * to their paths inside an accompanying media ZIP.\n */\n answersByBidId?: Record<string, Record<string, unknown>>;\n}\n\n/** A bid's `data` is a JSON string of survey answers; fall back to the raw value. */\nexport function bidAnswers(bid: Bid): Record<string, unknown> {\n try {\n const parsed = typeof bid.data === 'string' ? JSON.parse(bid.data) : bid.data;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return { data: bid.data };\n }\n return {};\n}\n\nexport function buildBidRows(bids: Bid[], grantees: CollectionGrantee[], options: BuildBidRowsOptions = {}): Record<string, unknown>[] {\n const statusContext: BidStatusContext = { grantees, evaluatedByBidId: options.evaluatedByBidId };\n\n return bids.map((bid) => {\n const answers = options.answersByBidId?.[bid.id] ?? bidAnswers(bid);\n const status = getBidStatusInfo(bid, statusContext);\n\n const grantState = classifyBidGrantState(bid, grantees, statusContext);\n\n return {\n bidId: bid.id,\n name: options.namesByDid?.[bid.did] || '',\n did: bid.did,\n address: bid.address,\n role: bid.role,\n created: bid.created,\n status: status.key,\n statusSource: status.source,\n // The column that answers \"did anything come of this bid?\". `lapsed`\n // means the account submitted, was decided, and holds no grant today —\n // a population that appears in neither the bids list nor the grant list.\n bidState: grantState,\n bidStateNote: BID_GRANT_STATE_LABELS[grantState],\n activeGrant: grantState === 'granted' || grantState === 'granted_other_role' ? 'yes' : 'no',\n grantDetail: describeGrantState(bid.address, grantees),\n ...answers,\n };\n });\n}\n","// Minimal, dependency-free ZIP writer used by the flow-detail data exports.\n//\n// Entries are stored uncompressed (method 0 / STORE). Every payload we archive\n// is either a small CSV or already-compressed media (JPEG/PNG/PDF), so DEFLATE\n// would buy almost nothing while forcing a compression dependency into a\n// published library. Filenames are written with the UTF-8 flag set (bit 11).\n//\n// Limits: 65,535 entries and a 4 GiB total archive (no ZIP64). Both are checked\n// and throw a clear error rather than emitting a silently corrupt archive.\n\nconst MAX_ENTRIES = 0xffff;\nconst MAX_ARCHIVE_BYTES = 0xffffffff;\n\nexport interface ZipEntry {\n /** Path inside the archive. Forward slashes only; must not start with `/`. */\n path: string;\n data: Uint8Array | string;\n}\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i += 1) {\n let c = i;\n for (let k = 0; k < 8; k += 1) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[i] = c >>> 0;\n }\n return table;\n})();\n\nexport function crc32(bytes: Uint8Array): number {\n let c = 0xffffffff;\n for (let i = 0; i < bytes.length; i += 1) c = CRC_TABLE[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\n/** MS-DOS packed date/time, the only timestamp a base ZIP header carries. */\nfunction dosDateTime(date: Date): { time: number; date: number } {\n const year = Math.max(1980, date.getFullYear());\n return {\n time: ((date.getHours() & 0x1f) << 11) | ((date.getMinutes() & 0x3f) << 5) | ((date.getSeconds() >> 1) & 0x1f),\n date: (((year - 1980) & 0x7f) << 9) | (((date.getMonth() + 1) & 0x0f) << 5) | (date.getDate() & 0x1f),\n };\n}\n\nfunction toBytes(data: Uint8Array | string, encoder: TextEncoder): Uint8Array {\n return typeof data === 'string' ? encoder.encode(data) : data;\n}\n\n/**\n * Builds a ZIP archive from `entries`. Duplicate paths are rejected — an\n * archive with two identical paths extracts unpredictably, and for these\n * exports a collision means the naming convention lost information.\n */\nexport function createZipBlob(entries: ZipEntry[], options?: { modifiedAt?: Date }): Blob {\n if (entries.length > MAX_ENTRIES) {\n throw new Error(`ZIP archives are limited to ${MAX_ENTRIES} entries (got ${entries.length}).`);\n }\n\n const encoder = new TextEncoder();\n const { time, date } = dosDateTime(options?.modifiedAt ?? new Date());\n\n const seen = new Set<string>();\n const prepared = entries.map((entry) => {\n const path = entry.path.replace(/^\\/+/, '');\n if (seen.has(path)) throw new Error(`Duplicate ZIP entry path: ${path}`);\n seen.add(path);\n const nameBytes = encoder.encode(path);\n const dataBytes = toBytes(entry.data, encoder);\n return { nameBytes, dataBytes, crc: crc32(dataBytes), offset: 0 };\n });\n\n const localSize = prepared.reduce((sum, e) => sum + 30 + e.nameBytes.length + e.dataBytes.length, 0);\n const centralSize = prepared.reduce((sum, e) => sum + 46 + e.nameBytes.length, 0);\n const total = localSize + centralSize + 22;\n if (total > MAX_ARCHIVE_BYTES) {\n throw new Error(`Archive would be ${Math.round(total / 1024 / 1024)} MB, over the 4 GB ZIP limit. Export a smaller selection.`);\n }\n\n const buffer = new Uint8Array(total);\n const view = new DataView(buffer.buffer);\n let cursor = 0;\n\n const u16 = (value: number) => {\n view.setUint16(cursor, value, true);\n cursor += 2;\n };\n const u32 = (value: number) => {\n view.setUint32(cursor, value >>> 0, true);\n cursor += 4;\n };\n const raw = (bytes: Uint8Array) => {\n buffer.set(bytes, cursor);\n cursor += bytes.length;\n };\n\n for (const entry of prepared) {\n entry.offset = cursor;\n u32(0x04034b50); // local file header signature\n u16(20); // version needed\n u16(0x0800); // general purpose flags — bit 11: UTF-8 filename\n u16(0); // method: STORE\n u16(time);\n u16(date);\n u32(entry.crc);\n u32(entry.dataBytes.length);\n u32(entry.dataBytes.length);\n u16(entry.nameBytes.length);\n u16(0); // extra field length\n raw(entry.nameBytes);\n raw(entry.dataBytes);\n }\n\n const centralStart = cursor;\n for (const entry of prepared) {\n u32(0x02014b50); // central directory header signature\n u16(20); // version made by\n u16(20); // version needed\n u16(0x0800);\n u16(0);\n u16(time);\n u16(date);\n u32(entry.crc);\n u32(entry.dataBytes.length);\n u32(entry.dataBytes.length);\n u16(entry.nameBytes.length);\n u16(0); // extra\n u16(0); // comment\n u16(0); // disk number start\n u16(0); // internal attributes\n u32(0); // external attributes\n u32(entry.offset);\n raw(entry.nameBytes);\n }\n\n // Snapshot the directory's extent BEFORE writing the EOCD: `cursor` is\n // advanced by every field below, so computing the size inline would measure\n // the directory plus the EOCD fields already written and overstate it by 12.\n // A too-large size makes strict readers (Python's `zipfile`) locate the\n // directory 12 bytes early and reject the archive outright, while lenient\n // ones (Info-ZIP, .NET) scan for the signature and open it fine — so the\n // damage is invisible unless you test with a strict reader.\n const centralEnd = cursor;\n\n u32(0x06054b50); // end of central directory\n u16(0); // this disk\n u16(0); // disk with central directory\n u16(prepared.length);\n u16(prepared.length);\n u32(centralEnd - centralStart);\n u32(centralStart);\n u16(0); // comment length\n\n return new Blob([buffer], { type: 'application/zip' });\n}\n","import { resolveClaimFileRef } from './resolveClaimFileRef';\n\n/**\n * Collects the attachment tiles for a claim's media grid (ClaimAttachments) from a claim's\n * credential subject.\n *\n * Hardened against the saved-claim payload shape `{ ...answers, credentials: <signed VC> }`,\n * which embeds every answer TWICE (top level + `credentials.credentialSubject`) and carries a\n * JSON-LD `@context` of https URLs — naïve walking rendered each file twice plus a phantom\n * \"context\" tile (IXO-4566):\n * - results are DEDUPED by resolved content URL, so a file reachable through two paths shows once;\n * - credential-envelope keys are never descended into or collected;\n * - BARE STRINGS only count as attachments under a known file-question key (a URL typed into a\n * text answer, or a JSON-LD context entry, is data — not an attachment). Wrapper objects\n * (`{name, type, content}` — the shape SurveyJS actually stores for file questions) are\n * collected under any key at any depth.\n */\n\nexport interface CollectedAttachment {\n name: string;\n type: string;\n content: string;\n label: string;\n}\n\n/** The slice of a SurveyJS model this collection needs (kept structural for testability). */\nexport interface SurveyModelLike {\n getAllQuestions: (visibleOnly?: boolean, includeDesignTime?: boolean, includeNested?: boolean) => Array<{ name: string; title?: string; getType?: () => string }>;\n}\n\n/** Credential-envelope keys: metadata of the signed VC wrapper, never claim answers. */\nexport const ENVELOPE_KEYS: ReadonlySet<string> = new Set(['@context', 'credentials', 'proof', 'issuer', 'issuanceDate', 'expirationDate']);\n\nfunction toAttachment(raw: any, allowBareString: boolean): { name: string; type: string; content: string } | null {\n if (!raw) return null;\n\n if (typeof raw === 'object' && typeof (raw as any).content === 'string') {\n const obj = raw as any;\n const resolved = resolveClaimFileRef(obj.content);\n if (!resolved) return null;\n return {\n name: typeof obj.name === 'string' ? obj.name : 'file',\n type: typeof obj.type === 'string' ? obj.type : '',\n content: resolved,\n };\n }\n\n if (typeof raw === 'string' && allowBareString) {\n const resolved = resolveClaimFileRef(raw);\n if (!resolved) return null;\n const name = resolved.split('/').pop()?.split('?')[0] || 'file';\n return { name, type: '', content: resolved };\n }\n\n return null;\n}\n\nexport function collectClaimAttachments(credentialSubject: any, surveyModel: SurveyModelLike | null): CollectedAttachment[] {\n if (!credentialSubject || typeof credentialSubject !== 'object') return [];\n\n const questionTitles = new Map<string, string>();\n const fileQuestionNames = new Set<string>();\n if (surveyModel) {\n // (visibleOnly, includeDesignTime, includeNested) — nested reaches inside a paneldynamic.\n for (const q of surveyModel.getAllQuestions(false, false, true)) {\n const qType = (q.getType?.() || '').toLowerCase();\n const name: string = q.name;\n if (name) questionTitles.set(name, q.title || name);\n if (qType === 'file' || qType === 'signaturepad' || qType === 'image') {\n fileQuestionNames.add(name);\n }\n }\n }\n\n const result: CollectedAttachment[] = [];\n const seenContent = new Set<string>();\n\n const push = (label: string, file: { name: string; type: string; content: string }) => {\n if (seenContent.has(file.content)) return;\n seenContent.add(file.content);\n result.push({ ...file, label });\n };\n\n /** True when `value` held file-shaped entries (even if they deduped away) — callers must not\n * descend into a value that was already recognised as file content. */\n const pushFrom = (key: string, value: any): boolean => {\n const allowBare = fileQuestionNames.has(key);\n const entries = Array.isArray(value) ? value : [value];\n const files = entries.map((v) => toAttachment(v, allowBare)).filter((f): f is CollectedAttachment => !!f);\n if (!files.length) return false;\n const label = questionTitles.get(key) || key;\n for (const f of files) push(label, f);\n return true;\n };\n\n const seenRootKeys = new Set<string>();\n for (const name of fileQuestionNames) {\n if (credentialSubject[name] !== undefined) {\n pushFrom(name, credentialSubject[name]);\n seenRootKeys.add(name);\n }\n }\n\n const walk = (node: any, isRoot: boolean) => {\n if (!node || typeof node !== 'object') return;\n for (const [key, value] of Object.entries(node)) {\n if (isRoot && seenRootKeys.has(key)) continue;\n if (ENVELOPE_KEYS.has(key)) continue;\n if (!pushFrom(key, value) && value && typeof value === 'object') walk(value, false);\n }\n };\n walk(credentialSubject, true);\n\n return result;\n}\n","// Naming convention for media exported alongside a claim/bid CSV.\n//\n// A reviewer unzips an export and needs to answer, from the filename alone:\n// which record is this, and which question does it answer? Folders can't carry\n// that — files get dragged out of them — so every part is encoded in the name:\n//\n// <seq>__<recordRef>__<field>__<idx>__<originalName>.<ext>\n// 0001__bafkreifhy4au__idDocument__01__passport-front.jpg\n//\n// seq 4-digit row number, matching the record's row in the CSV. Sorts\n// the archive into CSV order and groups a record's files together.\n// recordRef short form of the record's id (claim CID / bid id) — recognisable\n// at a glance; the CSV carries the full id in the same row.\n// field credentialSubject / answer key, i.e. the CSV column heading the\n// file belongs to. Not the question title, which can change.\n// idx 2-digit position within a multi-file question (always present so\n// the shape is uniform and parseable).\n// originalName the submitter's filename, sanitised and truncated, extension kept.\n//\n// `__` is the delimiter, so no segment may contain `_`: the sanitiser maps it,\n// and every other unsafe character, to `-`. That keeps names legal on Windows\n// (no `<>:\"/\\|?*`, no reserved device names, no trailing dot/space) as well as\n// macOS and Linux, and keeps the whole path comfortably inside the 260-char\n// Windows limit.\n\nexport const MEDIA_DIR = 'media';\nexport const MEDIA_SEPARATOR = '__';\n\nconst SEQ_DIGITS = 4;\nconst REF_MAX = 14;\nconst FIELD_MAX = 32;\nconst NAME_MAX = 48;\n\n// CON, PRN, AUX, NUL, COM0-9, LPT0-9 — illegal as a filename stem on Windows\n// even with an extension appended.\nconst WINDOWS_RESERVED = /^(con|prn|aux|nul|com\\d|lpt\\d)$/i;\n\n/**\n * Reduces a value to `[A-Za-z0-9.-]`, collapses runs of `-`, trims separator\n * characters from both ends and truncates. Returns `''` for empty input so\n * callers can substitute their own placeholder.\n */\nexport function sanitizeSegment(value: unknown, maxLength: number): string {\n const out = String(value ?? '')\n .replace(/[^A-Za-z0-9.-]+/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^[-.]+|[-.]+$/g, '')\n .slice(0, maxLength)\n .replace(/[-.]+$/g, '');\n return out;\n}\n\n/**\n * Splits `report.final.pdf` into `{ stem: 'report.final', ext: 'pdf' }`.\n * The suffix has to be short and alphanumeric to count, so a name like\n * `Smith J.Robert` keeps its tail instead of losing it to a fake extension.\n */\nfunction splitExtension(fileName: string): { stem: string; ext: string } {\n const dot = fileName.lastIndexOf('.');\n if (dot <= 0 || dot === fileName.length - 1) return { stem: fileName, ext: '' };\n const ext = fileName.slice(dot + 1);\n if (!/^[A-Za-z0-9]{1,5}$/.test(ext)) return { stem: fileName, ext: '' };\n return { stem: fileName.slice(0, dot), ext };\n}\n\nconst MIME_EXTENSIONS: Record<string, string> = {\n 'image/jpeg': 'jpg',\n 'image/jpg': 'jpg',\n 'image/png': 'png',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'image/bmp': 'bmp',\n 'image/heic': 'heic',\n 'application/pdf': 'pdf',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'text/plain': 'txt',\n 'text/csv': 'csv',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n 'video/quicktime': 'mov',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'audio/ogg': 'ogg',\n};\n\n/**\n * Extension for the exported file. The MIME type wins when we recognise it —\n * it describes the actual bytes, so a `.PNG` that is really a JPEG opens\n * correctly after export. Otherwise the original name's suffix is used.\n */\nexport function resolveExtension(originalName: string, mimeType?: string): string {\n const key = String(mimeType || '')\n .split(';')[0]\n .trim()\n .toLowerCase();\n const fromMime = MIME_EXTENSIONS[key];\n if (fromMime) return fromMime;\n const fromName = splitExtension(originalName).ext;\n return fromName ? fromName.toLowerCase() : 'bin';\n}\n\nexport interface MediaNameParts {\n /** 1-based row number of the record in the exported CSV. */\n seq: number;\n /** Full record id — claim CID or bid id. Shortened for the filename. */\n recordId: string;\n /** credentialSubject / answer key the file was submitted under. */\n fieldName: string;\n /** 1-based position within a multi-file question. */\n fileIndex: number;\n originalName?: string;\n mimeType?: string;\n}\n\n/**\n * Builds the in-archive filename (no directory) for one media file.\n * Deterministic: the same parts always produce the same name.\n */\nexport function buildMediaFileName(parts: MediaNameParts): string {\n const seq = String(Math.max(0, Math.trunc(parts.seq))).padStart(SEQ_DIGITS, '0');\n const ref = sanitizeSegment(parts.recordId, REF_MAX) || 'record';\n const field = sanitizeSegment(parts.fieldName, FIELD_MAX) || 'field';\n const idx = String(Math.max(1, Math.trunc(parts.fileIndex))).padStart(2, '0');\n\n const original = String(parts.originalName || '').trim();\n const { stem } = splitExtension(original);\n let name = sanitizeSegment(stem, NAME_MAX);\n if (!name || WINDOWS_RESERVED.test(name)) name = 'file';\n\n const ext = resolveExtension(original, parts.mimeType);\n return [seq, ref, field, idx, name].join(MEDIA_SEPARATOR) + `.${ext}`;\n}\n\n/** Full path inside the archive, e.g. `media/0001__baf…__idDoc__01__front.jpg`. */\nexport function buildMediaPath(parts: MediaNameParts): string {\n return `${MEDIA_DIR}/${buildMediaFileName(parts)}`;\n}\n\n/**\n * Guarantees uniqueness when two files in one record share a field, index and\n * name (possible when a submission repeats an attachment). Appends `-2`, `-3`…\n * to the stem rather than letting `createZipBlob` reject the archive.\n */\nexport function dedupeMediaPath(path: string, taken: Set<string>): string {\n if (!taken.has(path)) {\n taken.add(path);\n return path;\n }\n const dot = path.lastIndexOf('.');\n const stem = dot > 0 ? path.slice(0, dot) : path;\n const ext = dot > 0 ? path.slice(dot) : '';\n for (let n = 2; n < 1000; n += 1) {\n const candidate = `${stem}-${n}${ext}`;\n if (!taken.has(candidate)) {\n taken.add(candidate);\n return candidate;\n }\n }\n throw new Error(`Unable to find a unique archive path for ${path}`);\n}\n","import { ENVELOPE_KEYS } from './collectAttachments';\nimport { resolveClaimFileRef } from './resolveClaimFileRef';\nimport { buildMediaPath, dedupeMediaPath } from './mediaNaming';\n\n// Walks a record's submitted answers and pulls out every file-like value,\n// keeping the field it came from. Shared by the claim and bid exports — a bid's\n// `data` and a claim's `credentialSubject` carry attachments in the same\n// SurveyJS shape (`{ name, type, content }`, singly or as an array).\n//\n// The walk descends into containers, because a `paneldynamic` question nests its\n// answers one level down: `{ 'ixo:ServiceDelivery': [{ 'ixo:evidenceType_x': [file] }] }`.\n// A top-level-only pass found none of those files — they were missing from both\n// the archive and the manifest, so the export looked complete when it was not.\n\n/** Keys and array indexes leading from the record's answers to one question's value. */\nexport type MediaValuePath = (string | number)[];\n\nexport interface MediaRef {\n /** Row number of the owning record in the exported CSV (1-based). */\n seq: number;\n /** Full claim CID / bid id. */\n recordId: string;\n /** Top-level answer key — matches the CSV column heading the file's cell sits under. */\n fieldName: string;\n /** Where the question's value sits, e.g. `ixo:ServiceDelivery[0].ixo:evidenceType_x`. Equals `fieldName` for a top-level question. */\n fieldPath: string;\n /** `fieldPath` as segments, so the CSV rewrite replaces exactly this value. */\n valuePath: MediaValuePath;\n /** Human question title when a survey model is available, else the question key. */\n fieldTitle: string;\n /** 1-based position among this record's files for the question, counted across panel rows. */\n fileIndex: number;\n originalName: string;\n mimeType: string;\n /** Fetchable https/data URL resolved from the raw reference. */\n sourceUrl: string;\n /** Path this file will occupy inside the archive. */\n archivePath: string;\n}\n\ntype FileEntry = { name?: unknown; type?: unknown; content: string };\n\nfunction isFileEntry(value: unknown): value is FileEntry {\n return !!value && typeof value === 'object' && typeof (value as { content?: unknown }).content === 'string';\n}\n\n/** File-like values are a `{content}` object, or an array of them. */\nfunction fileEntriesOf(value: unknown): FileEntry[] {\n if (Array.isArray(value)) return value.filter(isFileEntry);\n return isFileEntry(value) ? [value] : [];\n}\n\n/** `['a', 0, 'b']` → `a[0].b`; without indexes → `a[].b`, which names the question across panel rows. */\nfunction formatFieldPath(path: MediaValuePath, withIndexes = true): string {\n return path.reduce<string>((out, segment) => {\n if (typeof segment === 'number') return `${out}[${withIndexes ? segment : ''}]`;\n return out ? `${out}.${segment}` : segment;\n }, '');\n}\n\nexport interface CollectMediaOptions {\n /** Question `name` → question `title`, when the survey model is loaded. */\n titlesByFieldName?: Record<string, string>;\n /** Shared across records in one export so archive paths stay unique. */\n takenPaths?: Set<string>;\n}\n\n/**\n * Returns one `MediaRef` per attachment found in `answers`, at any depth outside\n * the credential envelope. Values whose reference cannot be resolved to a\n * fetchable URL are skipped — they would otherwise become empty files in the archive.\n */\nexport function collectRecordMedia(answers: Record<string, unknown> | null | undefined, record: { seq: number; recordId: string }, options: CollectMediaOptions = {}): MediaRef[] {\n if (!answers || typeof answers !== 'object') return [];\n const taken = options.takenPaths ?? new Set<string>();\n const titles = options.titlesByFieldName ?? {};\n const refs: MediaRef[] = [];\n const filesSeenByQuestion = new Map<string, number>();\n\n const collect = (entries: FileEntry[], valuePath: MediaValuePath) => {\n const fieldName = String(valuePath[0]);\n const questionName = String([...valuePath].reverse().find((segment) => typeof segment === 'string') ?? fieldName);\n const questionShape = formatFieldPath(valuePath, false);\n\n for (const entry of entries) {\n const fileIndex = (filesSeenByQuestion.get(questionShape) ?? 0) + 1;\n filesSeenByQuestion.set(questionShape, fileIndex);\n\n const sourceUrl = resolveClaimFileRef(entry.content);\n if (!sourceUrl) continue;\n\n const originalName = typeof entry.name === 'string' ? entry.name : '';\n const mimeType = typeof entry.type === 'string' ? entry.type : '';\n const archivePath = dedupeMediaPath(buildMediaPath({ seq: record.seq, recordId: record.recordId, fieldName: questionName, fileIndex, originalName, mimeType }), taken);\n\n refs.push({\n seq: record.seq,\n recordId: record.recordId,\n fieldName,\n fieldPath: formatFieldPath(valuePath),\n valuePath,\n fieldTitle: titles[questionName] || questionName,\n fileIndex,\n originalName,\n mimeType,\n sourceUrl,\n archivePath,\n });\n }\n };\n\n const visitChildren = (node: Record<string, unknown>, valuePath: MediaValuePath) => {\n for (const [key, child] of Object.entries(node)) {\n if (!ENVELOPE_KEYS.has(key)) visit(child, [...valuePath, key]);\n }\n };\n\n const visit = (value: unknown, valuePath: MediaValuePath) => {\n const entries = fileEntriesOf(value);\n if (entries.length > 0) {\n collect(entries, valuePath);\n } else if (Array.isArray(value)) {\n value.forEach((item, index) => visit(item, [...valuePath, index]));\n } else if (value && typeof value === 'object') {\n visitChildren(value as Record<string, unknown>, valuePath);\n }\n };\n\n visitChildren(answers, []);\n return refs;\n}\n\nfunction withValueAt(node: unknown, path: MediaValuePath, value: unknown): unknown {\n if (path.length === 0) return value;\n const [head, ...rest] = path;\n if (Array.isArray(node)) {\n const copy: unknown[] = [...node];\n copy[Number(head)] = withValueAt(copy[Number(head)], rest, value);\n return copy;\n }\n const copy: Record<string, unknown> = { ...(node as Record<string, unknown>) };\n copy[head] = withValueAt(copy[head], rest, value);\n return copy;\n}\n\n/**\n * Replaces the file-typed values in `answers` with the `;`-joined archive paths\n * of the files collected from them, so a CSV cell points straight at the media\n * shipped in the same ZIP instead of holding an opaque JSON blob. A file question\n * inside a panel is rewritten in place, keeping the panel's other answers.\n *\n * `failedPaths` names the files whose download did not produce bytes. Those are\n * NOT in the archive, so the cell must not point at them — a path that resolves\n * to nothing reads as a corrupt export rather than a missing source file.\n */\nexport function replaceFileValuesWithPaths(answers: Record<string, unknown>, refs: MediaRef[], failedPaths?: ReadonlySet<string>): Record<string, unknown> {\n if (refs.length === 0) return answers;\n const byValue = new Map<string, { valuePath: MediaValuePath; cells: string[] }>();\n for (const ref of refs) {\n const key = JSON.stringify(ref.valuePath);\n const group = byValue.get(key) ?? { valuePath: ref.valuePath, cells: [] };\n group.cells.push(failedPaths?.has(ref.archivePath) ? `${ref.originalName || ref.archivePath} (download failed — not in archive)` : ref.archivePath);\n byValue.set(key, group);\n }\n let out: unknown = answers;\n for (const { valuePath, cells } of byValue.values()) out = withValueAt(out, valuePath, cells.join('; '));\n return out as Record<string, unknown>;\n}\n","import { createZipBlob, type ZipEntry } from '@/core/utils/zip';\nimport { rowsToCsv, UTF8_BOM } from '@/core/utils/files';\nimport { collectRecordMedia, replaceFileValuesWithPaths, type MediaRef } from '../../_shared/media/collectMedia';\n\n// Assembles the \"data + media\" export: one ZIP holding the CSV the block would\n// otherwise download on its own, a manifest describing every media file, and\n// the media itself under `media/` named by the convention in `mediaNaming.ts`.\n//\n// The CSV inside the ZIP differs from the standalone one in a single way: cells\n// for file-typed questions hold the archive path of the file rather than the\n// raw `{name,type,content}` blob, so the two halves join without guesswork.\n\nconst DEFAULT_CONCURRENCY = 6;\n\n// The claims bot rate-limits per IP (`RateLimit-Policy: 200;w=60`, measured on\n// mainnet 2026-09-15), and claim-body reads spend the same budget. An export with\n// a few hundred attachments crosses it, and every file past the limit used to be\n// archived as `failed`. The bot's `Retry-After` is not CORS-exposed, so the\n// default backoff has to outlast the window on its own.\nconst DEFAULT_RETRY: RetryPolicy = {\n maxAttempts: 6,\n baseDelayMs: 5000,\n maxDelayMs: 60000,\n sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n};\n\nexport interface RetryPolicy {\n /** Tries per file, the first included. */\n maxAttempts: number;\n /** Wait after the first throttled response for a file; doubles on each further one. */\n baseDelayMs: number;\n maxDelayMs: number;\n sleep: (ms: number) => Promise<void>;\n}\n\nexport interface BundleRecord {\n /** Claim CID or bid id. Also the key of the answers map handed to `renderCsv`. */\n recordId: string;\n /** Submitted answers — the source of both the CSV columns and the media. */\n answers: Record<string, unknown>;\n /** Extra identifying columns copied onto each of this record's manifest rows. */\n manifest?: Record<string, unknown>;\n}\n\nexport interface BuildExportBundleParams {\n /** In CSV order — position drives the `seq` prefix in every media filename. */\n records: BundleRecord[];\n /** Question `name` → `title`, when a survey model is available. */\n titlesByFieldName?: Record<string, string>;\n /**\n * Decrypting fetcher (`handlers.fetchClaimMedia`). Falls back to a plain\n * `fetch` when absent, which only works for unencrypted gateway URLs.\n * A rejection carrying a numeric `status` of 429 or 5xx is retried (after its\n * `retryAfterMs`, when set); any other rejection fails that file at once.\n */\n fetchMedia?: (url: string) => Promise<Blob>;\n /** Renders the CSV once file values have been rewritten to archive paths. */\n renderCsv: (answersByRecordId: Record<string, Record<string, unknown>>) => string;\n csvName: string;\n manifestName?: string;\n /** Parallel media downloads. Kept low — the gateway is shared infrastructure. */\n concurrency?: number;\n /** Overrides for the throttling backoff. */\n retry?: Partial<RetryPolicy>;\n}\n\nexport interface ExportBundleResult {\n blob: Blob;\n mediaTotal: number;\n mediaFailed: number;\n failures: { archivePath: string; sourceUrl: string; reason: string }[];\n}\n\n/** Runs `worker` over `items` with at most `limit` in flight, preserving order. */\nexport async function mapWithLimit<T, R>(items: T[], limit: number, worker: (item: T, index: number) => Promise<R>): Promise<R[]> {\n const results = new Array<R>(items.length);\n let cursor = 0;\n const runners = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {\n for (;;) {\n const index = cursor;\n cursor += 1;\n if (index >= items.length) return;\n results[index] = await worker(items[index], index);\n }\n });\n await Promise.all(runners);\n return results;\n}\n\n/** How long to wait before retrying a failed download, or null when it is not worth retrying. */\nfunction retryDelayMs(err: unknown, attempt: number, policy: RetryPolicy): number | null {\n const { status, retryAfterMs } = (err ?? {}) as { status?: unknown; retryAfterMs?: unknown };\n if (typeof status !== 'number' || (status !== 429 && status < 500)) return null;\n if (typeof retryAfterMs === 'number' && retryAfterMs > 0) return Math.min(retryAfterMs, policy.maxDelayMs);\n return Math.min(policy.baseDelayMs * 2 ** (attempt - 1), policy.maxDelayMs);\n}\n\ntype Cooldown = { wait: () => Promise<void>; extend: (ms: number) => void };\n\n/**\n * One pause shared by every download worker. A 429 means the export as a whole\n * is over the limit, so the other workers hold off too — otherwise each spends\n * its own retries against a window that has not reset yet.\n */\nfunction createCooldown(sleep: RetryPolicy['sleep']): Cooldown {\n let resumeAt = 0;\n return {\n wait: async () => {\n const remaining = resumeAt - Date.now();\n if (remaining > 0) await sleep(remaining);\n },\n extend: (ms) => {\n resumeAt = Math.max(resumeAt, Date.now() + ms);\n },\n };\n}\n\nasync function fetchMediaBlob(url: string, fetchMedia?: (url: string) => Promise<Blob>): Promise<Blob> {\n if (fetchMedia) return fetchMedia(url);\n // `fetch` does not reject on 4xx/5xx. Without this check a gateway's\n // \"not found\" HTML page is archived as if it were the attachment, and\n // the manifest records it as `ok` — a corrupt file that looks fine.\n const response = await fetch(url);\n if (!response.ok) throw Object.assign(new Error(`gateway returned ${response.status} ${response.statusText}`.trim()), { status: response.status });\n return response.blob();\n}\n\nasync function downloadMedia(\n ref: MediaRef,\n fetchMedia: ((url: string) => Promise<Blob>) | undefined,\n policy: RetryPolicy,\n cooldown: Cooldown\n): Promise<{ bytes: Uint8Array | null; reason: string }> {\n for (let attempt = 1; ; attempt += 1) {\n await cooldown.wait();\n try {\n const blob = await fetchMediaBlob(ref.sourceUrl, fetchMedia);\n return { bytes: new Uint8Array(await blob.arrayBuffer()), reason: '' };\n } catch (err) {\n const delay = attempt < policy.maxAttempts ? retryDelayMs(err, attempt, policy) : null;\n if (delay === null) return { bytes: null, reason: err instanceof Error ? err.message : 'download failed' };\n cooldown.extend(delay);\n }\n }\n}\n\nexport async function buildExportBundle(params: BuildExportBundleParams): Promise<ExportBundleResult> {\n const takenPaths = new Set<string>();\n const refs: MediaRef[] = [];\n const refsByRecordId = new Map<string, MediaRef[]>();\n\n params.records.forEach((record, index) => {\n const recordRefs = collectRecordMedia(record.answers, { seq: index + 1, recordId: record.recordId }, { titlesByFieldName: params.titlesByFieldName, takenPaths });\n refs.push(...recordRefs);\n refsByRecordId.set(record.recordId, recordRefs);\n });\n\n const manifestByRecordId = new Map(params.records.map((record) => [record.recordId, record.manifest ?? {}]));\n\n const policy: RetryPolicy = { ...DEFAULT_RETRY, ...params.retry };\n const cooldown = createCooldown(policy.sleep);\n const downloads = await mapWithLimit(refs, params.concurrency ?? DEFAULT_CONCURRENCY, (ref) => downloadMedia(ref, params.fetchMedia, policy, cooldown));\n\n // The CSV is rewritten only AFTER the downloads resolve, so a cell can never\n // point at a file the archive does not contain.\n const failedPaths = new Set(refs.filter((_, index) => !downloads[index].bytes).map((ref) => ref.archivePath));\n const answersByRecordId: Record<string, Record<string, unknown>> = {};\n for (const record of params.records) {\n answersByRecordId[record.recordId] = replaceFileValuesWithPaths(record.answers, refsByRecordId.get(record.recordId) ?? [], failedPaths);\n }\n\n const entries: ZipEntry[] = [];\n const manifestRows: Record<string, unknown>[] = [];\n const failures: ExportBundleResult['failures'] = [];\n\n refs.forEach((ref, index) => {\n const { bytes, reason } = downloads[index];\n // A file that failed to download is still listed in the manifest — a\n // missing row would read as \"the submission had no attachment\".\n if (bytes) {\n entries.push({ path: ref.archivePath, data: bytes });\n } else {\n failures.push({ archivePath: ref.archivePath, sourceUrl: ref.sourceUrl, reason });\n }\n\n manifestRows.push({\n archivePath: bytes ? ref.archivePath : '',\n ...manifestByRecordId.get(ref.recordId),\n recordId: ref.recordId,\n fieldName: ref.fieldName,\n fieldPath: ref.fieldPath,\n fieldTitle: ref.fieldTitle,\n fileIndex: ref.fileIndex,\n originalName: ref.originalName,\n mimeType: ref.mimeType,\n sizeBytes: bytes ? bytes.length : '',\n sourceUrl: ref.sourceUrl,\n downloadStatus: bytes ? 'ok' : 'failed',\n downloadError: reason,\n });\n });\n\n entries.unshift({ path: params.csvName, data: UTF8_BOM + params.renderCsv(answersByRecordId) });\n entries.splice(1, 0, {\n path: params.manifestName || 'media-manifest.csv',\n data: UTF8_BOM + (manifestRows.length > 0 ? rowsToCsv(manifestRows) : 'note\\r\\nNo media was submitted for these records.'),\n });\n\n return { blob: createZipBlob(entries), mediaTotal: refs.length, mediaFailed: failures.length, failures };\n}\n","import type { Claim, IUserMatrixProfile } from '@/mantine/context/BlocknoteContext';\nimport { mapWithLimit } from './buildExportBundle';\n\n// A claim can build on an earlier claim in another collection — a BeGreen site\n// verification names the entrepreneur's onboarding (KYB) claim in\n// `ixo:baseClaimCID`. The claims export resolves that CID to the base claim's\n// submitter on chain, and the submitter to a Matrix display name, so a reviewer\n// does not have to cross-reference a second collection by hand.\n\nconst BASE_CLAIM_KEY = /(^|:)baseClaimCID$/i;\nconst CID = /baf[a-z0-9]{20,}/i;\nconst NAME_LOOKUP_CONCURRENCY = 4;\n\nexport interface BaseClaimSubmitter {\n baseClaimSubmitterDid: string;\n baseClaimSubmitterAddress: string;\n baseClaimSubmitterName: string;\n}\n\nexport const EMPTY_BASE_CLAIM_SUBMITTER: BaseClaimSubmitter = {\n baseClaimSubmitterDid: '',\n baseClaimSubmitterAddress: '',\n baseClaimSubmitterName: '',\n};\n\nexport interface BaseClaimLookupHandlers {\n getClaimsByIds?: (claimIds: string[]) => Promise<Claim[]>;\n getMatrixInfoPerDid?: (did: string) => Promise<IUserMatrixProfile>;\n}\n\n/** The base claim CID a claim's top-level answers name, or `''` when there is none. */\nexport function baseClaimCidOf(answers: Record<string, unknown>): string {\n for (const [key, value] of Object.entries(answers)) {\n if (BASE_CLAIM_KEY.test(key) && typeof value === 'string') return value.match(CID)?.[0] ?? '';\n }\n return '';\n}\n\n/**\n * Resolves, per claim id, the submitter of the base claim its answers name.\n * Claims without a base claim are absent from the result; a base claim with no\n * chain record, or a submitter with no Matrix profile, yields empty fields.\n * A failing chain lookup rejects — the caller decides whether to export without.\n */\nexport async function resolveBaseClaimSubmitters(\n answersByClaimId: Record<string, Record<string, unknown>>,\n handlers: BaseClaimLookupHandlers\n): Promise<Record<string, BaseClaimSubmitter>> {\n const baseCidByClaimId = Object.entries(answersByClaimId)\n .map(([claimId, answers]) => [claimId, baseClaimCidOf(answers)] as const)\n .filter(([, baseCid]) => baseCid);\n if (baseCidByClaimId.length === 0 || !handlers.getClaimsByIds) return {};\n\n const baseClaims = await handlers.getClaimsByIds([...new Set(baseCidByClaimId.map(([, baseCid]) => baseCid))]);\n const baseClaimByCid = new Map(baseClaims.map((claim) => [claim.claimId, claim]));\n\n const submitterDids = [...new Set(baseClaims.map((claim) => claim.agentDid).filter(Boolean))];\n const names = await mapWithLimit(submitterDids, NAME_LOOKUP_CONCURRENCY, async (did) => {\n try {\n return (await handlers.getMatrixInfoPerDid?.(did))?.displayname || '';\n } catch {\n return '';\n }\n });\n const nameByDid = new Map(submitterDids.map((did, index) => [did, names[index]]));\n\n return Object.fromEntries(\n baseCidByClaimId.map(([claimId, baseCid]) => {\n const baseClaim = baseClaimByCid.get(baseCid);\n if (!baseClaim) return [claimId, EMPTY_BASE_CLAIM_SUBMITTER];\n return [\n claimId,\n {\n baseClaimSubmitterDid: baseClaim.agentDid || '',\n baseClaimSubmitterAddress: baseClaim.agentAddress || '',\n baseClaimSubmitterName: nameByDid.get(baseClaim.agentDid) || '',\n },\n ];\n })\n );\n}\n","import type { Claim } from '@/mantine/context/BlocknoteContext';\nimport { getClaimStatusInfo } from '@/mantine/utils/claimStatus';\nimport { EMPTY_BASE_CLAIM_SUBMITTER, type BaseClaimSubmitter } from './baseClaimSubmitters';\n\n// IXO-4066 — rows for the \"all claim chain data + submitted contents\" CSV\n// (Evaluate Claim block). Chain columns first; the claim's credentialSubject\n// answers are spread after so questions become headings and each row is one\n// account's submission.\n//\n// Status comes from `getClaimStatusInfo`, the same helper the list badges and\n// filter tabs use. It reads the chain's evaluation record\n// (`evaluationByClaimId.status`), the dispute record and the payment statuses.\n// An earlier version read `claim.approved` / `.rejected` / `.disputed` —\n// optional fields the blocksync payload never populates — so every exported row\n// said `pending` regardless of how the claim had actually been evaluated.\n\nexport interface BuildClaimRowsOptions {\n /**\n * Per-claim replacement for the spread answers, e.g. with file values\n * rewritten to their paths inside an accompanying media ZIP.\n */\n answersByClaimId?: Record<string, Record<string, unknown>>;\n /**\n * Submitter of the claim each row's `ixo:baseClaimCID` names, keyed by the\n * row's own claim id. When any row has one, every row gets the columns, so\n * they sit together with the chain columns instead of trailing the answers.\n */\n baseClaimSubmittersByClaimId?: Record<string, BaseClaimSubmitter>;\n}\n\n/** Answers to spread into the row: the credentialSubject, or the payload itself. */\nexport function claimAnswers(contents: unknown): Record<string, unknown> {\n const raw = contents as { credentialSubject?: unknown } | null | undefined;\n const subject = raw?.credentialSubject ?? raw;\n return subject && typeof subject === 'object' && !Array.isArray(subject) ? (subject as Record<string, unknown>) : {};\n}\n\nexport function buildClaimRows(claims: Claim[], contentsByClaimId: Record<string, unknown>, options: BuildClaimRowsOptions = {}): Record<string, unknown>[] {\n const baseClaimSubmitters = options.baseClaimSubmittersByClaimId ?? {};\n const withBaseClaimColumns = Object.keys(baseClaimSubmitters).length > 0;\n\n return claims.map((claim) => {\n const answers = options.answersByClaimId?.[claim.claimId] ?? claimAnswers(contentsByClaimId[claim.claimId]);\n const status = getClaimStatusInfo(claim);\n\n return {\n claimId: claim.claimId,\n collectionId: claim.collectionId,\n agentDid: claim.agentDid,\n agentAddress: claim.agentAddress,\n submissionDate: claim.submissionDate,\n status: status.key,\n // A terminal decision outranks a dispute in `status`, but the dispute\n // record stays on chain — keep it visible rather than losing it.\n hasDispute: !!(claim as { disputeBySubjectId?: unknown }).disputeBySubjectId,\n schemaType: claim.schemaType ?? '',\n ...(withBaseClaimColumns ? baseClaimSubmitters[claim.claimId] ?? EMPTY_BASE_CLAIM_SUBMITTER : {}),\n ...answers,\n };\n });\n}\n","import type { CollectionGrantee } from '@/core/lib/actionRegistry/actions/collectionUsers/types';\n\n// IXO-4066 — rows for the \"collection members / grant state\" CSV (Collection\n// Users block, Users section). One row per grantee+role grant.\nexport function buildGranteeRows(grantees: CollectionGrantee[], namesByDid: Record<string, string> = {}): Record<string, unknown>[] {\n return grantees.map((grantee) => {\n const did = grantee.did || '';\n return {\n name: namesByDid[did] || '',\n did,\n address: grantee.address,\n role: grantee.role,\n agentQuota: grantee.agentQuota ?? '',\n maxAmount: Array.isArray(grantee.maxAmount) ? grantee.maxAmount.map((coin) => `${coin.amount} ${coin.denom}`).join('; ') : '',\n };\n });\n}\n","import type { Bid } from '@/mantine/context/BlocknoteContext';\nimport type { CollectionGrantee } from '@/core/lib/actionRegistry/actions/collectionUsers/types';\nimport type { CsvSection } from '@/core/utils/files';\nimport { buildGranteeRows } from './buildGranteeRows';\nimport { buildBidRows, type BuildBidRowsOptions } from './buildBidRows';\n\n// The Collection Users export is two tables in one file:\n//\n// PART 1 — ACTIVE GRANTS who can submit/evaluate on the collection right now\n// PART 2 — BIDS every bid the export could reach, each carrying the\n// grant state of the account that submitted it\n//\n// Part 1 answers \"who has access\". Part 2 answers \"who asked, and what came of\n// it\" — which is a strictly larger set, because it includes bidders who hold no\n// grant at all. Three populations end up in part 2, distinguished by `bidState`:\n//\n// open awaiting a decision\n// granted decided, and a live grant matches the bid's role\n// lapsed decided, and NO grant on this collection today\n//\n// `lapsed` is the one worth the machinery. Measured on BeGreen collection 229\n// (mainnet, 2026-08-07): 33 open, 17 decided — 11 granted, 2 granted in another\n// role, 4 lapsed. Those 4 accounts submitted a bid, had it approved, and hold\n// nothing today; they appear in neither the bids list nor the grantee list, so\n// before this export nothing in the product showed them at all.\n//\n// Reaching decided bids at all needs the optional `bids.queryDecided` host\n// capability (see ../bids/decidedBids.ts). Without it the section is open bids\n// only and the header says so, rather than implying a full history it does not\n// have.\n\nexport interface CollectionMembersSectionParams {\n grantees: CollectionGrantee[];\n bids: Bid[];\n namesByDid?: Record<string, string>;\n bidOptions?: BuildBidRowsOptions;\n collectionId?: string;\n /** Set when paging stopped early — the bid rows are an incomplete page set. */\n bidsTruncated?: boolean;\n /** True when the host supplied decided bids, so part 2 is full history. */\n decidedBidsIncluded?: boolean;\n}\n\nconst OPEN_ONLY_NOTE =\n 'Open bids only — the bids service drops a bid from its query response once it is approved or rejected, and this host cannot read decided bids from the collection room.';\nconst FULL_HISTORY_NOTE = 'All bids, open and decided. See bidState: open = awaiting decision, granted = decided with a live grant, lapsed = decided with NO active grant.';\n\nexport function buildCollectionMembersSections(params: CollectionMembersSectionParams): CsvSection[] {\n const { grantees, bids, namesByDid = {}, collectionId, bidsTruncated, decidedBidsIncluded } = params;\n const label = collectionId ? ` (collection ${collectionId})` : '';\n const scopeNote = decidedBidsIncluded ? FULL_HISTORY_NOTE : OPEN_ONLY_NOTE;\n const truncationNote = bidsTruncated ? ' WARNING: paging stopped early — this list is incomplete.' : '';\n\n return [\n {\n title: `PART 1 — ACTIVE GRANTS${label}`,\n rows: buildGranteeRows(grantees, namesByDid),\n emptyNote: 'No active grants on this collection.',\n },\n {\n title: `PART 2 — ${decidedBidsIncluded ? 'BIDS' : 'OPEN BIDS'}${label} — ${scopeNote}${truncationNote}`,\n rows: buildBidRows(bids, grantees, { namesByDid, ...params.bidOptions }),\n emptyNote: decidedBidsIncluded ? 'No bids have been submitted to this collection.' : 'No open bids on this collection.',\n },\n ];\n}\n","import { timestampSuffix } from '@/core/utils/files';\n\n// One place that decides what an export is called, so the ZIP, the CSV inside\n// it and the standalone CSV stay recognisably the same family:\n//\n// claims-234.csv standalone\n// claims-234-20260807-142530.zip bundle\n// ├── claims-234.csv same rows, file cells → archive paths\n// ├── media-manifest-234.csv one row per media file\n// └── media/0001__baf…__idDoc__01__front.jpg\n//\n// The ZIP carries a timestamp because a reviewer typically pulls several over\n// the life of a collection and the browser would otherwise silently suffix them\n// `(1)`, `(2)`. The CSV inside does not — its name is a stable key.\n\nconst slug = (value: string | undefined, fallback: string) => (value ? String(value).replace(/[^A-Za-z0-9._-]+/g, '-') : fallback);\n\nexport const exportFileNames = {\n claims(collectionId?: string) {\n const id = slug(collectionId, 'collection');\n return { csv: `claims-${id}.csv`, manifest: `media-manifest-${id}.csv`, zip: `claims-${id}-${timestampSuffix()}.zip` };\n },\n claim(claimId: string) {\n const id = slug(claimId, 'claim').slice(0, 20);\n return { csv: `claim-${id}.csv`, manifest: `media-manifest-${id}.csv`, zip: `claim-${id}-${timestampSuffix()}.zip` };\n },\n bids(collectionId?: string) {\n const id = slug(collectionId, 'collection');\n return { csv: `bids-${id}.csv`, manifest: `media-manifest-${id}.csv`, zip: `bids-${id}-${timestampSuffix()}.zip` };\n },\n bid(bidId: string) {\n const id = slug(bidId, 'bid').slice(0, 20);\n return { csv: `bid-${id}.csv`, manifest: `media-manifest-${id}.csv`, zip: `bid-${id}-${timestampSuffix()}.zip` };\n },\n collectionMembers(collectionId?: string) {\n const id = slug(collectionId, 'collection');\n return { csv: `collection-members-${id}.csv`, manifest: `media-manifest-${id}.csv`, zip: `collection-members-${id}-${timestampSuffix()}.zip` };\n },\n};\n","import React from 'react';\nimport { Anchor, Box, Center, Group, Modal, Stack, Text } from '@mantine/core';\nimport { useMediaQuery } from '@mantine/hooks';\nimport { IconDownload } from '@tabler/icons-react';\nimport { icon } from './ReusablePanel';\nimport { MEDIA_FRAME_SANDBOX, type PreviewableFile, resolvePreviewKind } from './mediaPreviewKind';\n\nexport type MediaFile = PreviewableFile;\n\ninterface MediaPreviewModalProps {\n file: MediaFile | null;\n onClose: () => void;\n}\n\nexport const MediaPreviewModal: React.FC<MediaPreviewModalProps> = ({ file, onClose }) => {\n const isMobile = useMediaQuery('(max-width: 992px)');\n const opened = !!file;\n const kind = file ? resolvePreviewKind(file) : 'other';\n const wide = kind === 'pdf' || kind === 'image' || kind === 'video';\n\n return (\n <Modal\n opened={opened}\n onClose={onClose}\n zIndex={10000}\n portalProps={typeof document !== 'undefined' ? { target: document.body } : undefined}\n title={\n <Group gap=\"sm\" wrap=\"nowrap\" style={{ width: '100%' }}>\n <Text fw={500} size=\"sm\" truncate style={{ flex: 1, minWidth: 0 }}>\n {file?.name || 'Preview'}\n </Text>\n {file && (\n <Anchor href={file.content} target=\"_blank\" rel=\"noopener noreferrer\" download={file.name} size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n <Box style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n {icon(IconDownload, 14)}\n Download\n </Box>\n </Anchor>\n )}\n </Group>\n }\n size={wide ? '95vw' : 'xl'}\n centered\n styles={\n wide\n ? {\n content: {\n height: '95vh',\n maxWidth: isMobile ? '100%' : 1400,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n body: {\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n },\n }\n : undefined\n }\n >\n {file && (\n <Stack gap=\"sm\" style={wide ? { flex: 1, minHeight: 0 } : undefined}>\n {kind === 'image' && (\n <Center style={{ flex: 1, minHeight: 0, overflow: 'hidden' }}>\n <img\n src={file.content}\n alt={file.name}\n style={{ display: 'block', maxWidth: '100%', maxHeight: '100%', width: 'auto', height: 'auto', objectFit: 'contain', borderRadius: 8 }}\n />\n </Center>\n )}\n {kind === 'video' && (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video src={file.content} controls style={{ width: '100%', flex: 1, minHeight: 0, borderRadius: 8, background: 'var(--mantine-color-neutralColor-3)' }} />\n )}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n {kind === 'audio' && <audio src={file.content} controls style={{ width: '100%' }} />}\n {kind === 'pdf' && (\n <Box style={{ flex: 1, minHeight: 0, borderRadius: 8, overflow: 'hidden' }}>\n <iframe src={file.content} title={file.name} sandbox={MEDIA_FRAME_SANDBOX} referrerPolicy=\"no-referrer\" style={{ width: '100%', height: '100%', border: 'none' }} />\n </Box>\n )}\n {kind === 'other' && (\n <Center p=\"xl\">\n <Text size=\"sm\" c=\"dimmed\">\n This file type can't be previewed inline. Use Download above.\n </Text>\n </Center>\n )}\n </Stack>\n )}\n </Modal>\n );\n};\n","export type MediaPreviewKind = 'image' | 'video' | 'audio' | 'pdf' | 'other';\n\nexport interface PreviewableFile {\n name: string;\n type: string;\n content: string;\n /** MIME type carried by the bytes the host actually fetched; undefined when we never fetched them. */\n contentType?: string;\n}\n\nconst IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'];\nconst VIDEO_EXTENSIONS = ['mp4', 'webm', 'mov', 'mkv'];\nconst AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'm4a', 'flac'];\n\n/** Content types that say nothing about the bytes: absent, or generic binary. */\nconst UNSPECIFIC_CONTENT_TYPES = new Set(['', 'application/octet-stream', 'binary/octet-stream']);\n\nfunction normaliseContentType(contentType: string | undefined): string {\n return (contentType || '').toLowerCase().split(';')[0].trim();\n}\n\nfunction dataUrlContentType(content: string): string | undefined {\n return content.startsWith('data:') ? content.slice(5).split(/[;,]/)[0] : undefined;\n}\n\n/** The kind a file CLAIMS to be, from submitter-written metadata (declared type + file name). */\nexport function detectMediaKind(type: string, name: string): MediaPreviewKind {\n const t = (type || '').toLowerCase();\n const ext = (name || '').toLowerCase().split('.').pop() || '';\n if (t.startsWith('image/') || IMAGE_EXTENSIONS.includes(ext)) return 'image';\n if (t.startsWith('video/') || VIDEO_EXTENSIONS.includes(ext)) return 'video';\n if (t.startsWith('audio/') || AUDIO_EXTENSIONS.includes(ext)) return 'audio';\n if (t === 'application/pdf' || ext === 'pdf') return 'pdf';\n return 'other';\n}\n\n/** The kind the bytes SAY they are; nothing is inferred from a file name here. */\nexport function kindFromContentType(contentType: string | undefined): MediaPreviewKind {\n const t = normaliseContentType(contentType);\n if (t.startsWith('image/')) return 'image';\n if (t.startsWith('video/')) return 'video';\n if (t.startsWith('audio/')) return 'audio';\n if (t === 'application/pdf') return 'pdf';\n return 'other';\n}\n\n/**\n * How a file may be previewed. Declared metadata is submitter-controlled, so once the bytes are\n * in hand — the host fetched them (`contentType`), the content is a blob: URL the host minted, or\n * it is a data: URL carrying its own type — the bytes decide: a \"PDF\" whose bytes are text/html is\n * not framed, and a PDF frame requires the bytes to positively say application/pdf. The inert\n * renderers (<img>, <video>, <audio>) may keep the declared kind when the server sent no usable\n * content type: a mismatch there breaks the element, never the page.\n */\nexport function resolvePreviewKind(file: PreviewableFile): MediaPreviewKind {\n const declared = detectMediaKind(file.type, file.name);\n const contentType = file.contentType ?? dataUrlContentType(file.content);\n const fetched = contentType !== undefined || file.content.startsWith('blob:');\n if (!fetched) return declared;\n\n const actual = kindFromContentType(contentType);\n if (actual !== 'other') return actual;\n if (UNSPECIFIC_CONTENT_TYPES.has(normaliseContentType(contentType)) && declared !== 'pdf') return declared;\n return 'other';\n}\n\n/**\n * Sandbox for every frame that shows fetched or remote media. Without allow-same-origin the framed\n * document gets an opaque origin, so even HTML that reached the frame cannot read the host's\n * storage or cookies, touch its DOM, navigate it, or open windows. allow-scripts is what the\n * browsers' built-in PDF viewers need to run.\n */\nexport const MEDIA_FRAME_SANDBOX = 'allow-scripts';\n"],"mappings":"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","names":["copy","React","IconDownload","React","IconDownload"]}
|