@riboseinc/paneron-registry-kit 2.2.2 → 2.2.4
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/package.json +2 -2
- package/views/change-request/ChangeRequestContext.js +2 -1
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/objectChangeset.d.ts +3 -1
- package/views/change-request/objectChangeset.js +4 -1
- package/views/change-request/objectChangeset.js.map +1 -1
- package/views/detail/RegisterHome/index.js +1 -1
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.js +7 -8
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/index.js +2 -1
- package/views/index.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riboseinc/paneron-registry-kit",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.4",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"author": "Ribose Inc. <open.source@ribose.com>",
|
|
6
6
|
"scripts": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@blueprintjs/select": "~4.9.10",
|
|
29
29
|
"@emotion/react": "^11.10.6",
|
|
30
30
|
"@emotion/styled": "^11.10.6",
|
|
31
|
-
"@riboseinc/paneron-extension-kit": "2.2.
|
|
31
|
+
"@riboseinc/paneron-extension-kit": "2.2.2",
|
|
32
32
|
"@types/react": "17.0.53",
|
|
33
33
|
"@types/react-dom": "^17.0.2",
|
|
34
34
|
"@types/react-helmet": "^6.1.2",
|
|
@@ -43,7 +43,8 @@ const ChangeRequestContextProvider = function ({
|
|
|
43
43
|
} = (0, _react2.useContext)(_BrowserCtx.BrowserCtx);
|
|
44
44
|
const crPath = changeRequestID ? `/proposals/${changeRequestID}/main.yaml` : null;
|
|
45
45
|
const changeRequest = (_b = (_a = useObjectData({
|
|
46
|
-
objectPaths: crPath ? [crPath] : []
|
|
46
|
+
objectPaths: crPath ? [crPath] : [],
|
|
47
|
+
nounLabel: 'proposal(s)'
|
|
47
48
|
}).value) === null || _a === void 0 ? void 0 : _a.data[crPath !== null && crPath !== void 0 ? crPath : '']) !== null && _b !== void 0 ? _b : crPath ? undefined : null;
|
|
48
49
|
return (0, _react.jsx)(ChangeRequestContext.Provider, {
|
|
49
50
|
value: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAqB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA2B;IAChF,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAEpC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE;;IAC1C,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAErD,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe;QAC5B,CAAC,CAAC,cAAc,eAAe,YAAY;QAC3C,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,aAAa,GAAG,MAAA,MAAA,aAAa,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"ChangeRequestContext.js","sourceRoot":"","sources":["../../../src/views/change-request/ChangeRequestContext.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAqB,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA2B;IAChF,aAAa,EAAE,IAAI;IACnB,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAEpC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE;;IAC1C,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAErD,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe;QAC5B,CAAC,CAAC,cAAc,eAAe,YAAY;QAC3C,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,aAAa,GAAG,MAAA,MAAA,aAAa,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACnC,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC,KAAK,0CAAE,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAO,mCAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAElE,OAAO,CACL,IAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE;YACpC,aAAa;YACb,OAAO,EACL,aAAa;mBACV,WAAW;mBACX,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC;gBAC1C,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,KAAK;SACZ,IACE,QAAQ,CACqB,CACjC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useContext } from 'react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { type SomeCR as CR, canBeEditedBy } from '../../types/cr';\nimport { BrowserCtx } from '../BrowserCtx';\n\n\nexport interface ChangeRequestContextSpec {\n /**\n * Change request object, undefined if not available/loading,\n * null if not expected (i.e. changeRequestID is not given).\n */\n changeRequest?: CR | null\n\n /**\n * Current user can edit the contents of this CR.\n * Always false if `changeRequest` is not defined or `null`.\n */\n canEdit: boolean\n}\n\nexport const ChangeRequestContext = React.createContext<ChangeRequestContextSpec>({\n changeRequest: null,\n canEdit: false,\n});\n\nexport const ChangeRequestContextProvider: React.FC<{\n changeRequestID: string | null\n}> = function ({ changeRequestID, children }) {\n const { useObjectData } = useContext(DatasetContext);\n\n const { stakeholder } = useContext(BrowserCtx);\n\n const crPath = changeRequestID\n ? `/proposals/${changeRequestID}/main.yaml`\n : null;\n\n const changeRequest = useObjectData({\n objectPaths: crPath ? [crPath] : [],\n nounLabel: 'proposal(s)',\n }).value?.data[crPath ?? ''] as CR ?? (crPath ? undefined : null);\n\n return (\n <ChangeRequestContext.Provider value={{\n changeRequest,\n canEdit:\n changeRequest\n && stakeholder\n && canBeEditedBy(stakeholder, changeRequest)\n ? true\n : false,\n }}>\n {children}\n </ChangeRequestContext.Provider>\n );\n};\n"]}
|
|
@@ -14,7 +14,9 @@ export declare function newCRObjectChangeset(id: string, justification: string,
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function importedProposalToCRObjectChangeset(importableCR: ImportableCR,
|
|
16
16
|
/** Available item classes per register configuration. */
|
|
17
|
-
itemClasses: ItemClassConfigurationSet,
|
|
17
|
+
itemClasses: ItemClassConfigurationSet,
|
|
18
|
+
/** VCS username of the person performing the import. */
|
|
19
|
+
importingStakeholderGitServerUsername: string, getObjectData: (opts: {
|
|
18
20
|
objectPaths: string[];
|
|
19
21
|
}) => Promise<{
|
|
20
22
|
data: ObjectDataset;
|
|
@@ -47,10 +47,13 @@ function newCRObjectChangeset(id, justification, registerVersion, stakeholderGit
|
|
|
47
47
|
|
|
48
48
|
async function importedProposalToCRObjectChangeset(importableCR,
|
|
49
49
|
/** Available item classes per register configuration. */
|
|
50
|
-
itemClasses,
|
|
50
|
+
itemClasses,
|
|
51
|
+
/** VCS username of the person performing the import. */
|
|
52
|
+
importingStakeholderGitServerUsername, getObjectData, findObjects) {
|
|
51
53
|
var _a;
|
|
52
54
|
|
|
53
55
|
const proposalDraft = importableCR.proposalDraft;
|
|
56
|
+
proposalDraft.submittingStakeholderGitServerUsername = importingStakeholderGitServerUsername;
|
|
54
57
|
const crID = proposalDraft.id;
|
|
55
58
|
const crPath = (0, _itemPathUtils.crIDToCRPath)(crID);
|
|
56
59
|
const itemPaths = Object.keys(proposalDraft.items);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectChangeset.js","sourceRoot":"","sources":["../../../src/views/change-request/objectChangeset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Change, Changeset } from '@riboseinc/paneron-extension-kit/types/changes';\nimport type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport type {\n InternalItemReference,\n RegisterItem,\n ProposalSet,\n ChangeProposal,\n Amendment,\n Supersession,\n ItemClassConfigurationSet,\n} from '../../types';\nimport { isRegisterItem } from '../../types';\nimport type { Version as RegisterVersion } from '../../types/register';\nimport {\n State,\n type Drafted,\n type ReturnedForClarificationByManager,\n type ReturnedForClarificationByControlBody,\n ImportableCR,\n} from '../../types/cr';\nimport {\n crIDToCRPath,\n itemPathInCR,\n itemPathNotInCR,\n itemPathToItemRef,\n itemRefToItemPath,\n} from '../itemPathUtils';\n\n\n/** Takes a justification and ID, returns an object changeset. */\nexport function newCRObjectChangeset(\n id: string,\n justification: string,\n registerVersion: RegisterVersion,\n stakeholderGitServerUsername: string,\n): ObjectChangeset {\n\n const timeStarted = new Date();\n const cr: Drafted = {\n id,\n timeStarted,\n timeEdited: timeStarted,\n justification,\n submittingStakeholderGitServerUsername: stakeholderGitServerUsername,\n items: {},\n state: State.DRAFT,\n registerVersion: registerVersion!.id,\n };\n const crObjectPath = crIDToCRPath(id);\n return {\n [crObjectPath]: {\n oldValue: null,\n newValue: cr,\n },\n }\n}\n\n\n/**\n * Returns an object changeset given an importable proposal,\n * item class definitions for register to import it to,\n * and a function to fetch register item data.\n *\n * Throws an error if importable proposal data isn’t compatible\n * with item class definitions or existing register data.\n */\nexport async function importedProposalToCRObjectChangeset(\n importableCR: ImportableCR,\n /** Available item classes per register configuration. */\n itemClasses: ItemClassConfigurationSet,\n getObjectData: (opts: { objectPaths: string[] }) => Promise<{ data: ObjectDataset }>,\n findObjects: (predicate: string) => Promise<any[]>,\n): Promise<ObjectChangeset> {\n const proposalDraft: Drafted = importableCR.proposalDraft;\n const crID = proposalDraft.id;\n const crPath = crIDToCRPath(crID);\n\n const itemPaths = Object.keys(proposalDraft.items);\n const proposals = Object.values(proposalDraft.items);\n\n for (const itemPath of itemPaths) {\n const itemRef = itemPathToItemRef(false, itemPath);\n if (!itemClasses[itemRef.classID]) {\n throw new Error(`Imported proposal contains item(s) of unknown class ${itemRef.classID}`);\n }\n }\n\n if (proposals.find(prop => prop.type !== 'addition')) {\n throw new Error(\"Only addition proposals can be imported at this time\");\n }\n\n const existingItems = (await getObjectData({ objectPaths: itemPaths })).data;\n if (Object.values(existingItems).find(v => v !== null)) {\n throw new Error(\"Register already contains item(s) in this proposal\");\n }\n\n const changeset: ObjectChangeset = {\n [crPath]: {\n oldValue: null,\n newValue: proposalDraft,\n },\n };\n\n for (const [itemPath, itemPayload] of Object.entries(importableCR.itemPayloads ?? {})) {\n if (itemPaths.indexOf(itemPath) < 0) {\n throw new Error(`No proposal found for item at ${itemPath}, but item data is given`);\n }\n if (!isRegisterItem(itemPayload)) {\n throw new Error(`Invalid register item data at ${itemPath}`);\n }\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: await resolvePredicates(itemPayload, async function resolveRef(predicate: string) {\n const objects = (await findObjects(predicate)).\n filter((o: any) => o.objectPath === itemPathNotInCR(o.objectPath));\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching ${predicate}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches ${predicate}: ${objectOverview}`);\n } else {\n return itemPathToItemRef(false, objects[0].objectPath);\n }\n }),\n };\n }\n\n return changeset;\n}\n\n\n/**\n * When importable CR wants to link to preexisting register items,\n * and it does not know their exact UUIDs but knows some other properties,\n * it can provide this structure in place of a reference.\n *\n * `resolvePredicates()` will resolve any such placeholders to item UUIDs\n * at import time.\n *\n * `mode` should specify whether the predicate should be replaced with\n * only a UUID string ('id', if classID is already known)\n * or full InternalItemReference ('generic').\n */\nexport interface Predicate {\n __isPredicate: true\n /**\n * Predicate expression to resolve.\n * Example: `data.identifier && parseInt(data.identifier, 10) === 123`.\n */\n predicate: string\n // TODO: Specify different subtypes for generic and ID?\n mode: 'generic' | 'id'\n}\n\ntype WithPredicatesResolved<T> = ReplaceType<T, Predicate, string | InternalItemReference>;\n\nfunction isPredicate(val: any): val is Predicate {\n return val && val.__isPredicate === true;\n}\n/**\n * Resolves any properties that should reference register item UUIDs,\n * but have predicates instead.\n */\nasync function resolvePredicates<T>(\n value: T,\n resolveRef: (predicate: string) => Promise<InternalItemReference>,\n): Promise<T extends Predicate ? string : WithPredicatesResolved<T>> {\n // NOTE: Return types are cast because https://github.com/microsoft/TypeScript/issues/33912.\n if (isPredicate(value)) {\n const ref = await resolveRef(value.predicate) as any;\n if (value.mode === 'generic') {\n return ref;\n } else {\n return ref.itemID;\n }\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return await Promise.all(value.map((v: any) => resolvePredicates(v, resolveRef))) as any;\n } else {\n // Assume plain non-array object.\n for (const [key, v] of Object.entries(value)) {\n value[key as keyof typeof value] = await resolvePredicates(v, resolveRef);\n }\n return value as any;\n }\n } else {\n return value as any;\n }\n}\n\n\n/**\n * Returns an object changeset to update CR with new given proposal items.\n * Only applicable to CR at draft edit stage.\n */\nexport function updateCRObjectChangeset(\n /**\n * Change request data.\n */\n cr: Drafted | ReturnedForClarificationByManager | ReturnedForClarificationByControlBody,\n\n /**\n * Proposals by item path.\n * Will be merged with those already existing in `cr`.\n * If a proposal is undefined, it will be removed.\n */\n proposalItems: Record<string, ChangeProposal | null>,\n\n /**\n * New item data must be provided for additions and clarifications,\n * keyed by item path.\n */\n itemData: Record<string, RegisterItem<any>> = {},\n): ObjectChangeset {\n const changeset: ObjectChangeset = {};\n const newItems = { ...cr.items };\n for (const [itemPath, proposal] of Object.entries(proposalItems)) {\n // Update proposals on CR\n if (proposal !== null) {\n newItems[itemPath] = proposal;\n } else if (newItems[itemPath]) {\n delete newItems[itemPath];\n }\n // Add/remove item data\n if (proposal?.type === 'addition' || proposal?.type === 'clarification') {\n const proposedItemData = itemData[itemPath];\n if (proposedItemData === null || !isRegisterItem(proposedItemData)) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: proposedItemData,\n };\n } else {\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: null,\n };\n }\n }\n // Update main CR data\n const crPath = crIDToCRPath(cr.id);\n changeset[crPath] = {\n oldValue: cr,\n newValue: { ...cr, items: newItems, timeEdited: new Date() },\n };\n return changeset;\n}\n\n\n/**\n * Given change proposals, returns applicable changes\n * to objects in the dataset.\n */\nexport async function proposalsToObjectChangeset(\n crID: string,\n hasSubregisters: boolean,\n proposals: ProposalSet,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<ObjectChangeset> {\n const cs: ObjectChangeset = {};\n\n for (const [itemPath, proposal] of Object.entries(proposals)) {\n //const originalItem: RegisterItem<any> | undefined = (itemData[itemPath] ?? undefined);\n const itemRef = itemPathToItemRef(hasSubregisters, itemPath);\n\n if (proposal.type !== 'addition') {\n if (itemData[itemPath] === undefined) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n }\n\n return cs;\n}\n\n// TODO: Refactor out the business logic of proposal approval.\n/**\n * Given a change proposal, returns applicable changes\n * to objects in the dataset.\n * Core logic of approving a proposal.\n * Takes a proposal and extra options (depending on proposal type).\n * Returns a Changeset containing register items at appropriate paths.\n */\nasync function proposalToObjectChangeset(\n crID: string,\n proposal: ChangeProposal,\n itemRef: InternalItemReference,\n itemPath: string,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<Changeset<Change<RegisterItem<any>>>> {\n let updatedItem: RegisterItem<any>;\n const changeset: Changeset<Change<RegisterItem<any>>> = {};\n\n const origItem = itemData[itemPath] ?? null;\n const newItem = newItemData[itemPathInCR(itemPath, crID)] ?? null;\n\n if (proposal.type !== 'addition') {\n if (origItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires original item data for non-additions\");\n }\n\n updatedItem = { ...origItem };\n\n switch (proposal.type) {\n case 'clarification':\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for clarifications\");\n }\n //const clarification = proposal as Clarification;\n updatedItem.data = newItem.data //clarification.payload;\n break;\n case 'amendment':\n const amendment = proposal as Amendment;\n updatedItem.amendedInCR = crID;\n\n switch (amendment.amendmentType) {\n case 'retirement':\n updatedItem.status = 'retired';\n break;\n case 'invalidation':\n updatedItem.status = 'invalid';\n break;\n case 'supersession':\n const supersession = proposal as Supersession;\n updatedItem.status = 'superseded';\n updatedItem.supersededBy = supersession.supersedingItemIDs.map(itemID => ({\n itemID,\n classID: itemRef.classID,\n subregisterID: itemRef.subregisterID,\n }));\n for (const supersedingItemPath of updatedItem.supersededBy.map(ip => itemRefToItemPath(ip))) {\n const supersedingItemData = itemData[supersedingItemPath];\n if (supersedingItemData) {\n changeset[supersedingItemPath] = {\n oldValue: supersedingItemData,\n newValue: {\n ...supersedingItemData,\n supersedes: [ ...(supersedingItemData.supersedes ?? []), itemRef ],\n },\n };\n }\n }\n break;\n }\n break;\n }\n } else {\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for additions\");\n }\n updatedItem = {\n id: itemRef.itemID,\n data: newItem.data,\n status: 'valid',\n dateAccepted: new Date(),\n };\n }\n\n changeset[itemPath] = {\n oldValue: origItem,\n newValue: updatedItem,\n };\n\n return changeset;\n}\n\n\n// Helper\n\ntype ReplaceType<Type, FromType, ToType> = Type extends FromType\n ? ToType\n : Type extends object\n ? ReplaceTypes<Type, FromType, ToType>\n : Type;\n\ntype ReplaceTypes<ObjType extends object, FromType, ToType> = {\n [KeyType in keyof ObjType]:\n ReplaceType<ObjType[KeyType], FromType, ToType>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"objectChangeset.js","sourceRoot":"","sources":["../../../src/views/change-request/objectChangeset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Change, Changeset } from '@riboseinc/paneron-extension-kit/types/changes';\nimport type { ObjectDataset, ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport type {\n InternalItemReference,\n RegisterItem,\n ProposalSet,\n ChangeProposal,\n Amendment,\n Supersession,\n ItemClassConfigurationSet,\n} from '../../types';\nimport { isRegisterItem } from '../../types';\nimport type { Version as RegisterVersion } from '../../types/register';\nimport {\n State,\n type Drafted,\n type ReturnedForClarificationByManager,\n type ReturnedForClarificationByControlBody,\n ImportableCR,\n} from '../../types/cr';\nimport {\n crIDToCRPath,\n itemPathInCR,\n itemPathNotInCR,\n itemPathToItemRef,\n itemRefToItemPath,\n} from '../itemPathUtils';\n\n\n/** Takes a justification and ID, returns an object changeset. */\nexport function newCRObjectChangeset(\n id: string,\n justification: string,\n registerVersion: RegisterVersion,\n stakeholderGitServerUsername: string,\n): ObjectChangeset {\n\n const timeStarted = new Date();\n const cr: Drafted = {\n id,\n timeStarted,\n timeEdited: timeStarted,\n justification,\n submittingStakeholderGitServerUsername: stakeholderGitServerUsername,\n items: {},\n state: State.DRAFT,\n registerVersion: registerVersion!.id,\n };\n const crObjectPath = crIDToCRPath(id);\n return {\n [crObjectPath]: {\n oldValue: null,\n newValue: cr,\n },\n }\n}\n\n\n/**\n * Returns an object changeset given an importable proposal,\n * item class definitions for register to import it to,\n * and a function to fetch register item data.\n *\n * Throws an error if importable proposal data isn’t compatible\n * with item class definitions or existing register data.\n */\nexport async function importedProposalToCRObjectChangeset(\n importableCR: ImportableCR,\n /** Available item classes per register configuration. */\n itemClasses: ItemClassConfigurationSet,\n /** VCS username of the person performing the import. */\n importingStakeholderGitServerUsername: string,\n getObjectData: (opts: { objectPaths: string[] }) => Promise<{ data: ObjectDataset }>,\n findObjects: (predicate: string) => Promise<any[]>,\n): Promise<ObjectChangeset> {\n const proposalDraft: Drafted = importableCR.proposalDraft;\n proposalDraft.submittingStakeholderGitServerUsername = importingStakeholderGitServerUsername;\n const crID = proposalDraft.id;\n const crPath = crIDToCRPath(crID);\n\n const itemPaths = Object.keys(proposalDraft.items);\n const proposals = Object.values(proposalDraft.items);\n\n for (const itemPath of itemPaths) {\n const itemRef = itemPathToItemRef(false, itemPath);\n if (!itemClasses[itemRef.classID]) {\n throw new Error(`Imported proposal contains item(s) of unknown class ${itemRef.classID}`);\n }\n }\n\n if (proposals.find(prop => prop.type !== 'addition')) {\n throw new Error(\"Only addition proposals can be imported at this time\");\n }\n\n const existingItems = (await getObjectData({ objectPaths: itemPaths })).data;\n if (Object.values(existingItems).find(v => v !== null)) {\n throw new Error(\"Register already contains item(s) in this proposal\");\n }\n\n const changeset: ObjectChangeset = {\n [crPath]: {\n oldValue: null,\n newValue: proposalDraft,\n },\n };\n\n for (const [itemPath, itemPayload] of Object.entries(importableCR.itemPayloads ?? {})) {\n if (itemPaths.indexOf(itemPath) < 0) {\n throw new Error(`No proposal found for item at ${itemPath}, but item data is given`);\n }\n if (!isRegisterItem(itemPayload)) {\n throw new Error(`Invalid register item data at ${itemPath}`);\n }\n changeset[itemPathInCR(itemPath, crID)] = {\n oldValue: null,\n newValue: await resolvePredicates(itemPayload, async function resolveRef(predicate: string) {\n const objects = (await findObjects(predicate)).\n filter((o: any) => o.objectPath === itemPathNotInCR(o.objectPath));\n if (objects.length < 1) {\n throw new Error(`Unable to resolve predicate to item UUID: no item found matching ${predicate}`);\n } else if (objects.length > 1) {\n const objectOverview = objects.map((o: any) => JSON.stringify(o)).join(', ')\n throw new Error(`Unable to resolve predicate to item UUID: more than one item matches ${predicate}: ${objectOverview}`);\n } else {\n return itemPathToItemRef(false, objects[0].objectPath);\n }\n }),\n };\n }\n\n return changeset;\n}\n\n\n/**\n * When importable CR wants to link to preexisting register items,\n * and it does not know their exact UUIDs but knows some other properties,\n * it can provide this structure in place of a reference.\n *\n * `resolvePredicates()` will resolve any such placeholders to item UUIDs\n * at import time.\n *\n * `mode` should specify whether the predicate should be replaced with\n * only a UUID string ('id', if classID is already known)\n * or full InternalItemReference ('generic').\n */\nexport interface Predicate {\n __isPredicate: true\n /**\n * Predicate expression to resolve.\n * Example: `data.identifier && parseInt(data.identifier, 10) === 123`.\n */\n predicate: string\n // TODO: Specify different subtypes for generic and ID?\n mode: 'generic' | 'id'\n}\n\ntype WithPredicatesResolved<T> = ReplaceType<T, Predicate, string | InternalItemReference>;\n\nfunction isPredicate(val: any): val is Predicate {\n return val && val.__isPredicate === true;\n}\n/**\n * Resolves any properties that should reference register item UUIDs,\n * but have predicates instead.\n */\nasync function resolvePredicates<T>(\n value: T,\n resolveRef: (predicate: string) => Promise<InternalItemReference>,\n): Promise<T extends Predicate ? string : WithPredicatesResolved<T>> {\n // NOTE: Return types are cast because https://github.com/microsoft/TypeScript/issues/33912.\n if (isPredicate(value)) {\n const ref = await resolveRef(value.predicate) as any;\n if (value.mode === 'generic') {\n return ref;\n } else {\n return ref.itemID;\n }\n } else if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return await Promise.all(value.map((v: any) => resolvePredicates(v, resolveRef))) as any;\n } else {\n // Assume plain non-array object.\n for (const [key, v] of Object.entries(value)) {\n value[key as keyof typeof value] = await resolvePredicates(v, resolveRef);\n }\n return value as any;\n }\n } else {\n return value as any;\n }\n}\n\n\n/**\n * Returns an object changeset to update CR with new given proposal items.\n * Only applicable to CR at draft edit stage.\n */\nexport function updateCRObjectChangeset(\n /**\n * Change request data.\n */\n cr: Drafted | ReturnedForClarificationByManager | ReturnedForClarificationByControlBody,\n\n /**\n * Proposals by item path.\n * Will be merged with those already existing in `cr`.\n * If a proposal is undefined, it will be removed.\n */\n proposalItems: Record<string, ChangeProposal | null>,\n\n /**\n * New item data must be provided for additions and clarifications,\n * keyed by item path.\n */\n itemData: Record<string, RegisterItem<any>> = {},\n): ObjectChangeset {\n const changeset: ObjectChangeset = {};\n const newItems = { ...cr.items };\n for (const [itemPath, proposal] of Object.entries(proposalItems)) {\n // Update proposals on CR\n if (proposal !== null) {\n newItems[itemPath] = proposal;\n } else if (newItems[itemPath]) {\n delete newItems[itemPath];\n }\n // Add/remove item data\n if (proposal?.type === 'addition' || proposal?.type === 'clarification') {\n const proposedItemData = itemData[itemPath];\n if (proposedItemData === null || !isRegisterItem(proposedItemData)) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: proposedItemData,\n };\n } else {\n changeset[itemPathInCR(itemPath, cr.id)] = {\n // When editing a draft, we don’t care\n // about overwriting proposed item data so we omit oldValue.\n newValue: null,\n };\n }\n }\n // Update main CR data\n const crPath = crIDToCRPath(cr.id);\n changeset[crPath] = {\n oldValue: cr,\n newValue: { ...cr, items: newItems, timeEdited: new Date() },\n };\n return changeset;\n}\n\n\n/**\n * Given change proposals, returns applicable changes\n * to objects in the dataset.\n */\nexport async function proposalsToObjectChangeset(\n crID: string,\n hasSubregisters: boolean,\n proposals: ProposalSet,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<ObjectChangeset> {\n const cs: ObjectChangeset = {};\n\n for (const [itemPath, proposal] of Object.entries(proposals)) {\n //const originalItem: RegisterItem<any> | undefined = (itemData[itemPath] ?? undefined);\n const itemRef = itemPathToItemRef(hasSubregisters, itemPath);\n\n if (proposal.type !== 'addition') {\n if (itemData[itemPath] === undefined) {\n console.error(\"Unable to convert proposals to object changeset: original item data is missing\", itemPath);\n throw new Error(\"Unable to convert proposals to object changeset: original item data is missing\");\n }\n if (proposal.type === 'amendment' && proposal.amendmentType === 'supersession') {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n } else {\n Object.assign(cs, await proposalToObjectChangeset(crID, proposal, itemRef, itemPath, itemData, newItemData));\n }\n }\n\n return cs;\n}\n\n// TODO: Refactor out the business logic of proposal approval.\n/**\n * Given a change proposal, returns applicable changes\n * to objects in the dataset.\n * Core logic of approving a proposal.\n * Takes a proposal and extra options (depending on proposal type).\n * Returns a Changeset containing register items at appropriate paths.\n */\nasync function proposalToObjectChangeset(\n crID: string,\n proposal: ChangeProposal,\n itemRef: InternalItemReference,\n itemPath: string,\n itemData: Record<string, RegisterItem<any> | null>,\n newItemData: Record<string, RegisterItem<any> | null>,\n): Promise<Changeset<Change<RegisterItem<any>>>> {\n let updatedItem: RegisterItem<any>;\n const changeset: Changeset<Change<RegisterItem<any>>> = {};\n\n const origItem = itemData[itemPath] ?? null;\n const newItem = newItemData[itemPathInCR(itemPath, crID)] ?? null;\n\n if (proposal.type !== 'addition') {\n if (origItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires original item data for non-additions\");\n }\n\n updatedItem = { ...origItem };\n\n switch (proposal.type) {\n case 'clarification':\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for clarifications\");\n }\n //const clarification = proposal as Clarification;\n updatedItem.data = newItem.data //clarification.payload;\n break;\n case 'amendment':\n const amendment = proposal as Amendment;\n updatedItem.amendedInCR = crID;\n\n switch (amendment.amendmentType) {\n case 'retirement':\n updatedItem.status = 'retired';\n break;\n case 'invalidation':\n updatedItem.status = 'invalid';\n break;\n case 'supersession':\n const supersession = proposal as Supersession;\n updatedItem.status = 'superseded';\n updatedItem.supersededBy = supersession.supersedingItemIDs.map(itemID => ({\n itemID,\n classID: itemRef.classID,\n subregisterID: itemRef.subregisterID,\n }));\n for (const supersedingItemPath of updatedItem.supersededBy.map(ip => itemRefToItemPath(ip))) {\n const supersedingItemData = itemData[supersedingItemPath];\n if (supersedingItemData) {\n changeset[supersedingItemPath] = {\n oldValue: supersedingItemData,\n newValue: {\n ...supersedingItemData,\n supersedes: [ ...(supersedingItemData.supersedes ?? []), itemRef ],\n },\n };\n }\n }\n break;\n }\n break;\n }\n } else {\n if (newItem === null) {\n throw new Error(\"proposalToObjectChangeset() requires new item data for additions\");\n }\n updatedItem = {\n id: itemRef.itemID,\n data: newItem.data,\n status: 'valid',\n dateAccepted: new Date(),\n };\n }\n\n changeset[itemPath] = {\n oldValue: origItem,\n newValue: updatedItem,\n };\n\n return changeset;\n}\n\n\n// Helper\n\ntype ReplaceType<Type, FromType, ToType> = Type extends FromType\n ? ToType\n : Type extends object\n ? ReplaceTypes<Type, FromType, ToType>\n : Type;\n\ntype ReplaceTypes<ObjType extends object, FromType, ToType> = {\n [KeyType in keyof ObjType]:\n ReplaceType<ObjType[KeyType], FromType, ToType>;\n}\n"]}
|
|
@@ -103,7 +103,7 @@ const RegisterHome = function () {
|
|
|
103
103
|
const crID = fileData.proposalDraft.id;
|
|
104
104
|
|
|
105
105
|
try {
|
|
106
|
-
const changeset = await (0, _objectChangeset.importedProposalToCRObjectChangeset)(fileData, itemClasses, getObjectData, async function findObjects(predicate) {
|
|
106
|
+
const changeset = await (0, _objectChangeset.importedProposalToCRObjectChangeset)(fileData, itemClasses, stakeholder.gitServerUsername, getObjectData, async function findObjects(predicate) {
|
|
107
107
|
const result = await getMapReducedData({
|
|
108
108
|
chains: {
|
|
109
109
|
_: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState } from 'react';\n//import { Helmet } from 'react-helmet';\nimport { jsx, css } from '@emotion/react';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { Menu, MenuDivider, MenuItem, InputGroup, Button, NonIdealState, Spinner, Callout } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { registerStakeholderPlain } from '../../RegisterStakeholder';\nimport { newCRObjectChangeset, importedProposalToCRObjectChangeset } from '../../change-request/objectChangeset';\nimport { isImportableCR } from '../../../types/cr';\nimport { Protocols } from '../../protocolRegistry';\nimport { crIDToCRPath } from '../../itemPathUtils';\n\n\nconst RegisterHome: React.VoidFunctionComponent<Record<never, never>> =\nfunction () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { customViews, registerMetadata, stakeholder, offline, itemClasses } = useContext(BrowserCtx);\n const {\n requestFileFromFilesystem,\n makeRandomID,\n getObjectData,\n updateObjects,\n performOperation,\n getMapReducedData,\n } = useContext(DatasetContext);\n\n const [ newProposalIdea, setNewProposalIdea ] = useState<string>('');\n\n const registerVersion = registerMetadata?.version;\n const canCreateCR = (\n stakeholder &&\n stakeholder.role &&\n stakeholder.gitServerUsername?.trim() !== '' &&\n makeRandomID &&\n updateObjects &&\n (registerVersion?.id ?? '').trim() !== '');\n\n async function createCR(justification: string): Promise<string> {\n if (canCreateCR) {\n const id = await makeRandomID();\n await updateObjects({\n commitMessage: \"start new proposal\",\n objectChangeset: newCRObjectChangeset(\n id,\n justification,\n registerVersion!,\n stakeholder.gitServerUsername!,\n ),\n });\n return id;\n } else {\n throw new Error(\"Unable to create proposal: read-only dataset\");\n }\n }\n\n async function handleNewProposal() {\n if (newProposalIdea) {\n const crID = await performOperation(\"creating proposal\", createCR)(newProposalIdea);\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n }\n\n async function getCRImportChangeset(): Promise<[ObjectChangeset, string]> {\n if (!requestFileFromFilesystem) {\n throw new Error(\"Cannot request file from filesystem\");\n }\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n const crID = fileData.proposalDraft.id;\n try {\n const changeset = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n getObjectData,\n async function findObjects(predicate: string) {\n const result = (await getMapReducedData({\n chains: {\n _: {\n mapFunc: `\n const data = value.data;\n if (data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n },\n }));\n // NOTE: map returns an empty object if there’re no items,\n // but we promise to return a list.\n if (!Array.isArray(result._)) {\n return [];\n }\n return result._;\n },\n );\n return [changeset, crID];\n } catch (e) {\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n\n async function handleImportProposal() {\n const [objectChangeset, crID] = await performOperation(\n 'reading proposal data',\n getCRImportChangeset,\n )();\n\n await performOperation(\n 'creating proposal',\n updateObjects ?? (async () => { throw new Error(\"Read-only dataset\"); }),\n )({\n commitMessage: \"import proposal\",\n objectChangeset,\n });\n\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n\n const menu = (\n <Menu css={css`margin: 10px;`}>\n <MenuDivider title=\"Quick links\" />\n {customViews.map((cv, _) => \n <MenuItem\n key={cv.id}\n text={cv.label}\n title={cv.description}\n icon={cv.icon}\n onClick={() => spawnTab(`${Protocols.CUSTOM_VIEW}:${cv.id}/index`)}\n />\n )}\n {customViews.length > 0 ? <MenuDivider /> : null}\n\n <MenuItem\n text={`Propose a change to version ${registerMetadata?.version?.id ?? '(missing)'}`}\n disabled={!canCreateCR}\n icon=\"lightbulb\"\n title={canCreateCR\n ? \"A blank proposal will be created and opened in a new tab.\"\n : undefined}>\n <InputGroup\n value={newProposalIdea || undefined}\n placeholder=\"Your idea…\"\n title=\"Justification draft (you can change this later)\"\n onChange={evt => setNewProposalIdea(evt.currentTarget.value)}\n rightElement={\n <Button\n small\n intent={newProposalIdea ? 'primary': undefined}\n disabled={!newProposalIdea}\n onClick={handleNewProposal}\n icon=\"tick\"\n />\n }\n />\n </MenuItem>\n <MenuItem\n text=\"Import proposal\"\n icon=\"import\"\n disabled={!canCreateCR}\n onClick={handleImportProposal}\n />\n <MenuItem\n text=\"View register metadata\"\n icon=\"properties\"\n onClick={() => spawnTab(Protocols.REGISTER_META)}\n />\n </Menu>\n );\n\n const intro = <Callout intent=\"primary\" css={css`text-align: left;`}>\n {stakeholder\n ? <>You can create proposals as {registerStakeholderPlain(stakeholder)}.</>\n : offline\n ? <>\n Because this repository is offline (no remote configured),\n and remote username is currently required for proposal,\n you cannot create proposals.</>\n : <>\n Since your remote username is not in the list of stakeholders,\n you cannot create proposals currently.\n </>}\n </Callout>\n\n const greeting = registerMetadata\n ? <NonIdealState\n title={`Welcome to ${registerMetadata.name}`}\n description={<>\n {intro}\n {menu}\n </>}\n />\n : registerMetadata === undefined\n ? <NonIdealState\n icon={<Spinner />}\n description=\"Loading register information…\"\n />\n : <NonIdealState\n icon=\"heart-broken\"\n title=\"Register metadata is missing or invalid.\"\n description={<>\n {menu}\n </>}\n />;\n\n return greeting;\n}\n\nexport default RegisterHome;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,wCAAwC;AACxC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACrH,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,mCAAmC,EAAE,MAAM,sCAAsC,CAAC;AACjH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,YAAY,GAClB;;IACE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpG,MAAM,EACJ,yBAAyB,EACzB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE/B,MAAM,CAAE,eAAe,EAAE,kBAAkB,CAAE,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAErE,MAAM,eAAe,GAAG,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,CAAC;IAClD,MAAM,WAAW,GAAG,CAClB,WAAW;QACX,WAAW,CAAC,IAAI;QAChB,CAAA,MAAA,WAAW,CAAC,iBAAiB,0CAAE,IAAI,EAAE,MAAK,EAAE;QAC5C,YAAY;QACZ,aAAa;QACb,CAAC,MAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,EAAE,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE7C,KAAK,UAAU,QAAQ,CAAC,aAAqB;QAC3C,IAAI,WAAW,EAAE;YACf,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;YAChC,MAAM,aAAa,CAAC;gBAClB,aAAa,EAAE,oBAAoB;gBACnC,eAAe,EAAE,oBAAoB,CACnC,EAAE,EACF,aAAa,EACb,eAAgB,EAChB,WAAW,CAAC,iBAAkB,CAC/B;aACF,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;SACX;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;SACjE;IACH,CAAC;IAED,KAAK,UAAU,iBAAiB;QAC9B,IAAI,eAAe,EAAE;YACnB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC;YACpF,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACvB,QAAQ,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC/D;IACH,CAAC;IAED,KAAK,UAAU,oBAAoB;QACjC,IAAI,CAAC,yBAAyB,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;SACxD;QACD,MAAM,IAAI,GAAG,MAAM,yBAAyB,CAAC;YAC3C,MAAM,EAAE,wCAAwC;YAChD,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;aAC9C;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;QACD,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE;YAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,IAAI;gBACF,MAAM,SAAS,GAAG,MAAM,mCAAmC,CACzD,QAAQ,EACR,WAAW,EACX,WAAY,CAAC,iBAAkB,EAC/B,aAAa,EACb,KAAK,UAAU,WAAW,CAAC,SAAiB;oBAC1C,MAAM,MAAM,GAAG,CAAC,MAAM,iBAAiB,CAAC;wBACtC,MAAM,EAAE;4BACN,CAAC,EAAE;gCACD,OAAO,EAAE;;mCAEQ,SAAS;;;mBAGzB;6BACF;yBACF;qBACF,CAAC,CAAC,CAAC;oBACJ,0DAA0D;oBAC1D,mCAAmC;oBACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;wBAC5B,OAAO,EAAE,CAAC;qBACX;oBACD,OAAO,MAAM,CAAC,CAAC,CAAC;gBAClB,CAAC,CACF,CAAC;gBACF,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;aAC1B;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;aAChD;SACF;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;IACH,CAAC;IAED,KAAK,UAAU,oBAAoB;QACjC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,MAAM,gBAAgB,CACpD,uBAAuB,EACvB,oBAAoB,CACrB,EAAE,CAAC;QAEJ,MAAM,gBAAgB,CACpB,mBAAmB,EACnB,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CACzE,CAAC;YACA,aAAa,EAAE,iBAAiB;YAChC,eAAe;SAChB,CAAC,CAAC;QAEH,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACvB,QAAQ,CAAC,GAAG,SAAS,CAAC,cAAc,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,CACX,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,eAAe;QAC3B,IAAC,WAAW,IAAC,KAAK,EAAC,aAAa,GAAG;QAClC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CACzB,IAAC,QAAQ,IACP,GAAG,EAAE,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,EAAE,CAAC,KAAK,EACd,KAAK,EAAE,EAAE,CAAC,WAAW,EACrB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,GAClE,CACH;QACA,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAC,WAAW,OAAG,CAAC,CAAC,CAAC,IAAI;QAEhD,IAAC,QAAQ,IACP,IAAI,EAAE,+BAA+B,MAAA,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,OAAO,0CAAE,EAAE,mCAAI,WAAW,EAAE,EACnF,QAAQ,EAAE,CAAC,WAAW,EACtB,IAAI,EAAC,WAAW,EAChB,KAAK,EAAE,WAAW;gBACd,CAAC,CAAC,2DAA2D;gBAC7D,CAAC,CAAC,SAAS;YACf,IAAC,UAAU,IACT,KAAK,EAAE,eAAe,IAAI,SAAS,EACnC,WAAW,EAAC,iBAAY,EACxB,KAAK,EAAC,iDAAiD,EACvD,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAC5D,YAAY,EACV,IAAC,MAAM,IACL,KAAK,QACL,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA,CAAC,CAAC,SAAS,EAC9C,QAAQ,EAAE,CAAC,eAAe,EAC1B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAC,MAAM,GACX,GAEJ,CACO;QACX,IAAC,QAAQ,IACP,IAAI,EAAC,iBAAiB,EACtB,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC7B;QACF,IAAC,QAAQ,IACP,IAAI,EAAC,wBAAwB,EAC7B,IAAI,EAAC,YAAY,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,GAChD,CACG,CACR,CAAC;IAEF,MAAM,KAAK,GAAG,IAAC,OAAO,IAAC,MAAM,EAAC,SAAS,EAAC,GAAG,EAAE,GAAG,CAAA,mBAAmB,IAChE,WAAW;QACV,CAAC,CAAC;;YAA+B,wBAAwB,CAAC,WAAW,CAAC;gBAAK;QAC3E,CAAC,CAAC,OAAO;YACP,CAAC,CAAC,4KAGiC;YACnC,CAAC,CAAC,kIAGG,CACD,CAAA;IAEV,MAAM,QAAQ,GAAG,gBAAgB;QAC/B,CAAC,CAAC,IAAC,aAAa,IACZ,KAAK,EAAE,cAAc,gBAAgB,CAAC,IAAI,EAAE,EAC5C,WAAW,EAAE;gBACV,KAAK;gBACL,IAAI,CACJ,GACH;QACJ,CAAC,CAAC,gBAAgB,KAAK,SAAS;YAC9B,CAAC,CAAC,IAAC,aAAa,IACZ,IAAI,EAAE,IAAC,OAAO,OAAG,EACjB,WAAW,EAAC,oCAA+B,GAC3C;YACJ,CAAC,CAAC,IAAC,aAAa,IACZ,IAAI,EAAC,cAAc,EACnB,KAAK,EAAC,0CAA0C,EAChD,WAAW,EAAE,0BACV,IAAI,CACJ,GACH,CAAC;IAET,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAA;AAED,eAAe,YAAY,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState } from 'react';\n//import { Helmet } from 'react-helmet';\nimport { jsx, css } from '@emotion/react';\nimport type { ObjectChangeset } from '@riboseinc/paneron-extension-kit/types/objects';\nimport { Menu, MenuDivider, MenuItem, InputGroup, Button, NonIdealState, Spinner, Callout } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport { registerStakeholderPlain } from '../../RegisterStakeholder';\nimport { newCRObjectChangeset, importedProposalToCRObjectChangeset } from '../../change-request/objectChangeset';\nimport { isImportableCR } from '../../../types/cr';\nimport { Protocols } from '../../protocolRegistry';\nimport { crIDToCRPath } from '../../itemPathUtils';\n\n\nconst RegisterHome: React.VoidFunctionComponent<Record<never, never>> =\nfunction () {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { customViews, registerMetadata, stakeholder, offline, itemClasses } = useContext(BrowserCtx);\n const {\n requestFileFromFilesystem,\n makeRandomID,\n getObjectData,\n updateObjects,\n performOperation,\n getMapReducedData,\n } = useContext(DatasetContext);\n\n const [ newProposalIdea, setNewProposalIdea ] = useState<string>('');\n\n const registerVersion = registerMetadata?.version;\n const canCreateCR = (\n stakeholder &&\n stakeholder.role &&\n stakeholder.gitServerUsername?.trim() !== '' &&\n makeRandomID &&\n updateObjects &&\n (registerVersion?.id ?? '').trim() !== '');\n\n async function createCR(justification: string): Promise<string> {\n if (canCreateCR) {\n const id = await makeRandomID();\n await updateObjects({\n commitMessage: \"start new proposal\",\n objectChangeset: newCRObjectChangeset(\n id,\n justification,\n registerVersion!,\n stakeholder.gitServerUsername!,\n ),\n });\n return id;\n } else {\n throw new Error(\"Unable to create proposal: read-only dataset\");\n }\n }\n\n async function handleNewProposal() {\n if (newProposalIdea) {\n const crID = await performOperation(\"creating proposal\", createCR)(newProposalIdea);\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n }\n\n async function getCRImportChangeset(): Promise<[ObjectChangeset, string]> {\n if (!requestFileFromFilesystem) {\n throw new Error(\"Cannot request file from filesystem\");\n }\n const data = await requestFileFromFilesystem({\n prompt: \"Select one register proposal JSON file\",\n filters: [\n { name: \"JSON files\", extensions: ['.json'] },\n ],\n });\n const fileData = Object.values(data)[0]!;\n if (!fileData) {\n throw new Error(\"No file was selected\");\n }\n if (isImportableCR(fileData)) {\n const crID = fileData.proposalDraft.id;\n try {\n const changeset = await importedProposalToCRObjectChangeset(\n fileData,\n itemClasses,\n stakeholder!.gitServerUsername!,\n getObjectData,\n async function findObjects(predicate: string) {\n const result = (await getMapReducedData({\n chains: {\n _: {\n mapFunc: `\n const data = value.data;\n if (data && (${predicate})) {\n emit({ objectPath: key, objectData: value });\n }\n `,\n },\n },\n }));\n // NOTE: map returns an empty object if there’re no items,\n // but we promise to return a list.\n if (!Array.isArray(result._)) {\n return [];\n }\n return result._;\n },\n );\n return [changeset, crID];\n } catch (e) {\n throw new Error(\"Error reading proposal data\");\n }\n } else {\n throw new Error(\"Invalid proposal format\");\n }\n }\n\n async function handleImportProposal() {\n const [objectChangeset, crID] = await performOperation(\n 'reading proposal data',\n getCRImportChangeset,\n )();\n\n await performOperation(\n 'creating proposal',\n updateObjects ?? (async () => { throw new Error(\"Read-only dataset\"); }),\n )({\n commitMessage: \"import proposal\",\n objectChangeset,\n });\n\n setNewProposalIdea('');\n spawnTab(`${Protocols.CHANGE_REQUEST}:${crIDToCRPath(crID)}`);\n }\n\n const menu = (\n <Menu css={css`margin: 10px;`}>\n <MenuDivider title=\"Quick links\" />\n {customViews.map((cv, _) => \n <MenuItem\n key={cv.id}\n text={cv.label}\n title={cv.description}\n icon={cv.icon}\n onClick={() => spawnTab(`${Protocols.CUSTOM_VIEW}:${cv.id}/index`)}\n />\n )}\n {customViews.length > 0 ? <MenuDivider /> : null}\n\n <MenuItem\n text={`Propose a change to version ${registerMetadata?.version?.id ?? '(missing)'}`}\n disabled={!canCreateCR}\n icon=\"lightbulb\"\n title={canCreateCR\n ? \"A blank proposal will be created and opened in a new tab.\"\n : undefined}>\n <InputGroup\n value={newProposalIdea || undefined}\n placeholder=\"Your idea…\"\n title=\"Justification draft (you can change this later)\"\n onChange={evt => setNewProposalIdea(evt.currentTarget.value)}\n rightElement={\n <Button\n small\n intent={newProposalIdea ? 'primary': undefined}\n disabled={!newProposalIdea}\n onClick={handleNewProposal}\n icon=\"tick\"\n />\n }\n />\n </MenuItem>\n <MenuItem\n text=\"Import proposal\"\n icon=\"import\"\n disabled={!canCreateCR}\n onClick={handleImportProposal}\n />\n <MenuItem\n text=\"View register metadata\"\n icon=\"properties\"\n onClick={() => spawnTab(Protocols.REGISTER_META)}\n />\n </Menu>\n );\n\n const intro = <Callout intent=\"primary\" css={css`text-align: left;`}>\n {stakeholder\n ? <>You can create proposals as {registerStakeholderPlain(stakeholder)}.</>\n : offline\n ? <>\n Because this repository is offline (no remote configured),\n and remote username is currently required for proposal,\n you cannot create proposals.</>\n : <>\n Since your remote username is not in the list of stakeholders,\n you cannot create proposals currently.\n </>}\n </Callout>\n\n const greeting = registerMetadata\n ? <NonIdealState\n title={`Welcome to ${registerMetadata.name}`}\n description={<>\n {intro}\n {menu}\n </>}\n />\n : registerMetadata === undefined\n ? <NonIdealState\n icon={<Spinner />}\n description=\"Loading register information…\"\n />\n : <NonIdealState\n icon=\"heart-broken\"\n title=\"Register metadata is missing or invalid.\"\n description={<>\n {menu}\n </>}\n />;\n\n return greeting;\n}\n\nexport default RegisterHome;\n"]}
|
|
@@ -74,12 +74,11 @@ const ItemDetail = function ({
|
|
|
74
74
|
updateObjects,
|
|
75
75
|
makeRandomID,
|
|
76
76
|
performOperation,
|
|
77
|
-
|
|
77
|
+
isBusy
|
|
78
78
|
} = (0, _react.useContext)(_context.DatasetContext);
|
|
79
79
|
const {
|
|
80
80
|
spawnTab
|
|
81
81
|
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
|
|
82
|
-
const isBusy = operationKey !== undefined;
|
|
83
82
|
const {
|
|
84
83
|
jumpTo,
|
|
85
84
|
subregisters,
|
|
@@ -110,33 +109,33 @@ const ItemDetail = function ({
|
|
|
110
109
|
const diffMode = false;
|
|
111
110
|
const proposal = (_c = activeCR && activeCR.items[itemPath] ? activeCR.items[itemPath] : null) !== null && _c !== void 0 ? _c : null;
|
|
112
111
|
|
|
113
|
-
const handleClearProposal = () => performProposalOperation(
|
|
112
|
+
const handleClearProposal = () => performProposalOperation('clearing draft proposal', null);
|
|
114
113
|
|
|
115
|
-
const handleRetire = () => performProposalOperation(
|
|
114
|
+
const handleRetire = () => performProposalOperation('proposing retirement of an item', {
|
|
116
115
|
type: 'amendment',
|
|
117
116
|
amendmentType: 'retirement'
|
|
118
117
|
});
|
|
119
118
|
|
|
120
|
-
const handleInvalidate = () => performProposalOperation(
|
|
119
|
+
const handleInvalidate = () => performProposalOperation('proposing invalidation', {
|
|
121
120
|
type: 'amendment',
|
|
122
121
|
amendmentType: 'invalidation'
|
|
123
122
|
});
|
|
124
123
|
|
|
125
|
-
const handleSupersedeWith = items => performProposalOperation(
|
|
124
|
+
const handleSupersedeWith = items => performProposalOperation('proposing supersession', {
|
|
126
125
|
type: 'amendment',
|
|
127
126
|
amendmentType: 'supersession',
|
|
128
127
|
supersedingItemIDs: items
|
|
129
128
|
});
|
|
130
129
|
|
|
131
130
|
const handleClarify = async () => {
|
|
132
|
-
await performProposalOperation(
|
|
131
|
+
await performProposalOperation('proposing clarification', {
|
|
133
132
|
type: 'clarification'
|
|
134
133
|
});
|
|
135
134
|
setEditedClarification(null);
|
|
136
135
|
};
|
|
137
136
|
|
|
138
137
|
const handleEditAddition = async () => {
|
|
139
|
-
await performProposalOperation(
|
|
138
|
+
await performProposalOperation('editing proposed addition', {
|
|
140
139
|
type: 'addition'
|
|
141
140
|
});
|
|
142
141
|
setEditedClarification(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterItem/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n Button, ButtonGroup,\n Card,\n Classes,\n FormGroup as BaseFormGroup,\n ControlGroup,\n InputGroup,\n NonIdealState,\n UL,\n H5,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\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 { itemRefToItemPath, 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, makeRandomID, performOperation, operationKey } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\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 itemPath,\n JSON.stringify(activeCR),\n JSON.stringify(itemData),\n JSON.stringify(editedClarification),\n ]);\n\n // TODO: Very similar to `handleAdd()` in Browse sidebar menu; refactor?\n const handleProposeLikeThis = useCallback(async function _handleProposeLikeThis(): Promise<void> {\n if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR || !itemClass || !isRegisterItem(itemData)) {\n throw new Error(\"Unable to create item: likely current proposal is not editable or dataset is read-only\");\n }\n const { classID, subregisterID } = itemRef;\n const itemID = await makeRandomID();\n const newRef = { classID, subregisterID, itemID };\n const newItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: { ...itemData.data },\n };\n if (isRegisterItem(newItem)) {\n const newPath = itemRefToItemPath(newRef);\n await updateObjects({\n commitMessage: `clone ${itemRef.itemID} to propose a new item`,\n objectChangeset: updateCRObjectChangeset(\n activeCR as any,\n { [newPath]: { type: 'addition' } },\n { [newPath]: newItem },\n ),\n _dangerouslySkipValidation: true,\n });\n if (activeCR.id === globallyActiveCRID) {\n spawnTab(`${Protocols.ITEM_DETAILS}:${itemRefToItemPath(newRef, activeCR.id)}`);\n }\n } else {\n throw new Error(\"Newly created item did not pass validation (this is likely a bug in RegistryKit\");\n }\n }, [\n updateObjects,\n activeCRIsEditable,\n itemPath,\n JSON.stringify(activeCR),\n JSON.stringify(itemData),\n ]);\n\n if (!itemClass) {\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description={`View for ${ref?.itemID ?? uri} cannot be retrieved from item class configuration`}\n />;\n\n } else if (isRegisterItem(itemData)) {\n let details: JSX.Element;\n\n if (editedClarification !== null && activeCRIsEditable) {\n const EditView = itemClass.views.editView;\n details = (\n <EditView\n itemData={editedClarification}\n itemRef={itemRef}\n onChange={!isBusy\n ? (newData) => {\n setEditedClarification(newData);\n }\n : undefined}\n />\n );\n\n } else {\n const DetailView = itemClass.views.detailView ?? itemClass.views.editView;\n details = (\n <DetailView\n itemRef={itemRef}\n itemData={itemData.data}\n />\n );\n }\n\n //const canAmend = activeCR && itemData.status === 'valid';\n const itemStatus =\n <FormGroup inline label=\"status:\" css={css`margin: 0;`}>\n <ControlGroup fill>\n <InputGroup\n value={proposal?.type === 'amendment'\n ? `${proposal.amendmentType} proposed`\n : proposal?.type === 'addition'\n ? \"addition proposed\"\n : itemData.status}\n intent={proposal?.type === 'amendment'\n ? 'warning'\n : proposal?.type === 'addition'\n ? 'primary'\n : itemData.status === 'valid'\n ? 'success'\n : undefined}\n leftIcon={proposal && (proposal.type === 'amendment' || proposal.type === 'addition')\n ? 'asterisk'\n : itemData.status === 'valid'\n ? 'tick'\n : itemData.status === 'invalid'\n ? 'ban-circle'\n : 'warning-sign'}\n readOnly\n />\n {activeCRIsEditable && !editedClarification\n ? <>\n {proposal?.type === 'addition'\n ? <Button\n intent=\"warning\"\n title=\"Remove the proposal to add this new item.\"\n disabled={isBusy}\n onClick={handleClearProposal}>\n Remove proposed addition\n </Button>\n : null}\n {proposal?.type === 'amendment'\n ? <Button\n intent=\"warning\"\n title={`Remove amendment (${proposal.amendmentType}) for this item from current proposal.`}\n disabled={isBusy}\n onClick={handleClearProposal}>\n Clear proposed amendment\n </Button>\n : !proposal && itemData.status === 'valid'\n ? <ButtonGroup>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleRetire}>\n Retire\n </Button>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleInvalidate}>\n Invalidate\n </Button>\n </ButtonGroup>\n : null}\n </>\n : null}\n </ControlGroup>\n </FormGroup>;\n\n const supersedingItems = (\n // It’s superseded (whether in current proposal or not)\n itemData.status === 'superseded'\n // Item is valid, proposal is editable, and no change to this item is proposed yet\n || (activeCRIsEditable && !proposal && !editedClarification && itemData.status === 'valid')\n // This item is being superseded in active proposal\n // XXX: Redundant condition with the first one?\n || (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'))\n ? <FormGroup inline label=\"superseded by: \" css={css`margin: 0;`}>\n <RelatedItems\n availableClassIDs={[itemClass.meta.id]}\n itemRefs={proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'\n ? proposal.supersedingItemIDs.\n map(id => ({ itemID: id, classID: itemClass.meta.id, subregisterID }))\n : (itemData.supersededBy ?? [])}\n onChange={!isBusy && activeCRIsEditable && (\n (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession') ||\n (!proposal && itemData.status === 'valid'))\n ? (items) => items.length > 0\n ? handleSupersedeWith(items.map(ref => ref.itemID))\n : handleClearProposal()\n : undefined}\n />\n </FormGroup>\n : null;\n\n const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(itemData.data);\n\n const clarificationAction = (\n (proposal && proposal?.type !== 'amendment')\n || (activeCRIsEditable && !proposal && itemData.status === 'valid'))\n ? <FormGroup inline label={`${proposal?.type ?? \"clarification\"}: `} css={css`margin: 0;`}>\n {activeCRIsEditable\n ? <ButtonGroup>\n {editedClarification\n ? <>\n <Button\n intent={clarificationHasChanges ? \"primary\" : undefined}\n // TODO(perf): this is expensive if renders are frequent…\n disabled={!clarificationHasChanges || isBusy}\n onClick={(!proposal || proposal?.type === 'clarification')\n ? handleClarify\n : handleEditAddition}>\n Save\n </Button>\n <Button onClick={() => setEditedClarification(null)}>Do not save</Button>\n </>\n : <>\n <Button\n disabled={diffMode || isBusy}\n intent=\"primary\"\n outlined\n onClick={() => setEditedClarification(itemData.data)}>\n {!proposal ? \"Clarify\" : \"Edit\"}\n </Button>\n {proposal?.type === 'clarification'\n ? <>\n <Button\n disabled={diffMode || isBusy || proposal?.type !== 'clarification'}\n intent=\"warning\"\n onClick={handleClearProposal}>\n Clear\n </Button>\n </>\n : null}\n </>}\n </ButtonGroup>\n : <Button disabled>\n {proposal?.type === 'clarification' ? \"Clarified\" : \"Added\"} in active proposal\n </Button>}\n </FormGroup>\n : null;\n\n const proposeLikeThis = activeCRIsEditable && !editedClarification\n ? <Button\n title=\"Propose a new item in current proposal, using this item as template.\"\n icon='plus'\n disabled={isBusy}\n outlined\n onClick={performOperation('duplicating item', handleProposeLikeThis)}>\n Propose another like this\n </Button>\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 {proposeLikeThis}\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 const desc = itemData === null || itemData === undefined\n ? \"does not exist or could not be deserialized\"\n : \"may use unexpected data format\";\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description={`Item at ${itemPath} ${desc}`}\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"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterItem/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useCallback } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n Button, ButtonGroup,\n Card,\n Classes,\n FormGroup as BaseFormGroup,\n ControlGroup,\n InputGroup,\n NonIdealState,\n UL,\n H5,\n} from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport HelpTooltip from '@riboseinc/paneron-extension-kit/widgets/HelpTooltip';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\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 { itemRefToItemPath, 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, makeRandomID, performOperation, isBusy } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\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('clearing draft proposal', null);\n const handleRetire = () => performProposalOperation('proposing retirement of an item', {\n type: 'amendment',\n amendmentType: 'retirement',\n });\n const handleInvalidate = () => performProposalOperation('proposing invalidation', {\n type: 'amendment',\n amendmentType: 'invalidation',\n });\n const handleSupersedeWith = (items: string[]) => performProposalOperation('proposing supersession', {\n type: 'amendment',\n amendmentType: 'supersession',\n supersedingItemIDs: items,\n });\n const handleClarify = async () => {\n await performProposalOperation('proposing clarification', {\n type: 'clarification',\n });\n setEditedClarification(null);\n };\n const handleEditAddition = async () => {\n await performProposalOperation('editing proposed addition', {\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 itemPath,\n JSON.stringify(activeCR),\n JSON.stringify(itemData),\n JSON.stringify(editedClarification),\n ]);\n\n // TODO: Very similar to `handleAdd()` in Browse sidebar menu; refactor?\n const handleProposeLikeThis = useCallback(async function _handleProposeLikeThis(): Promise<void> {\n if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR || !itemClass || !isRegisterItem(itemData)) {\n throw new Error(\"Unable to create item: likely current proposal is not editable or dataset is read-only\");\n }\n const { classID, subregisterID } = itemRef;\n const itemID = await makeRandomID();\n const newRef = { classID, subregisterID, itemID };\n const newItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: { ...itemData.data },\n };\n if (isRegisterItem(newItem)) {\n const newPath = itemRefToItemPath(newRef);\n await updateObjects({\n commitMessage: `clone ${itemRef.itemID} to propose a new item`,\n objectChangeset: updateCRObjectChangeset(\n activeCR as any,\n { [newPath]: { type: 'addition' } },\n { [newPath]: newItem },\n ),\n _dangerouslySkipValidation: true,\n });\n if (activeCR.id === globallyActiveCRID) {\n spawnTab(`${Protocols.ITEM_DETAILS}:${itemRefToItemPath(newRef, activeCR.id)}`);\n }\n } else {\n throw new Error(\"Newly created item did not pass validation (this is likely a bug in RegistryKit\");\n }\n }, [\n updateObjects,\n activeCRIsEditable,\n itemPath,\n JSON.stringify(activeCR),\n JSON.stringify(itemData),\n ]);\n\n if (!itemClass) {\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description={`View for ${ref?.itemID ?? uri} cannot be retrieved from item class configuration`}\n />;\n\n } else if (isRegisterItem(itemData)) {\n let details: JSX.Element;\n\n if (editedClarification !== null && activeCRIsEditable) {\n const EditView = itemClass.views.editView;\n details = (\n <EditView\n itemData={editedClarification}\n itemRef={itemRef}\n onChange={!isBusy\n ? (newData) => {\n setEditedClarification(newData);\n }\n : undefined}\n />\n );\n\n } else {\n const DetailView = itemClass.views.detailView ?? itemClass.views.editView;\n details = (\n <DetailView\n itemRef={itemRef}\n itemData={itemData.data}\n />\n );\n }\n\n //const canAmend = activeCR && itemData.status === 'valid';\n const itemStatus =\n <FormGroup inline label=\"status:\" css={css`margin: 0;`}>\n <ControlGroup fill>\n <InputGroup\n value={proposal?.type === 'amendment'\n ? `${proposal.amendmentType} proposed`\n : proposal?.type === 'addition'\n ? \"addition proposed\"\n : itemData.status}\n intent={proposal?.type === 'amendment'\n ? 'warning'\n : proposal?.type === 'addition'\n ? 'primary'\n : itemData.status === 'valid'\n ? 'success'\n : undefined}\n leftIcon={proposal && (proposal.type === 'amendment' || proposal.type === 'addition')\n ? 'asterisk'\n : itemData.status === 'valid'\n ? 'tick'\n : itemData.status === 'invalid'\n ? 'ban-circle'\n : 'warning-sign'}\n readOnly\n />\n {activeCRIsEditable && !editedClarification\n ? <>\n {proposal?.type === 'addition'\n ? <Button\n intent=\"warning\"\n title=\"Remove the proposal to add this new item.\"\n disabled={isBusy}\n onClick={handleClearProposal}>\n Remove proposed addition\n </Button>\n : null}\n {proposal?.type === 'amendment'\n ? <Button\n intent=\"warning\"\n title={`Remove amendment (${proposal.amendmentType}) for this item from current proposal.`}\n disabled={isBusy}\n onClick={handleClearProposal}>\n Clear proposed amendment\n </Button>\n : !proposal && itemData.status === 'valid'\n ? <ButtonGroup>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleRetire}>\n Retire\n </Button>\n <Button\n intent=\"primary\"\n disabled={isBusy}\n onClick={handleInvalidate}>\n Invalidate\n </Button>\n </ButtonGroup>\n : null}\n </>\n : null}\n </ControlGroup>\n </FormGroup>;\n\n const supersedingItems = (\n // It’s superseded (whether in current proposal or not)\n itemData.status === 'superseded'\n // Item is valid, proposal is editable, and no change to this item is proposed yet\n || (activeCRIsEditable && !proposal && !editedClarification && itemData.status === 'valid')\n // This item is being superseded in active proposal\n // XXX: Redundant condition with the first one?\n || (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'))\n ? <FormGroup inline label=\"superseded by: \" css={css`margin: 0;`}>\n <RelatedItems\n availableClassIDs={[itemClass.meta.id]}\n itemRefs={proposal?.type === 'amendment' && proposal.amendmentType === 'supersession'\n ? proposal.supersedingItemIDs.\n map(id => ({ itemID: id, classID: itemClass.meta.id, subregisterID }))\n : (itemData.supersededBy ?? [])}\n onChange={!isBusy && activeCRIsEditable && (\n (proposal?.type === 'amendment' && proposal.amendmentType === 'supersession') ||\n (!proposal && itemData.status === 'valid'))\n ? (items) => items.length > 0\n ? handleSupersedeWith(items.map(ref => ref.itemID))\n : handleClearProposal()\n : undefined}\n />\n </FormGroup>\n : null;\n\n const clarificationHasChanges = JSON.stringify(editedClarification) !== JSON.stringify(itemData.data);\n\n const clarificationAction = (\n (proposal && proposal?.type !== 'amendment')\n || (activeCRIsEditable && !proposal && itemData.status === 'valid'))\n ? <FormGroup inline label={`${proposal?.type ?? \"clarification\"}: `} css={css`margin: 0;`}>\n {activeCRIsEditable\n ? <ButtonGroup>\n {editedClarification\n ? <>\n <Button\n intent={clarificationHasChanges ? \"primary\" : undefined}\n // TODO(perf): this is expensive if renders are frequent…\n disabled={!clarificationHasChanges || isBusy}\n onClick={(!proposal || proposal?.type === 'clarification')\n ? handleClarify\n : handleEditAddition}>\n Save\n </Button>\n <Button onClick={() => setEditedClarification(null)}>Do not save</Button>\n </>\n : <>\n <Button\n disabled={diffMode || isBusy}\n intent=\"primary\"\n outlined\n onClick={() => setEditedClarification(itemData.data)}>\n {!proposal ? \"Clarify\" : \"Edit\"}\n </Button>\n {proposal?.type === 'clarification'\n ? <>\n <Button\n disabled={diffMode || isBusy || proposal?.type !== 'clarification'}\n intent=\"warning\"\n onClick={handleClearProposal}>\n Clear\n </Button>\n </>\n : null}\n </>}\n </ButtonGroup>\n : <Button disabled>\n {proposal?.type === 'clarification' ? \"Clarified\" : \"Added\"} in active proposal\n </Button>}\n </FormGroup>\n : null;\n\n const proposeLikeThis = activeCRIsEditable && !editedClarification\n ? <Button\n title=\"Propose a new item in current proposal, using this item as template.\"\n icon='plus'\n disabled={isBusy}\n outlined\n onClick={performOperation('duplicating item', handleProposeLikeThis)}>\n Propose another like this\n </Button>\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 {proposeLikeThis}\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 const desc = itemData === null || itemData === undefined\n ? \"does not exist or could not be deserialized\"\n : \"may use unexpected data format\";\n return <NonIdealState\n icon=\"heart-broken\"\n title=\"Unable to show item\"\n description={`Item at ${itemPath} ${desc}`}\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"]}
|
package/views/index.js
CHANGED
package/views/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/views/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\n\nimport { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport TabbedWorkspace, { type TabbedWorkspaceProps } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace';\nimport {\n makeContextProvider as makeTabbedWorkspaceContextProvider,\n TabbedWorkspaceContext,\n} from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport {\n type RegisterItem,\n type RegisterItemDataHook,\n type RegisterStakeholder,\n type RegistryViewProps,\n isRegisterItem,\n isRegisterMetadata,\n isInternalItemReference,\n} from '../types';\n\nimport { REGISTER_METADATA_FILENAME } from '../common';\n\nimport GenericRelatedItemView from './GenericRelatedItemView';\nimport { sidebarConfig, SidebarID, sidebarIDs } from './sidebar';\nimport { BrowserCtx } from './BrowserCtx';\nimport { _getRelatedClass } from './util';\nimport RegisterHome from './detail/RegisterHome';\nimport protocolRegistry, { Protocols, type Protocol } from './protocolRegistry';\nimport {\n ChangeRequestContext,\n ChangeRequestContextProvider,\n} from './change-request/ChangeRequestContext';\nimport { itemPathInCR, itemPathToItemRefLike } from './itemPathUtils';\nexport { GenericRelatedItemView };\n\n\nconst TabbedWorkspaceContextProvider = makeTabbedWorkspaceContextProvider<Protocol, SidebarID>(\n 'Browse',\n sidebarIDs,\n protocolRegistry);\n\n\nexport const RegistryView: React.FC<RegistryViewProps> = function (props) {\n return (\n <TabbedWorkspaceContextProvider stateKey=\"main-registry-view\">\n <BrowserCtxProvider {...props}>\n <RegistryWorkspace />\n </BrowserCtxProvider>\n </TabbedWorkspaceContextProvider>\n );\n};\n\n\nconst SIDEBAR_WIDTH_SETTING_NAME = 'registryMainSidebarWidthPixels'\n\n\nconst RegistryWorkspace: React.FC<Record<never, never>> = function () {\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { useSettings, updateSetting, useGlobalSettings } = useContext(DatasetContext);\n\n const globalMode: TabbedWorkspaceProps<any>['globalMode'] = useMemo(\n (() => activeChangeRequest\n ? {\n content: <>\n Viewing register as proposed — contents shown may differ from version in effect\n </>,\n intent: 'danger',\n onClick: () => spawnTab(`${Protocols.CHANGE_REQUEST}:/proposals/${activeChangeRequest.id}/main.yaml`),\n }\n : undefined),\n [activeChangeRequest?.id],\n );\n\n const { value: { settings } } = useSettings();\n const { value: { settings: globalSettings } } = useGlobalSettings();\n\n const stored = settings[SIDEBAR_WIDTH_SETTING_NAME]\n const sidebarWidth: number | undefined = stored && typeof stored === 'number'\n ? stored as number\n : undefined;\n\n return <TabbedWorkspace\n css={css`flex: 1 1 auto;`}\n sidebarConfig={sidebarConfig}\n sidebarPosition={globalSettings.sidebarPosition}\n sidebarIDs={sidebarIDs}\n newTabPrompt={<RegisterHome />}\n globalMode={globalMode}\n sidebarWidth={sidebarWidth}\n onSidebarResize={(width) => {\n updateSetting({ key: SIDEBAR_WIDTH_SETTING_NAME, value: width })\n }}\n />\n};\n\n\nconst BrowserCtxProvider: React.FC<RegistryViewProps> = function ({\n itemClassConfiguration,\n subregisters,\n keyExpression,\n defaultSearchCriteria,\n customViews,\n children,\n}) {\n\n const { useObjectData, useRemoteUsername } = useContext(DatasetContext);\n const { focusedTabURI, spawnTab } = useContext(TabbedWorkspaceContext);\n\n const selectedItemPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.ITEM_DETAILS}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n\n const selectedItemRef: Record<string, string> | null =\n selectedItemPath\n ? itemPathToItemRefLike(subregisters !== undefined, selectedItemPath)\n : null;\n\n const maybeSelectedRegisterItemData: Record<string, any> | null = useObjectData({\n objectPaths: selectedItemPath ? [selectedItemPath] : [],\n }).value.data[selectedItemPath ?? ''];\n\n const selectedRegisterItem: BrowserCtx['selectedRegisterItem'] =\n isInternalItemReference(selectedItemRef)\n ? maybeSelectedRegisterItemData &&\n isRegisterItem(maybeSelectedRegisterItemData)\n ? {\n item: maybeSelectedRegisterItemData,\n ref: selectedItemRef,\n itemClass: itemClassConfiguration[selectedItemRef.classID],\n }\n : undefined\n : null;\n\n // TODO: Confirm that end extensions using RegistryKit can’t just import hooks\n // from RegistryKit and we really have to pass this to them via context\n // TODO: Why not use useObjectData directly? Since register item paths\n // are just object paths. The casting here is optimistic, since an item at given path\n // may not be a RegisterItem.\n const useRegisterItemData: RegisterItemDataHook = (opts) => {\n // Original item path mapped to its potential alternative path in current CR,\n // if the item is clarified or added in it.\n // TODO(perf): Access CR data and check whether the item is affected instead of blindly trying CR paths\n const pathsToRequest: Record<string, string> = {};\n\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n\n\n for (const givenItemPath of opts.itemPaths) {\n pathsToRequest[givenItemPath] = givenItemPath;\n\n // Don’t use CR alternative path for any path that is already explicitly in-CR.\n // TODO(perf): move out of the loop what’s possible, use map-reduce maybe too\n if (!opts.ignoreActiveCR && !givenItemPath.startsWith('/proposals') && activeChangeRequest?.id) {\n pathsToRequest[itemPathInCR(givenItemPath, activeChangeRequest.id)] = givenItemPath;\n }\n }\n\n const result = useObjectData({\n objectPaths: Object.keys(pathsToRequest),\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n\n const itemData: Record<string, RegisterItem<any> | null> = {};\n for (const [alternativePath, itemPath] of Object.entries(pathsToRequest)) {\n const data = result.value.data[alternativePath]\n ?? result.value.data[itemPath]\n ?? null;\n if (isRegisterItem(data) || data === null) {\n itemData[itemPath] = data;\n }\n }\n\n // Convert dates\n // const parsedData: Record<string, RegisterItem<any> | null> = Object.entries(result.value.data).\n // map(([ path, data ]) => {\n // return {\n // [path]: data !== null\n // ? {\n // ...data,\n // dateAccepted: parseISO(data!.dateAccepted as unknown as string),\n // }\n // : null,\n // };\n // }).\n // reduce((p, c) => ({ ...p, ...c }), {});\n\n return {\n ...result,\n value: itemData,\n };\n };\n\n\n // Register data\n\n const registerMetadataReq = useObjectData({\n objectPaths: [REGISTER_METADATA_FILENAME],\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n const maybeRegisterMetadata =\n registerMetadataReq.value.data?.[REGISTER_METADATA_FILENAME] ??\n (registerMetadataReq.isUpdating ? undefined : null);\n const registerMetadata = !maybeRegisterMetadata || isRegisterMetadata(maybeRegisterMetadata)\n ? maybeRegisterMetadata\n : null;\n\n const remoteUsername: string | undefined = useRemoteUsername().value.username;\n\n const stakeholder: RegisterStakeholder | undefined = remoteUsername\n ? (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === remoteUsername)\n : undefined;\n\n\n // Active CR\n\n const [ activeChangeRequestID, setActiveChangeRequestID ] = useState<string | null>(null);\n\n const getRelatedClass = _getRelatedClass(itemClassConfiguration);\n\n return (\n <BrowserCtx.Provider\n value={{\n stakeholder,\n registerMetadata,\n offline: remoteUsername === undefined ? true : undefined,\n\n subregisters,\n itemClasses: itemClassConfiguration,\n\n jumpTo: spawnTab,\n\n selectedRegisterItem,\n\n activeChangeRequestID,\n setActiveChangeRequestID,\n\n useRegisterItemData,\n getRelatedItemClassConfiguration: getRelatedClass,\n customViews: customViews ?? [],\n\n keyExpression,\n defaultSearchCriteria,\n }}>\n <ChangeRequestContextProvider changeRequestID={activeChangeRequestID}>\n {children}\n </ChangeRequestContextProvider>\n </BrowserCtx.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/views/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\n\nimport { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport TabbedWorkspace, { type TabbedWorkspaceProps } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace';\nimport {\n makeContextProvider as makeTabbedWorkspaceContextProvider,\n TabbedWorkspaceContext,\n} from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport {\n type RegisterItem,\n type RegisterItemDataHook,\n type RegisterStakeholder,\n type RegistryViewProps,\n isRegisterItem,\n isRegisterMetadata,\n isInternalItemReference,\n} from '../types';\n\nimport { REGISTER_METADATA_FILENAME } from '../common';\n\nimport GenericRelatedItemView from './GenericRelatedItemView';\nimport { sidebarConfig, SidebarID, sidebarIDs } from './sidebar';\nimport { BrowserCtx } from './BrowserCtx';\nimport { _getRelatedClass } from './util';\nimport RegisterHome from './detail/RegisterHome';\nimport protocolRegistry, { Protocols, type Protocol } from './protocolRegistry';\nimport {\n ChangeRequestContext,\n ChangeRequestContextProvider,\n} from './change-request/ChangeRequestContext';\nimport { itemPathInCR, itemPathToItemRefLike } from './itemPathUtils';\nexport { GenericRelatedItemView };\n\n\nconst TabbedWorkspaceContextProvider = makeTabbedWorkspaceContextProvider<Protocol, SidebarID>(\n 'Browse',\n sidebarIDs,\n protocolRegistry);\n\n\nexport const RegistryView: React.FC<RegistryViewProps> = function (props) {\n return (\n <TabbedWorkspaceContextProvider stateKey=\"main-registry-view\">\n <BrowserCtxProvider {...props}>\n <RegistryWorkspace />\n </BrowserCtxProvider>\n </TabbedWorkspaceContextProvider>\n );\n};\n\n\nconst SIDEBAR_WIDTH_SETTING_NAME = 'registryMainSidebarWidthPixels'\n\n\nconst RegistryWorkspace: React.FC<Record<never, never>> = function () {\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { useSettings, updateSetting, useGlobalSettings } = useContext(DatasetContext);\n\n const globalMode: TabbedWorkspaceProps<any>['globalMode'] = useMemo(\n (() => activeChangeRequest\n ? {\n content: <>\n Viewing register as proposed — contents shown may differ from version in effect\n </>,\n intent: 'danger',\n onClick: () => spawnTab(`${Protocols.CHANGE_REQUEST}:/proposals/${activeChangeRequest.id}/main.yaml`),\n }\n : undefined),\n [activeChangeRequest?.id],\n );\n\n const { value: { settings } } = useSettings();\n const { value: { settings: globalSettings } } = useGlobalSettings();\n\n const stored = settings[SIDEBAR_WIDTH_SETTING_NAME]\n const sidebarWidth: number | undefined = stored && typeof stored === 'number'\n ? stored as number\n : undefined;\n\n return <TabbedWorkspace\n css={css`flex: 1 1 auto;`}\n sidebarConfig={sidebarConfig}\n sidebarPosition={globalSettings.sidebarPosition}\n sidebarIDs={sidebarIDs}\n newTabPrompt={<RegisterHome />}\n globalMode={globalMode}\n sidebarWidth={sidebarWidth}\n onSidebarResize={(width) => {\n updateSetting({ key: SIDEBAR_WIDTH_SETTING_NAME, value: width })\n }}\n />\n};\n\n\nconst BrowserCtxProvider: React.FC<RegistryViewProps> = function ({\n itemClassConfiguration,\n subregisters,\n keyExpression,\n defaultSearchCriteria,\n customViews,\n children,\n}) {\n\n const { useObjectData, useRemoteUsername } = useContext(DatasetContext);\n const { focusedTabURI, spawnTab } = useContext(TabbedWorkspaceContext);\n\n const selectedItemPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.ITEM_DETAILS}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n\n const selectedItemRef: Record<string, string> | null =\n selectedItemPath\n ? itemPathToItemRefLike(subregisters !== undefined, selectedItemPath)\n : null;\n\n const maybeSelectedRegisterItemData: Record<string, any> | null = useObjectData({\n objectPaths: selectedItemPath ? [selectedItemPath] : [],\n }).value.data[selectedItemPath ?? ''];\n\n const selectedRegisterItem: BrowserCtx['selectedRegisterItem'] =\n isInternalItemReference(selectedItemRef)\n ? maybeSelectedRegisterItemData &&\n isRegisterItem(maybeSelectedRegisterItemData)\n ? {\n item: maybeSelectedRegisterItemData,\n ref: selectedItemRef,\n itemClass: itemClassConfiguration[selectedItemRef.classID],\n }\n : undefined\n : null;\n\n // TODO: Confirm that end extensions using RegistryKit can’t just import hooks\n // from RegistryKit and we really have to pass this to them via context\n // TODO: Why not use useObjectData directly? Since register item paths\n // are just object paths. The casting here is optimistic, since an item at given path\n // may not be a RegisterItem.\n const useRegisterItemData: RegisterItemDataHook = (opts) => {\n // Original item path mapped to its potential alternative path in current CR,\n // if the item is clarified or added in it.\n // TODO(perf): Access CR data and check whether the item is affected instead of blindly trying CR paths\n const pathsToRequest: Record<string, string> = {};\n\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n\n\n for (const givenItemPath of opts.itemPaths) {\n pathsToRequest[givenItemPath] = givenItemPath;\n\n // Don’t use CR alternative path for any path that is already explicitly in-CR.\n // TODO(perf): move out of the loop what’s possible, use map-reduce maybe too\n if (!opts.ignoreActiveCR && !givenItemPath.startsWith('/proposals') && activeChangeRequest?.id) {\n pathsToRequest[itemPathInCR(givenItemPath, activeChangeRequest.id)] = givenItemPath;\n }\n }\n\n const result = useObjectData({\n objectPaths: Object.keys(pathsToRequest),\n nounLabel: 'register item(s)',\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n\n const itemData: Record<string, RegisterItem<any> | null> = {};\n for (const [alternativePath, itemPath] of Object.entries(pathsToRequest)) {\n const data = result.value.data[alternativePath]\n ?? result.value.data[itemPath]\n ?? null;\n if (isRegisterItem(data) || data === null) {\n itemData[itemPath] = data;\n }\n }\n\n // Convert dates\n // const parsedData: Record<string, RegisterItem<any> | null> = Object.entries(result.value.data).\n // map(([ path, data ]) => {\n // return {\n // [path]: data !== null\n // ? {\n // ...data,\n // dateAccepted: parseISO(data!.dateAccepted as unknown as string),\n // }\n // : null,\n // };\n // }).\n // reduce((p, c) => ({ ...p, ...c }), {});\n\n return {\n ...result,\n value: itemData,\n };\n };\n\n\n // Register data\n\n const registerMetadataReq = useObjectData({\n objectPaths: [REGISTER_METADATA_FILENAME],\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n const maybeRegisterMetadata =\n registerMetadataReq.value.data?.[REGISTER_METADATA_FILENAME] ??\n (registerMetadataReq.isUpdating ? undefined : null);\n const registerMetadata = !maybeRegisterMetadata || isRegisterMetadata(maybeRegisterMetadata)\n ? maybeRegisterMetadata\n : null;\n\n const remoteUsername: string | undefined = useRemoteUsername().value.username;\n\n const stakeholder: RegisterStakeholder | undefined = remoteUsername\n ? (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === remoteUsername)\n : undefined;\n\n\n // Active CR\n\n const [ activeChangeRequestID, setActiveChangeRequestID ] = useState<string | null>(null);\n\n const getRelatedClass = _getRelatedClass(itemClassConfiguration);\n\n return (\n <BrowserCtx.Provider\n value={{\n stakeholder,\n registerMetadata,\n offline: remoteUsername === undefined ? true : undefined,\n\n subregisters,\n itemClasses: itemClassConfiguration,\n\n jumpTo: spawnTab,\n\n selectedRegisterItem,\n\n activeChangeRequestID,\n setActiveChangeRequestID,\n\n useRegisterItemData,\n getRelatedItemClassConfiguration: getRelatedClass,\n customViews: customViews ?? [],\n\n keyExpression,\n defaultSearchCriteria,\n }}>\n <ChangeRequestContextProvider changeRequestID={activeChangeRequestID}>\n {children}\n </ChangeRequestContextProvider>\n </BrowserCtx.Provider>\n );\n}\n"]}
|