@riboseinc/paneron-registry-kit 2.0.0-dev8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/common.d.ts +1 -1
  2. package/common.js +1 -1
  3. package/common.js.map +1 -1
  4. package/index.d.ts +3 -3
  5. package/index.js +3 -3
  6. package/index.js.map +1 -1
  7. package/package.json +26 -18
  8. package/types/cr.d.ts +216 -0
  9. package/types/cr.js +175 -0
  10. package/types/cr.js.map +1 -0
  11. package/types/index.d.ts +1 -0
  12. package/types/index.js +19 -0
  13. package/types/index.js.map +1 -1
  14. package/types/item.d.ts +13 -3
  15. package/types/item.js +11 -1
  16. package/types/item.js.map +1 -1
  17. package/types/proposal.d.ts +31 -14
  18. package/types/proposal.js +1 -1
  19. package/types/proposal.js.map +1 -1
  20. package/types/register.d.ts +6 -5
  21. package/types/register.js +19 -1
  22. package/types/register.js.map +1 -1
  23. package/types/registry.d.ts +8 -3
  24. package/types/registry.js +8 -1
  25. package/types/registry.js.map +1 -1
  26. package/types/stakeholder.d.ts +40 -16
  27. package/types/stakeholder.js +47 -3
  28. package/types/stakeholder.js.map +1 -1
  29. package/types/views.d.ts +98 -24
  30. package/types/views.js.map +1 -1
  31. package/views/AnnotatedChange.d.ts +7 -0
  32. package/views/AnnotatedChange.js +91 -0
  33. package/views/AnnotatedChange.js.map +1 -0
  34. package/views/BrowserCtx.d.ts +66 -2
  35. package/views/BrowserCtx.js +13 -2
  36. package/views/BrowserCtx.js.map +1 -1
  37. package/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +17 -0
  38. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +202 -0
  39. package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -0
  40. package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +6 -0
  41. package/views/FilterCriteria/criteriaGroupToQueryExpression.js +50 -0
  42. package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -0
  43. package/views/FilterCriteria/criteriaGroupToSummary.d.ts +5 -0
  44. package/views/FilterCriteria/criteriaGroupToSummary.js +62 -0
  45. package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -0
  46. package/views/FilterCriteria/criteriaToNodes.d.ts +24 -0
  47. package/views/FilterCriteria/criteriaToNodes.js +159 -0
  48. package/views/FilterCriteria/criteriaToNodes.js.map +1 -0
  49. package/views/FilterCriteria/index.d.ts +23 -0
  50. package/views/FilterCriteria/index.js +130 -0
  51. package/views/FilterCriteria/index.js.map +1 -0
  52. package/views/FilterCriteria/models.d.ts +68 -0
  53. package/views/FilterCriteria/models.js +34 -0
  54. package/views/FilterCriteria/models.js.map +1 -0
  55. package/views/FilterCriteria/mutateGroup.d.ts +17 -0
  56. package/views/FilterCriteria/mutateGroup.js +59 -0
  57. package/views/FilterCriteria/mutateGroup.js.map +1 -0
  58. package/views/GenericRelatedItemView.d.ts +1 -1
  59. package/views/GenericRelatedItemView.js +143 -101
  60. package/views/GenericRelatedItemView.js.map +1 -1
  61. package/views/RegisterStakeholder.d.ts +9 -0
  62. package/views/RegisterStakeholder.js +40 -0
  63. package/views/RegisterStakeholder.js.map +1 -0
  64. package/views/RegisterVersion.d.ts +9 -0
  65. package/views/RegisterVersion.js +41 -0
  66. package/views/RegisterVersion.js.map +1 -0
  67. package/views/SearchQuery.d.ts +13 -0
  68. package/views/SearchQuery.js +137 -0
  69. package/views/SearchQuery.js.map +1 -0
  70. package/views/change-request/ChangeRequestContext.d.ts +20 -0
  71. package/views/change-request/ChangeRequestContext.js +56 -0
  72. package/views/change-request/ChangeRequestContext.js.map +1 -0
  73. package/views/change-request/Proposals.d.ts +21 -0
  74. package/views/change-request/Proposals.js +331 -0
  75. package/views/change-request/Proposals.js.map +1 -0
  76. package/views/change-request/objectChangeset.d.ts +31 -0
  77. package/views/change-request/objectChangeset.js +229 -0
  78. package/views/change-request/objectChangeset.js.map +1 -0
  79. package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
  80. package/views/detail/ChangeRequest/Proposal.js +142 -0
  81. package/views/detail/ChangeRequest/Proposal.js.map +1 -0
  82. package/views/detail/ChangeRequest/index.d.ts +13 -0
  83. package/views/detail/ChangeRequest/index.js +207 -0
  84. package/views/detail/ChangeRequest/index.js.map +1 -0
  85. package/views/detail/ChangeRequest/transitions.d.ts +28 -0
  86. package/views/detail/ChangeRequest/transitions.js +530 -0
  87. package/views/detail/ChangeRequest/transitions.js.map +1 -0
  88. package/views/detail/CustomView/index.d.ts +13 -0
  89. package/views/detail/CustomView/index.js +68 -0
  90. package/views/detail/CustomView/index.js.map +1 -0
  91. package/views/detail/RegisterHome/index.d.ts +5 -0
  92. package/views/detail/RegisterHome/index.js +128 -0
  93. package/views/detail/RegisterHome/index.js.map +1 -0
  94. package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
  95. package/views/detail/RegisterItem/RelatedItems.js +61 -0
  96. package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
  97. package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
  98. package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
  99. package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
  100. package/views/detail/RegisterItem/index.d.ts +13 -0
  101. package/views/detail/RegisterItem/index.js +356 -0
  102. package/views/detail/RegisterItem/index.js.map +1 -0
  103. package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
  104. package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
  105. package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
  106. package/views/detail/RegisterMeta/index.d.ts +10 -0
  107. package/views/detail/RegisterMeta/index.js +111 -0
  108. package/views/detail/RegisterMeta/index.js.map +1 -0
  109. package/views/detail/index.d.ts +1 -0
  110. package/views/detail/index.js +24 -0
  111. package/views/detail/index.js.map +1 -0
  112. package/views/diffing/InlineDiff.d.ts +12 -0
  113. package/views/diffing/InlineDiff.js +58 -0
  114. package/views/diffing/InlineDiff.js.map +1 -0
  115. package/views/diffing/StructuredDiff.d.ts +11 -0
  116. package/views/diffing/StructuredDiff.js +65 -0
  117. package/views/diffing/StructuredDiff.js.map +1 -0
  118. package/views/hooks/useCustomView.d.ts +3 -0
  119. package/views/hooks/useCustomView.js +24 -0
  120. package/views/hooks/useCustomView.js.map +1 -0
  121. package/views/hooks/useItemClassConfig.d.ts +3 -0
  122. package/views/hooks/useItemClassConfig.js +24 -0
  123. package/views/hooks/useItemClassConfig.js.map +1 -0
  124. package/views/hooks/useItemRef.d.ts +3 -0
  125. package/views/hooks/useItemRef.js +39 -0
  126. package/views/hooks/useItemRef.js.map +1 -0
  127. package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
  128. package/views/hooks/useSingleRegisterItemData.js +32 -0
  129. package/views/hooks/useSingleRegisterItemData.js.map +1 -0
  130. package/views/index.d.ts +2 -2
  131. package/views/index.js +161 -130
  132. package/views/index.js.map +1 -1
  133. package/views/itemPathUtils.d.ts +45 -2
  134. package/views/itemPathUtils.js +101 -14
  135. package/views/itemPathUtils.js.map +1 -1
  136. package/views/itemQueryUtils.d.ts +11 -0
  137. package/views/itemQueryUtils.js +48 -0
  138. package/views/itemQueryUtils.js.map +1 -0
  139. package/views/protocolRegistry.d.ts +12 -0
  140. package/views/protocolRegistry.js +42 -0
  141. package/views/protocolRegistry.js.map +1 -0
  142. package/views/sidebar/Browse/index.d.ts +11 -0
  143. package/views/sidebar/Browse/index.js +453 -0
  144. package/views/sidebar/Browse/index.js.map +1 -0
  145. package/views/sidebar/Export/index.d.ts +5 -0
  146. package/views/sidebar/Export/index.js +94 -0
  147. package/views/sidebar/Export/index.js.map +1 -0
  148. package/views/sidebar/ListItem.d.ts +10 -0
  149. package/views/sidebar/ListItem.js +43 -0
  150. package/views/sidebar/ListItem.js.map +1 -0
  151. package/views/sidebar/Registration/index.d.ts +5 -0
  152. package/views/sidebar/Registration/index.js +163 -0
  153. package/views/sidebar/Registration/index.js.map +1 -0
  154. package/views/sidebar/Search/index.d.ts +18 -0
  155. package/views/sidebar/Search/index.js +177 -0
  156. package/views/sidebar/Search/index.js.map +1 -0
  157. package/views/sidebar/index.d.ts +6 -0
  158. package/views/sidebar/index.js +104 -0
  159. package/views/sidebar/index.js.map +1 -0
  160. package/views/util.d.ts +29 -5
  161. package/views/util.js +92 -6
  162. package/views/util.js.map +1 -1
  163. package/views/ChangeRequest.d.ts +0 -12
  164. package/views/ChangeRequest.js +0 -689
  165. package/views/ChangeRequest.js.map +0 -1
  166. package/views/FilterCriteria.d.ts +0 -27
  167. package/views/FilterCriteria.js +0 -410
  168. package/views/FilterCriteria.js.map +0 -1
  169. package/views/ItemBrowser.d.ts +0 -12
  170. package/views/ItemBrowser.js +0 -255
  171. package/views/ItemBrowser.js.map +0 -1
  172. package/views/ItemDetails.d.ts +0 -14
  173. package/views/ItemDetails.js +0 -128
  174. package/views/ItemDetails.js.map +0 -1
  175. package/views/MainView.d.ts +0 -8
  176. package/views/MainView.js +0 -34
  177. package/views/MainView.js.map +0 -1
  178. package/views/RegisterInformation.d.ts +0 -7
  179. package/views/RegisterInformation.js +0 -264
  180. package/views/RegisterInformation.js.map +0 -1
  181. package/views/RegisterItemGrid.d.ts +0 -25
  182. package/views/RegisterItemGrid.js +0 -248
  183. package/views/RegisterItemGrid.js.map +0 -1
