@riboseinc/paneron-registry-kit 2.2.1 → 2.2.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riboseinc/paneron-registry-kit",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "main": "index.js",
5
5
  "author": "Ribose Inc. <open.source@ribose.com>",
6
6
  "scripts": {
@@ -175,6 +175,7 @@ const RegisterHome = function () {
175
175
  })), (0, _react2.jsx)(_core.MenuItem, {
176
176
  text: "Import proposal",
177
177
  icon: "import",
178
+ disabled: !canCreateCR,
178
179
  onClick: handleImportProposal
179
180
  }), (0, _react2.jsx)(_core.MenuItem, {
180
181
  text: "View register metadata",
@@ -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 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":"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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,4 +1,4 @@
1
- import { Base as BaseCR } from '../types/cr';
1
+ import type { Base as BaseCR } from '../types/cr';
2
2
  export declare const REGISTER_ITEM_QUERY = "\n objPath.startsWith(\"/subregisters/\") || (\n objPath.split(\"/\").length === 3 &&\n !objPath.startsWith(\"/proposals/\")\n )\n";
3
3
  /**
4
4
  * Returns a query criteria for use with filtered indexes
@@ -1 +1 @@
1
- {"version":3,"file":"itemQueryUtils.js","sourceRoot":"","sources":["../../src/views/itemQueryUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;CAKlC,CAAC;AAGF;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,EAAU;IAClC,yEAAyE;IACzE,gGAAgG;IAChG,qIAAqI;IACrI,MAAM,uBAAuB,GAAa,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;QAChE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAG,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC;AACxE,CAAC;AAGD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,eAAuB,EAAE,MAAe;IAC3E,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,mBAAmB,GAAG;QAC7D,CAAC,CAAC,mBAAmB,CAAC;IACxB,wCAAwC;IAExC,OAAO,WAAW,SAAS,SAAS,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC;AAChE,CAAC","sourcesContent":["import { Base as BaseCR } from '../types/cr';\nimport { itemPathInCR } from './itemPathUtils';\n\n\n// TODO: Should it be three path components? Probably four\nexport const REGISTER_ITEM_QUERY = `\n objPath.startsWith(\"/subregisters/\") || (\n objPath.split(\"/\").length === 3 &&\n !objPath.startsWith(\"/proposals/\")\n )\n`;\n\n\n/**\n * Returns a query that matches given register item object path\n * depending on how it appears in given change request.\n *\n * For additions, object path would be full in-proposal path\n * (the item doesn’t exist in the register “normally”), so we want to match that.\n * For clarifications, object path we want to match is normal\n */\nfunction getItemInCRQuery(cr: BaseCR): string {\n //const affectedItemPathsQuoted: string[] = Object.entries(withCR.items).\n // filter(([, proposal]) => proposal.type === 'clarification' || proposal.type === 'addition').\n // map(([itemPath, proposal]) => proposal.type === 'clarification' ? `\"${itemPath}\"` : `/proposals/${withCR.id}/items/${itemPath}`);\n const affectedItemPathsQuoted: string[] = Object.entries(cr.items).\n filter(([, proposal]) => proposal.type !== 'amendment').\n map(([itemPath, ]) => `\"${itemPathInCR(itemPath, cr.id)}\"`);\n return `[${affectedItemPathsQuoted.join(',')}].indexOf(objPath) >= 0`;\n}\n\n\n/**\n * Returns a query criteria for use with filtered indexes\n * by combining given `queryExpression` with base query that matches only\n * objects corresponding to register items.\n *\n * `withCR` should be set to active CR, and would make the query\n * additionally match clarified/added register items that did not yet make it\n * into the register proper.\n */\nexport function getRegisterItemQuery(queryExpression: string, withCR?: BaseCR): string {\n const baseQuery = withCR\n ? `(${getItemInCRQuery(withCR)}) || (${REGISTER_ITEM_QUERY})`\n : REGISTER_ITEM_QUERY;\n // console.debug(\"CR QUERY\", baseQuery);\n\n return `return (${baseQuery}) && (${queryExpression.trim()})`;\n}\n"]}
1
+ {"version":3,"file":"itemQueryUtils.js","sourceRoot":"","sources":["../../src/views/itemQueryUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;CAKlC,CAAC;AAGF;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,EAAU;IAClC,yEAAyE;IACzE,gGAAgG;IAChG,qIAAqI;IACrI,MAAM,uBAAuB,GAAa,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;QAChE,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAG,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC;AACxE,CAAC;AAGD;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,eAAuB,EAAE,MAAe;IAC3E,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,mBAAmB,GAAG;QAC7D,CAAC,CAAC,mBAAmB,CAAC;IACxB,wCAAwC;IAExC,OAAO,WAAW,SAAS,SAAS,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC;AAChE,CAAC","sourcesContent":["import type { Base as BaseCR } from '../types/cr';\nimport { itemPathInCR } from './itemPathUtils';\n\n\n// TODO: Should it be three path components? Probably four\nexport const REGISTER_ITEM_QUERY = `\n objPath.startsWith(\"/subregisters/\") || (\n objPath.split(\"/\").length === 3 &&\n !objPath.startsWith(\"/proposals/\")\n )\n`;\n\n\n/**\n * Returns a query that matches given register item object path\n * depending on how it appears in given change request.\n *\n * For additions, object path would be full in-proposal path\n * (the item doesn’t exist in the register “normally”), so we want to match that.\n * For clarifications, object path we want to match is normal\n */\nfunction getItemInCRQuery(cr: BaseCR): string {\n //const affectedItemPathsQuoted: string[] = Object.entries(withCR.items).\n // filter(([, proposal]) => proposal.type === 'clarification' || proposal.type === 'addition').\n // map(([itemPath, proposal]) => proposal.type === 'clarification' ? `\"${itemPath}\"` : `/proposals/${withCR.id}/items/${itemPath}`);\n const affectedItemPathsQuoted: string[] = Object.entries(cr.items).\n filter(([, proposal]) => proposal.type !== 'amendment').\n map(([itemPath, ]) => `\"${itemPathInCR(itemPath, cr.id)}\"`);\n return `[${affectedItemPathsQuoted.join(',')}].indexOf(objPath) >= 0`;\n}\n\n\n/**\n * Returns a query criteria for use with filtered indexes\n * by combining given `queryExpression` with base query that matches only\n * objects corresponding to register items.\n *\n * `withCR` should be set to active CR, and would make the query\n * additionally match clarified/added register items that did not yet make it\n * into the register proper.\n */\nexport function getRegisterItemQuery(queryExpression: string, withCR?: BaseCR): string {\n const baseQuery = withCR\n ? `(${getItemInCRQuery(withCR)}) || (${REGISTER_ITEM_QUERY})`\n : REGISTER_ITEM_QUERY;\n // console.debug(\"CR QUERY\", baseQuery);\n\n return `return (${baseQuery}) && (${queryExpression.trim()})`;\n}\n"]}