@riboseinc/paneron-registry-kit 2.0.0 → 2.0.1

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 (503) hide show
  1. package/LICENSE +21 -0
  2. package/README.adoc +35 -0
  3. package/compiled/common.js +2 -0
  4. package/compiled/index.js +21 -0
  5. package/compiled/migrations/initial.js +8 -0
  6. package/compiled/types/cr.js +131 -0
  7. package/compiled/types/index.js +8 -0
  8. package/compiled/types/item.js +22 -0
  9. package/compiled/types/proposal.js +21 -0
  10. package/compiled/types/register.js +25 -0
  11. package/compiled/types/registry.js +10 -0
  12. package/compiled/types/stakeholder.js +34 -0
  13. package/compiled/types/util.js +3 -0
  14. package/compiled/types/views.js +2 -0
  15. package/compiled/views/AnnotatedChange.js +57 -0
  16. package/compiled/views/BrowserCtx.js +19 -0
  17. package/compiled/views/FilterCriteria/CRITERIA_CONFIGURATION.js +110 -0
  18. package/compiled/views/FilterCriteria/criteriaGroupToQueryExpression.js +40 -0
  19. package/compiled/views/FilterCriteria/criteriaGroupToSummary.js +47 -0
  20. package/compiled/views/FilterCriteria/criteriaToNodes.js +89 -0
  21. package/compiled/views/FilterCriteria/index.js +75 -0
  22. package/compiled/views/FilterCriteria/models.js +28 -0
  23. package/compiled/views/FilterCriteria/mutateGroup.js +53 -0
  24. package/compiled/views/GenericRelatedItemView.js +147 -0
  25. package/compiled/views/RegisterStakeholder.js +19 -0
  26. package/compiled/views/RegisterVersion.js +20 -0
  27. package/compiled/views/SearchQuery.js +58 -0
  28. package/compiled/views/change-request/ChangeRequestContext.js +30 -0
  29. package/compiled/views/change-request/Proposals.js +185 -0
  30. package/compiled/views/change-request/objectChangeset.js +189 -0
  31. package/compiled/views/detail/ChangeRequest/Proposal.js +144 -0
  32. package/compiled/views/detail/ChangeRequest/index.js +140 -0
  33. package/compiled/views/detail/ChangeRequest/transitions.js +418 -0
  34. package/compiled/views/detail/CustomView/index.js +32 -0
  35. package/compiled/views/detail/RegisterHome/index.js +70 -0
  36. package/compiled/views/detail/RegisterItem/RelatedItems.d.ts +14 -0
  37. package/compiled/views/detail/RegisterItem/RelatedItems.js +28 -0
  38. package/compiled/views/detail/RegisterItem/RelatedItems.js.map +1 -0
  39. package/compiled/views/detail/RegisterItem/SupersedingItemMenu.js +27 -0
  40. package/compiled/views/detail/RegisterItem/index.js +277 -0
  41. package/compiled/views/detail/RegisterItem/index.js.map +1 -0
  42. package/compiled/views/detail/RegisterMeta/RegisterMetaForm.js +135 -0
  43. package/compiled/views/detail/RegisterMeta/index.js +61 -0
  44. package/compiled/views/detail/index.js +11 -0
  45. package/compiled/views/diffing/InlineDiff.js +20 -0
  46. package/compiled/views/diffing/StructuredDiff.js +38 -0
  47. package/compiled/views/hooks/useCustomView.js +14 -0
  48. package/compiled/views/hooks/useItemClassConfig.js +14 -0
  49. package/compiled/views/hooks/useItemRef.js +26 -0
  50. package/compiled/views/hooks/useSingleRegisterItemData.js +21 -0
  51. package/compiled/views/index.js +142 -0
  52. package/compiled/views/itemPathUtils.js +115 -0
  53. package/compiled/views/itemQueryUtils.js +42 -0
  54. package/compiled/views/protocolRegistry.js +24 -0
  55. package/compiled/views/sidebar/Browse/index.js +278 -0
  56. package/compiled/views/sidebar/Export/index.js +47 -0
  57. package/compiled/views/sidebar/ListItem.js +23 -0
  58. package/compiled/views/sidebar/Registration/index.js +114 -0
  59. package/compiled/views/sidebar/Search/index.js +100 -0
  60. package/compiled/views/sidebar/index.js +73 -0
  61. package/compiled/views/util.js +63 -0
  62. package/dependencies-local/extension-kit/SettingsContext.d.ts +8 -0
  63. package/dependencies-local/extension-kit/SettingsContext.js +19 -0
  64. package/dependencies-local/extension-kit/SettingsContext.js.map +1 -0
  65. package/dependencies-local/extension-kit/context.d.ts +11 -0
  66. package/dependencies-local/extension-kit/context.js +133 -0
  67. package/dependencies-local/extension-kit/context.js.map +1 -0
  68. package/dependencies-local/extension-kit/i18n/ContextProvider.d.ts +9 -0
  69. package/dependencies-local/extension-kit/i18n/ContextProvider.js +33 -0
  70. package/dependencies-local/extension-kit/i18n/ContextProvider.js.map +1 -0
  71. package/dependencies-local/extension-kit/i18n/context.d.ts +9 -0
  72. package/dependencies-local/extension-kit/i18n/context.js +23 -0
  73. package/dependencies-local/extension-kit/i18n/context.js.map +1 -0
  74. package/dependencies-local/extension-kit/i18n/types.d.ts +10 -0
  75. package/dependencies-local/extension-kit/i18n/types.js.map +1 -0
  76. package/dependencies-local/extension-kit/i18n/widgets.d.ts +16 -0
  77. package/dependencies-local/extension-kit/i18n/widgets.js +56 -0
  78. package/dependencies-local/extension-kit/i18n/widgets.js.map +1 -0
  79. package/dependencies-local/extension-kit/index.d.ts +3 -0
  80. package/dependencies-local/extension-kit/index.js +78 -0
  81. package/dependencies-local/extension-kit/index.js.map +1 -0
  82. package/dependencies-local/extension-kit/object-specs/index.d.ts +2 -0
  83. package/dependencies-local/extension-kit/object-specs/index.js +22 -0
  84. package/dependencies-local/extension-kit/object-specs/index.js.map +1 -0
  85. package/dependencies-local/extension-kit/object-specs/paneron-object.d.ts +6 -0
  86. package/dependencies-local/extension-kit/object-specs/paneron-object.js +161 -0
  87. package/dependencies-local/extension-kit/object-specs/paneron-object.js.map +1 -0
  88. package/dependencies-local/extension-kit/object-specs/ser-des.d.ts +31 -0
  89. package/dependencies-local/extension-kit/object-specs/ser-des.js +187 -0
  90. package/dependencies-local/extension-kit/object-specs/ser-des.js.map +1 -0
  91. package/dependencies-local/extension-kit/object-specs/yaml/custom-bool.d.ts +2 -0
  92. package/dependencies-local/extension-kit/object-specs/yaml/custom-bool.js +42 -0
  93. package/dependencies-local/extension-kit/object-specs/yaml/custom-bool.js.map +1 -0
  94. package/dependencies-local/extension-kit/object-specs/yaml/custom-timestamp.d.ts +3 -0
  95. package/dependencies-local/extension-kit/object-specs/yaml/custom-timestamp.js +110 -0
  96. package/dependencies-local/extension-kit/object-specs/yaml/custom-timestamp.js.map +1 -0
  97. package/dependencies-local/extension-kit/object-specs/yaml/index.d.ts +9 -0
  98. package/dependencies-local/extension-kit/object-specs/yaml/index.js +36 -0
  99. package/dependencies-local/extension-kit/object-specs/yaml/index.js.map +1 -0
  100. package/dependencies-local/extension-kit/object-specs/yaml/schema.d.ts +3 -0
  101. package/dependencies-local/extension-kit/object-specs/yaml/schema.js +26 -0
  102. package/dependencies-local/extension-kit/object-specs/yaml/schema.js.map +1 -0
  103. package/dependencies-local/extension-kit/package.json +53 -0
  104. package/dependencies-local/extension-kit/settings.d.ts +6 -0
  105. package/dependencies-local/extension-kit/settings.js +11 -0
  106. package/dependencies-local/extension-kit/settings.js.map +1 -0
  107. package/dependencies-local/extension-kit/types/binary-invocation.d.ts +31 -0
  108. package/dependencies-local/extension-kit/types/binary-invocation.js.map +1 -0
  109. package/dependencies-local/extension-kit/types/buffers.d.ts +17 -0
  110. package/dependencies-local/extension-kit/types/buffers.js +5 -0
  111. package/dependencies-local/extension-kit/types/buffers.js.map +1 -0
  112. package/dependencies-local/extension-kit/types/changes.d.ts +37 -0
  113. package/dependencies-local/extension-kit/types/changes.js +5 -0
  114. package/dependencies-local/extension-kit/types/changes.js.map +1 -0
  115. package/dependencies-local/extension-kit/types/data.d.ts +54 -0
  116. package/dependencies-local/extension-kit/types/data.js +5 -0
  117. package/dependencies-local/extension-kit/types/data.js.map +1 -0
  118. package/dependencies-local/extension-kit/types/dialogs.d.ts +15 -0
  119. package/dependencies-local/extension-kit/types/dialogs.js +5 -0
  120. package/dependencies-local/extension-kit/types/dialogs.js.map +1 -0
  121. package/dependencies-local/extension-kit/types/extension-maker.d.ts +17 -0
  122. package/dependencies-local/extension-kit/types/extension-maker.js +5 -0
  123. package/dependencies-local/extension-kit/types/extension-maker.js.map +1 -0
  124. package/dependencies-local/extension-kit/types/extension.d.ts +27 -0
  125. package/dependencies-local/extension-kit/types/extension.js +5 -0
  126. package/dependencies-local/extension-kit/types/extension.js.map +1 -0
  127. package/dependencies-local/extension-kit/types/index.d.ts +3 -0
  128. package/dependencies-local/extension-kit/types/index.js +41 -0
  129. package/dependencies-local/extension-kit/types/index.js.map +1 -0
  130. package/dependencies-local/extension-kit/types/indexes.d.ts +6 -0
  131. package/dependencies-local/extension-kit/types/indexes.js +15 -0
  132. package/dependencies-local/extension-kit/types/indexes.js.map +1 -0
  133. package/dependencies-local/extension-kit/types/migrations.d.ts +15 -0
  134. package/dependencies-local/extension-kit/types/migrations.js +5 -0
  135. package/dependencies-local/extension-kit/types/migrations.js.map +1 -0
  136. package/dependencies-local/extension-kit/types/object-spec.d.ts +108 -0
  137. package/dependencies-local/extension-kit/types/object-spec.js +23 -0
  138. package/dependencies-local/extension-kit/types/object-spec.js.map +1 -0
  139. package/dependencies-local/extension-kit/types/objects.d.ts +18 -0
  140. package/dependencies-local/extension-kit/types/objects.js +5 -0
  141. package/dependencies-local/extension-kit/types/objects.js.map +1 -0
  142. package/dependencies-local/extension-kit/types/progress.d.ts +5 -0
  143. package/dependencies-local/extension-kit/types/progress.js +5 -0
  144. package/dependencies-local/extension-kit/types/progress.js.map +1 -0
  145. package/dependencies-local/extension-kit/types/renderer.d.ts +495 -0
  146. package/dependencies-local/extension-kit/types/renderer.js +5 -0
  147. package/dependencies-local/extension-kit/types/renderer.js.map +1 -0
  148. package/dependencies-local/extension-kit/useDebounce.d.ts +2 -0
  149. package/dependencies-local/extension-kit/useDebounce.js +27 -0
  150. package/dependencies-local/extension-kit/useDebounce.js.map +1 -0
  151. package/dependencies-local/extension-kit/usePersistentStateReducer.d.ts +35 -0
  152. package/dependencies-local/extension-kit/usePersistentStateReducer.js +91 -0
  153. package/dependencies-local/extension-kit/usePersistentStateReducer.js.map +1 -0
  154. package/dependencies-local/extension-kit/useTimeTravelingPersistentStateReducer.d.ts +48 -0
  155. package/dependencies-local/extension-kit/useTimeTravelingPersistentStateReducer.js +116 -0
  156. package/dependencies-local/extension-kit/useTimeTravelingPersistentStateReducer.js.map +1 -0
  157. package/dependencies-local/extension-kit/util.d.ts +8 -0
  158. package/dependencies-local/extension-kit/util.js +21 -0
  159. package/dependencies-local/extension-kit/util.js.map +1 -0
  160. package/dependencies-local/extension-kit/widgets/ErrorState.d.ts +8 -0
  161. package/dependencies-local/extension-kit/widgets/ErrorState.js +44 -0
  162. package/dependencies-local/extension-kit/widgets/ErrorState.js.map +1 -0
  163. package/dependencies-local/extension-kit/widgets/Grid.d.ts +41 -0
  164. package/dependencies-local/extension-kit/widgets/Grid.js +213 -0
  165. package/dependencies-local/extension-kit/widgets/Grid.js.map +1 -0
  166. package/dependencies-local/extension-kit/widgets/HelpTooltip.d.ts +18 -0
  167. package/dependencies-local/extension-kit/widgets/HelpTooltip.js +84 -0
  168. package/dependencies-local/extension-kit/widgets/HelpTooltip.js.map +1 -0
  169. package/dependencies-local/extension-kit/widgets/ItemCount.d.ts +19 -0
  170. package/dependencies-local/extension-kit/widgets/ItemCount.js +78 -0
  171. package/dependencies-local/extension-kit/widgets/ItemCount.js.map +1 -0
  172. package/dependencies-local/extension-kit/widgets/List.d.ts +40 -0
  173. package/dependencies-local/extension-kit/widgets/List.js +191 -0
  174. package/dependencies-local/extension-kit/widgets/List.js.map +1 -0
  175. package/dependencies-local/extension-kit/widgets/Navbar.d.ts +20 -0
  176. package/dependencies-local/extension-kit/widgets/Navbar.js +75 -0
  177. package/dependencies-local/extension-kit/widgets/Navbar.js.map +1 -0
  178. package/dependencies-local/extension-kit/widgets/SearchResultList.d.ts +24 -0
  179. package/dependencies-local/extension-kit/widgets/SearchResultList.js +201 -0
  180. package/dependencies-local/extension-kit/widgets/SearchResultList.js.map +1 -0
  181. package/dependencies-local/extension-kit/widgets/Sidebar/Block.d.ts +21 -0
  182. package/dependencies-local/extension-kit/widgets/Sidebar/Block.js +94 -0
  183. package/dependencies-local/extension-kit/widgets/Sidebar/Block.js.map +1 -0
  184. package/dependencies-local/extension-kit/widgets/Sidebar/BlockStateButtonGroup.d.ts +6 -0
  185. package/dependencies-local/extension-kit/widgets/Sidebar/BlockStateButtonGroup.js +22 -0
  186. package/dependencies-local/extension-kit/widgets/Sidebar/BlockStateButtonGroup.js.map +1 -0
  187. package/dependencies-local/extension-kit/widgets/Sidebar/PropertyView.d.ts +28 -0
  188. package/dependencies-local/extension-kit/widgets/Sidebar/PropertyView.js +148 -0
  189. package/dependencies-local/extension-kit/widgets/Sidebar/PropertyView.js.map +1 -0
  190. package/dependencies-local/extension-kit/widgets/Sidebar/index.d.ts +27 -0
  191. package/dependencies-local/extension-kit/widgets/Sidebar/index.js +178 -0
  192. package/dependencies-local/extension-kit/widgets/Sidebar/index.js.map +1 -0
  193. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/SuperSidebar.d.ts +13 -0
  194. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/SuperSidebar.js +82 -0
  195. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/SuperSidebar.js.map +1 -0
  196. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/context.d.ts +10 -0
  197. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/context.js +168 -0
  198. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/context.js.map +1 -0
  199. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/detail.d.ts +9 -0
  200. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/detail.js +66 -0
  201. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/detail.js.map +1 -0
  202. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/index.d.ts +33 -0
  203. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/index.js +204 -0
  204. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/index.js.map +1 -0
  205. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/types.d.ts +74 -0
  206. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/types.js +5 -0
  207. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/types.js.map +1 -0
  208. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/util.d.ts +1 -0
  209. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/util.js +14 -0
  210. package/dependencies-local/extension-kit/widgets/TabbedWorkspace/util.js.map +1 -0
  211. package/dependencies-local/extension-kit/widgets/Workspace.d.ts +38 -0
  212. package/dependencies-local/extension-kit/widgets/Workspace.js +99 -0
  213. package/dependencies-local/extension-kit/widgets/Workspace.js.map +1 -0
  214. package/dependencies-local/extension-kit/widgets/panels/PanelSeparator.d.ts +12 -0
  215. package/dependencies-local/extension-kit/widgets/panels/PanelSeparator.js +57 -0
  216. package/dependencies-local/extension-kit/widgets/panels/PanelSeparator.js.map +1 -0
  217. package/dependencies-local/extension-kit/widgets/panels/index.d.ts +28 -0
  218. package/dependencies-local/extension-kit/widgets/panels/index.js +169 -0
  219. package/dependencies-local/extension-kit/widgets/panels/index.js.map +1 -0
  220. package/dist/common.d.ts +1 -0
  221. package/dist/common.js.map +1 -0
  222. package/dist/index.d.ts +6 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/migrations/initial.d.ts +3 -0
  225. package/dist/migrations/initial.js.map +1 -0
  226. package/dist/package.json +56 -0
  227. package/dist/types/cr.d.ts +216 -0
  228. package/dist/types/cr.js.map +1 -0
  229. package/dist/types/index.d.ts +7 -0
  230. package/dist/types/index.js.map +1 -0
  231. package/dist/types/item.d.ts +59 -0
  232. package/dist/types/item.js.map +1 -0
  233. package/dist/types/proposal.d.ts +64 -0
  234. package/dist/types/proposal.js.map +1 -0
  235. package/dist/types/register.d.ts +18 -0
  236. package/dist/types/register.js.map +1 -0
  237. package/dist/types/registry.d.ts +15 -0
  238. package/dist/types/registry.js.map +1 -0
  239. package/dist/types/stakeholder.d.ts +58 -0
  240. package/dist/types/stakeholder.js.map +1 -0
  241. package/dist/types/util.d.ts +21 -0
  242. package/dist/types/util.js +5 -0
  243. package/dist/types/util.js.map +1 -0
  244. package/dist/types/views.d.ts +157 -0
  245. package/dist/types/views.js +5 -0
  246. package/dist/types/views.js.map +1 -0
  247. package/dist/views/AnnotatedChange.d.ts +7 -0
  248. package/dist/views/AnnotatedChange.js.map +1 -0
  249. package/dist/views/BrowserCtx.d.ts +73 -0
  250. package/dist/views/BrowserCtx.js.map +1 -0
  251. package/dist/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +17 -0
  252. package/dist/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -0
  253. package/dist/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +6 -0
  254. package/dist/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -0
  255. package/dist/views/FilterCriteria/criteriaGroupToSummary.d.ts +5 -0
  256. package/dist/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -0
  257. package/dist/views/FilterCriteria/criteriaToNodes.d.ts +24 -0
  258. package/dist/views/FilterCriteria/criteriaToNodes.js.map +1 -0
  259. package/dist/views/FilterCriteria/index.d.ts +23 -0
  260. package/dist/views/FilterCriteria/index.js.map +1 -0
  261. package/dist/views/FilterCriteria/models.d.ts +68 -0
  262. package/dist/views/FilterCriteria/models.js.map +1 -0
  263. package/dist/views/FilterCriteria/mutateGroup.d.ts +17 -0
  264. package/dist/views/FilterCriteria/mutateGroup.js.map +1 -0
  265. package/dist/views/GenericRelatedItemView.d.ts +6 -0
  266. package/dist/views/GenericRelatedItemView.js.map +1 -0
  267. package/dist/views/RegisterStakeholder.d.ts +9 -0
  268. package/dist/views/RegisterStakeholder.js.map +1 -0
  269. package/dist/views/RegisterVersion.d.ts +9 -0
  270. package/dist/views/RegisterVersion.js.map +1 -0
  271. package/dist/views/SearchQuery.d.ts +13 -0
  272. package/dist/views/SearchQuery.js.map +1 -0
  273. package/dist/views/change-request/ChangeRequestContext.d.ts +20 -0
  274. package/dist/views/change-request/ChangeRequestContext.js.map +1 -0
  275. package/dist/views/change-request/Proposals.d.ts +21 -0
  276. package/dist/views/change-request/Proposals.js.map +1 -0
  277. package/dist/views/change-request/objectChangeset.d.ts +31 -0
  278. package/dist/views/change-request/objectChangeset.js.map +1 -0
  279. package/dist/views/detail/ChangeRequest/Proposal.d.ts +0 -0
  280. package/dist/views/detail/ChangeRequest/Proposal.js.map +1 -0
  281. package/dist/views/detail/ChangeRequest/index.d.ts +13 -0
  282. package/dist/views/detail/ChangeRequest/index.js.map +1 -0
  283. package/dist/views/detail/ChangeRequest/transitions.d.ts +28 -0
  284. package/dist/views/detail/ChangeRequest/transitions.js.map +1 -0
  285. package/dist/views/detail/CustomView/index.d.ts +13 -0
  286. package/dist/views/detail/CustomView/index.js.map +1 -0
  287. package/dist/views/detail/RegisterHome/index.d.ts +5 -0
  288. package/dist/views/detail/RegisterHome/index.js.map +1 -0
  289. package/dist/views/detail/RegisterItem/RelatedItems.d.ts +14 -0
  290. package/{views → dist/views}/detail/RegisterItem/RelatedItems.js +5 -5
  291. package/dist/views/detail/RegisterItem/RelatedItems.js.map +1 -0
  292. package/dist/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
  293. package/dist/views/detail/RegisterItem/index.d.ts +13 -0
  294. package/{views → dist/views}/detail/RegisterItem/index.js +3 -2
  295. package/dist/views/detail/RegisterItem/index.js.map +1 -0
  296. package/dist/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
  297. package/dist/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
  298. package/dist/views/detail/RegisterMeta/index.d.ts +10 -0
  299. package/dist/views/detail/RegisterMeta/index.js.map +1 -0
  300. package/dist/views/detail/index.d.ts +1 -0
  301. package/dist/views/detail/index.js.map +1 -0
  302. package/dist/views/diffing/InlineDiff.d.ts +12 -0
  303. package/dist/views/diffing/InlineDiff.js.map +1 -0
  304. package/dist/views/diffing/StructuredDiff.d.ts +11 -0
  305. package/dist/views/diffing/StructuredDiff.js.map +1 -0
  306. package/dist/views/hooks/useCustomView.d.ts +3 -0
  307. package/dist/views/hooks/useCustomView.js.map +1 -0
  308. package/dist/views/hooks/useItemClassConfig.d.ts +3 -0
  309. package/dist/views/hooks/useItemClassConfig.js.map +1 -0
  310. package/dist/views/hooks/useItemRef.d.ts +3 -0
  311. package/dist/views/hooks/useItemRef.js.map +1 -0
  312. package/dist/views/hooks/useSingleRegisterItemData.d.ts +3 -0
  313. package/dist/views/hooks/useSingleRegisterItemData.js.map +1 -0
  314. package/dist/views/index.d.ts +7 -0
  315. package/dist/views/index.js.map +1 -0
  316. package/dist/views/itemPathUtils.d.ts +52 -0
  317. package/dist/views/itemPathUtils.js.map +1 -0
  318. package/dist/views/itemQueryUtils.d.ts +11 -0
  319. package/dist/views/itemQueryUtils.js.map +1 -0
  320. package/dist/views/protocolRegistry.d.ts +12 -0
  321. package/dist/views/protocolRegistry.js.map +1 -0
  322. package/dist/views/sidebar/Browse/index.d.ts +11 -0
  323. package/dist/views/sidebar/Browse/index.js.map +1 -0
  324. package/dist/views/sidebar/Export/index.d.ts +5 -0
  325. package/dist/views/sidebar/Export/index.js.map +1 -0
  326. package/dist/views/sidebar/ListItem.d.ts +10 -0
  327. package/dist/views/sidebar/ListItem.js.map +1 -0
  328. package/dist/views/sidebar/Registration/index.d.ts +5 -0
  329. package/dist/views/sidebar/Registration/index.js.map +1 -0
  330. package/dist/views/sidebar/Search/index.d.ts +18 -0
  331. package/dist/views/sidebar/Search/index.js.map +1 -0
  332. package/dist/views/sidebar/index.d.ts +6 -0
  333. package/dist/views/sidebar/index.js.map +1 -0
  334. package/dist/views/util.d.ts +36 -0
  335. package/dist/views/util.js.map +1 -0
  336. package/package.json +2 -1
  337. package/react-visual-diff.d.ts +9 -0
  338. package/views/detail/RegisterItem/RelatedItems.js.map +0 -1
  339. package/views/detail/RegisterItem/index.js.map +0 -1
  340. /package/{common.d.ts → compiled/common.d.ts} +0 -0
  341. /package/{common.js.map → compiled/common.js.map} +0 -0
  342. /package/{index.d.ts → compiled/index.d.ts} +0 -0
  343. /package/{index.js.map → compiled/index.js.map} +0 -0
  344. /package/{migrations → compiled/migrations}/initial.d.ts +0 -0
  345. /package/{migrations → compiled/migrations}/initial.js.map +0 -0
  346. /package/{types → compiled/types}/cr.d.ts +0 -0
  347. /package/{types → compiled/types}/cr.js.map +0 -0
  348. /package/{types → compiled/types}/index.d.ts +0 -0
  349. /package/{types → compiled/types}/index.js.map +0 -0
  350. /package/{types → compiled/types}/item.d.ts +0 -0
  351. /package/{types → compiled/types}/item.js.map +0 -0
  352. /package/{types → compiled/types}/proposal.d.ts +0 -0
  353. /package/{types → compiled/types}/proposal.js.map +0 -0
  354. /package/{types → compiled/types}/register.d.ts +0 -0
  355. /package/{types → compiled/types}/register.js.map +0 -0
  356. /package/{types → compiled/types}/registry.d.ts +0 -0
  357. /package/{types → compiled/types}/registry.js.map +0 -0
  358. /package/{types → compiled/types}/stakeholder.d.ts +0 -0
  359. /package/{types → compiled/types}/stakeholder.js.map +0 -0
  360. /package/{types → compiled/types}/util.d.ts +0 -0
  361. /package/{types → compiled/types}/util.js.map +0 -0
  362. /package/{types → compiled/types}/views.d.ts +0 -0
  363. /package/{types → compiled/types}/views.js.map +0 -0
  364. /package/{views → compiled/views}/AnnotatedChange.d.ts +0 -0
  365. /package/{views → compiled/views}/AnnotatedChange.js.map +0 -0
  366. /package/{views → compiled/views}/BrowserCtx.d.ts +0 -0
  367. /package/{views → compiled/views}/BrowserCtx.js.map +0 -0
  368. /package/{views → compiled/views}/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +0 -0
  369. /package/{views → compiled/views}/FilterCriteria/CRITERIA_CONFIGURATION.js.map +0 -0
  370. /package/{views → compiled/views}/FilterCriteria/criteriaGroupToQueryExpression.d.ts +0 -0
  371. /package/{views → compiled/views}/FilterCriteria/criteriaGroupToQueryExpression.js.map +0 -0
  372. /package/{views → compiled/views}/FilterCriteria/criteriaGroupToSummary.d.ts +0 -0
  373. /package/{views → compiled/views}/FilterCriteria/criteriaGroupToSummary.js.map +0 -0
  374. /package/{views → compiled/views}/FilterCriteria/criteriaToNodes.d.ts +0 -0
  375. /package/{views → compiled/views}/FilterCriteria/criteriaToNodes.js.map +0 -0
  376. /package/{views → compiled/views}/FilterCriteria/index.d.ts +0 -0
  377. /package/{views → compiled/views}/FilterCriteria/index.js.map +0 -0
  378. /package/{views → compiled/views}/FilterCriteria/models.d.ts +0 -0
  379. /package/{views → compiled/views}/FilterCriteria/models.js.map +0 -0
  380. /package/{views → compiled/views}/FilterCriteria/mutateGroup.d.ts +0 -0
  381. /package/{views → compiled/views}/FilterCriteria/mutateGroup.js.map +0 -0
  382. /package/{views → compiled/views}/GenericRelatedItemView.d.ts +0 -0
  383. /package/{views → compiled/views}/GenericRelatedItemView.js.map +0 -0
  384. /package/{views → compiled/views}/RegisterStakeholder.d.ts +0 -0
  385. /package/{views → compiled/views}/RegisterStakeholder.js.map +0 -0
  386. /package/{views → compiled/views}/RegisterVersion.d.ts +0 -0
  387. /package/{views → compiled/views}/RegisterVersion.js.map +0 -0
  388. /package/{views → compiled/views}/SearchQuery.d.ts +0 -0
  389. /package/{views → compiled/views}/SearchQuery.js.map +0 -0
  390. /package/{views → compiled/views}/change-request/ChangeRequestContext.d.ts +0 -0
  391. /package/{views → compiled/views}/change-request/ChangeRequestContext.js.map +0 -0
  392. /package/{views → compiled/views}/change-request/Proposals.d.ts +0 -0
  393. /package/{views → compiled/views}/change-request/Proposals.js.map +0 -0
  394. /package/{views → compiled/views}/change-request/objectChangeset.d.ts +0 -0
  395. /package/{views → compiled/views}/change-request/objectChangeset.js.map +0 -0
  396. /package/{views → compiled/views}/detail/ChangeRequest/Proposal.d.ts +0 -0
  397. /package/{views → compiled/views}/detail/ChangeRequest/Proposal.js.map +0 -0
  398. /package/{views → compiled/views}/detail/ChangeRequest/index.d.ts +0 -0
  399. /package/{views → compiled/views}/detail/ChangeRequest/index.js.map +0 -0
  400. /package/{views → compiled/views}/detail/ChangeRequest/transitions.d.ts +0 -0
  401. /package/{views → compiled/views}/detail/ChangeRequest/transitions.js.map +0 -0
  402. /package/{views → compiled/views}/detail/CustomView/index.d.ts +0 -0
  403. /package/{views → compiled/views}/detail/CustomView/index.js.map +0 -0
  404. /package/{views → compiled/views}/detail/RegisterHome/index.d.ts +0 -0
  405. /package/{views → compiled/views}/detail/RegisterHome/index.js.map +0 -0
  406. /package/{views → compiled/views}/detail/RegisterItem/SupersedingItemMenu.d.ts +0 -0
  407. /package/{views → compiled/views}/detail/RegisterItem/SupersedingItemMenu.js.map +0 -0
  408. /package/{views → compiled/views}/detail/RegisterItem/index.d.ts +0 -0
  409. /package/{views → compiled/views}/detail/RegisterMeta/RegisterMetaForm.d.ts +0 -0
  410. /package/{views → compiled/views}/detail/RegisterMeta/RegisterMetaForm.js.map +0 -0
  411. /package/{views → compiled/views}/detail/RegisterMeta/index.d.ts +0 -0
  412. /package/{views → compiled/views}/detail/RegisterMeta/index.js.map +0 -0
  413. /package/{views → compiled/views}/detail/index.d.ts +0 -0
  414. /package/{views → compiled/views}/detail/index.js.map +0 -0
  415. /package/{views → compiled/views}/diffing/InlineDiff.d.ts +0 -0
  416. /package/{views → compiled/views}/diffing/InlineDiff.js.map +0 -0
  417. /package/{views → compiled/views}/diffing/StructuredDiff.d.ts +0 -0
  418. /package/{views → compiled/views}/diffing/StructuredDiff.js.map +0 -0
  419. /package/{views → compiled/views}/hooks/useCustomView.d.ts +0 -0
  420. /package/{views → compiled/views}/hooks/useCustomView.js.map +0 -0
  421. /package/{views → compiled/views}/hooks/useItemClassConfig.d.ts +0 -0
  422. /package/{views → compiled/views}/hooks/useItemClassConfig.js.map +0 -0
  423. /package/{views → compiled/views}/hooks/useItemRef.d.ts +0 -0
  424. /package/{views → compiled/views}/hooks/useItemRef.js.map +0 -0
  425. /package/{views → compiled/views}/hooks/useSingleRegisterItemData.d.ts +0 -0
  426. /package/{views → compiled/views}/hooks/useSingleRegisterItemData.js.map +0 -0
  427. /package/{views → compiled/views}/index.d.ts +0 -0
  428. /package/{views → compiled/views}/index.js.map +0 -0
  429. /package/{views → compiled/views}/itemPathUtils.d.ts +0 -0
  430. /package/{views → compiled/views}/itemPathUtils.js.map +0 -0
  431. /package/{views → compiled/views}/itemQueryUtils.d.ts +0 -0
  432. /package/{views → compiled/views}/itemQueryUtils.js.map +0 -0
  433. /package/{views → compiled/views}/protocolRegistry.d.ts +0 -0
  434. /package/{views → compiled/views}/protocolRegistry.js.map +0 -0
  435. /package/{views → compiled/views}/sidebar/Browse/index.d.ts +0 -0
  436. /package/{views → compiled/views}/sidebar/Browse/index.js.map +0 -0
  437. /package/{views → compiled/views}/sidebar/Export/index.d.ts +0 -0
  438. /package/{views → compiled/views}/sidebar/Export/index.js.map +0 -0
  439. /package/{views → compiled/views}/sidebar/ListItem.d.ts +0 -0
  440. /package/{views → compiled/views}/sidebar/ListItem.js.map +0 -0
  441. /package/{views → compiled/views}/sidebar/Registration/index.d.ts +0 -0
  442. /package/{views → compiled/views}/sidebar/Registration/index.js.map +0 -0
  443. /package/{views → compiled/views}/sidebar/Search/index.d.ts +0 -0
  444. /package/{views → compiled/views}/sidebar/Search/index.js.map +0 -0
  445. /package/{views → compiled/views}/sidebar/index.d.ts +0 -0
  446. /package/{views → compiled/views}/sidebar/index.js.map +0 -0
  447. /package/{views → compiled/views}/util.d.ts +0 -0
  448. /package/{views → compiled/views}/util.js.map +0 -0
  449. /package/{types/util.js → dependencies-local/extension-kit/i18n/types.js} +0 -0
  450. /package/{types/views.js → dependencies-local/extension-kit/types/binary-invocation.js} +0 -0
  451. /package/{common.js → dist/common.js} +0 -0
  452. /package/{index.js → dist/index.js} +0 -0
  453. /package/{migrations → dist/migrations}/initial.js +0 -0
  454. /package/{types → dist/types}/cr.js +0 -0
  455. /package/{types → dist/types}/index.js +0 -0
  456. /package/{types → dist/types}/item.js +0 -0
  457. /package/{types → dist/types}/proposal.js +0 -0
  458. /package/{types → dist/types}/register.js +0 -0
  459. /package/{types → dist/types}/registry.js +0 -0
  460. /package/{types → dist/types}/stakeholder.js +0 -0
  461. /package/{views → dist/views}/AnnotatedChange.js +0 -0
  462. /package/{views → dist/views}/BrowserCtx.js +0 -0
  463. /package/{views → dist/views}/FilterCriteria/CRITERIA_CONFIGURATION.js +0 -0
  464. /package/{views → dist/views}/FilterCriteria/criteriaGroupToQueryExpression.js +0 -0
  465. /package/{views → dist/views}/FilterCriteria/criteriaGroupToSummary.js +0 -0
  466. /package/{views → dist/views}/FilterCriteria/criteriaToNodes.js +0 -0
  467. /package/{views → dist/views}/FilterCriteria/index.js +0 -0
  468. /package/{views → dist/views}/FilterCriteria/models.js +0 -0
  469. /package/{views → dist/views}/FilterCriteria/mutateGroup.js +0 -0
  470. /package/{views → dist/views}/GenericRelatedItemView.js +0 -0
  471. /package/{views → dist/views}/RegisterStakeholder.js +0 -0
  472. /package/{views → dist/views}/RegisterVersion.js +0 -0
  473. /package/{views → dist/views}/SearchQuery.js +0 -0
  474. /package/{views → dist/views}/change-request/ChangeRequestContext.js +0 -0
  475. /package/{views → dist/views}/change-request/Proposals.js +0 -0
  476. /package/{views → dist/views}/change-request/objectChangeset.js +0 -0
  477. /package/{views → dist/views}/detail/ChangeRequest/Proposal.js +0 -0
  478. /package/{views → dist/views}/detail/ChangeRequest/index.js +0 -0
  479. /package/{views → dist/views}/detail/ChangeRequest/transitions.js +0 -0
  480. /package/{views → dist/views}/detail/CustomView/index.js +0 -0
  481. /package/{views → dist/views}/detail/RegisterHome/index.js +0 -0
  482. /package/{views/detail/RegisterItem/RelatedItems.d.ts → dist/views/detail/RegisterItem/SupersedingItemMenu.d.ts} +0 -0
  483. /package/{views → dist/views}/detail/RegisterItem/SupersedingItemMenu.js +0 -0
  484. /package/{views → dist/views}/detail/RegisterMeta/RegisterMetaForm.js +0 -0
  485. /package/{views → dist/views}/detail/RegisterMeta/index.js +0 -0
  486. /package/{views → dist/views}/detail/index.js +0 -0
  487. /package/{views → dist/views}/diffing/InlineDiff.js +0 -0
  488. /package/{views → dist/views}/diffing/StructuredDiff.js +0 -0
  489. /package/{views → dist/views}/hooks/useCustomView.js +0 -0
  490. /package/{views → dist/views}/hooks/useItemClassConfig.js +0 -0
  491. /package/{views → dist/views}/hooks/useItemRef.js +0 -0
  492. /package/{views → dist/views}/hooks/useSingleRegisterItemData.js +0 -0
  493. /package/{views → dist/views}/index.js +0 -0
  494. /package/{views → dist/views}/itemPathUtils.js +0 -0
  495. /package/{views → dist/views}/itemQueryUtils.js +0 -0
  496. /package/{views → dist/views}/protocolRegistry.js +0 -0
  497. /package/{views → dist/views}/sidebar/Browse/index.js +0 -0
  498. /package/{views → dist/views}/sidebar/Export/index.js +0 -0
  499. /package/{views → dist/views}/sidebar/ListItem.js +0 -0
  500. /package/{views → dist/views}/sidebar/Registration/index.js +0 -0
  501. /package/{views → dist/views}/sidebar/Search/index.js +0 -0
  502. /package/{views → dist/views}/sidebar/index.js +0 -0
  503. /package/{views → dist/views}/util.js +0 -0
