@riboseinc/paneron-registry-kit 2.2.10 → 2.2.12

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.
Files changed (102) hide show
  1. package/index.d.ts +2 -4
  2. package/index.js +18 -0
  3. package/index.js.map +1 -1
  4. package/package.json +2 -2
  5. package/site-builder/index.d.ts +3 -0
  6. package/site-builder/index.js +75 -0
  7. package/site-builder/index.js.map +1 -0
  8. package/site-builder/jsx-runtime.d.ts +18 -0
  9. package/site-builder/jsx-runtime.js +107 -0
  10. package/site-builder/jsx-runtime.js.map +1 -0
  11. package/site-builder/page.d.ts +6 -0
  12. package/site-builder/page.js +24 -0
  13. package/site-builder/page.js.map +1 -0
  14. package/types/cr.d.ts +22 -0
  15. package/types/cr.js +41 -1
  16. package/types/cr.js.map +1 -1
  17. package/types/item.d.ts +1 -1
  18. package/types/item.js.map +1 -1
  19. package/types/stakeholder.d.ts +3 -1
  20. package/types/stakeholder.js +20 -0
  21. package/types/stakeholder.js.map +1 -1
  22. package/types/util.d.ts +2 -0
  23. package/types/util.js.map +1 -1
  24. package/types/views.d.ts +22 -0
  25. package/types/views.js.map +1 -1
  26. package/views/AnnotatedChange.js +7 -5
  27. package/views/AnnotatedChange.js.map +1 -1
  28. package/views/BrowserCtx.d.ts +3 -11
  29. package/views/BrowserCtx.js +1 -0
  30. package/views/BrowserCtx.js.map +1 -1
  31. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +1 -1
  32. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
  33. package/views/FilterCriteria/models.d.ts +1 -1
  34. package/views/FilterCriteria/models.js.map +1 -1
  35. package/views/GenericRelatedItemView.js +11 -51
  36. package/views/GenericRelatedItemView.js.map +1 -1
  37. package/views/ItemDrawer.d.ts +11 -0
  38. package/views/ItemDrawer.js +69 -0
  39. package/views/ItemDrawer.js.map +1 -0
  40. package/views/SearchQuery.js +25 -14
  41. package/views/SearchQuery.js.map +1 -1
  42. package/views/change-request/ChangeProposalContext.d.ts +3 -0
  43. package/views/change-request/ChangeProposalContext.js +4 -0
  44. package/views/change-request/ChangeProposalContext.js.map +1 -0
  45. package/views/change-request/ChangeRequestContext.d.ts +18 -2
  46. package/views/change-request/ChangeRequestContext.js +29 -5
  47. package/views/change-request/ChangeRequestContext.js.map +1 -1
  48. package/views/change-request/Proposals.d.ts +2 -0
  49. package/views/change-request/Proposals.js +116 -80
  50. package/views/change-request/Proposals.js.map +1 -1
  51. package/views/change-request/State.d.ts +0 -0
  52. package/views/change-request/State.js +1 -0
  53. package/views/change-request/State.js.map +1 -0
  54. package/views/change-request/Summary.d.ts +12 -0
  55. package/views/change-request/Summary.js +59 -0
  56. package/views/change-request/Summary.js.map +1 -0
  57. package/views/change-request/TransitionHistory.d.ts +30 -0
  58. package/views/change-request/TransitionHistory.js +307 -0
  59. package/views/change-request/TransitionHistory.js.map +1 -0
  60. package/views/change-request/TransitionOptions.d.ts +38 -0
  61. package/views/{detail/ChangeRequest/transitions.js → change-request/TransitionOptions.js} +61 -51
  62. package/views/change-request/TransitionOptions.js.map +1 -0
  63. package/views/change-request/objectChangeset.d.ts +7 -4
  64. package/views/change-request/objectChangeset.js +60 -23
  65. package/views/change-request/objectChangeset.js.map +1 -1
  66. package/views/detail/ChangeRequest/index.js +129 -142
  67. package/views/detail/ChangeRequest/index.js.map +1 -1
  68. package/views/detail/RegisterHome/ActiveProposalDetails.d.ts +15 -0
  69. package/views/detail/RegisterHome/ActiveProposalDetails.js +104 -0
  70. package/views/detail/RegisterHome/ActiveProposalDetails.js.map +1 -0
  71. package/views/detail/RegisterHome/Block.d.ts +19 -0
  72. package/views/detail/RegisterHome/Block.js +49 -0
  73. package/views/detail/RegisterHome/Block.js.map +1 -0
  74. package/views/detail/RegisterHome/MetaSummary.d.ts +9 -0
  75. package/views/detail/RegisterHome/MetaSummary.js +39 -0
  76. package/views/detail/RegisterHome/MetaSummary.js.map +1 -0
  77. package/views/detail/RegisterHome/Proposal.d.ts +14 -0
  78. package/views/detail/RegisterHome/Proposal.js +296 -0
  79. package/views/detail/RegisterHome/Proposal.js.map +1 -0
  80. package/views/detail/RegisterHome/index.js +345 -141
  81. package/views/detail/RegisterHome/index.js.map +1 -1
  82. package/views/detail/RegisterItem/index.d.ts +2 -3
  83. package/views/detail/RegisterItem/index.js +238 -140
  84. package/views/detail/RegisterItem/index.js.map +1 -1
  85. package/views/detail/RegisterMeta/RegisterMetaForm.js +37 -45
  86. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
  87. package/views/detail/RegisterMeta/index.js +14 -11
  88. package/views/detail/RegisterMeta/index.js.map +1 -1
  89. package/views/diffing/InlineDiff.d.ts +27 -1
  90. package/views/diffing/InlineDiff.js +113 -2
  91. package/views/diffing/InlineDiff.js.map +1 -1
  92. package/views/hooks/useCustomView.js +1 -1
  93. package/views/hooks/useCustomView.js.map +1 -1
  94. package/views/index.js +4 -2
  95. package/views/index.js.map +1 -1
  96. package/views/sidebar/Search/index.js +12 -2
  97. package/views/sidebar/Search/index.js.map +1 -1
  98. package/views/util.d.ts +43 -6
  99. package/views/util.js +240 -11
  100. package/views/util.js.map +1 -1
  101. package/views/detail/ChangeRequest/transitions.d.ts +0 -28
  102. package/views/detail/ChangeRequest/transitions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState } from 'react';\n//import { Helmet } from 'react-helmet';\nimport { jsx, css } from '@emotion/react';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { Menu, MenuDivider, MenuItem, InputGroup, Button, NonIdealState, Spinner, Callout } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { registerStakeholderPlain } from '../../RegisterStakeholder';\nimport { newCRObjectChangeset, importedProposalToCRObjectChangeset } from '../../change-request/objectChangeset';\nimport { isImportableCR } from '../../../types/cr';\nimport { Protocols } from '../../protocolRegistry';\nimport { crIDToCRPath } from '../../itemPathUtils';\n\n\nconst RegisterHome: React.VoidFunctionComponent<Record<never, never>> =\nfunction () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { customViews, registerMetadata, stakeholder, offline, itemClasses } = useContext(BrowserCtx);\n const {\n requestFileFromFilesystem,\n makeRandomID,\n getObjectData,\n updateObjects,\n performOperation,\n getMapReducedData,\n } = useContext(DatasetContext);\n\n const [ newProposalIdea, setNewProposalIdea ] = useState<string>('');\n\n const registerVersion = registerMetadata?.version;\n const canCreateCR = (\n stakeholder &&\n stakeholder.role &&\n stakeholder.gitServerUsername?.trim() !== '' &&\n makeRandomID &&\n updateObjects &&\n (registerVersion?.id ?? '').trim() !== '');\n\n async function createCR(justification: string): Promise<string> {\n if (canCreateCR) {\n const id = await makeRandomID();\n await updateObjects({\n commitMessage: \"start new proposal\",\n objectChangeset: newCRObjectChangeset(\n id,\n justification,\n registerVersion!,\n stakeholder.gitServerUsername!,\n ),\n });\n return id;\n } else {\n throw new Error(\"Unable to create proposal: read-only dataset\");\n }\n }\n\n async function handleNewProposal() {\n if (newProposalIdea) {\n const crID = await performOperation(\"creating proposal\", createCR)(newProposalIdea);\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n }\n\n async function getCRImportChangeset(): Promise<[ObjectChangeset, string]> {\n if (!requestFileFromFilesystem) {\n throw new Error(\"Cannot request file from filesystem\");\n }\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n const crID = fileData.proposalDraft.id;\n try {\n const changeset = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function findObjects(predicate: string) {\n const result = (await getMapReducedData({\n chains: {\n _: {\n mapFunc: `\n const data = value.data;\n if (data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n },\n }));\n // NOTE: map returns an empty object if there’re no items,\n // but we promise to return a list.\n if (!Array.isArray(result._)) {\n return [];\n }\n return result._;\n },\n );\n return [changeset, crID];\n } catch (e) {\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n\n async function handleImportProposal() {\n const [objectChangeset, crID] = await performOperation(\n 'reading proposal data',\n getCRImportChangeset,\n )();\n\n await performOperation(\n 'creating proposal',\n updateObjects ?? (async () => { throw new Error(\"Read-only dataset\"); }),\n )({\n commitMessage: \"import proposal\",\n objectChangeset,\n });\n\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n\n const menu = (\n <Menu css={css`margin: 10px;`}>\n <MenuDivider title=\"Quick links\" />\n {customViews.map((cv, _) => \n <MenuItem\n key={cv.id}\n text={cv.label}\n title={cv.description}\n icon={cv.icon}\n onClick={() => spawnTab(`${Protocols.CUSTOM_VIEW}:${cv.id}/index`)}\n />\n )}\n {customViews.length > 0 ? <MenuDivider /> : null}\n\n <MenuItem\n text={`Propose a change to version ${registerMetadata?.version?.id ?? '(missing)'}`}\n disabled={!canCreateCR}\n icon=\"lightbulb\"\n title={canCreateCR\n ? \"A blank proposal will be created and opened in a new tab.\"\n : undefined}>\n <InputGroup\n value={newProposalIdea || undefined}\n placeholder=\"Your idea…\"\n title=\"Justification draft (you can change this later)\"\n onChange={evt => setNewProposalIdea(evt.currentTarget.value)}\n rightElement={\n <Button\n small\n intent={newProposalIdea ? 'primary': undefined}\n disabled={!newProposalIdea}\n onClick={handleNewProposal}\n icon=\"tick\"\n />\n }\n />\n </MenuItem>\n <MenuItem\n text=\"Import proposal\"\n icon=\"import\"\n disabled={!canCreateCR}\n onClick={handleImportProposal}\n />\n <MenuItem\n text=\"View register metadata\"\n icon=\"properties\"\n onClick={() => spawnTab(Protocols.REGISTER_META)}\n />\n </Menu>\n );\n\n const intro = <Callout intent=\"primary\" css={css`text-align: left;`}>\n {stakeholder\n ? <>You can create proposals as {registerStakeholderPlain(stakeholder)}.</>\n : offline\n ? <>\n Because this repository is offline (no remote configured),\n and remote username is currently required for proposal,\n you cannot create proposals.</>\n : <>\n Since your remote username is not in the list of stakeholders,\n you cannot create proposals currently.\n </>}\n </Callout>\n\n const greeting = registerMetadata\n ? <NonIdealState\n title={`Welcome to ${registerMetadata.name}`}\n description={<>\n {intro}\n {menu}\n </>}\n />\n : registerMetadata === undefined\n ? <NonIdealState\n icon={<Spinner />}\n description=\"Loading register information…\"\n />\n : <NonIdealState\n icon=\"heart-broken\"\n title=\"Register metadata is missing or invalid.\"\n description={<>\n {menu}\n </>}\n />;\n\n return greeting;\n}\n\nexport default RegisterHome;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EACZ,OAAO,EACP,UAAU,EACV,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,wCAAwC;AACxC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,mCAAmC,EAAE,MAAM,sCAAsC,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAqB,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,SAAS,MAAM,SAAS,CAAC;AAChC,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAG3D,MAAM,YAAY,GAClB;;IACE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,EACJ,gBAAgB,EAAE,WAAW,EAC7B,WAAW,EACX,wBAAwB,GACzB,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,EACJ,aAAa,EAAE,QAAQ,EACvB,SAAS,EACT,QAAQ,GACT,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,EACJ,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,MAAM,EACN,iBAAiB,EACjB,iBAAiB,GAClB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE/B,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,CAAC;IAElD,MAAM,sBAAsB,GAE5B,OAAO,CAAC,GAAG,EAAE;QACX,IAAI,YAAY,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;YAC3D,OAAO,KAAK,UAAU,sBAAsB,CAAE,OAAe;gBAC3D,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,oBAAoB,CAC1B,IAAI,EACJ,OAAO,EACP,eAAgB,EAChB,WAAY,CAAC,iBAAkB,CAChC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC,CAAC;SACH;aAAM;YACL,OAAO,SAAS,CAAC;SAClB;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEjD,MAAM,sBAAsB,GAE5B,OAAO,CAAC,GAAG,EAAE;QACX,IAAI,yBAAyB,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;YACxE,OAAO,KAAK,UAAU,sBAAsB;gBAC1C,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAAC;oBAC3C,MAAM,EAAE,wCAAwC;oBAChD,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;qBAC9C;iBACF,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;gBACzC,IAAI,CAAC,QAAQ,EAAE;oBACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;iBACzC;gBACD,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE;oBAC5B,IAAI;wBACF,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,MAAM,mCAAmC,CACjE,QAAQ,EACR,WAAW,EACX,WAAY,CAAC,iBAAkB,EAC/B,aAAa,EACb,KAAK,UAAU,iBAAiB,CAAC,UAAU;4BACzC,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gCACjE,CAAC,SAAS,CAAC,EAAE;oCACX,OAAO,EAAE;;uEAE0C,SAAS;;;qBAG3D;iCACF;6BACF,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;4BAEvD,MAAM,MAAM,GAEZ,MAAM,iBAAiB,CAAC;gCACtB,MAAM,EAAE,eAAe;6BACxB,CAAC,CAAC;4BAEH,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE;gCAC9D,MAAM,OAAO;gCACX,oDAAoD;gCACpD,mCAAmC;gCACnC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oCACtB,MAAM,IAAI,KAAK,CAAC,8EAA8E,UAAU,EAAE,CAAC,CAAC;iCAC7G;qCAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oCAC7B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oCAC5E,MAAM,IAAI,KAAK,CAAC,kFAAkF,UAAU,KAAK,cAAc,EAAE,CAAC,CAAC;iCACpI;qCAAM;oCACL,OAAO;wCACL,oDAAoD;wCACpD,CAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;qCAC9D,CAAC;iCACH;4BACH,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxD,CAAC,CACF,CAAC;wBACF,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;qBAC1B;oBAAC,OAAO,CAAC,EAAE;wBACV,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;wBAChD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;qBAChD;iBACF;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;iBAC5C;YACH,CAAC,CAAA;SACF;aAAM;YACL,OAAO,SAAS,CAAC;SAClB;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAE/E,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;QACxC,IAAI,aAAa,IAAI,wBAAwB,IAAI,CAAC,MAAM,EAAE;YACxD,OAAO;gBACL,sBAAsB;oBACpB,CAAC,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,KAAK;wBAC1C,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,MAAM,sBAAsB,EAAE,CAAC;wBAC/D,MAAM,aAAa,CAAC;4BAClB,aAAa,EAAE,iBAAiB;4BAChC,eAAe;yBAChB,CAAC,CAAC;wBACH,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC,CAAC;oBACJ,CAAC,CAAC,SAAS;gBACb,sBAAsB;oBACpB,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,KAAK,WAAW,OAAe;wBACzE,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;wBACtE,MAAM,aAAa,CAAC;4BAClB,aAAa,EAAE,4BAA4B,OAAO,EAAE;4BACpD,eAAe;yBAChB,CAAC,CAAC;wBACH,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBACjC,CAAC,CAAC;oBACJ,CAAC,CAAC,SAAS;aACd,CAAC;SACH;aAAM;YACL,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAE9F,0BAA0B;IAC1B,MAAM,cAAc,GAAG,OAAO,CAC5B,CAAC,GAAG,EAAE,CAAC,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI;QACtB,CAAC,CAAC,kCAAkC,CAAC,WAAW,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,IAAI,CAAC,EACT,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,CAAC,CAAC,CAAC;IAEvB,MAAM,yBAAyB,GAAG,iBAAiB,CAAC;QAClD,MAAM,EACJ,CAAC,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,CAAC;YACtB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,AAAD,EAAG,WAAW,CAAC,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG;;qBAET,aAAa,SAAS,KAAK;SACvC,CAAC;YACF,MAAM,OAAO,GAAG,cAAc,CAAC;YAC/B,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;KACxD,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAiC,OAAO,CAC/D,CAAC,GAAG,EAAE,CACN,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAC7B;QACE,OAAO;QACP,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YACzB,CAAC,CAAE,WAAoB;YACvB,CAAC,CAAC,SAAS,CAAC,IAAI,SAAS;KAC5B,CACF,CACF,EACD,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC;IAErC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,OAAO,CAAC;IAEjE,2BAA2B;IAC3B,+DAA+D;IAC/D,gBAAgB;IAChB,oBAAoB;IACpB,2BAA2B;IAC3B,mBAAmB;IACnB,wEAAwE;IACxE,iCAAiC;IAEjC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,0EAA0E;IAC1E,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,EAAE;QACxC,OAAO,CAAC,wBAAwB,IAAI,CAAC,MAAM;YACzC,CAAC,CAAC,UAAU,IAAY,IAAI,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,IAAI,CAAC,CAAA,CAAC,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,CAAC,EAAE,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEvC,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,EAAE;QACxC,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,QAAQ,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;gBACrB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;aACN,CAAC,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,wBAAwB;oBAC/B,CAAC,CAAC,GAAG,EAAE,CAAC,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAG,IAAI,CAAC;oBACxC,CAAC,CAAC,SAAS;aACL,CAAC,CAAC;SACb;aAAM;YACL,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;gBAC3C,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC9D,QAAQ,EAAE,CAAC,QAAQ;oBACnB,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC;wBACpC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,SAAS;iBACL,CAAC,CAAC;aACb;YACD,IAAI,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;gBAC3C,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,QAAQ;oBACjB,QAAQ,EAAE,CAAC,QAAQ,IAAI,UAAU;oBACjC,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC;wBACpC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,SAAS;iBACL,CAAC,CAAC;aACb;SACF;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CACjC,QAAQ,IAAI,UAAU;QACpB,CAAC,CAAC,KAAK,WAAW,IAAoB;YAClC,IAAI,IAAI,IAAI,QAAQ,EAAE;gBACpB,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtB;YACD,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACH,CAAC,CAAC,SAAS,CACd,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,IAAI,gBAAgB,CAAC,6DAA6D,EAAE;YAClF,OAAO,CACL,IAAC,SAAS,IACR,IAAI,EAAE,SAAS,EACf,GAAG,EAAC,oBAAoB,EACxB,WAAW,EAAC,sBAAsB,EAClC,GAAG,EAAE,GAAG,CAAA;;;;WAIP,EACD,KAAK,EAAE;oBACL,QAAQ,EAAE,gBAAgB;oBAC1B,mBAAmB;oBACnB,UAAU;oBACV,QAAQ,EAAE,YAAY;oBACtB,kBAAkB,EAAE,sBAAsB;oBAC1C,gBAAgB,EAAE,oBAAoB;iBACvC,EACD,OAAO,EAAE,oBAAoB,GAC7B,CACH,CAAC;SACH;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,EAAE;QACD,UAAU,EAAE,gBAAgB;QAC5B,oBAAoB;QACpB,oBAAoB;QACpB,YAAY;QACZ,sBAAsB;QACtB,mBAAmB;KACpB,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE;QACtC,OAAO,QAAQ;YACb,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,CAAC,CAAC,CAAC;IAE7B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,IAAI,QAAQ,IAAI,gBAAgB,EAAE;YAChC,OAAO,IAAC,oBAAoB,IAC1B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,GAAG,CAAA;;;;SAIP,GACD,CAAA;SACH;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE;YACjC,OAAO,CACL,IAAC,SAAS,IACR,IAAI,EAAE,WAAW,EACjB,WAAW,EAAC,kBAAkB,EAC9B,KAAK,EAAE,gBAAgB;oBACrB,CAAC,CAAC;wBACE,QAAQ,EAAE,gBAAgB;wBAC1B,KAAK,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;qBACvE;oBACH,CAAC,CAAC,gBAAgB,EACpB,KAAK,EAAE,gBAAgB,KAAK,IAAI;oBAC9B,CAAC,CAAC,kCAAkC;oBACpC,CAAC,CAAC,SAAS,EACb,GAAG,EAAE,GAAG,CAAA;;;;WAIP,EACD,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,gCAAgC;wBACtC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC;wBAChD,IAAI,EAAE,YAAY;qBACnB,CAAC,GACF,CACH,CAAC;SACH;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpD,OAAO,CACL,IAAC,qBAAqB,IAClB,KAAK,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,UAAU,EAC3C,MAAM,EAAC,WAAW,IAEnB,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,iBAAiB;QAElC,aAAa,CAWQ,CACzB,CAAC;AACJ,CAAC,CAAA;AAED,eAAe,YAAY,CAAC;AAG5B,SAAS,kCAAkC,CAAC,IAAyB;IACnE,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAGD,MAAM,aAAa,GAAG,uEAAuE,CAAC;AAM9F,MAAM,oBAAoB,GAC1B;IACE,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,kBAAkB,CAAC,WAAW;YAC/G,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE;gBAChD,MAAM,oBAAoB,GAAG,mDAAmD,WAAW,CAAC,iBAAiB,GAAG,CAAC;gBACjH,MAAM,KAAK,GAAG,mBAAmB,KAAK,CAAC,KAAK,uBAAuB,KAAK,CAAC,0BAA0B,UAAU,oBAAoB,GAAG,CAAC;gBACrI,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,OAAO,OAAO,CAAC;aAChB;QACH,CAAC,CAAC;IACF,CAAC,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,kBAAkB,CAAC,WAAW;YACjH,2EAA2E;YAC3E,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE;gBAChD,MAAM,oBAAoB,GAAG,mDAAmD,WAAW,CAAC,iBAAiB,GAAG,CAAC;gBACjH,MAAM,KAAK,GAAG,mBAAmB,KAAK,CAAC,QAAQ,UAAU,oBAAoB,GAAG,CAAC;gBACjF,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,OAAO,OAAO,CAAC;aAChB;QACH,CAAC,CAAC;IACF,CAAC,+BAA+B,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,kBAAkB,CAAC,WAAW;YACtH,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE;gBAChD,MAAM,oBAAoB,GAAG,mDAAmD,WAAW,CAAC,iBAAiB,GAAG,CAAC;gBACjH,MAAM,KAAK,GAAG,mBAAmB,KAAK,CAAC,KAAK,uBAAuB,KAAK,CAAC,0BAA0B,UAAU,oBAAoB,GAAG,CAAC;gBACrI,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,OAAO,OAAO,CAAC;aAChB;QACH,CAAC,CAAC;IACF,6HAA6H;IAC7H,kDAAkD;IAClD,0EAA0E;IAC1E,wDAAwD;IACxD,qEAAqE;IACrE,iBAAiB;IACjB,+FAA+F;IAC/F,4FAA4F;IAC5F,iLAAiL;IACjL,oBAAoB;IACpB,aAAa;IACb,sBAAsB;IACtB,MAAM;IACN,6BAA6B;IAC7B,MAAM;IACN,8HAA8H;IAC9H,wDAAwD;IACxD,qEAAqE;IACrE,iBAAiB;IACjB,+FAA+F;IAC/F,4FAA4F;IAC5F,oIAAoI;IACpI,oBAAoB;IACpB,aAAa;IACb,sBAAsB;IACtB,MAAM;IACN,6BAA6B;IAC7B,MAAM;IACN,CAAC,6BAA6B,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;YACzE,OAAO,kBAAkB,KAAK,CAAC,QAAQ,GAAG,CAAC;QAC7C,CAAC,CAAC;IACF,CAAC,6BAA6B,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,WAAW;YACtF,OAAO,kBAAkB,KAAK,CAAC,iCAAiC,GAAG,CAAC;QACtE,CAAC,CAAC;IACF,CAAC,wBAAwB,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,gBAAgB;YACjG,OAAO,kBAAkB,KAAK,CAAC,QAAQ,GAAG,CAAC;QAC7C,CAAC,CAAC;CACM,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, {\n useMemo,\n useContext,\n useState,\n} from 'react';\n//import { Helmet } from 'react-helmet';\nimport { jsx, css } from '@emotion/react';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { crIDToCRPath } from '../../itemPathUtils';\nimport { newCRObjectChangeset, importedProposalToCRObjectChangeset } from '../../change-request/objectChangeset';\nimport { isImportableCR } from '../../../types/cr';\nimport type { RegisterStakeholder, StakeholderRoleType } from '../../../types';\nimport { type SomeCR as CR, State } from '../../../types/cr';\nimport { canImportCR, canCreateCR } from '../../../types/stakeholder';\nimport { itemPathToItemRef } from '../../itemPathUtils';\nimport { Protocols } from '../../protocolRegistry';\nimport MetaSummary from './MetaSummary';\nimport { TabContentsWithHeader } from '../../util';\nimport { Proposals } from './Proposal';\nimport HomeBlock from './Block';\nimport CurrentProposalBlock from './ActiveProposalDetails';\n\n\nconst RegisterHome: React.VoidFunctionComponent<Record<never, never>> =\nfunction () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const {\n registerMetadata, stakeholder,\n itemClasses,\n setActiveChangeRequestID,\n } = useContext(BrowserCtx);\n const {\n changeRequest: activeCR,\n canDelete,\n deleteCR,\n } = useContext(ChangeRequestContext);\n const {\n requestFileFromFilesystem,\n makeRandomID,\n getObjectData,\n updateObjects,\n performOperation,\n isBusy,\n getMapReducedData,\n useMapReducedData,\n } = useContext(DatasetContext);\n\n const registerVersion = registerMetadata?.version;\n\n const getNewEmptyCRChangeset:\n undefined | ((idea: string) => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (makeRandomID && stakeholder && canCreateCR(stakeholder)) {\n return async function getNewEmptyCRChangeset (newIdea: string) {\n const crID = await makeRandomID();\n return [newCRObjectChangeset(\n crID,\n newIdea,\n registerVersion!,\n stakeholder!.gitServerUsername!,\n ), crID];\n };\n } else {\n return undefined;\n }\n }, [makeRandomID, stakeholder, registerVersion]);\n\n const getImportedCRChangeset:\n undefined | (() => Promise<[ObjectChangeset, string]>) =\n useMemo(() => {\n if (requestFileFromFilesystem && stakeholder && canImportCR(stakeholder)) {\n return async function getImportedCRChangeset() {\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n try {\n const [changeset, crID] = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function resolvePredicates(predicates) {\n const mapReduceChains = [...predicates.values()].map(predicate => ({\n [predicate]: {\n mapFunc: `\n const data = value.data;\n if (!key.startsWith('/proposals/') && data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n })).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n\n const result:\n Record<string, { objectPath: string, objectData: any }[] | {}> =\n await getMapReducedData({\n chains: mapReduceChains,\n });\n\n return Object.entries(result).map(([chainLabel, chainResult]) => {\n const objects =\n // Map returns an empty object if there’re no items,\n // but we promise to return a list.\n (Array.isArray(chainResult) ? chainResult : []);\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching predicate ${chainLabel}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches predicate ${chainLabel}: ${objectOverview}`);\n } else {\n return {\n // There’s just one item anyway, hence `objects[0]`.\n [chainLabel]: itemPathToItemRef(false, objects[0].objectPath),\n };\n }\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {});\n },\n );\n return [changeset, crID];\n } catch (e) {\n console.error(\"Error reading proposal data\", e);\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n } else {\n return undefined;\n }\n }, [getMapReducedData, requestFileFromFilesystem, getObjectData, stakeholder]);\n\n const [importCR, createCR] = useMemo(() => {\n if (updateObjects && setActiveChangeRequestID && !isBusy) {\n return [\n getImportedCRChangeset\n ? performOperation('importing proposal', async function () {\n const [objectChangeset, crID] = await getImportedCRChangeset(); \n await updateObjects({\n commitMessage: 'import proposal',\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n getNewEmptyCRChangeset\n ? performOperation('creating blank proposal', async function (newIdea: string) {\n const [objectChangeset, crID] = await getNewEmptyCRChangeset(newIdea);\n await updateObjects({\n commitMessage: `start new empty proposal ${newIdea}`,\n objectChangeset,\n });\n setActiveChangeRequestID(crID);\n })\n : undefined,\n ];\n } else {\n return [undefined, undefined];\n }\n }, [isBusy, performOperation, updateObjects, getImportedCRChangeset, getNewEmptyCRChangeset]);\n\n // Actionable proposals v2\n const proposalGroups = useMemo(\n (() => stakeholder?.role\n ? getActionableProposalGroupsForRole(stakeholder.role)\n : null),\n [stakeholder?.role]);\n\n const actionableProposalsResult = useMapReducedData({\n chains:\n (proposalGroups ?? []).\n map(([label, , queryGetter]) => {\n const query = queryGetter(stakeholder);\n const predicateFunc = `\n const objPath = key, obj = value;\n return ((${CR_BASE_QUERY}) && (${query}));\n `;\n const mapFunc = `emit(value);`;\n return { [label]: { mapFunc, predicateFunc } };\n }).reduce((prev, curr) => ({ ...prev, ...curr }), {}),\n });\n\n const actionableProposals: [string, CR[] | undefined][] = useMemo(\n (() =>\n Object.entries(actionableProposalsResult.value).\n map(([chainID, chainResult]) =>\n [\n chainID,\n (Array.isArray(chainResult)\n ? (chainResult as CR[])\n : undefined) || undefined\n ]\n )\n ),\n [actionableProposalsResult.value]);\n\n const handleRefreshProposals = actionableProposalsResult.refresh;\n\n // TODO: Move to action bar\n // const customActions = useMemo(() => customViews.map(cv => ({\n // key: cv.id,\n // text: cv.label,\n // title: cv.description,\n // icon: cv.icon,\n // onClick: () => spawnTab(`${Protocols.CUSTOM_VIEW}:${cv.id}/index`),\n // })), [spawnTab, customViews]);\n\n const [createMode, setCreateMode] = useState(false);\n //const canStakeholderCreateCRs = stakeholder && canCreateCR(stakeholder);\n const handleSelectProposal = useMemo(() => {\n return (setActiveChangeRequestID && !isBusy\n ? function (crid: string) { setActiveChangeRequestID?.(crid) }\n : undefined);\n }, [setActiveChangeRequestID, isBusy]);\n\n const proposalBlockActions = useMemo(() => {\n const actions = [];\n if (activeCR) {\n actions.push({\n text: \"Export proposal\",\n onClick: () => void 0,\n icon: 'export',\n disabled: true,\n } as const);\n actions.push({\n text: \"Exit proposal\",\n icon: 'log-out',\n intent: 'danger',\n disabled: isBusy,\n onClick: setActiveChangeRequestID\n ? () => setActiveChangeRequestID?.(null)\n : undefined,\n } as const);\n } else {\n if (stakeholder && canCreateCR(stakeholder)) {\n actions.push({\n text: \"Create blank proposal\",\n onClick: !createMode ? (() => setCreateMode(true)) : undefined,\n disabled: !createCR,\n active: createMode,\n selected: createMode,\n icon: 'add',\n intent: actionableProposals.length < 1\n ? 'primary'\n : undefined,\n } as const);\n }\n if (stakeholder && canImportCR(stakeholder)) {\n actions.push({\n text: \"Import proposal\",\n onClick: importCR,\n disabled: !importCR || createMode,\n icon: 'import',\n intent: actionableProposals.length < 1\n ? 'primary'\n : undefined,\n } as const);\n }\n }\n return actions;\n }, [!activeCR, createMode, importCR, createCR, isBusy, actionableProposals.length < 1]);\n\n const handleCreate = useMemo((() =>\n createCR && createMode\n ? async function (idea: string | false) {\n if (idea && createCR) {\n await createCR(idea);\n }\n setCreateMode(false);\n }\n : undefined\n ), [createMode, createCR]);\n\n const proposalBlock = useMemo(() => {\n if (registerMetadata /*&& actionableProposals.find(p => p[1] && p[1].length > 0)*/) {\n return (\n <HomeBlock\n View={Proposals}\n key=\"proposal dashboard\"\n description=\"Actionable proposals\"\n css={css`\n height: 300px;\n flex-basis: calc(50% - 10px);\n flex-grow: 1;\n `}\n props={{\n register: registerMetadata,\n actionableProposals,\n createMode,\n onCreate: handleCreate,\n onRefreshProposals: handleRefreshProposals,\n onSelectProposal: handleSelectProposal,\n }}\n actions={proposalBlockActions}\n />\n );\n } else {\n return null;\n }\n }, [\n createMode, registerMetadata,\n proposalBlockActions,\n handleSelectProposal,\n handleCreate,\n handleRefreshProposals,\n actionableProposals,\n ]);\n\n const handleOpenProposal = useMemo(() => {\n return activeCR\n ? (async () => spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(activeCR.id)}`))\n : undefined;\n }, [spawnTab, activeCR?.id]);\n\n const activeCRBlock = useMemo(() => {\n if (activeCR && registerMetadata) {\n return <CurrentProposalBlock\n proposal={activeCR}\n stakeholder={stakeholder}\n register={registerMetadata}\n onOpen={handleOpenProposal}\n onDelete={deleteCR}\n canDelete={canDelete}\n css={css`\n height: 300px;\n flex-basis: calc(50% - 10px);\n flex-grow: 1;\n `}\n />\n } else {\n return null;\n }\n }, [activeCR, registerMetadata, canDelete, deleteCR, handleOpenProposal, stakeholder]);\n\n const registerMetaBlock = useMemo(() => {\n if (!activeCRBlock && stakeholder) {\n return (\n <HomeBlock\n View={MetaSummary}\n description=\"Register summary\"\n props={registerMetadata\n ? {\n register: registerMetadata,\n style: { padding: '10px 12px 0 12px', flexGrow: 1, overflowY: 'auto' },\n }\n : registerMetadata}\n error={registerMetadata === null\n ? \"Failed to load register metadata\"\n : undefined}\n css={css`\n height: 300px;\n flex-basis: calc(50% - 10px);\n flex-grow: 1;\n `}\n actions={[{\n text: \"View or edit register metadata\",\n onClick: () => spawnTab(Protocols.REGISTER_META),\n icon: 'properties',\n }]}\n />\n );\n } else {\n return null;\n }\n }, [!activeCRBlock, registerMetadata, stakeholder]);\n\n return (\n <TabContentsWithHeader\n title={registerMetadata?.name ?? 'Register'}\n layout=\"card-grid\">\n\n {activeCRBlock ?? registerMetaBlock}\n\n {proposalBlock}\n\n {/* TODO: Move to action bar customActions.length > 0\n ? <HomeBlock\n description=\"Custom actions\"\n View={() => <></>}\n props={{}}\n actions={customActions}\n />\n : null*/}\n\n </TabContentsWithHeader>\n );\n}\n\nexport default RegisterHome;\n\n\nfunction getActionableProposalGroupsForRole(role: StakeholderRoleType): ActionableProposalGroup[] {\n return CR_QUERIES_FOR_ROLES.filter(([, roles]) => roles.has(role));\n}\n\n\nconst CR_BASE_QUERY = 'objPath.indexOf(\"/proposals/\") === 0 && objPath.endsWith(\"main.yaml\")';\ntype ActionableProposalGroup = readonly [\n label: string,\n roles: Set<StakeholderRoleType>,\n queryGetter: (stakeholder?: RegisterStakeholder) => string,\n];\nconst CR_QUERIES_FOR_ROLES: readonly ActionableProposalGroup[] =\n[\n ['My Drafts', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['My Rejected', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // Rejections are actionable because they can be appealed by the submitter.\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.REJECTED}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n ['Everyone’s Drafts or Returned', new Set(['manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n if (stakeholder && stakeholder.gitServerUsername) {\n const stakeholderCondition = `obj.submittingStakeholderGitServerUsername !== \"${stakeholder.gitServerUsername}\"`;\n const query = `(obj.state === \"${State.DRAFT}\" || obj.state === \"${State.RETURNED_FOR_CLARIFICATION}\") && (${stakeholderCondition})`;\n return query;\n } else {\n return 'false';\n }\n }],\n // ['latest reviewed', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // // TODO: Should filter only rejected perhaps?\n // // Approved/accepted proposals can be shown in another (public) area.\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.ACCEPTED} || obj.state === \"${State.REJECTED} || obj.state === \"${State.REJECTION_UPHELD_ON_APPEAL}\"\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n // ['latest withdrawn', new Set(['submitter', 'manager', 'control-body', 'owner']), function submitterProposals(stakeholder) {\n // if (stakeholder && stakeholder.gitServerUsername) {\n // const stakeholderCondition = stakeholder?.role !== 'submitter'\n // ? 'true'\n // : `obj.submittingStakeholderGitServerUsername === \"${stakeholder.gitServerUsername}\"`;\n // // Don’t show drafts in the list of pending proposals, unless it’s user’s own drafts.\n // const query = `(obj.state === \"${State.WITHDRAWN}\" || obj.state === \"${State.APPEAL_WITHDRAWN}\") && ${stakeholderCondition}`;\n // return query;\n // } else {\n // return 'false';\n // }\n // // TODO: Implement limit\n // }],\n ['Pending Owner Appeal Review', new Set(['owner']), function ownerProposals() {\n return `obj.state === \"${State.APPEALED}\"`;\n }],\n ['Pending Control Body Review', new Set(['control-body', 'owner']), function cbProposals() {\n return `obj.state === \"${State.SUBMITTED_FOR_CONTROL_BODY_REVIEW}\"`;\n }],\n ['Pending Manager Review', new Set(['manager', 'control-body', 'owner']), function managerProposals() {\n return `obj.state === \"${State.PROPOSED}\"`;\n }],\n] as const;\n"]}