package/types/item.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { RegisterStakeholder } from './stakeholder';
2
- import { Citation, LocalizedAlternative } from './util';
1
+ import type { RegisterStakeholder } from './stakeholder';
2
+ import type { Citation, LocalizedAlternative } from './util';
3
3
  export declare type Payload = Record<string, any>;
4
4
  declare const ITEM_STATUSES: readonly ["submitted", "valid", "superseded", "retired", "invalid"];
5
5
  export declare type ItemStatus = typeof ITEM_STATUSES[number];
@@ -27,6 +27,7 @@ interface ItemReference {
27
27
  itemID: string;
28
28
  }
29
29
  export declare type InternalItemReference = Omit<ItemReference, 'registerID'>;
30
+ export declare function isInternalItemReference(val: any): val is InternalItemReference;
30
31
  interface AbstractItemSource {
31
32
  type: string;
32
33
  }
@@ -41,9 +42,18 @@ interface ExternalSource extends AbstractItemSource {
41
42
  declare type RegisterItemSource = PaneronRegisterItemSource | ExternalSource;
42
43
  export interface RegisterItem<P extends Payload> {
43
44
  id: string;
44
- status: string;
45
+ status: ItemStatus;
45
46
  dateAccepted: Date;
47
+ /** UUID of change request that defined the current version. */
48
+ amendedInCR?: string;
49
+ supersededBy?: InternalItemReference[];
50
+ supersedes?: InternalItemReference[];
51
+ /**
52
+ * Register item data. Domain-specific. May include additional human-readable identifiers.
53
+ * In ISO 19135-1 was represented by “definition”.
54
+ */
46
55
  data: P;
47
56
  source?: RegisterItemSource;
48
57
  }
58
+ export declare function isRegisterItem(val: any): val is RegisterItem<any>;
49
59
  export {};
package/types/item.js CHANGED
@@ -3,4 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- const ITEM_STATUSES = ['submitted', 'valid', 'superseded', 'retired', 'invalid'];
6
+ exports.isInternalItemReference = isInternalItemReference;
7
+ exports.isRegisterItem = isRegisterItem;
8
+ const ITEM_STATUSES = ['submitted', 'valid', 'superseded', 'retired', 'invalid'];
9
+
10
+ function isInternalItemReference(val) {
11
+ return val && val.hasOwnProperty('itemID') && val.hasOwnProperty('classID') && typeof val['itemID'] == 'string' && typeof val['classID'] == 'string';
12
+ }
13
+
14
+ function isRegisterItem(val) {
15
+ return val && val.hasOwnProperty('id') && val.hasOwnProperty('data') && val.hasOwnProperty('status') && ITEM_STATUSES.indexOf(val.status) >= 0;
16
+ }
package/types/item.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/types/item.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG;IACpB,WAAW;IACX,OAAO;IACP,YAAY;IACZ,SAAS;IACT,SAAS;CACD,CAAC","sourcesContent":["\nimport { RegisterStakeholder } from './stakeholder';\nimport { Citation, LocalizedAlternative } from './util';\n\n\nexport type Payload = Record<string, any>\n\nconst ITEM_STATUSES = [\n 'submitted',\n 'valid',\n 'superseded',\n 'retired',\n 'invalid',\n] as const;\n\nexport type ItemStatus = typeof ITEM_STATUSES[number];\n\n\nexport interface RegisterItemID {\n classID: string\n itemID: string\n}\n\n\nexport interface RegisterItemClass {\n id: string\n title: string\n description?: string\n alternativeNames?: LocalizedAlternative<string>[]\n}\n\nexport interface RegisterItemRevision<P extends Payload> {\n timestamp: Date\n parents: string[] // Revision IDs\n status: ItemStatus\n data: P\n author: RegisterStakeholder\n}\n\ninterface ItemReference {\n registerID: string\n subregisterID?: string\n classID: string\n itemID: string\n}\n\nexport type InternalItemReference = Omit<ItemReference, 'registerID'>\n\n\ninterface AbstractItemSource {\n type: string\n}\ninterface PaneronRegisterItemSource extends AbstractItemSource {\n type: 'paneron_register'\n itemRef: ItemReference\n}\ninterface ExternalSource extends AbstractItemSource {\n type: 'external'\n citation: Citation\n}\ntype RegisterItemSource = PaneronRegisterItemSource | ExternalSource\n\nexport interface RegisterItem<P extends Payload> {\n id: string // UUID\n status: string\n dateAccepted: Date\n data: P // Register item data, may include additional human identifiers\n source?: RegisterItemSource\n}\n"]}
1
+ {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/types/item.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG;IACpB,WAAW;IACX,OAAO;IACP,YAAY;IACZ,SAAS;IACT,SAAS;CACD,CAAC;AAmCX,MAAM,UAAU,uBAAuB,CAAC,GAAQ;IAC9C,OAAO,CACL,GAAG;QACH,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC;QAC5B,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ;QAChC,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,QAAQ,CAClC,CAAC;AACJ,CAAC;AA0CD,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,OAAO,CACL,GAAG;QACH,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;QACxB,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1B,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC;QAC5B,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CACvC,CAAC;AACJ,CAAC","sourcesContent":["\nimport type { RegisterStakeholder } from './stakeholder';\nimport type { Citation, LocalizedAlternative } from './util';\n\n\nexport type Payload = Record<string, any>\n\nconst ITEM_STATUSES = [\n 'submitted',\n 'valid',\n 'superseded',\n 'retired',\n 'invalid',\n] as const;\n\nexport type ItemStatus = typeof ITEM_STATUSES[number];\n\n\nexport interface RegisterItemID {\n classID: string\n itemID: string\n}\n\n\nexport interface RegisterItemClass {\n id: string\n title: string\n description?: string\n alternativeNames?: LocalizedAlternative<string>[]\n}\n\nexport interface RegisterItemRevision<P extends Payload> {\n timestamp: Date\n parents: string[] // Revision IDs\n status: ItemStatus\n data: P\n author: RegisterStakeholder\n}\n\ninterface ItemReference {\n registerID: string\n subregisterID?: string\n classID: string\n itemID: string\n}\n\nexport type InternalItemReference = Omit<ItemReference, 'registerID'>\n\nexport function isInternalItemReference(val: any): val is InternalItemReference {\n return (\n val &&\n val.hasOwnProperty('itemID') &&\n val.hasOwnProperty('classID') &&\n typeof val['itemID'] == 'string' &&\n typeof val['classID'] == 'string'\n );\n}\n\n\ninterface AbstractItemSource {\n type: string\n}\ninterface PaneronRegisterItemSource extends AbstractItemSource {\n type: 'paneron_register'\n itemRef: ItemReference\n}\ninterface ExternalSource extends AbstractItemSource {\n type: 'external'\n citation: Citation\n}\ntype RegisterItemSource = PaneronRegisterItemSource | ExternalSource\n\nexport interface RegisterItem<P extends Payload> {\n id: string // UUID\n\n status: ItemStatus\n\n dateAccepted: Date\n // This is a mandatory property, since until their acceptance items “live” as part of their corresponding change requests\n\n /** UUID of change request that defined the current version. */\n amendedInCR?: string\n\n // TODO: Denormalized, should be validated with consistency checks\n supersededBy?: InternalItemReference[]\n supersedes?: InternalItemReference[]\n\n /**\n * Register item data. Domain-specific. May include additional human-readable identifiers.\n * In ISO 19135-1 was represented by “definition”.\n */\n data: P\n\n source?: RegisterItemSource\n // TODO: Citations were suggested to be moved to proposals, as motivating/substantiating evidence.\n // TODO: Register item, however, should have a relationship that points to the original proto-item from another register.\n}\n\nexport function isRegisterItem(val: any): val is RegisterItem<any> {\n return (\n val &&\n val.hasOwnProperty('id') &&\n val.hasOwnProperty('data') &&\n val.hasOwnProperty('status') &&\n ITEM_STATUSES.indexOf(val.status) >= 0\n );\n}\n"]}
@@ -1,12 +1,21 @@
1
- import { Payload } from './item';
2
- import { RegisterStakeholder } from './stakeholder';
1
+ import type { RegisterStakeholder } from './stakeholder';
2
+ import type { Citation } from './util';
3
3
  export declare const DECISION_STATUSES: readonly ["pending", "tentative", "final"];
4
4
  export declare const DISPOSITION_OPTIONS: readonly ["withdrawn", "accepted", "notAccepted"];
5
+ /**
6
+ * Item paths in proposal set must start with a slash
7
+ * and will be treated relative to dataset root.
8
+ * Object paths should conform to registry item path shape
9
+ * of `[/subregisterID]/<classID>/<itemID>.yaml`.
10
+ */
11
+ export declare type ProposalSet = {
12
+ [objectPath: string]: ChangeProposal;
13
+ };
14
+ /** A change request, per ISO 19135-1 model. */
5
15
  export interface ChangeRequest {
16
+ /** Justification for the change */
6
17
  justification: string;
7
- proposals: {
8
- [itemIDWithClass: string]: ChangeProposal;
9
- };
18
+ proposals: ProposalSet;
10
19
  id: string;
11
20
  timeStarted: Date;
12
21
  timeProposed?: Date;
@@ -18,30 +27,38 @@ export interface ChangeRequest {
18
27
  controlBodyNotes?: string;
19
28
  registerManagerNotes?: string;
20
29
  }
30
+ /**
31
+ * Change request properties for the purposes of drafting.
32
+ * (`controlBodyNotes` is in question.)
33
+ */
34
+ export declare type DraftChangeRequest = Pick<ChangeRequest, 'proposals' | 'justification' | 'controlBodyNotes' | 'sponsor'>;
21
35
  export declare const PROPOSAL_TYPES: readonly ["addition", "clarification", "amendment"];
22
36
  interface BaseProposal {
37
+ disposition?: 'accepted' | 'notAccepted';
23
38
  type: typeof PROPOSAL_TYPES[number];
39
+ sources?: Citation[];
24
40
  }
25
- interface Addition extends BaseProposal {
41
+ export interface Addition extends BaseProposal {
26
42
  type: 'addition';
27
- payload: Payload;
28
43
  }
29
- interface Clarification extends BaseProposal {
44
+ export interface Clarification extends BaseProposal {
30
45
  type: 'clarification';
31
- payload: Payload;
32
46
  }
33
- export declare const AMENDMENT_TYPES: readonly ["supersession", "retirement"];
47
+ export declare const AMENDMENT_TYPES: readonly ["supersession", "retirement", "invalidation"];
34
48
  interface BaseAmendment extends BaseProposal {
35
49
  type: 'amendment';
36
50
  amendmentType: typeof AMENDMENT_TYPES[number];
37
51
  }
38
- interface Retirement extends BaseAmendment {
52
+ export interface Retirement extends BaseAmendment {
39
53
  amendmentType: 'retirement';
40
54
  }
41
- interface Supersession extends BaseAmendment {
55
+ export interface Supersession extends BaseAmendment {
42
56
  amendmentType: 'supersession';
43
- supersedingItemID: string;
57
+ supersedingItemIDs: string[];
44
58
  }
45
- declare type Amendment = Supersession | Retirement;
59
+ export interface Invalidation extends BaseAmendment {
60
+ amendmentType: 'invalidation';
61
+ }
62
+ export declare type Amendment = Supersession | Retirement | Invalidation;
46
63
  export declare type ChangeProposal = Amendment | Clarification | Addition;
47
64
  export {};
package/types/proposal.js CHANGED
@@ -10,5 +10,5 @@ const DISPOSITION_OPTIONS = ['withdrawn', 'accepted', 'notAccepted'];
10
10
  exports.DISPOSITION_OPTIONS = DISPOSITION_OPTIONS;
11
11
  const PROPOSAL_TYPES = ['addition', 'clarification', 'amendment'];
12
12
  exports.PROPOSAL_TYPES = PROPOSAL_TYPES;
13
- const AMENDMENT_TYPES = ['supersession', 'retirement'];
13
+ const AMENDMENT_TYPES = ['supersession', 'retirement', 'invalidation'];
14
14
  exports.AMENDMENT_TYPES = AMENDMENT_TYPES;
@@ -1 +1 @@
1
- {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,WAAW;IACX,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW;IACX,UAAU;IACV,aAAa;CACL,CAAC;AAqBX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,eAAe;IACf,WAAW;CACH,CAAC;AAiBX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,YAAY;CACJ,CAAC","sourcesContent":["import { Payload } from './item';\nimport { RegisterStakeholder } from './stakeholder';\n\n\nexport const DECISION_STATUSES = [\n 'pending',\n 'tentative',\n 'final',\n] as const;\n\nexport const DISPOSITION_OPTIONS = [\n 'withdrawn',\n 'accepted',\n 'notAccepted',\n] as const;\n\nexport interface ChangeRequest {\n // Supplied by sponsor\n justification: string // Justification for proposal\n proposals: { [itemIDWithClass: string]: ChangeProposal }\n\n // Enforced by the system\n id: string\n timeStarted: Date\n timeProposed?: Date\n timeDisposed?: Date\n sponsor: RegisterStakeholder\n\n // Supplied by register manager\n status: typeof DECISION_STATUSES[number] // Default filled in by the system but changeable\n disposition?: typeof DISPOSITION_OPTIONS[number]\n controlBodyDecisionEvent?: string\n controlBodyNotes?: string\n registerManagerNotes?: string\n}\nexport const PROPOSAL_TYPES = [\n 'addition',\n 'clarification',\n 'amendment',\n] as const;\n\ninterface BaseProposal {\n //itemID: RegisterItemID\n type: typeof PROPOSAL_TYPES[number]\n}\n\ninterface Addition extends BaseProposal {\n type: 'addition'\n payload: Payload\n}\n\ninterface Clarification extends BaseProposal {\n type: 'clarification'\n payload: Payload\n}\n\nexport const AMENDMENT_TYPES = [\n 'supersession',\n 'retirement',\n] as const;\ninterface BaseAmendment extends BaseProposal {\n type: 'amendment'\n amendmentType: typeof AMENDMENT_TYPES[number]\n}\ninterface Retirement extends BaseAmendment {\n amendmentType: 'retirement'\n}\ninterface Supersession extends BaseAmendment {\n amendmentType: 'supersession'\n supersedingItemID: string\n}\ntype Amendment = Supersession | Retirement\n\nexport type ChangeProposal = Amendment | Clarification | Addition\n"]}
1
+ {"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../src/types/proposal.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,WAAW;IACX,OAAO;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,WAAW;IACX,UAAU;IACV,aAAa;CACL,CAAC;AA2CX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,eAAe;IACf,WAAW;CACH,CAAC;AAqBX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,cAAc;IACd,YAAY;IACZ,cAAc;CACN,CAAC","sourcesContent":["import type { RegisterStakeholder } from './stakeholder';\nimport type { Citation } from './util';\n\n\nexport const DECISION_STATUSES = [\n 'pending',\n 'tentative',\n 'final',\n] as const;\n\nexport const DISPOSITION_OPTIONS = [\n 'withdrawn',\n 'accepted',\n 'notAccepted',\n] as const;\n\n/**\n * Item paths in proposal set must start with a slash\n * and will be treated relative to dataset root.\n * Object paths should conform to registry item path shape\n * of `[/subregisterID]/<classID>/<itemID>.yaml`.\n */\nexport type ProposalSet = {\n [objectPath: string]: ChangeProposal\n}\n\n/** A change request, per ISO 19135-1 model. */\nexport interface ChangeRequest {\n // Supplied by sponsor\n /** Justification for the change */\n justification: string\n\n proposals: ProposalSet\n\n // Enforced by the system\n id: string\n timeStarted: Date\n timeProposed?: Date\n timeDisposed?: Date\n sponsor: RegisterStakeholder\n\n // Supplied by register manager\n status: typeof DECISION_STATUSES[number] // Default filled in by the system but changeable\n disposition?: typeof DISPOSITION_OPTIONS[number]\n controlBodyDecisionEvent?: string\n controlBodyNotes?: string\n registerManagerNotes?: string\n}\n\n\n/**\n * Change request properties for the purposes of drafting.\n * (`controlBodyNotes` is in question.)\n */\nexport type DraftChangeRequest =\n Pick<ChangeRequest, 'proposals' | 'justification' | 'controlBodyNotes' | 'sponsor'>;\n\nexport const PROPOSAL_TYPES = [\n 'addition',\n 'clarification',\n 'amendment',\n] as const;\n\ninterface BaseProposal {\n //itemID: RegisterItemID\n disposition?: 'accepted' | 'notAccepted'\n type: typeof PROPOSAL_TYPES[number]\n sources?: Citation[]\n}\n\nexport interface Addition extends BaseProposal {\n type: 'addition'\n ///** New item data. */\n //payload: Payload\n}\n\nexport interface Clarification extends BaseProposal {\n type: 'clarification'\n ///** Updated item data */\n //payload: Payload\n}\n\nexport const AMENDMENT_TYPES = [\n 'supersession',\n 'retirement',\n 'invalidation',\n] as const;\ninterface BaseAmendment extends BaseProposal {\n type: 'amendment'\n amendmentType: typeof AMENDMENT_TYPES[number]\n}\nexport interface Retirement extends BaseAmendment {\n amendmentType: 'retirement'\n}\nexport interface Supersession extends BaseAmendment {\n amendmentType: 'supersession'\n supersedingItemIDs: string[]\n}\nexport interface Invalidation extends BaseAmendment {\n amendmentType: 'invalidation'\n}\nexport type Amendment = Supersession | Retirement | Invalidation\n\nexport type ChangeProposal = Amendment | Clarification | Addition\n"]}
@@ -1,7 +1,7 @@
1
- import { RegisterStakeholder } from './stakeholder';
2
- import { Locale } from './util';
1
+ import { type RegisterStakeholder } from './stakeholder';
2
+ import { type Locale } from './util';
3
3
  export interface Register {
4
- id: string;
4
+ id?: string;
5
5
  name: string;
6
6
  contentSummary: string;
7
7
  uniformResourceIdentifier: string;
@@ -10,8 +10,9 @@ export interface Register {
10
10
  version?: Version;
11
11
  stakeholders: RegisterStakeholder[];
12
12
  }
13
- interface Version {
13
+ export declare function isRegisterMetadata(val: any): val is Register;
14
+ export interface Version {
14
15
  id: string;
15
16
  timestamp: Date;
16
17
  }
17
- export {};
18
+ export declare function isVersion(val: any): val is Version;
package/types/register.js CHANGED
@@ -2,4 +2,22 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
- });
5
+ });
6
+ exports.isRegisterMetadata = isRegisterMetadata;
7
+ exports.isVersion = isVersion;
8
+
9
+ var _stakeholder = require("./stakeholder");
10
+
11
+ function isRegisterMetadata(val) {
12
+ return val && // val.hasOwnProperty('id') &&
13
+ //typeof val.id === 'string' &&
14
+ val.hasOwnProperty('name') && typeof val.name === 'string' && //val.hasOwnProperty('contentSummary') &&
15
+ //typeof val.contentSummary === 'string' &&
16
+ val.hasOwnProperty('stakeholders') && val.stakeholders.length > 0 && // Stakeholders must be right
17
+ val.stakeholders.every(_stakeholder.isRegisterStakeholder) && // Must have at least an owner
18
+ val.stakeholders.some(s => s.role === 'owner') && (val.version === undefined || isVersion(val.version));
19
+ }
20
+
21
+ function isVersion(val) {
22
+ return val && val.hasOwnProperty('id') && val.hasOwnProperty('timestamp') && typeof val.id === 'string';
23
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/types/register.ts"],"names":[],"mappings":"","sourcesContent":["import { RegisterStakeholder } from './stakeholder';\nimport { Locale } from './util';\n\n\nexport interface Register {\n id: string\n name: string\n contentSummary: string\n uniformResourceIdentifier: string\n\n operatingLanguage: Locale\n alternativeLanguages: Locale[]\n\n version?: Version\n stakeholders: RegisterStakeholder[]\n}\n\ninterface Version {\n id: string\n timestamp: Date\n}\n"]}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/types/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAkBhF,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,OAAO,CACL,GAAG;QACH,8BAA8B;QAC9B,+BAA+B;QAC/B,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1B,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,yCAAyC;QACzC,2CAA2C;QAC3C,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;QAClC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;QAC3B,6BAA6B;QAC7B,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,qBAAqB,CAAC;QAC7C,8BAA8B;QAC9B,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;QACrE,iDAAiD;QACjD,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAOD,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,OAAO,CACL,GAAG;QACH,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;QACxB,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;QAC/B,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import { type RegisterStakeholder, isRegisterStakeholder } from './stakeholder';\nimport { type Locale } from './util';\n\n\nexport interface Register {\n // TODO: what is register ID? Perhaps URI is enough?\n id?: string\n name: string\n contentSummary: string\n uniformResourceIdentifier: string\n\n operatingLanguage: Locale\n alternativeLanguages: Locale[]\n\n version?: Version\n stakeholders: RegisterStakeholder[]\n}\n\nexport function isRegisterMetadata(val: any): val is Register {\n return (\n val &&\n // val.hasOwnProperty('id') &&\n //typeof val.id === 'string' &&\n val.hasOwnProperty('name') &&\n typeof val.name === 'string' &&\n //val.hasOwnProperty('contentSummary') &&\n //typeof val.contentSummary === 'string' &&\n val.hasOwnProperty('stakeholders') &&\n val.stakeholders.length > 0 &&\n // Stakeholders must be right\n val.stakeholders.every(isRegisterStakeholder) &&\n // Must have at least an owner\n val.stakeholders.some((s: RegisterStakeholder) => s.role === 'owner') &&\n // Must have a valid version (or no version? hmm)\n (val.version === undefined || isVersion(val.version)));\n}\n\nexport interface Version {\n id: string\n timestamp: Date\n}\n\nexport function isVersion(val: any): val is Version {\n return (\n val &&\n val.hasOwnProperty('id') &&\n val.hasOwnProperty('timestamp') &&\n typeof val.id === 'string');\n}\n"]}
@@ -1,10 +1,15 @@
1
- interface RegistryLocation {
1
+ export interface Registry {
2
+ /** A registry is referenced by an UUID. */
2
3
  id: string;
3
4
  name: string;
5
+ /** HTTPS URL to Git repository holding registry source information. */
4
6
  repoURL: string;
7
+ /** URL under which the registry is made publicly available. */
8
+ publicURL: string;
9
+ /** Data directory within the repository. */
5
10
  dataRoot?: string;
6
11
  }
7
- declare const KNOWN_AUTHORITATIVE_REGISTRIES: RegistryLocation[];
8
- interface ConnectedRegistry {
12
+ export declare const KNOWN_AUTHORITATIVE_REGISTRIES: Registry[];
13
+ export interface ConnectedRegistry {
9
14
  workingCopyPath: string;
10
15
  }
package/types/registry.js CHANGED
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.KNOWN_AUTHORITATIVE_REGISTRIES = void 0;
7
+ // TODO: What is below for?
3
8
  const KNOWN_AUTHORITATIVE_REGISTRIES = [{
4
9
  id: '9D546C5C-8FA4-496D-A721-6DA72E35F4A9',
5
10
  name: 'ICS codes',
11
+ publicURL: 'https://ics.demo.paneron.org/',
6
12
  repoURL: 'https://github.com/paneron/ics-codes-registry'
7
- }];
13
+ }];
14
+ exports.KNOWN_AUTHORITATIVE_REGISTRIES = KNOWN_AUTHORITATIVE_REGISTRIES;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/types/registry.ts"],"names":[],"mappings":";AAOA,MAAM,8BAA8B,GAAuB;IACzD;QACE,EAAE,EAAE,sCAAsC;QAC1C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,+CAA+C;KACzD;CACF,CAAC","sourcesContent":["interface RegistryLocation {\n id: string // UUID\n name: string\n repoURL: string\n dataRoot?: string\n}\n\nconst KNOWN_AUTHORITATIVE_REGISTRIES: RegistryLocation[] = [\n {\n id: '9D546C5C-8FA4-496D-A721-6DA72E35F4A9',\n name: 'ICS codes',\n repoURL: 'https://github.com/paneron/ics-codes-registry',\n },\n];\n\ninterface ConnectedRegistry {\n workingCopyPath: string\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/types/registry.ts"],"names":[],"mappings":"AAgBA,2BAA2B;AAE3B,MAAM,CAAC,MAAM,8BAA8B,GAAe;IACxD;QACE,EAAE,EAAE,sCAAsC;QAC1C,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,+BAA+B;QAC1C,OAAO,EAAE,+CAA+C;KACzD;CACF,CAAC","sourcesContent":["export interface Registry {\n /** A registry is referenced by an UUID. */\n id: string\n\n name: string\n\n /** HTTPS URL to Git repository holding registry source information. */\n repoURL: string\n\n /** URL under which the registry is made publicly available. */\n publicURL: string\n\n /** Data directory within the repository. */\n dataRoot?: string\n}\n\n// TODO: What is below for?\n\nexport const KNOWN_AUTHORITATIVE_REGISTRIES: Registry[] = [\n {\n id: '9D546C5C-8FA4-496D-A721-6DA72E35F4A9',\n name: 'ICS codes',\n publicURL: 'https://ics.demo.paneron.org/',\n repoURL: 'https://github.com/paneron/ics-codes-registry',\n },\n];\n\nexport interface ConnectedRegistry {\n workingCopyPath: string\n}\n"]}
@@ -1,34 +1,58 @@
1
- export declare const STAKEHOLDER_ROLES: readonly ["owner", "manager", "submitter"];
1
+ /** Possible roles of a register stakeholder. */
2
+ export declare const StakeholderRole: {
3
+ readonly Owner: "owner";
4
+ readonly ControlBody: "control-body";
5
+ readonly Manager: "manager";
6
+ readonly Submitter: "submitter";
7
+ };
8
+ declare type StakeholderRoleType = typeof StakeholderRole[keyof typeof StakeholderRole];
9
+ export declare const STAKEHOLDER_ROLES: StakeholderRoleType[];
10
+ export declare function isStakeholderRole(val: string): val is StakeholderRoleType;
11
+ /** “Abstract” register stakeholder type. */
2
12
  interface _RegisterStakeholder {
3
- role: typeof STAKEHOLDER_ROLES[number];
13
+ role: StakeholderRoleType;
4
14
  name: string;
5
- parties: Party[];
6
15
  gitServerUsername?: string;
16
+ parties: Party[];
17
+ }
18
+ interface Owner extends _RegisterStakeholder {
19
+ role: typeof StakeholderRole.Owner;
20
+ }
21
+ export declare function isOwner(val: RegisterStakeholder): val is Owner;
22
+ interface ControlBody extends _RegisterStakeholder {
23
+ role: typeof StakeholderRole.ControlBody;
7
24
  }
8
- interface NonEditingStakeholder extends _RegisterStakeholder {
9
- role: 'owner';
25
+ export declare function isControlBody(val: RegisterStakeholder): val is ControlBody;
26
+ interface Manager extends _RegisterStakeholder {
27
+ role: typeof StakeholderRole.Manager;
10
28
  }
11
- export interface EditingStakeholder extends _RegisterStakeholder {
12
- role: 'manager' | 'submitter';
29
+ export declare function isManager(val: RegisterStakeholder): val is Manager;
30
+ interface Submitter extends _RegisterStakeholder {
31
+ role: typeof StakeholderRole.Submitter;
13
32
  }
14
- export declare type Individual = {
33
+ export declare function isSubmitter(val: RegisterStakeholder): val is Submitter;
34
+ interface Role {
15
35
  positionName: string;
16
- organization?: Organization;
17
- } | {
36
+ name?: never;
37
+ organization: Organization;
38
+ }
39
+ interface Individual {
18
40
  name: string;
41
+ positionName?: never;
19
42
  organization?: Organization;
20
- };
21
- declare type Organization = {
43
+ }
44
+ declare type Organization<T = {
22
45
  logoURL: string[];
23
- } | {
24
46
  name: string;
25
- };
26
- declare type Party = (Individual | Organization) & {
47
+ }> = Partial<T> & Pick<T, keyof T>;
48
+ declare type Party = (Individual | Role | Organization) & {
27
49
  contacts: {
28
50
  label: string;
29
51
  value: string;
30
52
  notes?: string;
31
53
  }[];
32
54
  };
33
- export declare type RegisterStakeholder = EditingStakeholder | NonEditingStakeholder;
55
+ export declare function isIndividualParty(val: any): val is Individual;
56
+ export declare type RegisterStakeholder = Owner | ControlBody | Manager | Submitter;
57
+ export declare function isRegisterStakeholder(val: any): val is RegisterStakeholder;
34
58
  export {};
@@ -3,7 +3,51 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.STAKEHOLDER_ROLES = void 0;
6
+ exports.isStakeholderRole = isStakeholderRole;
7
+ exports.isOwner = isOwner;
8
+ exports.isControlBody = isControlBody;
9
+ exports.isManager = isManager;
10
+ exports.isSubmitter = isSubmitter;
11
+ exports.isIndividualParty = isIndividualParty;
12
+ exports.isRegisterStakeholder = isRegisterStakeholder;
13
+ exports.STAKEHOLDER_ROLES = exports.StakeholderRole = void 0;
7
14
  // Stakeholders
8
- const STAKEHOLDER_ROLES = ['owner', 'manager', 'submitter'];
9
- exports.STAKEHOLDER_ROLES = STAKEHOLDER_ROLES;
15
+
16
+ /** Possible roles of a register stakeholder. */
17
+ const StakeholderRole = {
18
+ Owner: 'owner',
19
+ ControlBody: 'control-body',
20
+ Manager: 'manager',
21
+ Submitter: 'submitter'
22
+ };
23
+ exports.StakeholderRole = StakeholderRole;
24
+ const STAKEHOLDER_ROLES = Object.values(StakeholderRole);
25
+ exports.STAKEHOLDER_ROLES = STAKEHOLDER_ROLES;
26
+
27
+ function isStakeholderRole(val) {
28
+ return STAKEHOLDER_ROLES.indexOf(val) >= 0;
29
+ }
30
+
31
+ function isOwner(val) {
32
+ return val.role === StakeholderRole.Owner;
33
+ }
34
+
35
+ function isControlBody(val) {
36
+ return val.role === StakeholderRole.ControlBody;
37
+ }
38
+
39
+ function isManager(val) {
40
+ return val.role === StakeholderRole.Manager;
41
+ }
42
+
43
+ function isSubmitter(val) {
44
+ return val.role === StakeholderRole.Submitter;
45
+ }
46
+
47
+ function isIndividualParty(val) {
48
+ return typeof val.name === 'string' && !val.hasOwnProperty('positionName');
49
+ }
50
+
51
+ function isRegisterStakeholder(val) {
52
+ return val && val.hasOwnProperty('role') && isStakeholderRole(val.role) && val.hasOwnProperty('name');
53
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"stakeholder.js","sourceRoot":"","sources":["../../src/types/stakeholder.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO;IACP,SAAS;IACT,WAAW;CACH,CAAC","sourcesContent":["// Stakeholders\n\nexport const STAKEHOLDER_ROLES = [\n 'owner',\n 'manager',\n 'submitter',\n] as const;\n\ninterface _RegisterStakeholder {\n role: typeof STAKEHOLDER_ROLES[number]\n name: string\n parties: Party[]\n gitServerUsername?: string\n}\ninterface NonEditingStakeholder extends _RegisterStakeholder {\n role: 'owner'\n}\nexport interface EditingStakeholder extends _RegisterStakeholder {\n role: 'manager' | 'submitter'\n}\n\nexport type Individual = {\n positionName: string\n organization?: Organization\n} | {\n name: string\n organization?: Organization\n}\ntype Organization = {\n logoURL: string[]\n} | {\n name: string\n}\ntype Party = (Individual | Organization) & {\n contacts: { label: string, value: string, notes?: string }[]\n}\n\nexport type RegisterStakeholder = EditingStakeholder | NonEditingStakeholder\n"]}
1
+ {"version":3,"file":"stakeholder.js","sourceRoot":"","sources":["../../src/types/stakeholder.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,cAAc;IAC3B,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACd,CAAC;AAIX,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAA0B,CAAC;AAEzF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAA0B,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAgBD,MAAM,UAAU,OAAO,CAAC,GAAwB;IAC9C,OAAO,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC;AAC5C,CAAC;AAKD,MAAM,UAAU,aAAa,CAAC,GAAwB;IACpD,OAAO,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,WAAW,CAAC;AAClD,CAAC;AAKD,MAAM,UAAU,SAAS,CAAC,GAAwB;IAChD,OAAO,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,OAAO,CAAC;AAC9C,CAAC;AAKD,MAAM,UAAU,WAAW,CAAC,GAAwB;IAClD,OAAO,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,SAAS,CAAC;AAChD,CAAC;AA+BD,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;AAC7E,CAAC;AAID,MAAM,UAAU,qBAAqB,CAAC,GAAQ;IAC5C,OAAO,CACL,GAAG;QACH,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC;QAC1B,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AAChC,CAAC","sourcesContent":["// Stakeholders\n\n/** Possible roles of a register stakeholder. */\nexport const StakeholderRole = {\n Owner: 'owner',\n ControlBody: 'control-body',\n Manager: 'manager',\n Submitter: 'submitter',\n} as const;\n\ntype StakeholderRoleType = typeof StakeholderRole[keyof typeof StakeholderRole];\n\nexport const STAKEHOLDER_ROLES = Object.values(StakeholderRole) as StakeholderRoleType[];\n\nexport function isStakeholderRole(val: string): val is StakeholderRoleType {\n return STAKEHOLDER_ROLES.indexOf(val as StakeholderRoleType) >= 0;\n}\n\n/** “Abstract” register stakeholder type. */\ninterface _RegisterStakeholder {\n role: StakeholderRoleType\n name: string\n\n // TODO: Make git server username per-party, instead of stakeholder-global?\n gitServerUsername?: string\n\n parties: Party[]\n}\n\ninterface Owner extends _RegisterStakeholder {\n role: typeof StakeholderRole.Owner\n}\nexport function isOwner(val: RegisterStakeholder): val is Owner {\n return val.role === StakeholderRole.Owner;\n}\n\ninterface ControlBody extends _RegisterStakeholder {\n role: typeof StakeholderRole.ControlBody\n}\nexport function isControlBody(val: RegisterStakeholder): val is ControlBody {\n return val.role === StakeholderRole.ControlBody;\n}\n\ninterface Manager extends _RegisterStakeholder {\n role: typeof StakeholderRole.Manager\n}\nexport function isManager(val: RegisterStakeholder): val is Manager {\n return val.role === StakeholderRole.Manager;\n}\n\ninterface Submitter extends _RegisterStakeholder {\n role: typeof StakeholderRole.Submitter\n}\nexport function isSubmitter(val: RegisterStakeholder): val is Submitter {\n return val.role === StakeholderRole.Submitter;\n}\n\n//interface NonEditingStakeholder extends _RegisterStakeholder {\n// role: 'owner'\n//}\n//export interface EditingStakeholder extends _RegisterStakeholder {\n// role: 'manager' | 'submitter'\n//}\n\ninterface Role {\n positionName: string\n name?: never\n organization: Organization\n}\n\ninterface Individual {\n name: string\n positionName?: never\n organization?: Organization\n}\n\n// Either logoURL or name or both must be present on an org here\ntype Organization<T = {\n logoURL: string[];\n name: string;\n}> = Partial<T> & Pick<T, keyof T>\n\ntype Party = (Individual | Role | Organization) & {\n contacts: { label: string, value: string, notes?: string }[]\n}\n\nexport function isIndividualParty(val: any): val is Individual {\n return typeof val.name === 'string' && !val.hasOwnProperty('positionName');\n}\n\nexport type RegisterStakeholder = Owner | ControlBody | Manager | Submitter\n\nexport function isRegisterStakeholder(val: any): val is RegisterStakeholder {\n return (\n val &&\n val.hasOwnProperty('role') &&\n isStakeholderRole(val.role) &&\n val.hasOwnProperty('name'));\n}\n"]}
package/types/views.d.ts CHANGED
@@ -1,27 +1,57 @@
1
1
  import type React from 'react';
2
- import type { IButtonProps } from '@blueprintjs/core';
3
- import type { ValueHook } from '@riboseinc/paneron-extension-kit/types';
2
+ import type { ButtonProps, MenuItemProps } from '@blueprintjs/core';
3
+ import type { ObjectDatasetRequest, ObjectDatasetResponse, ValueHook } from '@riboseinc/paneron-extension-kit/types';
4
4
  import type { InternalItemReference, Payload, RegisterItem, RegisterItemClass } from './item';
5
- export interface ExtensionContext {
6
- getRelatedItemClassConfiguration: (classID: string) => RelatedItemClassConfiguration;
7
- useRegisterItemData: RegisterItemDataHook;
8
- onJump?: () => void;
9
- }
5
+ import type { CriteriaGroup } from '../views/FilterCriteria/models';
6
+ /**
7
+ * Mostly a wrapper around useObjectData, but coerces value type
8
+ * (TODO: validate!) and takes into account change request from any
9
+ * wrapping change request context. If a change request is present,
10
+ * will substitute proposed item data unless `ignoreActiveCR` is set.
11
+ *
12
+ * NOTE: Despite the name, returns the entire RegisterItem,
13
+ * not just the `.data` property with item payload.
14
+ */
15
+ export declare type RegisterItemDataHook<P extends Payload = Payload> = (opts: {
16
+ itemPaths: string[];
17
+ ignoreActiveCR?: true;
18
+ }) => ValueHook<Record<string, RegisterItem<P> | null>>;
10
19
  export interface RegisterConfiguration<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> {
20
+ /**
21
+ * Configuration for all items in this register.
22
+ * This includes items in subregisters.
23
+ */
11
24
  itemClassConfiguration: Items;
25
+ /**
26
+ * Default expression used to sort an item.
27
+ * Passed to useFilteredIndex().
28
+ */
29
+ keyExpression?: string;
30
+ /** Subregister information. */
31
+ subregisters?: Subregisters<Items>;
12
32
  }
13
33
  export declare type Subregisters<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> = {
14
34
  [subregisterID: string]: {
15
35
  title: string;
36
+ /** Names of item classes that go in this subregister. */
16
37
  itemClasses: (keyof Items)[];
17
38
  };
18
39
  };
19
- export declare type RegisterItemDataHook<P extends Payload = Payload> = (opts: {
20
- itemPaths: string[];
21
- }) => ValueHook<Record<string, RegisterItem<P> | null>>;
22
40
  export declare type ItemClassConfigurationSet = {
23
41
  [itemClassID: string]: ItemClassConfiguration<any>;
24
42
  };
43
+ export interface ExportFormatConfiguration<P extends Payload> {
44
+ /** The name of the export format. */
45
+ label: string;
46
+ /**
47
+ * The function that takes register item data and some helper functions
48
+ * and is expected to return a blob.
49
+ */
50
+ exportItem: (itemData: RegisterItem<P>, opts: {
51
+ getObjectData: (opts: ObjectDatasetRequest) => Promise<ObjectDatasetResponse>;
52
+ getBlob: (val: string) => Promise<Uint8Array>;
53
+ }) => Promise<Uint8Array>;
54
+ }
25
55
  export interface ItemClassConfiguration<P extends Payload> {
26
56
  meta: RegisterItemClass;
27
57
  itemCanBeSuperseded?: boolean;
@@ -29,6 +59,12 @@ export interface ItemClassConfiguration<P extends Payload> {
29
59
  validatePayload?: (item: P) => Promise<boolean>;
30
60
  sanitizePayload?: (item: P) => Promise<P>;
31
61
  itemSorter?: (a: P, b: P) => number;
62
+ /**
63
+ * Expression used to sort an item of this class.
64
+ * Passed to useFilteredIndex().
65
+ */
66
+ keyExpression?: string;
67
+ exportFormats?: ExportFormatConfiguration<P>[];
32
68
  views: {
33
69
  listItemView: ItemListView<P>;
34
70
  editView: ItemEditView<P>;
@@ -36,47 +72,85 @@ export interface ItemClassConfiguration<P extends Payload> {
36
72
  };
37
73
  }
38
74
  export interface RegistryViewProps<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> extends RegisterConfiguration<Items> {
39
- subregisters?: Subregisters<Items>;
75
+ /**
76
+ * When search is initially opened, have this query pre-defined.
77
+ * Not very useful since there are also preset searches in the browser now.
78
+ */
79
+ defaultSearchCriteria?: CriteriaGroup;
80
+ customViews?: CustomViewConfiguration[];
81
+ }
82
+ export interface CustomViewConfiguration {
83
+ id: string;
84
+ label: string;
85
+ description: string;
86
+ view: React.FC<{
87
+ /** View can support optional path for custom state/inner navigation (provisional). */
88
+ path: string;
89
+ }>;
90
+ icon?: JSX.Element;
40
91
  }
41
92
  export interface ItemAction {
42
- getButtonProps: (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) => IButtonProps;
93
+ getButtonProps: (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) => ButtonProps | MenuItemProps;
43
94
  }
44
95
  export declare type RegistryView = React.FC<RegistryViewProps>;
45
96
  declare type RegistryItemPayloadDefaults<P extends Payload> = Partial<Omit<P, 'id'>>;
97
+ /**
98
+ * A small part of item class configuration,
99
+ * useful e.g. for formatting related items.
100
+ */
46
101
  export declare type RelatedItemClassConfiguration = {
47
102
  title: string;
48
103
  itemView: ItemListView<any>;
49
104
  };
50
105
  export interface RegistryItemViewProps<P extends Payload> {
106
+ /**
107
+ * Item reference.
108
+ * Glossarist, for example, uses it to determine language subregister and set appropriate writing direction.
109
+ */
110
+ itemRef: Omit<InternalItemReference, 'itemID'> & {
111
+ itemID?: InternalItemReference['itemID'];
112
+ };
113
+ /** Item data (payload). */
51
114
  itemData: P;
52
115
  className?: string;
53
- subregisterID?: string;
54
- useRegisterItemData: RegisterItemDataHook;
55
- getRelatedItemClassConfiguration: ExtensionContext["getRelatedItemClassConfiguration"];
116
+ /** Deprecated */
117
+ useRegisterItemData?: any;
118
+ /** Deprecated */
119
+ getRelatedItemClassConfiguration?: any;
56
120
  }
57
121
  export interface GenericRelatedItemViewProps {
122
+ /** Currently selected item’s ref. */
58
123
  itemRef?: InternalItemReference;
124
+ /**
125
+ * By default, clicking the item will spawn a tab via TabbedWorkspace context.
126
+ * This prop can customize that behavior.
127
+ */
128
+ onJump?: () => void;
59
129
  className?: string;
60
- useRegisterItemData: RegisterItemDataHook;
61
- getRelatedItemClassConfiguration: ExtensionContext["getRelatedItemClassConfiguration"];
62
130
  availableClassIDs?: string[];
63
131
  availableSubregisterIDs?: string[];
64
132
  itemSorter?: ItemClassConfiguration<any>["itemSorter"];
133
+ /** Called to auto-create an item (can’t auto-create if not provided) */
65
134
  onCreateNew?: () => Promise<InternalItemReference>;
135
+ /** Called when current item is cleared (can’t clear if not provided) */
66
136
  onClear?: () => void;
137
+ /** Called when a new item is selected (can’t change if not provided) */
67
138
  onChange?: (newRef: InternalItemReference) => void;
139
+ /** Deprecated */
140
+ useRegisterItemData?: any;
141
+ /** Deprecated */
142
+ getRelatedItemClassConfiguration?: any;
68
143
  }
69
- export declare type ItemEditView<P> = React.FC<RegistryItemViewProps<P> & {
144
+ export declare type ItemEditView<P extends Payload> = React.FC<RegistryItemViewProps<P> & {
70
145
  onChange?: (newData: P) => void;
71
146
  onCreateRelatedItem?: (classID: string, subregisterID?: string) => Promise<InternalItemReference>;
72
147
  }>;
73
- export declare type ItemDetailView<P> = React.FC<RegistryItemViewProps<P> & {
74
- useRegisterItemData: RegisterItemDataHook;
75
- }>;
76
- export interface ItemListViewProps<P> extends RegistryItemViewProps<P> {
77
- itemID: string;
148
+ export interface ItemDetailViewProps<P extends Payload> extends RegistryItemViewProps<P> {
149
+ }
150
+ export declare type ItemDetailView<P extends Payload> = React.FC<ItemDetailViewProps<P>>;
151
+ export interface ItemListViewProps<P extends Payload> extends RegistryItemViewProps<P> {
78
152
  }
79
- export declare type ItemListView<P> = React.FC<ItemListViewProps<P>>;
153
+ export declare type ItemListView<P extends Payload> = React.FC<ItemListViewProps<P>>;
80
154
  export declare type LazyItemView = React.FC<{
81
155
  itemID: string;
82
156
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/types/views.ts"],"names":[],"mappings":"","sourcesContent":["\nimport type React from 'react';\nimport type { IButtonProps } from '@blueprintjs/core';\nimport type { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport type { InternalItemReference, Payload, RegisterItem, RegisterItemClass } from './item';\n\n\n// Extension configuration\n\nexport interface ExtensionContext {\n getRelatedItemClassConfiguration: (classID: string) => RelatedItemClassConfiguration\n useRegisterItemData: RegisterItemDataHook\n onJump?: () => void\n}\n\nexport interface RegisterConfiguration<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> {\n itemClassConfiguration: Items\n}\n\nexport type Subregisters<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> = {\n [subregisterID: string]: {\n title: string\n itemClasses: (keyof Items)[]\n }\n};\n\nexport type RegisterItemDataHook<P extends Payload = Payload> =\n (opts: { itemPaths: string[] }) => ValueHook<Record<string, RegisterItem<P> | null>>;\n\nexport type ItemClassConfigurationSet = {\n [itemClassID: string]: ItemClassConfiguration<any>\n};\n\n\n\n\nexport interface ItemClassConfiguration<P extends Payload/*, F extends Field*/> {\n meta: RegisterItemClass\n\n itemCanBeSuperseded?: boolean\n // If false, items of this class cannot be superseded, only retired.\n // Default is true.\n\n defaults?: RegistryItemPayloadDefaults<P>\n // Used to pre-populate item data e.g. when a new item is created.\n\n validatePayload?: (item: P) => Promise<boolean>\n sanitizePayload?: (item: P) => Promise<P>\n itemSorter?: (a: P, b: P) => number\n\n views: {\n listItemView: ItemListView<P>\n editView: ItemEditView<P>\n detailView?: ItemDetailView<P>\n }\n}\n\n\n// Item views\n\nexport interface RegistryViewProps\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>>\nextends RegisterConfiguration<Items> {\n subregisters?: Subregisters<Items>\n}\n\nexport interface ItemAction {\n getButtonProps: (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) => IButtonProps\n}\n\nexport type RegistryView = React.FC<RegistryViewProps>\n\ntype RegistryItemPayloadDefaults<P extends Payload> =\n Partial<Omit<P, 'id'>>;\n\nexport type RelatedItemClassConfiguration = {\n title: string\n itemView: ItemListView<any>\n}\n\n\nexport interface RegistryItemViewProps<P extends Payload> {\n itemData: P\n className?: string\n subregisterID?: string\n useRegisterItemData: RegisterItemDataHook\n getRelatedItemClassConfiguration: ExtensionContext[\"getRelatedItemClassConfiguration\"]\n}\n\nexport interface GenericRelatedItemViewProps {\n itemRef?: InternalItemReference\n className?: string\n useRegisterItemData: RegisterItemDataHook\n getRelatedItemClassConfiguration: ExtensionContext[\"getRelatedItemClassConfiguration\"]\n availableClassIDs?: string[]\n availableSubregisterIDs?: string[]\n itemSorter?: ItemClassConfiguration<any>[\"itemSorter\"]\n onCreateNew?: () => Promise<InternalItemReference>\n onClear?: () => void\n onChange?: (newRef: InternalItemReference) => void\n}\n\n\nexport type ItemEditView<P> = React.FC<RegistryItemViewProps<P> & {\n onChange?: (newData: P) => void\n onCreateRelatedItem?: (classID: string, subregisterID?: string) => Promise<InternalItemReference>\n}>;\nexport type ItemDetailView<P> = React.FC<RegistryItemViewProps<P> & {\n useRegisterItemData: RegisterItemDataHook\n}>;\n\nexport interface ItemListViewProps<P> extends RegistryItemViewProps<P> {\n itemID: string\n}\nexport type ItemListView<P> = React.FC<ItemListViewProps<P>>;\nexport type LazyItemView = React.FC<{ itemID: string }>;\n"]}
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/types/views.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\nimport type { ButtonProps, MenuItemProps } from '@blueprintjs/core';\nimport type { ObjectDatasetRequest, ObjectDatasetResponse, ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport type { InternalItemReference, Payload, RegisterItem, RegisterItemClass } from './item';\nimport type { CriteriaGroup } from '../views/FilterCriteria/models';\n\n\n// Hooks\n\n/**\n * Mostly a wrapper around useObjectData, but coerces value type\n * (TODO: validate!) and takes into account change request from any\n * wrapping change request context. If a change request is present,\n * will substitute proposed item data unless `ignoreActiveCR` is set.\n *\n * NOTE: Despite the name, returns the entire RegisterItem,\n * not just the `.data` property with item payload.\n */\nexport type RegisterItemDataHook<P extends Payload = Payload> =\n (opts: { itemPaths: string[], ignoreActiveCR?: true }) => ValueHook<Record<string, RegisterItem<P> | null>>;\n\n\n// Extension configuration\n\n// TODO: Obsolete?\n// export interface ExtensionContext {\n// getRelatedItemClassConfiguration: (classID: string) => RelatedItemClassConfiguration\n// useRegisterItemData: RegisterItemDataHook\n// onJump?: () => void\n// }\n\nexport interface RegisterConfiguration\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> {\n /**\n * Configuration for all items in this register.\n * This includes items in subregisters.\n */\n itemClassConfiguration: Items\n\n /**\n * Default expression used to sort an item.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n /** Subregister information. */\n subregisters?: Subregisters<Items>\n}\n\nexport type Subregisters\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> = {\n [subregisterID: string]: {\n title: string\n\n /** Names of item classes that go in this subregister. */\n itemClasses: (keyof Items)[]\n }\n};\n\nexport type ItemClassConfigurationSet = {\n [itemClassID: string]: ItemClassConfiguration<any>\n};\n\n\n\nexport interface ExportFormatConfiguration<P extends Payload> {\n /** The name of the export format. */\n label: string\n\n /**\n * The function that takes register item data and some helper functions\n * and is expected to return a blob.\n */\n exportItem: (\n itemData: RegisterItem<P>,\n opts: {\n getObjectData: (opts: ObjectDatasetRequest) => Promise<ObjectDatasetResponse>,\n getBlob: (val: string) => Promise<Uint8Array>,\n },\n ) => Promise<Uint8Array>\n}\n\n\nexport interface ItemClassConfiguration<P extends Payload/*, F extends Field*/> {\n meta: RegisterItemClass\n\n itemCanBeSuperseded?: boolean\n // If false, items of this class cannot be superseded, only retired.\n // Default is true.\n\n defaults?: RegistryItemPayloadDefaults<P>\n // Used to pre-populate item data e.g. when a new item is created.\n\n validatePayload?: (item: P) => Promise<boolean>\n sanitizePayload?: (item: P) => Promise<P>\n\n // XXX: Confirm if obsolete and remove\n itemSorter?: (a: P, b: P) => number\n\n /**\n * Expression used to sort an item of this class.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n exportFormats?: ExportFormatConfiguration<P>[]\n\n views: {\n listItemView: ItemListView<P>\n editView: ItemEditView<P>\n detailView?: ItemDetailView<P>\n }\n}\n\n\nexport interface RegistryViewProps\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>>\nextends RegisterConfiguration<Items> {\n /**\n * When search is initially opened, have this query pre-defined.\n * Not very useful since there are also preset searches in the browser now.\n */\n // TODO: Obsoluete?\n defaultSearchCriteria?: CriteriaGroup\n\n customViews?: CustomViewConfiguration[]\n}\n\nexport interface CustomViewConfiguration {\n id: string\n label: string\n description: string\n view: React.FC<{\n /** View can support optional path for custom state/inner navigation (provisional). */\n path: string\n }>\n icon?: JSX.Element\n}\n\n\n// Item views\n\nexport interface ItemAction {\n getButtonProps:\n (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) =>\n ButtonProps | MenuItemProps\n}\n\nexport type RegistryView = React.FC<RegistryViewProps>\n\ntype RegistryItemPayloadDefaults<P extends Payload> =\n Partial<Omit<P, 'id'>>;\n\n/**\n * A small part of item class configuration,\n * useful e.g. for formatting related items.\n */\nexport type RelatedItemClassConfiguration = {\n title: string\n itemView: ItemListView<any>\n}\n\n\nexport interface RegistryItemViewProps<P extends Payload> {\n /**\n * Item reference.\n * Glossarist, for example, uses it to determine language subregister and set appropriate writing direction.\n */\n itemRef: Omit<InternalItemReference, 'itemID'> & { itemID?: InternalItemReference['itemID'] }\n\n /** Item data (payload). */\n itemData: P\n\n className?: string\n //subregisterID?: string\n\n /** Deprecated */\n useRegisterItemData?: any\n /** Deprecated */\n getRelatedItemClassConfiguration?: any\n}\n\nexport interface GenericRelatedItemViewProps {\n /** Currently selected item’s ref. */\n itemRef?: InternalItemReference\n\n /**\n * By default, clicking the item will spawn a tab via TabbedWorkspace context.\n * This prop can customize that behavior.\n */\n onJump?: () => void\n\n className?: string\n //useRegisterItemData: RegisterItemDataHook\n //getRelatedItemClassConfiguration: ExtensionContext[\"getRelatedItemClassConfiguration\"]\n availableClassIDs?: string[]\n availableSubregisterIDs?: string[]\n\n // XXX: Check if obsolete, remove if unused\n itemSorter?: ItemClassConfiguration<any>[\"itemSorter\"]\n\n /** Called to auto-create an item (can’t auto-create if not provided) */\n onCreateNew?: () => Promise<InternalItemReference>\n\n /** Called when current item is cleared (can’t clear if not provided) */\n onClear?: () => void\n\n /** Called when a new item is selected (can’t change if not provided) */\n onChange?: (newRef: InternalItemReference) => void\n\n /** Deprecated */\n useRegisterItemData?: any\n /** Deprecated */\n getRelatedItemClassConfiguration?: any\n}\n\n\nexport type ItemEditView<P extends Payload> = React.FC<RegistryItemViewProps<P> & {\n onChange?: (newData: P) => void\n onCreateRelatedItem?:\n (classID: string, subregisterID?: string) => Promise<InternalItemReference>\n}>;\n\nexport interface ItemDetailViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n //useRegisterItemData: RegisterItemDataHook\n}\n\nexport type ItemDetailView<P extends Payload> = React.FC<ItemDetailViewProps<P>>;\n\nexport interface ItemListViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n}\n\nexport type ItemListView<P extends Payload> = React.FC<ItemListViewProps<P>>;\n\nexport type LazyItemView = React.FC<{ itemID: string }>;\n"]}