@powerhousedao/design-system 6.0.0-dev.196 → 6.0.0-dev.198
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/{button-CRGaTu1H.d.ts → button-C8doazjv.d.ts} +1 -1
- package/dist/{button-CRGaTu1H.d.ts.map → button-C8doazjv.d.ts.map} +1 -1
- package/dist/{character-counter-sqhtpnM2.d.ts → character-counter-BWoglM2P.d.ts} +1 -1
- package/dist/{character-counter-sqhtpnM2.d.ts.map → character-counter-BWoglM2P.d.ts.map} +1 -1
- package/dist/{checkbox-WQJ1ELix.d.ts → checkbox-BueZ7Wg_.d.ts} +3 -3
- package/dist/{checkbox-WQJ1ELix.d.ts.map → checkbox-BueZ7Wg_.d.ts.map} +1 -1
- package/dist/{checkbox-base-kQOLgBSw.d.ts → checkbox-base-CZo-4eL0.d.ts} +1 -1
- package/dist/{checkbox-base-kQOLgBSw.d.ts.map → checkbox-base-CZo-4eL0.d.ts.map} +1 -1
- package/dist/{command-BVb5bGtc.d.ts → command-DGs9bm7Q.d.ts} +8 -8
- package/dist/{command-BVb5bGtc.d.ts.map → command-DGs9bm7Q.d.ts.map} +1 -1
- package/dist/connect/components/toast/toast.d.ts +16 -0
- package/dist/connect/components/toast/toast.d.ts.map +1 -0
- package/dist/connect/components/toast/toast.js +71 -0
- package/dist/connect/components/toast/toast.js.map +1 -0
- package/dist/connect/index.d.ts +3 -3
- package/dist/connect/index.js +3 -2
- package/dist/{connect-CrXsa33f.js → connect-D2wTJ-7r.js} +36 -366
- package/dist/connect-D2wTJ-7r.js.map +1 -0
- package/dist/{content-B-HaysyU.d.ts → content-DFFfr1mk.d.ts} +2 -2
- package/dist/{content-B-HaysyU.d.ts.map → content-DFFfr1mk.d.ts.map} +1 -1
- package/dist/document-timeline-FWiQhfIq.js +288 -0
- package/dist/document-timeline-FWiQhfIq.js.map +1 -0
- package/dist/{enum-field-gjkjO_WS.d.ts → enum-field-CBFI4x1f.d.ts} +4 -4
- package/dist/{enum-field-gjkjO_WS.d.ts.map → enum-field-CBFI4x1f.d.ts.map} +1 -1
- package/dist/{form-C1QA8m1k.d.ts → form-CKRKn0TQ.d.ts} +1 -1
- package/dist/{form-C1QA8m1k.d.ts.map → form-CKRKn0TQ.d.ts.map} +1 -1
- package/dist/{form-description-CJVMogCL.d.ts → form-description-CYkcMEzm.d.ts} +1 -1
- package/dist/{form-description-CJVMogCL.d.ts.map → form-description-CYkcMEzm.d.ts.map} +1 -1
- package/dist/{form-group-BDgpr5u8.d.ts → form-group-C8kL6pdZ.d.ts} +1 -1
- package/dist/form-group-C8kL6pdZ.d.ts.map +1 -0
- package/dist/{form-label-CCANBlbG.d.ts → form-label-b6nQi0XO.d.ts} +1 -1
- package/dist/{form-label-CCANBlbG.d.ts.map → form-label-b6nQi0XO.d.ts.map} +1 -1
- package/dist/{form-message-TYsO9BYM.d.ts → form-message-Dq72nBXz.d.ts} +1 -1
- package/dist/{form-message-TYsO9BYM.d.ts.map → form-message-Dq72nBXz.d.ts.map} +1 -1
- package/dist/{form-server-error-message-DM79ceCA.d.ts → form-server-error-message-DXbaiTfF.d.ts} +1 -1
- package/dist/{form-server-error-message-DM79ceCA.d.ts.map → form-server-error-message-DXbaiTfF.d.ts.map} +1 -1
- package/dist/{id-autocomplete-BafWC9wr.d.ts → id-autocomplete-CLC7zy-f.d.ts} +2 -2
- package/dist/{id-autocomplete-BafWC9wr.d.ts.map → id-autocomplete-CLC7zy-f.d.ts.map} +1 -1
- package/dist/{id-autocomplete-input-container-DxxI5DR6.d.ts → id-autocomplete-input-container-DsLTOkaT.d.ts} +2 -2
- package/dist/{id-autocomplete-input-container-DxxI5DR6.d.ts.map → id-autocomplete-input-container-DsLTOkaT.d.ts.map} +1 -1
- package/dist/{id-autocomplete-list-BHBavDro.d.ts → id-autocomplete-list-CFWHGDwL.d.ts} +2 -2
- package/dist/{id-autocomplete-list-BHBavDro.d.ts.map → id-autocomplete-list-CFWHGDwL.d.ts.map} +1 -1
- package/dist/{id-autocomplete-list-option-DlFexoVY.d.ts → id-autocomplete-list-option-fOnxSbzb.d.ts} +2 -2
- package/dist/{id-autocomplete-list-option-DlFexoVY.d.ts.map → id-autocomplete-list-option-fOnxSbzb.d.ts.map} +1 -1
- package/dist/{index-CuSjRT5A.d.ts → index-B6YyDoT1.d.ts} +1 -1
- package/dist/{index-CuSjRT5A.d.ts.map → index-B6YyDoT1.d.ts.map} +1 -1
- package/dist/{index-C37KRTG6.d.ts → index-U9etrdGX.d.ts} +3 -15
- package/dist/index-U9etrdGX.d.ts.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{input-Bl0zw1zI.d.ts → input-BpEQjaWV.d.ts} +1 -1
- package/dist/{input-Bl0zw1zI.d.ts.map → input-BpEQjaWV.d.ts.map} +1 -1
- package/dist/{json-viewer-B5JtYTX7.d.ts → json-viewer-DaTgmzkS.d.ts} +1 -1
- package/dist/{json-viewer-B5JtYTX7.d.ts.map → json-viewer-DaTgmzkS.d.ts.map} +1 -1
- package/dist/{message-list-BZ9ku5cz.d.ts → message-list-C4mPpBBa.d.ts} +2 -2
- package/dist/{message-list-BZ9ku5cz.d.ts.map → message-list-C4mPpBBa.d.ts.map} +1 -1
- package/dist/{popover-CD29J7Ou.d.ts → popover-XSBOuSih.d.ts} +1 -1
- package/dist/{popover-CD29J7Ou.d.ts.map → popover-XSBOuSih.d.ts.map} +1 -1
- package/dist/{radio-9EYSHlFT.d.ts → radio-eL0Oy86J.d.ts} +1 -1
- package/dist/{radio-9EYSHlFT.d.ts.map → radio-eL0Oy86J.d.ts.map} +1 -1
- package/dist/{radio-group-BT-3-R48.d.ts → radio-group-Bkli6nUz.d.ts} +1 -1
- package/dist/{radio-group-BT-3-R48.d.ts.map → radio-group-Bkli6nUz.d.ts.map} +1 -1
- package/dist/{radio-group-field-BeQEWaTA.d.ts → radio-group-field-z7q-PVyY.d.ts} +2 -2
- package/dist/{radio-group-field-BeQEWaTA.d.ts.map → radio-group-field-z7q-PVyY.d.ts.map} +1 -1
- package/dist/rwa/index.d.ts +2 -2
- package/dist/rwa/index.js +11 -10
- package/dist/rwa/index.js.map +1 -1
- package/dist/{search-autocomplete-BRGCFNv4.d.ts → search-autocomplete-BJJkrZ1i.d.ts} +2 -2
- package/dist/{search-autocomplete-BRGCFNv4.d.ts.map → search-autocomplete-BJJkrZ1i.d.ts.map} +1 -1
- package/dist/{select-field-CxQiIXRy.d.ts → select-field-D27IGJrV.d.ts} +2 -2
- package/dist/{select-field-CxQiIXRy.d.ts.map → select-field-D27IGJrV.d.ts.map} +1 -1
- package/dist/{selected-content-DPH03IS_.d.ts → selected-content-CdIw4hcC.d.ts} +2 -2
- package/dist/{selected-content-DPH03IS_.d.ts.map → selected-content-CdIw4hcC.d.ts.map} +1 -1
- package/dist/{splitted-input-diff-Cvmajf1T.d.ts → splitted-input-diff-Bjrw-jzX.d.ts} +2 -2
- package/dist/{splitted-input-diff-Cvmajf1T.d.ts.map → splitted-input-diff-Bjrw-jzX.d.ts.map} +1 -1
- package/dist/{src-BX8sU0Tq.js → src-8xf1ueaA.js} +3 -3
- package/dist/src-8xf1ueaA.js.map +1 -0
- package/dist/{text-field-D_SU7LsS.d.ts → text-field-Bi7Ze25A.d.ts} +3 -3
- package/dist/{text-field-D_SU7LsS.d.ts.map → text-field-Bi7Ze25A.d.ts.map} +1 -1
- package/dist/{text-input-BHnj0vwk.d.ts → text-input-BAO78Lzx.d.ts} +3 -3
- package/dist/{text-input-BHnj0vwk.d.ts.map → text-input-BAO78Lzx.d.ts.map} +1 -1
- package/dist/{text-input-diff-BX11t5bF.d.ts → text-input-diff-Bx-zFOZd.d.ts} +2 -2
- package/dist/{text-input-diff-BX11t5bF.d.ts.map → text-input-diff-Bx-zFOZd.d.ts.map} +1 -1
- package/dist/{tooltip-CJfsoXUL.d.ts → tooltip-CsucyiCV.d.ts} +1 -1
- package/dist/{tooltip-CJfsoXUL.d.ts.map → tooltip-CsucyiCV.d.ts.map} +1 -1
- package/dist/{types-BWOaVvle.d.ts → types-BTq-St7H.d.ts} +1 -1
- package/dist/{types-BWOaVvle.d.ts.map → types-BTq-St7H.d.ts.map} +1 -1
- package/dist/{types-xiS8yRsl.d.ts → types-Bsn62tJB.d.ts} +1 -1
- package/dist/{types-xiS8yRsl.d.ts.map → types-Bsn62tJB.d.ts.map} +1 -1
- package/dist/{types-DY2V2IQi.d.ts → types-C04Q_Fan.d.ts} +1 -1
- package/dist/{types-DY2V2IQi.d.ts.map → types-C04Q_Fan.d.ts.map} +1 -1
- package/dist/ui/components/button/button.d.ts +1 -1
- package/dist/ui/components/button/button.js +2 -2
- package/dist/ui/components/button/button.js.map +1 -1
- package/dist/ui/components/character-counter/character-counter.d.ts +1 -1
- package/dist/ui/components/character-counter/character-counter.js.map +1 -1
- package/dist/ui/components/checkbox/checkbox-base.d.ts +1 -1
- package/dist/ui/components/checkbox/checkbox-base.js +2 -2
- package/dist/ui/components/checkbox/checkbox-base.js.map +1 -1
- package/dist/ui/components/checkbox/checkbox.d.ts +1 -1
- package/dist/ui/components/checkbox/checkbox.js +2 -2
- package/dist/ui/components/checkbox/checkbox.js.map +1 -1
- package/dist/ui/components/command/command.d.ts +1 -1
- package/dist/ui/components/command/command.js +8 -8
- package/dist/ui/components/command/command.js.map +1 -1
- package/dist/ui/components/enum-field/enum-field.d.ts +1 -1
- package/dist/ui/components/enum-field/enum-field.js +1 -1
- package/dist/ui/components/enum-field/enum-field.js.map +1 -1
- package/dist/ui/components/enum-field/types.d.ts +1 -1
- package/dist/ui/components/form/form.d.ts +1 -1
- package/dist/ui/components/form/form.js +1 -1
- package/dist/ui/components/form/form.js.map +1 -1
- package/dist/ui/components/form/utils.js.map +1 -1
- package/dist/ui/components/form-description/form-description.d.ts +1 -1
- package/dist/ui/components/form-description/form-description.js +1 -1
- package/dist/ui/components/form-description/form-description.js.map +1 -1
- package/dist/ui/components/form-group/form-group.d.ts +1 -1
- package/dist/ui/components/form-group/form-group.js.map +1 -1
- package/dist/ui/components/form-label/form-label.d.ts +1 -1
- package/dist/ui/components/form-label/form-label.js +1 -1
- package/dist/ui/components/form-label/form-label.js.map +1 -1
- package/dist/ui/components/form-message/form-message.d.ts +1 -1
- package/dist/ui/components/form-message/form-message.js +1 -1
- package/dist/ui/components/form-message/form-message.js.map +1 -1
- package/dist/ui/components/form-message/form-server-error-message.d.ts +1 -1
- package/dist/ui/components/form-message/form-server-error-message.js.map +1 -1
- package/dist/ui/components/form-message/message-list.d.ts +1 -1
- package/dist/ui/components/form-message/message-list.js +1 -1
- package/dist/ui/components/form-message/message-list.js.map +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-context.js +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-context.js.map +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.js +2 -2
- package/dist/ui/components/id-autocomplete/id-autocomplete-input-container.js.map +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.js +2 -2
- package/dist/ui/components/id-autocomplete/id-autocomplete-list-option.js.map +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list.js +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete-list.js.map +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/id-autocomplete.js +2 -2
- package/dist/ui/components/id-autocomplete/id-autocomplete.js.map +1 -1
- package/dist/ui/components/id-autocomplete/types.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/use-id-autocomplete.d.ts +1 -1
- package/dist/ui/components/id-autocomplete/use-id-autocomplete.js.map +1 -1
- package/dist/ui/components/index.d.ts +36 -36
- package/dist/ui/components/input/input.d.ts +1 -1
- package/dist/ui/components/input/input.js +1 -1
- package/dist/ui/components/input/input.js.map +1 -1
- package/dist/ui/components/input/splitted-input-diff.d.ts +1 -1
- package/dist/ui/components/input/splitted-input-diff.js +1 -1
- package/dist/ui/components/input/splitted-input-diff.js.map +1 -1
- package/dist/ui/components/input/subcomponent/input-diff.js +1 -1
- package/dist/ui/components/input/subcomponent/input-diff.js.map +1 -1
- package/dist/ui/components/input/subcomponent/text-diff.d.ts +1 -1
- package/dist/ui/components/input/subcomponent/text-diff.js +1 -1
- package/dist/ui/components/input/subcomponent/text-diff.js.map +1 -1
- package/dist/ui/components/json-viewer/json-viewer.d.ts +1 -1
- package/dist/ui/components/json-viewer/json-viewer.js +1 -1
- package/dist/ui/components/json-viewer/json-viewer.js.map +1 -1
- package/dist/ui/components/popover/popover.d.ts +1 -1
- package/dist/ui/components/popover/popover.js +2 -2
- package/dist/ui/components/popover/popover.js.map +1 -1
- package/dist/ui/components/radio-group-field/radio-group-field.d.ts +1 -1
- package/dist/ui/components/radio-group-field/radio-group-field.js +3 -3
- package/dist/ui/components/radio-group-field/radio-group-field.js.map +1 -1
- package/dist/ui/components/radio-group-field/radio-group.d.ts +1 -1
- package/dist/ui/components/radio-group-field/radio-group.js +1 -1
- package/dist/ui/components/radio-group-field/radio-group.js.map +1 -1
- package/dist/ui/components/radio-group-field/radio.d.ts +1 -1
- package/dist/ui/components/radio-group-field/radio.js +2 -2
- package/dist/ui/components/radio-group-field/radio.js.map +1 -1
- package/dist/ui/components/search-autocomplete/index.d.ts +3 -3
- package/dist/ui/components/search-autocomplete/search-autocomplete.d.ts +1 -1
- package/dist/ui/components/search-autocomplete/search-autocomplete.js +1 -1
- package/dist/ui/components/search-autocomplete/search-autocomplete.js.map +1 -1
- package/dist/ui/components/search-autocomplete/types.d.ts +1 -1
- package/dist/ui/components/search-autocomplete/use-search-autocomplete.d.ts +1 -1
- package/dist/ui/components/search-autocomplete/use-search-autocomplete.js.map +1 -1
- package/dist/ui/components/select-field/content.d.ts +1 -1
- package/dist/ui/components/select-field/content.js +1 -1
- package/dist/ui/components/select-field/content.js.map +1 -1
- package/dist/ui/components/select-field/select-field.d.ts +1 -1
- package/dist/ui/components/select-field/select-field.js +2 -2
- package/dist/ui/components/select-field/select-field.js.map +1 -1
- package/dist/ui/components/select-field/selected-content.d.ts +1 -1
- package/dist/ui/components/select-field/selected-content.js +1 -1
- package/dist/ui/components/select-field/selected-content.js.map +1 -1
- package/dist/ui/components/select-field/subcomponents/CommandItemList.d.ts +1 -1
- package/dist/ui/components/select-field/subcomponents/CommandItemList.js +1 -1
- package/dist/ui/components/select-field/subcomponents/CommandItemList.js.map +1 -1
- package/dist/ui/components/select-field/use-select-field.d.ts +1 -1
- package/dist/ui/components/select-field/use-select-field.js.map +1 -1
- package/dist/ui/components/text-field/text-field.d.ts +1 -1
- package/dist/ui/components/text-field/text-field.js +1 -1
- package/dist/ui/components/text-field/text-field.js.map +1 -1
- package/dist/ui/components/text-input/text-input-diff.d.ts +1 -1
- package/dist/ui/components/text-input/text-input-diff.js.map +1 -1
- package/dist/ui/components/text-input/text-input.d.ts +1 -1
- package/dist/ui/components/text-input/text-input.js +2 -2
- package/dist/ui/components/text-input/text-input.js.map +1 -1
- package/dist/ui/components/text-input/types.d.ts +1 -1
- package/dist/ui/components/tooltip/tooltip.d.ts +1 -1
- package/dist/ui/components/tooltip/tooltip.js +2 -2
- package/dist/ui/components/tooltip/tooltip.js.map +1 -1
- package/dist/ui/components/types.d.ts +1 -1
- package/dist/ui/components/value-transformer/value-transformer.d.ts +1 -1
- package/dist/ui/components/value-transformer/value-transformer.js +1 -1
- package/dist/ui/components/value-transformer/value-transformer.js.map +1 -1
- package/dist/ui/components/with-field-validation/with-field-validation.d.ts +1 -1
- package/dist/ui/components/with-field-validation/with-field-validation.js +1 -1
- package/dist/ui/components/with-field-validation/with-field-validation.js.map +1 -1
- package/dist/ui/index.d.ts +38 -38
- package/dist/ui/lib/date-picker.d.ts +1 -1
- package/dist/ui/lib/date-picker.js.map +1 -1
- package/dist/ui/lib/date-time-picker.js.map +1 -1
- package/dist/ui/lib/deep-equal.js.map +1 -1
- package/dist/ui/lib/is-empty.js.map +1 -1
- package/dist/ui/lib/shared-value-transformers.d.ts +1 -1
- package/dist/ui/lib/shared-value-transformers.js.map +1 -1
- package/dist/ui/lib/types.d.ts +1 -1
- package/dist/ui/lib/value-cast.js.map +1 -1
- package/dist/ui/types.d.ts +2 -2
- package/dist/{use-id-autocomplete-FGV0tDeG.d.ts → use-id-autocomplete-JE8w4UXf.d.ts} +2 -2
- package/dist/{use-id-autocomplete-FGV0tDeG.d.ts.map → use-id-autocomplete-JE8w4UXf.d.ts.map} +1 -1
- package/dist/{use-search-autocomplete-BYRTKJjd.d.ts → use-search-autocomplete-IfcQ_gKh.d.ts} +2 -2
- package/dist/{use-search-autocomplete-BYRTKJjd.d.ts.map → use-search-autocomplete-IfcQ_gKh.d.ts.map} +1 -1
- package/dist/{value-transformer-BDrKuBqy.d.ts → value-transformer-2yvrA5Rp.d.ts} +2 -2
- package/dist/{value-transformer-BDrKuBqy.d.ts.map → value-transformer-2yvrA5Rp.d.ts.map} +1 -1
- package/dist/{with-field-validation-DQwlMTzr.d.ts → with-field-validation-YcGrdIrv.d.ts} +2 -2
- package/dist/{with-field-validation-DQwlMTzr.d.ts.map → with-field-validation-YcGrdIrv.d.ts.map} +1 -1
- package/package.json +13 -5
- package/dist/connect-CrXsa33f.js.map +0 -1
- package/dist/form-group-BDgpr5u8.d.ts.map +0 -1
- package/dist/index-C37KRTG6.d.ts.map +0 -1
- package/dist/src-BX8sU0Tq.js.map +0 -1
- /package/dist/{index-C2geSgue.d.ts → index-E7Wvm5uX.d.ts} +0 -0
- /package/dist/{index-Dw5cCt-A.d.ts → index-J3R2mDFQ.d.ts} +0 -0
package/dist/rwa/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Fragment","Fragment"],"sources":["../../src/rwa/constants/names.ts","../../src/rwa/constants/table.ts","../../src/rwa/components/formatted-number.tsx","../../src/rwa/constants/transactions.ts","../../src/rwa/utils/calculations.ts","../../src/rwa/utils/date.ts","../../src/rwa/utils/validators.ts","../../src/rwa/utils/table.tsx","../../src/rwa/context/editor-context.tsx","../../src/rwa/components/table-cell.tsx","../../src/rwa/components/table-row.tsx","../../src/rwa/hooks/useSortTableItems.ts","../../src/rwa/hooks/useTableData.tsx","../../src/rwa/constants/dependent-items.ts","../../src/rwa/components/cash-balance-change.tsx","../../src/rwa/components/entry-time-label.tsx","../../src/rwa/components/text-input.tsx","../../src/rwa/components/number-input.tsx","../../src/rwa/components/select.tsx","../../src/rwa/components/fee-transactions-table.tsx","../../src/services/viem.ts","../../src/rwa/components/transaction-reference.tsx","../../src/rwa/components/unit-price.tsx","../../src/rwa/components/modal-context.ts","../../src/rwa/components/use-modal.ts","../../src/rwa/utils/form.ts","../../src/rwa/hooks/useFormInputs.tsx","../../src/rwa/hooks/useDefaultFormValues.ts","../../src/rwa/hooks/useSubmit.ts","../../src/rwa/hooks/useTableForm.tsx","../../src/rwa/components/button.tsx","../../src/rwa/components/form-inputs.tsx","../../src/rwa/components/item-details.tsx","../../src/rwa/constants/columns.ts","../../src/rwa/hooks/useColumnPriority.ts","../../src/rwa/hooks/useTableHeight.ts","../../src/rwa/components/table-base.tsx","../../src/rwa/components/table.tsx","../../src/rwa/components/table-with-form.tsx","../../src/rwa/components/accounts-table.tsx","../../src/rwa/components/assets-table.tsx","../../src/rwa/components/modal-form-inputs.tsx","../../src/rwa/components/create-item-modal.tsx","../../src/rwa/components/delete-item-modal.tsx","../../src/rwa/components/modal-components.ts","../../src/rwa/components/modal-manager.tsx","../../src/rwa/components/other-tab.tsx","../../src/rwa/components/rwa-tab-content.tsx","../../src/rwa/components/portfolio-tab.tsx","../../src/rwa/components/group-transactions-table.tsx","../../src/rwa/components/transactions-tab.tsx","../../src/rwa/components/tabs.tsx","../../src/rwa/components/editor.tsx","../../src/rwa/components/form-row.tsx","../../src/rwa/components/header-label.tsx"],"sourcesContent":["import type { TableName } from \"../types.js\";\n\nconst SERVICE_PROVIDER_FEE_TYPE = \"SERVICE_PROVIDER_FEE_TYPE\";\nconst FIXED_INCOME_TYPE = \"FIXED_INCOME_TYPE\";\nconst ACCOUNT = \"ACCOUNT\";\nconst TRANSACTION = \"TRANSACTION\";\nconst ASSET = \"ASSET\";\nconst SPV = \"SPV\";\n\nexport const tableNames = {\n SERVICE_PROVIDER_FEE_TYPE,\n FIXED_INCOME_TYPE,\n ACCOUNT,\n TRANSACTION,\n ASSET,\n SPV,\n} as const;\n\nexport const tableLabels: Record<TableName, string> = {\n SERVICE_PROVIDER_FEE_TYPE: \"Service Provider Fee Type\",\n FIXED_INCOME_TYPE: \"Fixed Income Asset Type\",\n ACCOUNT: \"Account\",\n TRANSACTION: \"Transaction\",\n ASSET: \"Asset\",\n SPV: \"SPV\",\n} as const;\n\nexport const editorStateKeysByTableName = {\n SERVICE_PROVIDER_FEE_TYPE: \"serviceProviderFeeTypes\",\n FIXED_INCOME_TYPE: \"fixedIncomeTypes\",\n ACCOUNT: \"accounts\",\n TRANSACTION: \"transactions\",\n ASSET: \"portfolio\",\n SPV: \"spvs\",\n} as const;\n\nexport const deleteEditorActionInputsByTableName = {\n SERVICE_PROVIDER_FEE_TYPE: \"DELETE_SERVICE_PROVIDER_FEE_TYPE\",\n FIXED_INCOME_TYPE: \"DELETE_FIXED_INCOME_TYPE\",\n ACCOUNT: \"DELETE_ACCOUNT\",\n TRANSACTION: \"DELETE_TRANSACTION\",\n ASSET: \"DELETE_ASSET\",\n SPV: \"DELETE_SPV\",\n} as const;\n","import type {\n EditorAction,\n GroupTransactionType,\n RealWorldAssetsState,\n TableName,\n TableNameFor,\n} from \"../types.js\";\n\nexport const defaultColumnCountByTableWidth = {\n 1520: 10,\n 1394: 9,\n 1239: 8,\n 1112: 7,\n 984: 6,\n};\n\nexport const cashTransactionSignByTransactionType: Record<\n GroupTransactionType,\n -1 | 1\n> = {\n AssetSale: 1,\n PrincipalDraw: 1,\n AssetPurchase: -1,\n PrincipalReturn: -1,\n FeesIncome: 1,\n FeesPayment: -1,\n InterestIncome: 1,\n InterestPayment: -1,\n} as const;\n\nexport const assetTransactionSignByTransactionType = {\n AssetSale: -1,\n AssetPurchase: 1,\n} as const;\n\nexport function getStateKeyForTableName(tableName: TableName) {\n const stateKeysByTableName: Record<TableName, keyof RealWorldAssetsState> = {\n ASSET: \"portfolio\",\n TRANSACTION: \"transactions\",\n ACCOUNT: \"accounts\",\n FIXED_INCOME_TYPE: \"fixedIncomeTypes\",\n SERVICE_PROVIDER_FEE_TYPE: \"serviceProviderFeeTypes\",\n SPV: \"spvs\",\n } as const;\n\n return stateKeysByTableName[tableName];\n}\n\nexport function getTableNameFor<A extends EditorAction>(\n action: A,\n): TableNameFor<A> {\n const parts = action.type.split(\"_\");\n const entity = parts.slice(1).join(\"_\");\n return entity as TableNameFor<A>;\n}\nexport function getActionOperationType<A extends EditorAction>(action: A) {\n const operation = action.type.split(\"_\")[0];\n return operation as \"CREATE\" | \"EDIT\" | \"DELETE\";\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { NumericFormat } from \"react-number-format\";\n\ntype Props = Omit<\n ComponentPropsWithoutRef<typeof NumericFormat>,\n \"displayType\"\n> & {\n readonly currency?: \"USD\";\n};\n\nexport function FormattedNumber(props: Props) {\n const {\n value,\n currency,\n decimalScale = 2,\n thousandSeparator = \",\",\n fixedDecimalScale = true,\n } = props;\n\n const prefix = currency === \"USD\" ? \"$\" : undefined;\n\n return (\n <NumericFormat\n decimalScale={decimalScale}\n displayType=\"text\"\n fixedDecimalScale={fixedDecimalScale}\n prefix={prefix}\n thousandSeparator={thousandSeparator}\n value={value}\n />\n );\n}\n","export const ASSET_PURCHASE = \"AssetPurchase\";\nexport const ASSET_SALE = \"AssetSale\";\nexport const PRINCIPAL_DRAW = \"PrincipalDraw\";\nexport const PRINCIPAL_RETURN = \"PrincipalReturn\";\nexport const INTEREST_INCOME = \"InterestIncome\";\nexport const INTEREST_PAYMENT = \"InterestPayment\";\nexport const FEES_INCOME = \"FeesIncome\";\nexport const FEES_PAYMENT = \"FeesPayment\";\n\nexport const principalGroupTransactions = [\n PRINCIPAL_DRAW,\n PRINCIPAL_RETURN,\n] as const;\n\nexport const assetGroupTransactions = [ASSET_PURCHASE, ASSET_SALE] as const;\n\nexport const feesTransactions = [FEES_INCOME, FEES_PAYMENT] as const;\n\nexport const interestTransactions = [\n INTEREST_INCOME,\n INTEREST_PAYMENT,\n] as const;\n\nexport const allGroupTransactionTypes = [\n ...principalGroupTransactions,\n ...assetGroupTransactions,\n ...feesTransactions,\n ...interestTransactions,\n] as const;\n\nexport const groupTransactionTypeLabels = {\n AssetPurchase: \"Asset purchase\",\n AssetSale: \"Asset sale\",\n PrincipalDraw: \"Principal draw\",\n PrincipalReturn: \"Principal return\",\n InterestIncome: \"Interest income\",\n InterestPayment: \"Interest payment\",\n FeesIncome: \"Fees income\",\n FeesPayment: \"Fees payment\",\n} as const;\n","import { all, create } from \"mathjs\";\nimport { ASSET_PURCHASE, ASSET_SALE } from \"../constants/transactions.js\";\nimport type {\n FixedIncome,\n FixedIncomeType,\n GroupTransaction,\n} from \"../types.js\";\n\ntype NumericKeys<T> = {\n [K in keyof T]: T[K] extends number ? K : never;\n}[keyof T];\n\nexport function sumTotalForProperty<T extends Record<string, any>>(\n items: T[],\n property: NumericKeys<T>,\n): number {\n return items.reduce((acc, item) => acc + Number(item[property]), 0);\n}\n\nexport const math = create(all, {\n number: \"BigNumber\",\n});\n\nexport function calculateCurrentValue(props: {\n asset: FixedIncome | undefined;\n transactions: GroupTransaction[];\n fixedIncomeTypes: FixedIncomeType[];\n currentDate?: Date;\n}) {\n const {\n asset,\n transactions,\n fixedIncomeTypes,\n currentDate = new Date(),\n } = props;\n\n // asset must have a maturity date to calculate\n if (!asset?.maturity) return null;\n\n const fixedIncomeType = fixedIncomeTypes.find(\n ({ id }) => id === asset.fixedIncomeTypeId,\n );\n\n if (!fixedIncomeType) return null;\n\n // currently only Treasury Bills are supported\n if (fixedIncomeType.name !== \"Treasury Bill\") return null;\n\n const purchaseTransactionsForAsset = transactions.filter(\n ({ type, fixedIncomeTransaction }) =>\n type === ASSET_PURCHASE && fixedIncomeTransaction?.assetId === asset.id,\n );\n\n const saleTransactionsForAsset = transactions.filter(\n ({ type, fixedIncomeTransaction }) =>\n type === ASSET_SALE && fixedIncomeTransaction?.assetId === asset.id,\n );\n\n // formula is meaningless if there are no purchase or sale transactions\n if (!purchaseTransactionsForAsset.length && !saleTransactionsForAsset.length)\n return null;\n\n const currentDateMs = math.bignumber(currentDate.getTime());\n const maturityDateMs = math.bignumber(new Date(asset.maturity).getTime());\n\n // do not calculate if the asset has matured\n if (maturityDateMs.lessThan(currentDateMs)) return null;\n\n const purchaseDateMs = math.bignumber(new Date(asset.purchaseDate).getTime());\n const sumQuantities = calculateSumQuantity(purchaseTransactionsForAsset).sub(\n calculateSumQuantity(saleTransactionsForAsset),\n );\n const salesProceeds = math.bignumber(asset.salesProceeds);\n const realizedSurplus = math.bignumber(asset.realizedSurplus);\n const purchaseProceeds = math.bignumber(asset.purchaseProceeds);\n const currentPurchaseProceeds = purchaseProceeds\n .sub(salesProceeds)\n .add(realizedSurplus);\n const totalDiscount = sumQuantities.sub(currentPurchaseProceeds);\n\n const currentValue = currentDateMs\n .sub(purchaseDateMs)\n .div(maturityDateMs.sub(purchaseDateMs))\n .mul(totalDiscount)\n .add(currentPurchaseProceeds)\n .toNumber();\n\n return currentValue;\n}\nexport function calculateSumQuantity(transactions: GroupTransaction[]) {\n return transactions.reduce((sum, { fixedIncomeTransaction }) => {\n if (!fixedIncomeTransaction) return sum;\n return sum.add(math.bignumber(fixedIncomeTransaction.amount));\n }, math.bignumber(0));\n}\n","import { formatInTimeZone } from \"date-fns-tz/formatInTimeZone\";\n\nexport function formatDateForDisplay(\n date: Date | string,\n displayTime = true,\n isUTC = false,\n) {\n const formatString = displayTime ? \"yyyy/MM/dd, HH:mm:ss zzz\" : \"yyyy/MM/dd\";\n const timeZone = isUTC ? \"UTC\" : getTimeZone();\n return formatInTimeZone(date, timeZone, formatString);\n}\n\nexport function isISODate(str: string) {\n if (!/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(str)) return false;\n const d = new Date(str);\n return d instanceof Date && !isNaN(d.getTime()) && d.toISOString() === str;\n}\n\nexport function getTimeZone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function isoDateStringToDateInput(\n isoDateString: string,\n withTime = false,\n) {\n const format = withTime ? \"yyyy-MM-dd'T'HH:mm:ss\" : \"yyyy-MM-dd\";\n const timeZone = getTimeZone();\n return formatInTimeZone(isoDateString, timeZone, format);\n}\n","import { assetGroupTransactions } from \"../constants/transactions.js\";\nimport type {\n Asset,\n AssetGroupTransactionType,\n CashAsset,\n FixedIncome,\n GroupTransactionType,\n} from \"../types.js\";\n\nexport function isAssetGroupTransactionType(\n type: GroupTransactionType,\n): type is AssetGroupTransactionType {\n return assetGroupTransactions.includes(\n type as (typeof assetGroupTransactions)[number],\n );\n}\n\nexport function isFixedIncomeAsset(\n asset: Asset | undefined | null,\n): asset is FixedIncome {\n if (!asset) return false;\n if (asset.type === \"FixedIncome\") return true;\n if (\"fixedIncomeId\" in asset) return true;\n return false;\n}\n\nexport function isCashAsset(\n asset: Asset | undefined | null,\n): asset is CashAsset {\n if (!asset) return false;\n if (asset.type === \"Cash\") return true;\n if (\"currency\" in asset) return true;\n return false;\n}\n\nexport function getFixedIncomeAssets(portfolio: Asset[]) {\n return portfolio.filter((a) => isFixedIncomeAsset(a));\n}\n\nexport function getCashAsset(portfolio: Asset[]) {\n const cashAsset = portfolio.find((a) => isCashAsset(a));\n if (!cashAsset) {\n throw new Error(\"Cash asset not found\");\n }\n return cashAsset;\n}\n","import type { InputMaybe } from \"@powerhousedao/shared/document-model\";\nimport { FormattedNumber } from \"../components/formatted-number.js\";\nimport {\n assetTransactionSignByTransactionType,\n cashTransactionSignByTransactionType,\n} from \"../constants/table.js\";\nimport {\n FEES_INCOME,\n feesTransactions,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport type {\n GroupTransactionType,\n Item,\n ItemData,\n RealWorldAssetsState,\n TableItem,\n TableItemType,\n TableName,\n TransactionFeeInput,\n} from \"../types.js\";\nimport { calculateCurrentValue } from \"./calculations.js\";\nimport { formatDateForDisplay, isISODate } from \"./date.js\";\nimport {\n getFixedIncomeAssets,\n isAssetGroupTransactionType,\n} from \"./validators.js\";\n\nexport function handleDateInTable(\n maybeDate: string | Date,\n displayTime = true,\n) {\n const isDate = maybeDate instanceof Date || isISODate(maybeDate);\n if (isDate) {\n const dateStr =\n maybeDate instanceof Date ? maybeDate.toISOString() : maybeDate;\n return formatDateForDisplay(dateStr, displayTime);\n }\n return maybeDate;\n}\n\nexport function handleTableDatum(\n datum: ItemData,\n decimalScale = 2,\n displayTime = true,\n) {\n if (datum === null || datum === undefined) return \"--\";\n\n if (typeof datum === \"number\")\n return <FormattedNumber decimalScale={decimalScale} value={datum} />;\n\n return handleDateInTable(datum, displayTime);\n}\n\nexport function calculateUnitPrice(\n cashAmount: InputMaybe<number>,\n fixedIncomeAmount: InputMaybe<number>,\n) {\n if (!cashAmount || !fixedIncomeAmount) return 0;\n return cashAmount / fixedIncomeAmount;\n}\n\nexport function calculateCashBalanceChange(\n transactionType: InputMaybe<GroupTransactionType>,\n cashAmount: InputMaybe<number>,\n fees: InputMaybe<TransactionFeeInput[]>,\n) {\n if (!cashAmount || !transactionType) return 0;\n\n const sign = cashTransactionSignByTransactionType[transactionType];\n\n const feeAmounts = (fees?.map((fee) => fee.amount).filter(Boolean) ??\n []) as number[];\n\n const totalFees = feeAmounts.reduce((acc, fee) => acc + fee, 0);\n\n return cashAmount * sign - totalFees;\n}\n\nfunction makeFixedIncomeTypesTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"FIXED_INCOME_TYPE\">[] {\n const { fixedIncomeTypes } = state;\n return addItemNumber(fixedIncomeTypes);\n}\n\nfunction makeSPVsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"SPV\">[] {\n const { spvs } = state;\n return addItemNumber(spvs);\n}\n\nfunction makeAssetsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"ASSET\">[] {\n const { portfolio, transactions, fixedIncomeTypes } = state;\n const currentDate = new Date();\n const fixedIncomes = getFixedIncomeAssets(portfolio);\n\n const tableItems = fixedIncomes.map((fixedIncome) => {\n const currentValue = calculateCurrentValue({\n asset: fixedIncome,\n currentDate,\n transactions,\n fixedIncomeTypes,\n });\n\n return {\n ...fixedIncome,\n currentValue,\n };\n });\n\n return addItemNumber(tableItems);\n}\nfunction maybeAddSignToAmount(amount: number | undefined, sign: 1 | -1) {\n if (!amount) return amount;\n return amount * sign;\n}\n\nfunction makeGroupTransactionsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"TRANSACTION\">[] {\n const { transactions, portfolio } = state;\n const fixedIncomes = getFixedIncomeAssets(portfolio);\n\n const tableData = transactions.map((transaction) => {\n const id = transaction.id;\n const entryTime = transaction.entryTime;\n const asset = fixedIncomes.find(\n (asset) => asset.id === transaction.fixedIncomeTransaction?.assetId,\n )?.name;\n const type = transaction.type;\n const typeLabel = groupTransactionTypeLabels[type];\n const cashTransactionSign = cashTransactionSignByTransactionType[type];\n const assetTransactionSign = isAssetGroupTransactionType(type)\n ? assetTransactionSignByTransactionType[type]\n : 1;\n const quantity = maybeAddSignToAmount(\n transaction.fixedIncomeTransaction?.amount,\n assetTransactionSign,\n );\n const cashAmount = maybeAddSignToAmount(\n transaction.cashTransaction.amount,\n cashTransactionSign,\n );\n const totalFees = feesTransactions.includes(\n transaction.type as (typeof feesTransactions)[number],\n )\n ? (maybeAddSignToAmount(\n transaction.cashTransaction.amount,\n transaction.type === FEES_INCOME ? -1 : 1,\n ) ?? 0)\n : (transaction.fees?.reduce((acc, fee) => acc + fee.amount, 0) ?? 0);\n const cashBalanceChange = transaction.cashBalanceChange;\n\n return {\n ...transaction,\n id,\n type,\n typeLabel,\n entryTime,\n asset,\n quantity,\n cashAmount,\n totalFees,\n cashBalanceChange,\n };\n });\n\n return addItemNumber(tableData);\n}\nfunction makeAccountsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"ACCOUNT\">[] {\n const { accounts, principalLenderAccountId } = state;\n\n const withoutPrincipalLender = accounts.filter(\n (account) => account.id !== principalLenderAccountId,\n );\n const tableData = addItemNumber(withoutPrincipalLender);\n\n return tableData;\n}\n\nfunction makeServiceProviderFeeTypesTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"SERVICE_PROVIDER_FEE_TYPE\">[] {\n const { serviceProviderFeeTypes, accounts } = state;\n\n const tableData = serviceProviderFeeTypes.map((serviceProviderFeeType) => {\n const account = accounts.find(\n (account) => account.id === serviceProviderFeeType.accountId,\n );\n\n return {\n ...serviceProviderFeeType,\n accountName: account?.label,\n accountReference: account?.reference,\n };\n });\n\n return addItemNumber(tableData);\n}\nfunction addItemNumber<TItem extends Item>(items: TItem[]) {\n return items.map((item, index) => ({\n ...item,\n itemNumber: index + 1,\n })) as TableItem<TItem>[];\n}\n\nexport function makeTableData(\n tableName: TableName,\n state: RealWorldAssetsState,\n) {\n return tableDataMakersByTableName[tableName](state);\n}\n\nexport const tableDataMakersByTableName = {\n ASSET: makeAssetsTableData,\n TRANSACTION: makeGroupTransactionsTableData,\n ACCOUNT: makeAccountsTableData,\n FIXED_INCOME_TYPE: makeFixedIncomeTypesTableData,\n SERVICE_PROVIDER_FEE_TYPE: makeServiceProviderFeeTypesTableData,\n SPV: makeSPVsTableData,\n} as const;\n","import type { ReactNode } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport {\n getActionOperationType,\n getStateKeyForTableName,\n getTableNameFor,\n} from \"../constants/table.js\";\nimport type {\n CashAsset,\n EditorAction,\n EditorDispatcher,\n FixedIncome,\n Operation,\n RealWorldAssetsState,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { makeTableData } from \"../utils/table.js\";\nimport { getCashAsset, getFixedIncomeAssets } from \"../utils/validators.js\";\n\nexport type RWAEditorContextProps = {\n readonly isAllowedToCreateDocuments: boolean;\n readonly isAllowedToEditDocuments: boolean;\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n readonly onSwitchboardLinkClick: (() => void) | undefined;\n readonly onExport: () => void;\n readonly onClose: () => void;\n readonly onShowRevisionHistory: () => void;\n};\ntype TEditorContext = RWAEditorContextProps &\n RealWorldAssetsState & {\n readonly cashAsset: CashAsset;\n readonly fixedIncomes: FixedIncome[];\n readonly selectedTableItem: TableItemType<TableName> | null;\n readonly selectedTableName: TableName | null;\n readonly operation: Operation;\n readonly viewItem: (\n item: TableItemType<TableName>,\n tableName: TableName,\n ) => void;\n readonly createItem: (tableName: TableName) => void;\n readonly editItem: (\n item: TableItemType<TableName>,\n tableName: TableName,\n ) => void;\n readonly clearSelected: () => void;\n readonly getIsFormOpen: (tableName: TableName) => boolean;\n readonly handleAction: (action: EditorAction) => void;\n readonly handleUndo: () => void;\n readonly handleRedo: () => void;\n };\n\nconst defaultEditorContextValue: TEditorContext = {\n accounts: [],\n fixedIncomeTypes: [],\n portfolio: [],\n principalLenderAccountId: \"\",\n serviceProviderFeeTypes: [],\n spvs: [],\n transactions: [],\n fixedIncomes: [],\n cashAsset: {\n id: \"\",\n type: \"Cash\",\n currency: \"USD\",\n balance: 0,\n spvId: \"\",\n },\n isAllowedToCreateDocuments: false,\n isAllowedToEditDocuments: false,\n canUndo: false,\n canRedo: false,\n operation: null,\n onSwitchboardLinkClick: undefined,\n selectedTableItem: null,\n selectedTableName: null,\n getIsFormOpen: () => false,\n clearSelected: () => {},\n viewItem: () => {},\n createItem: () => {},\n editItem: () => {},\n onExport: () => {},\n onClose: () => {},\n handleUndo: () => {},\n handleRedo: () => {},\n onShowRevisionHistory: () => {},\n handleAction: () => {},\n};\n\nconst EditorContext = createContext(defaultEditorContextValue);\nEditorContext.displayName = \"EditorContext\";\n\ntype TableState = {\n selectedTableItem: TableItemType<TableName> | null;\n selectedTableName: TableName | null;\n operation: Operation;\n};\n\ntype TableAction =\n | {\n type: \"VIEW_ITEM\";\n item: TableItemType<TableName>;\n tableName: TableName;\n }\n | { type: \"CREATE_ITEM\"; tableName: TableName }\n | {\n type: \"EDIT_ITEM\";\n item: TableItemType<TableName>;\n tableName: TableName;\n }\n | { type: \"CLEAR_SELECTED\" };\n\nfunction tableReducer(state: TableState, action: TableAction): TableState {\n switch (action.type) {\n case \"VIEW_ITEM\":\n return {\n selectedTableItem: action.item,\n selectedTableName: action.tableName,\n operation: \"view\",\n };\n case \"CREATE_ITEM\":\n return {\n selectedTableItem: null,\n selectedTableName: action.tableName,\n operation: \"create\",\n };\n case \"EDIT_ITEM\":\n return {\n selectedTableItem: action.item,\n selectedTableName: action.tableName,\n operation: \"edit\",\n };\n case \"CLEAR_SELECTED\":\n return {\n selectedTableItem: null,\n selectedTableName: null,\n operation: null,\n };\n default:\n return state;\n }\n}\n\nexport function RWAEditorContextProvider(\n props: RWAEditorContextProps & {\n readonly children: ReactNode;\n readonly state: RealWorldAssetsState;\n readonly editorDispatcher: EditorDispatcher;\n readonly undo: () => void;\n readonly redo: () => void;\n },\n) {\n const {\n children,\n state,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n canUndo,\n canRedo,\n undo,\n redo,\n editorDispatcher,\n onExport,\n onClose,\n onSwitchboardLinkClick,\n onShowRevisionHistory,\n } = props;\n const [editorState, setEditorState] = useState(state);\n const stateRef = useRef(state);\n const [tableState, tableDispatch] = useReducer(tableReducer, {\n selectedTableItem: null,\n selectedTableName: null,\n operation: null,\n });\n\n const { selectedTableItem, selectedTableName, operation } = tableState;\n\n useEffect(() => {\n if (operation === null || operation === \"view\") {\n setEditorState(stateRef.current);\n }\n }, [operation, state]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const {\n accounts,\n fixedIncomeTypes,\n portfolio,\n principalLenderAccountId,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n } = editorState;\n\n const cashAsset = useMemo(() => getCashAsset(portfolio), [portfolio]);\n\n const fixedIncomes = useMemo(\n () => getFixedIncomeAssets(portfolio),\n [portfolio],\n );\n\n const handleUndo = useCallback(() => {\n if (!canUndo) return;\n undo();\n }, [canUndo, undo]);\n\n const handleRedo = useCallback(() => {\n if (!canRedo) return;\n redo();\n }, [canRedo, redo]);\n\n const getIsFormOpen = useCallback(\n (tableName: TableName) => selectedTableName === tableName,\n [selectedTableName],\n );\n\n const viewItem = useCallback(\n (item: TableItemType<TableName>, tableName: TableName) => {\n tableDispatch({ type: \"VIEW_ITEM\", item, tableName });\n },\n [],\n );\n\n const createItem = useCallback((tableName: TableName) => {\n tableDispatch({ type: \"CREATE_ITEM\", tableName });\n }, []);\n\n const editItem = useCallback(\n (item: TableItemType<TableName>, tableName: TableName) => {\n tableDispatch({ type: \"EDIT_ITEM\", item, tableName });\n },\n [],\n );\n\n const clearSelected = useCallback(() => {\n tableDispatch({ type: \"CLEAR_SELECTED\" });\n setEditorState(stateRef.current);\n }, []);\n\n const handleAction = useCallback(\n (action: EditorAction) => {\n try {\n const result = editorDispatcher(action);\n const actionOperationType = getActionOperationType(action);\n\n if (actionOperationType === \"DELETE\" || !result) {\n clearSelected();\n return;\n }\n const tableName = getTableNameFor(action);\n const stateKey = getStateKeyForTableName(tableName);\n const currentStateForKey = stateRef.current[stateKey];\n if (typeof currentStateForKey === \"string\") return;\n\n if (actionOperationType === \"CREATE\") {\n const newStateForKey = [...currentStateForKey, result];\n const newState = {\n ...stateRef.current,\n [stateKey]: newStateForKey,\n };\n stateRef.current = newState;\n setEditorState(newState);\n\n if (tableName === selectedTableName) {\n const newTableData = makeTableData(tableName, newState);\n const newTableItem = newTableData.find(\n (item) => item.id === result.id,\n );\n\n if (newTableItem) {\n viewItem(newTableItem, tableName);\n }\n }\n }\n\n if (actionOperationType === \"EDIT\") {\n const newStateForKey = currentStateForKey.map((item) =>\n item.id === result.id ? result : item,\n );\n const newState = {\n ...stateRef.current,\n [stateKey]: newStateForKey,\n };\n stateRef.current = newState;\n setEditorState(newState);\n const newTableData = makeTableData(tableName, newState);\n const newTableItem = newTableData.find(\n (item) => item.id === result.id,\n );\n if (newTableItem) {\n editItem(newTableItem, tableName);\n }\n }\n } catch (error) {\n console.error(`Failed to dispatch action ${action.type}`, error);\n }\n },\n [clearSelected, editorDispatcher, editItem, selectedTableName, viewItem],\n );\n\n const value = useMemo(\n () => ({\n accounts,\n fixedIncomeTypes,\n portfolio,\n principalLenderAccountId,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n cashAsset,\n fixedIncomes,\n canUndo,\n canRedo,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n selectedTableItem,\n selectedTableName,\n operation,\n handleAction,\n handleUndo,\n handleRedo,\n viewItem,\n createItem,\n editItem,\n clearSelected,\n getIsFormOpen,\n onExport,\n onClose,\n onSwitchboardLinkClick,\n onShowRevisionHistory,\n }),\n [\n accounts,\n canRedo,\n canUndo,\n cashAsset,\n clearSelected,\n createItem,\n editItem,\n fixedIncomeTypes,\n fixedIncomes,\n getIsFormOpen,\n handleAction,\n handleRedo,\n handleUndo,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n onClose,\n onExport,\n onShowRevisionHistory,\n onSwitchboardLinkClick,\n operation,\n portfolio,\n principalLenderAccountId,\n selectedTableItem,\n selectedTableName,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n viewItem,\n ],\n );\n return (\n <EditorContext.Provider value={value}>{children}</EditorContext.Provider>\n );\n}\n\nexport function useEditorContext() {\n return useContext(EditorContext);\n}\n","import { Icon } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableItemType, TableName } from \"../types.js\";\n\nexport const RWATableCell: React.FC<ComponentPropsWithoutRef<\"td\">> = (\n props,\n) => (\n <td\n {...props}\n className={twMerge(\n \"truncate border-l border-gray-300 px-3 py-2 text-xs font-medium text-gray-900 first:border-l-0\",\n props.className,\n )}\n />\n);\n\nexport function ItemNumberCell(props: { readonly itemNumber: number }) {\n return <RWATableCell className=\"w-4\">{props.itemNumber}</RWATableCell>;\n}\n\nexport function MoreDetailsCell(props: {\n readonly isSelected: boolean;\n readonly tableName: TableName;\n readonly tableItem: TableItemType<TableName>;\n}) {\n const { isSelected, tableName, tableItem } = props;\n const { viewItem, clearSelected } = useEditorContext();\n\n const onClick = useCallback(() => {\n if (isSelected) {\n clearSelected();\n return;\n }\n viewItem(tableItem, tableName);\n }, [clearSelected, isSelected, tableItem, tableName, viewItem]);\n\n return (\n <RWATableCell className=\"w-4\">\n <button\n className=\"flex size-full items-center justify-center\"\n onClick={onClick}\n >\n <Icon\n className={twMerge(\"text-gray-600\", isSelected && \"rotate-180\")}\n name=\"CaretDown\"\n size={16}\n />\n </button>\n </RWATableCell>\n );\n}\n","import type { ComponentPropsWithRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type RWATableRowProps = ComponentPropsWithRef<\"tr\">;\n\nexport const RWATableRow = forwardRef(function RWATableRow(\n props: RWATableRowProps,\n ref: React.Ref<HTMLTableRowElement>,\n) {\n const { children, className, ...delegated } = props;\n\n return (\n <tr\n {...delegated}\n className={twMerge(\"odd:bg-white even:bg-gray-50\", className)}\n ref={ref}\n >\n {children}\n </tr>\n );\n});\n","import type { Identifier, Order } from \"natural-orderby\";\nimport { orderBy } from \"natural-orderby\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { Item, TableItem } from \"../types.js\";\n\n/**\n * Takes a list of items and returns a sorted list of items and a sort descriptor.\n * @param items - The list of items to sort.\n * @returns An object containing the sorted items and a sort handler func\n */\nexport function useSortTableItems<\n TItem extends Item,\n TTableData extends TableItem<TItem>,\n>(items: TTableData[] | undefined) {\n const [sortedItems, setSortedItems] = useState(items);\n const [column, setColumn] = useState<Identifier<TTableData>>();\n const [direction, setDirection] = useState<Order>(\"asc\");\n\n const sortHandler = useCallback(\n (column: Identifier<TTableData>, direction: Order) => {\n setColumn(column);\n setDirection(direction);\n },\n [],\n );\n\n useEffect(() => {\n if (!items) return;\n\n if (!column) {\n setSortedItems(items);\n return;\n }\n setSortedItems(orderBy(items, [column], [direction]));\n }, [column, direction, items, sortHandler]);\n\n return useMemo(\n () => ({ sortedItems, sortHandler }) as const,\n [sortedItems, sortHandler],\n );\n}\n","import { useMemo } from \"react\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableItemType, TableName } from \"../types.js\";\nimport { makeTableData } from \"../utils/table.js\";\nimport { useSortTableItems } from \"./useSortTableItems.js\";\n\nexport function useTableData<TTableName extends TableName>(\n tableName: TTableName,\n) {\n const inputs = useEditorContext();\n\n // type inference is going wrong because some of the table data types have a \"type\" field.\n // even though this \"type\" field is not relevant to the table data type, typescript insists on including it in its type narrowing logic.\n const tableData = useMemo(() => {\n return makeTableData(tableName, inputs);\n }, [inputs, tableName]) as unknown as TableItemType<TTableName>[];\n\n const { sortedItems, sortHandler } = useSortTableItems(tableData);\n\n return useMemo(\n () =>\n ({\n tableData: sortedItems ?? [],\n sortHandler,\n }) as const,\n [sortedItems, sortHandler],\n );\n}\n","import { useMemo } from \"react\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n FixedIncome,\n GroupTransaction,\n ServiceProviderFeeType,\n TableName,\n} from \"../types.js\";\n\nexport type DependentItemProps = {\n dependentTableName: TableName;\n dependentItems: { id: string; label: string }[];\n}[];\nexport function useDependentItemProps(\n tableName: TableName,\n itemId: string | null | undefined,\n) {\n const { fixedIncomes, serviceProviderFeeTypes, transactions } =\n useEditorContext();\n\n const dependentItemProps: DependentItemProps = useMemo(() => {\n if (!itemId) return [];\n\n switch (tableName) {\n case \"TRANSACTION\":\n return [];\n case \"SPV\":\n return [\n {\n dependentTableName: \"ASSET\",\n dependentItems: makeDependentAssetsList(\n tableName,\n itemId,\n fixedIncomes,\n ),\n },\n ];\n case \"FIXED_INCOME_TYPE\":\n return [\n {\n dependentTableName: \"ASSET\",\n dependentItems: makeDependentAssetsList(\n tableName,\n itemId,\n fixedIncomes,\n ),\n },\n ];\n case \"ASSET\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n ];\n case \"SERVICE_PROVIDER_FEE_TYPE\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n ];\n case \"ACCOUNT\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n {\n dependentTableName: \"SERVICE_PROVIDER_FEE_TYPE\",\n dependentItems: makeDependentServiceProviderFeeTypesList(\n itemId,\n serviceProviderFeeTypes,\n ),\n },\n ];\n }\n }, [fixedIncomes, itemId, serviceProviderFeeTypes, tableName, transactions]);\n\n return dependentItemProps;\n}\n\nexport function makeDependentServiceProviderFeeTypesList(\n itemId: string,\n serviceProviderFeeTypes: ServiceProviderFeeType[],\n) {\n const makeLabel = (asset: ServiceProviderFeeType) => ({\n id: asset.id,\n label: asset.name,\n });\n return serviceProviderFeeTypes\n .filter((f) => f.accountId === itemId)\n .map(makeLabel);\n}\n\nexport function makeDependentAssetsList(\n tableName: \"FIXED_INCOME_TYPE\" | \"SPV\",\n itemId: string,\n assets: FixedIncome[],\n) {\n const makeLabel = (asset: FixedIncome) => ({\n id: asset.id,\n label: asset.name,\n });\n switch (tableName) {\n case \"FIXED_INCOME_TYPE\":\n return assets\n .filter((asset) => asset.fixedIncomeTypeId === itemId)\n .map(makeLabel);\n case \"SPV\":\n return assets.filter((asset) => asset.spvId === itemId).map(makeLabel);\n }\n}\n\nexport function makeDependentTransactionsList(\n tableName: \"ASSET\" | \"ACCOUNT\" | \"SERVICE_PROVIDER_FEE_TYPE\",\n itemId: string,\n transactions: GroupTransaction[],\n) {\n const makeLabel = (t: GroupTransaction, index: number) => ({\n id: t.id,\n label: `Transaction #${index + 1}`,\n });\n\n switch (tableName) {\n case \"ASSET\":\n return transactions\n .filter((t) => t.fixedIncomeTransaction?.assetId === itemId)\n .map(makeLabel);\n case \"ACCOUNT\":\n return transactions\n .filter(\n (t) =>\n t.cashTransaction.accountId === itemId ||\n t.fixedIncomeTransaction?.accountId === itemId,\n )\n .map(makeLabel);\n case \"SERVICE_PROVIDER_FEE_TYPE\":\n return transactions\n .filter((t) =>\n t.fees?.some((f) => f.serviceProviderFeeTypeId === itemId),\n )\n .map(makeLabel);\n }\n}\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { calculateCashBalanceChange } from \"../utils/table.js\";\nimport { FormattedNumber } from \"./formatted-number.js\";\n\nexport function CashBalanceChange(props: {\n readonly control: Control<GroupTransactionFormInputs>;\n}) {\n const { control } = props;\n const cashAmount = useWatch({ control, name: \"cashAmount\" });\n const type = useWatch({ control, name: \"type\" });\n const fees = useWatch({ control, name: \"fees\" });\n\n const cashBalanceChange = calculateCashBalanceChange(type, cashAmount, fees);\n\n return (\n <div className=\"flex items-center justify-between border-t border-gray-300 bg-gray-100 p-3 font-semibold text-gray-800\">\n <div className=\"mr-6 text-sm text-gray-600\">Cash Balance Change $USD</div>\n <div className=\"h-px flex-1 border-b border-dashed border-gray-400\" />\n <div className=\"pl-8 text-sm text-gray-900\">\n <FormattedNumber value={cashBalanceChange} />\n </div>\n </div>\n );\n}\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { formatDateForDisplay } from \"../utils/date.js\";\n\nexport function EntryTimeLabel({\n control,\n}: {\n control: Control<GroupTransactionFormInputs>;\n}) {\n const value = useWatch({ control, name: \"entryTime\" });\n return value ? formatDateForDisplay(new Date(value), true, true) : null;\n}\n","import type { ComponentPropsWithRef, ForwardedRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ntype Props = Omit<ComponentPropsWithRef<\"input\">, \"type\"> & {\n readonly defaultValue?: string | number | null | undefined;\n readonly errorMessage?: string;\n readonly labelClassName?: string;\n readonly inputClassName?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport const RWATableTextInput = forwardRef(function RWATableTextInput(\n props: Props,\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const invalid = props[\"aria-invalid\"] === \"true\";\n const {\n errorMessage,\n labelClassName,\n inputClassName,\n errorMessageClassName,\n ...inputProps\n } = props;\n\n return (\n <label className={labelClassName}>\n <input\n {...inputProps}\n className={twMerge(\n \"h-8 w-full rounded-md border border-transparent bg-gray-100 p-3 text-right placeholder:text-gray-500 disabled:bg-transparent disabled:p-0 disabled:text-left\",\n invalid && \"border-red-900 outline-red-900 placeholder:text-red-800\",\n inputClassName,\n )}\n ref={ref}\n type=\"text\"\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\"text-sm text-red-900\", errorMessageClassName)}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </label>\n );\n});\n","import type { ComponentPropsWithRef } from \"react\";\nimport type {\n Control,\n ControllerProps,\n FieldValues,\n Path,\n} from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport { NumericFormat } from \"react-number-format\";\nimport { twMerge } from \"tailwind-merge\";\nimport { RWATableTextInput } from \"./text-input.js\";\n\ntype Props<ControlInputs extends FieldValues> = ComponentPropsWithRef<\n typeof RWATableTextInput\n> & {\n readonly name: Path<ControlInputs>;\n readonly control: Control<ControlInputs>;\n readonly disabled?: boolean;\n readonly currency?: \"USD\";\n readonly numericFormatProps?: ComponentPropsWithRef<typeof NumericFormat>;\n readonly rules?: ControllerProps<ControlInputs>[\"rules\"];\n readonly errorMessage?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport function RWANumberInput<ControlInputs extends FieldValues>(\n props: Props<ControlInputs>,\n) {\n const {\n name,\n control,\n currency,\n rules,\n errorMessage,\n errorMessageClassName,\n numericFormatProps,\n value: _,\n onChange: __,\n ...inputProps\n } = props;\n\n const {\n allowNegative = false,\n decimalScale = 2,\n thousandSeparator = \",\",\n fixedDecimalScale = true,\n } = numericFormatProps ?? {};\n\n const prefix = currency === \"USD\" ? \"$\" : undefined;\n\n const invalid = props[\"aria-invalid\"] === \"true\";\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value, ref } }) => (\n <>\n <NumericFormat\n {...inputProps}\n allowNegative={allowNegative}\n customInput={RWATableTextInput}\n decimalScale={decimalScale}\n fixedDecimalScale={fixedDecimalScale}\n getInputRef={ref}\n onValueChange={({ floatValue }) => onChange(floatValue)}\n prefix={prefix}\n thousandSeparator={thousandSeparator}\n value={value}\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\"text-sm text-red-900\", errorMessageClassName)}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </>\n )}\n rules={rules}\n />\n );\n}\n","import { Combobox } from \"#design-system/connect\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport type {\n Control,\n ControllerProps,\n FieldValues,\n Path,\n} from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type RWATableSelectProps<ControlInputs extends FieldValues> = Omit<\n ComponentPropsWithoutRef<typeof Combobox>,\n \"options\" | \"required\"\n> & {\n readonly options: { label: string; value: string }[];\n readonly disabled?: boolean;\n readonly name: Path<ControlInputs>;\n readonly control: Control<ControlInputs>;\n readonly rules?: ControllerProps<ControlInputs>[\"rules\"];\n readonly errorMessage?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport function RWATableSelect<ControlInputs extends FieldValues>(\n props: RWATableSelectProps<ControlInputs>,\n) {\n const {\n options,\n name,\n control,\n rules,\n errorMessage,\n errorMessageClassName,\n disabled = false,\n ...restProps\n } = props;\n\n const invalid = props[\"aria-invalid\"] === \"true\";\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, onBlur, value } }) =>\n disabled ? (\n <>{options.find((option) => option.value === value)?.label}</>\n ) : (\n <>\n <Combobox\n isDisabled={disabled}\n onBlur={onBlur}\n onChange={(option) =>\n !!option &&\n typeof option === \"object\" &&\n \"value\" in option &&\n onChange(option.value)\n }\n options={options}\n value={options.find((option) => option.value === value) ?? null}\n {...restProps}\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\n \"text-sm text-red-900\",\n errorMessageClassName,\n )}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </>\n )\n }\n rules={rules}\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport type { Control, FieldErrors, Path } from \"react-hook-form\";\nimport { useFieldArray } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\nimport type {\n GroupTransactionFormInputs,\n ServiceProviderFeeType,\n} from \"../types.js\";\nimport { RWANumberInput } from \"./number-input.js\";\nimport { RWATableSelect } from \"./select.js\";\n\ntype Props = {\n readonly canHaveTransactionFees: boolean;\n readonly serviceProviderFeeTypes: ServiceProviderFeeType[];\n readonly serviceProviderFeeTypeOptions: { label: string; value: string }[];\n readonly showCreateServiceProviderFeeTypeModal: () => void;\n readonly control: Control<GroupTransactionFormInputs>;\n readonly errors: FieldErrors<GroupTransactionFormInputs>;\n readonly isViewOnly: boolean;\n};\n\nexport function FeeTransactionsTable(props: Props) {\n const headings = [\"Fees\", \"Service Provider\", \"Amount\", \"\"] as const;\n const {\n canHaveTransactionFees,\n serviceProviderFeeTypes,\n serviceProviderFeeTypeOptions,\n control,\n errors,\n isViewOnly,\n showCreateServiceProviderFeeTypeModal,\n } = props;\n\n const { fields, append, remove } = useFieldArray({\n control,\n name: \"fees\",\n });\n\n if (!canHaveTransactionFees) {\n return null;\n }\n\n return (\n <>\n {fields.length > 0 && (\n <div className=\"bg-gray-50 pl-5 pt-3\">\n <table className=\"w-full border-separate text-xs font-medium\">\n <thead className=\"mb-2\">\n <tr>\n {headings.map((heading) => (\n <th\n className={twMerge(\n \"py-2 text-left font-medium text-gray-600\",\n heading === \"Amount\" && !isViewOnly && \"text-right\",\n )}\n key={heading}\n >\n {heading}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {fields.map((feeInput, index) => {\n return (\n <tr key={feeInput.id}>\n <td className=\"w-52\" />\n <td className=\"w-96\">\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateServiceProviderFeeTypeModal,\n label: \"Add Service Provider\",\n }}\n aria-invalid={\n errors.fees?.[index]?.serviceProviderFeeTypeId\n ? \"true\"\n : \"false\"\n }\n control={control}\n disabled={isViewOnly}\n name={`fees.${index}.serviceProviderFeeTypeId`}\n options={serviceProviderFeeTypeOptions}\n rules={{\n required: \"Service provider is required\",\n }}\n />\n </td>\n <td className=\"w-52\">\n <RWANumberInput\n aria-invalid={\n errors.fees?.[index]?.amount ? \"true\" : \"false\"\n }\n control={control}\n currency=\"USD\"\n disabled={isViewOnly}\n name={\n `fees.${index}.amount` as Path<GroupTransactionFormInputs>\n }\n placeholder=\"E.g. $1,000.00\"\n rules={{\n required: \"Amount is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Fee amount must be greater than zero\",\n },\n }}\n />\n </td>\n <td className=\"\">\n {!isViewOnly && (\n <button\n className=\"flex items-center\"\n onClick={() => remove(index)}\n type=\"button\"\n >\n <Icon className=\"text-gray-900\" name=\"Xmark\" />\n </button>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n {!isViewOnly && (\n <button\n className=\"ml-[234px] mt-1 flex w-fit items-center justify-center gap-x-2 rounded-lg bg-white pb-6 text-sm font-semibold text-gray-900\"\n onClick={() =>\n append({\n amount: null,\n serviceProviderFeeTypeId: serviceProviderFeeTypes[0]?.id,\n })\n }\n >\n <span>Add Fee</span>\n <Icon name=\"Plus\" size={16} />\n </button>\n )}\n </>\n );\n}\n","export function getIsTransaction(hash: string | null | undefined) {\n if (!isHexString(hash)) return false;\n return hash.length === 66;\n}\n\nexport function isHexString(\n value: string | null | undefined,\n): value is `0x${string}` {\n return typeof value === \"string\" && value.startsWith(\"0x\");\n}\n","import type { ComponentPropsWithRef, ForwardedRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { ConnectTooltip, ConnectTooltipProvider } from \"#design-system/connect\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { RWATableTextInput } from \"./text-input.js\";\nimport { getIsTransaction } from \"../../services/viem.js\";\n\nexport const TransactionReference = forwardRef(function TransactionReference(\n props: ComponentPropsWithRef<typeof RWATableTextInput> & {\n readonly control: Control<GroupTransactionFormInputs>;\n },\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const { control, disabled } = props;\n const value = useWatch({ control, name: \"txRef\" });\n const maxLength = 46;\n const shouldShortenValue =\n typeof value === \"string\" && value.length >= maxLength;\n const maybeShortenedValue = shouldShortenValue\n ? `${value.slice(0, maxLength)}...`\n : value;\n const isTransaction = getIsTransaction(value);\n\n const tooltipContent = (\n <div>\n <p>{value}</p>\n {isTransaction ? (\n <p className=\"mt-2 text-center\">\n <a\n className=\"text-blue-900 underline\"\n href={`https://etherscan.io/tx/${value}`}\n >\n View on Etherscan\n </a>\n </p>\n ) : null}\n </div>\n );\n\n if (disabled)\n return (\n <ConnectTooltipProvider>\n <ConnectTooltip content={tooltipContent}>\n <span>{maybeShortenedValue}</span>\n </ConnectTooltip>\n </ConnectTooltipProvider>\n );\n\n return <RWATableTextInput {...props} ref={ref} />;\n});\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { calculateUnitPrice } from \"../utils/table.js\";\nimport { FormattedNumber } from \"./formatted-number.js\";\n\nexport function UnitPrice(props: {\n readonly control: Control<GroupTransactionFormInputs>;\n readonly isViewOnly: boolean;\n}) {\n const { control } = props;\n\n const cashAmount = useWatch({ control, name: \"cashAmount\" });\n const fixedIncomeAmount = useWatch({ control, name: \"fixedIncomeAmount\" });\n\n const unitPrice = calculateUnitPrice(cashAmount, fixedIncomeAmount);\n\n return (\n <div className={twMerge(\"mt-1 w-fit\", !props.isViewOnly && \"ml-auto\")}>\n <span className=\"text-gray-600\">Unit Price</span>{\" \"}\n <span className=\"text-gray-900\">\n <FormattedNumber decimalScale={6} value={unitPrice} />\n </span>\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport type { ModalContextValue } from \"./types.js\";\n\nexport const ModalContext = createContext<ModalContextValue>({\n showModal: () => {},\n closeModal: () => {},\n});\n","import { useContext } from \"react\";\nimport { ModalContext } from \"./modal-context.js\";\n\nexport const useModal = () => {\n const context = useContext(ModalContext);\n return context;\n};\n","import type { FixedIncome } from \"../types.js\";\n\nexport function makeFixedIncomeOptionLabel(fixedIncome: FixedIncome) {\n let label = fixedIncome.name;\n if (fixedIncome.ISIN) {\n label += ` - ${fixedIncome.ISIN}`;\n }\n if (fixedIncome.CUSIP) {\n label += ` - ${fixedIncome.CUSIP}`;\n }\n return label;\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type {\n Control,\n FormState,\n UseFormRegister,\n UseFormWatch,\n} from \"react-hook-form\";\nimport { CashBalanceChange } from \"../components/cash-balance-change.js\";\nimport { EntryTimeLabel } from \"../components/entry-time-label.js\";\nimport { FeeTransactionsTable } from \"../components/fee-transactions-table.js\";\nimport { RWANumberInput } from \"../components/number-input.js\";\nimport { RWATableSelect } from \"../components/select.js\";\nimport { RWATableTextInput } from \"../components/text-input.js\";\nimport { TransactionReference } from \"../components/transaction-reference.js\";\nimport { UnitPrice } from \"../components/unit-price.js\";\nimport { useModal } from \"../components/use-modal.js\";\nimport { tableNames } from \"../constants/names.js\";\nimport {\n allGroupTransactionTypes,\n assetGroupTransactions,\n feesTransactions,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n Account,\n FormInputsByTableName,\n Operation,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { formatDateForDisplay } from \"../utils/date.js\";\nimport { makeFixedIncomeOptionLabel } from \"../utils/form.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\n\ntype Input = {\n label: string;\n Input: () => string | React.JSX.Element;\n inputLabel?: ReactNode | null;\n};\n\ntype Props = {\n tableName: TableName;\n tableItem: TableItemType<TableName> | undefined | null;\n operation: Operation;\n formState: FormState<FormInputsByTableName[TableName]>;\n register: UseFormRegister<FormInputsByTableName[TableName]>;\n watch: UseFormWatch<FormInputsByTableName[TableName]>;\n control: Control<FormInputsByTableName[TableName]>;\n};\nexport function useFormInputs(props: Props): {\n inputs: Input[];\n additionalInputs?: ReactElement;\n} {\n const {\n tableName,\n operation,\n formState: _formState,\n tableItem: _tableItem,\n register: _register,\n watch: _watch,\n control: _control,\n } = props;\n const {\n fixedIncomeTypes,\n spvs,\n serviceProviderFeeTypes,\n accounts,\n fixedIncomes,\n } = useEditorContext();\n const { showModal } = useModal();\n const showCreateItemModal = useCallback(\n (tableName: TableName) => () => {\n showModal(\"createItem\", { tableName });\n },\n [showModal],\n );\n return useMemo(() => {\n switch (tableName) {\n case tableNames.ASSET: {\n const tableItem = _tableItem as TableItemType<\"ASSET\"> | null;\n type Payload = FormInputsByTableName[\"ASSET\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const control = _control as Control<Payload>;\n const derivedInputsToDisplay: {\n label: string;\n Input: () => React.JSX.Element;\n }[] =\n operation !== \"create\" && !!tableItem\n ? [\n {\n label: \"Notional\",\n Input: () => <>{handleTableDatum(tableItem.notional)}</>,\n },\n {\n label: \"Purchase Date\",\n Input: () => <>{handleTableDatum(tableItem.purchaseDate)}</>,\n },\n {\n label: \"Purchase Price\",\n Input: () => (\n <>{handleTableDatum(tableItem.purchasePrice, 6)}</>\n ),\n },\n {\n label: \"Purchase Proceeds\",\n Input: () => (\n <>{handleTableDatum(tableItem.purchaseProceeds)}</>\n ),\n },\n ]\n : [];\n\n const inputs = [\n {\n label: \"Asset Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Asset name is required\",\n })}\n aria-invalid={errors.name ? \"true\" : \"false\"}\n errorMessage={errors.name?.message}\n inputClassName=\"text-left\"\n placeholder=\"E.g. My Asset\"\n />\n ),\n },\n {\n label: \"CUSIP\",\n Input: () =>\n operation === \"view\" ? (\n (tableItem?.CUSIP ?? \"Not available\")\n ) : (\n <RWATableTextInput\n {...register(\"CUSIP\", {\n maxLength: {\n value: 9,\n message: \"CUSIP cannot be longer than 9 characters\",\n },\n minLength: {\n value: 9,\n message: \"CUSIP cannot be shorter than 9 characters\",\n },\n pattern: {\n value: /^[a-zA-Z0-9]*$/,\n message: \"CUSIP must be alphanumeric\",\n },\n })}\n aria-invalid={errors.CUSIP ? \"true\" : \"false\"}\n errorMessage={errors.CUSIP?.message}\n placeholder=\"E.g. A2345B789\"\n />\n ),\n },\n {\n label: \"ISIN\",\n Input: () =>\n operation === \"view\" ? (\n (tableItem?.ISIN ?? \"Not available\")\n ) : (\n <RWATableTextInput\n {...register(\"ISIN\", {\n maxLength: {\n value: 12,\n message: \"ISIN cannot be longer than 12 characters\",\n },\n minLength: {\n value: 12,\n message: \"ISIN cannot be shorter than 12 characters\",\n },\n pattern: {\n value: /^[a-zA-Z0-9]*$/,\n message: \"ISIN must be alphanumeric\",\n },\n })}\n aria-invalid={errors.ISIN ? \"true\" : \"false\"}\n errorMessage={errors.ISIN?.message}\n placeholder=\"E.g. 123456789ABC\"\n />\n ),\n },\n {\n label: \"Maturity\",\n Input: () => (\n <input\n className=\"h-8 w-full rounded-md bg-gray-100 px-3 disabled:bg-transparent disabled:p-0\"\n step={1}\n type=\"date\"\n {...register(\"maturity\", {\n disabled: operation === \"view\",\n })}\n />\n ),\n inputLabel: tableItem?.maturity\n ? formatDateForDisplay(tableItem.maturity, true)\n : null,\n },\n {\n label: \"Asset Type\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ASSET\"),\n label: \"Create Fixed Income Type\",\n }}\n aria-invalid={errors.fixedIncomeTypeId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.fixedIncomeTypeId?.message}\n name=\"fixedIncomeTypeId\"\n options={fixedIncomeTypes.map((t) => ({\n ...t,\n value: t.id,\n label: t.name,\n }))}\n rules={{ required: \"Asset type is required\" }}\n />\n ),\n },\n {\n label: \"SPV\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"SPV\"),\n label: \"Create SPV\",\n }}\n aria-invalid={errors.spvId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.spvId?.message}\n name=\"spvId\"\n options={spvs.map((t) => ({\n ...t,\n value: t.id,\n label: t.name,\n }))}\n rules={{ required: \"SPV is required\" }}\n />\n ),\n },\n ...derivedInputsToDisplay,\n ];\n\n return { inputs };\n }\n case tableNames.TRANSACTION: {\n type Payload = FormInputsByTableName[\"TRANSACTION\"];\n const register = _register as UseFormRegister<Payload>;\n const watch = _watch as UseFormWatch<Payload>;\n const { errors } = _formState as FormState<Payload>;\n const control = _control as Control<Payload>;\n const type = watch(\"type\");\n const isFeesTransaction =\n !!type &&\n feesTransactions.includes(type as (typeof feesTransactions)[number]);\n const isAssetTransaction =\n !!type &&\n assetGroupTransactions.includes(\n type as (typeof assetGroupTransactions)[number],\n );\n const canHaveTransactionFees = !isFeesTransaction;\n const transactionTypeOptions = allGroupTransactionTypes.map((type) => ({\n label: groupTransactionTypeLabels[type],\n value: type,\n }));\n const fixedIncomeOptions = fixedIncomes.map((fixedIncome) => ({\n label: makeFixedIncomeOptionLabel(fixedIncome),\n value: fixedIncome.id,\n }));\n const serviceProviderFeeTypeOptions = serviceProviderFeeTypes.map(\n (spft) => ({\n label: `${spft.name} — ${spft.feeType} — ${accounts.find((account) => account.id === spft.accountId)?.reference}`,\n value: spft.id,\n }),\n );\n\n const inputs = [\n {\n label: \"Transaction Type\",\n Input: () => (\n <RWATableSelect\n aria-invalid={errors.type ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.type?.message}\n name=\"type\"\n options={transactionTypeOptions}\n rules={{\n required: \"Transaction type is required\",\n }}\n />\n ),\n },\n {\n label: \"Entry Time\",\n Input: () => (\n <input\n className=\"h-8 w-full rounded-md bg-gray-100 px-3 disabled:bg-transparent disabled:p-0\"\n step={1}\n type=\"datetime-local\"\n {...register(\"entryTime\", {\n disabled: operation === \"view\",\n required: \"Entry time is required\",\n })}\n />\n ),\n inputLabel: <EntryTimeLabel control={control} />,\n },\n isFeesTransaction\n ? {\n label: \"Service Provider\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"SERVICE_PROVIDER_FEE_TYPE\"),\n label: \"Add Service Provider\",\n }}\n control={control}\n disabled={operation === \"view\"}\n name=\"serviceProviderFeeTypeId\"\n options={serviceProviderFeeTypeOptions}\n />\n ),\n }\n : null,\n isAssetTransaction\n ? {\n label: \"Asset name\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ASSET\"),\n label: \"Create Asset\",\n }}\n aria-invalid={errors.type ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.type?.message}\n name=\"fixedIncomeId\"\n options={fixedIncomeOptions}\n rules={{\n required: \"Asset name is required\",\n }}\n />\n ),\n }\n : undefined,\n isAssetTransaction\n ? {\n label: \"Quantity\",\n Input: () => (\n <RWANumberInput\n aria-invalid={errors.fixedIncomeAmount ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.fixedIncomeAmount?.message}\n name=\"fixedIncomeAmount\"\n placeholder=\"E.g. 1,000.00\"\n rules={{\n required: \"Quantity is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Asset proceeds must be greater than zero\",\n },\n }}\n />\n ),\n }\n : undefined,\n {\n label: isAssetTransaction ? \"Asset Proceeds\" : \"Cash Amount\",\n Input: () => (\n <>\n <RWANumberInput\n aria-invalid={errors.cashAmount ? \"true\" : \"false\"}\n control={control}\n currency=\"USD\"\n disabled={operation === \"view\"}\n errorMessage={errors.cashAmount?.message}\n name=\"cashAmount\"\n placeholder=\"E.g. $1,000.00\"\n rules={{\n required: \"Asset proceeds is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Asset proceeds must be greater than zero\",\n },\n }}\n />\n {isAssetTransaction ? (\n <UnitPrice\n control={control}\n isViewOnly={operation === \"view\"}\n />\n ) : null}\n </>\n ),\n },\n {\n label: \"Transaction reference\",\n Input: () => (\n <TransactionReference\n {...register(\"txRef\", {\n disabled: operation === \"view\",\n })}\n aria-invalid={errors.txRef ? \"true\" : \"false\"}\n control={control}\n errorMessage={errors.txRef?.message}\n placeholder=\"E.g. 0x123...\"\n />\n ),\n },\n ].filter(Boolean) as Input[];\n\n const additionalInputs = (\n <>\n <FeeTransactionsTable\n canHaveTransactionFees={canHaveTransactionFees}\n control={control}\n errors={errors}\n isViewOnly={operation === \"view\"}\n serviceProviderFeeTypeOptions={serviceProviderFeeTypeOptions}\n serviceProviderFeeTypes={serviceProviderFeeTypes}\n showCreateServiceProviderFeeTypeModal={showCreateItemModal(\n \"SERVICE_PROVIDER_FEE_TYPE\",\n )}\n />\n <CashBalanceChange control={control} />\n </>\n );\n\n return { inputs, additionalInputs };\n }\n case tableNames.ACCOUNT: {\n type Payload = FormInputsByTableName[\"ACCOUNT\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n const inputs = [\n {\n label: \"Account Label\",\n Input: () => (\n <RWATableTextInput\n {...register(\"label\", {\n disabled: operation === \"view\",\n required: \"Account label is required\",\n })}\n aria-invalid={\n errors.label?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.label?.message}\n placeholder=\"E.g. My Label\"\n />\n ),\n },\n {\n label: \"Account Reference\",\n Input: () => (\n <RWATableTextInput\n {...register(\"reference\", {\n disabled: operation === \"view\",\n required: \"Account reference is required\",\n })}\n aria-invalid={\n errors.reference?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.reference?.message}\n placeholder=\"E.g. bank account number or ETH address\"\n />\n ),\n },\n ];\n return { inputs };\n }\n case tableNames.SPV: {\n type Payload = FormInputsByTableName[\"SPV\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const inputs = [\n {\n label: \"SPV name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"SPV name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My SPV name\"\n />\n ),\n },\n ];\n\n return { inputs };\n }\n case tableNames.FIXED_INCOME_TYPE: {\n type Payload = FormInputsByTableName[\"FIXED_INCOME_TYPE\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const inputs = [\n {\n label: \"Fixed Income Type Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Fixed Income Type name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Fixed Income Type name\"\n />\n ),\n },\n ];\n\n return { inputs };\n }\n case tableNames.SERVICE_PROVIDER_FEE_TYPE: {\n type Payload = FormInputsByTableName[\"SERVICE_PROVIDER_FEE_TYPE\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n const control = _control as Control<Payload>;\n\n const makeAccountLabel = (account: Account) => {\n return `${account.label} (${account.reference})`;\n };\n\n const makeAccountOptions = (accounts: Account[]) => {\n return accounts.map((account) => ({\n ...account,\n value: account.id,\n label: makeAccountLabel(account),\n }));\n };\n\n const inputs = [\n {\n label: \"Service Provider Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Service provider name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Service Provider\"\n />\n ),\n },\n {\n label: \"Fee Type\",\n Input: () => (\n <RWATableTextInput\n {...register(\"feeType\", {\n disabled: operation === \"view\",\n required: \"Fee type is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Fee Type\"\n />\n ),\n },\n {\n label: \"Account\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ACCOUNT\"),\n label: \"Create Account\",\n }}\n aria-invalid={errors.accountId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.accountId?.message}\n name=\"accountId\"\n options={makeAccountOptions(accounts)}\n rules={{ required: \"Account is required\" }}\n />\n ),\n },\n ];\n\n return { inputs };\n }\n }\n }, [\n _formState,\n _control,\n _register,\n _tableItem,\n _watch,\n accounts,\n fixedIncomeTypes,\n fixedIncomes,\n operation,\n serviceProviderFeeTypes,\n showCreateItemModal,\n spvs,\n tableName,\n ]);\n}\n","import { useMemo } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport { allGroupTransactionTypes } from \"../constants/transactions.js\";\nimport type {\n Account,\n AccountFormInputs,\n AssetFormInputs,\n FixedIncomeType,\n FixedIncomeTypeFormInputs,\n GroupTransactionFormInputs,\n SPV,\n SPVFormInputs,\n ServiceProviderFeeTypeFormInputs,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { isoDateStringToDateInput } from \"../utils/date.js\";\n\nexport function useDefaultFormValues(args: {\n tableName: TableName;\n tableItem?: TableItemType<TableName> | null;\n fixedIncomeTypes: FixedIncomeType[];\n spvs: SPV[];\n accounts: Account[];\n}) {\n const { tableName, tableItem, fixedIncomeTypes, spvs, accounts } = args;\n\n return useMemo(() => {\n if (!tableItem) {\n switch (tableName) {\n case tableNames.ASSET:\n return {\n fixedIncomeTypeId: fixedIncomeTypes[0]?.id ?? null,\n spvId: spvs[0]?.id ?? null,\n name: null,\n maturity: null,\n ISIN: null,\n CUSIP: null,\n coupon: null,\n } as AssetFormInputs;\n case tableNames.TRANSACTION:\n return {\n type: allGroupTransactionTypes[0],\n entryTime: isoDateStringToDateInput(new Date().toISOString(), true),\n cashAmount: null,\n fixedIncomeId: null,\n fixedIncomeAmount: null,\n serviceProviderFeeTypeId: null,\n fees: null,\n txRef: null,\n } as GroupTransactionFormInputs;\n case tableNames.SPV:\n return {\n name: null,\n } as SPVFormInputs;\n case tableNames.SERVICE_PROVIDER_FEE_TYPE:\n return {\n name: null,\n feeType: null,\n accountId: accounts[0]?.id ?? null,\n } as ServiceProviderFeeTypeFormInputs;\n case tableNames.FIXED_INCOME_TYPE:\n return {\n name: null,\n } as FixedIncomeTypeFormInputs;\n case tableNames.ACCOUNT:\n return {\n label: null,\n reference: null,\n } as AccountFormInputs;\n }\n }\n\n switch (tableName) {\n case tableNames.ASSET: {\n const item = tableItem as TableItemType<typeof tableNames.ASSET>;\n return {\n id: item.id,\n fixedIncomeTypeId: item.fixedIncomeTypeId,\n spvId: item.spvId,\n name: item.name,\n maturity: item.maturity\n ? isoDateStringToDateInput(item.maturity)\n : null,\n ISIN: item.ISIN,\n CUSIP: item.CUSIP,\n coupon: item.coupon,\n } as AssetFormInputs;\n }\n case tableNames.TRANSACTION: {\n const item = tableItem as TableItemType<typeof tableNames.TRANSACTION>;\n return {\n id: item.id,\n type: item.type,\n entryTime: item.entryTime\n ? isoDateStringToDateInput(item.entryTime, true)\n : null,\n cashAmount: item.cashTransaction.amount ?? null,\n fixedIncomeId: item.fixedIncomeTransaction?.assetId ?? null,\n fixedIncomeAmount: item.fixedIncomeTransaction?.amount ?? null,\n serviceProviderFeeTypeId: item.serviceProviderFeeTypeId ?? null,\n fees: item.fees ?? null,\n txRef: item.txRef ?? null,\n } as GroupTransactionFormInputs;\n }\n case tableNames.SPV: {\n const item = tableItem as TableItemType<typeof tableNames.SPV>;\n return {\n id: item.id,\n name: item.name,\n } as SPVFormInputs;\n }\n case tableNames.SERVICE_PROVIDER_FEE_TYPE: {\n const item = tableItem as TableItemType<\n typeof tableNames.SERVICE_PROVIDER_FEE_TYPE\n >;\n return {\n id: item.id,\n name: item.name,\n feeType: item.feeType,\n accountId: item.accountId,\n } as ServiceProviderFeeTypeFormInputs;\n }\n case tableNames.FIXED_INCOME_TYPE: {\n const item = tableItem as TableItemType<\n typeof tableNames.FIXED_INCOME_TYPE\n >;\n return {\n id: item.id,\n name: item.name,\n } as FixedIncomeTypeFormInputs;\n }\n case tableNames.ACCOUNT: {\n const item = tableItem as TableItemType<typeof tableNames.ACCOUNT>;\n return {\n id: item.id,\n label: item.label,\n reference: item.reference,\n } as AccountFormInputs;\n }\n }\n }, [accounts, fixedIncomeTypes, spvs, tableItem, tableName]);\n}\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport {\n useForm,\n type DefaultValues,\n type FieldValues,\n type SubmitHandler,\n} from \"react-hook-form\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n FormInputsByTableName,\n Operation,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { useDefaultFormValues } from \"./useDefaultFormValues.js\";\n\nfunction useWrappedForm<TValues extends FieldValues>(defaultValues: TValues) {\n const form = useForm<TValues>({\n defaultValues: defaultValues as DefaultValues<TValues>,\n });\n\n return form;\n}\ntype Props = {\n operation: Operation;\n tableName: TableName;\n tableItem?: TableItemType<TableName> | null;\n};\nexport function useSubmit(props: Props) {\n const { operation, tableName, tableItem } = props;\n const { handleAction, fixedIncomeTypes, spvs, accounts } = useEditorContext();\n const defaultValues = useDefaultFormValues({\n tableName,\n tableItem,\n fixedIncomeTypes,\n spvs,\n accounts,\n });\n const action = operation === \"create\" ? \"CREATE\" : \"EDIT\";\n\n const formValues = defaultValues as FormInputsByTableName[TableName];\n\n const { register, handleSubmit, reset, watch, control, formState } =\n useWrappedForm<FormInputsByTableName[TableName]>(formValues);\n\n useEffect(() => {\n reset(formValues);\n }, [formValues, reset]);\n\n const onSubmit: SubmitHandler<FormInputsByTableName[TableName]> = useCallback(\n (payload) => {\n const actionType = `${action}_${tableName}` as const;\n handleAction({\n type: actionType,\n payload,\n });\n },\n [action, handleAction, tableName],\n );\n\n const submit = handleSubmit(onSubmit);\n\n return useMemo(\n () => ({\n register,\n reset,\n watch,\n control,\n formState,\n submit,\n }),\n [control, formState, register, reset, submit, watch],\n );\n}\n","import { useMemo } from \"react\";\nimport type { FormHookProps } from \"../types.js\";\nimport { useFormInputs } from \"./useFormInputs.js\";\nimport { useSubmit } from \"./useSubmit.js\";\n\nexport function useTableForm(props: FormHookProps) {\n const { operation, tableName, tableItem } = props;\n\n const { submit, reset, register, control, formState, watch } = useSubmit({\n operation,\n tableName,\n tableItem,\n });\n\n const formInputs = useFormInputs({\n formState,\n operation,\n control,\n watch,\n tableItem,\n tableName,\n register,\n });\n\n return useMemo(() => {\n return {\n submit,\n reset,\n register,\n control,\n formInputs,\n formState,\n };\n }, [submit, reset, register, control, formInputs, formState]);\n}\n","import {\n mergeClassNameProps,\n PowerhouseButton,\n type PowerhouseButtonProps,\n} from \"#design-system\";\n\nexport const RWAButton: React.FC<PowerhouseButtonProps> = (props) => {\n return (\n <PowerhouseButton\n color=\"light\"\n size=\"small\"\n {...mergeClassNameProps(\n props,\n \"border border-solid border-gray-300 bg-white px-3 py-1 text-sm text-gray-900\",\n )}\n >\n {props.children}\n </PowerhouseButton>\n );\n};\n","import type { ComponentType, ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\ntype Input = {\n label: string;\n Input: ComponentType;\n inputLabel?: ReactNode;\n};\ntype Props = {\n readonly inputs: Input[];\n};\nexport function FormInputs(props: Props) {\n const { inputs } = props;\n return (\n <div className=\"rounded-md bg-white text-xs font-medium\">\n {inputs.map(({ label, Input, inputLabel }, index) => (\n <div\n className={twJoin(\n \"grid min-h-11 grid-cols-[208px,380px] items-center px-6 text-gray-600 last:rounded-b-md\",\n index % 2 !== 0 && \"bg-gray-50\",\n )}\n key={label}\n >\n <div>{label}</div>\n <div className=\"h-max py-2 text-gray-900\" key={index}>\n <Input />\n {inputLabel ? (\n <div className=\"text-left text-gray-500\">{inputLabel}</div>\n ) : null}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { memo, useCallback } from \"react\";\nimport { useDependentItemProps } from \"../constants/dependent-items.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableForm } from \"../hooks/useTableForm.js\";\nimport type { TableName } from \"../types.js\";\nimport { RWAButton } from \"./button.js\";\nimport { FormInputs } from \"./form-inputs.js\";\nimport { useModal } from \"./use-modal.js\";\n\ntype Props = {\n readonly tableName: TableName;\n};\nexport const ItemDetails = memo(function ItemDetails(props: Props) {\n const { tableName } = props;\n const { showModal, closeModal } = useModal();\n\n const {\n selectedTableItem,\n operation,\n viewItem,\n editItem,\n clearSelected,\n handleAction,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n principalLenderAccountId,\n } = useEditorContext();\n\n const dependentItemProps = useDependentItemProps(\n tableName,\n selectedTableItem?.id,\n );\n const hasDependentItems = dependentItemProps.some(\n (p) => p.dependentItems.length > 0,\n );\n\n const isEditOperation = operation === \"edit\";\n const isCreateOperation = operation === \"create\";\n const isViewOperation = operation === \"view\";\n const isAllowedToCreateOrEdit =\n isAllowedToCreateDocuments || isAllowedToEditDocuments;\n const isPrincipalLenderAccount =\n tableName === \"ACCOUNT\" &&\n selectedTableItem?.id === principalLenderAccountId;\n const isAllowedToDeleteItem = !isPrincipalLenderAccount;\n const showCancelButton = !isViewOperation && isAllowedToCreateOrEdit;\n const showSubmitButton = !isViewOperation && isAllowedToCreateOrEdit;\n const showDeleteButton =\n isEditOperation && isAllowedToEditDocuments && isAllowedToDeleteItem;\n const showEditButton = isViewOperation && isAllowedToEditDocuments;\n const showCloseButton = isViewOperation;\n\n const tableLabel = tableLabels[tableName];\n\n const {\n submit,\n reset,\n formInputs: { inputs, additionalInputs },\n } = useTableForm({\n tableName,\n tableItem: selectedTableItem,\n operation,\n });\n\n const handleClose = useCallback(() => {\n reset();\n clearSelected();\n }, [clearSelected, reset]);\n\n const handleCancel = useCallback(() => {\n if (operation === \"edit\" && !!selectedTableItem) {\n viewItem(selectedTableItem, tableName);\n return;\n }\n handleClose();\n }, [handleClose, operation, selectedTableItem, tableName, viewItem]);\n\n const showDeleteModal = useCallback(() => {\n if (!isAllowedToDeleteItem || !hasDependentItems) return;\n\n showModal(\"deleteItem\", {\n tableName,\n dependentItemProps,\n });\n }, [\n isAllowedToDeleteItem,\n hasDependentItems,\n showModal,\n tableName,\n dependentItemProps,\n ]);\n\n const handleDelete = useCallback(() => {\n if (!selectedTableItem) return;\n\n if (hasDependentItems) {\n showDeleteModal();\n return;\n }\n\n const editorDeleteActionType = `DELETE_${tableName}` as const;\n handleAction({\n type: editorDeleteActionType,\n payload: selectedTableItem,\n });\n clearSelected();\n closeModal();\n }, [\n selectedTableItem,\n hasDependentItems,\n tableName,\n handleAction,\n clearSelected,\n closeModal,\n showDeleteModal,\n ]);\n\n const onEditButtonClick = useCallback(() => {\n if (!selectedTableItem) return;\n editItem(selectedTableItem, tableName);\n }, [selectedTableItem, editItem, tableName]);\n\n const closeButton = (\n <RWAButton className=\"text-gray-600\" onClick={handleClose}>\n Close\n </RWAButton>\n );\n\n const cancelButton = (\n <RWAButton className=\"text-gray-600\" onClick={handleCancel}>\n Cancel\n </RWAButton>\n );\n\n const submitButton = (\n <RWAButton\n icon={<Icon name=\"Save\" size={16} />}\n iconPosition=\"right\"\n onClick={submit}\n >\n {isCreateOperation ? \"Save\" : \"Save Edits\"}\n </RWAButton>\n );\n\n const deleteButton = (\n <button onClick={handleDelete}>\n <Icon className=\"ml-3 text-red-800\" name=\"Trash\" size={22} />\n </button>\n );\n\n const editButton = (\n <RWAButton\n icon={<Icon name=\"Pencil\" size={16} />}\n iconPosition=\"right\"\n onClick={onEditButtonClick}\n >\n Edit {tableLabel}\n </RWAButton>\n );\n\n return (\n <div className=\"flex flex-col rounded-md border border-gray-300 bg-white\">\n <div className=\"flex justify-between rounded-t-md border-b border-gray-300 bg-gray-100 p-3 font-semibold text-gray-800\">\n <div className=\"flex items-center\">\n {selectedTableItem?.itemNumber\n ? `${tableLabel} #${selectedTableItem.itemNumber}`\n : `New ${tableLabel}`}\n </div>\n <div className=\"flex gap-x-2\">\n {showCancelButton ? cancelButton : null}\n {showCloseButton ? closeButton : null}\n {showSubmitButton ? submitButton : null}\n {showDeleteButton ? deleteButton : null}\n {showEditButton ? editButton : null}\n </div>\n </div>\n <FormInputs inputs={inputs} />\n {additionalInputs}\n </div>\n );\n});\n","import type { TableColumn, TableName } from \"../types.js\";\n\nexport type ColumnsByTableName = {\n [K in TableName]: TableColumn[];\n};\n\nexport const columnsByTableName: ColumnsByTableName = {\n ASSET: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n {\n key: \"purchaseDate\" as const,\n label: \"Purchase Date\",\n allowSorting: true,\n },\n {\n key: \"maturity\" as const,\n label: \"Maturity\",\n allowSorting: true,\n displayTime: false,\n },\n {\n key: \"notional\" as const,\n label: \"Notional\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"currentValue\" as const,\n label: \"Current Value\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"purchasePrice\" as const,\n label: \"Purchase Price\",\n allowSorting: true,\n isNumberColumn: true,\n decimalScale: 6,\n },\n {\n key: \"purchaseProceeds\" as const,\n label: \"Purchase Proceeds\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"salesProceeds\" as const,\n label: \"Sales Proceeds\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"totalDiscount\" as const,\n label: \"Total Discount\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"realizedSurplus\" as const,\n label: \"Realized Surplus\",\n allowSorting: true,\n isNumberColumn: true,\n },\n ],\n TRANSACTION: [\n {\n key: \"typeLabel\" as const,\n label: \"Type\",\n allowSorting: true,\n },\n {\n key: \"entryTime\" as const,\n label: \"Entry Time\",\n allowSorting: true,\n },\n {\n key: \"asset\" as const,\n label: \"Asset\",\n allowSorting: true,\n },\n {\n key: \"quantity\" as const,\n label: \"Quantity\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"cashAmount\" as const,\n label: \"Cash Amount ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"totalFees\" as const,\n label: \"Total Fees ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"cashBalanceChange\" as const,\n label: \"Cash Balance Change ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n ],\n FIXED_INCOME_TYPE: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n ],\n SPV: [{ key: \"name\" as const, label: \"Name\", allowSorting: true }],\n SERVICE_PROVIDER_FEE_TYPE: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n { key: \"feeType\" as const, label: \"Fee Type\", allowSorting: true },\n {\n key: \"accountName\" as const,\n label: \"Account Name\",\n allowSorting: true,\n },\n {\n key: \"accountReference\" as const,\n label: \"Account Reference\",\n allowSorting: true,\n },\n ],\n ACCOUNT: [\n { key: \"label\" as const, label: \"Label\", allowSorting: true },\n { key: \"reference\" as const, label: \"Reference\", allowSorting: true },\n ],\n} as const;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type RefObject,\n} from \"react\";\nimport type { ColumnCountByTableWidth, TableColumn } from \"../types.js\";\n\ntype Props<TColumn extends TableColumn> = {\n columns: TColumn[] | undefined;\n columnCountByTableWidth: ColumnCountByTableWidth;\n tableContainerRef: RefObject<HTMLDivElement | null>;\n hasItemNumberColumn?: boolean;\n hasMoreDetailsColumn?: boolean;\n};\n\n/**\n * Hook to handle dropping columns for smaller screens.\n *\n * @param columns - Array of columns to display, column must satisfy TableColumn. The columns will be displayed in the order they are provided.\n * @param columnCountByTableWidth - Object that specifies how many columns to show at different screen widths\n * @param tableContainerRef - Ref to the table container element\n * @param hasIndexColumn - When true, adds an \"index\" column with the index of the row as the _first column_. This column is exempt from being dropped.\n * @param hasMoreDetailsColumn - When true, adds a \"more details\" column as the _last column_. This column is exempt from being dropped. This column has no header label by default.\n */\nexport function useColumnPriority<TColumn extends TableColumn>(\n props: Props<TColumn>,\n) {\n const {\n columnCountByTableWidth,\n tableContainerRef,\n columns,\n hasItemNumberColumn = true,\n hasMoreDetailsColumn = true,\n } = props;\n\n const [parentWidth, setParentWidth] = useState(0);\n\n // Define special columns individually for clarity\n const indexColumn = useMemo(\n () =>\n hasItemNumberColumn\n ? {\n key: \"itemNumber\" as const,\n label: \"#\",\n allowSorting: true,\n isSpecialColumn: true,\n }\n : undefined,\n [hasItemNumberColumn],\n );\n\n const moreDetailsColumn = useMemo(\n () =>\n hasMoreDetailsColumn\n ? {\n key: \"moreDetails\" as const,\n label: \"\",\n isSpecialColumn: true,\n }\n : undefined,\n [hasMoreDetailsColumn],\n );\n\n const [columnsToShow, setColumnsToShow] = useState<TColumn[]>([]);\n\n const handleResize = useCallback(() => {\n if (tableContainerRef.current?.parentElement) {\n setParentWidth(tableContainerRef.current.parentElement.offsetWidth);\n }\n }, [tableContainerRef]);\n\n const handleDropColumns = useCallback(() => {\n const columnCount = getColumnCount(parentWidth, columnCountByTableWidth);\n const dynamicColumnsToShow = columns?.slice(0, columnCount) ?? [];\n // Ensure the index column is first and the \"more details\" column is last\n setColumnsToShow(\n [indexColumn, ...dynamicColumnsToShow, moreDetailsColumn].filter(\n Boolean,\n ) as TColumn[],\n );\n }, [\n parentWidth,\n columns,\n columnCountByTableWidth,\n indexColumn,\n moreDetailsColumn,\n ]);\n\n useEffect(() => {\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [handleResize]);\n\n useEffect(() => {\n handleDropColumns();\n }, [handleDropColumns, parentWidth]);\n\n return useMemo(() => columnsToShow, [columnsToShow]);\n}\n\nexport function getColumnCount(\n parentElementWidth: number,\n columnCountByTableWidth: Record<number, number>,\n) {\n let closestKey = 1520;\n let smallestDifference = Infinity;\n\n Object.keys(columnCountByTableWidth).forEach((columnWidthKey) => {\n const columnWidth = parseInt(columnWidthKey);\n const difference = Math.abs(parentElementWidth - columnWidth);\n\n if (difference < smallestDifference) {\n smallestDifference = difference;\n closestKey = parseInt(columnWidthKey);\n }\n });\n\n const columnCount = columnCountByTableWidth[closestKey];\n\n return columnCount;\n}\n","import type { RefObject } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\ntype Props = {\n selectedItemNumber: number | undefined;\n tableContainerRef: RefObject<HTMLDivElement | null>;\n rowRefs: RefObject<(HTMLTableRowElement | null)[]>;\n headerRef: RefObject<HTMLTableSectionElement | null>;\n hasSpecialLastRow?: boolean;\n};\n\nconst defaultRowHeight = 34;\nconst defaultHeaderHeight = 42;\nconst defaultRowCount = 20;\nconst defaultTwentyRowsPlusHeaderHeight =\n defaultRowHeight * defaultRowCount + defaultHeaderHeight;\n\nexport function useTableHeight(props: Props) {\n const {\n selectedItemNumber,\n tableContainerRef,\n rowRefs,\n headerRef,\n hasSpecialLastRow = false,\n } = props;\n const [maxHeight, setMaxHeight] = useState(\n `${defaultTwentyRowsPlusHeaderHeight}px`,\n );\n const selectedRowNumber = selectedItemNumber\n ? selectedItemNumber - 1 + (hasSpecialLastRow ? 1 : 0)\n : undefined;\n const rowHeight = rowRefs.current[1]?.offsetHeight ?? defaultRowHeight;\n const headerHeight = headerRef.current?.offsetHeight ?? defaultHeaderHeight;\n\n const updateTableHeight = useCallback(() => {\n if (selectedRowNumber === undefined) {\n const twentyRowsAndHeaderHeight = rowHeight * 20 + headerHeight;\n setMaxHeight(`${twentyRowsAndHeaderHeight}px`);\n return;\n }\n\n const tableContainerRect =\n tableContainerRef.current?.getBoundingClientRect();\n const rowRect = rowRefs.current[selectedRowNumber]?.getBoundingClientRect();\n\n if (rowRect && tableContainerRect) {\n const rowBottom = rowRect.bottom;\n const tableTop = tableContainerRect.top;\n const calculatedHeight = rowBottom - tableTop;\n\n setMaxHeight(`${calculatedHeight}px`);\n }\n }, [headerHeight, rowHeight, rowRefs, selectedRowNumber, tableContainerRef]);\n\n useEffect(() => {\n updateTableHeight();\n }, [updateTableHeight]);\n\n useEffect(() => {\n const handleScroll = () => {\n updateTableHeight();\n };\n\n const tableContainerElement = tableContainerRef.current;\n\n if (tableContainerElement) {\n tableContainerElement.addEventListener(\"scroll\", handleScroll);\n }\n\n return () => {\n if (tableContainerElement) {\n tableContainerElement.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, [tableContainerRef, updateTableHeight]);\n\n return maxHeight;\n}\n","import type { Order } from \"natural-orderby\";\n\nimport { Icon } from \"#design-system\";\nimport { useState } from \"react\";\nimport { twJoin, twMerge } from \"tailwind-merge\";\nimport type { SortDirection, TableBaseProps } from \"../types.js\";\n\n/**\n * Base table component\n *\n * @type TItem - Table item type, any record with an \"id\" field and any string keys\n * @type TableColumn - Specifies how to render a column. Must have a `key` which is a key of TItem, and a `label` which is the column header\n * @param tableData - Array of data to display, data must satisfy TItem\n * @param columns - Array of columns to display, column must satisfy TableColumn. The columns will be displayed in the order they are provided. Use the `useColumnPriority` hook to handle dropping columns for smaller screens.\n * @param children - Content to render above the table rows\n * @param footer - Content to render below the table rows\n * @param renderRow - Function to render a row, must return a React element\n * @param onClickSort - Function to handle sorting, called with key and direction\n * @param hasExpandedRow - Whether the table has an expanded row\n * @param specialFirstRow - Function to render a special first row (like the cash asset for instance), must return a React element\n */\nexport function TableBase(props: TableBaseProps) {\n const {\n children,\n ref,\n tableData,\n columns,\n footer,\n renderRow,\n onClickSort,\n specialFirstRow,\n specialLastRow,\n maxHeight,\n headerRef,\n hasSelectedItem,\n } = props;\n\n const [sortDirection, setSortDirection] = useState<SortDirection | null>(\n null,\n );\n const [sortKey, setSortKey] = useState<string | null>(null);\n\n return (\n <>\n <div\n className={twJoin(\n \"relative rounded-lg border border-gray-300 bg-white\",\n hasSelectedItem ? \"overflow-hidden\" : \"overflow-scroll\",\n )}\n ref={ref}\n style={{ maxHeight }}\n >\n <table className=\"w-full\">\n <thead\n className=\"sticky top-0 isolate select-none text-nowrap border-b border-gray-300 bg-gray-100\"\n ref={headerRef}\n >\n <tr>\n {columns.map((column) => (\n <th\n className={twMerge(\n \"group border-l border-gray-300 py-3 pl-3 text-start text-xs font-medium text-gray-600 first:border-l-0\",\n column.allowSorting && \"cursor-pointer hover:text-gray-900\",\n )}\n key={column.key}\n onClick={() => {\n if (!column.allowSorting) return;\n let sortDir: Order = \"asc\";\n\n if (sortKey === column.key && sortDirection === \"asc\") {\n sortDir = \"desc\";\n }\n\n setSortDirection(sortDir);\n setSortKey(column.key);\n\n onClickSort(column.key, sortDir);\n }}\n >\n <div\n className={twMerge(\n \"group flex items-center\",\n column.isNumberColumn && \"justify-end\",\n )}\n >\n {column.label}\n {column.allowSorting ? (\n <Icon\n className={twMerge(\n \"invisible ml-1 rotate-90\",\n sortKey === column.key && \"group-hover:visible\",\n sortDirection === \"asc\" && \"rotate-[270deg]\",\n )}\n name=\"ArrowFilledRight\"\n size={6}\n />\n ) : null}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {children}\n {specialFirstRow?.(columns)}\n {tableData?.map((item, index) => renderRow(item, columns, index))}\n {specialLastRow?.(columns)}\n </tbody>\n </table>\n </div>\n {footer}\n </>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCallback, useRef } from \"react\";\nimport { Fragment } from \"react/jsx-runtime\";\nimport { columnsByTableName } from \"../constants/columns.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { defaultColumnCountByTableWidth } from \"../constants/table.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useColumnPriority } from \"../hooks/useColumnPriority.js\";\nimport { useTableHeight } from \"../hooks/useTableHeight.js\";\nimport type {\n SortDirection,\n TableColumn,\n TableItemType,\n TableName,\n TableProps,\n} from \"../types.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\nimport { TableBase } from \"./table-base.js\";\nimport { ItemNumberCell, MoreDetailsCell, RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\n\nexport function Table(props: TableProps) {\n const {\n tableName,\n tableData,\n columnCountByTableWidth = defaultColumnCountByTableWidth,\n sortHandler,\n specialFirstRow,\n specialLastRow,\n } = props;\n\n const columns = columnsByTableName[tableName];\n\n const {\n operation,\n selectedTableItem,\n isAllowedToCreateDocuments,\n createItem,\n } = useEditorContext();\n\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const rowRefs = useRef<(HTMLTableRowElement | null)[]>([]);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n const columnsToShow = useColumnPriority({\n columns,\n columnCountByTableWidth,\n tableContainerRef,\n });\n\n const maxHeight = useTableHeight({\n tableContainerRef,\n rowRefs,\n headerRef,\n selectedItemNumber: selectedTableItem?.itemNumber,\n hasSpecialLastRow: !!specialLastRow,\n });\n\n const tableLabel = tableLabels[tableName];\n\n const onCreateItemClick = useCallback(() => {\n createItem(tableName);\n }, [createItem, tableName]);\n\n const renderRow = useCallback(\n (\n tableItem: TableItemType<TableName>,\n columns: TableColumn[],\n index: number,\n ) => {\n const isSelected = selectedTableItem?.id === tableItem.id;\n\n return (\n <RWATableRow\n key={tableItem.id}\n /* @ts-expect-error - Ref is not typed */\n ref={(el) => (rowRefs.current[index] = el)}\n >\n {columns.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"itemNumber\" && (\n <ItemNumberCell itemNumber={tableItem.itemNumber} />\n )}\n {column.key !== \"itemNumber\" && column.key !== \"moreDetails\" && (\n <RWATableCell\n className={column.isNumberColumn ? \"text-right\" : \"\"}\n key={column.key}\n >\n {handleTableDatum(\n tableItem[column.key as keyof TableItemType<TableName>],\n column.decimalScale,\n column.displayTime,\n )}\n </RWATableCell>\n )}\n {column.key === \"moreDetails\" && (\n <MoreDetailsCell\n isSelected={isSelected}\n tableItem={tableItem}\n tableName={tableName}\n />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n );\n },\n [selectedTableItem?.id, tableName],\n );\n\n return (\n <>\n <TableBase\n columns={columnsToShow}\n hasSelectedItem={!!selectedTableItem}\n headerRef={headerRef}\n maxHeight={maxHeight}\n onClickSort={\n sortHandler as (key: string, direction: SortDirection) => void\n }\n ref={tableContainerRef}\n renderRow={renderRow}\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableData={tableData}\n />\n {isAllowedToCreateDocuments && !operation ? (\n <button\n className=\"mt-4 flex h-11 w-full items-center justify-center gap-x-2 rounded-lg border border-gray-300 bg-white text-sm font-semibold text-gray-900\"\n onClick={onCreateItemClick}\n >\n <span>Create {tableLabel}</span>\n <Icon name=\"Plus\" size={14} />\n </button>\n ) : null}\n </>\n );\n}\n","import { Pagination, usePagination } from \"#design-system\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableData } from \"../hooks/useTableData.js\";\nimport type { TableColumn, TableName } from \"../types.js\";\nimport { ItemDetails } from \"./item-details.js\";\nimport { Table } from \"./table.js\";\n\ntype Props = {\n readonly tableName: TableName;\n readonly specialFirstRow?: (columns: TableColumn[]) => React.JSX.Element;\n readonly specialLastRow?: (columns: TableColumn[]) => React.JSX.Element;\n};\nexport function TableWithForm(props: Props) {\n const { tableName, specialFirstRow, specialLastRow } = props;\n const { getIsFormOpen } = useEditorContext();\n const showForm = getIsFormOpen(tableName);\n const { tableData, sortHandler } = useTableData(tableName);\n const shouldPaginate = tableData.length > 20;\n\n const {\n pageItems,\n pages,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n hiddenNextPages,\n isNextPageAvailable,\n isPreviousPageAvailable,\n } = usePagination(tableData);\n return (\n <>\n <div className=\"mb-2 flex w-full justify-end\">\n {shouldPaginate ? (\n <Pagination\n goToFirstPage={goToFirstPage}\n goToLastPage={goToLastPage}\n goToNextPage={goToNextPage}\n goToPage={goToPage}\n goToPreviousPage={goToPreviousPage}\n hiddenNextPages={hiddenNextPages}\n isNextPageAvailable={isNextPageAvailable}\n isPreviousPageAvailable={isPreviousPageAvailable}\n nextPageLabel=\"Next\"\n pages={pages}\n previousPageLabel=\"Previous\"\n />\n ) : null}\n </div>\n <Table\n sortHandler={sortHandler}\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableData={pageItems}\n tableName={tableName}\n />\n {showForm ? (\n <div className=\"mt-4 rounded-md bg-white\">\n <ItemDetails tableName={tableName} />\n </div>\n ) : null}\n </>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCallback } from \"react\";\nimport { Fragment } from \"react/jsx-runtime\";\nimport { tableNames } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableColumn } from \"../types.js\";\nimport { RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function AccountsTable() {\n const { accounts, principalLenderAccountId } = useEditorContext();\n const principalLenderAccount = accounts.find(\n (account) => account.id === principalLenderAccountId,\n );\n\n const renderPrincipalLenderRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow>\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"label\" ? (\n <RWATableCell>\n {principalLenderAccount?.label}\n <span className=\"ml-2 inline-flex items-center gap-1 rounded bg-green-100 px-1 font-extralight\">\n Lender <Icon name=\"CheckCircle\" size={14} />\n </span>\n </RWATableCell>\n ) : (\n <RWATableCell />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [principalLenderAccount?.label],\n );\n\n const specialFirstRow = principalLenderAccount?.label\n ? renderPrincipalLenderRow\n : undefined;\n\n return (\n <TableWithForm\n specialFirstRow={specialFirstRow}\n tableName={tableNames.ACCOUNT}\n />\n );\n}\n","import { Fragment, useCallback, useMemo } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableColumn } from \"../types.js\";\nimport { sumTotalForProperty } from \"../utils/calculations.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\nimport { RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function AssetsTable() {\n const tableName = tableNames.ASSET;\n const { selectedTableItem, fixedIncomes, cashAsset } = useEditorContext();\n\n const cashAssetFormattedAsTableItem = useMemo(\n () => ({\n id: \"special-first-row\",\n name: \"Cash $USD\",\n fixedIncomeTypeId: \"--\",\n spvId: \"--\",\n maturity: \"--\",\n ISIN: \"--\",\n CUSIP: \"--\",\n coupon: null,\n notional: cashAsset.balance ?? 0,\n purchaseDate: \"--\",\n purchasePrice: \"--\",\n purchaseProceeds: \"--\",\n salesProceeds: \"--\",\n totalDiscount: \"--\",\n realizedSurplus: \"--\",\n currentValue: \"--\",\n }),\n [cashAsset.balance],\n );\n\n const totalPurchaseProceeds = sumTotalForProperty(\n fixedIncomes,\n \"purchaseProceeds\",\n );\n const totalSalesProceeds = sumTotalForProperty(fixedIncomes, \"salesProceeds\");\n const totalTotalDiscount = sumTotalForProperty(fixedIncomes, \"totalDiscount\");\n const totalRealizedSurplus = sumTotalForProperty(\n fixedIncomes,\n \"realizedSurplus\",\n );\n\n const specialFirstRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow>\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"name\" && <RWATableCell>Cash $USD</RWATableCell>}\n {column.key === \"notional\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(cashAssetFormattedAsTableItem[column.key])}\n </RWATableCell>\n )}\n {column.key !== \"name\" && column.key !== \"notional\" && (\n <RWATableCell />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [cashAssetFormattedAsTableItem],\n );\n\n const specialLastRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow className=\"sticky bottom-0\">\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"name\" && <RWATableCell>Totals</RWATableCell>}\n {column.key === \"purchaseProceeds\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalPurchaseProceeds)}\n </RWATableCell>\n )}\n {column.key === \"salesProceeds\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalSalesProceeds)}\n </RWATableCell>\n )}\n {column.key === \"totalDiscount\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalTotalDiscount)}\n </RWATableCell>\n )}\n {column.key === \"realizedSurplus\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalRealizedSurplus)}\n </RWATableCell>\n )}\n {column.key !== \"name\" &&\n column.key !== \"purchaseProceeds\" &&\n column.key !== \"salesProceeds\" &&\n column.key !== \"totalDiscount\" &&\n column.key !== \"realizedSurplus\" && <RWATableCell />}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [\n selectedTableItem,\n totalPurchaseProceeds,\n totalRealizedSurplus,\n totalSalesProceeds,\n totalTotalDiscount,\n ],\n );\n\n return (\n <TableWithForm\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableName={tableName}\n />\n );\n}\n","import type { ComponentType } from \"react\";\n\ntype Input = {\n label: string;\n Input: ComponentType;\n};\ntype Props = {\n readonly inputs: Input[];\n};\nexport function ModalFormInputs(props: Props) {\n const { inputs } = props;\n return (\n <div className=\"bg-white text-xs font-medium\">\n {inputs.map(({ label, Input }, index) => (\n <div className=\"mb-4 mt-2 grid gap-1\" key={label}>\n <label className=\"text-base\">{label}</label>\n <div key={index}>\n <Input />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { Icon, Modal } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { memo, useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { useTableForm } from \"../hooks/useTableForm.js\";\nimport type { TableName } from \"../types.js\";\nimport { ModalFormInputs } from \"./modal-form-inputs.js\";\n\nexport type RWACreateItemModalProps = ComponentPropsWithoutRef<typeof Modal> & {\n readonly open: boolean;\n readonly tableName: TableName;\n readonly onOpenChange: (open: boolean) => void;\n};\n\nexport const RWACreateItemModal = memo(function RWACreateItemModal(\n props: RWACreateItemModalProps,\n) {\n const { tableName, open, onOpenChange } = props;\n\n const {\n reset,\n submit,\n formInputs: { inputs, additionalInputs },\n } = useTableForm({\n operation: \"create\",\n tableName,\n });\n\n const tableLabel = tableLabels[tableName];\n\n const handleCancel = useCallback(() => {\n reset();\n onOpenChange(false);\n }, [onOpenChange, reset]);\n\n const handleSubmit = useCallback(async () => {\n try {\n await submit();\n onOpenChange(false);\n } catch (error) {\n console.error(error);\n }\n }, [onOpenChange, submit]);\n\n const buttonStyles =\n \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\n\n return (\n <Modal\n contentProps={{\n className: \"rounded-3xl\",\n }}\n onOpenChange={onOpenChange}\n open={open}\n overlayProps={{\n className: \"top-10\",\n }}\n >\n <div className=\"w-[400px] p-6 text-slate-300\">\n <div className=\"mb-6 flex justify-between\">\n <h1 className=\"text-xl font-bold\">Create {tableLabel}</h1>\n <button\n className=\"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\"\n onClick={handleCancel}\n tabIndex={-1}\n >\n <Icon name=\"XmarkLight\" size={24} />\n </button>\n </div>\n <ModalFormInputs inputs={inputs} />\n {additionalInputs}\n <div className=\"mt-8 flex justify-between gap-3\">\n <button\n className={twMerge(\n buttonStyles,\n \"flex-1 bg-slate-50 text-slate-800\",\n )}\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n className={twMerge(buttonStyles, \"flex-1 bg-gray-800 text-gray-50\")}\n onClick={handleSubmit}\n >\n Save\n </button>\n </div>\n </div>\n </Modal>\n );\n});\n","import { Icon, Modal } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { memo, useCallback } from \"react\";\nimport type { DependentItemProps } from \"../constants/dependent-items.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport type { TableName } from \"../types.js\";\n\nexport type RWADeleteItemModalProps = ComponentPropsWithoutRef<typeof Modal> & {\n readonly tableName: TableName;\n readonly dependentItemProps: DependentItemProps;\n};\n\nexport const RWADeleteItemModal = memo(function RWADeleteItemModal(\n props: RWADeleteItemModalProps,\n) {\n const { tableName, dependentItemProps, onOpenChange, open } = props;\n\n const tableLabel = tableLabels[tableName].toLowerCase();\n\n const handleCancel = useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <Modal\n contentProps={{\n className: \"rounded-3xl\",\n }}\n onOpenChange={onOpenChange}\n open={open}\n overlayProps={{\n className: \"top-10\",\n }}\n >\n <div className=\"w-[400px] p-6 text-slate-300\">\n <div className=\"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\">\n Cannot delete {tableName}\n </div>\n <div className=\"my-6 flex gap-2 rounded-md bg-orange-100 p-4 text-orange-800\">\n <div>\n <Icon className=\"mt-1 text-orange-800\" name=\"Error\" />\n </div>\n <div>\n Warning! Cannot delete this {tableLabel} because there are items\n that depend on it. Please change or delete those first.\n </div>\n </div>\n <div className=\"my-6 rounded-md bg-slate-50 p-4 text-slate-200\">\n {dependentItemProps.map(({ dependentTableName, dependentItems }) => (\n <div key={dependentTableName}>\n <div className=\"mb-0.5 font-semibold\" key={1}>\n {`${tableLabels[dependentTableName]}s: `}\n </div>\n {dependentItems.map(({ id, label }) => (\n <div key={id}>{label}</div>\n ))}\n </div>\n ))}\n </div>\n <div className=\"mt-8 flex justify-between gap-3\">\n <button\n className=\"min-h-12 min-w-36 flex-1 rounded-xl bg-gray-800 px-6 py-3 text-base font-semibold text-gray-50 outline-none transition-all hover:scale-105 active:opacity-75\"\n onClick={handleCancel}\n >\n Back\n </button>\n </div>\n </div>\n </Modal>\n );\n});\n","import { RWACreateItemModal } from \"./create-item-modal.js\";\nimport { RWADeleteItemModal } from \"./delete-item-modal.js\";\n\nexport const modals = {\n createItem: RWACreateItemModal,\n deleteItem: RWADeleteItemModal,\n};\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { modals } from \"./modal-components.js\";\nimport { ModalContext } from \"./modal-context.js\";\nimport type { ModalContextValue, ModalProps, ModalType } from \"./types.js\";\n\nexport const ModalManager: React.FC<{\n readonly children?: React.ReactNode;\n}> = (props) => {\n const { children } = props;\n\n const [modalProps, setModalProps] = useState<ModalProps[keyof ModalProps]>();\n const [modalType, setModalType] = useState<ModalType>();\n const [open, setOpen] = useState(false);\n\n const showModal: ModalContextValue[\"showModal\"] = useCallback(\n (modalType, props) => {\n setOpen(true);\n setModalProps(props);\n setModalType(modalType);\n },\n [],\n );\n\n const closeModal: ModalContextValue[\"closeModal\"] = useCallback(() => {\n setOpen(false);\n }, []);\n\n const ModalComponent = modalType ? modals[modalType] : null;\n\n const value = useMemo(\n () => ({ showModal, closeModal }),\n [closeModal, showModal],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {ModalComponent ? (\n <ModalComponent\n {...(modalProps as any)}\n onOpenChange={setOpen}\n open={open}\n />\n ) : null}\n </ModalContext.Provider>\n );\n};\n","import { tableNames } from \"../constants/names.js\";\nimport { AccountsTable } from \"./accounts-table.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function OtherTab() {\n return (\n <div className=\"grid grid-rows-4 gap-4\">\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Accounts</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage accounts that can be associated with transactions and\n fees.\n </p>\n <AccountsTable />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Fixed Income Types</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage fixed income asset types.\n </p>\n <TableWithForm tableName={tableNames.FIXED_INCOME_TYPE} />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">SPVs</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage special purpose vehicles (SPVs).\n </p>\n <TableWithForm tableName={tableNames.SPV} />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Service Provider Fee Types</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage service providers and their associated fee types.\n </p>\n <TableWithForm tableName={tableNames.SERVICE_PROVIDER_FEE_TYPE} />\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\ntype Props = {\n readonly label: ReactNode;\n readonly description: ReactNode;\n readonly children: ReactNode;\n};\nexport function RwaTabContent(props: Props) {\n const { label, description, children } = props;\n\n return (\n <div>\n <h1 className=\"mb-2 text-lg font-bold\">{label}</h1>\n <p className=\"mb-4 text-xs text-gray-600\">{description}</p>\n {children}\n </div>\n );\n}\n","import { AssetsTable } from \"./assets-table.js\";\nimport { RwaTabContent } from \"./rwa-tab-content.js\";\n\nexport function PortfolioTab() {\n return (\n <RwaTabContent\n description=\"Details on the distribution of assets among different financial institutions or investment vehicles.\"\n label=\"Portfolio\"\n >\n <AssetsTable />\n </RwaTabContent>\n );\n}\n","import { Pagination, usePagination } from \"#design-system\";\nimport { Combobox } from \"#design-system/connect\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport {\n allGroupTransactionTypes,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableData } from \"../hooks/useTableData.js\";\nimport { makeFixedIncomeOptionLabel } from \"../utils/form.js\";\nimport { ItemDetails } from \"./item-details.js\";\nimport { Table } from \"./table.js\";\n\nexport function GroupTransactionsTable() {\n const tableName = tableNames.TRANSACTION;\n const { getIsFormOpen, fixedIncomes } = useEditorContext();\n\n const showForm = getIsFormOpen(tableName);\n const { tableData, sortHandler } = useTableData(tableName);\n const [filteredTableData, setFilteredTableData] = useState(tableData);\n const [filterAssetId, setFilterAssetId] = useState<string>();\n const [filterTypes, setFilterTypes] = useState<\n (keyof typeof allGroupTransactionTypes)[]\n >([]);\n const shouldPaginate = filteredTableData.length > 20;\n\n useEffect(() => {\n if (!filterAssetId && !filterTypes.length) {\n setFilteredTableData(tableData);\n return;\n }\n\n setFilteredTableData(\n tableData.filter((transaction) => {\n if (filterAssetId && filterTypes.length) {\n return (\n transaction.fixedIncomeTransaction?.assetId === filterAssetId &&\n filterTypes.includes(\n transaction.type as keyof typeof allGroupTransactionTypes,\n )\n );\n }\n\n if (filterAssetId) {\n return transaction.fixedIncomeTransaction?.assetId === filterAssetId;\n }\n\n if (filterTypes.length) {\n return filterTypes.includes(\n transaction.type as keyof typeof allGroupTransactionTypes,\n );\n }\n }),\n );\n }, [filterAssetId, filterTypes, tableData]);\n\n const filterByAssetOptions = useMemo(\n () =>\n fixedIncomes.map((asset) => ({\n label: makeFixedIncomeOptionLabel(asset),\n value: asset.id,\n })),\n [fixedIncomes],\n );\n\n const filterByTypeOptions = useMemo(\n () =>\n allGroupTransactionTypes.map((type) => ({\n label: groupTransactionTypeLabels[type],\n value: type,\n })),\n [],\n );\n\n const {\n pageItems,\n pages,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n hiddenNextPages,\n isNextPageAvailable,\n isPreviousPageAvailable,\n } = usePagination(filteredTableData);\n\n const handleFilterByAssetChange = useCallback((update: unknown) => {\n if (!update || !(typeof update === \"object\") || !(\"value\" in update)) {\n setFilterAssetId(undefined);\n return;\n }\n\n const { value: assetId } = update;\n\n setFilterAssetId(assetId as string);\n }, []);\n\n const handleFilterByTypeChange = useCallback((update: unknown) => {\n if (!update || !Array.isArray(update)) {\n setFilterTypes([]);\n return;\n }\n\n const _update = update as {\n value: keyof typeof allGroupTransactionTypes;\n }[];\n\n setFilterTypes(_update.map(({ value }) => value));\n }, []);\n\n return (\n <>\n <div className=\"mb-2 flex gap-2\">\n <div className=\"min-w-72 max-w-96\">\n <Combobox\n isClearable\n onChange={handleFilterByAssetChange}\n options={filterByAssetOptions}\n placeholder=\"Filter by Asset\"\n />\n </div>\n <div className=\"min-w-72 max-w-96\">\n <Combobox\n isClearable\n isMulti\n onChange={handleFilterByTypeChange}\n options={filterByTypeOptions}\n placeholder=\"Filter by Type\"\n />\n </div>\n <div className=\"flex w-full justify-end\">\n {shouldPaginate ? (\n <Pagination\n goToFirstPage={goToFirstPage}\n goToLastPage={goToLastPage}\n goToNextPage={goToNextPage}\n goToPage={goToPage}\n goToPreviousPage={goToPreviousPage}\n hiddenNextPages={hiddenNextPages}\n isNextPageAvailable={isNextPageAvailable}\n isPreviousPageAvailable={isPreviousPageAvailable}\n nextPageLabel=\"Next\"\n pages={pages}\n previousPageLabel=\"Previous\"\n />\n ) : null}\n </div>\n </div>\n <Table\n sortHandler={sortHandler}\n tableData={pageItems}\n tableName={tableName}\n />\n {showForm ? (\n <div className=\"mt-4 rounded-md bg-white\">\n <ItemDetails tableName={tableName} />\n </div>\n ) : null}\n </>\n );\n}\n","import { GroupTransactionsTable } from \"./group-transactions-table.js\";\nimport { RwaTabContent } from \"./rwa-tab-content.js\";\n\nexport function TransactionsTab() {\n return (\n <RwaTabContent\n description=\"Details on the distribution of assets among different financial institutions or investment vehicles.\"\n label=\"Transactions\"\n >\n <GroupTransactionsTable />\n </RwaTabContent>\n );\n}\n","import { Content, List, Root, Trigger } from \"@radix-ui/react-tabs\";\nimport { useCallback } from \"react\";\nimport { EditorActionButtons } from \"#design-system/connect\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { OtherTab } from \"./other-tab.js\";\nimport { PortfolioTab } from \"./portfolio-tab.js\";\nimport { TransactionsTab } from \"./transactions-tab.js\";\nexport function RWATabs() {\n const tabs = [\"Portfolio\", \"Transactions\", \"Other\"] as const;\n const {\n onSwitchboardLinkClick,\n onExport,\n onClose,\n onShowRevisionHistory,\n clearSelected,\n } = useEditorContext();\n\n const handleTabChange = useCallback(() => {\n clearSelected();\n }, [clearSelected]);\n\n return (\n <Root defaultValue=\"Portfolio\" onValueChange={handleTabChange}>\n <div className=\"flex justify-between\">\n {/* <EditorUndoRedoButtons {...props} /> */}\n <List className=\"flex gap-x-2 rounded-xl bg-slate-50 p-1 text-sm font-semibold text-gray-600 outline-none\">\n {tabs.map((tab) => (\n <Trigger\n className=\"data-[state='active']:tab-shadow data-disabled:cursor-not-allowed data-disabled:text-gray-400 h-7 w-32 rounded-lg transition duration-300 data-[state='active']:bg-gray-50 data-[state='active']:text-gray-900\"\n key={tab}\n value={tab}\n >\n {tab}\n </Trigger>\n ))}\n </List>\n <EditorActionButtons\n onClose={onClose}\n onExport={onExport}\n onShowRevisionHistory={onShowRevisionHistory}\n onSwitchboardLinkClick={onSwitchboardLinkClick}\n />\n </div>\n <div className=\"mt-3 rounded-md bg-slate-50 p-8\">\n <Content value=\"Portfolio\">\n <PortfolioTab />\n </Content>\n <Content value=\"Transactions\">\n <TransactionsTab />\n </Content>\n <Content value=\"Other\">\n <OtherTab />\n </Content>\n </div>\n </Root>\n );\n}\n","import { ModalManager } from \"./modal-manager.js\";\nimport { RWATabs } from \"./tabs.js\";\n\nexport function RWAEditor() {\n return (\n <ModalManager>\n <RWATabs />\n </ModalManager>\n );\n}\n","import type { DivProps } from \"#design-system\";\nimport { mergeClassNameProps } from \"#design-system\";\n\nexport interface RWAFormRowProps extends DivProps {\n readonly label?: React.ReactNode;\n readonly value?: React.ReactNode;\n}\n\nexport const RWAFormRow: React.FC<RWAFormRowProps> = ({\n label,\n value,\n ...divProps\n}) => (\n <div {...mergeClassNameProps(divProps, \"flex items-center px-6 text-xs\")}>\n <div className=\"text-gray-600\">{label}</div>\n <div className=\"text-gray-900\">{value ? value : \"--\"}</div>\n </div>\n);\n","import type { DivProps } from \"#design-system\";\n\nexport interface RWATableHeaderLabelProps extends DivProps {\n readonly label?: React.ReactNode;\n}\n\nexport const RWATableHeaderLabel: React.FC<RWATableHeaderLabelProps> = (\n props,\n) => {\n const { label, ...divProps } = props;\n\n return (\n <th scope=\"col\" {...divProps}>\n {label}\n </th>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["SERVICE_PROVIDER_FEE_TYPE","FIXED_INCOME_TYPE","ACCOUNT","TRANSACTION","ASSET","SPV","tableNames","tableLabels","editorStateKeysByTableName","deleteEditorActionInputsByTableName","defaultColumnCountByTableWidth","cashTransactionSignByTransactionType","AssetSale","PrincipalDraw","AssetPurchase","PrincipalReturn","FeesIncome","FeesPayment","InterestIncome","InterestPayment","assetTransactionSignByTransactionType","getStateKeyForTableName","tableName","stateKeysByTableName","ASSET","TRANSACTION","ACCOUNT","FIXED_INCOME_TYPE","SERVICE_PROVIDER_FEE_TYPE","SPV","getTableNameFor","action","parts","type","split","entity","slice","join","getActionOperationType","operation","NumericFormat","FormattedNumber","props","value","currency","decimalScale","thousandSeparator","fixedDecimalScale","prefix","undefined","ASSET_PURCHASE","ASSET_SALE","PRINCIPAL_DRAW","PRINCIPAL_RETURN","INTEREST_INCOME","INTEREST_PAYMENT","FEES_INCOME","FEES_PAYMENT","principalGroupTransactions","assetGroupTransactions","feesTransactions","interestTransactions","allGroupTransactionTypes","groupTransactionTypeLabels","AssetPurchase","AssetSale","PrincipalDraw","PrincipalReturn","InterestIncome","InterestPayment","FeesIncome","FeesPayment","all","create","ASSET_PURCHASE","ASSET_SALE","sumTotalForProperty","items","property","reduce","acc","item","Number","math","number","calculateCurrentValue","props","asset","transactions","fixedIncomeTypes","currentDate","Date","maturity","fixedIncomeType","find","id","fixedIncomeTypeId","name","purchaseTransactionsForAsset","filter","type","fixedIncomeTransaction","assetId","saleTransactionsForAsset","length","currentDateMs","bignumber","getTime","maturityDateMs","lessThan","purchaseDateMs","purchaseDate","sumQuantities","calculateSumQuantity","sub","salesProceeds","realizedSurplus","purchaseProceeds","currentPurchaseProceeds","add","totalDiscount","currentValue","div","mul","toNumber","sum","amount","formatInTimeZone","formatDateForDisplay","date","displayTime","isUTC","formatString","timeZone","getTimeZone","isISODate","str","test","d","Date","isNaN","getTime","toISOString","Intl","DateTimeFormat","resolvedOptions","isoDateStringToDateInput","isoDateString","withTime","format","assetGroupTransactions","isAssetGroupTransactionType","type","includes","isFixedIncomeAsset","asset","isCashAsset","getFixedIncomeAssets","portfolio","filter","a","getCashAsset","cashAsset","find","Error","FormattedNumber","assetTransactionSignByTransactionType","cashTransactionSignByTransactionType","FEES_INCOME","feesTransactions","groupTransactionTypeLabels","calculateCurrentValue","formatDateForDisplay","isISODate","getFixedIncomeAssets","isAssetGroupTransactionType","handleDateInTable","maybeDate","displayTime","isDate","Date","dateStr","toISOString","handleTableDatum","datum","decimalScale","undefined","calculateUnitPrice","cashAmount","fixedIncomeAmount","calculateCashBalanceChange","transactionType","fees","sign","feeAmounts","map","fee","amount","filter","Boolean","totalFees","reduce","acc","makeFixedIncomeTypesTableData","state","fixedIncomeTypes","addItemNumber","makeSPVsTableData","spvs","makeAssetsTableData","portfolio","transactions","currentDate","fixedIncomes","tableItems","fixedIncome","currentValue","asset","maybeAddSignToAmount","makeGroupTransactionsTableData","tableData","transaction","id","entryTime","find","fixedIncomeTransaction","assetId","name","type","typeLabel","cashTransactionSign","assetTransactionSign","quantity","cashTransaction","includes","cashBalanceChange","makeAccountsTableData","accounts","principalLenderAccountId","withoutPrincipalLender","account","makeServiceProviderFeeTypesTableData","serviceProviderFeeTypes","serviceProviderFeeType","accountId","accountName","label","accountReference","reference","items","item","index","itemNumber","makeTableData","tableName","tableDataMakersByTableName","ASSET","TRANSACTION","ACCOUNT","FIXED_INCOME_TYPE","SERVICE_PROVIDER_FEE_TYPE","SPV","createContext","useCallback","useContext","useEffect","useMemo","useReducer","useRef","useState","getActionOperationType","getStateKeyForTableName","getTableNameFor","makeTableData","getCashAsset","getFixedIncomeAssets","defaultEditorContextValue","accounts","fixedIncomeTypes","portfolio","principalLenderAccountId","serviceProviderFeeTypes","spvs","transactions","fixedIncomes","cashAsset","id","type","currency","balance","spvId","isAllowedToCreateDocuments","isAllowedToEditDocuments","canUndo","canRedo","operation","onSwitchboardLinkClick","undefined","selectedTableItem","selectedTableName","getIsFormOpen","clearSelected","viewItem","createItem","editItem","onExport","onClose","handleUndo","handleRedo","onShowRevisionHistory","handleAction","EditorContext","displayName","tableReducer","state","action","item","tableName","RWAEditorContextProvider","props","children","undo","redo","editorDispatcher","editorState","setEditorState","stateRef","tableState","tableDispatch","current","result","actionOperationType","stateKey","currentStateForKey","newStateForKey","newState","newTableData","newTableItem","find","map","error","console","value","useEditorContext","Icon","useCallback","twMerge","useEditorContext","RWATableCell","props","className","ItemNumberCell","itemNumber","MoreDetailsCell","isSelected","tableName","tableItem","viewItem","clearSelected","onClick","forwardRef","twMerge","RWATableRow","props","ref","children","className","delegated","orderBy","useCallback","useEffect","useMemo","useState","useSortTableItems","items","sortedItems","setSortedItems","column","setColumn","direction","setDirection","sortHandler","useMemo","useEditorContext","makeTableData","useSortTableItems","useTableData","tableName","inputs","tableData","sortedItems","sortHandler","useMemo","useEditorContext","useDependentItemProps","tableName","itemId","fixedIncomes","serviceProviderFeeTypes","transactions","dependentItemProps","dependentTableName","dependentItems","makeDependentAssetsList","makeDependentTransactionsList","makeDependentServiceProviderFeeTypesList","makeLabel","asset","id","label","name","filter","f","accountId","map","assets","fixedIncomeTypeId","spvId","t","index","fixedIncomeTransaction","assetId","cashTransaction","fees","some","serviceProviderFeeTypeId","useWatch","calculateCashBalanceChange","FormattedNumber","CashBalanceChange","props","control","cashAmount","name","type","fees","cashBalanceChange","useWatch","formatDateForDisplay","EntryTimeLabel","control","value","name","Date","forwardRef","twMerge","RWATableTextInput","props","ref","invalid","errorMessage","labelClassName","inputClassName","errorMessageClassName","inputProps","Controller","NumericFormat","twMerge","RWATableTextInput","RWANumberInput","props","name","control","currency","rules","errorMessage","errorMessageClassName","numericFormatProps","value","_","onChange","__","inputProps","allowNegative","decimalScale","thousandSeparator","fixedDecimalScale","prefix","undefined","invalid","field","ref","floatValue","Combobox","Controller","twMerge","RWATableSelect","props","options","name","control","rules","errorMessage","errorMessageClassName","disabled","restProps","invalid","field","onChange","onBlur","value","find","option","label","Icon","useFieldArray","twMerge","RWANumberInput","RWATableSelect","FeeTransactionsTable","props","headings","canHaveTransactionFees","serviceProviderFeeTypes","serviceProviderFeeTypeOptions","control","errors","isViewOnly","showCreateServiceProviderFeeTypeModal","fields","append","remove","name","length","map","heading","feeInput","index","id","onClick","label","fees","serviceProviderFeeTypeId","required","amount","validate","positive","value","Number","getIsTransaction","hash","isHexString","length","value","startsWith","forwardRef","useWatch","ConnectTooltip","ConnectTooltipProvider","RWATableTextInput","getIsTransaction","TransactionReference","props","ref","control","disabled","value","name","maxLength","shouldShortenValue","length","maybeShortenedValue","slice","isTransaction","tooltipContent","useWatch","twMerge","calculateUnitPrice","FormattedNumber","UnitPrice","props","control","cashAmount","name","fixedIncomeAmount","unitPrice","isViewOnly","createContext","ModalContext","showModal","closeModal","useContext","ModalContext","useModal","context","makeFixedIncomeOptionLabel","fixedIncome","label","name","ISIN","CUSIP","useCallback","useMemo","CashBalanceChange","EntryTimeLabel","FeeTransactionsTable","RWANumberInput","RWATableSelect","RWATableTextInput","TransactionReference","UnitPrice","useModal","tableNames","allGroupTransactionTypes","assetGroupTransactions","feesTransactions","groupTransactionTypeLabels","useEditorContext","formatDateForDisplay","makeFixedIncomeOptionLabel","handleTableDatum","useFormInputs","props","tableName","operation","formState","_formState","tableItem","_tableItem","register","_register","watch","_watch","control","_control","fixedIncomeTypes","spvs","serviceProviderFeeTypes","accounts","fixedIncomes","showModal","showCreateItemModal","ASSET","errors","derivedInputsToDisplay","label","Input","notional","purchaseDate","purchasePrice","purchaseProceeds","inputs","disabled","required","name","message","CUSIP","maxLength","value","minLength","pattern","ISIN","inputLabel","maturity","onClick","fixedIncomeTypeId","map","t","id","spvId","TRANSACTION","type","isFeesTransaction","includes","isAssetTransaction","canHaveTransactionFees","transactionTypeOptions","fixedIncomeOptions","fixedIncome","serviceProviderFeeTypeOptions","spft","feeType","find","account","accountId","reference","undefined","fixedIncomeAmount","validate","positive","Number","cashAmount","txRef","filter","Boolean","additionalInputs","ACCOUNT","SPV","FIXED_INCOME_TYPE","SERVICE_PROVIDER_FEE_TYPE","makeAccountLabel","makeAccountOptions","useMemo","tableNames","allGroupTransactionTypes","isoDateStringToDateInput","useDefaultFormValues","args","tableName","tableItem","fixedIncomeTypes","spvs","accounts","ASSET","fixedIncomeTypeId","id","spvId","name","maturity","ISIN","CUSIP","coupon","TRANSACTION","type","entryTime","Date","toISOString","cashAmount","fixedIncomeId","fixedIncomeAmount","serviceProviderFeeTypeId","fees","txRef","SPV","SERVICE_PROVIDER_FEE_TYPE","feeType","accountId","FIXED_INCOME_TYPE","ACCOUNT","label","reference","item","cashTransaction","amount","fixedIncomeTransaction","assetId","useCallback","useEffect","useMemo","useForm","useEditorContext","useDefaultFormValues","useWrappedForm","defaultValues","form","useSubmit","props","operation","tableName","tableItem","handleAction","fixedIncomeTypes","spvs","accounts","action","formValues","register","handleSubmit","reset","watch","control","formState","onSubmit","payload","actionType","type","submit","useMemo","useFormInputs","useSubmit","useTableForm","props","operation","tableName","tableItem","submit","reset","register","control","formState","watch","formInputs","mergeClassNameProps","PowerhouseButton","RWAButton","props","children","twJoin","FormInputs","props","inputs","map","label","Input","inputLabel","index","Icon","memo","useCallback","useDependentItemProps","tableLabels","useEditorContext","useTableForm","RWAButton","FormInputs","useModal","ItemDetails","props","tableName","showModal","closeModal","selectedTableItem","operation","viewItem","editItem","clearSelected","handleAction","isAllowedToCreateDocuments","isAllowedToEditDocuments","principalLenderAccountId","dependentItemProps","id","hasDependentItems","some","p","dependentItems","length","isEditOperation","isCreateOperation","isViewOperation","isAllowedToCreateOrEdit","isPrincipalLenderAccount","isAllowedToDeleteItem","showCancelButton","showSubmitButton","showDeleteButton","showEditButton","showCloseButton","tableLabel","submit","reset","formInputs","inputs","additionalInputs","tableItem","handleClose","handleCancel","showDeleteModal","handleDelete","editorDeleteActionType","type","payload","onEditButtonClick","closeButton","cancelButton","submitButton","deleteButton","editButton","itemNumber","columnsByTableName","ASSET","key","label","allowSorting","displayTime","isNumberColumn","decimalScale","TRANSACTION","FIXED_INCOME_TYPE","SPV","SERVICE_PROVIDER_FEE_TYPE","ACCOUNT","useCallback","useEffect","useMemo","useState","useColumnPriority","props","columnCountByTableWidth","tableContainerRef","columns","hasItemNumberColumn","hasMoreDetailsColumn","parentWidth","setParentWidth","indexColumn","key","label","allowSorting","isSpecialColumn","undefined","moreDetailsColumn","columnsToShow","setColumnsToShow","handleResize","current","parentElement","offsetWidth","handleDropColumns","columnCount","getColumnCount","dynamicColumnsToShow","slice","filter","Boolean","window","addEventListener","removeEventListener","parentElementWidth","closestKey","smallestDifference","Infinity","Object","keys","forEach","columnWidthKey","columnWidth","parseInt","difference","Math","abs","useCallback","useEffect","useState","defaultRowHeight","defaultHeaderHeight","defaultRowCount","defaultTwentyRowsPlusHeaderHeight","useTableHeight","props","selectedItemNumber","tableContainerRef","rowRefs","headerRef","hasSpecialLastRow","maxHeight","setMaxHeight","selectedRowNumber","undefined","rowHeight","current","offsetHeight","headerHeight","updateTableHeight","twentyRowsAndHeaderHeight","tableContainerRect","getBoundingClientRect","rowRect","rowBottom","bottom","tableTop","top","calculatedHeight","handleScroll","tableContainerElement","addEventListener","removeEventListener","Icon","useState","twJoin","twMerge","TableBase","props","children","ref","tableData","columns","footer","renderRow","onClickSort","specialFirstRow","specialLastRow","maxHeight","headerRef","hasSelectedItem","sortDirection","setSortDirection","sortKey","setSortKey","map","column","allowSorting","key","sortDir","isNumberColumn","label","item","index","Icon","useCallback","useRef","Fragment","columnsByTableName","tableLabels","defaultColumnCountByTableWidth","useEditorContext","useColumnPriority","useTableHeight","handleTableDatum","TableBase","ItemNumberCell","MoreDetailsCell","RWATableCell","RWATableRow","Table","props","tableName","tableData","columnCountByTableWidth","sortHandler","specialFirstRow","specialLastRow","columns","operation","selectedTableItem","isAllowedToCreateDocuments","createItem","tableContainerRef","rowRefs","headerRef","columnsToShow","maxHeight","selectedItemNumber","itemNumber","hasSpecialLastRow","tableLabel","onCreateItemClick","renderRow","tableItem","index","isSelected","id","el","current","map","column","key","isNumberColumn","decimalScale","displayTime","Pagination","usePagination","useEditorContext","useTableData","ItemDetails","Table","TableWithForm","props","tableName","specialFirstRow","specialLastRow","getIsFormOpen","showForm","tableData","sortHandler","shouldPaginate","length","pageItems","pages","goToPage","goToNextPage","goToPreviousPage","goToFirstPage","goToLastPage","hiddenNextPages","isNextPageAvailable","isPreviousPageAvailable","Icon","useCallback","Fragment","tableNames","useEditorContext","RWATableCell","RWATableRow","TableWithForm","AccountsTable","accounts","principalLenderAccountId","principalLenderAccount","find","account","id","renderPrincipalLenderRow","c","map","column","key","label","specialFirstRow","undefined","ACCOUNT","Fragment","useCallback","useMemo","tableNames","useEditorContext","sumTotalForProperty","handleTableDatum","RWATableCell","RWATableRow","TableWithForm","AssetsTable","tableName","ASSET","selectedTableItem","fixedIncomes","cashAsset","cashAssetFormattedAsTableItem","id","name","fixedIncomeTypeId","spvId","maturity","ISIN","CUSIP","coupon","notional","balance","purchaseDate","purchasePrice","purchaseProceeds","salesProceeds","totalDiscount","realizedSurplus","currentValue","totalPurchaseProceeds","totalSalesProceeds","totalTotalDiscount","totalRealizedSurplus","specialFirstRow","c","map","column","key","specialLastRow","ModalFormInputs","props","inputs","map","label","Input","index","Icon","Modal","memo","useCallback","twMerge","tableLabels","useTableForm","ModalFormInputs","RWACreateItemModal","props","tableName","open","onOpenChange","reset","submit","formInputs","inputs","additionalInputs","operation","tableLabel","handleCancel","handleSubmit","error","console","buttonStyles","className","Icon","Modal","memo","useCallback","tableLabels","RWADeleteItemModal","props","tableName","dependentItemProps","onOpenChange","open","tableLabel","toLowerCase","handleCancel","className","map","dependentTableName","dependentItems","id","label","RWACreateItemModal","RWADeleteItemModal","modals","createItem","deleteItem","React","useCallback","useMemo","useState","modals","ModalContext","ModalManager","props","children","modalProps","setModalProps","modalType","setModalType","open","setOpen","showModal","closeModal","ModalComponent","value","tableNames","AccountsTable","TableWithForm","OtherTab","FIXED_INCOME_TYPE","SPV","SERVICE_PROVIDER_FEE_TYPE","RwaTabContent","props","label","description","children","AssetsTable","RwaTabContent","PortfolioTab","Pagination","usePagination","Combobox","useCallback","useEffect","useMemo","useState","tableNames","allGroupTransactionTypes","groupTransactionTypeLabels","useEditorContext","useTableData","makeFixedIncomeOptionLabel","ItemDetails","Table","GroupTransactionsTable","tableName","TRANSACTION","getIsFormOpen","fixedIncomes","showForm","tableData","sortHandler","filteredTableData","setFilteredTableData","filterAssetId","setFilterAssetId","filterTypes","setFilterTypes","shouldPaginate","length","filter","transaction","fixedIncomeTransaction","assetId","includes","type","filterByAssetOptions","map","asset","label","value","id","filterByTypeOptions","pageItems","pages","goToPage","goToNextPage","goToPreviousPage","goToFirstPage","goToLastPage","hiddenNextPages","isNextPageAvailable","isPreviousPageAvailable","handleFilterByAssetChange","update","undefined","handleFilterByTypeChange","Array","isArray","_update","GroupTransactionsTable","RwaTabContent","TransactionsTab","Content","List","Root","Trigger","useCallback","EditorActionButtons","useEditorContext","OtherTab","PortfolioTab","TransactionsTab","RWATabs","tabs","onSwitchboardLinkClick","onExport","onClose","onShowRevisionHistory","clearSelected","handleTabChange","map","tab","ModalManager","RWATabs","RWAEditor","mergeClassNameProps","RWAFormRow","label","value","divProps","RWATableHeaderLabel","props","label","divProps"],"sources":["../../src/rwa/constants/names.ts","../../src/rwa/constants/table.ts","../../src/rwa/components/formatted-number.tsx","../../src/rwa/constants/transactions.ts","../../src/rwa/utils/calculations.ts","../../src/rwa/utils/date.ts","../../src/rwa/utils/validators.ts","../../src/rwa/utils/table.tsx","../../src/rwa/context/editor-context.tsx","../../src/rwa/components/table-cell.tsx","../../src/rwa/components/table-row.tsx","../../src/rwa/hooks/useSortTableItems.ts","../../src/rwa/hooks/useTableData.tsx","../../src/rwa/constants/dependent-items.ts","../../src/rwa/components/cash-balance-change.tsx","../../src/rwa/components/entry-time-label.tsx","../../src/rwa/components/text-input.tsx","../../src/rwa/components/number-input.tsx","../../src/rwa/components/select.tsx","../../src/rwa/components/fee-transactions-table.tsx","../../src/services/viem.ts","../../src/rwa/components/transaction-reference.tsx","../../src/rwa/components/unit-price.tsx","../../src/rwa/components/modal-context.ts","../../src/rwa/components/use-modal.ts","../../src/rwa/utils/form.ts","../../src/rwa/hooks/useFormInputs.tsx","../../src/rwa/hooks/useDefaultFormValues.ts","../../src/rwa/hooks/useSubmit.ts","../../src/rwa/hooks/useTableForm.tsx","../../src/rwa/components/button.tsx","../../src/rwa/components/form-inputs.tsx","../../src/rwa/components/item-details.tsx","../../src/rwa/constants/columns.ts","../../src/rwa/hooks/useColumnPriority.ts","../../src/rwa/hooks/useTableHeight.ts","../../src/rwa/components/table-base.tsx","../../src/rwa/components/table.tsx","../../src/rwa/components/table-with-form.tsx","../../src/rwa/components/accounts-table.tsx","../../src/rwa/components/assets-table.tsx","../../src/rwa/components/modal-form-inputs.tsx","../../src/rwa/components/create-item-modal.tsx","../../src/rwa/components/delete-item-modal.tsx","../../src/rwa/components/modal-components.ts","../../src/rwa/components/modal-manager.tsx","../../src/rwa/components/other-tab.tsx","../../src/rwa/components/rwa-tab-content.tsx","../../src/rwa/components/portfolio-tab.tsx","../../src/rwa/components/group-transactions-table.tsx","../../src/rwa/components/transactions-tab.tsx","../../src/rwa/components/tabs.tsx","../../src/rwa/components/editor.tsx","../../src/rwa/components/form-row.tsx","../../src/rwa/components/header-label.tsx"],"sourcesContent":["import type { TableName } from \"../types.js\";\n\nconst SERVICE_PROVIDER_FEE_TYPE = \"SERVICE_PROVIDER_FEE_TYPE\";\nconst FIXED_INCOME_TYPE = \"FIXED_INCOME_TYPE\";\nconst ACCOUNT = \"ACCOUNT\";\nconst TRANSACTION = \"TRANSACTION\";\nconst ASSET = \"ASSET\";\nconst SPV = \"SPV\";\n\nexport const tableNames = {\n SERVICE_PROVIDER_FEE_TYPE,\n FIXED_INCOME_TYPE,\n ACCOUNT,\n TRANSACTION,\n ASSET,\n SPV,\n} as const;\n\nexport const tableLabels: Record<TableName, string> = {\n SERVICE_PROVIDER_FEE_TYPE: \"Service Provider Fee Type\",\n FIXED_INCOME_TYPE: \"Fixed Income Asset Type\",\n ACCOUNT: \"Account\",\n TRANSACTION: \"Transaction\",\n ASSET: \"Asset\",\n SPV: \"SPV\",\n} as const;\n\nexport const editorStateKeysByTableName = {\n SERVICE_PROVIDER_FEE_TYPE: \"serviceProviderFeeTypes\",\n FIXED_INCOME_TYPE: \"fixedIncomeTypes\",\n ACCOUNT: \"accounts\",\n TRANSACTION: \"transactions\",\n ASSET: \"portfolio\",\n SPV: \"spvs\",\n} as const;\n\nexport const deleteEditorActionInputsByTableName = {\n SERVICE_PROVIDER_FEE_TYPE: \"DELETE_SERVICE_PROVIDER_FEE_TYPE\",\n FIXED_INCOME_TYPE: \"DELETE_FIXED_INCOME_TYPE\",\n ACCOUNT: \"DELETE_ACCOUNT\",\n TRANSACTION: \"DELETE_TRANSACTION\",\n ASSET: \"DELETE_ASSET\",\n SPV: \"DELETE_SPV\",\n} as const;\n","import type {\n EditorAction,\n GroupTransactionType,\n RealWorldAssetsState,\n TableName,\n TableNameFor,\n} from \"../types.js\";\n\nexport const defaultColumnCountByTableWidth = {\n 1520: 10,\n 1394: 9,\n 1239: 8,\n 1112: 7,\n 984: 6,\n};\n\nexport const cashTransactionSignByTransactionType: Record<\n GroupTransactionType,\n -1 | 1\n> = {\n AssetSale: 1,\n PrincipalDraw: 1,\n AssetPurchase: -1,\n PrincipalReturn: -1,\n FeesIncome: 1,\n FeesPayment: -1,\n InterestIncome: 1,\n InterestPayment: -1,\n} as const;\n\nexport const assetTransactionSignByTransactionType = {\n AssetSale: -1,\n AssetPurchase: 1,\n} as const;\n\nexport function getStateKeyForTableName(tableName: TableName) {\n const stateKeysByTableName: Record<TableName, keyof RealWorldAssetsState> = {\n ASSET: \"portfolio\",\n TRANSACTION: \"transactions\",\n ACCOUNT: \"accounts\",\n FIXED_INCOME_TYPE: \"fixedIncomeTypes\",\n SERVICE_PROVIDER_FEE_TYPE: \"serviceProviderFeeTypes\",\n SPV: \"spvs\",\n } as const;\n\n return stateKeysByTableName[tableName];\n}\n\nexport function getTableNameFor<A extends EditorAction>(\n action: A,\n): TableNameFor<A> {\n const parts = action.type.split(\"_\");\n const entity = parts.slice(1).join(\"_\");\n return entity as TableNameFor<A>;\n}\nexport function getActionOperationType<A extends EditorAction>(action: A) {\n const operation = action.type.split(\"_\")[0];\n return operation as \"CREATE\" | \"EDIT\" | \"DELETE\";\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { NumericFormat } from \"react-number-format\";\n\ntype Props = Omit<\n ComponentPropsWithoutRef<typeof NumericFormat>,\n \"displayType\"\n> & {\n readonly currency?: \"USD\";\n};\n\nexport function FormattedNumber(props: Props) {\n const {\n value,\n currency,\n decimalScale = 2,\n thousandSeparator = \",\",\n fixedDecimalScale = true,\n } = props;\n\n const prefix = currency === \"USD\" ? \"$\" : undefined;\n\n return (\n <NumericFormat\n decimalScale={decimalScale}\n displayType=\"text\"\n fixedDecimalScale={fixedDecimalScale}\n prefix={prefix}\n thousandSeparator={thousandSeparator}\n value={value}\n />\n );\n}\n","export const ASSET_PURCHASE = \"AssetPurchase\";\nexport const ASSET_SALE = \"AssetSale\";\nexport const PRINCIPAL_DRAW = \"PrincipalDraw\";\nexport const PRINCIPAL_RETURN = \"PrincipalReturn\";\nexport const INTEREST_INCOME = \"InterestIncome\";\nexport const INTEREST_PAYMENT = \"InterestPayment\";\nexport const FEES_INCOME = \"FeesIncome\";\nexport const FEES_PAYMENT = \"FeesPayment\";\n\nexport const principalGroupTransactions = [\n PRINCIPAL_DRAW,\n PRINCIPAL_RETURN,\n] as const;\n\nexport const assetGroupTransactions = [ASSET_PURCHASE, ASSET_SALE] as const;\n\nexport const feesTransactions = [FEES_INCOME, FEES_PAYMENT] as const;\n\nexport const interestTransactions = [\n INTEREST_INCOME,\n INTEREST_PAYMENT,\n] as const;\n\nexport const allGroupTransactionTypes = [\n ...principalGroupTransactions,\n ...assetGroupTransactions,\n ...feesTransactions,\n ...interestTransactions,\n] as const;\n\nexport const groupTransactionTypeLabels = {\n AssetPurchase: \"Asset purchase\",\n AssetSale: \"Asset sale\",\n PrincipalDraw: \"Principal draw\",\n PrincipalReturn: \"Principal return\",\n InterestIncome: \"Interest income\",\n InterestPayment: \"Interest payment\",\n FeesIncome: \"Fees income\",\n FeesPayment: \"Fees payment\",\n} as const;\n","import { all, create } from \"mathjs\";\nimport { ASSET_PURCHASE, ASSET_SALE } from \"../constants/transactions.js\";\nimport type {\n FixedIncome,\n FixedIncomeType,\n GroupTransaction,\n} from \"../types.js\";\n\ntype NumericKeys<T> = {\n [K in keyof T]: T[K] extends number ? K : never;\n}[keyof T];\n\nexport function sumTotalForProperty<T extends Record<string, any>>(\n items: T[],\n property: NumericKeys<T>,\n): number {\n return items.reduce((acc, item) => acc + Number(item[property]), 0);\n}\n\nexport const math = create(all, {\n number: \"BigNumber\",\n});\n\nexport function calculateCurrentValue(props: {\n asset: FixedIncome | undefined;\n transactions: GroupTransaction[];\n fixedIncomeTypes: FixedIncomeType[];\n currentDate?: Date;\n}) {\n const {\n asset,\n transactions,\n fixedIncomeTypes,\n currentDate = new Date(),\n } = props;\n\n // asset must have a maturity date to calculate\n if (!asset?.maturity) return null;\n\n const fixedIncomeType = fixedIncomeTypes.find(\n ({ id }) => id === asset.fixedIncomeTypeId,\n );\n\n if (!fixedIncomeType) return null;\n\n // currently only Treasury Bills are supported\n if (fixedIncomeType.name !== \"Treasury Bill\") return null;\n\n const purchaseTransactionsForAsset = transactions.filter(\n ({ type, fixedIncomeTransaction }) =>\n type === ASSET_PURCHASE && fixedIncomeTransaction?.assetId === asset.id,\n );\n\n const saleTransactionsForAsset = transactions.filter(\n ({ type, fixedIncomeTransaction }) =>\n type === ASSET_SALE && fixedIncomeTransaction?.assetId === asset.id,\n );\n\n // formula is meaningless if there are no purchase or sale transactions\n if (!purchaseTransactionsForAsset.length && !saleTransactionsForAsset.length)\n return null;\n\n const currentDateMs = math.bignumber(currentDate.getTime());\n const maturityDateMs = math.bignumber(new Date(asset.maturity).getTime());\n\n // do not calculate if the asset has matured\n if (maturityDateMs.lessThan(currentDateMs)) return null;\n\n const purchaseDateMs = math.bignumber(new Date(asset.purchaseDate).getTime());\n const sumQuantities = calculateSumQuantity(purchaseTransactionsForAsset).sub(\n calculateSumQuantity(saleTransactionsForAsset),\n );\n const salesProceeds = math.bignumber(asset.salesProceeds);\n const realizedSurplus = math.bignumber(asset.realizedSurplus);\n const purchaseProceeds = math.bignumber(asset.purchaseProceeds);\n const currentPurchaseProceeds = purchaseProceeds\n .sub(salesProceeds)\n .add(realizedSurplus);\n const totalDiscount = sumQuantities.sub(currentPurchaseProceeds);\n\n const currentValue = currentDateMs\n .sub(purchaseDateMs)\n .div(maturityDateMs.sub(purchaseDateMs))\n .mul(totalDiscount)\n .add(currentPurchaseProceeds)\n .toNumber();\n\n return currentValue;\n}\nexport function calculateSumQuantity(transactions: GroupTransaction[]) {\n return transactions.reduce((sum, { fixedIncomeTransaction }) => {\n if (!fixedIncomeTransaction) return sum;\n return sum.add(math.bignumber(fixedIncomeTransaction.amount));\n }, math.bignumber(0));\n}\n","import { formatInTimeZone } from \"date-fns-tz/formatInTimeZone\";\n\nexport function formatDateForDisplay(\n date: Date | string,\n displayTime = true,\n isUTC = false,\n) {\n const formatString = displayTime ? \"yyyy/MM/dd, HH:mm:ss zzz\" : \"yyyy/MM/dd\";\n const timeZone = isUTC ? \"UTC\" : getTimeZone();\n return formatInTimeZone(date, timeZone, formatString);\n}\n\nexport function isISODate(str: string) {\n if (!/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(str)) return false;\n const d = new Date(str);\n return d instanceof Date && !isNaN(d.getTime()) && d.toISOString() === str;\n}\n\nexport function getTimeZone() {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n}\n\nexport function isoDateStringToDateInput(\n isoDateString: string,\n withTime = false,\n) {\n const format = withTime ? \"yyyy-MM-dd'T'HH:mm:ss\" : \"yyyy-MM-dd\";\n const timeZone = getTimeZone();\n return formatInTimeZone(isoDateString, timeZone, format);\n}\n","import { assetGroupTransactions } from \"../constants/transactions.js\";\nimport type {\n Asset,\n AssetGroupTransactionType,\n CashAsset,\n FixedIncome,\n GroupTransactionType,\n} from \"../types.js\";\n\nexport function isAssetGroupTransactionType(\n type: GroupTransactionType,\n): type is AssetGroupTransactionType {\n return assetGroupTransactions.includes(\n type as (typeof assetGroupTransactions)[number],\n );\n}\n\nexport function isFixedIncomeAsset(\n asset: Asset | undefined | null,\n): asset is FixedIncome {\n if (!asset) return false;\n if (asset.type === \"FixedIncome\") return true;\n if (\"fixedIncomeId\" in asset) return true;\n return false;\n}\n\nexport function isCashAsset(\n asset: Asset | undefined | null,\n): asset is CashAsset {\n if (!asset) return false;\n if (asset.type === \"Cash\") return true;\n if (\"currency\" in asset) return true;\n return false;\n}\n\nexport function getFixedIncomeAssets(portfolio: Asset[]) {\n return portfolio.filter((a) => isFixedIncomeAsset(a));\n}\n\nexport function getCashAsset(portfolio: Asset[]) {\n const cashAsset = portfolio.find((a) => isCashAsset(a));\n if (!cashAsset) {\n throw new Error(\"Cash asset not found\");\n }\n return cashAsset;\n}\n","import type { InputMaybe } from \"@powerhousedao/shared/document-model\";\nimport { FormattedNumber } from \"../components/formatted-number.js\";\nimport {\n assetTransactionSignByTransactionType,\n cashTransactionSignByTransactionType,\n} from \"../constants/table.js\";\nimport {\n FEES_INCOME,\n feesTransactions,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport type {\n GroupTransactionType,\n Item,\n ItemData,\n RealWorldAssetsState,\n TableItem,\n TableItemType,\n TableName,\n TransactionFeeInput,\n} from \"../types.js\";\nimport { calculateCurrentValue } from \"./calculations.js\";\nimport { formatDateForDisplay, isISODate } from \"./date.js\";\nimport {\n getFixedIncomeAssets,\n isAssetGroupTransactionType,\n} from \"./validators.js\";\n\nexport function handleDateInTable(\n maybeDate: string | Date,\n displayTime = true,\n) {\n const isDate = maybeDate instanceof Date || isISODate(maybeDate);\n if (isDate) {\n const dateStr =\n maybeDate instanceof Date ? maybeDate.toISOString() : maybeDate;\n return formatDateForDisplay(dateStr, displayTime);\n }\n return maybeDate;\n}\n\nexport function handleTableDatum(\n datum: ItemData,\n decimalScale = 2,\n displayTime = true,\n) {\n if (datum === null || datum === undefined) return \"--\";\n\n if (typeof datum === \"number\")\n return <FormattedNumber decimalScale={decimalScale} value={datum} />;\n\n return handleDateInTable(datum, displayTime);\n}\n\nexport function calculateUnitPrice(\n cashAmount: InputMaybe<number>,\n fixedIncomeAmount: InputMaybe<number>,\n) {\n if (!cashAmount || !fixedIncomeAmount) return 0;\n return cashAmount / fixedIncomeAmount;\n}\n\nexport function calculateCashBalanceChange(\n transactionType: InputMaybe<GroupTransactionType>,\n cashAmount: InputMaybe<number>,\n fees: InputMaybe<TransactionFeeInput[]>,\n) {\n if (!cashAmount || !transactionType) return 0;\n\n const sign = cashTransactionSignByTransactionType[transactionType];\n\n const feeAmounts = (fees?.map((fee) => fee.amount).filter(Boolean) ??\n []) as number[];\n\n const totalFees = feeAmounts.reduce((acc, fee) => acc + fee, 0);\n\n return cashAmount * sign - totalFees;\n}\n\nfunction makeFixedIncomeTypesTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"FIXED_INCOME_TYPE\">[] {\n const { fixedIncomeTypes } = state;\n return addItemNumber(fixedIncomeTypes);\n}\n\nfunction makeSPVsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"SPV\">[] {\n const { spvs } = state;\n return addItemNumber(spvs);\n}\n\nfunction makeAssetsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"ASSET\">[] {\n const { portfolio, transactions, fixedIncomeTypes } = state;\n const currentDate = new Date();\n const fixedIncomes = getFixedIncomeAssets(portfolio);\n\n const tableItems = fixedIncomes.map((fixedIncome) => {\n const currentValue = calculateCurrentValue({\n asset: fixedIncome,\n currentDate,\n transactions,\n fixedIncomeTypes,\n });\n\n return {\n ...fixedIncome,\n currentValue,\n };\n });\n\n return addItemNumber(tableItems);\n}\nfunction maybeAddSignToAmount(amount: number | undefined, sign: 1 | -1) {\n if (!amount) return amount;\n return amount * sign;\n}\n\nfunction makeGroupTransactionsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"TRANSACTION\">[] {\n const { transactions, portfolio } = state;\n const fixedIncomes = getFixedIncomeAssets(portfolio);\n\n const tableData = transactions.map((transaction) => {\n const id = transaction.id;\n const entryTime = transaction.entryTime;\n const asset = fixedIncomes.find(\n (asset) => asset.id === transaction.fixedIncomeTransaction?.assetId,\n )?.name;\n const type = transaction.type;\n const typeLabel = groupTransactionTypeLabels[type];\n const cashTransactionSign = cashTransactionSignByTransactionType[type];\n const assetTransactionSign = isAssetGroupTransactionType(type)\n ? assetTransactionSignByTransactionType[type]\n : 1;\n const quantity = maybeAddSignToAmount(\n transaction.fixedIncomeTransaction?.amount,\n assetTransactionSign,\n );\n const cashAmount = maybeAddSignToAmount(\n transaction.cashTransaction.amount,\n cashTransactionSign,\n );\n const totalFees = feesTransactions.includes(\n transaction.type as (typeof feesTransactions)[number],\n )\n ? (maybeAddSignToAmount(\n transaction.cashTransaction.amount,\n transaction.type === FEES_INCOME ? -1 : 1,\n ) ?? 0)\n : (transaction.fees?.reduce((acc, fee) => acc + fee.amount, 0) ?? 0);\n const cashBalanceChange = transaction.cashBalanceChange;\n\n return {\n ...transaction,\n id,\n type,\n typeLabel,\n entryTime,\n asset,\n quantity,\n cashAmount,\n totalFees,\n cashBalanceChange,\n };\n });\n\n return addItemNumber(tableData);\n}\nfunction makeAccountsTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"ACCOUNT\">[] {\n const { accounts, principalLenderAccountId } = state;\n\n const withoutPrincipalLender = accounts.filter(\n (account) => account.id !== principalLenderAccountId,\n );\n const tableData = addItemNumber(withoutPrincipalLender);\n\n return tableData;\n}\n\nfunction makeServiceProviderFeeTypesTableData(\n state: RealWorldAssetsState,\n): TableItemType<\"SERVICE_PROVIDER_FEE_TYPE\">[] {\n const { serviceProviderFeeTypes, accounts } = state;\n\n const tableData = serviceProviderFeeTypes.map((serviceProviderFeeType) => {\n const account = accounts.find(\n (account) => account.id === serviceProviderFeeType.accountId,\n );\n\n return {\n ...serviceProviderFeeType,\n accountName: account?.label,\n accountReference: account?.reference,\n };\n });\n\n return addItemNumber(tableData);\n}\nfunction addItemNumber<TItem extends Item>(items: TItem[]) {\n return items.map((item, index) => ({\n ...item,\n itemNumber: index + 1,\n })) as TableItem<TItem>[];\n}\n\nexport function makeTableData(\n tableName: TableName,\n state: RealWorldAssetsState,\n) {\n return tableDataMakersByTableName[tableName](state);\n}\n\nexport const tableDataMakersByTableName = {\n ASSET: makeAssetsTableData,\n TRANSACTION: makeGroupTransactionsTableData,\n ACCOUNT: makeAccountsTableData,\n FIXED_INCOME_TYPE: makeFixedIncomeTypesTableData,\n SERVICE_PROVIDER_FEE_TYPE: makeServiceProviderFeeTypesTableData,\n SPV: makeSPVsTableData,\n} as const;\n","import type { ReactNode } from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport {\n getActionOperationType,\n getStateKeyForTableName,\n getTableNameFor,\n} from \"../constants/table.js\";\nimport type {\n CashAsset,\n EditorAction,\n EditorDispatcher,\n FixedIncome,\n Operation,\n RealWorldAssetsState,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { makeTableData } from \"../utils/table.js\";\nimport { getCashAsset, getFixedIncomeAssets } from \"../utils/validators.js\";\n\nexport type RWAEditorContextProps = {\n readonly isAllowedToCreateDocuments: boolean;\n readonly isAllowedToEditDocuments: boolean;\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n readonly onSwitchboardLinkClick: (() => void) | undefined;\n readonly onExport: () => void;\n readonly onClose: () => void;\n readonly onShowRevisionHistory: () => void;\n};\ntype TEditorContext = RWAEditorContextProps &\n RealWorldAssetsState & {\n readonly cashAsset: CashAsset;\n readonly fixedIncomes: FixedIncome[];\n readonly selectedTableItem: TableItemType<TableName> | null;\n readonly selectedTableName: TableName | null;\n readonly operation: Operation;\n readonly viewItem: (\n item: TableItemType<TableName>,\n tableName: TableName,\n ) => void;\n readonly createItem: (tableName: TableName) => void;\n readonly editItem: (\n item: TableItemType<TableName>,\n tableName: TableName,\n ) => void;\n readonly clearSelected: () => void;\n readonly getIsFormOpen: (tableName: TableName) => boolean;\n readonly handleAction: (action: EditorAction) => void;\n readonly handleUndo: () => void;\n readonly handleRedo: () => void;\n };\n\nconst defaultEditorContextValue: TEditorContext = {\n accounts: [],\n fixedIncomeTypes: [],\n portfolio: [],\n principalLenderAccountId: \"\",\n serviceProviderFeeTypes: [],\n spvs: [],\n transactions: [],\n fixedIncomes: [],\n cashAsset: {\n id: \"\",\n type: \"Cash\",\n currency: \"USD\",\n balance: 0,\n spvId: \"\",\n },\n isAllowedToCreateDocuments: false,\n isAllowedToEditDocuments: false,\n canUndo: false,\n canRedo: false,\n operation: null,\n onSwitchboardLinkClick: undefined,\n selectedTableItem: null,\n selectedTableName: null,\n getIsFormOpen: () => false,\n clearSelected: () => {},\n viewItem: () => {},\n createItem: () => {},\n editItem: () => {},\n onExport: () => {},\n onClose: () => {},\n handleUndo: () => {},\n handleRedo: () => {},\n onShowRevisionHistory: () => {},\n handleAction: () => {},\n};\n\nconst EditorContext = createContext(defaultEditorContextValue);\nEditorContext.displayName = \"EditorContext\";\n\ntype TableState = {\n selectedTableItem: TableItemType<TableName> | null;\n selectedTableName: TableName | null;\n operation: Operation;\n};\n\ntype TableAction =\n | {\n type: \"VIEW_ITEM\";\n item: TableItemType<TableName>;\n tableName: TableName;\n }\n | { type: \"CREATE_ITEM\"; tableName: TableName }\n | {\n type: \"EDIT_ITEM\";\n item: TableItemType<TableName>;\n tableName: TableName;\n }\n | { type: \"CLEAR_SELECTED\" };\n\nfunction tableReducer(state: TableState, action: TableAction): TableState {\n switch (action.type) {\n case \"VIEW_ITEM\":\n return {\n selectedTableItem: action.item,\n selectedTableName: action.tableName,\n operation: \"view\",\n };\n case \"CREATE_ITEM\":\n return {\n selectedTableItem: null,\n selectedTableName: action.tableName,\n operation: \"create\",\n };\n case \"EDIT_ITEM\":\n return {\n selectedTableItem: action.item,\n selectedTableName: action.tableName,\n operation: \"edit\",\n };\n case \"CLEAR_SELECTED\":\n return {\n selectedTableItem: null,\n selectedTableName: null,\n operation: null,\n };\n default:\n return state;\n }\n}\n\nexport function RWAEditorContextProvider(\n props: RWAEditorContextProps & {\n readonly children: ReactNode;\n readonly state: RealWorldAssetsState;\n readonly editorDispatcher: EditorDispatcher;\n readonly undo: () => void;\n readonly redo: () => void;\n },\n) {\n const {\n children,\n state,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n canUndo,\n canRedo,\n undo,\n redo,\n editorDispatcher,\n onExport,\n onClose,\n onSwitchboardLinkClick,\n onShowRevisionHistory,\n } = props;\n const [editorState, setEditorState] = useState(state);\n const stateRef = useRef(state);\n const [tableState, tableDispatch] = useReducer(tableReducer, {\n selectedTableItem: null,\n selectedTableName: null,\n operation: null,\n });\n\n const { selectedTableItem, selectedTableName, operation } = tableState;\n\n useEffect(() => {\n if (operation === null || operation === \"view\") {\n setEditorState(stateRef.current);\n }\n }, [operation, state]);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n const {\n accounts,\n fixedIncomeTypes,\n portfolio,\n principalLenderAccountId,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n } = editorState;\n\n const cashAsset = useMemo(() => getCashAsset(portfolio), [portfolio]);\n\n const fixedIncomes = useMemo(\n () => getFixedIncomeAssets(portfolio),\n [portfolio],\n );\n\n const handleUndo = useCallback(() => {\n if (!canUndo) return;\n undo();\n }, [canUndo, undo]);\n\n const handleRedo = useCallback(() => {\n if (!canRedo) return;\n redo();\n }, [canRedo, redo]);\n\n const getIsFormOpen = useCallback(\n (tableName: TableName) => selectedTableName === tableName,\n [selectedTableName],\n );\n\n const viewItem = useCallback(\n (item: TableItemType<TableName>, tableName: TableName) => {\n tableDispatch({ type: \"VIEW_ITEM\", item, tableName });\n },\n [],\n );\n\n const createItem = useCallback((tableName: TableName) => {\n tableDispatch({ type: \"CREATE_ITEM\", tableName });\n }, []);\n\n const editItem = useCallback(\n (item: TableItemType<TableName>, tableName: TableName) => {\n tableDispatch({ type: \"EDIT_ITEM\", item, tableName });\n },\n [],\n );\n\n const clearSelected = useCallback(() => {\n tableDispatch({ type: \"CLEAR_SELECTED\" });\n setEditorState(stateRef.current);\n }, []);\n\n const handleAction = useCallback(\n (action: EditorAction) => {\n try {\n const result = editorDispatcher(action);\n const actionOperationType = getActionOperationType(action);\n\n if (actionOperationType === \"DELETE\" || !result) {\n clearSelected();\n return;\n }\n const tableName = getTableNameFor(action);\n const stateKey = getStateKeyForTableName(tableName);\n const currentStateForKey = stateRef.current[stateKey];\n if (typeof currentStateForKey === \"string\") return;\n\n if (actionOperationType === \"CREATE\") {\n const newStateForKey = [...currentStateForKey, result];\n const newState = {\n ...stateRef.current,\n [stateKey]: newStateForKey,\n };\n stateRef.current = newState;\n setEditorState(newState);\n\n if (tableName === selectedTableName) {\n const newTableData = makeTableData(tableName, newState);\n const newTableItem = newTableData.find(\n (item) => item.id === result.id,\n );\n\n if (newTableItem) {\n viewItem(newTableItem, tableName);\n }\n }\n }\n\n if (actionOperationType === \"EDIT\") {\n const newStateForKey = currentStateForKey.map((item) =>\n item.id === result.id ? result : item,\n );\n const newState = {\n ...stateRef.current,\n [stateKey]: newStateForKey,\n };\n stateRef.current = newState;\n setEditorState(newState);\n const newTableData = makeTableData(tableName, newState);\n const newTableItem = newTableData.find(\n (item) => item.id === result.id,\n );\n if (newTableItem) {\n editItem(newTableItem, tableName);\n }\n }\n } catch (error) {\n console.error(`Failed to dispatch action ${action.type}`, error);\n }\n },\n [clearSelected, editorDispatcher, editItem, selectedTableName, viewItem],\n );\n\n const value = useMemo(\n () => ({\n accounts,\n fixedIncomeTypes,\n portfolio,\n principalLenderAccountId,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n cashAsset,\n fixedIncomes,\n canUndo,\n canRedo,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n selectedTableItem,\n selectedTableName,\n operation,\n handleAction,\n handleUndo,\n handleRedo,\n viewItem,\n createItem,\n editItem,\n clearSelected,\n getIsFormOpen,\n onExport,\n onClose,\n onSwitchboardLinkClick,\n onShowRevisionHistory,\n }),\n [\n accounts,\n canRedo,\n canUndo,\n cashAsset,\n clearSelected,\n createItem,\n editItem,\n fixedIncomeTypes,\n fixedIncomes,\n getIsFormOpen,\n handleAction,\n handleRedo,\n handleUndo,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n onClose,\n onExport,\n onShowRevisionHistory,\n onSwitchboardLinkClick,\n operation,\n portfolio,\n principalLenderAccountId,\n selectedTableItem,\n selectedTableName,\n serviceProviderFeeTypes,\n spvs,\n transactions,\n viewItem,\n ],\n );\n return (\n <EditorContext.Provider value={value}>{children}</EditorContext.Provider>\n );\n}\n\nexport function useEditorContext() {\n return useContext(EditorContext);\n}\n","import { Icon } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableItemType, TableName } from \"../types.js\";\n\nexport const RWATableCell: React.FC<ComponentPropsWithoutRef<\"td\">> = (\n props,\n) => (\n <td\n {...props}\n className={twMerge(\n \"truncate border-l border-gray-300 px-3 py-2 text-xs font-medium text-gray-900 first:border-l-0\",\n props.className,\n )}\n />\n);\n\nexport function ItemNumberCell(props: { readonly itemNumber: number }) {\n return <RWATableCell className=\"w-4\">{props.itemNumber}</RWATableCell>;\n}\n\nexport function MoreDetailsCell(props: {\n readonly isSelected: boolean;\n readonly tableName: TableName;\n readonly tableItem: TableItemType<TableName>;\n}) {\n const { isSelected, tableName, tableItem } = props;\n const { viewItem, clearSelected } = useEditorContext();\n\n const onClick = useCallback(() => {\n if (isSelected) {\n clearSelected();\n return;\n }\n viewItem(tableItem, tableName);\n }, [clearSelected, isSelected, tableItem, tableName, viewItem]);\n\n return (\n <RWATableCell className=\"w-4\">\n <button\n className=\"flex size-full items-center justify-center\"\n onClick={onClick}\n >\n <Icon\n className={twMerge(\"text-gray-600\", isSelected && \"rotate-180\")}\n name=\"CaretDown\"\n size={16}\n />\n </button>\n </RWATableCell>\n );\n}\n","import type { ComponentPropsWithRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type RWATableRowProps = ComponentPropsWithRef<\"tr\">;\n\nexport const RWATableRow = forwardRef(function RWATableRow(\n props: RWATableRowProps,\n ref: React.Ref<HTMLTableRowElement>,\n) {\n const { children, className, ...delegated } = props;\n\n return (\n <tr\n {...delegated}\n className={twMerge(\"odd:bg-white even:bg-gray-50\", className)}\n ref={ref}\n >\n {children}\n </tr>\n );\n});\n","import type { Identifier, Order } from \"natural-orderby\";\nimport { orderBy } from \"natural-orderby\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { Item, TableItem } from \"../types.js\";\n\n/**\n * Takes a list of items and returns a sorted list of items and a sort descriptor.\n * @param items - The list of items to sort.\n * @returns An object containing the sorted items and a sort handler func\n */\nexport function useSortTableItems<\n TItem extends Item,\n TTableData extends TableItem<TItem>,\n>(items: TTableData[] | undefined) {\n const [sortedItems, setSortedItems] = useState(items);\n const [column, setColumn] = useState<Identifier<TTableData>>();\n const [direction, setDirection] = useState<Order>(\"asc\");\n\n const sortHandler = useCallback(\n (column: Identifier<TTableData>, direction: Order) => {\n setColumn(column);\n setDirection(direction);\n },\n [],\n );\n\n useEffect(() => {\n if (!items) return;\n\n if (!column) {\n setSortedItems(items);\n return;\n }\n setSortedItems(orderBy(items, [column], [direction]));\n }, [column, direction, items, sortHandler]);\n\n return useMemo(\n () => ({ sortedItems, sortHandler }) as const,\n [sortedItems, sortHandler],\n );\n}\n","import { useMemo } from \"react\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableItemType, TableName } from \"../types.js\";\nimport { makeTableData } from \"../utils/table.js\";\nimport { useSortTableItems } from \"./useSortTableItems.js\";\n\nexport function useTableData<TTableName extends TableName>(\n tableName: TTableName,\n) {\n const inputs = useEditorContext();\n\n // type inference is going wrong because some of the table data types have a \"type\" field.\n // even though this \"type\" field is not relevant to the table data type, typescript insists on including it in its type narrowing logic.\n const tableData = useMemo(() => {\n return makeTableData(tableName, inputs);\n }, [inputs, tableName]) as unknown as TableItemType<TTableName>[];\n\n const { sortedItems, sortHandler } = useSortTableItems(tableData);\n\n return useMemo(\n () =>\n ({\n tableData: sortedItems ?? [],\n sortHandler,\n }) as const,\n [sortedItems, sortHandler],\n );\n}\n","import { useMemo } from \"react\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n FixedIncome,\n GroupTransaction,\n ServiceProviderFeeType,\n TableName,\n} from \"../types.js\";\n\nexport type DependentItemProps = {\n dependentTableName: TableName;\n dependentItems: { id: string; label: string }[];\n}[];\nexport function useDependentItemProps(\n tableName: TableName,\n itemId: string | null | undefined,\n) {\n const { fixedIncomes, serviceProviderFeeTypes, transactions } =\n useEditorContext();\n\n const dependentItemProps: DependentItemProps = useMemo(() => {\n if (!itemId) return [];\n\n switch (tableName) {\n case \"TRANSACTION\":\n return [];\n case \"SPV\":\n return [\n {\n dependentTableName: \"ASSET\",\n dependentItems: makeDependentAssetsList(\n tableName,\n itemId,\n fixedIncomes,\n ),\n },\n ];\n case \"FIXED_INCOME_TYPE\":\n return [\n {\n dependentTableName: \"ASSET\",\n dependentItems: makeDependentAssetsList(\n tableName,\n itemId,\n fixedIncomes,\n ),\n },\n ];\n case \"ASSET\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n ];\n case \"SERVICE_PROVIDER_FEE_TYPE\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n ];\n case \"ACCOUNT\":\n return [\n {\n dependentTableName: \"TRANSACTION\",\n dependentItems: makeDependentTransactionsList(\n tableName,\n itemId,\n transactions,\n ),\n },\n {\n dependentTableName: \"SERVICE_PROVIDER_FEE_TYPE\",\n dependentItems: makeDependentServiceProviderFeeTypesList(\n itemId,\n serviceProviderFeeTypes,\n ),\n },\n ];\n }\n }, [fixedIncomes, itemId, serviceProviderFeeTypes, tableName, transactions]);\n\n return dependentItemProps;\n}\n\nexport function makeDependentServiceProviderFeeTypesList(\n itemId: string,\n serviceProviderFeeTypes: ServiceProviderFeeType[],\n) {\n const makeLabel = (asset: ServiceProviderFeeType) => ({\n id: asset.id,\n label: asset.name,\n });\n return serviceProviderFeeTypes\n .filter((f) => f.accountId === itemId)\n .map(makeLabel);\n}\n\nexport function makeDependentAssetsList(\n tableName: \"FIXED_INCOME_TYPE\" | \"SPV\",\n itemId: string,\n assets: FixedIncome[],\n) {\n const makeLabel = (asset: FixedIncome) => ({\n id: asset.id,\n label: asset.name,\n });\n switch (tableName) {\n case \"FIXED_INCOME_TYPE\":\n return assets\n .filter((asset) => asset.fixedIncomeTypeId === itemId)\n .map(makeLabel);\n case \"SPV\":\n return assets.filter((asset) => asset.spvId === itemId).map(makeLabel);\n }\n}\n\nexport function makeDependentTransactionsList(\n tableName: \"ASSET\" | \"ACCOUNT\" | \"SERVICE_PROVIDER_FEE_TYPE\",\n itemId: string,\n transactions: GroupTransaction[],\n) {\n const makeLabel = (t: GroupTransaction, index: number) => ({\n id: t.id,\n label: `Transaction #${index + 1}`,\n });\n\n switch (tableName) {\n case \"ASSET\":\n return transactions\n .filter((t) => t.fixedIncomeTransaction?.assetId === itemId)\n .map(makeLabel);\n case \"ACCOUNT\":\n return transactions\n .filter(\n (t) =>\n t.cashTransaction.accountId === itemId ||\n t.fixedIncomeTransaction?.accountId === itemId,\n )\n .map(makeLabel);\n case \"SERVICE_PROVIDER_FEE_TYPE\":\n return transactions\n .filter((t) =>\n t.fees?.some((f) => f.serviceProviderFeeTypeId === itemId),\n )\n .map(makeLabel);\n }\n}\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { calculateCashBalanceChange } from \"../utils/table.js\";\nimport { FormattedNumber } from \"./formatted-number.js\";\n\nexport function CashBalanceChange(props: {\n readonly control: Control<GroupTransactionFormInputs>;\n}) {\n const { control } = props;\n const cashAmount = useWatch({ control, name: \"cashAmount\" });\n const type = useWatch({ control, name: \"type\" });\n const fees = useWatch({ control, name: \"fees\" });\n\n const cashBalanceChange = calculateCashBalanceChange(type, cashAmount, fees);\n\n return (\n <div className=\"flex items-center justify-between border-t border-gray-300 bg-gray-100 p-3 font-semibold text-gray-800\">\n <div className=\"mr-6 text-sm text-gray-600\">Cash Balance Change $USD</div>\n <div className=\"h-px flex-1 border-b border-dashed border-gray-400\" />\n <div className=\"pl-8 text-sm text-gray-900\">\n <FormattedNumber value={cashBalanceChange} />\n </div>\n </div>\n );\n}\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { formatDateForDisplay } from \"../utils/date.js\";\n\nexport function EntryTimeLabel({\n control,\n}: {\n control: Control<GroupTransactionFormInputs>;\n}) {\n const value = useWatch({ control, name: \"entryTime\" });\n return value ? formatDateForDisplay(new Date(value), true, true) : null;\n}\n","import type { ComponentPropsWithRef, ForwardedRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ntype Props = Omit<ComponentPropsWithRef<\"input\">, \"type\"> & {\n readonly defaultValue?: string | number | null | undefined;\n readonly errorMessage?: string;\n readonly labelClassName?: string;\n readonly inputClassName?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport const RWATableTextInput = forwardRef(function RWATableTextInput(\n props: Props,\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const invalid = props[\"aria-invalid\"] === \"true\";\n const {\n errorMessage,\n labelClassName,\n inputClassName,\n errorMessageClassName,\n ...inputProps\n } = props;\n\n return (\n <label className={labelClassName}>\n <input\n {...inputProps}\n className={twMerge(\n \"h-8 w-full rounded-md border border-transparent bg-gray-100 p-3 text-right placeholder:text-gray-500 disabled:bg-transparent disabled:p-0 disabled:text-left\",\n invalid && \"border-red-900 outline-red-900 placeholder:text-red-800\",\n inputClassName,\n )}\n ref={ref}\n type=\"text\"\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\"text-sm text-red-900\", errorMessageClassName)}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </label>\n );\n});\n","import type { ComponentPropsWithRef } from \"react\";\nimport type {\n Control,\n ControllerProps,\n FieldValues,\n Path,\n} from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport { NumericFormat } from \"react-number-format\";\nimport { twMerge } from \"tailwind-merge\";\nimport { RWATableTextInput } from \"./text-input.js\";\n\ntype Props<ControlInputs extends FieldValues> = ComponentPropsWithRef<\n typeof RWATableTextInput\n> & {\n readonly name: Path<ControlInputs>;\n readonly control: Control<ControlInputs>;\n readonly disabled?: boolean;\n readonly currency?: \"USD\";\n readonly numericFormatProps?: ComponentPropsWithRef<typeof NumericFormat>;\n readonly rules?: ControllerProps<ControlInputs>[\"rules\"];\n readonly errorMessage?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport function RWANumberInput<ControlInputs extends FieldValues>(\n props: Props<ControlInputs>,\n) {\n const {\n name,\n control,\n currency,\n rules,\n errorMessage,\n errorMessageClassName,\n numericFormatProps,\n value: _,\n onChange: __,\n ...inputProps\n } = props;\n\n const {\n allowNegative = false,\n decimalScale = 2,\n thousandSeparator = \",\",\n fixedDecimalScale = true,\n } = numericFormatProps ?? {};\n\n const prefix = currency === \"USD\" ? \"$\" : undefined;\n\n const invalid = props[\"aria-invalid\"] === \"true\";\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value, ref } }) => (\n <>\n <NumericFormat\n {...inputProps}\n allowNegative={allowNegative}\n customInput={RWATableTextInput}\n decimalScale={decimalScale}\n fixedDecimalScale={fixedDecimalScale}\n getInputRef={ref}\n onValueChange={({ floatValue }) => onChange(floatValue)}\n prefix={prefix}\n thousandSeparator={thousandSeparator}\n value={value}\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\"text-sm text-red-900\", errorMessageClassName)}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </>\n )}\n rules={rules}\n />\n );\n}\n","import { Combobox } from \"#design-system/connect\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport type {\n Control,\n ControllerProps,\n FieldValues,\n Path,\n} from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type RWATableSelectProps<ControlInputs extends FieldValues> = Omit<\n ComponentPropsWithoutRef<typeof Combobox>,\n \"options\" | \"required\"\n> & {\n readonly options: { label: string; value: string }[];\n readonly disabled?: boolean;\n readonly name: Path<ControlInputs>;\n readonly control: Control<ControlInputs>;\n readonly rules?: ControllerProps<ControlInputs>[\"rules\"];\n readonly errorMessage?: string;\n readonly errorMessageClassName?: string;\n};\n\nexport function RWATableSelect<ControlInputs extends FieldValues>(\n props: RWATableSelectProps<ControlInputs>,\n) {\n const {\n options,\n name,\n control,\n rules,\n errorMessage,\n errorMessageClassName,\n disabled = false,\n ...restProps\n } = props;\n\n const invalid = props[\"aria-invalid\"] === \"true\";\n\n return (\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, onBlur, value } }) =>\n disabled ? (\n <>{options.find((option) => option.value === value)?.label}</>\n ) : (\n <>\n <Combobox\n isDisabled={disabled}\n onBlur={onBlur}\n onChange={(option) =>\n !!option &&\n typeof option === \"object\" &&\n \"value\" in option &&\n onChange(option.value)\n }\n options={options}\n value={options.find((option) => option.value === value) ?? null}\n {...restProps}\n />\n {invalid && !!errorMessage ? (\n <p\n className={twMerge(\n \"text-sm text-red-900\",\n errorMessageClassName,\n )}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n ) : null}\n </>\n )\n }\n rules={rules}\n />\n );\n}\n","import { Icon } from \"#design-system\";\nimport type { Control, FieldErrors, Path } from \"react-hook-form\";\nimport { useFieldArray } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\nimport type {\n GroupTransactionFormInputs,\n ServiceProviderFeeType,\n} from \"../types.js\";\nimport { RWANumberInput } from \"./number-input.js\";\nimport { RWATableSelect } from \"./select.js\";\n\ntype Props = {\n readonly canHaveTransactionFees: boolean;\n readonly serviceProviderFeeTypes: ServiceProviderFeeType[];\n readonly serviceProviderFeeTypeOptions: { label: string; value: string }[];\n readonly showCreateServiceProviderFeeTypeModal: () => void;\n readonly control: Control<GroupTransactionFormInputs>;\n readonly errors: FieldErrors<GroupTransactionFormInputs>;\n readonly isViewOnly: boolean;\n};\n\nexport function FeeTransactionsTable(props: Props) {\n const headings = [\"Fees\", \"Service Provider\", \"Amount\", \"\"] as const;\n const {\n canHaveTransactionFees,\n serviceProviderFeeTypes,\n serviceProviderFeeTypeOptions,\n control,\n errors,\n isViewOnly,\n showCreateServiceProviderFeeTypeModal,\n } = props;\n\n const { fields, append, remove } = useFieldArray({\n control,\n name: \"fees\",\n });\n\n if (!canHaveTransactionFees) {\n return null;\n }\n\n return (\n <>\n {fields.length > 0 && (\n <div className=\"bg-gray-50 pl-5 pt-3\">\n <table className=\"w-full border-separate text-xs font-medium\">\n <thead className=\"mb-2\">\n <tr>\n {headings.map((heading) => (\n <th\n className={twMerge(\n \"py-2 text-left font-medium text-gray-600\",\n heading === \"Amount\" && !isViewOnly && \"text-right\",\n )}\n key={heading}\n >\n {heading}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {fields.map((feeInput, index) => {\n return (\n <tr key={feeInput.id}>\n <td className=\"w-52\" />\n <td className=\"w-96\">\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateServiceProviderFeeTypeModal,\n label: \"Add Service Provider\",\n }}\n aria-invalid={\n errors.fees?.[index]?.serviceProviderFeeTypeId\n ? \"true\"\n : \"false\"\n }\n control={control}\n disabled={isViewOnly}\n name={`fees.${index}.serviceProviderFeeTypeId`}\n options={serviceProviderFeeTypeOptions}\n rules={{\n required: \"Service provider is required\",\n }}\n />\n </td>\n <td className=\"w-52\">\n <RWANumberInput\n aria-invalid={\n errors.fees?.[index]?.amount ? \"true\" : \"false\"\n }\n control={control}\n currency=\"USD\"\n disabled={isViewOnly}\n name={\n `fees.${index}.amount` as Path<GroupTransactionFormInputs>\n }\n placeholder=\"E.g. $1,000.00\"\n rules={{\n required: \"Amount is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Fee amount must be greater than zero\",\n },\n }}\n />\n </td>\n <td className=\"\">\n {!isViewOnly && (\n <button\n className=\"flex items-center\"\n onClick={() => remove(index)}\n type=\"button\"\n >\n <Icon className=\"text-gray-900\" name=\"Xmark\" />\n </button>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n {!isViewOnly && (\n <button\n className=\"ml-[234px] mt-1 flex w-fit items-center justify-center gap-x-2 rounded-lg bg-white pb-6 text-sm font-semibold text-gray-900\"\n onClick={() =>\n append({\n amount: null,\n serviceProviderFeeTypeId: serviceProviderFeeTypes[0]?.id,\n })\n }\n >\n <span>Add Fee</span>\n <Icon name=\"Plus\" size={16} />\n </button>\n )}\n </>\n );\n}\n","export function getIsTransaction(hash: string | null | undefined) {\n if (!isHexString(hash)) return false;\n return hash.length === 66;\n}\n\nexport function isHexString(\n value: string | null | undefined,\n): value is `0x${string}` {\n return typeof value === \"string\" && value.startsWith(\"0x\");\n}\n","import type { ComponentPropsWithRef, ForwardedRef } from \"react\";\nimport { forwardRef } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { ConnectTooltip, ConnectTooltipProvider } from \"#design-system/connect\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { RWATableTextInput } from \"./text-input.js\";\nimport { getIsTransaction } from \"../../services/viem.js\";\n\nexport const TransactionReference = forwardRef(function TransactionReference(\n props: ComponentPropsWithRef<typeof RWATableTextInput> & {\n readonly control: Control<GroupTransactionFormInputs>;\n },\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const { control, disabled } = props;\n const value = useWatch({ control, name: \"txRef\" });\n const maxLength = 46;\n const shouldShortenValue =\n typeof value === \"string\" && value.length >= maxLength;\n const maybeShortenedValue = shouldShortenValue\n ? `${value.slice(0, maxLength)}...`\n : value;\n const isTransaction = getIsTransaction(value);\n\n const tooltipContent = (\n <div>\n <p>{value}</p>\n {isTransaction ? (\n <p className=\"mt-2 text-center\">\n <a\n className=\"text-blue-900 underline\"\n href={`https://etherscan.io/tx/${value}`}\n >\n View on Etherscan\n </a>\n </p>\n ) : null}\n </div>\n );\n\n if (disabled)\n return (\n <ConnectTooltipProvider>\n <ConnectTooltip content={tooltipContent}>\n <span>{maybeShortenedValue}</span>\n </ConnectTooltip>\n </ConnectTooltipProvider>\n );\n\n return <RWATableTextInput {...props} ref={ref} />;\n});\n","import type { Control } from \"react-hook-form\";\nimport { useWatch } from \"react-hook-form\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { GroupTransactionFormInputs } from \"../types.js\";\nimport { calculateUnitPrice } from \"../utils/table.js\";\nimport { FormattedNumber } from \"./formatted-number.js\";\n\nexport function UnitPrice(props: {\n readonly control: Control<GroupTransactionFormInputs>;\n readonly isViewOnly: boolean;\n}) {\n const { control } = props;\n\n const cashAmount = useWatch({ control, name: \"cashAmount\" });\n const fixedIncomeAmount = useWatch({ control, name: \"fixedIncomeAmount\" });\n\n const unitPrice = calculateUnitPrice(cashAmount, fixedIncomeAmount);\n\n return (\n <div className={twMerge(\"mt-1 w-fit\", !props.isViewOnly && \"ml-auto\")}>\n <span className=\"text-gray-600\">Unit Price</span>{\" \"}\n <span className=\"text-gray-900\">\n <FormattedNumber decimalScale={6} value={unitPrice} />\n </span>\n </div>\n );\n}\n","import { createContext } from \"react\";\nimport type { ModalContextValue } from \"./types.js\";\n\nexport const ModalContext = createContext<ModalContextValue>({\n showModal: () => {},\n closeModal: () => {},\n});\n","import { useContext } from \"react\";\nimport { ModalContext } from \"./modal-context.js\";\n\nexport const useModal = () => {\n const context = useContext(ModalContext);\n return context;\n};\n","import type { FixedIncome } from \"../types.js\";\n\nexport function makeFixedIncomeOptionLabel(fixedIncome: FixedIncome) {\n let label = fixedIncome.name;\n if (fixedIncome.ISIN) {\n label += ` - ${fixedIncome.ISIN}`;\n }\n if (fixedIncome.CUSIP) {\n label += ` - ${fixedIncome.CUSIP}`;\n }\n return label;\n}\n","import type { ReactElement, ReactNode } from \"react\";\nimport { useCallback, useMemo } from \"react\";\nimport type {\n Control,\n FormState,\n UseFormRegister,\n UseFormWatch,\n} from \"react-hook-form\";\nimport { CashBalanceChange } from \"../components/cash-balance-change.js\";\nimport { EntryTimeLabel } from \"../components/entry-time-label.js\";\nimport { FeeTransactionsTable } from \"../components/fee-transactions-table.js\";\nimport { RWANumberInput } from \"../components/number-input.js\";\nimport { RWATableSelect } from \"../components/select.js\";\nimport { RWATableTextInput } from \"../components/text-input.js\";\nimport { TransactionReference } from \"../components/transaction-reference.js\";\nimport { UnitPrice } from \"../components/unit-price.js\";\nimport { useModal } from \"../components/use-modal.js\";\nimport { tableNames } from \"../constants/names.js\";\nimport {\n allGroupTransactionTypes,\n assetGroupTransactions,\n feesTransactions,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n Account,\n FormInputsByTableName,\n Operation,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { formatDateForDisplay } from \"../utils/date.js\";\nimport { makeFixedIncomeOptionLabel } from \"../utils/form.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\n\ntype Input = {\n label: string;\n Input: () => string | React.JSX.Element;\n inputLabel?: ReactNode | null;\n};\n\ntype Props = {\n tableName: TableName;\n tableItem: TableItemType<TableName> | undefined | null;\n operation: Operation;\n formState: FormState<FormInputsByTableName[TableName]>;\n register: UseFormRegister<FormInputsByTableName[TableName]>;\n watch: UseFormWatch<FormInputsByTableName[TableName]>;\n control: Control<FormInputsByTableName[TableName]>;\n};\nexport function useFormInputs(props: Props): {\n inputs: Input[];\n additionalInputs?: ReactElement;\n} {\n const {\n tableName,\n operation,\n formState: _formState,\n tableItem: _tableItem,\n register: _register,\n watch: _watch,\n control: _control,\n } = props;\n const {\n fixedIncomeTypes,\n spvs,\n serviceProviderFeeTypes,\n accounts,\n fixedIncomes,\n } = useEditorContext();\n const { showModal } = useModal();\n const showCreateItemModal = useCallback(\n (tableName: TableName) => () => {\n showModal(\"createItem\", { tableName });\n },\n [showModal],\n );\n return useMemo(() => {\n switch (tableName) {\n case tableNames.ASSET: {\n const tableItem = _tableItem as TableItemType<\"ASSET\"> | null;\n type Payload = FormInputsByTableName[\"ASSET\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const control = _control as Control<Payload>;\n const derivedInputsToDisplay: {\n label: string;\n Input: () => React.JSX.Element;\n }[] =\n operation !== \"create\" && !!tableItem\n ? [\n {\n label: \"Notional\",\n Input: () => <>{handleTableDatum(tableItem.notional)}</>,\n },\n {\n label: \"Purchase Date\",\n Input: () => <>{handleTableDatum(tableItem.purchaseDate)}</>,\n },\n {\n label: \"Purchase Price\",\n Input: () => (\n <>{handleTableDatum(tableItem.purchasePrice, 6)}</>\n ),\n },\n {\n label: \"Purchase Proceeds\",\n Input: () => (\n <>{handleTableDatum(tableItem.purchaseProceeds)}</>\n ),\n },\n ]\n : [];\n\n const inputs = [\n {\n label: \"Asset Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Asset name is required\",\n })}\n aria-invalid={errors.name ? \"true\" : \"false\"}\n errorMessage={errors.name?.message}\n inputClassName=\"text-left\"\n placeholder=\"E.g. My Asset\"\n />\n ),\n },\n {\n label: \"CUSIP\",\n Input: () =>\n operation === \"view\" ? (\n (tableItem?.CUSIP ?? \"Not available\")\n ) : (\n <RWATableTextInput\n {...register(\"CUSIP\", {\n maxLength: {\n value: 9,\n message: \"CUSIP cannot be longer than 9 characters\",\n },\n minLength: {\n value: 9,\n message: \"CUSIP cannot be shorter than 9 characters\",\n },\n pattern: {\n value: /^[a-zA-Z0-9]*$/,\n message: \"CUSIP must be alphanumeric\",\n },\n })}\n aria-invalid={errors.CUSIP ? \"true\" : \"false\"}\n errorMessage={errors.CUSIP?.message}\n placeholder=\"E.g. A2345B789\"\n />\n ),\n },\n {\n label: \"ISIN\",\n Input: () =>\n operation === \"view\" ? (\n (tableItem?.ISIN ?? \"Not available\")\n ) : (\n <RWATableTextInput\n {...register(\"ISIN\", {\n maxLength: {\n value: 12,\n message: \"ISIN cannot be longer than 12 characters\",\n },\n minLength: {\n value: 12,\n message: \"ISIN cannot be shorter than 12 characters\",\n },\n pattern: {\n value: /^[a-zA-Z0-9]*$/,\n message: \"ISIN must be alphanumeric\",\n },\n })}\n aria-invalid={errors.ISIN ? \"true\" : \"false\"}\n errorMessage={errors.ISIN?.message}\n placeholder=\"E.g. 123456789ABC\"\n />\n ),\n },\n {\n label: \"Maturity\",\n Input: () => (\n <input\n className=\"h-8 w-full rounded-md bg-gray-100 px-3 disabled:bg-transparent disabled:p-0\"\n step={1}\n type=\"date\"\n {...register(\"maturity\", {\n disabled: operation === \"view\",\n })}\n />\n ),\n inputLabel: tableItem?.maturity\n ? formatDateForDisplay(tableItem.maturity, true)\n : null,\n },\n {\n label: \"Asset Type\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ASSET\"),\n label: \"Create Fixed Income Type\",\n }}\n aria-invalid={errors.fixedIncomeTypeId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.fixedIncomeTypeId?.message}\n name=\"fixedIncomeTypeId\"\n options={fixedIncomeTypes.map((t) => ({\n ...t,\n value: t.id,\n label: t.name,\n }))}\n rules={{ required: \"Asset type is required\" }}\n />\n ),\n },\n {\n label: \"SPV\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"SPV\"),\n label: \"Create SPV\",\n }}\n aria-invalid={errors.spvId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.spvId?.message}\n name=\"spvId\"\n options={spvs.map((t) => ({\n ...t,\n value: t.id,\n label: t.name,\n }))}\n rules={{ required: \"SPV is required\" }}\n />\n ),\n },\n ...derivedInputsToDisplay,\n ];\n\n return { inputs };\n }\n case tableNames.TRANSACTION: {\n type Payload = FormInputsByTableName[\"TRANSACTION\"];\n const register = _register as UseFormRegister<Payload>;\n const watch = _watch as UseFormWatch<Payload>;\n const { errors } = _formState as FormState<Payload>;\n const control = _control as Control<Payload>;\n const type = watch(\"type\");\n const isFeesTransaction =\n !!type &&\n feesTransactions.includes(type as (typeof feesTransactions)[number]);\n const isAssetTransaction =\n !!type &&\n assetGroupTransactions.includes(\n type as (typeof assetGroupTransactions)[number],\n );\n const canHaveTransactionFees = !isFeesTransaction;\n const transactionTypeOptions = allGroupTransactionTypes.map((type) => ({\n label: groupTransactionTypeLabels[type],\n value: type,\n }));\n const fixedIncomeOptions = fixedIncomes.map((fixedIncome) => ({\n label: makeFixedIncomeOptionLabel(fixedIncome),\n value: fixedIncome.id,\n }));\n const serviceProviderFeeTypeOptions = serviceProviderFeeTypes.map(\n (spft) => ({\n label: `${spft.name} — ${spft.feeType} — ${accounts.find((account) => account.id === spft.accountId)?.reference}`,\n value: spft.id,\n }),\n );\n\n const inputs = [\n {\n label: \"Transaction Type\",\n Input: () => (\n <RWATableSelect\n aria-invalid={errors.type ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.type?.message}\n name=\"type\"\n options={transactionTypeOptions}\n rules={{\n required: \"Transaction type is required\",\n }}\n />\n ),\n },\n {\n label: \"Entry Time\",\n Input: () => (\n <input\n className=\"h-8 w-full rounded-md bg-gray-100 px-3 disabled:bg-transparent disabled:p-0\"\n step={1}\n type=\"datetime-local\"\n {...register(\"entryTime\", {\n disabled: operation === \"view\",\n required: \"Entry time is required\",\n })}\n />\n ),\n inputLabel: <EntryTimeLabel control={control} />,\n },\n isFeesTransaction\n ? {\n label: \"Service Provider\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"SERVICE_PROVIDER_FEE_TYPE\"),\n label: \"Add Service Provider\",\n }}\n control={control}\n disabled={operation === \"view\"}\n name=\"serviceProviderFeeTypeId\"\n options={serviceProviderFeeTypeOptions}\n />\n ),\n }\n : null,\n isAssetTransaction\n ? {\n label: \"Asset name\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ASSET\"),\n label: \"Create Asset\",\n }}\n aria-invalid={errors.type ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.type?.message}\n name=\"fixedIncomeId\"\n options={fixedIncomeOptions}\n rules={{\n required: \"Asset name is required\",\n }}\n />\n ),\n }\n : undefined,\n isAssetTransaction\n ? {\n label: \"Quantity\",\n Input: () => (\n <RWANumberInput\n aria-invalid={errors.fixedIncomeAmount ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.fixedIncomeAmount?.message}\n name=\"fixedIncomeAmount\"\n placeholder=\"E.g. 1,000.00\"\n rules={{\n required: \"Quantity is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Asset proceeds must be greater than zero\",\n },\n }}\n />\n ),\n }\n : undefined,\n {\n label: isAssetTransaction ? \"Asset Proceeds\" : \"Cash Amount\",\n Input: () => (\n <>\n <RWANumberInput\n aria-invalid={errors.cashAmount ? \"true\" : \"false\"}\n control={control}\n currency=\"USD\"\n disabled={operation === \"view\"}\n errorMessage={errors.cashAmount?.message}\n name=\"cashAmount\"\n placeholder=\"E.g. $1,000.00\"\n rules={{\n required: \"Asset proceeds is required\",\n validate: {\n positive: (value) =>\n (!!value && Number(value) > 0) ||\n \"Asset proceeds must be greater than zero\",\n },\n }}\n />\n {isAssetTransaction ? (\n <UnitPrice\n control={control}\n isViewOnly={operation === \"view\"}\n />\n ) : null}\n </>\n ),\n },\n {\n label: \"Transaction reference\",\n Input: () => (\n <TransactionReference\n {...register(\"txRef\", {\n disabled: operation === \"view\",\n })}\n aria-invalid={errors.txRef ? \"true\" : \"false\"}\n control={control}\n errorMessage={errors.txRef?.message}\n placeholder=\"E.g. 0x123...\"\n />\n ),\n },\n ].filter(Boolean) as Input[];\n\n const additionalInputs = (\n <>\n <FeeTransactionsTable\n canHaveTransactionFees={canHaveTransactionFees}\n control={control}\n errors={errors}\n isViewOnly={operation === \"view\"}\n serviceProviderFeeTypeOptions={serviceProviderFeeTypeOptions}\n serviceProviderFeeTypes={serviceProviderFeeTypes}\n showCreateServiceProviderFeeTypeModal={showCreateItemModal(\n \"SERVICE_PROVIDER_FEE_TYPE\",\n )}\n />\n <CashBalanceChange control={control} />\n </>\n );\n\n return { inputs, additionalInputs };\n }\n case tableNames.ACCOUNT: {\n type Payload = FormInputsByTableName[\"ACCOUNT\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n const inputs = [\n {\n label: \"Account Label\",\n Input: () => (\n <RWATableTextInput\n {...register(\"label\", {\n disabled: operation === \"view\",\n required: \"Account label is required\",\n })}\n aria-invalid={\n errors.label?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.label?.message}\n placeholder=\"E.g. My Label\"\n />\n ),\n },\n {\n label: \"Account Reference\",\n Input: () => (\n <RWATableTextInput\n {...register(\"reference\", {\n disabled: operation === \"view\",\n required: \"Account reference is required\",\n })}\n aria-invalid={\n errors.reference?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.reference?.message}\n placeholder=\"E.g. bank account number or ETH address\"\n />\n ),\n },\n ];\n return { inputs };\n }\n case tableNames.SPV: {\n type Payload = FormInputsByTableName[\"SPV\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const inputs = [\n {\n label: \"SPV name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"SPV name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My SPV name\"\n />\n ),\n },\n ];\n\n return { inputs };\n }\n case tableNames.FIXED_INCOME_TYPE: {\n type Payload = FormInputsByTableName[\"FIXED_INCOME_TYPE\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n\n const inputs = [\n {\n label: \"Fixed Income Type Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Fixed Income Type name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Fixed Income Type name\"\n />\n ),\n },\n ];\n\n return { inputs };\n }\n case tableNames.SERVICE_PROVIDER_FEE_TYPE: {\n type Payload = FormInputsByTableName[\"SERVICE_PROVIDER_FEE_TYPE\"];\n const register = _register as UseFormRegister<Payload>;\n const formState = _formState as FormState<Payload>;\n const { errors } = formState;\n const control = _control as Control<Payload>;\n\n const makeAccountLabel = (account: Account) => {\n return `${account.label} (${account.reference})`;\n };\n\n const makeAccountOptions = (accounts: Account[]) => {\n return accounts.map((account) => ({\n ...account,\n value: account.id,\n label: makeAccountLabel(account),\n }));\n };\n\n const inputs = [\n {\n label: \"Service Provider Name\",\n Input: () => (\n <RWATableTextInput\n {...register(\"name\", {\n disabled: operation === \"view\",\n required: \"Service provider name is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Service Provider\"\n />\n ),\n },\n {\n label: \"Fee Type\",\n Input: () => (\n <RWATableTextInput\n {...register(\"feeType\", {\n disabled: operation === \"view\",\n required: \"Fee type is required\",\n })}\n aria-invalid={\n errors.name?.type === \"required\" ? \"true\" : \"false\"\n }\n errorMessage={errors.name?.message}\n placeholder=\"E.g. My Fee Type\"\n />\n ),\n },\n {\n label: \"Account\",\n Input: () => (\n <RWATableSelect\n addItemButtonProps={{\n onClick: showCreateItemModal(\"ACCOUNT\"),\n label: \"Create Account\",\n }}\n aria-invalid={errors.accountId ? \"true\" : \"false\"}\n control={control}\n disabled={operation === \"view\"}\n errorMessage={errors.accountId?.message}\n name=\"accountId\"\n options={makeAccountOptions(accounts)}\n rules={{ required: \"Account is required\" }}\n />\n ),\n },\n ];\n\n return { inputs };\n }\n }\n }, [\n _formState,\n _control,\n _register,\n _tableItem,\n _watch,\n accounts,\n fixedIncomeTypes,\n fixedIncomes,\n operation,\n serviceProviderFeeTypes,\n showCreateItemModal,\n spvs,\n tableName,\n ]);\n}\n","import { useMemo } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport { allGroupTransactionTypes } from \"../constants/transactions.js\";\nimport type {\n Account,\n AccountFormInputs,\n AssetFormInputs,\n FixedIncomeType,\n FixedIncomeTypeFormInputs,\n GroupTransactionFormInputs,\n SPV,\n SPVFormInputs,\n ServiceProviderFeeTypeFormInputs,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { isoDateStringToDateInput } from \"../utils/date.js\";\n\nexport function useDefaultFormValues(args: {\n tableName: TableName;\n tableItem?: TableItemType<TableName> | null;\n fixedIncomeTypes: FixedIncomeType[];\n spvs: SPV[];\n accounts: Account[];\n}) {\n const { tableName, tableItem, fixedIncomeTypes, spvs, accounts } = args;\n\n return useMemo(() => {\n if (!tableItem) {\n switch (tableName) {\n case tableNames.ASSET:\n return {\n fixedIncomeTypeId: fixedIncomeTypes[0]?.id ?? null,\n spvId: spvs[0]?.id ?? null,\n name: null,\n maturity: null,\n ISIN: null,\n CUSIP: null,\n coupon: null,\n } as AssetFormInputs;\n case tableNames.TRANSACTION:\n return {\n type: allGroupTransactionTypes[0],\n entryTime: isoDateStringToDateInput(new Date().toISOString(), true),\n cashAmount: null,\n fixedIncomeId: null,\n fixedIncomeAmount: null,\n serviceProviderFeeTypeId: null,\n fees: null,\n txRef: null,\n } as GroupTransactionFormInputs;\n case tableNames.SPV:\n return {\n name: null,\n } as SPVFormInputs;\n case tableNames.SERVICE_PROVIDER_FEE_TYPE:\n return {\n name: null,\n feeType: null,\n accountId: accounts[0]?.id ?? null,\n } as ServiceProviderFeeTypeFormInputs;\n case tableNames.FIXED_INCOME_TYPE:\n return {\n name: null,\n } as FixedIncomeTypeFormInputs;\n case tableNames.ACCOUNT:\n return {\n label: null,\n reference: null,\n } as AccountFormInputs;\n }\n }\n\n switch (tableName) {\n case tableNames.ASSET: {\n const item = tableItem as TableItemType<typeof tableNames.ASSET>;\n return {\n id: item.id,\n fixedIncomeTypeId: item.fixedIncomeTypeId,\n spvId: item.spvId,\n name: item.name,\n maturity: item.maturity\n ? isoDateStringToDateInput(item.maturity)\n : null,\n ISIN: item.ISIN,\n CUSIP: item.CUSIP,\n coupon: item.coupon,\n } as AssetFormInputs;\n }\n case tableNames.TRANSACTION: {\n const item = tableItem as TableItemType<typeof tableNames.TRANSACTION>;\n return {\n id: item.id,\n type: item.type,\n entryTime: item.entryTime\n ? isoDateStringToDateInput(item.entryTime, true)\n : null,\n cashAmount: item.cashTransaction.amount ?? null,\n fixedIncomeId: item.fixedIncomeTransaction?.assetId ?? null,\n fixedIncomeAmount: item.fixedIncomeTransaction?.amount ?? null,\n serviceProviderFeeTypeId: item.serviceProviderFeeTypeId ?? null,\n fees: item.fees ?? null,\n txRef: item.txRef ?? null,\n } as GroupTransactionFormInputs;\n }\n case tableNames.SPV: {\n const item = tableItem as TableItemType<typeof tableNames.SPV>;\n return {\n id: item.id,\n name: item.name,\n } as SPVFormInputs;\n }\n case tableNames.SERVICE_PROVIDER_FEE_TYPE: {\n const item = tableItem as TableItemType<\n typeof tableNames.SERVICE_PROVIDER_FEE_TYPE\n >;\n return {\n id: item.id,\n name: item.name,\n feeType: item.feeType,\n accountId: item.accountId,\n } as ServiceProviderFeeTypeFormInputs;\n }\n case tableNames.FIXED_INCOME_TYPE: {\n const item = tableItem as TableItemType<\n typeof tableNames.FIXED_INCOME_TYPE\n >;\n return {\n id: item.id,\n name: item.name,\n } as FixedIncomeTypeFormInputs;\n }\n case tableNames.ACCOUNT: {\n const item = tableItem as TableItemType<typeof tableNames.ACCOUNT>;\n return {\n id: item.id,\n label: item.label,\n reference: item.reference,\n } as AccountFormInputs;\n }\n }\n }, [accounts, fixedIncomeTypes, spvs, tableItem, tableName]);\n}\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport {\n useForm,\n type DefaultValues,\n type FieldValues,\n type SubmitHandler,\n} from \"react-hook-form\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type {\n FormInputsByTableName,\n Operation,\n TableItemType,\n TableName,\n} from \"../types.js\";\nimport { useDefaultFormValues } from \"./useDefaultFormValues.js\";\n\nfunction useWrappedForm<TValues extends FieldValues>(defaultValues: TValues) {\n const form = useForm<TValues>({\n defaultValues: defaultValues as DefaultValues<TValues>,\n });\n\n return form;\n}\ntype Props = {\n operation: Operation;\n tableName: TableName;\n tableItem?: TableItemType<TableName> | null;\n};\nexport function useSubmit(props: Props) {\n const { operation, tableName, tableItem } = props;\n const { handleAction, fixedIncomeTypes, spvs, accounts } = useEditorContext();\n const defaultValues = useDefaultFormValues({\n tableName,\n tableItem,\n fixedIncomeTypes,\n spvs,\n accounts,\n });\n const action = operation === \"create\" ? \"CREATE\" : \"EDIT\";\n\n const formValues = defaultValues as FormInputsByTableName[TableName];\n\n const { register, handleSubmit, reset, watch, control, formState } =\n useWrappedForm<FormInputsByTableName[TableName]>(formValues);\n\n useEffect(() => {\n reset(formValues);\n }, [formValues, reset]);\n\n const onSubmit: SubmitHandler<FormInputsByTableName[TableName]> = useCallback(\n (payload) => {\n const actionType = `${action}_${tableName}` as const;\n handleAction({\n type: actionType,\n payload,\n });\n },\n [action, handleAction, tableName],\n );\n\n const submit = handleSubmit(onSubmit);\n\n return useMemo(\n () => ({\n register,\n reset,\n watch,\n control,\n formState,\n submit,\n }),\n [control, formState, register, reset, submit, watch],\n );\n}\n","import { useMemo } from \"react\";\nimport type { FormHookProps } from \"../types.js\";\nimport { useFormInputs } from \"./useFormInputs.js\";\nimport { useSubmit } from \"./useSubmit.js\";\n\nexport function useTableForm(props: FormHookProps) {\n const { operation, tableName, tableItem } = props;\n\n const { submit, reset, register, control, formState, watch } = useSubmit({\n operation,\n tableName,\n tableItem,\n });\n\n const formInputs = useFormInputs({\n formState,\n operation,\n control,\n watch,\n tableItem,\n tableName,\n register,\n });\n\n return useMemo(() => {\n return {\n submit,\n reset,\n register,\n control,\n formInputs,\n formState,\n };\n }, [submit, reset, register, control, formInputs, formState]);\n}\n","import {\n mergeClassNameProps,\n PowerhouseButton,\n type PowerhouseButtonProps,\n} from \"#design-system\";\n\nexport const RWAButton: React.FC<PowerhouseButtonProps> = (props) => {\n return (\n <PowerhouseButton\n color=\"light\"\n size=\"small\"\n {...mergeClassNameProps(\n props,\n \"border border-solid border-gray-300 bg-white px-3 py-1 text-sm text-gray-900\",\n )}\n >\n {props.children}\n </PowerhouseButton>\n );\n};\n","import type { ComponentType, ReactNode } from \"react\";\nimport { twJoin } from \"tailwind-merge\";\n\ntype Input = {\n label: string;\n Input: ComponentType;\n inputLabel?: ReactNode;\n};\ntype Props = {\n readonly inputs: Input[];\n};\nexport function FormInputs(props: Props) {\n const { inputs } = props;\n return (\n <div className=\"rounded-md bg-white text-xs font-medium\">\n {inputs.map(({ label, Input, inputLabel }, index) => (\n <div\n className={twJoin(\n \"grid min-h-11 grid-cols-[208px,380px] items-center px-6 text-gray-600 last:rounded-b-md\",\n index % 2 !== 0 && \"bg-gray-50\",\n )}\n key={label}\n >\n <div>{label}</div>\n <div className=\"h-max py-2 text-gray-900\" key={index}>\n <Input />\n {inputLabel ? (\n <div className=\"text-left text-gray-500\">{inputLabel}</div>\n ) : null}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { memo, useCallback } from \"react\";\nimport { useDependentItemProps } from \"../constants/dependent-items.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableForm } from \"../hooks/useTableForm.js\";\nimport type { TableName } from \"../types.js\";\nimport { RWAButton } from \"./button.js\";\nimport { FormInputs } from \"./form-inputs.js\";\nimport { useModal } from \"./use-modal.js\";\n\ntype Props = {\n readonly tableName: TableName;\n};\nexport const ItemDetails = memo(function ItemDetails(props: Props) {\n const { tableName } = props;\n const { showModal, closeModal } = useModal();\n\n const {\n selectedTableItem,\n operation,\n viewItem,\n editItem,\n clearSelected,\n handleAction,\n isAllowedToCreateDocuments,\n isAllowedToEditDocuments,\n principalLenderAccountId,\n } = useEditorContext();\n\n const dependentItemProps = useDependentItemProps(\n tableName,\n selectedTableItem?.id,\n );\n const hasDependentItems = dependentItemProps.some(\n (p) => p.dependentItems.length > 0,\n );\n\n const isEditOperation = operation === \"edit\";\n const isCreateOperation = operation === \"create\";\n const isViewOperation = operation === \"view\";\n const isAllowedToCreateOrEdit =\n isAllowedToCreateDocuments || isAllowedToEditDocuments;\n const isPrincipalLenderAccount =\n tableName === \"ACCOUNT\" &&\n selectedTableItem?.id === principalLenderAccountId;\n const isAllowedToDeleteItem = !isPrincipalLenderAccount;\n const showCancelButton = !isViewOperation && isAllowedToCreateOrEdit;\n const showSubmitButton = !isViewOperation && isAllowedToCreateOrEdit;\n const showDeleteButton =\n isEditOperation && isAllowedToEditDocuments && isAllowedToDeleteItem;\n const showEditButton = isViewOperation && isAllowedToEditDocuments;\n const showCloseButton = isViewOperation;\n\n const tableLabel = tableLabels[tableName];\n\n const {\n submit,\n reset,\n formInputs: { inputs, additionalInputs },\n } = useTableForm({\n tableName,\n tableItem: selectedTableItem,\n operation,\n });\n\n const handleClose = useCallback(() => {\n reset();\n clearSelected();\n }, [clearSelected, reset]);\n\n const handleCancel = useCallback(() => {\n if (operation === \"edit\" && !!selectedTableItem) {\n viewItem(selectedTableItem, tableName);\n return;\n }\n handleClose();\n }, [handleClose, operation, selectedTableItem, tableName, viewItem]);\n\n const showDeleteModal = useCallback(() => {\n if (!isAllowedToDeleteItem || !hasDependentItems) return;\n\n showModal(\"deleteItem\", {\n tableName,\n dependentItemProps,\n });\n }, [\n isAllowedToDeleteItem,\n hasDependentItems,\n showModal,\n tableName,\n dependentItemProps,\n ]);\n\n const handleDelete = useCallback(() => {\n if (!selectedTableItem) return;\n\n if (hasDependentItems) {\n showDeleteModal();\n return;\n }\n\n const editorDeleteActionType = `DELETE_${tableName}` as const;\n handleAction({\n type: editorDeleteActionType,\n payload: selectedTableItem,\n });\n clearSelected();\n closeModal();\n }, [\n selectedTableItem,\n hasDependentItems,\n tableName,\n handleAction,\n clearSelected,\n closeModal,\n showDeleteModal,\n ]);\n\n const onEditButtonClick = useCallback(() => {\n if (!selectedTableItem) return;\n editItem(selectedTableItem, tableName);\n }, [selectedTableItem, editItem, tableName]);\n\n const closeButton = (\n <RWAButton className=\"text-gray-600\" onClick={handleClose}>\n Close\n </RWAButton>\n );\n\n const cancelButton = (\n <RWAButton className=\"text-gray-600\" onClick={handleCancel}>\n Cancel\n </RWAButton>\n );\n\n const submitButton = (\n <RWAButton\n icon={<Icon name=\"Save\" size={16} />}\n iconPosition=\"right\"\n onClick={submit}\n >\n {isCreateOperation ? \"Save\" : \"Save Edits\"}\n </RWAButton>\n );\n\n const deleteButton = (\n <button onClick={handleDelete}>\n <Icon className=\"ml-3 text-red-800\" name=\"Trash\" size={22} />\n </button>\n );\n\n const editButton = (\n <RWAButton\n icon={<Icon name=\"Pencil\" size={16} />}\n iconPosition=\"right\"\n onClick={onEditButtonClick}\n >\n Edit {tableLabel}\n </RWAButton>\n );\n\n return (\n <div className=\"flex flex-col rounded-md border border-gray-300 bg-white\">\n <div className=\"flex justify-between rounded-t-md border-b border-gray-300 bg-gray-100 p-3 font-semibold text-gray-800\">\n <div className=\"flex items-center\">\n {selectedTableItem?.itemNumber\n ? `${tableLabel} #${selectedTableItem.itemNumber}`\n : `New ${tableLabel}`}\n </div>\n <div className=\"flex gap-x-2\">\n {showCancelButton ? cancelButton : null}\n {showCloseButton ? closeButton : null}\n {showSubmitButton ? submitButton : null}\n {showDeleteButton ? deleteButton : null}\n {showEditButton ? editButton : null}\n </div>\n </div>\n <FormInputs inputs={inputs} />\n {additionalInputs}\n </div>\n );\n});\n","import type { TableColumn, TableName } from \"../types.js\";\n\nexport type ColumnsByTableName = {\n [K in TableName]: TableColumn[];\n};\n\nexport const columnsByTableName: ColumnsByTableName = {\n ASSET: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n {\n key: \"purchaseDate\" as const,\n label: \"Purchase Date\",\n allowSorting: true,\n },\n {\n key: \"maturity\" as const,\n label: \"Maturity\",\n allowSorting: true,\n displayTime: false,\n },\n {\n key: \"notional\" as const,\n label: \"Notional\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"currentValue\" as const,\n label: \"Current Value\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"purchasePrice\" as const,\n label: \"Purchase Price\",\n allowSorting: true,\n isNumberColumn: true,\n decimalScale: 6,\n },\n {\n key: \"purchaseProceeds\" as const,\n label: \"Purchase Proceeds\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"salesProceeds\" as const,\n label: \"Sales Proceeds\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"totalDiscount\" as const,\n label: \"Total Discount\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"realizedSurplus\" as const,\n label: \"Realized Surplus\",\n allowSorting: true,\n isNumberColumn: true,\n },\n ],\n TRANSACTION: [\n {\n key: \"typeLabel\" as const,\n label: \"Type\",\n allowSorting: true,\n },\n {\n key: \"entryTime\" as const,\n label: \"Entry Time\",\n allowSorting: true,\n },\n {\n key: \"asset\" as const,\n label: \"Asset\",\n allowSorting: true,\n },\n {\n key: \"quantity\" as const,\n label: \"Quantity\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"cashAmount\" as const,\n label: \"Cash Amount ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"totalFees\" as const,\n label: \"Total Fees ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n {\n key: \"cashBalanceChange\" as const,\n label: \"Cash Balance Change ($)\",\n allowSorting: true,\n isNumberColumn: true,\n },\n ],\n FIXED_INCOME_TYPE: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n ],\n SPV: [{ key: \"name\" as const, label: \"Name\", allowSorting: true }],\n SERVICE_PROVIDER_FEE_TYPE: [\n { key: \"name\" as const, label: \"Name\", allowSorting: true },\n { key: \"feeType\" as const, label: \"Fee Type\", allowSorting: true },\n {\n key: \"accountName\" as const,\n label: \"Account Name\",\n allowSorting: true,\n },\n {\n key: \"accountReference\" as const,\n label: \"Account Reference\",\n allowSorting: true,\n },\n ],\n ACCOUNT: [\n { key: \"label\" as const, label: \"Label\", allowSorting: true },\n { key: \"reference\" as const, label: \"Reference\", allowSorting: true },\n ],\n} as const;\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type RefObject,\n} from \"react\";\nimport type { ColumnCountByTableWidth, TableColumn } from \"../types.js\";\n\ntype Props<TColumn extends TableColumn> = {\n columns: TColumn[] | undefined;\n columnCountByTableWidth: ColumnCountByTableWidth;\n tableContainerRef: RefObject<HTMLDivElement | null>;\n hasItemNumberColumn?: boolean;\n hasMoreDetailsColumn?: boolean;\n};\n\n/**\n * Hook to handle dropping columns for smaller screens.\n *\n * @param columns - Array of columns to display, column must satisfy TableColumn. The columns will be displayed in the order they are provided.\n * @param columnCountByTableWidth - Object that specifies how many columns to show at different screen widths\n * @param tableContainerRef - Ref to the table container element\n * @param hasIndexColumn - When true, adds an \"index\" column with the index of the row as the _first column_. This column is exempt from being dropped.\n * @param hasMoreDetailsColumn - When true, adds a \"more details\" column as the _last column_. This column is exempt from being dropped. This column has no header label by default.\n */\nexport function useColumnPriority<TColumn extends TableColumn>(\n props: Props<TColumn>,\n) {\n const {\n columnCountByTableWidth,\n tableContainerRef,\n columns,\n hasItemNumberColumn = true,\n hasMoreDetailsColumn = true,\n } = props;\n\n const [parentWidth, setParentWidth] = useState(0);\n\n // Define special columns individually for clarity\n const indexColumn = useMemo(\n () =>\n hasItemNumberColumn\n ? {\n key: \"itemNumber\" as const,\n label: \"#\",\n allowSorting: true,\n isSpecialColumn: true,\n }\n : undefined,\n [hasItemNumberColumn],\n );\n\n const moreDetailsColumn = useMemo(\n () =>\n hasMoreDetailsColumn\n ? {\n key: \"moreDetails\" as const,\n label: \"\",\n isSpecialColumn: true,\n }\n : undefined,\n [hasMoreDetailsColumn],\n );\n\n const [columnsToShow, setColumnsToShow] = useState<TColumn[]>([]);\n\n const handleResize = useCallback(() => {\n if (tableContainerRef.current?.parentElement) {\n setParentWidth(tableContainerRef.current.parentElement.offsetWidth);\n }\n }, [tableContainerRef]);\n\n const handleDropColumns = useCallback(() => {\n const columnCount = getColumnCount(parentWidth, columnCountByTableWidth);\n const dynamicColumnsToShow = columns?.slice(0, columnCount) ?? [];\n // Ensure the index column is first and the \"more details\" column is last\n setColumnsToShow(\n [indexColumn, ...dynamicColumnsToShow, moreDetailsColumn].filter(\n Boolean,\n ) as TColumn[],\n );\n }, [\n parentWidth,\n columns,\n columnCountByTableWidth,\n indexColumn,\n moreDetailsColumn,\n ]);\n\n useEffect(() => {\n handleResize();\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, [handleResize]);\n\n useEffect(() => {\n handleDropColumns();\n }, [handleDropColumns, parentWidth]);\n\n return useMemo(() => columnsToShow, [columnsToShow]);\n}\n\nexport function getColumnCount(\n parentElementWidth: number,\n columnCountByTableWidth: Record<number, number>,\n) {\n let closestKey = 1520;\n let smallestDifference = Infinity;\n\n Object.keys(columnCountByTableWidth).forEach((columnWidthKey) => {\n const columnWidth = parseInt(columnWidthKey);\n const difference = Math.abs(parentElementWidth - columnWidth);\n\n if (difference < smallestDifference) {\n smallestDifference = difference;\n closestKey = parseInt(columnWidthKey);\n }\n });\n\n const columnCount = columnCountByTableWidth[closestKey];\n\n return columnCount;\n}\n","import type { RefObject } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\n\ntype Props = {\n selectedItemNumber: number | undefined;\n tableContainerRef: RefObject<HTMLDivElement | null>;\n rowRefs: RefObject<(HTMLTableRowElement | null)[]>;\n headerRef: RefObject<HTMLTableSectionElement | null>;\n hasSpecialLastRow?: boolean;\n};\n\nconst defaultRowHeight = 34;\nconst defaultHeaderHeight = 42;\nconst defaultRowCount = 20;\nconst defaultTwentyRowsPlusHeaderHeight =\n defaultRowHeight * defaultRowCount + defaultHeaderHeight;\n\nexport function useTableHeight(props: Props) {\n const {\n selectedItemNumber,\n tableContainerRef,\n rowRefs,\n headerRef,\n hasSpecialLastRow = false,\n } = props;\n const [maxHeight, setMaxHeight] = useState(\n `${defaultTwentyRowsPlusHeaderHeight}px`,\n );\n const selectedRowNumber = selectedItemNumber\n ? selectedItemNumber - 1 + (hasSpecialLastRow ? 1 : 0)\n : undefined;\n const rowHeight = rowRefs.current[1]?.offsetHeight ?? defaultRowHeight;\n const headerHeight = headerRef.current?.offsetHeight ?? defaultHeaderHeight;\n\n const updateTableHeight = useCallback(() => {\n if (selectedRowNumber === undefined) {\n const twentyRowsAndHeaderHeight = rowHeight * 20 + headerHeight;\n setMaxHeight(`${twentyRowsAndHeaderHeight}px`);\n return;\n }\n\n const tableContainerRect =\n tableContainerRef.current?.getBoundingClientRect();\n const rowRect = rowRefs.current[selectedRowNumber]?.getBoundingClientRect();\n\n if (rowRect && tableContainerRect) {\n const rowBottom = rowRect.bottom;\n const tableTop = tableContainerRect.top;\n const calculatedHeight = rowBottom - tableTop;\n\n setMaxHeight(`${calculatedHeight}px`);\n }\n }, [headerHeight, rowHeight, rowRefs, selectedRowNumber, tableContainerRef]);\n\n useEffect(() => {\n updateTableHeight();\n }, [updateTableHeight]);\n\n useEffect(() => {\n const handleScroll = () => {\n updateTableHeight();\n };\n\n const tableContainerElement = tableContainerRef.current;\n\n if (tableContainerElement) {\n tableContainerElement.addEventListener(\"scroll\", handleScroll);\n }\n\n return () => {\n if (tableContainerElement) {\n tableContainerElement.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, [tableContainerRef, updateTableHeight]);\n\n return maxHeight;\n}\n","import type { Order } from \"natural-orderby\";\n\nimport { Icon } from \"#design-system\";\nimport { useState } from \"react\";\nimport { twJoin, twMerge } from \"tailwind-merge\";\nimport type { SortDirection, TableBaseProps } from \"../types.js\";\n\n/**\n * Base table component\n *\n * @type TItem - Table item type, any record with an \"id\" field and any string keys\n * @type TableColumn - Specifies how to render a column. Must have a `key` which is a key of TItem, and a `label` which is the column header\n * @param tableData - Array of data to display, data must satisfy TItem\n * @param columns - Array of columns to display, column must satisfy TableColumn. The columns will be displayed in the order they are provided. Use the `useColumnPriority` hook to handle dropping columns for smaller screens.\n * @param children - Content to render above the table rows\n * @param footer - Content to render below the table rows\n * @param renderRow - Function to render a row, must return a React element\n * @param onClickSort - Function to handle sorting, called with key and direction\n * @param hasExpandedRow - Whether the table has an expanded row\n * @param specialFirstRow - Function to render a special first row (like the cash asset for instance), must return a React element\n */\nexport function TableBase(props: TableBaseProps) {\n const {\n children,\n ref,\n tableData,\n columns,\n footer,\n renderRow,\n onClickSort,\n specialFirstRow,\n specialLastRow,\n maxHeight,\n headerRef,\n hasSelectedItem,\n } = props;\n\n const [sortDirection, setSortDirection] = useState<SortDirection | null>(\n null,\n );\n const [sortKey, setSortKey] = useState<string | null>(null);\n\n return (\n <>\n <div\n className={twJoin(\n \"relative rounded-lg border border-gray-300 bg-white\",\n hasSelectedItem ? \"overflow-hidden\" : \"overflow-scroll\",\n )}\n ref={ref}\n style={{ maxHeight }}\n >\n <table className=\"w-full\">\n <thead\n className=\"sticky top-0 isolate select-none text-nowrap border-b border-gray-300 bg-gray-100\"\n ref={headerRef}\n >\n <tr>\n {columns.map((column) => (\n <th\n className={twMerge(\n \"group border-l border-gray-300 py-3 pl-3 text-start text-xs font-medium text-gray-600 first:border-l-0\",\n column.allowSorting && \"cursor-pointer hover:text-gray-900\",\n )}\n key={column.key}\n onClick={() => {\n if (!column.allowSorting) return;\n let sortDir: Order = \"asc\";\n\n if (sortKey === column.key && sortDirection === \"asc\") {\n sortDir = \"desc\";\n }\n\n setSortDirection(sortDir);\n setSortKey(column.key);\n\n onClickSort(column.key, sortDir);\n }}\n >\n <div\n className={twMerge(\n \"group flex items-center\",\n column.isNumberColumn && \"justify-end\",\n )}\n >\n {column.label}\n {column.allowSorting ? (\n <Icon\n className={twMerge(\n \"invisible ml-1 rotate-90\",\n sortKey === column.key && \"group-hover:visible\",\n sortDirection === \"asc\" && \"rotate-[270deg]\",\n )}\n name=\"ArrowFilledRight\"\n size={6}\n />\n ) : null}\n </div>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {children}\n {specialFirstRow?.(columns)}\n {tableData?.map((item, index) => renderRow(item, columns, index))}\n {specialLastRow?.(columns)}\n </tbody>\n </table>\n </div>\n {footer}\n </>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCallback, useRef } from \"react\";\nimport { Fragment } from \"react/jsx-runtime\";\nimport { columnsByTableName } from \"../constants/columns.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { defaultColumnCountByTableWidth } from \"../constants/table.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useColumnPriority } from \"../hooks/useColumnPriority.js\";\nimport { useTableHeight } from \"../hooks/useTableHeight.js\";\nimport type {\n SortDirection,\n TableColumn,\n TableItemType,\n TableName,\n TableProps,\n} from \"../types.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\nimport { TableBase } from \"./table-base.js\";\nimport { ItemNumberCell, MoreDetailsCell, RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\n\nexport function Table(props: TableProps) {\n const {\n tableName,\n tableData,\n columnCountByTableWidth = defaultColumnCountByTableWidth,\n sortHandler,\n specialFirstRow,\n specialLastRow,\n } = props;\n\n const columns = columnsByTableName[tableName];\n\n const {\n operation,\n selectedTableItem,\n isAllowedToCreateDocuments,\n createItem,\n } = useEditorContext();\n\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const rowRefs = useRef<(HTMLTableRowElement | null)[]>([]);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n\n const columnsToShow = useColumnPriority({\n columns,\n columnCountByTableWidth,\n tableContainerRef,\n });\n\n const maxHeight = useTableHeight({\n tableContainerRef,\n rowRefs,\n headerRef,\n selectedItemNumber: selectedTableItem?.itemNumber,\n hasSpecialLastRow: !!specialLastRow,\n });\n\n const tableLabel = tableLabels[tableName];\n\n const onCreateItemClick = useCallback(() => {\n createItem(tableName);\n }, [createItem, tableName]);\n\n const renderRow = useCallback(\n (\n tableItem: TableItemType<TableName>,\n columns: TableColumn[],\n index: number,\n ) => {\n const isSelected = selectedTableItem?.id === tableItem.id;\n\n return (\n <RWATableRow\n key={tableItem.id}\n /* @ts-expect-error - Ref is not typed */\n ref={(el) => (rowRefs.current[index] = el)}\n >\n {columns.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"itemNumber\" && (\n <ItemNumberCell itemNumber={tableItem.itemNumber} />\n )}\n {column.key !== \"itemNumber\" && column.key !== \"moreDetails\" && (\n <RWATableCell\n className={column.isNumberColumn ? \"text-right\" : \"\"}\n key={column.key}\n >\n {handleTableDatum(\n tableItem[column.key as keyof TableItemType<TableName>],\n column.decimalScale,\n column.displayTime,\n )}\n </RWATableCell>\n )}\n {column.key === \"moreDetails\" && (\n <MoreDetailsCell\n isSelected={isSelected}\n tableItem={tableItem}\n tableName={tableName}\n />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n );\n },\n [selectedTableItem?.id, tableName],\n );\n\n return (\n <>\n <TableBase\n columns={columnsToShow}\n hasSelectedItem={!!selectedTableItem}\n headerRef={headerRef}\n maxHeight={maxHeight}\n onClickSort={\n sortHandler as (key: string, direction: SortDirection) => void\n }\n ref={tableContainerRef}\n renderRow={renderRow}\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableData={tableData}\n />\n {isAllowedToCreateDocuments && !operation ? (\n <button\n className=\"mt-4 flex h-11 w-full items-center justify-center gap-x-2 rounded-lg border border-gray-300 bg-white text-sm font-semibold text-gray-900\"\n onClick={onCreateItemClick}\n >\n <span>Create {tableLabel}</span>\n <Icon name=\"Plus\" size={14} />\n </button>\n ) : null}\n </>\n );\n}\n","import { Pagination, usePagination } from \"#design-system\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableData } from \"../hooks/useTableData.js\";\nimport type { TableColumn, TableName } from \"../types.js\";\nimport { ItemDetails } from \"./item-details.js\";\nimport { Table } from \"./table.js\";\n\ntype Props = {\n readonly tableName: TableName;\n readonly specialFirstRow?: (columns: TableColumn[]) => React.JSX.Element;\n readonly specialLastRow?: (columns: TableColumn[]) => React.JSX.Element;\n};\nexport function TableWithForm(props: Props) {\n const { tableName, specialFirstRow, specialLastRow } = props;\n const { getIsFormOpen } = useEditorContext();\n const showForm = getIsFormOpen(tableName);\n const { tableData, sortHandler } = useTableData(tableName);\n const shouldPaginate = tableData.length > 20;\n\n const {\n pageItems,\n pages,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n hiddenNextPages,\n isNextPageAvailable,\n isPreviousPageAvailable,\n } = usePagination(tableData);\n return (\n <>\n <div className=\"mb-2 flex w-full justify-end\">\n {shouldPaginate ? (\n <Pagination\n goToFirstPage={goToFirstPage}\n goToLastPage={goToLastPage}\n goToNextPage={goToNextPage}\n goToPage={goToPage}\n goToPreviousPage={goToPreviousPage}\n hiddenNextPages={hiddenNextPages}\n isNextPageAvailable={isNextPageAvailable}\n isPreviousPageAvailable={isPreviousPageAvailable}\n nextPageLabel=\"Next\"\n pages={pages}\n previousPageLabel=\"Previous\"\n />\n ) : null}\n </div>\n <Table\n sortHandler={sortHandler}\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableData={pageItems}\n tableName={tableName}\n />\n {showForm ? (\n <div className=\"mt-4 rounded-md bg-white\">\n <ItemDetails tableName={tableName} />\n </div>\n ) : null}\n </>\n );\n}\n","import { Icon } from \"#design-system\";\nimport { useCallback } from \"react\";\nimport { Fragment } from \"react/jsx-runtime\";\nimport { tableNames } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableColumn } from \"../types.js\";\nimport { RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function AccountsTable() {\n const { accounts, principalLenderAccountId } = useEditorContext();\n const principalLenderAccount = accounts.find(\n (account) => account.id === principalLenderAccountId,\n );\n\n const renderPrincipalLenderRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow>\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"label\" ? (\n <RWATableCell>\n {principalLenderAccount?.label}\n <span className=\"ml-2 inline-flex items-center gap-1 rounded bg-green-100 px-1 font-extralight\">\n Lender <Icon name=\"CheckCircle\" size={14} />\n </span>\n </RWATableCell>\n ) : (\n <RWATableCell />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [principalLenderAccount?.label],\n );\n\n const specialFirstRow = principalLenderAccount?.label\n ? renderPrincipalLenderRow\n : undefined;\n\n return (\n <TableWithForm\n specialFirstRow={specialFirstRow}\n tableName={tableNames.ACCOUNT}\n />\n );\n}\n","import { Fragment, useCallback, useMemo } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport type { TableColumn } from \"../types.js\";\nimport { sumTotalForProperty } from \"../utils/calculations.js\";\nimport { handleTableDatum } from \"../utils/table.js\";\nimport { RWATableCell } from \"./table-cell.js\";\nimport { RWATableRow } from \"./table-row.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function AssetsTable() {\n const tableName = tableNames.ASSET;\n const { selectedTableItem, fixedIncomes, cashAsset } = useEditorContext();\n\n const cashAssetFormattedAsTableItem = useMemo(\n () => ({\n id: \"special-first-row\",\n name: \"Cash $USD\",\n fixedIncomeTypeId: \"--\",\n spvId: \"--\",\n maturity: \"--\",\n ISIN: \"--\",\n CUSIP: \"--\",\n coupon: null,\n notional: cashAsset.balance ?? 0,\n purchaseDate: \"--\",\n purchasePrice: \"--\",\n purchaseProceeds: \"--\",\n salesProceeds: \"--\",\n totalDiscount: \"--\",\n realizedSurplus: \"--\",\n currentValue: \"--\",\n }),\n [cashAsset.balance],\n );\n\n const totalPurchaseProceeds = sumTotalForProperty(\n fixedIncomes,\n \"purchaseProceeds\",\n );\n const totalSalesProceeds = sumTotalForProperty(fixedIncomes, \"salesProceeds\");\n const totalTotalDiscount = sumTotalForProperty(fixedIncomes, \"totalDiscount\");\n const totalRealizedSurplus = sumTotalForProperty(\n fixedIncomes,\n \"realizedSurplus\",\n );\n\n const specialFirstRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow>\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"name\" && <RWATableCell>Cash $USD</RWATableCell>}\n {column.key === \"notional\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(cashAssetFormattedAsTableItem[column.key])}\n </RWATableCell>\n )}\n {column.key !== \"name\" && column.key !== \"notional\" && (\n <RWATableCell />\n )}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [cashAssetFormattedAsTableItem],\n );\n\n const specialLastRow = useCallback(\n (c: TableColumn[]) => (\n <RWATableRow className=\"sticky bottom-0\">\n {c.map((column) => (\n <Fragment key={column.key}>\n {column.key === \"name\" && <RWATableCell>Totals</RWATableCell>}\n {column.key === \"purchaseProceeds\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalPurchaseProceeds)}\n </RWATableCell>\n )}\n {column.key === \"salesProceeds\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalSalesProceeds)}\n </RWATableCell>\n )}\n {column.key === \"totalDiscount\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalTotalDiscount)}\n </RWATableCell>\n )}\n {column.key === \"realizedSurplus\" && (\n <RWATableCell className=\"text-right\" key={column.key}>\n {handleTableDatum(totalRealizedSurplus)}\n </RWATableCell>\n )}\n {column.key !== \"name\" &&\n column.key !== \"purchaseProceeds\" &&\n column.key !== \"salesProceeds\" &&\n column.key !== \"totalDiscount\" &&\n column.key !== \"realizedSurplus\" && <RWATableCell />}\n </Fragment>\n ))}\n </RWATableRow>\n ),\n [\n selectedTableItem,\n totalPurchaseProceeds,\n totalRealizedSurplus,\n totalSalesProceeds,\n totalTotalDiscount,\n ],\n );\n\n return (\n <TableWithForm\n specialFirstRow={specialFirstRow}\n specialLastRow={specialLastRow}\n tableName={tableName}\n />\n );\n}\n","import type { ComponentType } from \"react\";\n\ntype Input = {\n label: string;\n Input: ComponentType;\n};\ntype Props = {\n readonly inputs: Input[];\n};\nexport function ModalFormInputs(props: Props) {\n const { inputs } = props;\n return (\n <div className=\"bg-white text-xs font-medium\">\n {inputs.map(({ label, Input }, index) => (\n <div className=\"mb-4 mt-2 grid gap-1\" key={label}>\n <label className=\"text-base\">{label}</label>\n <div key={index}>\n <Input />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { Icon, Modal } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { memo, useCallback } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { tableLabels } from \"../constants/names.js\";\nimport { useTableForm } from \"../hooks/useTableForm.js\";\nimport type { TableName } from \"../types.js\";\nimport { ModalFormInputs } from \"./modal-form-inputs.js\";\n\nexport type RWACreateItemModalProps = ComponentPropsWithoutRef<typeof Modal> & {\n readonly open: boolean;\n readonly tableName: TableName;\n readonly onOpenChange: (open: boolean) => void;\n};\n\nexport const RWACreateItemModal = memo(function RWACreateItemModal(\n props: RWACreateItemModalProps,\n) {\n const { tableName, open, onOpenChange } = props;\n\n const {\n reset,\n submit,\n formInputs: { inputs, additionalInputs },\n } = useTableForm({\n operation: \"create\",\n tableName,\n });\n\n const tableLabel = tableLabels[tableName];\n\n const handleCancel = useCallback(() => {\n reset();\n onOpenChange(false);\n }, [onOpenChange, reset]);\n\n const handleSubmit = useCallback(async () => {\n try {\n await submit();\n onOpenChange(false);\n } catch (error) {\n console.error(error);\n }\n }, [onOpenChange, submit]);\n\n const buttonStyles =\n \"min-h-[48px] min-w-[142px] text-base font-semibold py-3 px-6 rounded-xl outline-none active:opacity-75 hover:scale-105 transform transition-all\";\n\n return (\n <Modal\n contentProps={{\n className: \"rounded-3xl\",\n }}\n onOpenChange={onOpenChange}\n open={open}\n overlayProps={{\n className: \"top-10\",\n }}\n >\n <div className=\"w-[400px] p-6 text-slate-300\">\n <div className=\"mb-6 flex justify-between\">\n <h1 className=\"text-xl font-bold\">Create {tableLabel}</h1>\n <button\n className=\"flex size-8 items-center justify-center rounded-md bg-gray-100 text-gray-500 outline-none hover:text-gray-900\"\n onClick={handleCancel}\n tabIndex={-1}\n >\n <Icon name=\"XmarkLight\" size={24} />\n </button>\n </div>\n <ModalFormInputs inputs={inputs} />\n {additionalInputs}\n <div className=\"mt-8 flex justify-between gap-3\">\n <button\n className={twMerge(\n buttonStyles,\n \"flex-1 bg-slate-50 text-slate-800\",\n )}\n onClick={handleCancel}\n >\n Cancel\n </button>\n <button\n className={twMerge(buttonStyles, \"flex-1 bg-gray-800 text-gray-50\")}\n onClick={handleSubmit}\n >\n Save\n </button>\n </div>\n </div>\n </Modal>\n );\n});\n","import { Icon, Modal } from \"#design-system\";\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { memo, useCallback } from \"react\";\nimport type { DependentItemProps } from \"../constants/dependent-items.js\";\nimport { tableLabels } from \"../constants/names.js\";\nimport type { TableName } from \"../types.js\";\n\nexport type RWADeleteItemModalProps = ComponentPropsWithoutRef<typeof Modal> & {\n readonly tableName: TableName;\n readonly dependentItemProps: DependentItemProps;\n};\n\nexport const RWADeleteItemModal = memo(function RWADeleteItemModal(\n props: RWADeleteItemModalProps,\n) {\n const { tableName, dependentItemProps, onOpenChange, open } = props;\n\n const tableLabel = tableLabels[tableName].toLowerCase();\n\n const handleCancel = useCallback(() => {\n onOpenChange?.(false);\n }, [onOpenChange]);\n return (\n <Modal\n contentProps={{\n className: \"rounded-3xl\",\n }}\n onOpenChange={onOpenChange}\n open={open}\n overlayProps={{\n className: \"top-10\",\n }}\n >\n <div className=\"w-[400px] p-6 text-slate-300\">\n <div className=\"border-b border-slate-50 pb-2 text-2xl font-bold text-gray-800\">\n Cannot delete {tableName}\n </div>\n <div className=\"my-6 flex gap-2 rounded-md bg-orange-100 p-4 text-orange-800\">\n <div>\n <Icon className=\"mt-1 text-orange-800\" name=\"Error\" />\n </div>\n <div>\n Warning! Cannot delete this {tableLabel} because there are items\n that depend on it. Please change or delete those first.\n </div>\n </div>\n <div className=\"my-6 rounded-md bg-slate-50 p-4 text-slate-200\">\n {dependentItemProps.map(({ dependentTableName, dependentItems }) => (\n <div key={dependentTableName}>\n <div className=\"mb-0.5 font-semibold\" key={1}>\n {`${tableLabels[dependentTableName]}s: `}\n </div>\n {dependentItems.map(({ id, label }) => (\n <div key={id}>{label}</div>\n ))}\n </div>\n ))}\n </div>\n <div className=\"mt-8 flex justify-between gap-3\">\n <button\n className=\"min-h-12 min-w-36 flex-1 rounded-xl bg-gray-800 px-6 py-3 text-base font-semibold text-gray-50 outline-none transition-all hover:scale-105 active:opacity-75\"\n onClick={handleCancel}\n >\n Back\n </button>\n </div>\n </div>\n </Modal>\n );\n});\n","import { RWACreateItemModal } from \"./create-item-modal.js\";\nimport { RWADeleteItemModal } from \"./delete-item-modal.js\";\n\nexport const modals = {\n createItem: RWACreateItemModal,\n deleteItem: RWADeleteItemModal,\n};\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { modals } from \"./modal-components.js\";\nimport { ModalContext } from \"./modal-context.js\";\nimport type { ModalContextValue, ModalProps, ModalType } from \"./types.js\";\n\nexport const ModalManager: React.FC<{\n readonly children?: React.ReactNode;\n}> = (props) => {\n const { children } = props;\n\n const [modalProps, setModalProps] = useState<ModalProps[keyof ModalProps]>();\n const [modalType, setModalType] = useState<ModalType>();\n const [open, setOpen] = useState(false);\n\n const showModal: ModalContextValue[\"showModal\"] = useCallback(\n (modalType, props) => {\n setOpen(true);\n setModalProps(props);\n setModalType(modalType);\n },\n [],\n );\n\n const closeModal: ModalContextValue[\"closeModal\"] = useCallback(() => {\n setOpen(false);\n }, []);\n\n const ModalComponent = modalType ? modals[modalType] : null;\n\n const value = useMemo(\n () => ({ showModal, closeModal }),\n [closeModal, showModal],\n );\n\n return (\n <ModalContext.Provider value={value}>\n {children}\n {ModalComponent ? (\n <ModalComponent\n {...(modalProps as any)}\n onOpenChange={setOpen}\n open={open}\n />\n ) : null}\n </ModalContext.Provider>\n );\n};\n","import { tableNames } from \"../constants/names.js\";\nimport { AccountsTable } from \"./accounts-table.js\";\nimport { TableWithForm } from \"./table-with-form.js\";\n\nexport function OtherTab() {\n return (\n <div className=\"grid grid-rows-4 gap-4\">\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Accounts</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage accounts that can be associated with transactions and\n fees.\n </p>\n <AccountsTable />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Fixed Income Types</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage fixed income asset types.\n </p>\n <TableWithForm tableName={tableNames.FIXED_INCOME_TYPE} />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">SPVs</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage special purpose vehicles (SPVs).\n </p>\n <TableWithForm tableName={tableNames.SPV} />\n </div>\n <div>\n <h2 className=\"mb-2 text-lg font-bold\">Service Provider Fee Types</h2>\n <p className=\"mb-4 text-xs text-gray-600\">\n Add and manage service providers and their associated fee types.\n </p>\n <TableWithForm tableName={tableNames.SERVICE_PROVIDER_FEE_TYPE} />\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\ntype Props = {\n readonly label: ReactNode;\n readonly description: ReactNode;\n readonly children: ReactNode;\n};\nexport function RwaTabContent(props: Props) {\n const { label, description, children } = props;\n\n return (\n <div>\n <h1 className=\"mb-2 text-lg font-bold\">{label}</h1>\n <p className=\"mb-4 text-xs text-gray-600\">{description}</p>\n {children}\n </div>\n );\n}\n","import { AssetsTable } from \"./assets-table.js\";\nimport { RwaTabContent } from \"./rwa-tab-content.js\";\n\nexport function PortfolioTab() {\n return (\n <RwaTabContent\n description=\"Details on the distribution of assets among different financial institutions or investment vehicles.\"\n label=\"Portfolio\"\n >\n <AssetsTable />\n </RwaTabContent>\n );\n}\n","import { Pagination, usePagination } from \"#design-system\";\nimport { Combobox } from \"#design-system/connect\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { tableNames } from \"../constants/names.js\";\nimport {\n allGroupTransactionTypes,\n groupTransactionTypeLabels,\n} from \"../constants/transactions.js\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { useTableData } from \"../hooks/useTableData.js\";\nimport { makeFixedIncomeOptionLabel } from \"../utils/form.js\";\nimport { ItemDetails } from \"./item-details.js\";\nimport { Table } from \"./table.js\";\n\nexport function GroupTransactionsTable() {\n const tableName = tableNames.TRANSACTION;\n const { getIsFormOpen, fixedIncomes } = useEditorContext();\n\n const showForm = getIsFormOpen(tableName);\n const { tableData, sortHandler } = useTableData(tableName);\n const [filteredTableData, setFilteredTableData] = useState(tableData);\n const [filterAssetId, setFilterAssetId] = useState<string>();\n const [filterTypes, setFilterTypes] = useState<\n (keyof typeof allGroupTransactionTypes)[]\n >([]);\n const shouldPaginate = filteredTableData.length > 20;\n\n useEffect(() => {\n if (!filterAssetId && !filterTypes.length) {\n setFilteredTableData(tableData);\n return;\n }\n\n setFilteredTableData(\n tableData.filter((transaction) => {\n if (filterAssetId && filterTypes.length) {\n return (\n transaction.fixedIncomeTransaction?.assetId === filterAssetId &&\n filterTypes.includes(\n transaction.type as keyof typeof allGroupTransactionTypes,\n )\n );\n }\n\n if (filterAssetId) {\n return transaction.fixedIncomeTransaction?.assetId === filterAssetId;\n }\n\n if (filterTypes.length) {\n return filterTypes.includes(\n transaction.type as keyof typeof allGroupTransactionTypes,\n );\n }\n }),\n );\n }, [filterAssetId, filterTypes, tableData]);\n\n const filterByAssetOptions = useMemo(\n () =>\n fixedIncomes.map((asset) => ({\n label: makeFixedIncomeOptionLabel(asset),\n value: asset.id,\n })),\n [fixedIncomes],\n );\n\n const filterByTypeOptions = useMemo(\n () =>\n allGroupTransactionTypes.map((type) => ({\n label: groupTransactionTypeLabels[type],\n value: type,\n })),\n [],\n );\n\n const {\n pageItems,\n pages,\n goToPage,\n goToNextPage,\n goToPreviousPage,\n goToFirstPage,\n goToLastPage,\n hiddenNextPages,\n isNextPageAvailable,\n isPreviousPageAvailable,\n } = usePagination(filteredTableData);\n\n const handleFilterByAssetChange = useCallback((update: unknown) => {\n if (!update || !(typeof update === \"object\") || !(\"value\" in update)) {\n setFilterAssetId(undefined);\n return;\n }\n\n const { value: assetId } = update;\n\n setFilterAssetId(assetId as string);\n }, []);\n\n const handleFilterByTypeChange = useCallback((update: unknown) => {\n if (!update || !Array.isArray(update)) {\n setFilterTypes([]);\n return;\n }\n\n const _update = update as {\n value: keyof typeof allGroupTransactionTypes;\n }[];\n\n setFilterTypes(_update.map(({ value }) => value));\n }, []);\n\n return (\n <>\n <div className=\"mb-2 flex gap-2\">\n <div className=\"min-w-72 max-w-96\">\n <Combobox\n isClearable\n onChange={handleFilterByAssetChange}\n options={filterByAssetOptions}\n placeholder=\"Filter by Asset\"\n />\n </div>\n <div className=\"min-w-72 max-w-96\">\n <Combobox\n isClearable\n isMulti\n onChange={handleFilterByTypeChange}\n options={filterByTypeOptions}\n placeholder=\"Filter by Type\"\n />\n </div>\n <div className=\"flex w-full justify-end\">\n {shouldPaginate ? (\n <Pagination\n goToFirstPage={goToFirstPage}\n goToLastPage={goToLastPage}\n goToNextPage={goToNextPage}\n goToPage={goToPage}\n goToPreviousPage={goToPreviousPage}\n hiddenNextPages={hiddenNextPages}\n isNextPageAvailable={isNextPageAvailable}\n isPreviousPageAvailable={isPreviousPageAvailable}\n nextPageLabel=\"Next\"\n pages={pages}\n previousPageLabel=\"Previous\"\n />\n ) : null}\n </div>\n </div>\n <Table\n sortHandler={sortHandler}\n tableData={pageItems}\n tableName={tableName}\n />\n {showForm ? (\n <div className=\"mt-4 rounded-md bg-white\">\n <ItemDetails tableName={tableName} />\n </div>\n ) : null}\n </>\n );\n}\n","import { GroupTransactionsTable } from \"./group-transactions-table.js\";\nimport { RwaTabContent } from \"./rwa-tab-content.js\";\n\nexport function TransactionsTab() {\n return (\n <RwaTabContent\n description=\"Details on the distribution of assets among different financial institutions or investment vehicles.\"\n label=\"Transactions\"\n >\n <GroupTransactionsTable />\n </RwaTabContent>\n );\n}\n","import { Content, List, Root, Trigger } from \"@radix-ui/react-tabs\";\nimport { useCallback } from \"react\";\nimport { EditorActionButtons } from \"#design-system/connect\";\nimport { useEditorContext } from \"../context/editor-context.js\";\nimport { OtherTab } from \"./other-tab.js\";\nimport { PortfolioTab } from \"./portfolio-tab.js\";\nimport { TransactionsTab } from \"./transactions-tab.js\";\nexport function RWATabs() {\n const tabs = [\"Portfolio\", \"Transactions\", \"Other\"] as const;\n const {\n onSwitchboardLinkClick,\n onExport,\n onClose,\n onShowRevisionHistory,\n clearSelected,\n } = useEditorContext();\n\n const handleTabChange = useCallback(() => {\n clearSelected();\n }, [clearSelected]);\n\n return (\n <Root defaultValue=\"Portfolio\" onValueChange={handleTabChange}>\n <div className=\"flex justify-between\">\n {/* <EditorUndoRedoButtons {...props} /> */}\n <List className=\"flex gap-x-2 rounded-xl bg-slate-50 p-1 text-sm font-semibold text-gray-600 outline-none\">\n {tabs.map((tab) => (\n <Trigger\n className=\"data-[state='active']:tab-shadow data-disabled:cursor-not-allowed data-disabled:text-gray-400 h-7 w-32 rounded-lg transition duration-300 data-[state='active']:bg-gray-50 data-[state='active']:text-gray-900\"\n key={tab}\n value={tab}\n >\n {tab}\n </Trigger>\n ))}\n </List>\n <EditorActionButtons\n onClose={onClose}\n onExport={onExport}\n onShowRevisionHistory={onShowRevisionHistory}\n onSwitchboardLinkClick={onSwitchboardLinkClick}\n />\n </div>\n <div className=\"mt-3 rounded-md bg-slate-50 p-8\">\n <Content value=\"Portfolio\">\n <PortfolioTab />\n </Content>\n <Content value=\"Transactions\">\n <TransactionsTab />\n </Content>\n <Content value=\"Other\">\n <OtherTab />\n </Content>\n </div>\n </Root>\n );\n}\n","import { ModalManager } from \"./modal-manager.js\";\nimport { RWATabs } from \"./tabs.js\";\n\nexport function RWAEditor() {\n return (\n <ModalManager>\n <RWATabs />\n </ModalManager>\n );\n}\n","import type { DivProps } from \"#design-system\";\nimport { mergeClassNameProps } from \"#design-system\";\n\nexport interface RWAFormRowProps extends DivProps {\n readonly label?: React.ReactNode;\n readonly value?: React.ReactNode;\n}\n\nexport const RWAFormRow: React.FC<RWAFormRowProps> = ({\n label,\n value,\n ...divProps\n}) => (\n <div {...mergeClassNameProps(divProps, \"flex items-center px-6 text-xs\")}>\n <div className=\"text-gray-600\">{label}</div>\n <div className=\"text-gray-900\">{value ? value : \"--\"}</div>\n </div>\n);\n","import type { DivProps } from \"#design-system\";\n\nexport interface RWATableHeaderLabelProps extends DivProps {\n readonly label?: React.ReactNode;\n}\n\nexport const RWATableHeaderLabel: React.FC<RWATableHeaderLabelProps> = (\n props,\n) => {\n const { label, ...divProps } = props;\n\n return (\n <th scope=\"col\" {...divProps}>\n {label}\n </th>\n );\n};\n"],"mappings":"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"}
|