@@ -3,16 +3,15 @@
3
3
  import React from 'react';
4
4
  import { type RegisterItem, type InternalItemReference, type ItemClassConfiguration } from '../../../types';
5
5
  export declare const ItemDetail: React.VoidFunctionComponent<{
6
- item: RegisterItem<any>;
6
+ item: RegisterItem;
7
7
  itemRef: InternalItemReference;
8
8
  itemClass: ItemClassConfiguration<any>;
9
9
  className?: string;
10
- inProposalWithID?: string;
10
+ compactHeader?: boolean;
11
11
  }>;
12
12
  declare const _default: {
13
13
  main: React.VoidFunctionComponent<{
14
14
  uri: string;
15
- inProposalWithID?: string | undefined;
16
15
  }>;
17
16
  title: React.FC<{
18
17
  uri: string;
@@ -9,16 +9,12 @@ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _react2 = require("@emotion/react");
11
11
 
12
- var _styled = _interopRequireDefault(require("@emotion/styled"));
13
-
14
12
  var _core = require("@blueprintjs/core");
15
13
 
16
14
  var _context = require("@riboseinc/paneron-extension-kit/context");
17
15
 
18
16
  var _util = require("@riboseinc/paneron-extension-kit/util");
19
17
 
20
- var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
21
-
22
18
  var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
23
19
 
24
20
  var _useSingleRegisterItemData = _interopRequireDefault(require("../../hooks/useSingleRegisterItemData"));
@@ -58,8 +54,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
58
54
  * is also reused within change request view.
59
55
  */
60
56
  const MaybeItemDetail = (0, _react.memo)(function ({
61
- uri,
62
- inProposalWithID
57
+ uri
63
58
  }) {
64
59
  var _a, _b, _c; //const { value: itemData } = useSingleRegisterItemData(ref);
65
60
 
@@ -98,8 +93,7 @@ const MaybeItemDetail = (0, _react.memo)(function ({
98
93
  return (0, _react2.jsx)(ItemDetail, {
99
94
  item: itemData,
100
95
  itemRef: itemRef,
101
- itemClass: itemClass,
102
- inProposalWithID: inProposalWithID
96
+ itemClass: itemClass
103
97
  });
104
98
  } else if (itemResponse.isUpdating) {
105
99
  return (0, _react2.jsx)("div", {
@@ -135,9 +129,9 @@ const ItemDetail = (0, _react.memo)(function ({
135
129
  itemRef,
136
130
  itemClass,
137
131
  className,
138
- inProposalWithID
132
+ compactHeader
139
133
  }) {
140
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
134
+ var _a, _b, _c, _d, _e, _f;
141
135
 
142
136
  const {
143
137
  subregisters,
@@ -156,12 +150,43 @@ const ItemDetail = (0, _react.memo)(function ({
156
150
  const {
157
151
  spawnTab
158
152
  } = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
159
- const [editedClarification, setEditedClarification] = (0, _react.useState)(null); //const [ diffMode, setDiffMode ] = useState<boolean>(false);
153
+ const [editedItemData, setEditedItemData] = (0, _react.useState)(null);
154
+ const itemDataHasChanges = JSON.stringify(editedItemData) !== JSON.stringify(item.data); // Gather views
155
+
156
+ const ListItemView = itemClass.views.listItemView;
157
+ let details;
158
+
159
+ if (editedItemData !== null && activeCRIsEditable) {
160
+ const EditView = itemClass.views.editView;
161
+ details = (0, _react2.jsx)(EditView, {
162
+ itemData: editedItemData,
163
+ itemRef: itemRef,
164
+ onChange: !isBusy ? setEditedItemData : undefined
165
+ });
166
+ } else {
167
+ const DetailView = (_a = itemClass.views.detailView) !== null && _a !== void 0 ? _a : itemClass.views.editView;
168
+ details = (0, _react2.jsx)(DetailView, {
169
+ itemRef: itemRef,
170
+ itemData: item.data
171
+ });
172
+ }
173
+
174
+ const [isEditingProposal, setIsEditingProposal] = (0, _react.useState)(false); //const [ diffMode, setDiffMode ] = useState<boolean>(false);
160
175
  // TODO: Implement diff mode
161
176
 
162
177
  const diffMode = false;
163
178
  const itemPath = (0, _itemPathUtils.itemRefToItemPath)(itemRef);
164
- const proposal = (_a = activeCR && activeCR.items[itemPath] ? activeCR.items[itemPath] : null) !== null && _a !== void 0 ? _a : null;
179
+ /** Proposal for the current item. */
180
+
181
+ const proposal = (_b = activeCR && activeCR.items[itemPath] ? activeCR.items[itemPath] : null) !== null && _b !== void 0 ? _b : null; // It’s superseded (whether in current proposal or not)
182
+
183
+ const isSuperseded = item.status === 'superseded'; // Item is valid, proposal is editable, and no change to this item is proposed yet
184
+
185
+ const canBeSuperseded = activeCRIsEditable && !proposal && !editedItemData && item.status === 'valid'; // This item is being superseded in active proposal
186
+ // XXX: May be redundant with `isSuperseded`?
187
+
188
+ const isBeingSuperseded = (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession'; // Editing is possible for additions and clarifications.
189
+ //const itemDataCanBeEdited = activeCRIsEditable && proposal && proposal.type !== 'amendment';
165
190
 
166
191
  const handleClearProposal = () => performProposalOperation('clearing draft proposal', null);
167
192
 
@@ -185,14 +210,14 @@ const ItemDetail = (0, _react.memo)(function ({
185
210
  await performProposalOperation('proposing clarification', {
186
211
  type: 'clarification'
187
212
  });
188
- setEditedClarification(null);
213
+ setEditedItemData(null); // XXX: Redundant?
189
214
  };
190
215
 
191
216
  const handleEditAddition = async () => {
192
217
  await performProposalOperation('editing proposed addition', {
193
218
  type: 'addition'
194
219
  });
195
- setEditedClarification(null);
220
+ setEditedItemData(null); // XXX: Redundant?
196
221
  };
197
222
 
198
223
  async function performProposalOperation(summary, proposal) {
@@ -204,7 +229,7 @@ const ItemDetail = (0, _react.memo)(function ({
204
229
  throw new Error("Proposal isn’t editable");
205
230
  }
206
231
 
207
- if (proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && !editedClarification) {
232
+ if (proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && !editedItemData) {
208
233
  throw new Error("Missing item data");
209
234
  }
210
235
 
@@ -213,19 +238,21 @@ const ItemDetail = (0, _react.memo)(function ({
213
238
  objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)( // TODO: We are sure it’s editable already, but casting should be avoided
214
239
  activeCR, {
215
240
  [itemPath]: proposal
216
- }, proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && editedClarification ? {
241
+ }, proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && editedItemData ? {
217
242
  [itemPath]: { ...item,
218
- data: editedClarification
243
+ data: editedItemData
219
244
  }
220
245
  } : {}),
221
246
  // We need this because updateCRObjectChangeset
222
247
  // omits oldValue for item data payloads.
223
248
  _dangerouslySkipValidation: true
224
249
  });
225
- }, [editedClarification, activeCRIsEditable, itemPath, item, activeCR, updateObjects]); // TODO: Very similar to `handleAdd()` in Browse sidebar menu; refactor?
250
+ setEditedItemData(null);
251
+ setIsEditingProposal(false);
252
+ }, [editedItemData, activeCRIsEditable, itemPath, item, activeCR, updateObjects]); // TODO: Very similar to `handleAdd()` in Browse sidebar menu; refactor?
226
253
 
227
254
  const handleProposeLikeThis = (0, _react.useCallback)(async function _handleProposeLikeThis() {
228
- if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR || !itemClass || !(0, _types.isRegisterItem)(item)) {
255
+ if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {
229
256
  throw new Error("Unable to create item: likely current proposal is not editable or dataset is read-only");
230
257
  }
231
258
 
@@ -267,109 +294,191 @@ const ItemDetail = (0, _react.memo)(function ({
267
294
  } else {
268
295
  throw new Error("Newly created item did not pass validation (this is likely a bug in RegistryKit");
269
296
  }
270
- }, [updateObjects, activeCRIsEditable, itemPath, activeCR === null || activeCR === void 0 ? void 0 : activeCR.id, activeCR === null || activeCR === void 0 ? void 0 : activeCR.state, Object.entries((_b = activeCR === null || activeCR === void 0 ? void 0 : activeCR.items) !== null && _b !== void 0 ? _b : {}).flat().map(i => JSON.stringify(i)).toString(), item ? JSON.stringify((0, _util.normalizeObject)(item)) : item]);
271
- let details;
272
-
273
- if (editedClarification !== null && activeCRIsEditable) {
274
- const EditView = itemClass.views.editView;
275
- details = (0, _react2.jsx)(EditView, {
276
- itemData: editedClarification,
277
- itemRef: itemRef,
278
- onChange: !isBusy ? setEditedClarification : undefined
279
- });
280
- } else {
281
- const DetailView = (_c = itemClass.views.detailView) !== null && _c !== void 0 ? _c : itemClass.views.editView;
282
- details = (0, _react2.jsx)(DetailView, {
283
- itemRef: itemRef,
284
- itemData: item.data
297
+ }, [updateObjects, activeCRIsEditable, itemPath, activeCR === null || activeCR === void 0 ? void 0 : activeCR.id, activeCR === null || activeCR === void 0 ? void 0 : activeCR.state, Object.entries((_c = activeCR === null || activeCR === void 0 ? void 0 : activeCR.items) !== null && _c !== void 0 ? _c : {}).flat().map(i => JSON.stringify(i)).toString(), item ? JSON.stringify((0, _util.normalizeObject)(item)) : item]);
298
+ const proposedSupersedingItemRefs = (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' ? proposal.supersedingItemIDs.map(id => ({
299
+ itemID: id,
300
+ // Superseding items are always of the same class
301
+ classID: itemClass.meta.id,
302
+ // Superseding items are always in the same subregister
303
+ subregisterID: itemRef.subregisterID
304
+ })) : undefined;
305
+ const supersedingItemRefs = (_d = proposedSupersedingItemRefs !== null && proposedSupersedingItemRefs !== void 0 ? proposedSupersedingItemRefs : item.supersededBy) !== null && _d !== void 0 ? _d : [];
306
+ const supersedingItemRefsCacheKey = supersedingItemRefs.map(i => JSON.stringify(i)).toString();
307
+ const supersedingItemsTooltip = (0, _react.useMemo)(() => ({
308
+ icon: 'info-sign',
309
+ content: (0, _react2.jsx)(_RelatedItems.RelatedItems, {
310
+ css: (0, _react2.css)`background-color: ${_core.Colors.LIGHT_GRAY3}; padding: 5px;`,
311
+ availableClassIDs: [itemClass.meta.id],
312
+ itemRefs: supersedingItemRefs
313
+ })
314
+ }), [supersedingItemRefsCacheKey, itemClass.meta.id]);
315
+ const classification = (0, _react.useMemo)(() => {
316
+ var _a, _b, _c, _d;
317
+
318
+ const classification = [{
319
+ icon: 'document',
320
+ children: (0, _react2.jsx)(_react.default.Fragment, null, "Register item", itemRef.subregisterID ? (0, _react2.jsx)("span", {
321
+ title: "Subregister"
322
+ }, " in ", (_b = (_a = subregisters === null || subregisters === void 0 ? void 0 : subregisters[itemRef.subregisterID]) === null || _a === void 0 ? void 0 : _a.title) !== null && _b !== void 0 ? _b : itemRef.subregisterID) : null),
323
+ tooltip: {
324
+ icon: 'info-sign',
325
+ content: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.UL, {
326
+ css: (0, _react2.css)`margin: 0;`
327
+ }, (0, _react2.jsx)("li", null, "Class ID: ", itemClass.meta.id), (0, _react2.jsx)("li", null, "Subregister ID: ", (_c = itemRef.subregisterID) !== null && _c !== void 0 ? _c : 'N/A'), (0, _react2.jsx)("li", null, "UUID: ", itemRef.itemID)))
328
+ }
329
+ }, {
330
+ children: itemClass.meta.title,
331
+ tooltip: {
332
+ icon: 'info-sign',
333
+ content: (0, _react2.jsx)(_react.default.Fragment, null, (_d = itemClass.meta.description) !== null && _d !== void 0 ? _d : "No description is provided for this register item class.")
334
+ }
335
+ }];
336
+ classification.push({
337
+ children: item.status,
338
+ intent: item.status === 'valid' ? 'success' : undefined,
339
+ icon: item.status === 'invalid' ? 'ban-circle' : item.status === 'retired' ? 'warning-sign' : 'tick',
340
+ tooltip: isSuperseded ? supersedingItemsTooltip : undefined
285
341
  });
286
- }
287
342
 
288
- console.debug("Rendering RegisterItem view"); //const canAmend = activeCR && itemData.status === 'valid';
289
-
290
- const itemStatus = (0, _react2.jsx)(FormGroup, {
291
- inline: true,
292
- label: "status:",
293
- css: (0, _react2.css)`margin: 0;`
294
- }, (0, _react2.jsx)(_core.ControlGroup, {
295
- fill: true
296
- }, (0, _react2.jsx)(_core.InputGroup, {
297
- value: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' ? `${proposal.amendmentType} proposed` : (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? "addition proposed" : item.status,
298
- intent: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' ? 'warning' : (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? 'primary' : item.status === 'valid' ? 'success' : undefined,
299
- leftIcon: proposal && (proposal.type === 'amendment' || proposal.type === 'addition') ? 'asterisk' : item.status === 'valid' ? 'tick' : item.status === 'invalid' ? 'ban-circle' : 'warning-sign',
300
- readOnly: true
301
- }), activeCRIsEditable && !editedClarification ? (0, _react2.jsx)(_react.default.Fragment, null, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? (0, _react2.jsx)(_core.Button, {
302
- intent: "warning",
303
- title: "Remove the proposal to add this new item.",
304
- disabled: isBusy,
305
- onClick: handleClearProposal
306
- }, "Remove proposed addition") : null, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' ? (0, _react2.jsx)(_core.Button, {
307
- intent: "warning",
308
- title: `Remove amendment (${proposal.amendmentType}) for this item from current proposal.`,
309
- disabled: isBusy,
310
- onClick: handleClearProposal
311
- }, "Clear proposed amendment") : !proposal && item.status === 'valid' ? (0, _react2.jsx)(_core.ButtonGroup, null, (0, _react2.jsx)(_core.Button, {
312
- intent: "primary",
313
- disabled: isBusy,
314
- onClick: handleRetire
315
- }, "Retire"), (0, _react2.jsx)(_core.Button, {
316
- intent: "primary",
317
- disabled: isBusy,
318
- onClick: handleInvalidate
319
- }, "Invalidate")) : null) : null)); // It’s superseded (whether in current proposal or not)
343
+ if (proposal) {
344
+ classification.push({
345
+ children: proposal.type === 'amendment' ? `${proposal.amendmentType} proposed` : proposal.type === 'addition' ? "addition proposed" : proposal.type === 'clarification' ? "clarification proposed" : "(unknown proposal type)",
346
+ intent: proposal.type === 'amendment' ? 'warning' : proposal.type === 'addition' || proposal.type === 'clarification' ? 'primary' : undefined,
347
+ icon: 'lightbulb',
348
+ minimal: false,
349
+ tooltip: canBeSuperseded || isBeingSuperseded ? supersedingItemsTooltip : undefined
350
+ });
351
+ }
320
352
 
321
- const isSuperseded = item.status === 'superseded'; // Item is valid, proposal is editable, and no change to this item is proposed yet
353
+ return classification;
354
+ }, [proposal === null || proposal === void 0 ? void 0 : proposal.type, itemClass.meta.id, item.status, isSuperseded, canBeSuperseded, isBeingSuperseded, supersedingItemsTooltip]);
355
+ const actions = (0, _react.useMemo)(() => {
356
+ const actions = [];
357
+ const isEditingItemData = editedItemData !== null;
358
+ const itemHasProposal = proposal !== null; //const canPropose = activeCRIsEditable && item.status === 'valid' && !isBusy;
322
359
 
323
- const canBeSuperseded = activeCRIsEditable && !proposal && !editedClarification && item.status === 'valid'; // This item is being superseded in active proposal
324
- // XXX: May be redundant with `isSuperseded`?
360
+ const itemIsProposable = item.status === 'valid';
361
+
362
+ if (activeCRIsEditable) {
363
+ actions.push({
364
+ children: "Propose another item like this",
365
+ icon: 'duplicate',
366
+ disabled: isBusy,
367
+ onClick: performOperation('adding duplicate item to current propposal', handleProposeLikeThis) //title="Propose a new item in current proposal, using this item as template."
325
368
 
326
- const isBeingSuperseded = (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession';
327
- const supersedingItems = isSuperseded || canBeSuperseded || isBeingSuperseded ? (0, _react2.jsx)(FormGroup, {
328
- inline: true,
329
- label: "superseded by: ",
330
- css: (0, _react2.css)`margin: 0;`
331
- }, (0, _react2.jsx)(_RelatedItems.RelatedItems, {
332
- availableClassIDs: [itemClass.meta.id],
333
- itemRefs: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' ? proposal.supersedingItemIDs.map(id => ({
334
- itemID: id,
335
- // Superseding items are always of the same class
336
- classID: itemClass.meta.id,
337
- // Superseding items are always in the same subregister
338
- subregisterID: itemRef.subregisterID
339
- })) : (_d = item.supersededBy) !== null && _d !== void 0 ? _d : [],
340
- onChange: !isBusy && activeCRIsEditable && ((proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' || !proposal && item.status === 'valid') ? items => items.length > 0 ? handleSupersedeWith(items.map(ref => ref.itemID)) : handleClearProposal() : undefined
341
- })) : null;
342
- const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(item.data);
343
- const clarificationAction = proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' || activeCRIsEditable && !proposal && item.status === 'valid' ? (0, _react2.jsx)(FormGroup, {
344
- inline: true,
345
- label: `${(_e = proposal === null || proposal === void 0 ? void 0 : proposal.type) !== null && _e !== void 0 ? _e : "clarification"}: `,
346
- css: (0, _react2.css)`margin: 0;`
347
- }, activeCRIsEditable ? (0, _react2.jsx)(_core.ButtonGroup, null, editedClarification ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
348
- intent: clarificationHasChanges ? "primary" : undefined,
349
- // TODO(perf): this is expensive if renders are frequent…
350
- disabled: !clarificationHasChanges || isBusy,
351
- onClick: !proposal || (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? handleClarify : handleEditAddition
352
- }, "Save"), (0, _react2.jsx)(_core.Button, {
353
- onClick: () => setEditedClarification(null)
354
- }, "Do not save")) : (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
355
- disabled: diffMode || isBusy,
356
- intent: "primary",
357
- outlined: true,
358
- onClick: () => setEditedClarification(item.data)
359
- }, !proposal ? "Clarify" : "Edit"), (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
360
- disabled: diffMode || isBusy || (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'clarification',
361
- intent: "warning",
362
- onClick: handleClearProposal
363
- }, "Clear")) : null)) : (0, _react2.jsx)(_core.Button, {
364
- disabled: true
365
- }, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? "Clarified" : "Added", " in active proposal")) : null;
366
- const proposeLikeThis = activeCRIsEditable && !editedClarification ? (0, _react2.jsx)(_core.Button, {
367
- title: "Propose a new item in current proposal, using this item as template.",
368
- icon: 'plus',
369
- disabled: isBusy,
370
- outlined: true,
371
- onClick: performOperation('duplicating item', handleProposeLikeThis)
372
- }, "Propose another like this") : null; // If there’s a CR context without active CR,
369
+ });
370
+ const saveEditedItemDataButton = {
371
+ intent: 'primary',
372
+ disabled: isBusy || !itemDataHasChanges,
373
+ onClick: !proposal || proposal.type === 'clarification' ? handleClarify : handleEditAddition,
374
+ children: "Save changes"
375
+ };
376
+ const supersedingItemRefs = (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' ? proposal.supersedingItemIDs.map(id => ({
377
+ itemID: id,
378
+ // Superseding items are always of the same class
379
+ classID: itemClass.meta.id,
380
+ // Superseding items are always in the same subregister
381
+ subregisterID: itemRef.subregisterID
382
+ })) : [];
383
+ const supersedingItems = (0, _react2.jsx)(_RelatedItems.RelatedItems, {
384
+ availableClassIDs: [itemClass.meta.id],
385
+ itemRefs: supersedingItemRefs,
386
+ onChange: !isBusy ? items => items.length > 0 ? handleSupersedeWith(items.map(ref => ref.itemID)) : handleClearProposal() : undefined
387
+ });
388
+
389
+ if (itemIsProposable) {
390
+ if (itemHasProposal) {
391
+ const proposeBtn = {
392
+ children: `Edit ${proposal.type === 'amendment' ? proposal.amendmentType : proposal.type} proposal for this item`,
393
+ icon: 'edit',
394
+ active: isEditingProposal,
395
+ disabled: isBusy,
396
+ onClick: () => {
397
+ if (isEditingProposal) {
398
+ setIsEditingProposal(false);
399
+ setEditedItemData(null);
400
+
401
+ if (proposal && proposal.type !== 'amendment') {}
402
+ } else {
403
+ setIsEditingProposal(true);
404
+
405
+ if (proposal && proposal.type !== 'amendment') {
406
+ setEditedItemData(item.data);
407
+ }
408
+ }
409
+ }
410
+ };
411
+
412
+ if (isEditingProposal) {
413
+ const editActions = [{
414
+ disabled: isBusy || itemDataHasChanges && proposal.type !== 'amendment',
415
+ onClick: handleClearProposal,
416
+ icon: 'trash',
417
+ children: "Remove",
418
+ tooltip: [`NOTE: Discarding this proposal `, `will discard ${proposal.type === 'addition' ? "new" : "changes to"} item’s data `, 'you provided as part of the proposal.'].join(''),
419
+ intent: proposal.type !== 'amendment' ? 'danger' : 'warning'
420
+ }];
421
+
422
+ if (isEditingItemData) {
423
+ editActions.push(saveEditedItemDataButton);
424
+ } else if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {
425
+ editActions.push({
426
+ disabled: isBusy,
427
+ children: "Specify superseding items",
428
+ popup: (0, _react2.jsx)("div", {
429
+ css: (0, _react2.css)`padding: 10px;`
430
+ }, supersedingItems)
431
+ });
432
+ }
433
+
434
+ actions.push([proposeBtn, ...editActions]);
435
+ } else {
436
+ actions.push(proposeBtn);
437
+ }
438
+ } else {
439
+ const proposeBtn = {
440
+ children: "Propose to change this item",
441
+ icon: 'lightbulb',
442
+ active: isEditingProposal,
443
+ disabled: isBusy,
444
+ onClick: () => setIsEditingProposal(v => !v)
445
+ };
446
+
447
+ if (isEditingProposal) {
448
+ const proposalGroup = [proposeBtn, {
449
+ disabled: isBusy || itemHasProposal,
450
+ onClick: handleRetire,
451
+ children: "Retire"
452
+ }, {
453
+ disabled: isBusy || itemHasProposal,
454
+ onClick: handleInvalidate,
455
+ children: "Invalidate"
456
+ }, {
457
+ disabled: isBusy || itemHasProposal || isEditingItemData,
458
+ popup: supersedingItems,
459
+ children: "Supersede"
460
+ }, {
461
+ disabled: isBusy || diffMode,
462
+ active: isEditingItemData,
463
+ onClick: () => setEditedItemData(d => d === null ? item.data : null),
464
+ children: "Clarify"
465
+ }];
466
+
467
+ if (isEditingItemData && itemDataHasChanges) {
468
+ proposalGroup.push(saveEditedItemDataButton);
469
+ }
470
+
471
+ actions.push(proposalGroup);
472
+ } else {
473
+ actions.push(proposeBtn);
474
+ }
475
+ }
476
+ }
477
+ } // TODO: diff view
478
+
479
+
480
+ return actions;
481
+ }, [isBusy, itemClass.meta.id, proposal === null, proposal === null || proposal === void 0 ? void 0 : proposal.type, (_e = proposal === null || proposal === void 0 ? void 0 : proposal.supersedingItemIDs) === null || _e === void 0 ? void 0 : _e.toString(), activeCRIsEditable, editedItemData === null, itemDataHasChanges, isEditingProposal, performOperation, handleSetProposal]); // If there’s a CR context without active CR,
373
482
  // or active CR isn’t the same as the one in CR context,
374
483
  // then we can assume that the item is shown in proposal window
375
484
  // and we’d set window title to proposal’s title rather than item’s.
@@ -379,22 +488,17 @@ const ItemDetail = (0, _react.memo)(function ({
379
488
  // (makes sense because the user *is* technically viewing a proposal then).
380
489
 
381
490
  const windowTitle = activeCR && (!globallyActiveCRID || activeCR.id !== globallyActiveCRID || activeCR.items[itemPath]) ? `Proposal ${(0, _util2.maybeEllipsizeString)(activeCR.justification, 20)}…` : `${(_f = itemClass.meta.title) !== null && _f !== void 0 ? _f : 'register item'} #${item.id}`;
382
- return (0, _react2.jsx)(_util2.TabContentsWithActions, {
383
- actions: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(FormGroup, {
384
- inline: true,
385
- labelInfo: (0, _react2.jsx)(_HelpTooltip.default, {
386
- icon: 'info-sign',
387
- content: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.H5, null, itemClass.meta.title), (_g = itemClass.meta.description) !== null && _g !== void 0 ? _g : "No description is provided for this register item class.", (0, _react2.jsx)(_core.UL, null, (0, _react2.jsx)("li", null, "Class ID: ", itemClass.meta.id), (0, _react2.jsx)("li", null, "Subregister ID: ", (_h = itemRef.subregisterID) !== null && _h !== void 0 ? _h : 'N/A'), (0, _react2.jsx)("li", null, "UUID: ", itemRef.itemID)))
388
- }),
389
- label: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("strong", null, itemClass.meta.title), itemRef.subregisterID ? (0, _react2.jsx)("span", {
390
- title: "Subregister"
391
- }, " in ", (_k = (_j = subregisters === null || subregisters === void 0 ? void 0 : subregisters[itemRef.subregisterID]) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : itemRef.subregisterID) : null),
392
- css: (0, _react2.css)`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`
393
- }, itemStatus, supersedingItems, clarificationAction, proposeLikeThis)),
394
- main: (0, _react2.jsx)(_core.Card, {
395
- css: (0, _react2.css)`position: absolute; inset: ${inProposalWithID ? '0' : '10px'}; overflow-y: auto;`
396
- }, (0, _react2.jsx)(_util2.RegisterHelmet, null, (0, _react2.jsx)("title", null, windowTitle)), details)
397
- });
491
+ return (0, _react2.jsx)(_util2.TabContentsWithHeader, {
492
+ smallTitle: compactHeader,
493
+ title: (0, _react2.jsx)(ListItemView, {
494
+ itemRef: itemRef,
495
+ itemData: item.data
496
+ }),
497
+ classification: classification,
498
+ actions: actions
499
+ }, (0, _react2.jsx)(_core.Card, {
500
+ css: (0, _react2.css)`position: absolute; border-radius: 0; inset: ${compactHeader ? '0' : '10px'}; overflow-y: auto;`
501
+ }, (0, _react2.jsx)(_util2.RegisterHelmet, null, (0, _react2.jsx)("title", null, windowTitle)), details));
398
502
  });
399
503
  exports.ItemDetail = ItemDetail;
400
504
 
@@ -427,10 +531,4 @@ var _default = {
427
531
  main: MaybeItemDetail,
428
532
  title: ItemTitle
429
533
  };
430
- exports.default = _default;
431
- const FormGroup = (0, _styled.default)(_core.FormGroup)`
432
- margin: 0;
433
- label.bp4-label {
434
- white-space: nowrap;
435
- }
436
- `;
534
+ exports.default = _default;