@riboseinc/paneron-registry-kit 2.2.33 → 2.2.35
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/item-classes/Tree.js +2 -2
- package/item-classes/Tree.js.map +1 -1
- package/package.json +4 -3
- package/proposals/ChangeRequestContext.js +1 -1
- package/proposals/ChangeRequestContext.js.map +1 -1
- package/proposals/HistoryDrawer.js +1 -0
- package/proposals/HistoryDrawer.js.map +1 -1
- package/proposals/ListItem.d.ts +8 -0
- package/proposals/ListItem.js +40 -0
- package/proposals/ListItem.js.map +1 -0
- package/proposals/MetaProperties.js +41 -11
- package/proposals/MetaProperties.js.map +1 -1
- package/proposals/NewProposalMenu.d.ts +10 -0
- package/proposals/NewProposalMenu.js +113 -0
- package/proposals/NewProposalMenu.js.map +1 -0
- package/proposals/ProposalBrowser.js +2 -58
- package/proposals/ProposalBrowser.js.map +1 -1
- package/proposals/ProposalDetail.js +1 -0
- package/proposals/ProposalDetail.js.map +1 -1
- package/proposals/ProposalItem.js.map +1 -1
- package/proposals/ProposalTab.d.ts +12 -0
- package/proposals/ProposalTab.js +102 -0
- package/proposals/ProposalTab.js.map +1 -0
- package/proposals/ProposalWorkspace.d.ts +13 -0
- package/proposals/ProposalWorkspace.js +132 -0
- package/proposals/ProposalWorkspace.js.map +1 -0
- package/proposals/Search.js +20 -8
- package/proposals/Search.js.map +1 -1
- package/proposals/actionableGroups/Tree.js +13 -14
- package/proposals/actionableGroups/Tree.js.map +1 -1
- package/proposals/actionableGroups/treeNodes.d.ts +1 -0
- package/proposals/actionableGroups/treeNodes.js +41 -9
- package/proposals/actionableGroups/treeNodes.js.map +1 -1
- package/proposals/objectChangeset.d.ts +1 -2
- package/proposals/objectChangeset.js +1 -1
- package/proposals/objectChangeset.js.map +1 -1
- package/proposals/types.d.ts +2 -1
- package/proposals/types.js +4 -1
- package/proposals/types.js.map +1 -1
- package/types/util.d.ts +1 -1
- package/types/util.js.map +1 -1
- package/views/detail/ChangeRequest/index.js +11 -159
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/ProposalWork.js +150 -110
- package/views/detail/ProposalWork.js.map +1 -1
- package/views/detail/RegisterHome/index.js +3 -3
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterHome2/index.d.ts +5 -0
- package/views/detail/RegisterHome2/index.js +58 -0
- package/views/detail/RegisterHome2/index.js.map +1 -0
- package/views/detail/RegisterItem/index.d.ts +1 -0
- package/views/detail/RegisterItem/index.js +55 -14
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterMeta/RegisterMetaForm.js +1 -46
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/hooks/useLatestAcceptedProposal.d.ts +2 -0
- package/views/hooks/useLatestAcceptedProposal.js +48 -0
- package/views/hooks/useLatestAcceptedProposal.js.map +1 -0
- package/views/hooks/useRegisterVersion.d.ts +4 -0
- package/views/hooks/useRegisterVersion.js +4 -0
- package/views/hooks/useRegisterVersion.js.map +1 -1
- package/views/index.js +26 -10
- package/views/index.js.map +1 -1
- package/views/itemQueryUtils.js +12 -7
- package/views/itemQueryUtils.js.map +1 -1
- package/views/sidebar/Registration/index.js +6 -32
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/Search/index.js +4 -7
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/sidebar/index.js +40 -10
- package/views/sidebar/index.js.map +1 -1
- package/views/util.d.ts +6 -1
- package/views/util.js +29 -7
- package/views/util.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProposalBrowser.js","sourceRoot":"","sources":["../../src/proposals/ProposalBrowser.tsx"],"names":[],"mappings":"AACA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGhF,OAAO,aAAa,MAAM,wDAAwD,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,UAAU,EAAqC,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAiB,MAAM,2BAA2B,CAAC;AAGrE,OAAO,EAA2B,sBAAsB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAe9C;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC9B,EAAE,SAAS,EAAE,6BAA6B,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAC/D;;IACtB,MAAM,CAAE,UAAU,EAAE,aAAa,CAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,MAAM,gBAAgB,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,IAAI,CAAC;IAE9C,gCAAgC;IAChC,4DAA4D;IAC5D,iEAAiE;IAEjE,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,eAAe,CAAC;IAEtE;;;OAGG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,aAAa,CAAC,GAA4B;QAClF,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE;YAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;gBACvB,cAAc,CAAC,QAAQ,CAAC,CAAC;aAC1B;iBAAM;gBACL,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,CAAC,CAAC;aACf;SACF;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAErC,MAAM,kBAAkB,GAAmB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,GAAG,eAAe;QAClB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IAEtC,2CAA2C;IAC3C,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE;YACrE,OAAO,QAAQ,CAAC;SACjB;aAAM;YACL,OAAO,SAAS,CAAC;SAClB;IACH,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAa,CAAC;IAE5C,mDAAmD;IACnD,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;QAC9C,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,CAAC,QAAgB,EAAE,EAAE,WAAC,OAAA,MAAA,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,mCAAI,IAAI,CAAA,EAAA,CAAC,EAClE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9B,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,CAAC,QAAgB,EAAE,EAAE,WAAC,OAAA,MAAA,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,mCAAI,IAAI,CAAA,EAAA,CAAC,EACnE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/B,yEAAyE;IACzE,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvF,iEAAiE;IACjE,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzF,MAAM,eAAe,GAAG,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAEjF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,CAAC,IAAwB,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAC7D,CAAC,cAAc,CAAC,CAAC,CAAC;IAEpB,MAAM,UAAU,GAA8B,OAAO,CAAC,CAAC,GAAG,EAAE,CAC1D,gBAAgB;QACd,CAAC,CAAC,CAAC;YACC,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC;YACrC,IAAI,EAAE,CAAC,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,mBAAmB,CAAE;YACpD,UAAU,EAAE,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,SAAS;YAC5C,OAAO,EAAE,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,gBAAgB,CAAC;SACzE,CAAC;QACJ,CAAC,CAAC,IAAI,CACT,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAyB,OAAO,CAAC,CAAC,GAAG,EAAE,CACnD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;;QAAC,OAAA,CAAC;YACvD,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,MAAA,CAAC,MAAA,eAAe,CAAC,QAAQ,CAAC,mCAAI,cAAc,CAAC,QAAQ,CAAC,CAAE,mCAAI,IAAI;YACtE,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,QAAQ,CAAC;SACjE,CAAC,CAAA;KAAA,CAAC,CACJ,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;IAE7E,MAAM,gBAAgB,GACpB,gBAAgB;WACb,eAAe;WACf,SAAS,CAAC,gBAAgB,CAAC;WAC3B,CAAC,oBAAoB,IAAI,mBAAmB,CAAC,CAAC;IAEnD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAEpD,mBAAmB;IACnB,+BAA+B;IAC/B,yDAAyD;IACzD,6BAA6B;IAC7B,iFAAiF;IACjF,2CAA2C;IAC3C,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,2BAA2B;IAC3B,8CAA8C;IAC9C,8EAA8E;IAC9E,OAAO;IACP,KAAK;IACL,kCAAkC;IAElC,MAAM,WAAW,GACf,gBAAgB,IAAI,CAAA,MAAA,SAAS,CAAC,gBAAgB,CAAC,0CAAE,IAAI,MAAK,eAAe;QACvE,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,QAAQ,GAAG,WAAW,IAAI,UAAU,CAAC;IAE3C,MAAM,mBAAmB,GAAG,gBAAgB;QAC1C,CAAC,CAAC,IAAC,eAAe,IACd,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,CAAC,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,mBAAmB,CAAE,EACpD,UAAU,EAAE,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,SAAS,EAC5C,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,GACrC;QACJ,CAAC,CAAC,8CAAiB,CAAC;IACtB,MAAM,IAAI,GAAG,gBAAgB;QAC3B,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,kBAAkB,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE;;QACvC,OAAA,IAAC,MAAM,IACH,MAAM,EAAE,aAAa,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,IAAI,EAAE,UAAU,CAAC,KAAK,EACtB,YAAY,EAAE,KAAK,IACpB,aAAa,GAAG,CAAC,IAAI,gBAAgB;YACpC,CAAC,CAAC;gBACE,IAAC,WAAW;oBACV,IAAC,MAAM,IACL,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAA,MAAA,SAAS,CAAC,gBAAgB,CAAC,0CAAE,IAAI,MAAK,UAAU,EACrE,IAAI,EAAC,kBAAkB,EACvB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,SAAS,CAAC,YAAY,IAAI,gBAAgB,EAAE,CAAC,EACxE,KAAK,EAAC,wEAAwE,GAC9E;oBACF,IAAC,MAAM,IACL,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACrC,+CAA+C;wBAC/C,qDAAqD;wBACrD,0BAA0B;wBAC1B,QAAQ,EAAE,CAAC,WAAW,EACtB,IAAI,EAAC,SAAS,EACd,KAAK,EAAC,gDAAgD,GACtD;oBACF,IAAC,UAAU,QACR,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAClB,IAAC,MAAM,IACH,UAAU,EAAE,KAAK,EACjB,UAAU,EAAE,oBAAoB,EAChC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,qCAAqC,CAAC,EAAE,EACrE,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EACvD,IAAI,QACJ,YAAY,EAAE,sBAAsB,EACpC,YAAY,EAAE,gBAAgB;wBAChC,IAAC,MAAM,IACH,IAAI,QACJ,SAAS,EAAC,cAAc,EACxB,IAAI,EAAE,IAAI,EACV,KAAK,EAAC,uCAAuC,EAC7C,GAAG,EAAE,GAAG,CAAA,sBAAsB,IAC/B,mBAAmB,CACb,CACF,CACV,CACU;oBACb,IAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,+BAA+B,EACrC,IAAI,EAAC,UAAU,GACf,CACU;gBACd,aAAK,GAAG,EAAE,GAAG,CAAA,8BAA8B;oBACzC,IAAC,UAAU,CAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB;wBAC5C,IAAC,aAAa,IAAC,QAAQ,EAAC,iBAAiB;4BACvC,IAAC,cAAc,IACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,QAAQ;gCAClB,mCAAmC;gCACnC,IAAI,EAAE,CAAC,oBAAoB,aAApB,oBAAoB,cAApB,oBAAoB,GAAI,mBAAmB,CAAE,EACpD,UAAU,EAAE,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,SAAS,EAC5C,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,GACrC,CACY,CACI,CAClB,CACL;YACL,CAAC,CAAC,IAAI,CACD,CAAA;KAAA,CACV,EAAE,CAAC,aAAa,GAAG,CAAC,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE5K,OAAO,CACL;QACG,kBAAkB;QAClB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAClB,MAAM,OAAO,GAAyC,CAAC;oBACrD,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC3C,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,4CAA4C;oBACnD,IAAI,EAAE,UAAU;iBACjB,CAAC,CAAC;YACH,IAAI,6BAA6B,EAAE;gBACjC,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,sBAAsB;oBAC5B,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC1D,IAAI,EAAE,OAAO;iBACd,CAAC,CAAC;aACJ;YACD,OAAO,IAAC,aAAa,IACjB,GAAG,EAAE,GAAG,CAAA;;aAEP,EACD,WAAW,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,WAAW,EAC5C,GAAG,EAAE,GAAG,CAAC,QAAQ;gBACnB,IAAC,YAAY,IAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAI;gBACxC,aAAK,GAAG,EAAE,GAAG,CAAA,6BAA6B,IACvC,GAAG,CAAC,IAAI,KAAK,IAAI;oBAChB,CAAC,CAAC,IAAC,EAAE,IAAC,GAAG,EAAE,GAAG,CAAA,uDAAuD;wBACjE,IAAC,eAAe,IACd,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,UAAU,EAAE,GAAG,CAAC,UAAU,EAC1B,IAAI,EAAE,GAAG,CAAC,IAAI,GACd,CACC;oBACP,CAAC,CAAC,gEAAwC,CACxC;gBACL,OAAO,CAAC,MAAM,GAAG,CAAC;oBACjB,CAAC,CAAC,IAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,GAAI;oBACxC,CAAC,CAAC,IAAI,CACM,CAAA;QAClB,CAAC,CAAC,CACD,CACJ,CAAC;AACJ,CAAC;AAAA,CAAC;AAEF,SAAS,oBAAoB,CAAC,EAAO,EAAE,EAAO;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,eAAe,eAAe,CAAC","sourcesContent":["\n/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useCallback, useMemo } from 'react';\nimport { ClassNames, jsx, css } from '@emotion/react';\nimport { Select2 as Select } from '@blueprintjs/select';\nimport { ButtonGroup, Button, H5, Drawer, DrawerSize } from '@blueprintjs/core';\nimport type { MenuItemProps, MenuDividerProps } from '@blueprintjs/core';\n\nimport ErrorBoundary from '@riboseinc/paneron-extension-kit/widgets/ErrorBoundary';\n\nimport { useItemRef, itemPathToItemRef } from '../views/itemPathUtils';\nimport { HomeBlockCard, HomeBlockActions } from '../views/detail/RegisterHome/Block';\nimport { BrowserCtx, type BrowserCtx as BrowserCtxType } from '../views/BrowserCtx';\nimport { Protocols, type Protocol } from '../views/protocolRegistry';\n\nimport type { Drafted } from './types';\nimport { type ChangeProposalItem, ChangeProposalItemView, getProposalIcon } from './ProposalItem';\nimport ProposalType from './ProposalType';\nimport ProposalSummary from './ProposalSummary';\nimport ProposalDetail from './ProposalDetail';\n\n\ninterface ProposalBrowserProps<CR extends Drafted> {\n proposals: CR['items']\n\n selectedItem?: (string & keyof CR['items']) | null\n onSelectItem: (selectedItem: (string & keyof CR['items']) | null) => void\n\n /**\n * If provided, button to delete each proposed change\n * is shown in change card list mode.\n */\n onDeleteProposalForItemAtPath?: (itemPath: string) => void\n}\n/**\n * Shows a list of individual proposed changes as cards by default,\n * allowing to expand a proposal and view item details.\n *\n * If no proposals exist, returns null.\n */\nexport function ProposalBrowser<CR extends Drafted>\n({ proposals, onDeleteProposalForItemAtPath, selectedItem, onSelectItem: selectProposal }:\nProposalBrowserProps<CR>) {\n const [ preferDiff, setPreferDiff ] = useState(false);\n\n const selectedProposal = selectedItem ?? null;\n\n // TODO: Temporarily unsupported\n // (limitations of current change annotation implementation)\n //const [ showOnlyChanged, setShowOnlyChanged ] = useState(true);\n\n const outerBrowserCtx = useContext(BrowserCtx);\n const { jumpTo, subregisters, useRegisterItemData } = outerBrowserCtx;\n\n /**\n * When jumping to an item affected by current CR,\n * jump in-CR instead of spawning tab.\n */\n const handleCRJump = useCallback(function _handleCRJump(uri: `${Protocol}:${string}`): void {\n if (uri.startsWith(Protocols.ITEM_DETAILS)) {\n const itemPath = uri.split(':')[1];\n if (proposals[itemPath]) {\n selectProposal(itemPath);\n } else {\n jumpTo?.(uri);\n }\n }\n }, [Object.keys(proposals), jumpTo]);\n\n const proposalBrowserCtx: BrowserCtxType = useMemo((() => ({\n ...outerBrowserCtx,\n jumpTo: handleCRJump,\n })), [handleCRJump, outerBrowserCtx]);\n\n /** Paths of register items in proposal. */\n const proposedItemPaths = Object.entries(proposals).map(([itemPath, proposal]) => {\n if (proposal.type === 'clarification' || proposal.type === 'addition') {\n return itemPath;\n } else {\n return undefined;\n }\n }).filter(s => s !== undefined) as string[];\n\n /** Proposed data of register items in proposal. */\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: proposedItemPaths,\n });\n\n /** Pre-existing data of register items in proposal. */\n const currentItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposals),\n ignoreActiveCR: true,\n });\n\n const getCurrentItem = useCallback(\n ((itemPath: string) => currentItemDataReq.value[itemPath] ?? null),\n [currentItemDataReq.value]);\n const getProposedItem = useCallback(\n ((itemPath: string) => proposedItemDataReq.value[itemPath] ?? null),\n [proposedItemDataReq.value]);\n\n /** Current register item (if any) corresponding to selected proposal. */\n const selectedItemCurrent = selectedProposal ? getCurrentItem(selectedProposal) : null;\n\n /** Proposed register item corresponding to selected proposal. */\n const selectedItemProposed = selectedProposal ? getProposedItem(selectedProposal) : null;\n\n const selectedItemRef = useItemRef(subregisters !== undefined, selectedProposal);\n\n const handleItemSelect = useCallback(\n ((item: ChangeProposalItem) => selectProposal(item.itemPath)),\n [selectProposal]);\n\n const activeItem: ChangeProposalItem | null = useMemo((() =>\n selectedProposal\n ? ({\n itemPath: selectedProposal,\n proposal: proposals[selectedProposal],\n item: (selectedItemProposed ?? selectedItemCurrent)!,\n itemBefore: selectedItemCurrent ?? undefined,\n itemRef: itemPathToItemRef(subregisters !== undefined, selectedProposal),\n })\n : null\n ), [selectedProposal, proposals, subregisters]);\n\n const allItems: ChangeProposalItem[] = useMemo((() =>\n Object.entries(proposals).map(([itemPath, proposal]) => ({\n itemPath,\n proposal,\n item: (getProposedItem(itemPath) ?? getCurrentItem(itemPath))! ?? null,\n itemBefore: undefined,\n itemRef: itemPathToItemRef(subregisters !== undefined, itemPath),\n }))\n ), [proposals, getCurrentItem, getProposedItem, subregisters !== undefined]);\n\n const haveSelectedItem =\n selectedProposal\n && selectedItemRef\n && proposals[selectedProposal]\n && (selectedItemProposed || selectedItemCurrent);\n\n const proposalCount = Object.keys(proposals).length;\n\n //useEffect(() => {\n // // if (!selectedProposal) {\n // // const firstProposal = Object.keys(proposals)[0];\n // // if (firstProposal) {\n // // if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {\n // // selectProposal(firstProposal);\n // // }\n // // }\n // // }\n // if (selectedProposal) {\n // if (selectedProposalDetailRef.current) {\n // selectedProposalDetailRef.current.scrollIntoView({ block: 'center' });\n // }\n // }\n //}, [selectedProposal === null]);\n\n const canShowDiff: boolean =\n haveSelectedItem && proposals[selectedProposal]?.type === 'clarification'\n ? true\n : false;\n const showDiff = canShowDiff && preferDiff;\n\n const selectedItemSummary = haveSelectedItem\n ? <ProposalSummary\n itemRef={selectedItemRef}\n item={(selectedItemProposed ?? selectedItemCurrent)!}\n itemBefore={selectedItemCurrent ?? undefined}\n proposal={proposals[selectedProposal]}\n />\n : <>Select item…</>;\n const icon = haveSelectedItem\n ? getProposalIcon(proposals[selectedProposal])\n : undefined;\n\n const selectedItemDrawer = useMemo((() =>\n <Drawer\n isOpen={proposalCount > 0 && haveSelectedItem ? true : false}\n onClose={() => selectProposal(null)}\n size={DrawerSize.LARGE}\n enforceFocus={false}>\n {proposalCount > 0 && haveSelectedItem\n ? <>\n <ButtonGroup>\n <Button\n disabled={!jumpTo || proposals[selectedProposal]?.type === 'addition'}\n icon='open-application'\n onClick={() => jumpTo?.(`${Protocols.ITEM_DETAILS}:${selectedProposal}`)}\n title=\"Open selected item in a new tab (not applicable to proposed additions)\"\n />\n <Button\n active={preferDiff}\n onClick={() => setPreferDiff(v => !v)}\n // Diffing only makes sense for clarifications.\n // Additions are entire new items, and for amendments\n // item data is unchanged.\n disabled={!canShowDiff}\n text=\"Compare\"\n title=\"Annotate proposed clarifications for this item\"\n />\n <ClassNames>\n {(({ css: css2 }) =>\n <Select<ChangeProposalItem>\n filterable={false}\n itemsEqual={stringifiedJSONEqual}\n menuProps={{ className: css2(`max-height: 50vh; overflow-y: auto;`) }}\n activeItem={activeItem}\n items={allItems}\n popoverProps={{ minimal: true, matchTargetWidth: true }}\n fill\n itemRenderer={ChangeProposalItemView}\n onItemSelect={handleItemSelect}>\n <Button\n fill\n rightIcon=\"chevron-down\"\n icon={icon}\n title=\"Switch between items in this proposal\"\n css={css`white-space: nowrap;`}>\n {selectedItemSummary}\n </Button>\n </Select>\n )}\n </ClassNames>\n <Button\n onClick={() => selectProposal(null)}\n icon=\"minimize\"\n title=\"Minimize proposed change view\"\n text=\"Minimize\"\n />\n </ButtonGroup>\n <div css={css`position: relative; flex: 1;`}>\n <BrowserCtx.Provider value={proposalBrowserCtx}>\n <ErrorBoundary viewName=\"Proposal detail\">\n <ProposalDetail\n itemRef={selectedItemRef}\n showDiff={showDiff}\n //showOnlyChanged={showOnlyChanged}\n item={(selectedItemProposed ?? selectedItemCurrent)!}\n itemBefore={selectedItemCurrent ?? undefined}\n proposal={proposals[selectedProposal]}\n />\n </ErrorBoundary>\n </BrowserCtx.Provider>\n </div>\n </>\n : null}\n </Drawer>\n ), [proposalCount > 0, haveSelectedItem, selectedItemProposed, selectedItemCurrent, preferDiff, jumpTo, handleItemSelect, selectedProposal && proposals[selectedProposal]]);\n\n return (\n <>\n {selectedItemDrawer}\n {allItems.map(cpi => {\n const actions: (MenuItemProps | MenuDividerProps)[] = [{\n onClick: () => selectProposal(cpi.itemPath),\n text: \"Expand\",\n title: \"Expand proposed change to see item details\",\n icon: 'maximize',\n }];\n if (onDeleteProposalForItemAtPath) {\n actions.push({\n text: \"Delete this proposal\",\n intent: 'danger',\n onClick: () => onDeleteProposalForItemAtPath(cpi.itemPath),\n icon: 'trash',\n });\n }\n return <HomeBlockCard\n css={css`\n flex-basis: calc(33.33% - 10px*2/3);\n `}\n description={`${cpi.proposal.type} proposal`}\n key={cpi.itemPath}>\n <ProposalType proposal={cpi.proposal} />\n <div css={css`padding: 5px; flex-grow: 1;`}>\n {cpi.item !== null\n ? <H5 css={css`margin: 0; overflow: hidden; text-overflow: ellipsis;`}>\n <ProposalSummary\n itemRef={cpi.itemRef}\n proposal={cpi.proposal}\n itemBefore={cpi.itemBefore}\n item={cpi.item}\n />\n </H5>\n : <>Problem reading proposed item data.</>}\n </div>\n {actions.length > 0\n ? <HomeBlockActions actions={actions} />\n : null}\n </HomeBlockCard>\n })}\n </>\n );\n};\n\nfunction stringifiedJSONEqual(i1: any, i2: any): boolean {\n return JSON.stringify(i1) === JSON.stringify(i2);\n}\n\nexport default ProposalBrowser;\n"]}
|
|
1
|
+
{"version":3,"file":"ProposalBrowser.js","sourceRoot":"","sources":["../../src/proposals/ProposalBrowser.tsx"],"names":[],"mappings":"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","sourcesContent":["\n/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useCallback, useMemo } from 'react';\nimport { ClassNames, jsx, css } from '@emotion/react';\nimport { Select2 as Select } from '@blueprintjs/select';\nimport { ButtonGroup, Button, Drawer, DrawerSize } from '@blueprintjs/core';\n\nimport ErrorBoundary from '@riboseinc/paneron-extension-kit/widgets/ErrorBoundary';\n\nimport { useItemRef, itemPathToItemRef } from '../views/itemPathUtils';\nimport { BrowserCtx, type BrowserCtx as BrowserCtxType } from '../views/BrowserCtx';\nimport { Protocols, type Protocol } from '../views/protocolRegistry';\n\nimport type { Drafted } from './types';\nimport { type ChangeProposalItem, ChangeProposalItemView, getProposalIcon } from './ProposalItem';\nimport ProposalSummary from './ProposalSummary';\nimport ProposalDetail from './ProposalDetail';\n\n\ninterface ProposalBrowserProps<CR extends Drafted> {\n proposals: CR['items']\n\n selectedItem?: (string & keyof CR['items']) | null\n onSelectItem: (selectedItem: (string & keyof CR['items']) | null) => void\n\n /**\n * If provided, button to delete each proposed change\n * is shown in change card list mode.\n */\n onDeleteProposalForItemAtPath?: (itemPath: string) => void\n}\n/**\n * Shows a list of individual proposed changes as cards by default,\n * allowing to expand a proposal and view item details.\n *\n * If no proposals exist, returns null.\n */\nexport function ProposalBrowser<CR extends Drafted>\n({ proposals, onDeleteProposalForItemAtPath, selectedItem, onSelectItem: selectProposal }:\nProposalBrowserProps<CR>) {\n const selectedProposal = selectedItem ?? null;\n\n // TODO: Temporarily unsupported\n // (limitations of current change annotation implementation)\n //const [ showOnlyChanged, setShowOnlyChanged ] = useState(true);\n\n const outerBrowserCtx = useContext(BrowserCtx);\n const { jumpTo, subregisters, useRegisterItemData } = outerBrowserCtx;\n\n /**\n * When jumping to an item affected by current CR,\n * jump in-CR instead of spawning tab.\n */\n const handleCRJump = useCallback(function _handleCRJump(uri: `${Protocol}:${string}`): void {\n if (uri.startsWith(Protocols.ITEM_DETAILS)) {\n const itemPath = uri.split(':')[1];\n if (proposals[itemPath]) {\n selectProposal(itemPath);\n } else {\n jumpTo?.(uri);\n }\n }\n }, [Object.keys(proposals), jumpTo]);\n\n const proposalBrowserCtx: BrowserCtxType = useMemo((() => ({\n ...outerBrowserCtx,\n jumpTo: handleCRJump,\n })), [handleCRJump, outerBrowserCtx]);\n\n /** Paths of register items in proposal. */\n const proposedItemPaths = Object.entries(proposals).map(([itemPath, proposal]) => {\n if (proposal.type === 'clarification' || proposal.type === 'addition') {\n return itemPath;\n } else {\n return undefined;\n }\n }).filter(s => s !== undefined) as string[];\n\n /** Proposed data of register items in proposal. */\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: proposedItemPaths,\n });\n\n /** Pre-existing data of register items in proposal. */\n const currentItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposals),\n ignoreActiveCR: true,\n });\n\n const getCurrentItem = useCallback(\n ((itemPath: string) => currentItemDataReq.value[itemPath] ?? null),\n [currentItemDataReq.value]);\n const getProposedItem = useCallback(\n ((itemPath: string) => proposedItemDataReq.value[itemPath] ?? null),\n [proposedItemDataReq.value]);\n\n /** Current register item (if any) corresponding to selected proposal. */\n const selectedItemCurrent = selectedProposal ? getCurrentItem(selectedProposal) : null;\n\n /** Proposed register item corresponding to selected proposal. */\n const selectedItemProposed = selectedProposal ? getProposedItem(selectedProposal) : null;\n\n const selectedItemRef = useItemRef(subregisters !== undefined, selectedProposal);\n\n const handleItemSelect = useCallback(\n ((item: ChangeProposalItem) => selectProposal(item.itemPath)),\n [selectProposal]);\n\n const activeItem: ChangeProposalItem | null = useMemo((() =>\n selectedProposal\n ? ({\n itemPath: selectedProposal,\n proposal: proposals[selectedProposal],\n item: (selectedItemProposed ?? selectedItemCurrent)!,\n itemBefore: selectedItemCurrent ?? undefined,\n itemRef: itemPathToItemRef(subregisters !== undefined, selectedProposal),\n })\n : null\n ), [selectedProposal, proposals, subregisters]);\n\n const allItems: ChangeProposalItem[] = useMemo((() =>\n Object.entries(proposals).map(([itemPath, proposal]) => ({\n itemPath,\n proposal,\n item: (getProposedItem(itemPath) ?? getCurrentItem(itemPath))! ?? null,\n itemBefore: undefined,\n itemRef: itemPathToItemRef(subregisters !== undefined, itemPath),\n }))\n ), [proposals, getCurrentItem, getProposedItem, subregisters !== undefined]);\n\n const haveSelectedItem =\n selectedProposal\n && selectedItemRef\n && proposals[selectedProposal]\n && (selectedItemProposed || selectedItemCurrent);\n\n const proposalCount = Object.keys(proposals).length;\n\n //useEffect(() => {\n // // if (!selectedProposal) {\n // // const firstProposal = Object.keys(proposals)[0];\n // // if (firstProposal) {\n // // if (getCurrentItem(firstProposal) || getProposedItem(firstProposal)) {\n // // selectProposal(firstProposal);\n // // }\n // // }\n // // }\n // if (selectedProposal) {\n // if (selectedProposalDetailRef.current) {\n // selectedProposalDetailRef.current.scrollIntoView({ block: 'center' });\n // }\n // }\n //}, [selectedProposal === null]);\n\n const selectedItemSummary = haveSelectedItem\n ? <ProposalSummary\n itemRef={selectedItemRef}\n item={(selectedItemProposed ?? selectedItemCurrent)!}\n itemBefore={selectedItemCurrent ?? undefined}\n proposal={proposals[selectedProposal]}\n />\n : <>Select item…</>;\n const icon = haveSelectedItem\n ? getProposalIcon(proposals[selectedProposal])\n : undefined;\n\n const selectedItemDrawer = useMemo((() =>\n <Drawer\n isOpen={proposalCount > 0 && haveSelectedItem ? true : false}\n onClose={() => selectProposal(null)}\n size={DrawerSize.LARGE}\n enforceFocus={false}>\n {proposalCount > 0 && haveSelectedItem\n ? <>\n <ButtonGroup>\n <Button\n disabled={!jumpTo || proposals[selectedProposal]?.type === 'addition'}\n icon='open-application'\n onClick={() => jumpTo?.(`${Protocols.ITEM_DETAILS}:${selectedProposal}`)}\n title=\"Open selected item in a new tab (not applicable to proposed additions)\"\n />\n <ClassNames>\n {(({ css: css2 }) =>\n <Select<ChangeProposalItem>\n filterable={false}\n itemsEqual={stringifiedJSONEqual}\n menuProps={{ className: css2(`max-height: 50vh; overflow-y: auto;`) }}\n activeItem={activeItem}\n items={allItems}\n popoverProps={{ minimal: true, matchTargetWidth: true }}\n fill\n itemRenderer={ChangeProposalItemView}\n onItemSelect={handleItemSelect}>\n <Button\n fill\n rightIcon=\"chevron-down\"\n icon={icon}\n title=\"Switch between items in this proposal\"\n css={css`white-space: nowrap;`}>\n {selectedItemSummary}\n </Button>\n </Select>\n )}\n </ClassNames>\n <Button\n onClick={() => selectProposal(null)}\n icon=\"minimize\"\n title=\"Minimize proposed change view\"\n text=\"Minimize\"\n />\n </ButtonGroup>\n <div css={css`position: relative; flex: 1;`}>\n <BrowserCtx.Provider value={proposalBrowserCtx}>\n <ErrorBoundary viewName=\"Proposal detail\">\n <ProposalDetail\n itemRef={selectedItemRef}\n //showOnlyChanged={showOnlyChanged}\n item={(selectedItemProposed ?? selectedItemCurrent)!}\n itemBefore={selectedItemCurrent ?? undefined}\n proposal={proposals[selectedProposal]}\n />\n </ErrorBoundary>\n </BrowserCtx.Provider>\n </div>\n </>\n : null}\n </Drawer>\n ), [proposalCount > 0, haveSelectedItem, selectedItemProposed, selectedItemCurrent, jumpTo, handleItemSelect, selectedProposal && proposals[selectedProposal]]);\n\n return (\n <>\n {selectedItemDrawer}\n </>\n );\n};\n\nfunction stringifiedJSONEqual(i1: any, i2: any): boolean {\n return JSON.stringify(i1) === JSON.stringify(i2);\n}\n\nexport default ProposalBrowser;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProposalDetail.js","sourceRoot":"","sources":["../../src/proposals/ProposalDetail.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,kBAAkB,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAK1D,MAAM,CAAC,MAAM,cAAc,GAC3B,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;;IACzF,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAA,OAAO,CAAC,OAAO,mCAAI,sBAAsB,CAAC,CAAC;IAEhF,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;KAC7D;IAED,MAAM,IAAI,GAAgB,QAAQ;QAChC,CAAC,CAAC,IAAC,iBAAiB,IAChB,KAAK,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,EACvB,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,GAAG,CAAA;;;;gCAIgB,MAAM,CAAC,UAAU;;SAExC,EACD,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,GAC3D;QACJ,CAAC,CAAC,IAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAC5B,aAAa,SACb,CAAC;IAEP,OAAO,aAAK,GAAG,EAAE,GAAG,CAAA,iEAAiE,IAClF,IAAI,CACD,CAAC;AACT,CAAC,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Classes, Colors } from '@blueprintjs/core';\n\nimport { InlineDiffGeneric } from '../views/diffing/InlineDiff';\nimport useItemClassConfig from '../views/hooks/useItemClassConfig';\nimport { ItemDetail } from '../views/detail/RegisterItem';\n\nimport type { ProposalProps, ChangeProposal } from './types';\n\n\nexport const ProposalDetail: React.FC<ProposalProps<ChangeProposal>> =\nmemo(function ({ proposal, showDiff, showOnlyChanged, itemRef, item, itemBefore, onChange }) {\n const itemClass = useItemClassConfig(itemRef.classID ?? 'NONEXISTENT_CLASS_ID');\n\n if (!itemClass) {\n throw new Error(`Unknown item class “${itemRef.classID}”!`);\n }\n\n const view: JSX.Element = showDiff\n ? <InlineDiffGeneric\n item1={itemBefore ?? {}}\n item2={item}\n css={css`\n position: absolute; inset: 0; padding: 10px; overflow: auto;\n background-color: white;\n .bp4-dark & {\n background-color: ${Colors.DARK_GRAY2};\n }\n `}\n className={`${Classes.ELEVATION_2} ${Classes.RUNNING_TEXT}`}\n />\n : <ItemDetail\n itemRef={itemRef}\n item={item}\n itemClass={itemClass}\n key={JSON.stringify(itemRef)}\n compactHeader\n />;\n\n return <div css={css`position: absolute; inset: 0; display: flex; flex-flow: column;`}>\n {view}\n </div>;\n});\n\nexport default ProposalDetail;\n"]}
|
|
1
|
+
{"version":3,"file":"ProposalDetail.js","sourceRoot":"","sources":["../../src/proposals/ProposalDetail.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,kBAAkB,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAK1D,MAAM,CAAC,MAAM,cAAc,GAC3B,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE;;IACzF,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAA,OAAO,CAAC,OAAO,mCAAI,sBAAsB,CAAC,CAAC;IAEhF,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;KAC7D;IAED,MAAM,IAAI,GAAgB,QAAQ;QAChC,CAAC,CAAC,IAAC,iBAAiB,IAChB,KAAK,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE,EACvB,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,GAAG,CAAA;;;;gCAIgB,MAAM,CAAC,UAAU;;SAExC,EACD,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,GAC3D;QACJ,CAAC,CAAC,IAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAC5B,aAAa,SACb,CAAC;IAEP,OAAO,aAAK,GAAG,EAAE,GAAG,CAAA,iEAAiE,IAClF,IAAI,CACD,CAAC;AACT,CAAC,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Classes, Colors } from '@blueprintjs/core';\n\nimport { InlineDiffGeneric } from '../views/diffing/InlineDiff';\nimport useItemClassConfig from '../views/hooks/useItemClassConfig';\nimport { ItemDetail } from '../views/detail/RegisterItem';\n\nimport type { ProposalProps, ChangeProposal } from './types';\n\n\nexport const ProposalDetail: React.FC<ProposalProps<ChangeProposal>> =\nmemo(function ({ proposal, showDiff, showOnlyChanged, itemRef, item, itemBefore, onChange }) {\n const itemClass = useItemClassConfig(itemRef.classID ?? 'NONEXISTENT_CLASS_ID');\n\n if (!itemClass) {\n throw new Error(`Unknown item class “${itemRef.classID}”!`);\n }\n\n const view: JSX.Element = showDiff\n ? <InlineDiffGeneric\n item1={itemBefore ?? {}}\n item2={item}\n css={css`\n position: absolute; inset: 0; padding: 10px; overflow: auto;\n background-color: white;\n .bp4-dark & {\n background-color: ${Colors.DARK_GRAY2};\n }\n `}\n className={`${Classes.ELEVATION_2} ${Classes.RUNNING_TEXT}`}\n />\n : <ItemDetail\n itemRef={itemRef}\n item={item}\n itemBefore={itemBefore}\n itemClass={itemClass}\n key={JSON.stringify(itemRef)}\n compactHeader\n />;\n\n return <div css={css`position: absolute; inset: 0; display: flex; flex-flow: column;`}>\n {view}\n </div>;\n});\n\nexport default ProposalDetail;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProposalItem.js","sourceRoot":"","sources":["../../src/proposals/ProposalItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAI9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAiB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ5D,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAU1C,MAAM,CAAC,MAAM,sBAAsB,GACnC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;QACtB,MAAM,CAAC,GAAG,IAAwD,CAAC;QACnE,OAAO,CACL,IAAC,QAAQ,IACP,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,YAAY,EAAE,IAAC,YAAY,IAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAI,EACpD,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpC,IAAI,EAAE,IAAC,eAAe,OAAK,CAAC,GAAI,
|
|
1
|
+
{"version":3,"file":"ProposalItem.js","sourceRoot":"","sources":["../../src/proposals/ProposalItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAI9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAiB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ5D,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAU1C,MAAM,CAAC,MAAM,sBAAsB,GACnC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;QACtB,MAAM,CAAC,GAAG,IAAwD,CAAC;QACnE,OAAO,CACL,IAAC,QAAQ,IACP,MAAM,EAAE,SAAS,CAAC,MAAM,EACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,YAAY,EAAE,IAAC,YAAY,IAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,GAAI,EACpD,GAAG,EAAE,IAAI,CAAC,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpC,IAAI,EAAE,IAAC,eAAe,OAAK,CAAC,GAAI,GAChC,CACH,CAAC;KACH;SAAM;QACL,OAAO,IAAC,QAAQ,IACd,QAAQ,QACR,IAAI,EAAC,cAAc,EACnB,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,iCAAiC,IAAI,CAAC,QAAQ,EAAE,GACtD,CAAA;KACH;AACH,CAAC,CAAC;AAEF,eAAe,sBAAsB,CAAC;AAGtC,MAAM,UAAU,eAAe,CAAC,QAAwB;IACtD,OAAO,QAAQ,CAAC,IAAI,KAAK,UAAU;QAC/B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,eAAe;YACjC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,YAAY,CAAC;AACvB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import React from 'react';\nimport { type ItemRenderer } from '@blueprintjs/select';\nimport { jsx } from '@emotion/react';\nimport { type IconName, MenuItem } from '@blueprintjs/core';\nimport type {\n InternalItemReference,\n Payload,\n RegisterItem,\n} from '../types';\nimport type { ChangeProposal } from './types';\n\nimport ProposalSummary from './ProposalSummary';\nimport ProposalType from './ProposalType';\n\nexport interface ChangeProposalItem {\n itemPath: string\n itemRef: InternalItemReference\n proposal: ChangeProposal\n item: RegisterItem<Payload> | null\n itemBefore: RegisterItem<Payload> | undefined\n}\n\nexport const ChangeProposalItemView: ItemRenderer<ChangeProposalItem> =\n(item, { handleClick, modifiers, query }) => {\n if (item.item !== null) {\n const i = item as ChangeProposalItem & { item: RegisterItem<any> };\n return (\n <MenuItem\n active={modifiers.active}\n disabled={modifiers.disabled}\n labelElement={<ProposalType proposal={i.proposal} />}\n key={item.itemPath}\n onClick={handleClick}\n icon={getProposalIcon(item.proposal)}\n text={<ProposalSummary {...i} />}\n />\n );\n } else {\n return <MenuItem\n disabled\n icon=\"heart-broken\"\n onClick={handleClick}\n text={`Broken proposal entry at path ${item.itemPath}`}\n />\n }\n};\n\nexport default ChangeProposalItemView;\n\n\nexport function getProposalIcon(proposal: ChangeProposal): IconName {\n return proposal.type === 'addition'\n ? 'add'\n : proposal.type === 'clarification'\n ? 'edit'\n : 'ban-circle';\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { Register, RegisterStakeholder } from '../types';
|
|
5
|
+
import { type SomeCR as CR } from './types';
|
|
6
|
+
declare const ProposalTab: React.VoidFunctionComponent<{
|
|
7
|
+
proposal: CR;
|
|
8
|
+
onDelete?: () => void;
|
|
9
|
+
register: Register;
|
|
10
|
+
stakeholder?: RegisterStakeholder;
|
|
11
|
+
}>;
|
|
12
|
+
export default ProposalTab;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _util = require("../views/util");
|
|
15
|
+
|
|
16
|
+
var _types = require("./types");
|
|
17
|
+
|
|
18
|
+
var _ProposalWorkspace = _interopRequireDefault(require("./ProposalWorkspace"));
|
|
19
|
+
|
|
20
|
+
var _ProposalBrowser = _interopRequireDefault(require("./ProposalBrowser"));
|
|
21
|
+
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
+
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
+
|
|
28
|
+
/** @jsx jsx */
|
|
29
|
+
|
|
30
|
+
/** @jsxFrag React.Fragment */
|
|
31
|
+
const ProposalTab = function ({
|
|
32
|
+
proposal,
|
|
33
|
+
onDelete,
|
|
34
|
+
register,
|
|
35
|
+
stakeholder
|
|
36
|
+
}) {
|
|
37
|
+
const pending = !(0, _types.isDisposed)(proposal);
|
|
38
|
+
const proposedMarker = (0, _react2.jsx)(_react.default.Fragment, null, "Proposed: ", (0, _types.hadBeenProposed)(proposal) ? (0, _react2.jsx)(_util.Datestamp, {
|
|
39
|
+
date: proposal.timeProposed
|
|
40
|
+
}) : 'not yet');
|
|
41
|
+
const disposedMarker = (0, _react2.jsx)(_react.default.Fragment, null, "Disposed: ", !pending ? (0, _react2.jsx)(_util.Datestamp, {
|
|
42
|
+
date: proposal.timeDisposed
|
|
43
|
+
}) : 'not yet');
|
|
44
|
+
const editedMarker = (0, _react2.jsx)(_react.default.Fragment, null, "Edited: ", (0, _react2.jsx)(_util.Datestamp, {
|
|
45
|
+
date: proposal.timeEdited
|
|
46
|
+
}));
|
|
47
|
+
const classification = (0, _react.useMemo)(() => {
|
|
48
|
+
var _a;
|
|
49
|
+
|
|
50
|
+
return [{
|
|
51
|
+
icon: 'lightbulb',
|
|
52
|
+
children: "Proposal",
|
|
53
|
+
tooltip: {
|
|
54
|
+
icon: 'info-sign',
|
|
55
|
+
content: (0, _react2.jsx)(_core.UL, {
|
|
56
|
+
css: (0, _react2.css)`margin: 0;`
|
|
57
|
+
}, (0, _react2.jsx)("li", null, "Proposal ID: ", proposal.id))
|
|
58
|
+
}
|
|
59
|
+
}, {
|
|
60
|
+
children: pending ? (0, _react2.jsx)(_react.default.Fragment, null, "pending") : (0, _react2.jsx)(_react.default.Fragment, null, "disposed")
|
|
61
|
+
}, {
|
|
62
|
+
children: ((_a = proposal.state) === null || _a === void 0 ? void 0 : _a.replaceAll('-', ' ')) || 'N/A',
|
|
63
|
+
tooltip: {
|
|
64
|
+
icon: 'history',
|
|
65
|
+
content: (0, _react2.jsx)(_core.UL, {
|
|
66
|
+
css: (0, _react2.css)`margin: 0;`
|
|
67
|
+
}, (0, _react2.jsx)("li", null, editedMarker), (0, _react2.jsx)("li", null, proposedMarker), (0, _react2.jsx)("li", null, disposedMarker))
|
|
68
|
+
},
|
|
69
|
+
intent: proposal.state === 'accepted' ? 'success' : proposal.state === 'returned-for-clarification' ? 'warning' : proposal.state === 'withdrawn' || proposal.state === 'rejected' ? 'danger' : proposal.state === 'draft' ? undefined : 'primary'
|
|
70
|
+
}];
|
|
71
|
+
}, [proposal.state, pending, editedMarker, proposedMarker, disposedMarker]);
|
|
72
|
+
const [selectedItem, selectItem] = (0, _react.useState)(null);
|
|
73
|
+
const actions = (0, _react.useMemo)(() => {
|
|
74
|
+
const actions = [];
|
|
75
|
+
|
|
76
|
+
if (onDelete) {
|
|
77
|
+
actions.push({
|
|
78
|
+
text: "Delete this proposal",
|
|
79
|
+
onClick: onDelete
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return actions;
|
|
84
|
+
}, [onDelete]);
|
|
85
|
+
return (0, _react2.jsx)(_util.TabContentsWithHeader, {
|
|
86
|
+
title: (0, _react2.jsx)(_react.default.Fragment, null, proposal.justification),
|
|
87
|
+
classification: classification,
|
|
88
|
+
actions: actions
|
|
89
|
+
}, (0, _react2.jsx)(_ProposalWorkspace.default, {
|
|
90
|
+
proposal: proposal,
|
|
91
|
+
register: register,
|
|
92
|
+
stakeholder: stakeholder,
|
|
93
|
+
onOpenItem: selectItem
|
|
94
|
+
}), (0, _react2.jsx)(_ProposalBrowser.default, {
|
|
95
|
+
proposals: proposal.items,
|
|
96
|
+
onSelectItem: selectItem,
|
|
97
|
+
selectedItem: selectedItem
|
|
98
|
+
}));
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
var _default = ProposalTab;
|
|
102
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProposalTab.js","sourceRoot":"","sources":["../../src/proposals/ProposalTab.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n UL,\n type Intent,\n type IconName,\n} from '@blueprintjs/core';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport { TabContentsWithHeader, Datestamp } from '../views/util';\nimport { type SomeCR as CR, isDisposed, hadBeenProposed } from './types';\n\nimport Workspace from './ProposalWorkspace';\nimport ProposalBrowser from './ProposalBrowser';\n\n\nconst ProposalTab: React.VoidFunctionComponent<{\n proposal: CR\n onDelete?: () => void\n register: Register\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, onDelete, register, stakeholder }) {\n const pending = !isDisposed(proposal);\n const proposedMarker = <>\n Proposed: {hadBeenProposed(proposal)\n ? <Datestamp date={proposal.timeProposed} />\n : 'not yet'}\n </>;\n const disposedMarker = <>\n Disposed: {!pending\n ? <Datestamp date={proposal.timeDisposed} />\n : 'not yet'}\n </>;\n const editedMarker = <>Edited: <Datestamp date={proposal.timeEdited} /></>;\n const classification = useMemo(() => {\n return [{\n icon: 'lightbulb' as IconName,\n children: \"Proposal\",\n tooltip: {\n icon: 'info-sign' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>Proposal ID: {proposal.id}</li>\n </UL>,\n },\n }, {\n children: pending\n ? <>pending</>\n : <>disposed</>,\n }, {\n children: proposal.state?.replaceAll('-', ' ') || 'N/A',\n tooltip: {\n icon: 'history' as IconName,\n content: <UL css={css`margin: 0;`}>\n <li>{editedMarker}</li>\n <li>{proposedMarker}</li>\n <li>{disposedMarker}</li>\n </UL>,\n },\n intent: proposal.state === 'accepted'\n ? 'success'\n : proposal.state === 'returned-for-clarification'\n ? 'warning'\n : proposal.state === 'withdrawn' || proposal.state === 'rejected'\n ? 'danger'\n : proposal.state === 'draft'\n ? undefined\n : 'primary' as Intent,\n }];\n }, [\n proposal.state,\n pending,\n editedMarker, proposedMarker, disposedMarker,\n ]);\n\n const [selectedItem, selectItem] = useState<string | null>(null);\n\n const actions = useMemo(() => {\n const actions = [];\n if (onDelete) {\n actions.push({\n text: \"Delete this proposal\",\n onClick: onDelete,\n });\n }\n return actions;\n }, [onDelete]);\n\n return (\n <TabContentsWithHeader\n title={<>{proposal.justification}</>}\n classification={classification}\n actions={actions}>\n <Workspace\n proposal={proposal}\n register={register}\n stakeholder={stakeholder}\n onOpenItem={selectItem}\n />\n <ProposalBrowser\n proposals={proposal.items}\n onSelectItem={selectItem}\n selectedItem={selectedItem}\n />\n </TabContentsWithHeader>\n );\n\n};\n\nexport default ProposalTab;\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { Register, RegisterStakeholder } from '../types';
|
|
5
|
+
import { type SomeCR as CR } from './types';
|
|
6
|
+
declare const ProposalWorkspace: React.VoidFunctionComponent<{
|
|
7
|
+
proposal: CR;
|
|
8
|
+
register: Register;
|
|
9
|
+
stakeholder?: RegisterStakeholder;
|
|
10
|
+
/** If not specified, opening an item will spawn its tab. */
|
|
11
|
+
onOpenItem?: (itemPath: string | null) => void;
|
|
12
|
+
}>;
|
|
13
|
+
export default ProposalWorkspace;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _DL = require("@riboseinc/paneron-extension-kit/widgets/DL");
|
|
15
|
+
|
|
16
|
+
var _Workspace = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/Workspace"));
|
|
17
|
+
|
|
18
|
+
var _SuperSidebar = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar"));
|
|
19
|
+
|
|
20
|
+
var _util = require("../views/util");
|
|
21
|
+
|
|
22
|
+
var _models = require("../views/FilterCriteria/models");
|
|
23
|
+
|
|
24
|
+
var _MetaProperties = _interopRequireDefault(require("./MetaProperties"));
|
|
25
|
+
|
|
26
|
+
var _Search = _interopRequireDefault(require("./Search"));
|
|
27
|
+
|
|
28
|
+
var _Search2 = _interopRequireDefault(require("../views/sidebar/Search"));
|
|
29
|
+
|
|
30
|
+
var _TransitionOptions = _interopRequireWildcard(require("./TransitionOptions"));
|
|
31
|
+
|
|
32
|
+
var _TransitionHistory = _interopRequireWildcard(require("./TransitionHistory"));
|
|
33
|
+
|
|
34
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
35
|
+
|
|
36
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
37
|
+
|
|
38
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
39
|
+
|
|
40
|
+
/** @jsx jsx */
|
|
41
|
+
|
|
42
|
+
/** @jsxFrag React.Fragment */
|
|
43
|
+
const SIDEBAR_IDS = ['meta'];
|
|
44
|
+
|
|
45
|
+
const ProposalWorkspace = function ({
|
|
46
|
+
proposal,
|
|
47
|
+
register,
|
|
48
|
+
stakeholder,
|
|
49
|
+
onOpenItem
|
|
50
|
+
}) {
|
|
51
|
+
const sidebarConfig = (0, _react.useMemo)(() => {
|
|
52
|
+
var _a;
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
meta: {
|
|
56
|
+
icon: () => (0, _react2.jsx)(_core.Icon, {
|
|
57
|
+
icon: "document"
|
|
58
|
+
}),
|
|
59
|
+
title: "Meta",
|
|
60
|
+
blocks: [{
|
|
61
|
+
key: 'summary',
|
|
62
|
+
title: "Summary",
|
|
63
|
+
content: (0, _react2.jsx)("div", {
|
|
64
|
+
css: (0, _react2.css)`padding: 0 5px;`
|
|
65
|
+
}, "\u201C", (_a = proposal.justification) === null || _a === void 0 ? void 0 : _a.trim(), "\u201D", (0, _react2.jsx)("br", null), (0, _react2.jsx)(_DL.WrappableDL, null, (0, _react2.jsx)(_MetaProperties.default, {
|
|
66
|
+
cr: proposal,
|
|
67
|
+
currentStakeholder: stakeholder,
|
|
68
|
+
registerMetadata: register
|
|
69
|
+
})))
|
|
70
|
+
}, {
|
|
71
|
+
key: 'transitions',
|
|
72
|
+
title: "Transitions",
|
|
73
|
+
content: (0, _react2.jsx)(TransitionBlockContents, {
|
|
74
|
+
proposal: proposal,
|
|
75
|
+
stakeholder: stakeholder
|
|
76
|
+
})
|
|
77
|
+
}]
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}, [register, stakeholder, proposal]);
|
|
81
|
+
return (0, _react2.jsx)(_Workspace.default, {
|
|
82
|
+
sidebarPosition: "right",
|
|
83
|
+
sidebar: (0, _react2.jsx)(_SuperSidebar.default, {
|
|
84
|
+
sidebarIDs: SIDEBAR_IDS,
|
|
85
|
+
css: (0, _react2.css)`width: 30% !important; min-width: 300px;`,
|
|
86
|
+
selectedSidebarID: 'meta',
|
|
87
|
+
config: sidebarConfig
|
|
88
|
+
})
|
|
89
|
+
}, (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, "Working on proposal ", proposal.justification)), (0, _react2.jsx)("div", {
|
|
90
|
+
css: (0, _react2.css)`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`
|
|
91
|
+
}, (0, _react2.jsx)(_Search2.default, {
|
|
92
|
+
css: (0, _react2.css)`flex: 1;`,
|
|
93
|
+
//style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
|
|
94
|
+
implicitCriteria: _models.MATCHES_ANY_CRITERIA,
|
|
95
|
+
stateName: `proposal-${proposal.id}-search`,
|
|
96
|
+
List: _Search.default,
|
|
97
|
+
extraData: {
|
|
98
|
+
proposal
|
|
99
|
+
},
|
|
100
|
+
onOpenItem: onOpenItem
|
|
101
|
+
})));
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
var _default = ProposalWorkspace;
|
|
105
|
+
exports.default = _default;
|
|
106
|
+
|
|
107
|
+
const TransitionBlockContents = function ({
|
|
108
|
+
proposal,
|
|
109
|
+
stakeholder
|
|
110
|
+
}) {
|
|
111
|
+
const transitions = (0, _react.useMemo)(() => stakeholder ? (0, _TransitionOptions.getTransitions)(proposal, stakeholder) : [], [proposal, stakeholder]);
|
|
112
|
+
const [showDetailedHistory, setShowDetailedHistory] = (0, _react.useState)(false);
|
|
113
|
+
const transitionsBlock = (0, _react.useMemo)(() => (0, _react2.jsx)("div", {
|
|
114
|
+
css: (0, _react2.css)`overflow-y: auto; max-height: 300px;`
|
|
115
|
+
}, (0, _react2.jsx)(_core.Checkbox // NOTE: left margin aligns with transition history bullets…
|
|
116
|
+
, {
|
|
117
|
+
// NOTE: left margin aligns with transition history bullets…
|
|
118
|
+
css: (0, _react2.css)`margin: 5px 15px;`,
|
|
119
|
+
checked: showDetailedHistory,
|
|
120
|
+
onChange: evt => setShowDetailedHistory(evt.currentTarget.checked)
|
|
121
|
+
}, "Show detailed history"), (0, _react2.jsx)(_TransitionHistory.default, {
|
|
122
|
+
pastTransitions: (0, _TransitionHistory.getTransitionHistory)(proposal),
|
|
123
|
+
isFinal: (0, _TransitionOptions.isFinalState)(proposal.state),
|
|
124
|
+
detailed: showDetailedHistory
|
|
125
|
+
}), !showDetailedHistory && transitions.length > 0 ? (0, _react2.jsx)(_TransitionOptions.default, {
|
|
126
|
+
stakeholder: stakeholder,
|
|
127
|
+
transitions: transitions,
|
|
128
|
+
cr: proposal,
|
|
129
|
+
css: (0, _react2.css)`padding: 12px;`
|
|
130
|
+
}) : null), [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);
|
|
131
|
+
return transitionsBlock;
|
|
132
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProposalWorkspace.js","sourceRoot":"","sources":["../../src/proposals/ProposalWorkspace.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useMemo, useState } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport {\n Icon,\n Checkbox,\n} from '@blueprintjs/core';\n\nimport { WrappableDL as DL } from '@riboseinc/paneron-extension-kit/widgets/DL';\nimport Workspace from '@riboseinc/paneron-extension-kit/widgets/Workspace';\nimport SuperSidebar from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/SuperSidebar';\n\nimport type { Register, RegisterStakeholder } from '../types';\nimport { RegisterHelmet as Helmet } from '../views/util';\nimport { MATCHES_ANY_CRITERIA } from '../views/FilterCriteria/models';\nimport { type SomeCR as CR } from './types';\nimport MetaProperties from './MetaProperties';\nimport ProposalSearch from './Search';\nimport Search from '../views/sidebar/Search';\nimport TransitionOptions, { getTransitions, isFinalState } from './TransitionOptions';\nimport TransitionsAndStatus, { getTransitionHistory } from './TransitionHistory';\n\n\nconst SIDEBAR_IDS = ['meta'] as const;\n\n\nconst ProposalWorkspace: React.VoidFunctionComponent<{\n proposal: CR\n register: Register\n stakeholder?: RegisterStakeholder\n\n /** If not specified, opening an item will spawn its tab. */\n onOpenItem?: (itemPath: string | null) => void\n}> = function ({ proposal, register, stakeholder, onOpenItem }) {\n const sidebarConfig = useMemo(() => {\n return {\n meta: {\n icon: () => <Icon icon=\"document\" />,\n title: \"Meta\",\n blocks: [{\n key: 'summary',\n title: \"Summary\",\n content: <div css={css`padding: 0 5px;`}>\n “{proposal.justification?.trim()}”\n <br />\n <DL>\n <MetaProperties\n cr={proposal}\n currentStakeholder={stakeholder}\n registerMetadata={register}\n />\n </DL>\n </div>,\n }, {\n key: 'transitions',\n title: \"Transitions\",\n content: <TransitionBlockContents\n proposal={proposal}\n stakeholder={stakeholder}\n />,\n }],\n },\n };\n }, [register, stakeholder, proposal]);\n return (\n <Workspace sidebarPosition=\"right\" sidebar={\n <SuperSidebar\n sidebarIDs={SIDEBAR_IDS}\n css={css`width: 30% !important; min-width: 300px;`}\n selectedSidebarID='meta'\n config={sidebarConfig}\n />\n }>\n <Helmet><title>Working on proposal {proposal.justification}</title></Helmet>\n <div css={css`padding: 10px; flex: 1; display: flex; flex-flow: column nowrap; overflow: hidden;`}>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n implicitCriteria={MATCHES_ANY_CRITERIA}\n stateName={`proposal-${proposal.id}-search`}\n List={ProposalSearch as any}\n extraData={{ proposal }}\n onOpenItem={onOpenItem}\n />\n </div>\n </Workspace>\n );\n};\n\nexport default ProposalWorkspace;\n\n\nconst TransitionBlockContents: React.VoidFunctionComponent<{\n proposal: CR\n stakeholder?: RegisterStakeholder\n}> = function ({ proposal, stakeholder }) {\n const transitions = useMemo(\n (() => stakeholder\n ? getTransitions(proposal, stakeholder)\n : []),\n [proposal, stakeholder]);\n\n const [showDetailedHistory, setShowDetailedHistory] = useState(false);\n\n const transitionsBlock = useMemo(\n (() =>\n <div css={css`overflow-y: auto; max-height: 300px;`}>\n <Checkbox\n // NOTE: left margin aligns with transition history bullets…\n css={css`margin: 5px 15px;`}\n checked={showDetailedHistory}\n onChange={(evt) => setShowDetailedHistory(evt.currentTarget.checked)}>\n Show detailed history\n </Checkbox>\n <TransitionsAndStatus\n pastTransitions={getTransitionHistory(proposal)}\n isFinal={isFinalState(proposal.state)}\n detailed={showDetailedHistory}\n />\n {!showDetailedHistory && transitions.length > 0\n ? <TransitionOptions\n stakeholder={stakeholder}\n transitions={transitions}\n cr={proposal}\n css={css`padding: 12px;`}\n />\n : null}\n </div>),\n [proposal, transitions, setShowDetailedHistory, showDetailedHistory]);\n\n return transitionsBlock;\n}\n"]}
|
package/proposals/Search.js
CHANGED
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.ProposalSearchResultList = void 0;
|
|
7
7
|
|
|
8
|
-
var _react = require("react");
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
|
|
10
10
|
var _react2 = require("@emotion/react");
|
|
11
11
|
|
|
@@ -38,12 +38,12 @@ const ProposalItem = function ({
|
|
|
38
38
|
const registerItem = (_a = extraData.extraItemViewData.itemData[itemPath]) !== null && _a !== void 0 ? _a : null;
|
|
39
39
|
const itemRef = (0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, itemPath);
|
|
40
40
|
const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);
|
|
41
|
-
const ListItemView = clsConfig.itemView;
|
|
41
|
+
const ListItemView = clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.itemView;
|
|
42
42
|
const itemPayload = (_b = registerItem === null || registerItem === void 0 ? void 0 : registerItem.data) !== null && _b !== void 0 ? _b : null;
|
|
43
|
-
const itemView = itemPayload ? (0, _react2.jsx)(ListItemView, {
|
|
43
|
+
const itemView = itemPayload && ListItemView ? (0, _react2.jsx)(_react.default.Fragment, null, clsConfig.title, "\u2003", (0, _react2.jsx)(ListItemView, {
|
|
44
44
|
itemData: itemPayload,
|
|
45
45
|
itemRef: itemRef
|
|
46
|
-
}) : (0, _react2.jsx)("span", {
|
|
46
|
+
})) : (0, _react2.jsx)("span", {
|
|
47
47
|
css: (0, _react2.css)`opacity: .4`
|
|
48
48
|
}, "(missing item data at ", itemPath, ")");
|
|
49
49
|
return (0, _react2.jsx)(_List.LabelledListIcon, {
|
|
@@ -67,19 +67,31 @@ const ProposalSearchResultList = (0, _react.memo)(function ({
|
|
|
67
67
|
className
|
|
68
68
|
}) {
|
|
69
69
|
const {
|
|
70
|
-
useRegisterItemData
|
|
70
|
+
useRegisterItemData,
|
|
71
|
+
keyExpression
|
|
71
72
|
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
72
73
|
const proposal = extraItemViewData.proposal;
|
|
73
74
|
const expressionParsed = new Function('objPath', 'obj', queryExpression);
|
|
75
|
+
const keyExpressionParsed = keyExpression ? new Function('obj', `return ${keyExpression}`) : null;
|
|
74
76
|
const proposedItemDataReq = useRegisterItemData({
|
|
75
77
|
itemPaths: Object.keys(proposal.items)
|
|
76
78
|
});
|
|
77
79
|
const itemData = proposedItemDataReq.value;
|
|
78
80
|
const predicate = (0, _react.useCallback)(([objPath, obj]) => {
|
|
79
|
-
|
|
81
|
+
const objPathInCR = (0, _itemPathUtils.itemPathInCR)(objPath, extraItemViewData.proposal.id);
|
|
82
|
+
return expressionParsed(objPath, itemData[objPath]) || expressionParsed(objPath, obj) || expressionParsed(objPathInCR, itemData[objPath]) || expressionParsed(objPathInCR, obj);
|
|
80
83
|
}, [queryExpression, itemData]);
|
|
81
|
-
const
|
|
82
|
-
const
|
|
84
|
+
const matchingItems = Object.entries(proposal.items).filter(predicate);
|
|
85
|
+
const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating ? matchingItems.map(([p]) => {
|
|
86
|
+
try {
|
|
87
|
+
return [p, keyExpressionParsed(itemData[p])];
|
|
88
|
+
} catch (e) {
|
|
89
|
+
console.debug("Failed to run key expression", keyExpression, p, itemData[p], e);
|
|
90
|
+
return [p, p];
|
|
91
|
+
}
|
|
92
|
+
}) : matchingItems.map(([p]) => [p, p]);
|
|
93
|
+
matchingItemsWithKeys.sort((pair1, pair2) => typeof pair1[1] === 'string' ? pair1[1].localeCompare(pair2[1]) : typeof pair1[1] === 'number' ? pair1[1] - pair2[1] : 0);
|
|
94
|
+
const matchingItemIDs = matchingItemsWithKeys.map(([p]) => p);
|
|
83
95
|
const extraData = (0, _react.useMemo)(() => ({
|
|
84
96
|
extraItemViewData: {
|
|
85
97
|
proposal,
|
package/proposals/Search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../src/proposals/Search.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,
|
|
1
|
+
{"version":3,"file":"Search.js","sourceRoot":"","sources":["../../src/proposals/Search.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport makeList, { type ItemProps, LabelledListIcon, type ListData } from '@riboseinc/paneron-extension-kit/widgets/List';\n\nimport type { RegisterItem } from '../types/item';\nimport { itemPathInCR, itemPathToItemRef } from '../views/itemPathUtils';\nimport { BrowserCtx } from '../views/BrowserCtx';\n\nimport type { SomeCR } from './types';\nimport type { ChangeProposal } from './types';\n\n\nexport interface ProposalListData {\n selectedItemPath: string | null;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n}\n\nexport interface SearchResultListProps {\n queryExpression: string;\n selectedItemPath: string | null;\n onSelectItem: (itemPath: string | null) => void;\n onOpenItem?: (itemPath: string) => void;\n keyExpression?: string;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n className?: string;\n}\n\n\nconst ProposalItem: React.FC<ItemProps<ProposalListData>> =\nfunction ({ onSelect, onOpen, extraData, itemRef: itemPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n\n const proposalItem = extraData.extraItemViewData.proposal.items[itemPath];\n const registerItem = extraData.extraItemViewData.itemData[itemPath] ?? null;\n\n const itemRef = itemPathToItemRef(subregisters !== undefined, itemPath);\n\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig?.itemView;\n const itemPayload: Record<string, any> | null = registerItem?.data ?? null;\n \n const itemView = itemPayload && ListItemView\n ? <>\n {clsConfig.title}\n  \n <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n </>\n : <span css={css`opacity: .4`}>\n (missing item data at {itemPath})\n </span>;\n\n return (\n <LabelledListIcon\n isSelected={extraData.selectedItemPath === itemPath}\n onSelect={onSelect}\n onOpen={onOpen}\n //contentClassName={(isUpdating && !objData) ? Classes.SKELETON : undefined}\n entityType={{ name: proposalItem.type }}\n >\n {itemView}\n </LabelledListIcon>\n );\n};\n\nconst List = makeList<ProposalListData>(ProposalItem);\n\nexport const ProposalSearchResultList: React.FC<SearchResultListProps> =\nmemo(function ({ extraItemViewData, queryExpression, selectedItemPath, onSelectItem, onOpenItem, className }) {\n const { useRegisterItemData, keyExpression } = useContext(BrowserCtx);\n const proposal = extraItemViewData.proposal;\n\n const expressionParsed =\n new Function('objPath', 'obj', queryExpression) as (objPath: string, obj: null | RegisterItem<any> | ChangeProposal) => boolean;\n\n const keyExpressionParsed = keyExpression\n ? new Function('obj', `return ${keyExpression}`) as (obj: RegisterItem<any>) => any\n : null;\n\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposal.items),\n });\n\n const itemData = proposedItemDataReq.value;\n\n const predicate = useCallback(([objPath, obj]: [string, ChangeProposal]) => {\n const objPathInCR = itemPathInCR(objPath, extraItemViewData.proposal.id);\n return (\n expressionParsed(objPath, itemData[objPath])\n || expressionParsed(objPath, obj)\n || expressionParsed(objPathInCR, itemData[objPath])\n || expressionParsed(objPathInCR, obj)\n );\n }, [queryExpression, itemData]);\n\n const matchingItems = Object.entries(proposal.items).filter(predicate);\n\n const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating\n ? matchingItems.map(([p, ]) => {\n try {\n return [p, keyExpressionParsed(itemData[p]!)];\n } catch (e) {\n console.debug(\"Failed to run key expression\", keyExpression, p, itemData[p], e);\n return [p, p];\n }\n })\n : matchingItems.map(([p, ]) => [p, p]);\n\n matchingItemsWithKeys.sort((pair1, pair2) =>\n typeof pair1[1] === 'string'\n ? pair1[1].localeCompare(pair2[1])\n : typeof pair1[1] === 'number'\n ? pair1[1] - pair2[1]\n : 0);\n\n const matchingItemIDs = matchingItemsWithKeys.map(([p, ]) => p);\n\n const extraData: ProposalListData = useMemo((() => ({\n extraItemViewData: { proposal, itemData },\n selectedItemPath,\n })), [selectedItemPath, proposal, itemData]);\n\n const getListData = useCallback(function _getListData(): ListData<ProposalListData> | null {\n return {\n items: matchingItemIDs,\n selectedItem: selectedItemPath,\n selectItem: onSelectItem,\n openItem: onOpenItem,\n itemHeight: 32,\n padding: 0,\n extraData,\n };\n }, [matchingItemIDs.join(','), extraData, onOpenItem, onSelectItem]);\n\n return <List\n className={className}\n getListData={getListData}\n />;\n});\n\n\nexport default ProposalSearchResultList;\n"]}
|
|
@@ -55,8 +55,7 @@ const ActionableCRTree = function ({
|
|
|
55
55
|
useMapReducedData
|
|
56
56
|
} = (0, _react.useContext)(_paneronExtensionKit.DatasetContext);
|
|
57
57
|
const {
|
|
58
|
-
spawnTab
|
|
59
|
-
closeTabWithURI
|
|
58
|
+
spawnTab
|
|
60
59
|
} = (0, _react.useContext)(_context.TabbedWorkspaceContext);
|
|
61
60
|
const [state, dispatch] = usePersistentDatasetStateReducer('actionable-proposals', undefined, undefined, (prevState, action) => {
|
|
62
61
|
switch (action.type) {
|
|
@@ -121,23 +120,23 @@ const ActionableCRTree = function ({
|
|
|
121
120
|
const nodes = (0, _react.useMemo)(() => (0, _treeNodes.getActionableProposalGroupsAsTreeNodes)(actionableProposals, {
|
|
122
121
|
activeCRID: activeCR === null || activeCR === void 0 ? void 0 : activeCR.id,
|
|
123
122
|
expandedGroupLabels: new Set(state.expandedFolderIDs),
|
|
123
|
+
onActivateCR: setActiveChangeRequestID,
|
|
124
124
|
selectedGroup: state.selectedItemID ? actionableProposals.find(({
|
|
125
125
|
groupLabel
|
|
126
126
|
}) => groupLabel === state.selectedItemID) ? state.selectedItemID : undefined : undefined,
|
|
127
127
|
selectedCRID: state.selectedItemID ? actionableProposals.flatMap(({
|
|
128
128
|
proposals
|
|
129
129
|
}) => proposals !== null && proposals !== void 0 ? proposals : []).find(p => p.id === state.selectedItemID) ? state.selectedItemID : undefined : undefined
|
|
130
|
-
}), [activeCR === null || activeCR === void 0 ? void 0 : activeCR.id, actionableProposals, state.selectedItemID, state.expandedFolderIDs.join(',')]);
|
|
131
|
-
const
|
|
132
|
-
if (proposalID
|
|
133
|
-
// deactivate
|
|
134
|
-
setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(null);
|
|
135
|
-
closeTabWithURI(_protocolRegistry.Protocols.PROPOSAL_WORK);
|
|
136
|
-
} else {
|
|
137
|
-
// activate & open proposal dashboard
|
|
130
|
+
}), [activeCR === null || activeCR === void 0 ? void 0 : activeCR.id, setActiveChangeRequestID, actionableProposals, state.selectedItemID, state.expandedFolderIDs.join(',')]);
|
|
131
|
+
const activate = (0, _react.useCallback)(proposalID => {
|
|
132
|
+
if (proposalID !== (activeCR === null || activeCR === void 0 ? void 0 : activeCR.id)) {
|
|
138
133
|
setActiveChangeRequestID === null || setActiveChangeRequestID === void 0 ? void 0 : setActiveChangeRequestID(proposalID);
|
|
139
|
-
|
|
140
|
-
|
|
134
|
+
} // open proposal dashboard regardless
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
spawnTab(_protocolRegistry.Protocols.PROPOSAL_WORK, {
|
|
138
|
+
atIdx: 0
|
|
139
|
+
});
|
|
141
140
|
}, [activeCR === null || activeCR === void 0 ? void 0 : activeCR.id, setActiveChangeRequestID, spawnTab]);
|
|
142
141
|
const eventHandlers = (0, _react.useMemo)(() => ({
|
|
143
142
|
onNodeClick: node => {
|
|
@@ -183,9 +182,9 @@ const ActionableCRTree = function ({
|
|
|
183
182
|
payload: {
|
|
184
183
|
folderID: node.id
|
|
185
184
|
}
|
|
186
|
-
}) :
|
|
185
|
+
}) : activate(node.id);
|
|
187
186
|
}
|
|
188
|
-
}), [dispatch,
|
|
187
|
+
}), [dispatch, activate]);
|
|
189
188
|
return (0, _react2.jsx)(_core.Tree, {
|
|
190
189
|
className: className,
|
|
191
190
|
contents: nodes,
|