@riboseinc/paneron-registry-kit 2.2.29 → 2.2.31
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/index.d.ts +4 -1
- package/index.js +26 -0
- package/index.js.map +1 -1
- package/item-classes/Tree.d.ts +5 -0
- package/item-classes/Tree.js +115 -0
- package/item-classes/Tree.js.map +1 -0
- package/item-classes/treeNodes.d.ts +12 -0
- package/item-classes/treeNodes.js +68 -0
- package/item-classes/treeNodes.js.map +1 -0
- package/package.json +2 -2
- package/proposals/actionableGroups/Tree.d.ts +7 -0
- package/proposals/actionableGroups/Tree.js +179 -0
- package/proposals/actionableGroups/Tree.js.map +1 -0
- package/proposals/actionableGroups/queries.d.ts +5 -0
- package/proposals/actionableGroups/queries.js +81 -0
- package/proposals/actionableGroups/queries.js.map +1 -0
- package/proposals/actionableGroups/treeNodes.d.ts +26 -0
- package/proposals/actionableGroups/treeNodes.js +94 -0
- package/proposals/actionableGroups/treeNodes.js.map +1 -0
- package/proposals/actionableGroups/types.d.ts +6 -0
- package/proposals/actionableGroups/types.js +5 -0
- package/proposals/actionableGroups/types.js.map +1 -0
- package/types/cr.d.ts +2 -1
- package/types/cr.js.map +1 -1
- package/types/item.d.ts +4 -1
- package/types/item.js.map +1 -1
- package/types/register.d.ts +4 -1
- package/types/register.js.map +1 -1
- package/types/stakeholder.d.ts +24 -41
- package/types/stakeholder.js +48 -16
- package/types/stakeholder.js.map +1 -1
- package/types/views.d.ts +4 -0
- package/types/views.js.map +1 -1
- package/views/BrowserCtx.d.ts +1 -1
- package/views/BrowserCtx.js.map +1 -1
- package/views/GenericRelatedItemView.js +21 -8
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/ItemDetailsDrawer.d.ts +1 -0
- package/views/ItemDetailsDrawer.js +4 -2
- package/views/ItemDetailsDrawer.js.map +1 -1
- package/views/ItemSearchDrawer.js +1 -1
- package/views/ItemSearchDrawer.js.map +1 -1
- package/views/Party.d.ts +0 -0
- package/views/Party.js +154 -0
- package/views/Party.js.map +1 -0
- package/views/RegisterStakeholder.js +2 -2
- package/views/RegisterStakeholder.js.map +1 -1
- package/views/StatefulTree.d.ts +19 -0
- package/views/StatefulTree.js +128 -0
- package/views/StatefulTree.js.map +1 -0
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/change-request/TransitionHistory.js +6 -3
- package/views/change-request/TransitionHistory.js.map +1 -1
- package/views/change-request/TransitionOptions.js +37 -13
- package/views/change-request/TransitionOptions.js.map +1 -1
- package/views/detail/RegisterHome/index.js +20 -79
- package/views/detail/RegisterHome/index.js.map +1 -1
- package/views/detail/RegisterItem/index.d.ts +2 -2
- package/views/detail/RegisterItem/index.js +21 -14
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/detail/RegisterItemClass.d.ts +12 -0
- package/views/detail/RegisterItemClass.js +98 -0
- package/views/detail/RegisterItemClass.js.map +1 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js +272 -114
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -1
- package/views/detail/RegisterMeta/index.js +1 -1
- package/views/detail/RegisterMeta/index.js.map +1 -1
- package/views/hooks/useStakeholder.d.ts +0 -0
- package/views/hooks/useStakeholder.js +1 -0
- package/views/hooks/useStakeholder.js.map +1 -0
- package/views/index.d.ts +1 -0
- package/views/index.js +71 -8
- package/views/index.js.map +1 -1
- package/views/protocolRegistry.d.ts +1 -0
- package/views/protocolRegistry.js +4 -0
- package/views/protocolRegistry.js.map +1 -1
- package/views/sidebar/Browse/index.js +8 -44
- package/views/sidebar/Browse/index.js.map +1 -1
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/index.d.ts +2 -1
- package/views/sidebar/index.js +77 -62
- package/views/sidebar/index.js.map +1 -1
- package/views/util.d.ts +5 -0
- package/views/util.js +42 -4
- package/views/util.js.map +1 -1
package/types/views.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/types/views.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\nimport type { ButtonProps, MenuItemProps } from '@blueprintjs/core';\nimport type { ObjectDatasetRequest, ObjectDatasetResponse, ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport type { InternalItemReference, Payload, RegisterItem, RegisterItemClass } from './item';\nimport type { CriteriaGroup } from '../views/FilterCriteria/models';\nimport type { AlterApprovedCR } from './cr';\n\n\n// Hooks\n\n/**\n * Mostly a wrapper around useObjectData, but coerces value type\n * (TODO: validate!) and takes into account change request from any\n * wrapping change request context. If a change request is present,\n * will substitute proposed item data unless `ignoreActiveCR` is set.\n *\n * NOTE: Despite the name, returns the entire RegisterItem,\n * not just the `.data` property with item payload.\n */\nexport type RegisterItemDataHook<P extends Payload = Payload> =\n (opts: { itemPaths: string[], ignoreActiveCR?: true }) => ValueHook<Record<string, RegisterItem<P> | null>>;\n\n\n// Extension configuration\n\n// TODO: Obsolete?\n// export interface ExtensionContext {\n// getRelatedItemClassConfiguration: (classID: string) => RelatedItemClassConfiguration\n// useRegisterItemData: RegisterItemDataHook\n// onJump?: () => void\n// }\n\nexport interface RegisterConfiguration\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> {\n /**\n * Configuration for all items in this register.\n * This includes items in subregisters.\n */\n itemClassConfiguration: Items\n\n /**\n * Default expression used to sort an item.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n /** Subregister information. */\n subregisters?: Subregisters<Items>\n}\n\nexport type Subregisters\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> = {\n [subregisterID: string]: {\n title: string\n\n /** Names of item classes that go in this subregister. */\n itemClasses: (keyof Items)[]\n }\n};\n\nexport type ItemClassConfigurationSet = {\n [itemClassID: string]: ItemClassConfiguration<any>\n};\n\n\n\nexport interface ExportFormatConfiguration<P extends Payload> {\n /** The name of the export format. */\n label: string\n\n /**\n * Trailing part of the filename to save export as;\n * must include at least extension (with separator),\n * must not include any path prefix.\n */\n filenameExtension: string\n\n /**\n * The function that takes register item data and some helper functions\n * and is expected to return a blob.\n */\n exportItem: (\n itemData: RegisterItem<P>,\n opts: {\n getObjectData: (opts: ObjectDatasetRequest) => Promise<ObjectDatasetResponse>,\n getBlob: (val: string) => Promise<Uint8Array>,\n logger?: { log: Console[\"log\"], error: Console[\"error\"], debug: Console[\"debug\"] },\n },\n ) => Promise<Uint8Array>\n}\n\n\nexport interface ItemClassConfiguration<P extends Payload/*, F extends Field*/> {\n meta: RegisterItemClass\n\n itemCanBeSuperseded?: boolean\n // If false, items of this class cannot be superseded, only retired.\n // Default is true.\n\n /** Used to pre-populate item data e.g. when a new item is created. */\n defaults?: RegistryItemPayloadDefaults<P>\n\n validatePayload?: (item: P) => Promise<boolean>\n sanitizePayload?: (item: P) => Promise<P>\n\n // XXX: Confirm if obsolete and remove\n itemSorter?: (a: P, b: P) => number\n\n /**\n * Expression used to sort an item of this class.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n exportFormats?: Readonly<ExportFormatConfiguration<P>[]>\n\n views: {\n listItemView: ItemListView<P>\n editView: ItemEditView<P>\n detailView?: ItemDetailView<P>\n }\n}\n\n\nexport interface RegistryViewProps\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>>\nextends RegisterConfiguration<Items> {\n /**\n * When search is initially opened, have this query pre-defined.\n * Not very useful since there are also preset searches in the browser now.\n */\n // TODO: Obsoluete?\n defaultSearchCriteria?: CriteriaGroup\n\n /**\n * Default predicate for matching items\n * using quick search.\n *\n * Must return the search expression as text.\n *\n * Search expression must return a boolean and can access:\n *\n * - `obj`, which *should* be a RegisterItem instance\n * with `obj.data` being its class-specific payload.\n *\n * E.g., if all important item classes in your register\n * specify a `name` field:\n *\n * @example (searchQuery) => `obj.data?.name?.toLowerCase().indexOf(\"${searchQuery.toLowerCase()}\") >= 0`\n */\n getQuickSearchPredicate?: (quickSearchQuery: string) => string\n\n /**\n * Extension-provided additional views that don’t correspond\n * to entities like register item, change request, etc. handled by RegistryKit.\n */\n customViews?: CustomViewConfiguration[]\n\n /**\n * Allows to transform item data & proposals\n * after CB decision but before the changes are applied to the register.\n */\n alterApprovedCR?: AlterApprovedCR\n}\n\nexport interface CustomViewConfiguration {\n id: string\n label: string\n description: string\n view: React.FC<{\n /** View can support optional path for custom state/inner navigation (provisional). */\n path: string\n }>\n icon?: JSX.Element\n}\n\n\n// Item views\n\nexport interface ItemAction {\n getButtonProps:\n (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) =>\n ButtonProps | MenuItemProps\n}\n\nexport type RegistryView = React.FC<RegistryViewProps>\n\ntype RegistryItemPayloadDefaults<P extends Payload> =\n Partial<Omit<P, 'id'>>;\n\n/**\n * A small part of item class configuration,\n * useful e.g. for formatting related items.\n */\nexport type RelatedItemClassConfiguration = {\n title: string\n itemView: ItemListView<any>\n}\n\n\nexport interface RegistryItemViewProps<P extends Payload> {\n /**\n * Item reference.\n * Glossarist, for example, uses it to determine language subregister and set appropriate writing direction.\n */\n itemRef: Omit<InternalItemReference, 'itemID'> & { itemID?: InternalItemReference['itemID'] }\n\n /** Item data (payload). */\n itemData: P\n\n className?: string\n //subregisterID?: string\n\n /** Deprecated */\n useRegisterItemData?: any\n /** Deprecated */\n getRelatedItemClassConfiguration?: any\n}\n\nexport interface GenericRelatedItemViewProps {\n /** Currently selected item’s ref. */\n itemRef?: InternalItemReference\n\n /** Allows to grab a ref of the input displaying the selected item. */\n inputRef?: React.Ref<HTMLInputElement>\n\n /**\n * By default, clicking the item will spawn a tab via TabbedWorkspace context.\n * This prop can customize that behavior.\n */\n onJump?: () => void\n\n className?: string\n\n /**\n * Determines which item classes can be selected in the search dialog.\n * If undefined, *any* class can be chosen.\n * If empty list, no class can be chosen (weird).\n */\n availableClassIDs?: string[]\n\n // XXX: Check if obsolete, remove if unused\n itemSorter?: ItemClassConfiguration<any>[\"itemSorter\"]\n\n /** Called to auto-create an item (can’t auto-create if not provided) */\n onCreateNew?: () => Promise<InternalItemReference>\n\n /** Called when current item is cleared (can’t clear if not provided) */\n onClear?: () => void\n\n /** Called when a new item is selected (can’t change if not provided) */\n onChange?: (newRef: InternalItemReference) => void\n\n /** @deprecated subregisters no longer supported. */\n availableSubregisterIDs?: string[]\n\n /** @deprecated */\n useRegisterItemData?: any\n //useRegisterItemData: RegisterItemDataHook\n\n /** @deprecated */\n getRelatedItemClassConfiguration?: any\n //getRelatedItemClassConfiguration: ExtensionContext[\"getRelatedItemClassConfiguration\"]\n}\n\n\nexport type ItemEditView<P extends Payload> = React.FC<ItemEditViewProps<P>>;\n\nexport interface ItemEditViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n onChange?: (newData: P) => void\n onCreateRelatedItem?:\n (classID: string, subregisterID?: string) => Promise<InternalItemReference>\n}\n\nexport interface ItemDetailViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n //useRegisterItemData: RegisterItemDataHook\n}\n\nexport type ItemDetailView<P extends Payload> = React.FC<ItemDetailViewProps<P>>;\n\nexport interface ItemListViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n}\n\nexport type ItemListView<P extends Payload> = React.FC<ItemListViewProps<P>>;\n\nexport type LazyItemView = React.FC<{ itemID: string }>;\n"]}
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/types/views.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\nimport type { ButtonProps, MenuItemProps } from '@blueprintjs/core';\nimport type { ObjectDatasetRequest, ObjectDatasetResponse, ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport type { InternalItemReference, Payload, RegisterItem, RegisterItemClass } from './item';\nimport type { CriteriaGroup } from '../views/FilterCriteria/models';\nimport type { AlterApprovedCR } from './cr';\n\n\n// Hooks\n\n/**\n * Mostly a wrapper around useObjectData, but coerces value type\n * (TODO: validate!) and takes into account change request from any\n * wrapping change request context. If a change request is present,\n * will substitute proposed item data unless `ignoreActiveCR` is set.\n *\n * NOTE: Despite the name, returns the entire RegisterItem,\n * not just the `.data` property with item payload.\n */\nexport type RegisterItemDataHook<P extends Payload = Payload> =\n (opts: { itemPaths: string[], ignoreActiveCR?: true }) => ValueHook<Record<string, RegisterItem<P> | null>>;\n\n\n// Extension configuration\n\n// TODO: Obsolete?\n// export interface ExtensionContext {\n// getRelatedItemClassConfiguration: (classID: string) => RelatedItemClassConfiguration\n// useRegisterItemData: RegisterItemDataHook\n// onJump?: () => void\n// }\n\nexport interface RegisterConfiguration\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> {\n /**\n * Configuration for all items in this register.\n * This includes items in subregisters.\n */\n itemClassConfiguration: Items\n\n /**\n * Default expression used to sort an item.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n /** Subregister information. */\n subregisters?: Subregisters<Items>\n}\n\nexport type Subregisters\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>> = {\n [subregisterID: string]: {\n title: string\n\n /** Names of item classes that go in this subregister. */\n itemClasses: (keyof Items)[]\n }\n};\n\nexport type ItemClassConfigurationSet = {\n [itemClassID: string]: ItemClassConfiguration<any>\n};\n\n\n\nexport interface ExportFormatConfiguration<P extends Payload> {\n /** The name of the export format. */\n label: string\n\n /**\n * Trailing part of the filename to save export as;\n * must include at least extension (with separator),\n * must not include any path prefix.\n */\n filenameExtension: string\n\n /**\n * The function that takes register item data and some helper functions\n * and is expected to return a blob.\n */\n exportItem: (\n itemData: RegisterItem<P>,\n opts: {\n getObjectData: (opts: ObjectDatasetRequest) => Promise<ObjectDatasetResponse>,\n getBlob: (val: string) => Promise<Uint8Array>,\n logger?: { log: Console[\"log\"], error: Console[\"error\"], debug: Console[\"debug\"] },\n },\n ) => Promise<Uint8Array>\n}\n\n\nexport interface ItemClassConfiguration<P extends Payload/*, F extends Field*/> {\n meta: RegisterItemClass\n\n itemCanBeSuperseded?: boolean\n // If false, items of this class cannot be superseded, only retired.\n // Default is true.\n\n /** Used to pre-populate item data e.g. when a new item is created. */\n defaults?: RegistryItemPayloadDefaults<P>\n\n validatePayload?: (item: P) => Promise<boolean>\n sanitizePayload?: (item: P) => Promise<P>\n\n // XXX: Confirm if obsolete and remove\n itemSorter?: (a: P, b: P) => number\n\n /**\n * Expression used to sort an item of this class.\n * Passed to useFilteredIndex().\n */\n keyExpression?: string\n\n exportFormats?: Readonly<ExportFormatConfiguration<P>[]>\n\n views: {\n listItemView: ItemListView<P>\n editView: ItemEditView<P>\n detailView?: ItemDetailView<P>\n }\n}\n\n\nexport interface RegistryViewProps\n<Items extends ItemClassConfigurationSet = Record<string, ItemClassConfiguration<any>>>\nextends RegisterConfiguration<Items> {\n /**\n * When search is initially opened, have this query pre-defined.\n * Not very useful since there are also preset searches in the browser now.\n */\n // TODO: Obsoluete?\n defaultSearchCriteria?: CriteriaGroup\n\n /** Group item classes */\n itemClassGroups?: Record<string, readonly (keyof Items)[]>\n\n /** Overrides CustomSidebarConfig, obviously. */\n CustomWorkspace?: React.FC<Record<never, never>>\n\n /**\n * Default predicate for matching items\n * using quick search.\n *\n * Must return the search expression as text.\n *\n * Search expression must return a boolean and can access:\n *\n * - `obj`, which *should* be a RegisterItem instance\n * with `obj.data` being its class-specific payload.\n *\n * E.g., if all important item classes in your register\n * specify a `name` field:\n *\n * @example (searchQuery) => `obj.data?.name?.toLowerCase().indexOf(\"${searchQuery.toLowerCase()}\") >= 0`\n */\n getQuickSearchPredicate?: (quickSearchQuery: string) => string\n\n /**\n * Extension-provided additional views that don’t correspond\n * to entities like register item, change request, etc. handled by RegistryKit.\n */\n customViews?: CustomViewConfiguration[]\n\n /**\n * Allows to transform item data & proposals\n * after CB decision but before the changes are applied to the register.\n */\n alterApprovedCR?: AlterApprovedCR\n}\n\nexport interface CustomViewConfiguration {\n id: string\n label: string\n description: string\n view: React.FC<{\n /** View can support optional path for custom state/inner navigation (provisional). */\n path: string\n }>\n icon?: JSX.Element\n}\n\n\n// Item views\n\nexport interface ItemAction {\n getButtonProps:\n (item: RegisterItem<any>, itemClass: ItemClassConfiguration<any>, subregisterID?: string) =>\n ButtonProps | MenuItemProps\n}\n\nexport type RegistryView = React.FC<RegistryViewProps>\n\ntype RegistryItemPayloadDefaults<P extends Payload> =\n Partial<Omit<P, 'id'>>;\n\n/**\n * A small part of item class configuration,\n * useful e.g. for formatting related items.\n */\nexport type RelatedItemClassConfiguration = {\n title: string\n itemView: ItemListView<any>\n}\n\n\nexport interface RegistryItemViewProps<P extends Payload> {\n /**\n * Item reference.\n * Glossarist, for example, uses it to determine language subregister and set appropriate writing direction.\n */\n itemRef: Omit<InternalItemReference, 'itemID'> & { itemID?: InternalItemReference['itemID'] }\n\n /** Item data (payload). */\n itemData: P\n\n className?: string\n //subregisterID?: string\n\n /** Deprecated */\n useRegisterItemData?: any\n /** Deprecated */\n getRelatedItemClassConfiguration?: any\n}\n\nexport interface GenericRelatedItemViewProps {\n /** Currently selected item’s ref. */\n itemRef?: InternalItemReference\n\n /** Allows to grab a ref of the input displaying the selected item. */\n inputRef?: React.Ref<HTMLInputElement>\n\n /**\n * By default, clicking the item will spawn a tab via TabbedWorkspace context.\n * This prop can customize that behavior.\n */\n onJump?: () => void\n\n className?: string\n\n /**\n * Determines which item classes can be selected in the search dialog.\n * If undefined, *any* class can be chosen.\n * If empty list, no class can be chosen (weird).\n */\n availableClassIDs?: string[]\n\n // XXX: Check if obsolete, remove if unused\n itemSorter?: ItemClassConfiguration<any>[\"itemSorter\"]\n\n /** Called to auto-create an item (can’t auto-create if not provided) */\n onCreateNew?: () => Promise<InternalItemReference>\n\n /** Called when current item is cleared (can’t clear if not provided) */\n onClear?: () => void\n\n /** Called when a new item is selected (can’t change if not provided) */\n onChange?: (newRef: InternalItemReference) => void\n\n /** @deprecated subregisters no longer supported. */\n availableSubregisterIDs?: string[]\n\n /** @deprecated */\n useRegisterItemData?: any\n //useRegisterItemData: RegisterItemDataHook\n\n /** @deprecated */\n getRelatedItemClassConfiguration?: any\n //getRelatedItemClassConfiguration: ExtensionContext[\"getRelatedItemClassConfiguration\"]\n}\n\n\nexport type ItemEditView<P extends Payload> = React.FC<ItemEditViewProps<P>>;\n\nexport interface ItemEditViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n onChange?: (newData: P) => void\n onCreateRelatedItem?:\n (classID: string, subregisterID?: string) => Promise<InternalItemReference>\n}\n\nexport interface ItemDetailViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n //useRegisterItemData: RegisterItemDataHook\n}\n\nexport type ItemDetailView<P extends Payload> = React.FC<ItemDetailViewProps<P>>;\n\nexport interface ItemListViewProps<P extends Payload> extends RegistryItemViewProps<P> {\n}\n\nexport type ItemListView<P extends Payload> = React.FC<ItemListViewProps<P>>;\n\nexport type LazyItemView = React.FC<{ itemID: string }>;\n"]}
|
package/views/BrowserCtx.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/// <reference types="react" />
|
|
3
3
|
import type { ItemClassConfigurationSet, ItemClassConfiguration, RegisterItem, RegisterItemDataHook, Register, RegisterStakeholder, RelatedItemClassConfiguration, Subregisters, InternalItemReference, RegistryViewProps } from '../types';
|
|
4
4
|
import { type Protocol } from './protocolRegistry';
|
|
5
|
-
export interface BrowserCtx extends Pick<RegistryViewProps, "alterApprovedCR" | "defaultSearchCriteria" | "getQuickSearchPredicate" | "customViews"> {
|
|
5
|
+
export interface BrowserCtx extends Pick<RegistryViewProps, "alterApprovedCR" | "itemClassGroups" | "defaultSearchCriteria" | "getQuickSearchPredicate" | "customViews"> {
|
|
6
6
|
itemClasses: ItemClassConfigurationSet;
|
|
7
7
|
subregisters?: Subregisters;
|
|
8
8
|
/**
|
package/views/BrowserCtx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserCtx.js","sourceRoot":"","sources":["../../src/views/BrowserCtx.tsx"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"BrowserCtx.js","sourceRoot":"","sources":["../../src/views/BrowserCtx.tsx"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAuGrC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAa;IAClD,WAAW,EAAE,EAAE;IACf,WAAW,EAAE,EAAE;IACf,yCAAyC;IACzC,oBAAoB,EAAE,IAAI;IAC1B,gBAAgB,EAAE,SAAS;IAC3B,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;KACtB,CAAC;IACF,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kCAAqB,EAAE,CAAC;CAClG,CAAC,CAAC","sourcesContent":["/** @jsx jsx */\n\nimport { jsx } from '@emotion/react';\nimport { createContext } from 'react';\nimport type {\n ItemClassConfigurationSet,\n ItemClassConfiguration,\n RegisterItem,\n RegisterItemDataHook,\n Register,\n RegisterStakeholder,\n RelatedItemClassConfiguration,\n // SaveProposalHandler,\n Subregisters,\n InternalItemReference,\n RegistryViewProps,\n} from '../types';\nimport { type Protocol } from './protocolRegistry';\n\n\n// TODO(perf): split into smaller contexts\nexport interface BrowserCtx extends Pick<RegistryViewProps,\n| \"alterApprovedCR\"\n| \"itemClassGroups\"\n| \"defaultSearchCriteria\"\n| \"getQuickSearchPredicate\"\n| \"customViews\"> {\n itemClasses: ItemClassConfigurationSet\n subregisters?: Subregisters\n\n /**\n * Stakeholder corresponding to the current user.\n * If current user is not a stakeholder, undefined.\n */\n stakeholder?: RegisterStakeholder\n\n /**\n * Set if no remote is configured.\n */\n offline?: true\n\n /**\n * Common “key expression” (used for sorting) across the register.\n * Should contain the expression itself, no “return” statement.\n */\n keyExpression?: string\n\n /**\n * Allows to access register metadata\n * (e.g., version, stakeholders).\n *\n * `undefined` if loading, `null` if unspecified.\n */\n registerMetadata?: Register | null\n\n /** Hook for getting register item data. */\n useRegisterItemData: RegisterItemDataHook\n\n /**\n * Invoked to navigate to an item.\n * In SPA tabbed context, could translate to `spawnTab()`;\n * in static web context, could translate to navigating browser location.\n */\n jumpTo?: (uri: `${Protocol}:${string}`) => void\n\n /**\n * If a register item is selected, provide its data here.\n *\n * If item data is still loading or invalid, `undefined`.\n * If item is not selected, `null`.\n */\n selectedRegisterItem?: {\n item: RegisterItem<any>\n ref: InternalItemReference\n itemClass: ItemClassConfiguration<any>\n } | null\n\n /**\n * Change request being drafted or reviewed.\n * `undefined` if loading, `null` if there is no active change request.\n */\n activeChangeRequestID?: string | null\n\n /**\n * Setter for `activeChangeRequest()`. Set to `null` to unset.\n */\n setActiveChangeRequestID?: (id: string | null) => void\n\n /**\n * An async function for retrieving data of register items\n * at given paths. For cases where the hook doesn’t work.\n *\n * If a path contains nothing or contains not a register item,\n * the result will be null.\n */\n // getRegisterItemData: (opts: { itemPaths: string[] }) => Promise<Record<string, RegisterItem<any> | null>>\n\n // onPropose?: SaveProposalHandler\n\n //selectedItemPath?: string\n\n /**\n * Given item class ID, returns a small subset of relevant class configuration data.\n */\n getRelatedItemClassConfiguration: (clsID: string) => RelatedItemClassConfiguration\n // TODO: Rename to just “get class config”\n};\n\nexport const BrowserCtx = createContext<BrowserCtx>({\n itemClasses: {},\n customViews: [],\n // getRegisterItemData: async () => ({}),\n selectedRegisterItem: null,\n registerMetadata: undefined,\n useRegisterItemData: () => ({\n value: {},\n _reqCounter: -1,\n errors: [],\n isUpdating: true,\n refresh: () => void 0,\n }),\n getRelatedItemClassConfiguration: () => ({ title: 'N/A', itemView: () => <span>Loading…</span> }),\n});\n"]}
|
|
@@ -51,7 +51,7 @@ const GenericRelatedItemView = function ({
|
|
|
51
51
|
// itemSorter,
|
|
52
52
|
|
|
53
53
|
}) {
|
|
54
|
-
var _a;
|
|
54
|
+
var _a, _b;
|
|
55
55
|
|
|
56
56
|
const {
|
|
57
57
|
useRegisterItemData,
|
|
@@ -180,18 +180,30 @@ const GenericRelatedItemView = function ({
|
|
|
180
180
|
|
|
181
181
|
return itemButtons;
|
|
182
182
|
}, [itemID, itemResult.isUpdating, onCreateNew, onChange, onClear]);
|
|
183
|
-
const itemTitle = hasItem ? `${itemClassTitle !== null && itemClassTitle !== void 0 ? itemClassTitle : 'unknown class'} item ${itemID !== null && itemID !== void 0 ? itemID : 'with unknown ID'}` : undefined;
|
|
183
|
+
const itemTitle = hasItem ? `${itemClassTitle !== null && itemClassTitle !== void 0 ? itemClassTitle : 'unknown class'} item ${itemID !== null && itemID !== void 0 ? itemID : 'with unknown ID'}` : undefined;
|
|
184
|
+
/** Input ref for using within this component */
|
|
185
|
+
|
|
186
|
+
const cbRef = (0, _react2.useRef)(null);
|
|
187
|
+
|
|
188
|
+
const _drawerContainerRef = (0, _react2.useRef)(null);
|
|
189
|
+
|
|
190
|
+
const closePeekingDrawer = (0, _react2.useCallback)(() => setPeekingDrawerState(false), [setPeekingDrawerState]);
|
|
191
|
+
|
|
192
|
+
const _itemRef = (0, _react2.useMemo)(() => itemRef, [JSON.stringify(itemRef)]); //log.debug("Rendering generic related item view: got item", item);
|
|
193
|
+
|
|
184
194
|
|
|
185
195
|
return (0, _react.jsx)(_core.ControlGroup, {
|
|
186
196
|
dir: "ltr",
|
|
187
197
|
className: className,
|
|
188
198
|
title: itemTitle,
|
|
189
199
|
...controlGroupProps
|
|
190
|
-
}, (0, _react.jsx)(
|
|
200
|
+
}, (0, _react.jsx)("div", {
|
|
201
|
+
ref: cbRef
|
|
202
|
+
}), (0, _react.jsx)(_core.InputGroup, {
|
|
191
203
|
fill: hasItem,
|
|
192
204
|
readOnly: !onChange && !onClear,
|
|
193
|
-
onChange: () => void 0,
|
|
194
205
|
inputRef: inputRef,
|
|
206
|
+
onChange: (0, _react2.useCallback)(() => void 0, []),
|
|
195
207
|
css: (0, _react.css)`
|
|
196
208
|
/* leftElement which displays itemView */
|
|
197
209
|
.bp4-input-left-container {
|
|
@@ -227,13 +239,14 @@ const GenericRelatedItemView = function ({
|
|
|
227
239
|
...props
|
|
228
240
|
})), (0, _react.jsx)(_ItemSearchDrawer.default, {
|
|
229
241
|
isOpen: selectDialogState,
|
|
230
|
-
onClose: () => setSelectDialogState(false),
|
|
242
|
+
onClose: (0, _react2.useCallback)(() => setSelectDialogState(false), [setSelectDialogState]),
|
|
231
243
|
onChooseItem: onChange,
|
|
232
244
|
availableClassIDs: classIDs
|
|
233
|
-
}),
|
|
245
|
+
}), _itemRef ? (0, _react.jsx)(_ItemDetailsDrawer.default, {
|
|
234
246
|
isOpen: peekingDrawerState,
|
|
235
|
-
onClose:
|
|
236
|
-
itemRef:
|
|
247
|
+
onClose: closePeekingDrawer,
|
|
248
|
+
itemRef: _itemRef,
|
|
249
|
+
portalContainer: (_b = _drawerContainerRef.current) !== null && _b !== void 0 ? _b : undefined
|
|
237
250
|
}) : null);
|
|
238
251
|
};
|
|
239
252
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenericRelatedItemView.js","sourceRoot":"","sources":["../../src/views/GenericRelatedItemView.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React, { useContext, useCallback, useMemo, useState } from 'react';\nimport { InputGroup, Button, ControlGroup, type ControlGroupProps, type ButtonProps } from '@blueprintjs/core';\nimport {\n type GenericRelatedItemViewProps,\n type RelatedItemClassConfiguration,\n isRegisterItem,\n} from '../types';\nimport { BrowserCtx } from './BrowserCtx';\nimport { ChangeRequestContext } from './change-request/ChangeRequestContext';\nimport { isDrafted } from '../types/cr';\nimport ItemSearchDrawer from './ItemSearchDrawer';\nimport ItemDetailsDrawer from './ItemDetailsDrawer';\n\n\nconst DUMMY_REF = {\n classID: '',\n itemID: '',\n subregisterID: '',\n} as const;\n\n\nexport const GenericRelatedItemView: React.FC<GenericRelatedItemViewProps & {\n controlGroupProps?: ControlGroupProps\n}> = function ({\n itemRef, className,\n onCreateNew, onClear, onChange,\n availableClassIDs,\n onJump,\n inputRef,\n controlGroupProps,\n // availableSubregisterIDs,\n // itemSorter,\n}) {\n const {\n useRegisterItemData,\n getRelatedItemClassConfiguration,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { classID, itemID, subregisterID } = itemRef ?? DUMMY_REF;\n\n const itemPathWithClass = `${classID}/${itemID}.yaml`;\n // If curretn register has subregisters, specify subregister-relative path\n const itemPathWithSubregister = subregisterID\n ? `subregisters/${subregisterID}/${itemPathWithClass}`\n : `${itemPathWithClass}`;\n // If a change request is active\n // and this item is among clarifications or additions\n // then use item path relative to the change request\n // TODO: make useRegisterItemData() handle active change request\n const affectedByActiveCR = (\n activeChangeRequest &&\n isDrafted(activeChangeRequest) &&\n activeChangeRequest.items[itemPathWithSubregister]\n );\n const itemPath = affectedByActiveCR\n ? `/proposals/${activeChangeRequest.id}/items/${itemPathWithSubregister}`\n : `/${itemPathWithSubregister}`;\n\n const [selectDialogState, setSelectDialogState] = useState(false);\n const [peekingDrawerState, setPeekingDrawerState] = useState(false);\n\n //log.debug(\"Rendering generic related item view\", itemRef);\n //const { jumpToItem } = useContext(BrowserCtx);\n\n const itemResult = useRegisterItemData({ itemPaths: [itemPath] });\n const item = (itemResult.value?.[itemPath] || null);\n\n const [classConfigured, cfg]: [boolean, RelatedItemClassConfiguration] = useMemo(() => {\n let classConfigured: boolean;\n let cfg: RelatedItemClassConfiguration;\n try {\n cfg = getRelatedItemClassConfiguration(classID);\n classConfigured = true;\n } catch (e) {\n cfg = {\n title: classID,\n itemView: () => <span>{itemID}</span>\n };\n classConfigured = false;\n }\n return [classConfigured, cfg];\n }, [itemID, classID, getRelatedItemClassConfiguration]);\n\n const Item = cfg.itemView;\n\n const classIDs = useMemo((() =>\n availableClassIDs ?? ((itemRef?.classID ?? '') !== '' ? [itemRef!.classID] : [])\n ), [availableClassIDs?.join(','), itemRef?.classID]);\n\n const itemClassTitle = cfg.title.trim() || null;\n\n const hasItem = item !== null && classConfigured && isRegisterItem(item);\n const itemIsMissing = itemID !== '' && (item === null && !itemResult.isUpdating);\n const willShowItemView = hasItem || itemIsMissing || !onChange;\n const canJump = (item !== null || itemIsMissing) && classConfigured && !itemResult.isUpdating && (onJump || jumpTo);\n\n const jump = useCallback(function jump() {\n return onJump\n ? onJump()\n : setPeekingDrawerState(true)\n }, [onJump, jumpTo]);\n\n const itemView: JSX.Element | null = useMemo(() => {\n const classView = <small css={css`letter-spacing: -.01em`}>\n {itemClassTitle\n ? itemClassTitle\n : <em>unknown class</em>}\n </small>;\n const itemView = hasItem\n ? <Item\n itemRef={{ classID, itemID, subregisterID }}\n itemData={item.data}\n />\n : itemIsMissing\n ? <span css={css`overflow: hidden; text-overflow: ellipsis;`}>\n Not found: {itemID ?? 'N/A'}\n </span>\n : <span>Not specified</span>;\n return <>{itemView} {classView}</>;\n }, [itemID, classID, itemClassTitle, subregisterID, item?.data, hasItem, itemIsMissing]);\n\n const itemButtons = useMemo(() => {\n const canAutoCreateRelatedItem = itemID === '' && onCreateNew && !itemResult.isUpdating;\n const canChangeRelatedItem = /*classIDs.length >= 1 && */onChange && !itemResult.isUpdating;\n const canClear = onClear && itemID !== '' && !itemResult.isUpdating;\n\n let itemButtons: (ButtonProps & { title: string })[] = [];\n\n async function handleCreateNew() {\n if (!onCreateNew) { return; }\n const itemRef = await onCreateNew();\n console.debug(\"Created new item\", itemRef);\n }\n\n if (!hasItem && canAutoCreateRelatedItem) {\n itemButtons.push({\n onClick: handleCreateNew,\n icon: 'add',\n text: 'Auto create',\n intent: 'primary',\n title: \"Automatically create new item\",\n });\n }\n if (canChangeRelatedItem) {\n itemButtons.push({\n onClick: () => setSelectDialogState(true),\n icon: 'edit',\n text: willShowItemView ? undefined : 'Specify',\n intent: 'primary',\n title: \"Select related item\",\n /*disabled: classIDs.length < 1,*/\n });\n }\n if (canClear) {\n itemButtons.push({\n onClick: onClear,\n icon: 'eraser',\n intent: 'danger',\n title: \"Clear related item selection\",\n });\n }\n\n return itemButtons;\n }, [itemID, itemResult.isUpdating, onCreateNew, onChange, onClear]);\n\n const itemTitle = hasItem\n ? `${itemClassTitle ?? 'unknown class'} item ${itemID ?? 'with unknown ID'}`\n : undefined;\n\n //log.debug(\"Rendering generic related item view: got item\", item);\n return (\n <ControlGroup\n dir=\"ltr\"\n className={className}\n title={itemTitle}\n {...controlGroupProps}>\n\n <InputGroup\n fill={hasItem}\n readOnly={!onChange && !onClear}\n onChange={() => void 0}\n inputRef={inputRef}\n css={css`\n /* leftElement which displays itemView */\n .bp4-input-left-container {\n top: unset;\n bottom: .42em;\n padding-left: 10px;\n padding-right: 5px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n display: inline-flex;\n flex-flow: row nowrap;\n align-items: baseline;\n\n max-width: 70%;\n }\n .bp4-input {\n color: rgba(125, 125, 125, 0.5);\n font-family: monospace;\n }\n `}\n leftElement={itemView}\n value={itemID ?? ''}\n title={itemTitle}\n />\n\n {canJump\n ? <Button outlined onClick={jump} icon=\"maximize\" />\n : null}\n\n {itemButtons.map((props, idx) =>\n <Button key={idx} outlined {...props} />\n )}\n\n <ItemSearchDrawer\n isOpen={selectDialogState}\n onClose={() => setSelectDialogState(false)}\n onChooseItem={onChange}\n availableClassIDs={classIDs}\n />\n\n {itemRef\n ? <ItemDetailsDrawer\n isOpen={peekingDrawerState}\n onClose={() => setPeekingDrawerState(false)}\n itemRef={itemRef}\n />\n : null}\n\n </ControlGroup>\n );\n};\n\n\nexport default GenericRelatedItemView;\n"]}
|
|
1
|
+
{"version":3,"file":"GenericRelatedItemView.js","sourceRoot":"","sources":["../../src/views/GenericRelatedItemView.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React, { useRef, useContext, useCallback, useMemo, useState } from 'react';\nimport { InputGroup, Button, ControlGroup, type ControlGroupProps, type ButtonProps } from '@blueprintjs/core';\nimport {\n type GenericRelatedItemViewProps,\n type RelatedItemClassConfiguration,\n isRegisterItem,\n} from '../types';\nimport { BrowserCtx } from './BrowserCtx';\nimport { ChangeRequestContext } from './change-request/ChangeRequestContext';\nimport { isDrafted } from '../types/cr';\nimport ItemSearchDrawer from './ItemSearchDrawer';\nimport ItemDetailsDrawer from './ItemDetailsDrawer';\n\n\nconst DUMMY_REF = {\n classID: '',\n itemID: '',\n subregisterID: '',\n} as const;\n\n\nexport const GenericRelatedItemView: React.FC<GenericRelatedItemViewProps & {\n controlGroupProps?: ControlGroupProps\n}> = function ({\n itemRef, className,\n onCreateNew, onClear, onChange,\n availableClassIDs,\n onJump,\n inputRef,\n controlGroupProps,\n // availableSubregisterIDs,\n // itemSorter,\n}) {\n const {\n useRegisterItemData,\n getRelatedItemClassConfiguration,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { classID, itemID, subregisterID } = itemRef ?? DUMMY_REF;\n\n const itemPathWithClass = `${classID}/${itemID}.yaml`;\n // If curretn register has subregisters, specify subregister-relative path\n const itemPathWithSubregister = subregisterID\n ? `subregisters/${subregisterID}/${itemPathWithClass}`\n : `${itemPathWithClass}`;\n // If a change request is active\n // and this item is among clarifications or additions\n // then use item path relative to the change request\n // TODO: make useRegisterItemData() handle active change request\n const affectedByActiveCR = (\n activeChangeRequest &&\n isDrafted(activeChangeRequest) &&\n activeChangeRequest.items[itemPathWithSubregister]\n );\n const itemPath = affectedByActiveCR\n ? `/proposals/${activeChangeRequest.id}/items/${itemPathWithSubregister}`\n : `/${itemPathWithSubregister}`;\n\n const [selectDialogState, setSelectDialogState] = useState(false);\n const [peekingDrawerState, setPeekingDrawerState] = useState(false);\n\n //log.debug(\"Rendering generic related item view\", itemRef);\n //const { jumpToItem } = useContext(BrowserCtx);\n\n const itemResult = useRegisterItemData({ itemPaths: [itemPath] });\n const item = (itemResult.value?.[itemPath] || null);\n\n const [classConfigured, cfg]: [boolean, RelatedItemClassConfiguration] = useMemo(() => {\n let classConfigured: boolean;\n let cfg: RelatedItemClassConfiguration;\n try {\n cfg = getRelatedItemClassConfiguration(classID);\n classConfigured = true;\n } catch (e) {\n cfg = {\n title: classID,\n itemView: () => <span>{itemID}</span>\n };\n classConfigured = false;\n }\n return [classConfigured, cfg];\n }, [itemID, classID, getRelatedItemClassConfiguration]);\n\n const Item = cfg.itemView;\n\n const classIDs = useMemo((() =>\n availableClassIDs ?? ((itemRef?.classID ?? '') !== '' ? [itemRef!.classID] : [])\n ), [availableClassIDs?.join(','), itemRef?.classID]);\n\n const itemClassTitle = cfg.title.trim() || null;\n\n const hasItem = item !== null && classConfigured && isRegisterItem(item);\n const itemIsMissing = itemID !== '' && (item === null && !itemResult.isUpdating);\n const willShowItemView = hasItem || itemIsMissing || !onChange;\n const canJump = (item !== null || itemIsMissing) && classConfigured && !itemResult.isUpdating && (onJump || jumpTo);\n\n const jump = useCallback(function jump() {\n return onJump\n ? onJump()\n : setPeekingDrawerState(true)\n }, [onJump, jumpTo]);\n\n const itemView: JSX.Element | null = useMemo(() => {\n const classView = <small css={css`letter-spacing: -.01em`}>\n {itemClassTitle\n ? itemClassTitle\n : <em>unknown class</em>}\n </small>;\n const itemView = hasItem\n ? <Item\n itemRef={{ classID, itemID, subregisterID }}\n itemData={item.data}\n />\n : itemIsMissing\n ? <span css={css`overflow: hidden; text-overflow: ellipsis;`}>\n Not found: {itemID ?? 'N/A'}\n </span>\n : <span>Not specified</span>;\n return <>{itemView} {classView}</>;\n }, [itemID, classID, itemClassTitle, subregisterID, item?.data, hasItem, itemIsMissing]);\n\n const itemButtons = useMemo(() => {\n const canAutoCreateRelatedItem = itemID === '' && onCreateNew && !itemResult.isUpdating;\n const canChangeRelatedItem = /*classIDs.length >= 1 && */onChange && !itemResult.isUpdating;\n const canClear = onClear && itemID !== '' && !itemResult.isUpdating;\n\n let itemButtons: (ButtonProps & { title: string })[] = [];\n\n async function handleCreateNew() {\n if (!onCreateNew) { return; }\n const itemRef = await onCreateNew();\n console.debug(\"Created new item\", itemRef);\n }\n\n if (!hasItem && canAutoCreateRelatedItem) {\n itemButtons.push({\n onClick: handleCreateNew,\n icon: 'add',\n text: 'Auto create',\n intent: 'primary',\n title: \"Automatically create new item\",\n });\n }\n if (canChangeRelatedItem) {\n itemButtons.push({\n onClick: () => setSelectDialogState(true),\n icon: 'edit',\n text: willShowItemView ? undefined : 'Specify',\n intent: 'primary',\n title: \"Select related item\",\n /*disabled: classIDs.length < 1,*/\n });\n }\n if (canClear) {\n itemButtons.push({\n onClick: onClear,\n icon: 'eraser',\n intent: 'danger',\n title: \"Clear related item selection\",\n });\n }\n\n return itemButtons;\n }, [itemID, itemResult.isUpdating, onCreateNew, onChange, onClear]);\n\n const itemTitle = hasItem\n ? `${itemClassTitle ?? 'unknown class'} item ${itemID ?? 'with unknown ID'}`\n : undefined;\n\n /** Input ref for using within this component */\n const cbRef = useRef<HTMLDivElement | null>(null);\n const _drawerContainerRef = useRef<HTMLElement | null>(null);\n const closePeekingDrawer = useCallback(\n (() => setPeekingDrawerState(false)),\n [setPeekingDrawerState]);\n\n const _itemRef = useMemo(() => itemRef, [JSON.stringify(itemRef)]);\n\n //log.debug(\"Rendering generic related item view: got item\", item);\n return (\n <ControlGroup\n dir=\"ltr\"\n className={className}\n title={itemTitle}\n {...controlGroupProps}>\n\n <div ref={cbRef} />\n\n <InputGroup\n fill={hasItem}\n readOnly={!onChange && !onClear}\n inputRef={inputRef}\n onChange={useCallback(() => void 0, [])}\n css={css`\n /* leftElement which displays itemView */\n .bp4-input-left-container {\n top: unset;\n bottom: .42em;\n padding-left: 10px;\n padding-right: 5px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n display: inline-flex;\n flex-flow: row nowrap;\n align-items: baseline;\n\n max-width: 70%;\n }\n .bp4-input {\n color: rgba(125, 125, 125, 0.5);\n font-family: monospace;\n }\n `}\n leftElement={itemView}\n value={itemID ?? ''}\n title={itemTitle}\n />\n\n {canJump\n ? <Button outlined onClick={jump} icon=\"maximize\" />\n : null}\n\n {itemButtons.map((props, idx) =>\n <Button key={idx} outlined {...props} />\n )}\n\n <ItemSearchDrawer\n isOpen={selectDialogState}\n onClose={useCallback(\n () => setSelectDialogState(false),\n [setSelectDialogState])}\n onChooseItem={onChange}\n availableClassIDs={classIDs}\n />\n\n {_itemRef\n ? <ItemDetailsDrawer\n isOpen={peekingDrawerState}\n onClose={closePeekingDrawer}\n itemRef={_itemRef}\n portalContainer={_drawerContainerRef.current ?? undefined}\n />\n : null}\n\n </ControlGroup>\n );\n};\n\n\nexport default GenericRelatedItemView;\n"]}
|
|
@@ -27,6 +27,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
27
27
|
const ItemDetailDrawer = function ({
|
|
28
28
|
itemRef,
|
|
29
29
|
usePortal,
|
|
30
|
+
portalContainer,
|
|
30
31
|
isOpen,
|
|
31
32
|
onClose
|
|
32
33
|
}) {
|
|
@@ -37,6 +38,7 @@ const ItemDetailDrawer = function ({
|
|
|
37
38
|
return (0, _react.jsx)(_core.Drawer, {
|
|
38
39
|
isOpen: isOpen,
|
|
39
40
|
usePortal: usePortal,
|
|
41
|
+
portalContainer: portalContainer,
|
|
40
42
|
onClose: onClose,
|
|
41
43
|
enforceFocus: false,
|
|
42
44
|
size: _core.DrawerSize.LARGE,
|
|
@@ -49,10 +51,10 @@ const ItemDetailDrawer = function ({
|
|
|
49
51
|
fill: true
|
|
50
52
|
}, (0, _react.jsx)(_core.Button, {
|
|
51
53
|
icon: "open-application",
|
|
52
|
-
onClick: () => {
|
|
54
|
+
onClick: (0, _react2.useCallback)(() => {
|
|
53
55
|
onClose();
|
|
54
56
|
spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${path}`);
|
|
55
|
-
},
|
|
57
|
+
}, [onClose]),
|
|
56
58
|
text: "Open in a tab"
|
|
57
59
|
}), (0, _react.jsx)(_core.Button, {
|
|
58
60
|
icon: "minimize",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemDetailsDrawer.js","sourceRoot":"","sources":["../../src/views/ItemDetailsDrawer.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ItemDetailsDrawer.js","sourceRoot":"","sources":["../../src/views/ItemDetailsDrawer.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,eAAe,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,gBAAgB,GAMjB,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;IACrE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO,CACL,IAAC,MAAM,IACH,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,KAAK,EACnB,IAAI,EAAE,UAAU,CAAC,KAAK,EACtB,GAAG,EAAE,GAAG,CAAA,0CAA0C,EAClD,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QACzC,IAAC,WAAW,IAAC,IAAI;YACf,IAAC,MAAM,IACL,IAAI,EAAC,kBAAkB,EACvB,OAAO,EAAE,WAAW,CAClB,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EACnE,CAAC,OAAO,CAAC,CAAC,EACZ,IAAI,EAAC,eAAe,GACpB;YACF,IAAC,MAAM,IACL,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,EAAC,UAAU,GACf,CACU;QACd,aAAK,GAAG,EAAE,GAAG,CAAA,8BAA8B;YACzC,IAAC,eAAe,CAAC,IAAI,IAAC,GAAG,EAAE,IAAI,GAAI,CAC/B,CACC,CACV,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,gBAAgB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx, css } from '@emotion/react';\nimport React, { useContext, useCallback } from 'react';\nimport { Button, ButtonGroup, Drawer, DrawerSize } from '@blueprintjs/core';\nimport type { InternalItemReference } from '../types';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport MaybeItemDetail from './detail/RegisterItem';\nimport { Protocols } from './protocolRegistry';\nimport { itemRefToItemPath } from './itemPathUtils';\n\n\nconst ItemDetailDrawer: React.FC<{\n itemRef: InternalItemReference\n isOpen: boolean\n usePortal?: boolean\n portalContainer?: HTMLElement\n onClose: () => void\n}> = function ({ itemRef, usePortal, portalContainer, isOpen, onClose }) {\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const path = itemRefToItemPath(itemRef);\n\n return (\n <Drawer\n isOpen={isOpen}\n usePortal={usePortal}\n portalContainer={portalContainer}\n onClose={onClose}\n enforceFocus={false}\n size={DrawerSize.LARGE}\n css={css`display: flex; flex-flow: column nowrap;`}\n style={{ padding: '0', width: 'unset' }}>\n <ButtonGroup fill>\n <Button\n icon=\"open-application\"\n onClick={useCallback(\n () => { onClose(); spawnTab(`${Protocols.ITEM_DETAILS}:${path}`); },\n [onClose])}\n text=\"Open in a tab\"\n />\n <Button\n icon=\"minimize\"\n onClick={onClose}\n text=\"Minimize\"\n />\n </ButtonGroup>\n <div css={css`position: relative; flex: 1;`}>\n <MaybeItemDetail.main uri={path} />\n </div>\n </Drawer>\n );\n};\n\n\nexport default ItemDetailDrawer;\n"]}
|
|
@@ -61,7 +61,7 @@ const ItemSearchDrawer = function ({
|
|
|
61
61
|
},
|
|
62
62
|
availableClassIDs: availableClassIDs,
|
|
63
63
|
implicitCriteria: implicitCriteria,
|
|
64
|
-
stateName: "
|
|
64
|
+
stateName: "item-browser-search",
|
|
65
65
|
onOpenItem: onChooseItem ? handleOpenItem : undefined
|
|
66
66
|
}));
|
|
67
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemSearchDrawer.js","sourceRoot":"","sources":["../../src/views/ItemSearchDrawer.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAc,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,gBAAgB,GAKjB,UAAU,EACb,MAAM,EAAE,OAAO,EAAE,YAAY,EAC7B,iBAAiB,GAClB;IACC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAgB,OAAO,CAAC,GAAG,EAAE,CAAC,CAC/C,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,sBAAsB,KAAK,WAAW;KAC9C,CAAC,CAAC,CACJ,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEnC,MAAM,gBAAgB,GAA8B,OAAO,CAAC,GAAG,EAAE,CAAC,CAChE,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC;YACE,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,aAAa;SACxB;QACH,CAAC,CAAC,SAAS,CACd,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,IAAC,MAAM,IACH,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,KAAK,EACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QACzC,IAAC,MAAM,IACL,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC9E,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAC,
|
|
1
|
+
{"version":3,"file":"ItemSearchDrawer.js","sourceRoot":"","sources":["../../src/views/ItemSearchDrawer.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAc,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,gBAAgB,GAKjB,UAAU,EACb,MAAM,EAAE,OAAO,EAAE,YAAY,EAC7B,iBAAiB,GAClB;IACC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAgB,OAAO,CAAC,GAAG,EAAE,CAAC,CAC/C,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,sBAAsB,KAAK,WAAW;KAC9C,CAAC,CAAC,CACJ,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEnC,MAAM,gBAAgB,GAA8B,OAAO,CAAC,GAAG,EAAE,CAAC,CAChE,aAAa,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC;YACE,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,aAAa;SACxB;QACH,CAAC,CAAC,SAAS,CACd,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC9C,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAG,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,CACL,IAAC,MAAM,IACH,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,KAAK,EACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QACzC,IAAC,MAAM,IACL,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAC9E,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAC,qBAAqB,EAC/B,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,GACrD,CACK,CACV,CAAC;AACJ,CAAC,CAAC;AAGF,eAAe,gBAAgB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport { jsx } from '@emotion/react';\nimport React, { useContext, useMemo, useCallback } from 'react';\nimport { Drawer } from '@blueprintjs/core';\nimport type { InternalItemReference } from '../types';\nimport type { Criterion, CriteriaGroup } from './FilterCriteria/models';\nimport { BrowserCtx } from './BrowserCtx';\nimport Search from './sidebar/Search';\nimport { itemPathToItemRef } from './itemPathUtils';\n\n\nconst ItemSearchDrawer: React.FC<{\n isOpen: boolean\n onClose: () => void\n onChooseItem?: (itemRef: InternalItemReference) => void\n availableClassIDs: string[]\n}> = function ({\n isOpen, onClose, onChooseItem,\n availableClassIDs,\n}) {\n const { subregisters } = useContext(BrowserCtx);\n\n const classCriteria: Criterion[] = useMemo(() => (\n availableClassIDs.map(clsID => ({\n key: 'item-class',\n query: `objPath.indexOf(\\\"/${clsID}/\\\") >= 0`,\n }))\n ), [availableClassIDs.toString()]);\n\n const implicitCriteria: CriteriaGroup | undefined = useMemo(() => (\n classCriteria.length > 0\n ? {\n require: 'any',\n criteria: classCriteria,\n }\n : undefined\n ), [classCriteria]);\n\n const handleOpenItem = useCallback((itemPath) => {\n onChooseItem?.(itemPathToItemRef(subregisters !== undefined, itemPath));\n onClose();\n }, [onChooseItem, onClose]);\n\n return (\n <Drawer\n isOpen={isOpen}\n onClose={onClose}\n enforceFocus={false}\n size=\"50vw\"\n style={{ padding: '0', width: 'unset' }}>\n <Search\n style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={availableClassIDs}\n implicitCriteria={implicitCriteria}\n stateName=\"item-browser-search\"\n onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Drawer>\n );\n};\n\n\nexport default ItemSearchDrawer;\n"]}
|
package/views/Party.d.ts
ADDED
|
File without changes
|
package/views/Party.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict"; // /** @jsx jsx */
|
|
2
|
+
// /** @jsxFrag React.Fragment */
|
|
3
|
+
//
|
|
4
|
+
// import React, { useMemo, useContext } from 'react';
|
|
5
|
+
// import { jsx, css } from '@emotion/react';
|
|
6
|
+
// import { Icon, type IconName, Tag } from '@blueprintjs/core';
|
|
7
|
+
//
|
|
8
|
+
// import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';
|
|
9
|
+
// import { BrowserCtx } from './BrowserCtx';
|
|
10
|
+
// import { registerStakeholderPlain } from './RegisterStakeholder';
|
|
11
|
+
//
|
|
12
|
+
//
|
|
13
|
+
// const PREFERRED_PARTY_SETTING_NAME = 'preferred_party_id';
|
|
14
|
+
//
|
|
15
|
+
//
|
|
16
|
+
// /** Parties that current user can act as, based on chosen remote username. */
|
|
17
|
+
// export function useAvailableParties() {
|
|
18
|
+
// const { useRemoteUsername } = useContext(DatasetContext);
|
|
19
|
+
// const { value: { username } } = useRemoteUsername();
|
|
20
|
+
// const { registerMetadata } = useContext(BrowserCtx);
|
|
21
|
+
// const parties = registerMetadata?.parties;
|
|
22
|
+
// // TODO: Sort party IDs by party name?
|
|
23
|
+
// const partyIDs = parties
|
|
24
|
+
// ? Object.entries(parties).
|
|
25
|
+
// filter(([, party]) => party.gitServerUsername === username).
|
|
26
|
+
// map(([partyID, ]) => partyID).
|
|
27
|
+
// sort()
|
|
28
|
+
// : [];
|
|
29
|
+
// return useMemo(
|
|
30
|
+
// (() => Object.freeze(partyIDs)),
|
|
31
|
+
// [partyIDs.join(',')],
|
|
32
|
+
// );
|
|
33
|
+
// }
|
|
34
|
+
//
|
|
35
|
+
// function usePreferredPartyID(): string | undefined {
|
|
36
|
+
// const { useSettings } = useContext(DatasetContext);
|
|
37
|
+
// const { value: { settings } } = useSettings();
|
|
38
|
+
// return settings[PREFERRED_PARTY_SETTING_NAME] ?? undefined;
|
|
39
|
+
// }
|
|
40
|
+
//
|
|
41
|
+
// export function setPreferredPartyID(partyID: string) {
|
|
42
|
+
// const { updateSetting } = useContext(DatasetContext);
|
|
43
|
+
// return updateSetting({ key: PREFERRED_PARTY_SETTING_NAME, value: partyID });
|
|
44
|
+
// }
|
|
45
|
+
//
|
|
46
|
+
// /** Retrieves current user’s active party (preferred or first available). */
|
|
47
|
+
// export function useCurrentUserPartyID() {
|
|
48
|
+
// const parties = useAvailableParties();
|
|
49
|
+
// const preferPartyID = usePreferredPartyID();
|
|
50
|
+
//
|
|
51
|
+
// if (parties.length < 1) {
|
|
52
|
+
// return undefined;
|
|
53
|
+
// } else if (parties.length === 1) {
|
|
54
|
+
// return parties[0];
|
|
55
|
+
// } else if (preferPartyID && parties.includes(preferPartyID)) {
|
|
56
|
+
// return preferPartyID;
|
|
57
|
+
// } else {
|
|
58
|
+
// return parties[0];
|
|
59
|
+
// }
|
|
60
|
+
// }
|
|
61
|
+
//
|
|
62
|
+
// /** Retrieves full party information about all specified party IDs. */
|
|
63
|
+
// export function useParties(partyIDs: string[]) {
|
|
64
|
+
// const { registerMetadata } = useContext(BrowserCtx);
|
|
65
|
+
// const allPartyIDs = Object.keys(registerMetadata?.parties ?? {});
|
|
66
|
+
// const parties = partyIDs.length < 1 || allPartyIDs.length < 1
|
|
67
|
+
// ? []
|
|
68
|
+
// : partyIDs.map(partyID => registerMetadata?.parties?.[partyID]).
|
|
69
|
+
// filter(party => party !== undefined).
|
|
70
|
+
// map(p => p!);
|
|
71
|
+
// return useMemo(
|
|
72
|
+
// () => Object.freeze(parties),
|
|
73
|
+
// [partyIDs.join(','), allPartyIDs.join(',')],
|
|
74
|
+
// )
|
|
75
|
+
// }
|
|
76
|
+
//
|
|
77
|
+
// /** Retrieves full party information about current user’s active party. */
|
|
78
|
+
// export function useParty() {
|
|
79
|
+
// const { registerMetadata } = useContext(BrowserCtx);
|
|
80
|
+
// const partyID = useCurrentUserPartyID();
|
|
81
|
+
// const parties = registerMetadata?.parties ?? {};
|
|
82
|
+
// const partyIDs = Object.keys(parties);
|
|
83
|
+
// const party = partyID && partyIDs.length > 0
|
|
84
|
+
// ? parties[partyID]
|
|
85
|
+
// : undefined;
|
|
86
|
+
// return useMemo(
|
|
87
|
+
// () => Object.freeze(party),
|
|
88
|
+
// [partyID, partyIDs.join(',')],
|
|
89
|
+
// );
|
|
90
|
+
// }
|
|
91
|
+
//
|
|
92
|
+
// /** Stakeholders that current user’s active party is associated with. */
|
|
93
|
+
// export function useStakeholders() {
|
|
94
|
+
// const { registerMetadata } = useContext(BrowserCtx);
|
|
95
|
+
// const party = useParty();
|
|
96
|
+
// // TODO: Sort stakeholders by name?
|
|
97
|
+
// const stakeholders = party && registerMetadata?.stakeholders
|
|
98
|
+
// ? Object.entries(registerMetadata.stakeholders).
|
|
99
|
+
// filter(([stakeholderID, ]) => party.stakeholderIDs.includes(stakeholderID))
|
|
100
|
+
// : [];
|
|
101
|
+
// return useMemo(
|
|
102
|
+
// () => Object.freeze(stakeholders.map(([, s]) => s)),
|
|
103
|
+
// [party, stakeholders.map(([sID, ]) => sID).join(',')],
|
|
104
|
+
// );
|
|
105
|
+
// }
|
|
106
|
+
//
|
|
107
|
+
//
|
|
108
|
+
// /** Stakeholder roles that current user’s active party inherit. */
|
|
109
|
+
// export function useRoles() {
|
|
110
|
+
// const stakeholders = useStakeholders();
|
|
111
|
+
// const roles = stakeholders.map(s => s.role).sort();
|
|
112
|
+
// return useMemo(
|
|
113
|
+
// () => roles,
|
|
114
|
+
// [roles.join(',')],
|
|
115
|
+
// );
|
|
116
|
+
// }
|
|
117
|
+
//
|
|
118
|
+
//
|
|
119
|
+
// export const PartyView: React.FC<{
|
|
120
|
+
// partyID: string
|
|
121
|
+
// markIfCurrentUser?: boolean
|
|
122
|
+
// }> = function ({ partyID, markIfCurrentUser }) {
|
|
123
|
+
// const { useRemoteUsername } = useContext(DatasetContext);
|
|
124
|
+
// const { value: { username } } = useRemoteUsername();
|
|
125
|
+
// const { registerMetadata } = useContext(BrowserCtx);
|
|
126
|
+
// const party = registerMetadata?.parties[partyID];
|
|
127
|
+
// if (party && registerMetadata?.stakeholders) {
|
|
128
|
+
// const stakeholders = Object.entries(registerMetadata?.stakeholders).
|
|
129
|
+
// filter(([shID, ]) => party.stakeholderIDs.includes(shID)).
|
|
130
|
+
// map(([, sh]) => sh);
|
|
131
|
+
// const isCurrentUser = party.gitServerUsername === username;
|
|
132
|
+
// return <>
|
|
133
|
+
// <Icon icon={ROLE_ICONS[party.type]} />
|
|
134
|
+
//
|
|
135
|
+
// {stakeholders.map(sh =>
|
|
136
|
+
// <span title="Stakeholder information" css={css`white-space: nowrap;`}>{registerStakeholderPlain(sh)}</span>
|
|
137
|
+
// ).join(', ')}
|
|
138
|
+
//
|
|
139
|
+
// {markIfCurrentUser && isCurrentUser
|
|
140
|
+
// ? <Tag round minimal intent="primary" css={css`display: inline;`}>
|
|
141
|
+
// you
|
|
142
|
+
// </Tag>
|
|
143
|
+
// : null}
|
|
144
|
+
// </>;
|
|
145
|
+
// } else {
|
|
146
|
+
// return <>N/A</>;
|
|
147
|
+
// }
|
|
148
|
+
// }
|
|
149
|
+
//
|
|
150
|
+
// const ROLE_ICONS: Readonly<Record<string, IconName>> = {
|
|
151
|
+
// 'role': 'hat',
|
|
152
|
+
// 'individual': 'person',
|
|
153
|
+
// 'organization': 'office',
|
|
154
|
+
// } as const;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Party.js","sourceRoot":"","sources":["../../src/views/Party.tsx"],"names":[],"mappings":";AAAA,kBAAkB;AAClB,iCAAiC;AACjC,GAAG;AACH,sDAAsD;AACtD,6CAA6C;AAC7C,gEAAgE;AAChE,GAAG;AACH,6EAA6E;AAC7E,6CAA6C;AAC7C,oEAAoE;AACpE,GAAG;AACH,GAAG;AACH,6DAA6D;AAC7D,GAAG;AACH,GAAG;AACH,gFAAgF;AAChF,0CAA0C;AAC1C,8DAA8D;AAC9D,yDAAyD;AACzD,yDAAyD;AACzD,+CAA+C;AAC/C,2CAA2C;AAC3C,6BAA6B;AAC7B,iCAAiC;AACjC,uEAAuE;AACvE,yCAAyC;AACzC,iBAAiB;AACjB,YAAY;AACZ,oBAAoB;AACpB,uCAAuC;AACvC,4BAA4B;AAC5B,OAAO;AACP,IAAI;AACJ,GAAG;AACH,uDAAuD;AACvD,wDAAwD;AACxD,mDAAmD;AACnD,gEAAgE;AAChE,IAAI;AACJ,GAAG;AACH,yDAAyD;AACzD,0DAA0D;AAC1D,iFAAiF;AACjF,IAAI;AACJ,GAAG;AACH,+EAA+E;AAC/E,4CAA4C;AAC5C,2CAA2C;AAC3C,iDAAiD;AACjD,GAAG;AACH,8BAA8B;AAC9B,wBAAwB;AACxB,uCAAuC;AACvC,yBAAyB;AACzB,mEAAmE;AACnE,4BAA4B;AAC5B,aAAa;AACb,yBAAyB;AACzB,MAAM;AACN,IAAI;AACJ,GAAG;AACH,yEAAyE;AACzE,mDAAmD;AACnD,yDAAyD;AACzD,sEAAsE;AACtE,kEAAkE;AAClE,WAAW;AACX,uEAAuE;AACvE,gDAAgD;AAChD,wBAAwB;AACxB,oBAAoB;AACpB,oCAAoC;AACpC,mDAAmD;AACnD,MAAM;AACN,IAAI;AACJ,GAAG;AACH,6EAA6E;AAC7E,+BAA+B;AAC/B,yDAAyD;AACzD,6CAA6C;AAC7C,qDAAqD;AACrD,2CAA2C;AAC3C,iDAAiD;AACjD,yBAAyB;AACzB,mBAAmB;AACnB,oBAAoB;AACpB,kCAAkC;AAClC,qCAAqC;AACrC,OAAO;AACP,IAAI;AACJ,GAAG;AACH,2EAA2E;AAC3E,sCAAsC;AACtC,yDAAyD;AACzD,8BAA8B;AAC9B,wCAAwC;AACxC,iEAAiE;AACjE,uDAAuD;AACvD,sFAAsF;AACtF,YAAY;AACZ,oBAAoB;AACpB,2DAA2D;AAC3D,6DAA6D;AAC7D,OAAO;AACP,IAAI;AACJ,GAAG;AACH,GAAG;AACH,qEAAqE;AACrE,+BAA+B;AAC/B,4CAA4C;AAC5C,wDAAwD;AACxD,oBAAoB;AACpB,mBAAmB;AACnB,yBAAyB;AACzB,OAAO;AACP,IAAI;AACJ,GAAG;AACH,GAAG;AACH,qCAAqC;AACrC,oBAAoB;AACpB,gCAAgC;AAChC,mDAAmD;AACnD,8DAA8D;AAC9D,yDAAyD;AACzD,yDAAyD;AACzD,sDAAsD;AACtD,mDAAmD;AACnD,2EAA2E;AAC3E,mEAAmE;AACnE,6BAA6B;AAC7B,kEAAkE;AAClE,gBAAgB;AAChB,+CAA+C;AAC/C,eAAe;AACf,gCAAgC;AAChC,sHAAsH;AACtH,sBAAsB;AACtB,eAAe;AACf,4CAA4C;AAC5C,6EAA6E;AAC7E,kBAAkB;AAClB,mBAAmB;AACnB,kBAAkB;AAClB,WAAW;AACX,aAAa;AACb,uBAAuB;AACvB,MAAM;AACN,IAAI;AACJ,GAAG;AACH,2DAA2D;AAC3D,mBAAmB;AACnB,4BAA4B;AAC5B,8BAA8B;AAC9B,cAAc","sourcesContent":["// /** @jsx jsx */\n// /** @jsxFrag React.Fragment */\n// \n// import React, { useMemo, useContext } from 'react';\n// import { jsx, css } from '@emotion/react';\n// import { Icon, type IconName, Tag } from '@blueprintjs/core';\n// \n// import { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\n// import { BrowserCtx } from './BrowserCtx';\n// import { registerStakeholderPlain } from './RegisterStakeholder';\n// \n// \n// const PREFERRED_PARTY_SETTING_NAME = 'preferred_party_id';\n// \n// \n// /** Parties that current user can act as, based on chosen remote username. */\n// export function useAvailableParties() {\n// const { useRemoteUsername } = useContext(DatasetContext);\n// const { value: { username } } = useRemoteUsername();\n// const { registerMetadata } = useContext(BrowserCtx);\n// const parties = registerMetadata?.parties;\n// // TODO: Sort party IDs by party name?\n// const partyIDs = parties\n// ? Object.entries(parties).\n// filter(([, party]) => party.gitServerUsername === username).\n// map(([partyID, ]) => partyID).\n// sort()\n// : [];\n// return useMemo(\n// (() => Object.freeze(partyIDs)),\n// [partyIDs.join(',')],\n// );\n// }\n// \n// function usePreferredPartyID(): string | undefined {\n// const { useSettings } = useContext(DatasetContext);\n// const { value: { settings } } = useSettings();\n// return settings[PREFERRED_PARTY_SETTING_NAME] ?? undefined;\n// }\n// \n// export function setPreferredPartyID(partyID: string) {\n// const { updateSetting } = useContext(DatasetContext);\n// return updateSetting({ key: PREFERRED_PARTY_SETTING_NAME, value: partyID });\n// }\n// \n// /** Retrieves current user’s active party (preferred or first available). */\n// export function useCurrentUserPartyID() {\n// const parties = useAvailableParties();\n// const preferPartyID = usePreferredPartyID();\n// \n// if (parties.length < 1) {\n// return undefined;\n// } else if (parties.length === 1) {\n// return parties[0];\n// } else if (preferPartyID && parties.includes(preferPartyID)) {\n// return preferPartyID;\n// } else {\n// return parties[0];\n// }\n// }\n// \n// /** Retrieves full party information about all specified party IDs. */\n// export function useParties(partyIDs: string[]) {\n// const { registerMetadata } = useContext(BrowserCtx);\n// const allPartyIDs = Object.keys(registerMetadata?.parties ?? {});\n// const parties = partyIDs.length < 1 || allPartyIDs.length < 1\n// ? []\n// : partyIDs.map(partyID => registerMetadata?.parties?.[partyID]).\n// filter(party => party !== undefined).\n// map(p => p!);\n// return useMemo(\n// () => Object.freeze(parties),\n// [partyIDs.join(','), allPartyIDs.join(',')],\n// )\n// }\n// \n// /** Retrieves full party information about current user’s active party. */\n// export function useParty() {\n// const { registerMetadata } = useContext(BrowserCtx);\n// const partyID = useCurrentUserPartyID();\n// const parties = registerMetadata?.parties ?? {};\n// const partyIDs = Object.keys(parties);\n// const party = partyID && partyIDs.length > 0\n// ? parties[partyID]\n// : undefined;\n// return useMemo(\n// () => Object.freeze(party),\n// [partyID, partyIDs.join(',')],\n// );\n// }\n// \n// /** Stakeholders that current user’s active party is associated with. */\n// export function useStakeholders() {\n// const { registerMetadata } = useContext(BrowserCtx);\n// const party = useParty();\n// // TODO: Sort stakeholders by name?\n// const stakeholders = party && registerMetadata?.stakeholders\n// ? Object.entries(registerMetadata.stakeholders).\n// filter(([stakeholderID, ]) => party.stakeholderIDs.includes(stakeholderID))\n// : [];\n// return useMemo(\n// () => Object.freeze(stakeholders.map(([, s]) => s)),\n// [party, stakeholders.map(([sID, ]) => sID).join(',')],\n// );\n// }\n// \n// \n// /** Stakeholder roles that current user’s active party inherit. */\n// export function useRoles() {\n// const stakeholders = useStakeholders();\n// const roles = stakeholders.map(s => s.role).sort();\n// return useMemo(\n// () => roles,\n// [roles.join(',')],\n// );\n// }\n// \n// \n// export const PartyView: React.FC<{\n// partyID: string\n// markIfCurrentUser?: boolean\n// }> = function ({ partyID, markIfCurrentUser }) {\n// const { useRemoteUsername } = useContext(DatasetContext);\n// const { value: { username } } = useRemoteUsername();\n// const { registerMetadata } = useContext(BrowserCtx);\n// const party = registerMetadata?.parties[partyID];\n// if (party && registerMetadata?.stakeholders) {\n// const stakeholders = Object.entries(registerMetadata?.stakeholders).\n// filter(([shID, ]) => party.stakeholderIDs.includes(shID)).\n// map(([, sh]) => sh);\n// const isCurrentUser = party.gitServerUsername === username;\n// return <>\n// <Icon icon={ROLE_ICONS[party.type]} />\n// \n// {stakeholders.map(sh =>\n// <span title=\"Stakeholder information\" css={css`white-space: nowrap;`}>{registerStakeholderPlain(sh)}</span>\n// ).join(', ')}\n// \n// {markIfCurrentUser && isCurrentUser\n// ? <Tag round minimal intent=\"primary\" css={css`display: inline;`}>\n// you\n// </Tag>\n// : null}\n// </>;\n// } else {\n// return <>N/A</>;\n// }\n// }\n// \n// const ROLE_ICONS: Readonly<Record<string, IconName>> = {\n// 'role': 'hat',\n// 'individual': 'person',\n// 'organization': 'office',\n// } as const;\n"]}
|
|
@@ -36,7 +36,7 @@ const RegisterStakeholderListItem = function ({
|
|
|
36
36
|
exports.RegisterStakeholderListItem = RegisterStakeholderListItem;
|
|
37
37
|
|
|
38
38
|
function registerStakeholderPlain(stakeholder) {
|
|
39
|
-
var _a;
|
|
39
|
+
var _a, _b;
|
|
40
40
|
|
|
41
|
-
return `${stakeholder.name} (${(_a = stakeholder.
|
|
41
|
+
return `${stakeholder.name} (${(_b = (_a = stakeholder.roles) === null || _a === void 0 ? void 0 : _a.join(', ')) !== null && _b !== void 0 ? _b : '(no roles)'})`;
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterStakeholder.js","sourceRoot":"","sources":["../../src/views/RegisterStakeholder.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAI9C,MAAM,CAAC,MAAM,2BAA2B,GAIxC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IACtC,OAAO;QACL,IAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG;;QAEtB,cAAM,GAAG,EAAE,GAAG,CAAA,sBAAsB,IAAG,wBAAwB,CAAC,WAAW,CAAC,CAAQ;;QAEnF,aAAa;YACZ,CAAC,CAAC,IAAC,GAAG,IAAC,KAAK,QAAC,OAAO,QAAC,MAAM,EAAC,SAAS,EAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,UAExD;YACR,CAAC,CAAC,IAAI,CACP,CAAC;AACN,CAAC,CAAA;AAGD,MAAM,UAAU,wBAAwB,CAAC,WAAgC;;IACvE,OAAO,GAAG,WAAW,CAAC,IAAI,KAAK,MAAA,WAAW,CAAC,IAAI,mCAAI,
|
|
1
|
+
{"version":3,"file":"RegisterStakeholder.js","sourceRoot":"","sources":["../../src/views/RegisterStakeholder.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAI9C,MAAM,CAAC,MAAM,2BAA2B,GAIxC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IACtC,OAAO;QACL,IAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG;;QAEtB,cAAM,GAAG,EAAE,GAAG,CAAA,sBAAsB,IAAG,wBAAwB,CAAC,WAAW,CAAC,CAAQ;;QAEnF,aAAa;YACZ,CAAC,CAAC,IAAC,GAAG,IAAC,KAAK,QAAC,OAAO,QAAC,MAAM,EAAC,SAAS,EAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,UAExD;YACR,CAAC,CAAC,IAAI,CACP,CAAC;AACN,CAAC,CAAA;AAGD,MAAM,UAAU,wBAAwB,CAAC,WAAgC;;IACvE,OAAO,GAAG,WAAW,CAAC,IAAI,KAAK,MAAA,MAAA,WAAW,CAAC,KAAK,0CAAE,IAAI,CAAC,IAAI,CAAC,mCAAI,YAAY,GAAG,CAAC;AAClF,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Icon, Tag } from '@blueprintjs/core';\nimport type { RegisterStakeholder } from '../types';\n\n\nexport const RegisterStakeholderListItem: React.FC<{\n stakeholder: RegisterStakeholder\n isCurrentUser?: true\n}> =\nfunction ({ stakeholder, isCurrentUser }) {\n return <>\n <Icon icon=\"person\" />\n \n <span css={css`white-space: nowrap;`}>{registerStakeholderPlain(stakeholder)}</span>\n \n {isCurrentUser\n ? <Tag round minimal intent=\"primary\" css={css`display: inline;`}>\n you\n </Tag>\n : null}\n </>;\n}\n\n\nexport function registerStakeholderPlain(stakeholder: RegisterStakeholder): string {\n return `${stakeholder.name} (${stakeholder.roles?.join(', ') ?? '(no roles)'})`;\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { type TreeNodeInfo } from '@blueprintjs/core';
|
|
5
|
+
export declare type ItemOrGroupTreeNode = TreeNodeInfo<{
|
|
6
|
+
type: 'group' | 'item';
|
|
7
|
+
}>;
|
|
8
|
+
export interface State {
|
|
9
|
+
selectedItemID: string | null;
|
|
10
|
+
expandedItemIDs: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
/** A tree that also uses persistent state reducer. */
|
|
13
|
+
export declare const GenericStatefulTree: React.FC<{
|
|
14
|
+
getNodes: (state: State) => ItemOrGroupTreeNode[];
|
|
15
|
+
stateKey: string;
|
|
16
|
+
onItemDoubleClick?: (node: TreeNodeInfo<any>) => void;
|
|
17
|
+
className?: string;
|
|
18
|
+
}>;
|
|
19
|
+
export default GenericStatefulTree;
|