@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.
- package/common.d.ts +1 -1
- package/common.js +1 -1
- package/common.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/package.json +26 -18
- package/types/cr.d.ts +216 -0
- package/types/cr.js +175 -0
- package/types/cr.js.map +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.js +19 -0
- package/types/index.js.map +1 -1
- package/types/item.d.ts +13 -3
- package/types/item.js +11 -1
- package/types/item.js.map +1 -1
- package/types/proposal.d.ts +31 -14
- package/types/proposal.js +1 -1
- package/types/proposal.js.map +1 -1
- package/types/register.d.ts +6 -5
- package/types/register.js +19 -1
- package/types/register.js.map +1 -1
- package/types/registry.d.ts +8 -3
- package/types/registry.js +8 -1
- package/types/registry.js.map +1 -1
- package/types/stakeholder.d.ts +40 -16
- package/types/stakeholder.js +47 -3
- package/types/stakeholder.js.map +1 -1
- package/types/views.d.ts +98 -24
- package/types/views.js.map +1 -1
- package/views/AnnotatedChange.d.ts +7 -0
- package/views/AnnotatedChange.js +91 -0
- package/views/AnnotatedChange.js.map +1 -0
- package/views/BrowserCtx.d.ts +66 -2
- package/views/BrowserCtx.js +13 -2
- package/views/BrowserCtx.js.map +1 -1
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +17 -0
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +202 -0
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +6 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js +50 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -0
- package/views/FilterCriteria/criteriaGroupToSummary.d.ts +5 -0
- package/views/FilterCriteria/criteriaGroupToSummary.js +62 -0
- package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -0
- package/views/FilterCriteria/criteriaToNodes.d.ts +24 -0
- package/views/FilterCriteria/criteriaToNodes.js +159 -0
- package/views/FilterCriteria/criteriaToNodes.js.map +1 -0
- package/views/FilterCriteria/index.d.ts +23 -0
- package/views/FilterCriteria/index.js +130 -0
- package/views/FilterCriteria/index.js.map +1 -0
- package/views/FilterCriteria/models.d.ts +68 -0
- package/views/FilterCriteria/models.js +34 -0
- package/views/FilterCriteria/models.js.map +1 -0
- package/views/FilterCriteria/mutateGroup.d.ts +17 -0
- package/views/FilterCriteria/mutateGroup.js +59 -0
- package/views/FilterCriteria/mutateGroup.js.map +1 -0
- package/views/GenericRelatedItemView.d.ts +1 -1
- package/views/GenericRelatedItemView.js +143 -101
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/RegisterStakeholder.d.ts +9 -0
- package/views/RegisterStakeholder.js +40 -0
- package/views/RegisterStakeholder.js.map +1 -0
- package/views/RegisterVersion.d.ts +9 -0
- package/views/RegisterVersion.js +41 -0
- package/views/RegisterVersion.js.map +1 -0
- package/views/SearchQuery.d.ts +13 -0
- package/views/SearchQuery.js +137 -0
- package/views/SearchQuery.js.map +1 -0
- package/views/change-request/ChangeRequestContext.d.ts +20 -0
- package/views/change-request/ChangeRequestContext.js +56 -0
- package/views/change-request/ChangeRequestContext.js.map +1 -0
- package/views/change-request/Proposals.d.ts +21 -0
- package/views/change-request/Proposals.js +331 -0
- package/views/change-request/Proposals.js.map +1 -0
- package/views/change-request/objectChangeset.d.ts +31 -0
- package/views/change-request/objectChangeset.js +229 -0
- package/views/change-request/objectChangeset.js.map +1 -0
- package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
- package/views/detail/ChangeRequest/Proposal.js +142 -0
- package/views/detail/ChangeRequest/Proposal.js.map +1 -0
- package/views/detail/ChangeRequest/index.d.ts +13 -0
- package/views/detail/ChangeRequest/index.js +207 -0
- package/views/detail/ChangeRequest/index.js.map +1 -0
- package/views/detail/ChangeRequest/transitions.d.ts +28 -0
- package/views/detail/ChangeRequest/transitions.js +530 -0
- package/views/detail/ChangeRequest/transitions.js.map +1 -0
- package/views/detail/CustomView/index.d.ts +13 -0
- package/views/detail/CustomView/index.js +68 -0
- package/views/detail/CustomView/index.js.map +1 -0
- package/views/detail/RegisterHome/index.d.ts +5 -0
- package/views/detail/RegisterHome/index.js +128 -0
- package/views/detail/RegisterHome/index.js.map +1 -0
- package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
- package/views/detail/RegisterItem/RelatedItems.js +61 -0
- package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
- package/views/detail/RegisterItem/index.d.ts +13 -0
- package/views/detail/RegisterItem/index.js +356 -0
- package/views/detail/RegisterItem/index.js.map +1 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
- package/views/detail/RegisterMeta/index.d.ts +10 -0
- package/views/detail/RegisterMeta/index.js +111 -0
- package/views/detail/RegisterMeta/index.js.map +1 -0
- package/views/detail/index.d.ts +1 -0
- package/views/detail/index.js +24 -0
- package/views/detail/index.js.map +1 -0
- package/views/diffing/InlineDiff.d.ts +12 -0
- package/views/diffing/InlineDiff.js +58 -0
- package/views/diffing/InlineDiff.js.map +1 -0
- package/views/diffing/StructuredDiff.d.ts +11 -0
- package/views/diffing/StructuredDiff.js +65 -0
- package/views/diffing/StructuredDiff.js.map +1 -0
- package/views/hooks/useCustomView.d.ts +3 -0
- package/views/hooks/useCustomView.js +24 -0
- package/views/hooks/useCustomView.js.map +1 -0
- package/views/hooks/useItemClassConfig.d.ts +3 -0
- package/views/hooks/useItemClassConfig.js +24 -0
- package/views/hooks/useItemClassConfig.js.map +1 -0
- package/views/hooks/useItemRef.d.ts +3 -0
- package/views/hooks/useItemRef.js +39 -0
- package/views/hooks/useItemRef.js.map +1 -0
- package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
- package/views/hooks/useSingleRegisterItemData.js +32 -0
- package/views/hooks/useSingleRegisterItemData.js.map +1 -0
- package/views/index.d.ts +2 -2
- package/views/index.js +161 -130
- package/views/index.js.map +1 -1
- package/views/itemPathUtils.d.ts +45 -2
- package/views/itemPathUtils.js +101 -14
- package/views/itemPathUtils.js.map +1 -1
- package/views/itemQueryUtils.d.ts +11 -0
- package/views/itemQueryUtils.js +48 -0
- package/views/itemQueryUtils.js.map +1 -0
- package/views/protocolRegistry.d.ts +12 -0
- package/views/protocolRegistry.js +42 -0
- package/views/protocolRegistry.js.map +1 -0
- package/views/sidebar/Browse/index.d.ts +11 -0
- package/views/sidebar/Browse/index.js +453 -0
- package/views/sidebar/Browse/index.js.map +1 -0
- package/views/sidebar/Export/index.d.ts +5 -0
- package/views/sidebar/Export/index.js +94 -0
- package/views/sidebar/Export/index.js.map +1 -0
- package/views/sidebar/ListItem.d.ts +10 -0
- package/views/sidebar/ListItem.js +43 -0
- package/views/sidebar/ListItem.js.map +1 -0
- package/views/sidebar/Registration/index.d.ts +5 -0
- package/views/sidebar/Registration/index.js +163 -0
- package/views/sidebar/Registration/index.js.map +1 -0
- package/views/sidebar/Search/index.d.ts +18 -0
- package/views/sidebar/Search/index.js +177 -0
- package/views/sidebar/Search/index.js.map +1 -0
- package/views/sidebar/index.d.ts +6 -0
- package/views/sidebar/index.js +104 -0
- package/views/sidebar/index.js.map +1 -0
- package/views/util.d.ts +29 -5
- package/views/util.js +92 -6
- package/views/util.js.map +1 -1
- package/views/ChangeRequest.d.ts +0 -12
- package/views/ChangeRequest.js +0 -689
- package/views/ChangeRequest.js.map +0 -1
- package/views/FilterCriteria.d.ts +0 -27
- package/views/FilterCriteria.js +0 -410
- package/views/FilterCriteria.js.map +0 -1
- package/views/ItemBrowser.d.ts +0 -12
- package/views/ItemBrowser.js +0 -255
- package/views/ItemBrowser.js.map +0 -1
- package/views/ItemDetails.d.ts +0 -14
- package/views/ItemDetails.js +0 -128
- package/views/ItemDetails.js.map +0 -1
- package/views/MainView.d.ts +0 -8
- package/views/MainView.js +0 -34
- package/views/MainView.js.map +0 -1
- package/views/RegisterInformation.d.ts +0 -7
- package/views/RegisterInformation.js +0 -264
- package/views/RegisterInformation.js.map +0 -1
- package/views/RegisterItemGrid.d.ts +0 -25
- package/views/RegisterItemGrid.js +0 -248
- package/views/RegisterItemGrid.js.map +0 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _styled = _interopRequireDefault(require("@emotion/styled"));
|
|
13
|
+
|
|
14
|
+
var _core = require("@blueprintjs/core");
|
|
15
|
+
|
|
16
|
+
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
17
|
+
|
|
18
|
+
var _HelpTooltip = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/HelpTooltip"));
|
|
19
|
+
|
|
20
|
+
var _useItemRef = _interopRequireDefault(require("../../hooks/useItemRef"));
|
|
21
|
+
|
|
22
|
+
var _useSingleRegisterItemData = _interopRequireDefault(require("../../hooks/useSingleRegisterItemData"));
|
|
23
|
+
|
|
24
|
+
var _useItemClassConfig = _interopRequireDefault(require("../../hooks/useItemClassConfig"));
|
|
25
|
+
|
|
26
|
+
var _protocolRegistry = require("../../protocolRegistry");
|
|
27
|
+
|
|
28
|
+
var _types = require("../../../types");
|
|
29
|
+
|
|
30
|
+
var _BrowserCtx = require("../../BrowserCtx");
|
|
31
|
+
|
|
32
|
+
var _util = require("../../util");
|
|
33
|
+
|
|
34
|
+
var _itemPathUtils = require("../../itemPathUtils");
|
|
35
|
+
|
|
36
|
+
var _objectChangeset = require("../../change-request/objectChangeset");
|
|
37
|
+
|
|
38
|
+
var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
|
|
39
|
+
|
|
40
|
+
var _RelatedItems = require("./RelatedItems");
|
|
41
|
+
|
|
42
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
43
|
+
|
|
44
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
45
|
+
|
|
46
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
47
|
+
|
|
48
|
+
/** @jsx jsx */
|
|
49
|
+
|
|
50
|
+
/** @jsxFrag React.Fragment */
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Main register item view.
|
|
54
|
+
*
|
|
55
|
+
* NOTE: while generally intended as tab content handler,
|
|
56
|
+
* is also reused within change request view.
|
|
57
|
+
*/
|
|
58
|
+
const ItemDetail = function ({
|
|
59
|
+
uri,
|
|
60
|
+
inProposalWithID
|
|
61
|
+
}) {
|
|
62
|
+
var _itemClass$meta;
|
|
63
|
+
|
|
64
|
+
const {
|
|
65
|
+
value: ref
|
|
66
|
+
} = (0, _useItemRef.default)(uri);
|
|
67
|
+
const {
|
|
68
|
+
value: clsConfig
|
|
69
|
+
} = (0, _useItemClassConfig.default)((ref === null || ref === void 0 ? void 0 : ref.classID) ?? 'NONEXISTENT_CLASS_ID'); //const { value: itemData } = useSingleRegisterItemData(ref);
|
|
70
|
+
|
|
71
|
+
const {
|
|
72
|
+
updateObjects,
|
|
73
|
+
performOperation,
|
|
74
|
+
operationKey
|
|
75
|
+
} = (0, _react.useContext)(_context.DatasetContext);
|
|
76
|
+
const isBusy = operationKey !== undefined;
|
|
77
|
+
const {
|
|
78
|
+
jumpTo,
|
|
79
|
+
subregisters,
|
|
80
|
+
useRegisterItemData,
|
|
81
|
+
activeChangeRequestID: globallyActiveCRID
|
|
82
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
83
|
+
const {
|
|
84
|
+
changeRequest: activeCR,
|
|
85
|
+
canEdit: activeCRIsEditable
|
|
86
|
+
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
87
|
+
const itemClass = clsConfig;
|
|
88
|
+
const itemClassID = itemClass === null || itemClass === void 0 ? void 0 : (_itemClass$meta = itemClass.meta) === null || _itemClass$meta === void 0 ? void 0 : _itemClass$meta.id;
|
|
89
|
+
const itemRef = ref ?? dummyRef;
|
|
90
|
+
const {
|
|
91
|
+
itemID,
|
|
92
|
+
subregisterID
|
|
93
|
+
} = itemRef;
|
|
94
|
+
const _itemPath = `${itemClassID ?? 'NONEXISTENT_CLASS'}/${itemID}.yaml`;
|
|
95
|
+
const itemPath = subregisterID ? `/subregisters/${subregisterID}/${_itemPath}` : `/${_itemPath}`;
|
|
96
|
+
const itemRequest = {
|
|
97
|
+
itemPaths: [itemPath]
|
|
98
|
+
};
|
|
99
|
+
const itemResponse = useRegisterItemData(itemRequest);
|
|
100
|
+
const itemData = itemResponse.value[itemPath];
|
|
101
|
+
const [editedClarification, setEditedClarification] = (0, _react.useState)(null); //const [ diffMode, setDiffMode ] = useState<boolean>(false);
|
|
102
|
+
// TODO: Implement diff mode
|
|
103
|
+
|
|
104
|
+
const diffMode = false;
|
|
105
|
+
const proposal = (activeCR && activeCR.items[itemPath] ? activeCR.items[itemPath] : null) ?? null;
|
|
106
|
+
|
|
107
|
+
const handleClearProposal = () => performProposalOperation("draft: clear proposal", null);
|
|
108
|
+
|
|
109
|
+
const handleRetire = () => performProposalOperation("draft: propose retirement", {
|
|
110
|
+
type: 'amendment',
|
|
111
|
+
amendmentType: 'retirement'
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const handleInvalidate = () => performProposalOperation("draft: propose invalidation", {
|
|
115
|
+
type: 'amendment',
|
|
116
|
+
amendmentType: 'invalidation'
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const handleSupersedeWith = items => performProposalOperation("draft: propose supersession", {
|
|
120
|
+
type: 'amendment',
|
|
121
|
+
amendmentType: 'supersession',
|
|
122
|
+
supersedingItemIDs: items
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
const handleClarify = async () => {
|
|
126
|
+
await performProposalOperation("draft: clarify item", {
|
|
127
|
+
type: 'clarification'
|
|
128
|
+
});
|
|
129
|
+
setEditedClarification(null);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const handleEditAddition = async () => {
|
|
133
|
+
await performProposalOperation("draft: edit added item", {
|
|
134
|
+
type: 'addition'
|
|
135
|
+
});
|
|
136
|
+
setEditedClarification(null);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
async function performProposalOperation(summary, proposal) {
|
|
140
|
+
return await performOperation(summary, handleSetProposal)(summary, proposal);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const handleSetProposal = (0, _react.useCallback)(async function _handleSetProposal(summary, proposal) {
|
|
144
|
+
if (!activeCRIsEditable || !updateObjects || !(0, _types.isRegisterItem)(itemData)) {
|
|
145
|
+
throw new Error("Proposal isn’t editable");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && !editedClarification) {
|
|
149
|
+
throw new Error("Missing item data");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
await updateObjects({
|
|
153
|
+
commitMessage: `${summary} for ${itemPath}`,
|
|
154
|
+
objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)( // TODO: We are sure it’s editable already, but casting should be avoided
|
|
155
|
+
activeCR, {
|
|
156
|
+
[itemPath]: proposal
|
|
157
|
+
}, proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' && editedClarification ? {
|
|
158
|
+
[itemPath]: { ...itemData,
|
|
159
|
+
data: editedClarification
|
|
160
|
+
}
|
|
161
|
+
} : {}),
|
|
162
|
+
// We need this because updateCRObjectChangeset
|
|
163
|
+
// omits oldValue for item data payloads.
|
|
164
|
+
_dangerouslySkipValidation: true
|
|
165
|
+
});
|
|
166
|
+
}, [updateObjects, activeCRIsEditable, JSON.stringify(activeCR), JSON.stringify(itemData), JSON.stringify(editedClarification)]);
|
|
167
|
+
|
|
168
|
+
if (!itemClass) {
|
|
169
|
+
return (0, _react2.jsx)(_core.NonIdealState, {
|
|
170
|
+
icon: "heart-broken",
|
|
171
|
+
title: "Unable to show item",
|
|
172
|
+
description: `View for ${(ref === null || ref === void 0 ? void 0 : ref.itemID) ?? uri} cannot be retrieved from item class configuration`
|
|
173
|
+
});
|
|
174
|
+
} else if ((0, _types.isRegisterItem)(itemData)) {
|
|
175
|
+
var _subregisters$subregi;
|
|
176
|
+
|
|
177
|
+
let details;
|
|
178
|
+
|
|
179
|
+
if (editedClarification !== null && activeCRIsEditable) {
|
|
180
|
+
const EditView = itemClass.views.editView;
|
|
181
|
+
details = (0, _react2.jsx)(EditView, {
|
|
182
|
+
itemData: editedClarification,
|
|
183
|
+
itemRef: itemRef,
|
|
184
|
+
onChange: !isBusy ? newData => {
|
|
185
|
+
setEditedClarification(newData);
|
|
186
|
+
} : undefined
|
|
187
|
+
});
|
|
188
|
+
} else {
|
|
189
|
+
const DetailView = itemClass.views.detailView ?? itemClass.views.editView;
|
|
190
|
+
details = (0, _react2.jsx)(DetailView, {
|
|
191
|
+
itemRef: itemRef,
|
|
192
|
+
itemData: itemData.data
|
|
193
|
+
});
|
|
194
|
+
} //const canAmend = activeCR && itemData.status === 'valid';
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
const itemStatus = (0, _react2.jsx)(FormGroup, {
|
|
198
|
+
inline: true,
|
|
199
|
+
label: "status:",
|
|
200
|
+
css: (0, _react2.css)`margin: 0;`
|
|
201
|
+
}, (0, _react2.jsx)(_core.ControlGroup, {
|
|
202
|
+
fill: true
|
|
203
|
+
}, (0, _react2.jsx)(_core.InputGroup, {
|
|
204
|
+
value: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' ? `${proposal.amendmentType} proposed` : (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? "addition proposed" : itemData.status,
|
|
205
|
+
intent: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' ? 'warning' : (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? 'primary' : itemData.status === 'valid' ? 'success' : undefined,
|
|
206
|
+
leftIcon: proposal && (proposal.type === 'amendment' || proposal.type === 'addition') ? 'asterisk' : itemData.status === 'valid' ? 'tick' : itemData.status === 'invalid' ? 'ban-circle' : 'warning-sign',
|
|
207
|
+
readOnly: true
|
|
208
|
+
}), activeCRIsEditable && !editedClarification ? (0, _react2.jsx)(_react.default.Fragment, null, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'addition' ? (0, _react2.jsx)(_core.Button, {
|
|
209
|
+
intent: "warning",
|
|
210
|
+
title: "Remove the proposal to add this new item.",
|
|
211
|
+
disabled: isBusy,
|
|
212
|
+
onClick: handleClearProposal
|
|
213
|
+
}, "Remove proposed addition") : null, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'retirement' ? (0, _react2.jsx)(_core.Button, {
|
|
214
|
+
intent: "warning",
|
|
215
|
+
title: "Remove amendment for this item from current proposal.",
|
|
216
|
+
disabled: isBusy,
|
|
217
|
+
onClick: handleClearProposal
|
|
218
|
+
}, "Clear proposed amendment") : !proposal && itemData.status === 'valid' ? (0, _react2.jsx)(_core.ButtonGroup, null, (0, _react2.jsx)(_core.Button, {
|
|
219
|
+
intent: "primary",
|
|
220
|
+
disabled: isBusy,
|
|
221
|
+
onClick: handleRetire
|
|
222
|
+
}, "Retire"), (0, _react2.jsx)(_core.Button, {
|
|
223
|
+
intent: "primary",
|
|
224
|
+
disabled: isBusy,
|
|
225
|
+
onClick: handleInvalidate
|
|
226
|
+
}, "Invalidate")) : null) : null));
|
|
227
|
+
const supersedingItems = // It’s superseded (whether in current proposal or not)
|
|
228
|
+
itemData.status === 'superseded' // Item is valid, proposal is editable, and no change to this item is proposed yet
|
|
229
|
+
|| activeCRIsEditable && !proposal && !editedClarification && itemData.status === 'valid' // This item is being superseded in active proposal
|
|
230
|
+
// XXX: Redundant condition with the first one?
|
|
231
|
+
|| (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' ? (0, _react2.jsx)(FormGroup, {
|
|
232
|
+
inline: true,
|
|
233
|
+
label: "superseded by: ",
|
|
234
|
+
css: (0, _react2.css)`margin: 0;`
|
|
235
|
+
}, (0, _react2.jsx)(_RelatedItems.RelatedItems, {
|
|
236
|
+
itemRefs: (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' ? proposal.supersedingItemIDs.map(id => ({
|
|
237
|
+
itemID: id,
|
|
238
|
+
classID: itemClass.meta.id,
|
|
239
|
+
subregisterID
|
|
240
|
+
})) : itemData.supersededBy ?? [],
|
|
241
|
+
onChange: !isBusy && activeCRIsEditable && ((proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'amendment' && proposal.amendmentType === 'supersession' || !proposal && itemData.status === 'valid') ? items => items.length > 0 ? handleSupersedeWith(items.map(ref => ref.itemID)) : handleClearProposal() : undefined
|
|
242
|
+
})) : null;
|
|
243
|
+
const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(itemData.data);
|
|
244
|
+
const clarificationAction = proposal && (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'amendment' || activeCRIsEditable && !proposal && itemData.status === 'valid' ? (0, _react2.jsx)(FormGroup, {
|
|
245
|
+
inline: true,
|
|
246
|
+
label: `${(proposal === null || proposal === void 0 ? void 0 : proposal.type) ?? "clarification"}: `,
|
|
247
|
+
css: (0, _react2.css)`margin: 0;`
|
|
248
|
+
}, activeCRIsEditable ? (0, _react2.jsx)(_core.ButtonGroup, null, editedClarification ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
|
|
249
|
+
intent: clarificationHasChanges ? "primary" : undefined,
|
|
250
|
+
// TODO(perf): this is expensive if renders are frequent…
|
|
251
|
+
disabled: !clarificationHasChanges || isBusy,
|
|
252
|
+
onClick: !proposal || (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? handleClarify : handleEditAddition
|
|
253
|
+
}, "Save"), (0, _react2.jsx)(_core.Button, {
|
|
254
|
+
onClick: () => setEditedClarification(null)
|
|
255
|
+
}, "Do not save")) : (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
|
|
256
|
+
disabled: diffMode || isBusy,
|
|
257
|
+
intent: "primary",
|
|
258
|
+
outlined: true,
|
|
259
|
+
onClick: () => setEditedClarification(itemData.data)
|
|
260
|
+
}, !proposal ? "Clarify" : "Edit"), (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.Button, {
|
|
261
|
+
disabled: diffMode || isBusy || (proposal === null || proposal === void 0 ? void 0 : proposal.type) !== 'clarification',
|
|
262
|
+
intent: "warning",
|
|
263
|
+
onClick: handleClearProposal
|
|
264
|
+
}, "Clear")) : null)) : (0, _react2.jsx)(_core.Button, {
|
|
265
|
+
disabled: true
|
|
266
|
+
}, (proposal === null || proposal === void 0 ? void 0 : proposal.type) === 'clarification' ? "Clarified" : "Added", " in active proposal")) : null; // If there’s a CR context without active CR,
|
|
267
|
+
// or active CR isn’t the same as the one in CR context,
|
|
268
|
+
// then we can assume that the item is shown in proposal window
|
|
269
|
+
// and we’d set window title to proposal’s title rather than item’s.
|
|
270
|
+
// If there’s a CR context and active CR and they’re the same
|
|
271
|
+
// then it *could* be that the item is shown in its own tab;
|
|
272
|
+
// we will render proposal’s title if the item appears in the change request
|
|
273
|
+
// (makes sense because the user *is* technically viewing a proposal then).
|
|
274
|
+
|
|
275
|
+
const windowTitle = activeCR && (!globallyActiveCRID || activeCR.id !== globallyActiveCRID || activeCR.items[itemPath]) ? `Proposal ${(0, _util.maybeEllipsizeString)(activeCR.justification, 20)}…` : `${itemClass.meta.title ?? 'register item'} #${itemData.id}`;
|
|
276
|
+
return (0, _react2.jsx)(_util.TabContentsWithActions, {
|
|
277
|
+
actions: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(FormGroup, {
|
|
278
|
+
inline: true,
|
|
279
|
+
labelInfo: (0, _react2.jsx)(_HelpTooltip.default, {
|
|
280
|
+
icon: 'info-sign',
|
|
281
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.H5, null, itemClass.meta.title), itemClass.meta.description ?? "No description is provided for this register item class.", (0, _react2.jsx)(_core.UL, null, (0, _react2.jsx)("li", null, "Class ID: ", itemClassID), (0, _react2.jsx)("li", null, "Subregister ID: ", subregisterID ?? 'N/A'), (0, _react2.jsx)("li", null, "UUID: ", itemID)))
|
|
282
|
+
}),
|
|
283
|
+
label: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("strong", null, itemClass.meta.title), subregisterID ? (0, _react2.jsx)("span", {
|
|
284
|
+
title: "Subregister"
|
|
285
|
+
}, " in ", (subregisters === null || subregisters === void 0 ? void 0 : (_subregisters$subregi = subregisters[subregisterID]) === null || _subregisters$subregi === void 0 ? void 0 : _subregisters$subregi.title) ?? subregisterID) : null),
|
|
286
|
+
css: (0, _react2.css)`margin: 0; .bp4-form-content { display: flex; flex-flow: row wrap; gap: 10px; }`
|
|
287
|
+
}, itemStatus, supersedingItems, clarificationAction)),
|
|
288
|
+
main: (0, _react2.jsx)(_core.Card, {
|
|
289
|
+
css: (0, _react2.css)`position: absolute; inset: ${inProposalWithID ? '0' : '10px'}; overflow-y: auto;`
|
|
290
|
+
}, (0, _react2.jsx)(_util.RegisterHelmet, null, (0, _react2.jsx)("title", null, windowTitle)), details)
|
|
291
|
+
});
|
|
292
|
+
} else if (itemResponse.isUpdating) {
|
|
293
|
+
return (0, _react2.jsx)("div", {
|
|
294
|
+
className: _core.Classes.SKELETON
|
|
295
|
+
}, "Loading\u2026");
|
|
296
|
+
} else {
|
|
297
|
+
const inCRWithID = (0, _itemPathUtils.getCRIDFromProposedItemPath)(uri);
|
|
298
|
+
|
|
299
|
+
if (inCRWithID !== null && (activeCR === null || activeCR === void 0 ? void 0 : activeCR.id) !== inCRWithID) {
|
|
300
|
+
return (0, _react2.jsx)(_core.NonIdealState, {
|
|
301
|
+
icon: "help",
|
|
302
|
+
title: "This item does not exist\u2026",
|
|
303
|
+
description: (0, _react2.jsx)(_react.default.Fragment, null, "\u2026but it might be proposed.", (0, _react2.jsx)("br", null), jumpTo ? (0, _react2.jsx)(_core.Button, {
|
|
304
|
+
css: (0, _react2.css)`margin: 10px;`,
|
|
305
|
+
intent: "primary",
|
|
306
|
+
onClick: () => jumpTo === null || jumpTo === void 0 ? void 0 : jumpTo(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:${(0, _itemPathUtils.crIDToCRPath)(inCRWithID)}`)
|
|
307
|
+
}, "Go to proposal") : null)
|
|
308
|
+
});
|
|
309
|
+
} else {
|
|
310
|
+
return (0, _react2.jsx)(_core.NonIdealState, {
|
|
311
|
+
icon: "heart-broken",
|
|
312
|
+
title: "Unable to show item",
|
|
313
|
+
description: "Item may not exist, or use unexpected data format."
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
const ItemTitle = function ({
|
|
320
|
+
uri
|
|
321
|
+
}) {
|
|
322
|
+
const {
|
|
323
|
+
value: ref
|
|
324
|
+
} = (0, _useItemRef.default)(uri);
|
|
325
|
+
const {
|
|
326
|
+
value: clsConfig
|
|
327
|
+
} = (0, _useItemClassConfig.default)((ref === null || ref === void 0 ? void 0 : ref.classID) ?? 'NONEXISTENT_CLASS_ID');
|
|
328
|
+
const {
|
|
329
|
+
value: itemData
|
|
330
|
+
} = (0, _useSingleRegisterItemData.default)(ref);
|
|
331
|
+
|
|
332
|
+
const fallbackView = () => (0, _react2.jsx)(_react.default.Fragment, null, (ref === null || ref === void 0 ? void 0 : ref.itemID) ?? uri);
|
|
333
|
+
|
|
334
|
+
const View = itemData ? (clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.views.listItemView) ?? fallbackView : fallbackView;
|
|
335
|
+
return (0, _react2.jsx)(View, {
|
|
336
|
+
itemRef: ref ?? dummyRef,
|
|
337
|
+
itemData: itemData
|
|
338
|
+
});
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
var _default = {
|
|
342
|
+
main: ItemDetail,
|
|
343
|
+
title: ItemTitle
|
|
344
|
+
};
|
|
345
|
+
exports.default = _default;
|
|
346
|
+
const dummyRef = {
|
|
347
|
+
itemID: 'NONEXISTENT_ITEM_ID',
|
|
348
|
+
classID: 'NONEXISTENT_CLASS_ID',
|
|
349
|
+
subregisterID: undefined
|
|
350
|
+
};
|
|
351
|
+
const FormGroup = (0, _styled.default)(_core.FormGroup)`
|
|
352
|
+
margin: 0;
|
|
353
|
+
label.bp4-label {
|
|
354
|
+
white-space: nowrap;
|
|
355
|
+
}
|
|
356
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterItem/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EACL,MAAM,EAAE,WAAW,EACnB,IAAI,EACJ,OAAO,EACP,SAAS,IAAI,aAAa,EAC1B,YAAY,EACZ,UAAU,EACV,aAAa,EACb,EAAE,EACF,EAAE,GACH,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,WAAW,MAAM,sDAAsD,CAAC;AAC/E,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,yBAAyB,MAAM,uCAAuC,CAAC;AAC9E,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAIL,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,cAAc,IAAI,MAAM,EACxB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,uBAAuB,GAAG,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;;;GAKG;AACH,MAAM,UAAU,GAAyD,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAC1G,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;IACxF,6DAA6D;IAC7D,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,CAAC;IAC1C,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EAAE,kBAAkB,GAC1C,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE3B,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAElG,MAAM,SAAS,GAAG,SAAS,CAAC;IAC5B,MAAM,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,IAAI,QAAQ,CAAC;IAChC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,mBAAmB,IAAI,MAAM,OAAO,CAAC;IACzE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IACjG,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,CAAC,QAAQ,CAAC;KACtB,CAAC;IACF,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,CAAE,mBAAmB,EAAE,sBAAsB,CAAE,GAAG,QAAQ,CAAmC,IAAI,CAAC,CAAC;IAEzG,6DAA6D;IAC7D,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC;IAEvB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAElB,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,2BAA2B,EAAE;QAC/E,IAAI,EAAE,WAAW;QACjB,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,6BAA6B,EAAE;QACrF,IAAI,EAAE,WAAW;QACjB,aAAa,EAAE,cAAc;KAC9B,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,wBAAwB,CAAC,6BAA6B,EAAE;QACvG,IAAI,EAAE,WAAW;QACjB,aAAa,EAAE,cAAc;QAC7B,kBAAkB,EAAE,KAAK;KAC1B,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,MAAM,wBAAwB,CAAC,qBAAqB,EAAE;YACpD,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QACH,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;QACpC,MAAM,wBAAwB,CAAC,wBAAwB,EAAE;YACvD,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,KAAK,UAAU,wBAAwB,CAAC,OAAe,EAAE,QAA+B;QACtF,OAAO,MAAM,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,UAAU,kBAAkB,CACrE,OAAe,EACf,QAA+B;QAE/B,IAAI,CAAC,kBAAkB,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YACtE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;SAC3C;QACD,IAAI,QAAQ,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,CAAC,mBAAmB,EAAE;YACtE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACtC;QACD,MAAM,aAAa,CAAC;YAClB,aAAa,EAAE,GAAG,OAAO,QAAQ,QAAQ,EAAE;YAC3C,eAAe,EAAE,uBAAuB;YACtC,yEAAyE;YACzE,QAAe,EACf,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,EACxB,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC,IAAI,mBAAmB,CAAC;gBACnE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE;gBAC5D,CAAC,CAAC,EAAE,CACP;YACD,+CAA+C;YAC/C,yCAAyC;YACzC,0BAA0B,EAAE,IAAI;SACjC,CAAC,CAAC;IACL,CAAC,EAAE;QACD,aAAa;QACb,kBAAkB;QAClB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;KACpC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAC,aAAa,IACnB,IAAI,EAAC,cAAc,EACnB,KAAK,EAAC,qBAAqB,EAC3B,WAAW,EAAE,YAAY,GAAG,EAAE,MAAM,IAAI,GAAG,oDAAoD,GAC/F,CAAC;KAEJ;SAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE;QACnC,IAAI,OAAoB,CAAC;QAEzB,IAAI,mBAAmB,KAAK,IAAI,IAAI,kBAAkB,EAAE;YACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC1C,OAAO,GAAG,CACR,IAAC,QAAQ,IACP,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,MAAM;oBACf,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE;wBACV,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBAClC,CAAC;oBACH,CAAC,CAAC,SAAS,GACb,CACH,CAAC;SAEH;aAAM;YACL,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC1E,OAAO,GAAG,CACR,IAAC,UAAU,IACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,CAAC,IAAI,GACvB,CACH,CAAC;SACH;QAED,2DAA2D;QAC3D,MAAM,UAAU,GACd,IAAC,SAAS,IAAC,MAAM,QAAC,KAAK,EAAC,SAAS,EAAC,GAAG,EAAE,GAAG,CAAA,YAAY;YACpD,IAAC,YAAY,IAAC,IAAI;gBAChB,IAAC,UAAU,IACT,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,WAAW;wBACnC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,WAAW;wBACtC,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU;4BAC7B,CAAC,CAAC,mBAAmB;4BACrB,CAAC,CAAC,QAAQ,CAAC,MAAM,EACrB,MAAM,EAAE,QAAQ,EAAE,IAAI,KAAK,WAAW;wBACpC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,UAAU;4BAC7B,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO;gCAC3B,CAAC,CAAC,SAAS;gCACX,CAAC,CAAC,SAAS,EACjB,QAAQ,EAAE,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC;wBACnF,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO;4BAC3B,CAAC,CAAC,MAAM;4BACR,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS;gCAC7B,CAAC,CAAC,YAAY;gCACd,CAAC,CAAC,cAAc,EACtB,QAAQ,SACR;gBACD,kBAAkB,IAAI,CAAC,mBAAmB;oBACzC,CAAC,CAAC;wBACG,QAAQ,EAAE,IAAI,KAAK,UAAU;4BAC5B,CAAC,CAAC,IAAC,MAAM,IACH,MAAM,EAAC,SAAS,EAChB,KAAK,EAAC,2CAA2C,EACjD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,+BAEvB;4BACX,CAAC,CAAC,IAAI;wBACP,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,aAAa,KAAK,YAAY;4BACxE,CAAC,CAAC,IAAC,MAAM,IACH,MAAM,EAAC,SAAS,EAChB,KAAK,EAAC,uDAAuD,EAC7D,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,+BAEvB;4BACX,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO;gCACxC,CAAC,CAAC,IAAC,WAAW;oCACV,IAAC,MAAM,IACH,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,aAEhB;oCACT,IAAC,MAAM,IACH,MAAM,EAAC,SAAS,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,gBAAgB,iBAEpB,CACG;gCAChB,CAAC,CAAC,IAAI,CACT;oBACL,CAAC,CAAC,IAAI,CACK,CACL,CAAC;QAEf,MAAM,gBAAgB,GAAG;QACvB,uDAAuD;QACvD,QAAQ,CAAC,MAAM,KAAK,YAAY;YAChC,kFAAkF;eAC/E,CAAC,kBAAkB,IAAI,CAAC,QAAQ,IAAI,CAAC,mBAAmB,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC;YAC3F,mDAAmD;YACnD,+CAA+C;eAC5C,CAAC,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,aAAa,KAAK,cAAc,CAAC,CAAC;YACjF,CAAC,CAAC,IAAC,SAAS,IAAC,MAAM,QAAC,KAAK,EAAC,iBAAiB,EAAC,GAAG,EAAE,GAAG,CAAA,YAAY;gBAC5D,IAAC,YAAY,IACX,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,aAAa,KAAK,cAAc;wBACnF,CAAC,CAAC,QAAQ,CAAC,kBAAkB;4BAC3B,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;wBACxE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,EACjC,QAAQ,EAAE,CAAC,MAAM,IAAI,kBAAkB,IAAI,CACzC,CAAC,QAAQ,EAAE,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,aAAa,KAAK,cAAc,CAAC;wBAC7E,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;wBAC3C,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;4BACzB,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;4BACnD,CAAC,CAAC,mBAAmB,EAAE;wBAC3B,CAAC,CAAC,SAAS,GACb,CACQ;YACd,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtG,MAAM,mBAAmB,GAAG,CAC1B,CAAC,QAAQ,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC;eACzC,CAAC,kBAAkB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;YACpE,CAAC,CAAC,IAAC,SAAS,IAAC,MAAM,QAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,IAAI,IAAI,eAAe,IAAI,EAAE,GAAG,EAAE,GAAG,CAAA,YAAY,IACpF,kBAAkB;gBACjB,CAAC,CAAC,IAAC,WAAW,QACT,mBAAmB;oBAClB,CAAC,CAAC;wBACE,IAAC,MAAM,IACH,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;4BACvD,yDAAyD;4BACzD,QAAQ,EAAE,CAAC,uBAAuB,IAAI,MAAM,EAC5C,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,QAAQ,EAAE,IAAI,KAAK,eAAe,CAAC;gCACxD,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,kBAAkB,WAEjB;wBACT,IAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAsB,CACxE;oBACL,CAAC,CAAC;wBACE,IAAC,MAAM,IACH,QAAQ,EAAE,QAAQ,IAAI,MAAM,EAC5B,MAAM,EAAC,SAAS,EAChB,QAAQ,QACR,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,IACrD,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CACxB;wBACR,QAAQ,EAAE,IAAI,KAAK,eAAe;4BACjC,CAAC,CAAC;gCACE,IAAC,MAAM,IACH,QAAQ,EAAE,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE,IAAI,KAAK,eAAe,EAClE,MAAM,EAAC,SAAS,EAChB,OAAO,EAAE,mBAAmB,YAEvB,CACR;4BACL,CAAC,CAAC,IAAI,CACP,CACK;gBAChB,CAAC,CAAC,IAAC,MAAM,IAAC,QAAQ;oBACb,QAAQ,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;0CACpD,CACH;YACd,CAAC,CAAC,IAAI,CAAC;QAET,6CAA6C;QAC7C,wDAAwD;QACxD,+DAA+D;QAC/D,oEAAoE;QACpE,6DAA6D;QAC7D,4DAA4D;QAC5D,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,WAAW,GAAW,CAC1B,QAAQ,IAAI,CACV,CAAC,kBAAkB;eAChB,QAAQ,CAAC,EAAE,KAAK,kBAAkB;eAClC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC5B,CACF,CAAC,CAAC,CAAC,YAAY,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG;YACjE,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,eAAe,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;QAEjE,OAAO,CACL,IAAC,sBAAsB,IACrB,OAAO,EAAE;gBACP,IAAC,SAAS,IACN,MAAM,QACN,SAAS,EAAE,IAAC,WAAW,IACrB,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE;4BACP,IAAC,EAAE,QAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAM;4BAC9B,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,0DAA0D;4BACzF,IAAC,EAAE;gCACD;;oCAAe,WAAW,CAAM;gCAChC;;oCAAqB,aAAa,IAAI,KAAK,CAAM;gCACjD;;oCAAW,MAAM,CAAM,CACpB,CACJ,GACH,EACF,KAAK,EAAE;wBACL,oBAAS,SAAS,CAAC,IAAI,CAAC,KAAK,CAAU;wBACtC,aAAa;4BACZ,CAAC,CAAC,cAAM,KAAK,EAAC,aAAa;;gCAAM,YAAY,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,IAAI,aAAa,CAAQ;4BAC9F,CAAC,CAAC,IAAI,CACP,EACH,GAAG,EAAE,GAAG,CAAA,iFAAiF;oBAC1F,UAAU;oBACV,gBAAgB;oBAChB,mBAAmB,CACV,CACX,EACH,IAAI,EACF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,8BAA8B,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,qBAAqB;gBAC9F,IAAC,MAAM;oBAAC,mBAAQ,WAAW,CAAS,CAAS;gBAC5C,OAAO,CACH,GAET,CACH,CAAC;KAEH;SAAM,IAAI,YAAY,CAAC,UAAU,EAAE;QAClC,OAAO,aAAK,SAAS,EAAE,OAAO,CAAC,QAAQ,oBAAgB,CAAC;KAEzD;SAAM;QACL,MAAM,UAAU,GAAG,2BAA2B,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,UAAU,KAAK,IAAI,IAAI,QAAQ,EAAE,EAAE,KAAK,UAAU,EAAE;YACtD,OAAO,IAAC,aAAa,IACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,gCAA2B,EACjC,WAAW,EACT;;oBAEE,eAAM;oBACL,MAAM;wBACL,CAAC,CAAC,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,eAAe,EACvB,MAAM,EAAC,SAAS,EAChB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,qBAE7E;wBACX,CAAC,CAAC,IAAI,CACP,GAEL,CAAC;SACJ;aAAM;YACL,OAAO,IAAC,aAAa,IACnB,IAAI,EAAC,cAAc,EACnB,KAAK,EAAC,qBAAqB,EAC3B,WAAW,EAAC,oDAAoD,GAChE,CAAC;SACJ;KACF;AACH,CAAC,CAAC;AAGF,MAAM,SAAS,GAA8B,UAAU,EAAE,GAAG,EAAE;IAC5D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;IACxF,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,CAAC,0BAAG,GAAG,EAAE,MAAM,IAAI,GAAG,CAAI,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACvF,OAAO,IAAC,IAAI,IACV,OAAO,EAAE,GAAG,IAAI,QAAQ,EACxB,QAAQ,EAAE,QAAQ,GAClB,CAAC;AACL,CAAC,CAAA;AAGD,eAAe;IACb,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,SAAS;CACjB,CAAC;AAGF,MAAM,QAAQ,GAA0B;IACtC,MAAM,EAAE,qBAAqB;IAC7B,OAAO,EAAE,sBAAsB;IAC/B,aAAa,EAAE,SAAS;CACzB,CAAC;AAGF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;;;;;CAKtC,CAAC","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' && proposal.amendmentType === 'retirement'\n ? <Button\n intent=\"warning\"\n title=\"Remove amendment 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 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,10 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { Register } from '../../../types';
|
|
5
|
+
declare const RegisterMetaForm: React.FC<{
|
|
6
|
+
value: Register;
|
|
7
|
+
onChange?: (newMeta: Register) => void;
|
|
8
|
+
className?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export default RegisterMetaForm;
|