@@ -0,0 +1,277 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React, { useContext, useState, useCallback } from 'react';
4
+ import { jsx, css } from '@emotion/react';
5
+ import styled from '@emotion/styled';
6
+ import { Button, ButtonGroup, Card, Classes, FormGroup as BaseFormGroup, ControlGroup, InputGroup, NonIdealState, UL, H5, } from '@blueprintjs/core';
7
+ import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';
8
+ import HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';
9
+ import useItemRef from '../../hooks/useItemRef';
10
+ import useSingleRegisterItemData from '../../hooks/useSingleRegisterItemData';
11
+ import useItemClassConfig from '../../hooks/useItemClassConfig';
12
+ import { Protocols } from '../../protocolRegistry';
13
+ import { isRegisterItem, } from '../../../types';
14
+ import { BrowserCtx } from '../../BrowserCtx';
15
+ import { RegisterHelmet as Helmet, maybeEllipsizeString, TabContentsWithActions, } from '../../util';
16
+ import { crIDToCRPath, getCRIDFromProposedItemPath } from '../../itemPathUtils';
17
+ import { updateCRObjectChangeset, } from '../../change-request/objectChangeset';
18
+ import { ChangeRequestContext } from '../../change-request/ChangeRequestContext';
19
+ import { RelatedItems } from './RelatedItems';
20
+ /**
21
+ * Main register item view.
22
+ *
23
+ * NOTE: while generally intended as tab content handler,
24
+ * is also reused within change request view.
25
+ */
26
+ const ItemDetail = function ({ uri, inProposalWithID }) {
27
+ const { value: ref } = useItemRef(uri);
28
+ const { value: clsConfig } = useItemClassConfig(ref?.classID ?? 'NONEXISTENT_CLASS_ID');
29
+ //const { value: itemData } = useSingleRegisterItemData(ref);
30
+ const { updateObjects, performOperation, operationKey } = useContext(DatasetContext);
31
+ const isBusy = operationKey !== undefined;
32
+ const { jumpTo, subregisters, useRegisterItemData, activeChangeRequestID: globallyActiveCRID, } = useContext(BrowserCtx);
33
+ const { changeRequest: activeCR, canEdit: activeCRIsEditable } = useContext(ChangeRequestContext);
34
+ const itemClass = clsConfig;
35
+ const itemClassID = itemClass?.meta?.id;
36
+ const itemRef = ref ?? dummyRef;
37
+ const { itemID, subregisterID } = itemRef;
38
+ const _itemPath = `${itemClassID ?? 'NONEXISTENT_CLASS'}/${itemID}.yaml`;
39
+ const itemPath = subregisterID ? `/subregisters/${subregisterID}/${_itemPath}` : `/${_itemPath}`;
40
+ const itemRequest = {
41
+ itemPaths: [itemPath],
42
+ };
43
+ const itemResponse = useRegisterItemData(itemRequest);
44
+ const itemData = itemResponse.value[itemPath];
45
+ const [editedClarification, setEditedClarification] = useState(null);
46
+ //const [ diffMode, setDiffMode ] = useState<boolean>(false);
47
+ // TODO: Implement diff mode
48
+ const diffMode = false;
49
+ const proposal = ((activeCR && activeCR.items[itemPath])
50
+ ? activeCR.items[itemPath]
51
+ : null) ?? null;
52
+ const handleClearProposal = () => performProposalOperation("draft: clear proposal", null);
53
+ const handleRetire = () => performProposalOperation("draft: propose retirement", {
54
+ type: 'amendment',
55
+ amendmentType: 'retirement',
56
+ });
57
+ const handleInvalidate = () => performProposalOperation("draft: propose invalidation", {
58
+ type: 'amendment',
59
+ amendmentType: 'invalidation',
60
+ });
61
+ const handleSupersedeWith = (items) => performProposalOperation("draft: propose supersession", {
62
+ type: 'amendment',
63
+ amendmentType: 'supersession',
64
+ supersedingItemIDs: items,
65
+ });
66
+ const handleClarify = async () => {
67
+ await performProposalOperation("draft: clarify item", {
68
+ type: 'clarification',
69
+ });
70
+ setEditedClarification(null);
71
+ };
72
+ const handleEditAddition = async () => {
73
+ await performProposalOperation("draft: edit added item", {
74
+ type: 'addition',
75
+ });
76
+ setEditedClarification(null);
77
+ };
78
+ async function performProposalOperation(summary, proposal) {
79
+ return await performOperation(summary, handleSetProposal)(summary, proposal);
80
+ }
81
+ const handleSetProposal = useCallback(async function _handleSetProposal(summary, proposal) {
82
+ if (!activeCRIsEditable || !updateObjects || !isRegisterItem(itemData)) {
83
+ throw new Error("Proposal isn’t editable");
84
+ }
85
+ if (proposal && proposal?.type !== 'amendment' && !editedClarification) {
86
+ throw new Error("Missing item data");
87
+ }
88
+ await updateObjects({
89
+ commitMessage: `${summary} for ${itemPath}`,
90
+ objectChangeset: updateCRObjectChangeset(
91
+ // TODO: We are sure it’s editable already, but casting should be avoided
92
+ activeCR, { [itemPath]: proposal }, ((proposal && proposal?.type !== 'amendment') && editedClarification)
93
+ ? { [itemPath]: { ...itemData, data: editedClarification } }
94
+ : {}),
95
+ // We need this because updateCRObjectChangeset
96
+ // omits oldValue for item data payloads.
97
+ _dangerouslySkipValidation: true,
98
+ });
99
+ }, [
100
+ updateObjects,
101
+ activeCRIsEditable,
102
+ JSON.stringify(activeCR),
103
+ JSON.stringify(itemData),
104
+ JSON.stringify(editedClarification),
105
+ ]);
106
+ if (!itemClass) {
107
+ return jsx(NonIdealState, { icon: "heart-broken", title: "Unable to show item", description: `View for ${ref?.itemID ?? uri} cannot be retrieved from item class configuration` });
108
+ }
109
+ else if (isRegisterItem(itemData)) {
110
+ let details;
111
+ if (editedClarification !== null && activeCRIsEditable) {
112
+ const EditView = itemClass.views.editView;
113
+ details = (jsx(EditView, { itemData: editedClarification, itemRef: itemRef, onChange: !isBusy
114
+ ? (newData) => {
115
+ setEditedClarification(newData);
116
+ }
117
+ : undefined }));
118
+ }
119
+ else {
120
+ const DetailView = itemClass.views.detailView ?? itemClass.views.editView;
121
+ details = (jsx(DetailView, { itemRef: itemRef, itemData: itemData.data }));
122
+ }
123
+ //const canAmend = activeCR && itemData.status === 'valid';
124
+ const itemStatus = jsx(FormGroup, { inline: true, label: "status:", css: css `margin: 0;` },
125
+ jsx(ControlGroup, { fill: true },
126
+ jsx(InputGroup, { value: proposal?.type === 'amendment'
127
+ ? `${proposal.amendmentType} proposed`
128
+ : proposal?.type === 'addition'
129
+ ? "addition proposed"
130
+ : itemData.status, intent: proposal?.type === 'amendment'
131
+ ? 'warning'
132
+ : proposal?.type === 'addition'
133
+ ? 'primary'
134
+ : itemData.status === 'valid'
135
+ ? 'success'
136
+ : undefined, leftIcon: proposal && (proposal.type === 'amendment' || proposal.type === 'addition')
137
+ ? 'asterisk'
138
+ : itemData.status === 'valid'
139
+ ? 'tick'
140
+ : itemData.status === 'invalid'
141
+ ? 'ban-circle'
142
+ : 'warning-sign', readOnly: true }),
143
+ activeCRIsEditable && !editedClarification
144
+ ? jsx(React.Fragment, null,
145
+ proposal?.type === 'addition'
146
+ ? jsx(Button, { intent: "warning", title: "Remove the proposal to add this new item.", disabled: isBusy, onClick: handleClearProposal }, "Remove proposed addition")
147
+ : null,
148
+ proposal?.type === 'amendment'
149
+ ? jsx(Button, { intent: "warning", title: `Remove amendment (${proposal.amendmentType}) for this item from current proposal.`, disabled: isBusy, onClick: handleClearProposal }, "Clear proposed amendment")
150
+ : !proposal && itemData.status === 'valid'
151
+ ? jsx(ButtonGroup, null,
152
+ jsx(Button, { intent: "primary", disabled: isBusy, onClick: handleRetire }, "Retire"),
153
+ jsx(Button, { intent: "primary", disabled: isBusy, onClick: handleInvalidate }, "Invalidate"))
154
+ : null)
155
+ : null));
156
+ const supersedingItems = (
157
+ // It’s superseded (whether in current proposal or not)
158
+ itemData.status === 'superseded'
159
+ // Item is valid, proposal is editable, and no change to this item is proposed yet
160
+ || (activeCRIsEditable && !proposal && !editedClarification && itemData.status === 'valid')
161
+ // This item is being superseded in active proposal
162
+ // XXX: Redundant condition with the first one?
163
+ || (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'))
164
+ ? jsx(FormGroup, { inline: true, label: "superseded by: ", css: css `margin: 0;` },
165
+ jsx(RelatedItems, { availableClassIDs: [itemClass.meta.id], itemRefs: proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'
166
+ ? proposal.supersedingItemIDs.
167
+ map(id => ({ itemID: id, classID: itemClass.meta.id, subregisterID }))
168
+ : (itemData.supersededBy ?? []), onChange: !isBusy && activeCRIsEditable && ((proposal?.type === 'amendment' && proposal.amendmentType === 'supersession') ||
169
+ (!proposal && itemData.status === 'valid'))
170
+ ? (items) => items.length > 0
171
+ ? handleSupersedeWith(items.map(ref => ref.itemID))
172
+ : handleClearProposal()
173
+ : undefined }))
174
+ : null;
175
+ const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(itemData.data);
176
+ const clarificationAction = ((proposal && proposal?.type !== 'amendment')
177
+ || (activeCRIsEditable && !proposal && itemData.status === 'valid'))
178
+ ? jsx(FormGroup, { inline: true, label: `${proposal?.type ?? "clarification"}: `, css: css `margin: 0;` }, activeCRIsEditable
179
+ ? jsx(ButtonGroup, null, editedClarification
180
+ ? jsx(React.Fragment, null,
181
+ jsx(Button, { intent: clarificationHasChanges ? "primary" : undefined,
182
+ // TODO(perf): this is expensive if renders are frequent…
183
+ disabled: !clarificationHasChanges || isBusy, onClick: (!proposal || proposal?.type === 'clarification')
184
+ ? handleClarify
185
+ : handleEditAddition }, "Save"),
186
+ jsx(Button, { onClick: () => setEditedClarification(null) }, "Do not save"))
187
+ : jsx(React.Fragment, null,
188
+ jsx(Button, { disabled: diffMode || isBusy, intent: "primary", outlined: true, onClick: () => setEditedClarification(itemData.data) }, !proposal ? "Clarify" : "Edit"),
189
+ proposal?.type === 'clarification'
190
+ ? jsx(React.Fragment, null,
191
+ jsx(Button, { disabled: diffMode || isBusy || proposal?.type !== 'clarification', intent: "warning", onClick: handleClearProposal }, "Clear"))
192
+ : null))
193
+ : jsx(Button, { disabled: true },
194
+ proposal?.type === 'clarification' ? "Clarified" : "Added",
195
+ " in active proposal"))
196
+ : null;
197
+ // If there’s a CR context without active CR,
198
+ // or active CR isn’t the same as the one in CR context,
199
+ // then we can assume that the item is shown in proposal window
200
+ // and we’d set window title to proposal’s title rather than item’s.
201
+ // If there’s a CR context and active CR and they’re the same
202
+ // then it *could* be that the item is shown in its own tab;
203
+ // we will render proposal’s title if the item appears in the change request
204
+ // (makes sense because the user *is* technically viewing a proposal then).
205
+ const windowTitle = (activeCR && (!globallyActiveCRID
206
+ || activeCR.id !== globallyActiveCRID
207
+ || activeCR.items[itemPath])) ? `Proposal ${maybeEllipsizeString(activeCR.justification, 20)}…`
208
+ : `${itemClass.meta.title ?? 'register item'} #${itemData.id}`;
209
+ return (jsx(TabContentsWithActions, { actions: jsx(React.Fragment, null,
210
+ jsx(FormGroup, { inline: true, labelInfo: jsx(HelpTooltip, { icon: 'info-sign', content: jsx(React.Fragment, null,
211
+ jsx(H5, null, itemClass.meta.title),
212
+ itemClass.meta.description ?? "No description is provided for this register item class.",
213
+ jsx(UL, null,
214
+ jsx("li", null,
215
+ "Class ID: ",
216
+ itemClassID),
217
+ jsx("li", null,
218
+ "Subregister ID: ",
219
+ subregisterID ?? 'N/A'),
220
+ jsx("li", null,
221
+ "UUID: ",
222
+ itemID))) }), label: jsx(React.Fragment, null,
223
+ jsx("strong", null, itemClass.meta.title),
224
+ subregisterID
225
+ ? jsx("span", { title: "Subregister" },
226
+ " in ",
227
+ subregisters?.[subregisterID]?.title ?? subregisterID)
228
+ : null), css: css `margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }` },
229
+ itemStatus,
230
+ supersedingItems,
231
+ clarificationAction)), main: jsx(Card, { css: css `position: absolute; inset: ${inProposalWithID ? '0' : '10px'}; overflow-y: auto;` },
232
+ jsx(Helmet, null,
233
+ jsx("title", null, windowTitle)),
234
+ details) }));
235
+ }
236
+ else if (itemResponse.isUpdating) {
237
+ return jsx("div", { className: Classes.SKELETON }, "Loading\u2026");
238
+ }
239
+ else {
240
+ const inCRWithID = getCRIDFromProposedItemPath(uri);
241
+ if (inCRWithID !== null && activeCR?.id !== inCRWithID) {
242
+ return jsx(NonIdealState, { icon: "help", title: "This item does not exist\u2026", description: jsx(React.Fragment, null,
243
+ "\u2026but it might be proposed.",
244
+ jsx("br", null),
245
+ jumpTo
246
+ ? jsx(Button, { css: css `margin: 10px;`, intent: "primary", onClick: () => jumpTo?.(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(inCRWithID)}`) }, "Go to proposal")
247
+ : null) });
248
+ }
249
+ else {
250
+ return jsx(NonIdealState, { icon: "heart-broken", title: "Unable to show item", description: "Item may not exist, or use unexpected data format." });
251
+ }
252
+ }
253
+ };
254
+ const ItemTitle = function ({ uri }) {
255
+ const { value: ref } = useItemRef(uri);
256
+ const { value: clsConfig } = useItemClassConfig(ref?.classID ?? 'NONEXISTENT_CLASS_ID');
257
+ const { value: itemData } = useSingleRegisterItemData(ref);
258
+ const fallbackView = (() => jsx(React.Fragment, null, ref?.itemID ?? uri));
259
+ const View = itemData ? (clsConfig?.views.listItemView ?? fallbackView) : fallbackView;
260
+ return jsx(View, { itemRef: ref ?? dummyRef, itemData: itemData });
261
+ };
262
+ export default {
263
+ main: ItemDetail,
264
+ title: ItemTitle,
265
+ };
266
+ const dummyRef = {
267
+ itemID: 'NONEXISTENT_ITEM_ID',
268
+ classID: 'NONEXISTENT_CLASS_ID',
269
+ subregisterID: undefined,
270
+ };
271
+ const FormGroup = styled(BaseFormGroup) `
272
+ margin: 0;
273
+ label.bp4-label {
274
+ white-space: nowrap;
275
+ }
276
+ `;
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterItem/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n Button, ButtonGroup,\n Card,\n Classes,\n FormGroup as BaseFormGroup,\n ControlGroup,\n InputGroup,\n NonIdealState,\n UL,\n H5,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport useItemRef from '../../hooks/useItemRef';\nimport useSingleRegisterItemData from '../../hooks/useSingleRegisterItemData';\nimport useItemClassConfig from '../../hooks/useItemClassConfig';\nimport { Protocols } from '../../protocolRegistry';\nimport {\n type ChangeProposal,\n type InternalItemReference,\n type RegisterItem,\n isRegisterItem,\n} from '../../../types';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport {\n RegisterHelmet as Helmet,\n maybeEllipsizeString,\n TabContentsWithActions,\n} from '../../util';\nimport { crIDToCRPath, getCRIDFromProposedItemPath } from '../../itemPathUtils';\nimport { updateCRObjectChangeset, } from '../../change-request/objectChangeset';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { RelatedItems } from './RelatedItems';\n\n\n/**\n * Main register item view.\n *\n * NOTE: while generally intended as tab content handler,\n * is also reused within change request view.\n */\nconst ItemDetail: React.FC<{ uri: string, inProposalWithID?: string }> = function ({ uri, inProposalWithID }) {\n const { value: ref } = useItemRef(uri);\n const { value: clsConfig } = useItemClassConfig(ref?.classID ?? 'NONEXISTENT_CLASS_ID');\n //const { value: itemData } = useSingleRegisterItemData(ref);\n const { updateObjects, performOperation, operationKey } = useContext(DatasetContext);\n const isBusy = operationKey !== undefined;\n const {\n jumpTo,\n subregisters,\n useRegisterItemData,\n activeChangeRequestID: globallyActiveCRID,\n } = useContext(BrowserCtx);\n\n const { changeRequest: activeCR, canEdit: activeCRIsEditable } = useContext(ChangeRequestContext);\n\n const itemClass = clsConfig;\n const itemClassID = itemClass?.meta?.id;\n const itemRef = ref ?? dummyRef;\n const { itemID, subregisterID } = itemRef;\n\n const _itemPath = `${itemClassID ?? 'NONEXISTENT_CLASS'}/${itemID}.yaml`;\n const itemPath = subregisterID ? `/subregisters/${subregisterID}/${_itemPath}` : `/${_itemPath}`;\n const itemRequest = {\n itemPaths: [itemPath],\n };\n const itemResponse = useRegisterItemData(itemRequest);\n const itemData = itemResponse.value[itemPath];\n\n const [ editedClarification, setEditedClarification ] = useState<RegisterItem<any>[\"data\"] | null>(null);\n\n //const [ diffMode, setDiffMode ] = useState<boolean>(false);\n // TODO: Implement diff mode\n const diffMode = false;\n\n const proposal = ((activeCR && activeCR.items[itemPath])\n ? activeCR.items[itemPath]\n : null) ?? null;\n\n const handleClearProposal = () => performProposalOperation(\"draft: clear proposal\", null);\n const handleRetire = () => performProposalOperation(\"draft: propose retirement\", {\n type: 'amendment',\n amendmentType: 'retirement',\n });\n const handleInvalidate = () => performProposalOperation(\"draft: propose invalidation\", {\n type: 'amendment',\n amendmentType: 'invalidation',\n });\n const handleSupersedeWith = (items: string[]) => performProposalOperation(\"draft: propose supersession\", {\n type: 'amendment',\n amendmentType: 'supersession',\n supersedingItemIDs: items,\n });\n const handleClarify = async () => {\n await performProposalOperation(\"draft: clarify item\", {\n type: 'clarification',\n });\n setEditedClarification(null);\n };\n const handleEditAddition = async () => {\n await performProposalOperation(\"draft: edit added item\", {\n type: 'addition',\n });\n setEditedClarification(null);\n };\n\n async function performProposalOperation(summary: string, proposal: ChangeProposal | null) {\n return await performOperation(summary, handleSetProposal)(summary, proposal);\n }\n\n const handleSetProposal = useCallback(async function _handleSetProposal(\n summary: string,\n proposal: ChangeProposal | null,\n ): Promise<void> {\n if (!activeCRIsEditable || !updateObjects || !isRegisterItem(itemData)) {\n throw new Error(\"Proposal isn’t editable\")\n }\n if (proposal && proposal?.type !== 'amendment' && !editedClarification) {\n throw new Error(\"Missing item data\");\n }\n await updateObjects({\n commitMessage: `${summary} for ${itemPath}`,\n objectChangeset: updateCRObjectChangeset(\n // TODO: We are sure it’s editable already, but casting should be avoided\n activeCR as any,\n { [itemPath]: proposal },\n ((proposal && proposal?.type !== 'amendment') && editedClarification)\n ? { [itemPath]: { ...itemData, data: editedClarification } }\n : {},\n ),\n // We need this because updateCRObjectChangeset\n // omits oldValue for item data payloads.\n _dangerouslySkipValidation: true,\n });\n }, [\n updateObjects,\n activeCRIsEditable,\n JSON.stringify(activeCR),\n JSON.stringify(itemData),\n JSON.stringify(editedClarification),\n ]);\n\n if (!itemClass) {\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description={`View for ${ref?.itemID ?? uri} cannot be retrieved from item class configuration`}\n />;\n\n } else if (isRegisterItem(itemData)) {\n let details: JSX.Element;\n\n if (editedClarification !== null && activeCRIsEditable) {\n const EditView = itemClass.views.editView;\n details = (\n <EditView\n itemData={editedClarification}\n itemRef={itemRef}\n onChange={!isBusy\n ? (newData) => {\n setEditedClarification(newData);\n }\n : undefined}\n />\n );\n\n } else {\n const DetailView = itemClass.views.detailView ?? itemClass.views.editView;\n details = (\n <DetailView\n itemRef={itemRef}\n itemData={itemData.data}\n />\n );\n }\n\n //const canAmend = activeCR && itemData.status === 'valid';\n const itemStatus =\n <FormGroup inline label=\"status:\" css={css`margin: 0;`}>\n <ControlGroup fill>\n <InputGroup\n value={proposal?.type === 'amendment'\n ? `${proposal.amendmentType} proposed`\n : proposal?.type === 'addition'\n ? \"addition proposed\"\n : itemData.status}\n intent={proposal?.type === 'amendment'\n ? 'warning'\n : proposal?.type === 'addition'\n ? 'primary'\n : itemData.status === 'valid'\n ? 'success'\n : undefined}\n leftIcon={proposal && (proposal.type === 'amendment' || proposal.type === 'addition')\n ? 'asterisk'\n : itemData.status === 'valid'\n ? 'tick'\n : itemData.status === 'invalid'\n ? 'ban-circle'\n : 'warning-sign'}\n readOnly\n />\n {activeCRIsEditable && !editedClarification\n ? <>\n {proposal?.type === 'addition'\n ? <Button\n intent=\"warning\"\n title=\"Remove the proposal to add this new item.\"\n disabled={isBusy}\n onClick={handleClearProposal}>\n Remove proposed addition\n </Button>\n : null}\n {proposal?.type === 'amendment'\n ? <Button\n intent=\"warning\"\n title={`Remove amendment (${proposal.amendmentType}) for this item from current proposal.`}\n disabled={isBusy}\n onClick={handleClearProposal}>\n Clear proposed amendment\n </Button>\n : !proposal && itemData.status === 'valid'\n ? <ButtonGroup>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleRetire}>\n Retire\n </Button>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleInvalidate}>\n Invalidate\n </Button>\n </ButtonGroup>\n : null}\n </>\n : null}\n </ControlGroup>\n </FormGroup>;\n\n const supersedingItems = (\n // It’s superseded (whether in current proposal or not)\n itemData.status === 'superseded'\n // Item is valid, proposal is editable, and no change to this item is proposed yet\n || (activeCRIsEditable && !proposal && !editedClarification && itemData.status === 'valid')\n // This item is being superseded in active proposal\n // XXX: Redundant condition with the first one?\n || (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'))\n ? <FormGroup inline label=\"superseded by: \" css={css`margin: 0;`}>\n <RelatedItems\n availableClassIDs={[itemClass.meta.id]}\n itemRefs={proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'\n ? proposal.supersedingItemIDs.\n map(id => ({ itemID: id, classID: itemClass.meta.id, subregisterID }))\n : (itemData.supersededBy ?? [])}\n onChange={!isBusy && activeCRIsEditable && (\n (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession') ||\n (!proposal && itemData.status === 'valid'))\n ? (items) => items.length > 0\n ? handleSupersedeWith(items.map(ref => ref.itemID))\n : handleClearProposal()\n : undefined}\n />\n </FormGroup>\n : null;\n\n const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(itemData.data);\n\n const clarificationAction = (\n (proposal && proposal?.type !== 'amendment')\n || (activeCRIsEditable && !proposal && itemData.status === 'valid'))\n ? <FormGroup inline label={`${proposal?.type ?? \"clarification\"}: `} css={css`margin: 0;`}>\n {activeCRIsEditable\n ? <ButtonGroup>\n {editedClarification\n ? <>\n <Button\n intent={clarificationHasChanges ? \"primary\" : undefined}\n // TODO(perf): this is expensive if renders are frequent…\n disabled={!clarificationHasChanges || isBusy}\n onClick={(!proposal || proposal?.type === 'clarification')\n ? handleClarify\n : handleEditAddition}>\n Save\n </Button>\n <Button onClick={() => setEditedClarification(null)}>Do not save</Button>\n </>\n : <>\n <Button\n disabled={diffMode || isBusy}\n intent=\"primary\"\n outlined\n onClick={() => setEditedClarification(itemData.data)}>\n {!proposal ? \"Clarify\" : \"Edit\"}\n </Button>\n {proposal?.type === 'clarification'\n ? <>\n <Button\n disabled={diffMode || isBusy || proposal?.type !== 'clarification'}\n intent=\"warning\"\n onClick={handleClearProposal}>\n Clear\n </Button>\n </>\n : null}\n </>}\n </ButtonGroup>\n : <Button disabled>\n {proposal?.type === 'clarification' ? \"Clarified\" : \"Added\"} in active proposal\n </Button>}\n </FormGroup>\n : null;\n\n // If there’s a CR context without active CR,\n // or active CR isn’t the same as the one in CR context,\n // then we can assume that the item is shown in proposal window\n // and we’d set window title to proposal’s title rather than item’s.\n // If there’s a CR context and active CR and they’re the same\n // then it *could* be that the item is shown in its own tab;\n // we will render proposal’s title if the item appears in the change request\n // (makes sense because the user *is* technically viewing a proposal then).\n const windowTitle: string = (\n activeCR && (\n !globallyActiveCRID\n || activeCR.id !== globallyActiveCRID\n || activeCR.items[itemPath]\n )\n ) ? `Proposal ${maybeEllipsizeString(activeCR.justification, 20)}…`\n : `${itemClass.meta.title ?? 'register item'} #${itemData.id}`;\n\n return (\n <TabContentsWithActions\n actions={<>\n <FormGroup\n inline\n labelInfo={<HelpTooltip\n icon='info-sign'\n content={<>\n <H5>{itemClass.meta.title}</H5>\n {itemClass.meta.description ?? \"No description is provided for this register item class.\"}\n <UL>\n <li>Class ID: {itemClassID}</li>\n <li>Subregister ID: {subregisterID ?? 'N/A'}</li>\n <li>UUID: {itemID}</li>\n </UL>\n </>}\n />}\n label={<>\n <strong>{itemClass.meta.title}</strong>\n {subregisterID\n ? <span title=\"Subregister\"> in {subregisters?.[subregisterID]?.title ?? subregisterID}</span>\n : null}\n </>}\n css={css`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`}>\n {itemStatus}\n {supersedingItems}\n {clarificationAction}\n </FormGroup>\n </>}\n main={\n <Card css={css`position: absolute; inset: ${inProposalWithID ? '0' : '10px'}; overflow-y: auto;`}>\n <Helmet><title>{windowTitle}</title></Helmet>\n {details}\n </Card>\n }\n />\n );\n\n } else if (itemResponse.isUpdating) {\n return <div className={Classes.SKELETON}>Loading…</div>;\n\n } else {\n const inCRWithID = getCRIDFromProposedItemPath(uri);\n if (inCRWithID !== null && activeCR?.id !== inCRWithID) {\n return <NonIdealState\n icon=\"help\"\n title=\"This item does not exist…\"\n description={\n <>\n …but it might be proposed.\n <br />\n {jumpTo\n ? <Button\n css={css`margin: 10px;`}\n intent=\"primary\"\n onClick={() => jumpTo?.(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(inCRWithID)}`)}>\n Go to proposal\n </Button>\n : null}\n </>\n }\n />;\n } else {\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description=\"Item may not exist, or use unexpected data format.\"\n />;\n }\n }\n};\n\n\nconst ItemTitle: React.FC<{ uri: string }> = function ({ uri }) {\n const { value: ref } = useItemRef(uri);\n const { value: clsConfig } = useItemClassConfig(ref?.classID ?? 'NONEXISTENT_CLASS_ID');\n const { value: itemData } = useSingleRegisterItemData(ref);\n const fallbackView = (() => <>{ref?.itemID ?? uri}</>);\n const View = itemData ? (clsConfig?.views.listItemView ?? fallbackView) : fallbackView;\n return <View\n itemRef={ref ?? dummyRef}\n itemData={itemData}\n />;\n}\n\n\nexport default {\n main: ItemDetail,\n title: ItemTitle,\n};\n\n\nconst dummyRef: InternalItemReference = {\n itemID: 'NONEXISTENT_ITEM_ID',\n classID: 'NONEXISTENT_CLASS_ID',\n subregisterID: undefined,\n};\n\n\nconst FormGroup = styled(BaseFormGroup)`\n margin: 0;\n label.bp4-label {\n white-space: nowrap;\n }\n`;\n"]}
@@ -0,0 +1,135 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import update from 'immutability-helper';
4
+ import React from 'react';
5
+ import { jsx, css } from '@emotion/react';
6
+ import styled from '@emotion/styled';
7
+ import { FormGroup as BaseFormGroup, Classes, ControlGroup, InputGroup, TextArea, HTMLTable, HTMLSelect, Button, ButtonGroup, } from '@blueprintjs/core';
8
+ import { DatePicker, TimePrecision } from '@blueprintjs/datetime';
9
+ import HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';
10
+ import { isStakeholderRole } from '../../../types';
11
+ import { STAKEHOLDER_ROLES, StakeholderRole } from '../../../types/stakeholder';
12
+ const DUMMY_VERSION = { id: '', timestamp: new Date() };
13
+ const DUMMY_CONTACT = {
14
+ label: 'email',
15
+ value: ''
16
+ };
17
+ const DUMMY_PARTY = {
18
+ name: '',
19
+ contacts: [DUMMY_CONTACT],
20
+ };
21
+ const DUMMY_STAKEHOLDER = {
22
+ role: StakeholderRole.Submitter,
23
+ name: '',
24
+ gitServerUsername: undefined,
25
+ parties: [DUMMY_PARTY],
26
+ };
27
+ const RegisterMetaForm = function ({ value, onChange, className }) {
28
+ function handleOperatingLanguageChange(fieldName) {
29
+ return (evt) => {
30
+ const newValue = update(value, { operatingLanguage: op => update(op ?? {}, { [fieldName]: { $set: evt.currentTarget.value } }) });
31
+ onChange(newValue);
32
+ };
33
+ }
34
+ function makeFormEventHandler(func) {
35
+ return (evt) => {
36
+ const spec = func(evt.currentTarget.value);
37
+ if (spec) {
38
+ onChange(update(value, spec));
39
+ }
40
+ };
41
+ }
42
+ const stakeholders = value.stakeholders ?? [];
43
+ function makeStakeholderChangeHandler(idx, func) {
44
+ return makeFormEventHandler(val => ({ stakeholders: { [idx]: func(val) } }));
45
+ }
46
+ function handleStakeholderAdd() {
47
+ onChange({ ...value, stakeholders: [...stakeholders, DUMMY_STAKEHOLDER] });
48
+ }
49
+ return (jsx("div", { css: css `display: flex; flex-flow: row wrap; align-content: flex-start; align-items: flex-start; gap: 10px;`, className: className },
50
+ jsx(SuperFormGroup, { label: "Basics:" },
51
+ jsx(FormGroup, { label: "Name:" },
52
+ jsx(InputGroup, { fill: true, value: value.name || '', readOnly: !onChange, onChange: makeFormEventHandler(val => ({ name: { $set: val } })) })),
53
+ jsx(FormGroup, { label: "Uniform resource identifier:" },
54
+ jsx(InputGroup, { fill: true, type: "url", value: value.uniformResourceIdentifier || '', readOnly: !onChange, onChange: makeFormEventHandler(val => ({ uniformResourceIdentifier: { $set: val } })) })),
55
+ jsx(FormGroup, { label: "Content summary:" },
56
+ jsx(TextArea, { fill: true, value: value.contentSummary || '', readOnly: !onChange, onChange: makeFormEventHandler(val => ({ contentSummary: { $set: val } })) })),
57
+ jsx(FormGroup, { label: "Operating language (locale):", helperText: "Name, country and ISO 639-2 language code." },
58
+ jsx(ControlGroup, { vertical: true },
59
+ jsx(InputGroup, { readOnly: !onChange, placeholder: "E.g., Welsh", value: value.operatingLanguage?.name ?? '', onChange: handleOperatingLanguageChange('name') }),
60
+ jsx(InputGroup, { readOnly: !onChange, placeholder: "3-character numerical country code from ISO 3166-1", value: value.operatingLanguage?.country ?? '', onChange: handleOperatingLanguageChange('country') }),
61
+ jsx(InputGroup, { readOnly: !onChange, placeholder: "3-character language code from ISO 639-2", value: value.operatingLanguage?.languageCode ?? '', onChange: handleOperatingLanguageChange('languageCode') })))),
62
+ jsx(SuperFormGroup, { label: "Version: ", css: css `padding-bottom: 0;` },
63
+ jsx(FormGroup, { label: "Identifier: " },
64
+ jsx(InputGroup, { value: value.version?.id ?? '', readOnly: !onChange, placeholder: "E.g., 1.2", onChange: makeFormEventHandler(val => ({ version: v => update(v ?? DUMMY_VERSION, { id: { $set: val } }) })) })),
65
+ jsx(FormGroup, { label: "Published on: ", helperText: jsx(React.Fragment, null,
66
+ "Date and time are",
67
+ jsx("br", null),
68
+ "in ",
69
+ Intl.DateTimeFormat().resolvedOptions().timeZone,
70
+ ".",
71
+ " ",
72
+ jsx(HelpTooltip, { content: jsx(React.Fragment, null,
73
+ "Times are in your computer\u2019s current time zone.",
74
+ onChange
75
+ ? " When specifying, make sure to offset accordingly if it is different than register publication time zone."
76
+ : null) })) },
77
+ jsx(DatePicker, { css: css `margin: 0 -${PADDING};`, timePrecision: TimePrecision.MINUTE, value: value.version?.timestamp ?? null, showActionsBar: onChange ? true : false, onChange: (val) => onChange(update(value, val !== null
78
+ ? { version: v => update(v ?? DUMMY_VERSION, { timestamp: { $set: val } }) }
79
+ : { $unset: ['version'] })) }))),
80
+ jsx(SuperFormGroup, { label: "Stakeholders:", helperText: onChange
81
+ ? jsx(Button, { onClick: handleStakeholderAdd, icon: "add" }, "Add")
82
+ : null }, stakeholders.length > 0
83
+ ? jsx(HTMLTable, { css: css `margin: 0 -${PADDING};` },
84
+ jsx("thead", null,
85
+ jsx("tr", { css: css `& > * { white-space: nowrap }` },
86
+ jsx("th", null, "Role"),
87
+ jsx("th", null, "Name"),
88
+ jsx("th", null, "Git server username"),
89
+ jsx("th", null, "Parties"),
90
+ jsx("th", null, "Name"),
91
+ jsx("th", null, "Email"))),
92
+ jsx("tbody", null, [...stakeholders.entries()].map(([idx, s]) => jsx("tr", { key: idx },
93
+ jsx("td", null,
94
+ jsx(HTMLSelect, { options: STAKEHOLDER_ROLES.map(r => ({ value: r, label: r })), disabled: !onChange, onChange: makeStakeholderChangeHandler(idx, (val) => isStakeholderRole(val)
95
+ ? { role: { $set: val } } // Why do we need to cast this
96
+ : {}), value: s.role })),
97
+ jsx("td", null,
98
+ jsx(InputGroup, { readOnly: !onChange, onChange: makeStakeholderChangeHandler(idx, (val) => ({ name: { $set: val } })), value: s.name })),
99
+ jsx("td", null,
100
+ jsx(InputGroup, { readOnly: !onChange, onChange: makeStakeholderChangeHandler(idx, (val) => ({ gitServerUsername: { $set: val || undefined } })), value: s.gitServerUsername || '' })),
101
+ jsx("td", null,
102
+ jsx(ControlGroup, { vertical: s.parties.length > 1 }, s.parties.map((party, partyIdx) => jsx(ButtonGroup, { key: partyIdx },
103
+ jsx(Button, { key: "delete", outlined: true, disabled: !onChange || s.parties.length < 2 || party.name !== '', title: "Delete this party", onClick: () => onChange(update(value, { stakeholders: { [idx]: { parties: { $splice: [[partyIdx, 1]] } } } })), icon: "cross" }),
104
+ partyIdx === s.parties.length - 1
105
+ ? jsx(Button, { key: "add", outlined: true, disabled: !onChange, onClick: () => onChange(update(value, { stakeholders: { [idx]: { parties: { $push: [DUMMY_PARTY] } } } })), title: "Append a party", icon: "plus" })
106
+ : null)))),
107
+ jsx("td", null,
108
+ jsx(ControlGroup, { vertical: s.parties.length > 1 }, s.parties.map((party, partyIdx) => jsx(InputGroup, { key: partyIdx, readOnly: !onChange, placeholder: "Individual or organization", onChange: makeStakeholderChangeHandler(idx, (val) => ({ parties: { [partyIdx]: { name: { $set: val } } } })), value: party.name })))),
109
+ jsx("td", null,
110
+ jsx(ControlGroup, { vertical: s.parties.length > 1 }, s.parties.map((party, partyIdx) => jsx(InputGroup, { key: partyIdx, type: "email", placeholder: "Contact email", readOnly: !onChange, onChange: makeStakeholderChangeHandler(idx, (val) => ({ parties: { [partyIdx]: { contacts: { 0: { value: { $set: val } } } } } })), value: party.contacts[0].value || '' }))))))))
111
+ : null)));
112
+ };
113
+ const PADDING = '11px';
114
+ const FormGroup = styled(BaseFormGroup) `
115
+ margin: 0;
116
+ `;
117
+ const SuperFormGroup_ = styled(FormGroup) `
118
+ border-radius: 5px;
119
+ padding: ${PADDING};
120
+ background: white;
121
+ > label.bp4-label {
122
+ font-weight: bold;
123
+ margin-bottom: ${PADDING};
124
+ }
125
+ > .bp4-form-content {
126
+ display: flex;
127
+ flex-flow: column nowrap;
128
+ gap: ${PADDING};
129
+ }
130
+ `;
131
+ const SuperFormGroup = function (props) {
132
+ return jsx(SuperFormGroup_, { ...props, className: Classes.ELEVATION_3 });
133
+ };
134
+ export default RegisterMetaForm;
135
+ //# sourceMappingURL=RegisterMetaForm.js.map
@@ -0,0 +1,61 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import React, { useState, useContext } from 'react';
4
+ import { jsx } from '@emotion/react';
5
+ import { Button, ButtonGroup, NonIdealState, Spinner } from '@blueprintjs/core';
6
+ import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';
7
+ import { BrowserCtx } from '../../BrowserCtx';
8
+ import { isRegisterMetadata } from '../../../types';
9
+ import { isOwner } from '../../../types/stakeholder';
10
+ import { REGISTER_METADATA_FILENAME } from '../../../common';
11
+ import { TabContentsWithActions } from '../../util';
12
+ import RegisterMetaForm from './RegisterMetaForm';
13
+ const RegisterMeta = function () {
14
+ const { updateObjects, performOperation } = useContext(DatasetContext);
15
+ const { registerMetadata, stakeholder } = useContext(BrowserCtx);
16
+ const [editedMetadata, setEditedMetadata] = useState(null);
17
+ const canChange = updateObjects ? true : false;
18
+ const didChange = registerMetadata && editedMetadata && JSON.stringify(editedMetadata) !== JSON.stringify(registerMetadata);
19
+ function handleClear() {
20
+ setEditedMetadata(null);
21
+ }
22
+ async function handleSave() {
23
+ if (!updateObjects) {
24
+ throw new Error("Dataset is read-only");
25
+ }
26
+ if (!stakeholder || !isOwner(stakeholder)) {
27
+ throw new Error("Register meta is only meant to be edited by owner");
28
+ }
29
+ if (!isRegisterMetadata(editedMetadata)) {
30
+ throw new Error("Invalid register metadata");
31
+ }
32
+ await performOperation('saving register meta', updateObjects)({
33
+ commitMessage: "edited register metadata",
34
+ objectChangeset: {
35
+ [REGISTER_METADATA_FILENAME]: {
36
+ oldValue: registerMetadata,
37
+ newValue: editedMetadata,
38
+ },
39
+ },
40
+ });
41
+ setEditedMetadata(null);
42
+ }
43
+ if (registerMetadata) {
44
+ return (jsx(TabContentsWithActions, { actions: jsx(React.Fragment, null,
45
+ jsx(ButtonGroup, null,
46
+ jsx(Button, { onClick: handleSave, disabled: !didChange || !canChange, intent: didChange && canChange ? "primary" : undefined }, "Save"),
47
+ jsx(Button, { onClick: handleClear, disabled: !didChange || !canChange }, "Clear changes"))), main: jsx(RegisterMetaForm, { value: editedMetadata ?? registerMetadata, onChange: updateObjects ? setEditedMetadata : undefined }) }));
48
+ }
49
+ else if (registerMetadata === undefined) {
50
+ return jsx(NonIdealState, { icon: jsx(Spinner, null) });
51
+ }
52
+ else {
53
+ return jsx(NonIdealState, { icon: "heart-broken", description: "Failed to read registry metadata." });
54
+ }
55
+ };
56
+ export default {
57
+ main: RegisterMeta,
58
+ title: () => jsx(React.Fragment, null, "Register Metadata"),
59
+ plainTitle: async () => "register metadata",
60
+ };
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,11 @@
1
+ import protocolRegistry, { isValidProtocol } from '../protocolRegistry';
2
+ export async function getPlainTitle(uri) {
3
+ const [proto, _path] = uri.split(':');
4
+ if (isValidProtocol(proto)) {
5
+ return await protocolRegistry[proto].plainTitle?.(_path) ?? 'N/A';
6
+ }
7
+ else {
8
+ throw new Error("Invalid protocol");
9
+ }
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,20 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import { jsx } from '@emotion/react';
4
+ import React from 'react';
5
+ import ReactDOM from 'react-dom/server';
6
+ import VisualDiff from 'react-visual-diff';
7
+ import AnnotatedChange from '../AnnotatedChange';
8
+ const InlineDiff = React.memo(({ DetailView, sharedRefComponents, item1, item2 }) => {
9
+ // TODO: Make VisualDiff work. Currently, it doesn’t apparently when item detail views use hooks.
10
+ // Which is often. Either make item views hook-free
11
+ // (which means primarily eliminating useRegisterItemData() by inferring and pre-fetching
12
+ // related item data), or work out another way to diff two React elements.
13
+ console.debug(item1.description, item2.description);
14
+ const left = jsx("div", { dangerouslySetInnerHTML: { __html: ReactDOM.renderToString(jsx(DetailView, { itemRef: sharedRefComponents, itemData: item1 })) } });
15
+ const right = jsx("div", { dangerouslySetInnerHTML: { __html: ReactDOM.renderToString(jsx(DetailView, { itemRef: sharedRefComponents, itemData: item2 })) } });
16
+ return jsx(VisualDiff, { left: left, right: right, renderChange: AnnotatedChange });
17
+ }, (prevProps, nextProps) => JSON.stringify(prevProps.item2) === JSON.stringify(nextProps.item2) &&
18
+ JSON.stringify(prevProps.item1) === JSON.stringify(nextProps.item1));
19
+ export default InlineDiff;
20
+ //# sourceMappingURL=InlineDiff.js.map
@@ -0,0 +1,38 @@
1
+ /** @jsx jsx */
2
+ /** @jsxFrag React.Fragment */
3
+ import { diff, formatters } from 'jsondiffpatch';
4
+ import { jsx, css } from '@emotion/react';
5
+ import React, { useEffect, useRef, useState } from 'react';
6
+ import { Switch } from '@blueprintjs/core';
7
+ const StructuredDiff = React.memo(({ item1, item2, showUnchanged, className }) => {
8
+ const diffContainerRef = useRef(null);
9
+ // Is ignored if managed via prop.
10
+ const [_showUnchanged, setShowUnchanged] = useState(false);
11
+ const item1json = JSON.stringify(item1);
12
+ const item2json = JSON.stringify(item2);
13
+ useEffect(() => {
14
+ if (diffContainerRef.current) {
15
+ const delta = diff(item1, item2);
16
+ formatters.html.showUnchanged(showUnchanged ?? _showUnchanged);
17
+ if (delta) {
18
+ diffContainerRef.current.innerHTML = formatters.html.format(delta, item1);
19
+ }
20
+ else {
21
+ diffContainerRef.current.innerHTML = formatters.html.format({}, item1);
22
+ }
23
+ }
24
+ }, [item1json, item2json, diffContainerRef.current, showUnchanged, _showUnchanged]);
25
+ // TODO: Make VisualDiff work. Currently, it doesn’t apparently when item detail views use hooks.
26
+ // Which is often. Either make item views hook-free
27
+ // (which means primarily eliminating useRegisterItemData() by inferring and pre-fetching
28
+ // related item data), or work out another way to diff two React elements.
29
+ return jsx("div", { css: css `display: flex; flex-flow: column nowrap;`, className: className },
30
+ showUnchanged === undefined
31
+ ? jsx(Switch, { checked: _showUnchanged, onChange: evt => setShowUnchanged(evt.currentTarget.checked), label: "Show unchanged properties" })
32
+ : null,
33
+ jsx("div", { ref: diffContainerRef, css: css `flex: 1; overflow: auto;` }));
34
+ }, (prevProps, nextProps) => JSON.stringify(prevProps.item2) === JSON.stringify(nextProps.item2) &&
35
+ JSON.stringify(prevProps.item1) === JSON.stringify(nextProps.item1) &&
36
+ prevProps.showUnchanged === nextProps.showUnchanged);
37
+ export default StructuredDiff;
38
+ //# sourceMappingURL=StructuredDiff.js.map
@@ -0,0 +1,14 @@
1
+ import { useContext } from 'react';
2
+ import { BrowserCtx } from '../BrowserCtx';
3
+ export default function useCustomView(viewID) {
4
+ const { customViews } = useContext(BrowserCtx);
5
+ const view = customViews.find(v => v.id === viewID);
6
+ return {
7
+ value: view,
8
+ errors: [],
9
+ refresh: () => void 0,
10
+ isUpdating: false,
11
+ _reqCounter: 0,
12
+ };
13
+ }
14
+ //# sourceMappingURL=useCustomView.js.map